Systems Lab

Agent skill

scrapercity-mcp

Installs, verifies and operates the ScraperCity MCP server (npm package scrapercity, binary scrapercity-mcp) in Claude Code, Claude Desktop, Codex, Cursor, Windsurf, Cline, Gemini CLI, GitHub Copilot, OpenCode, Goose, Zed, Hermes Agent and Perplexity (plus the ChatGPT custom GPT path), sets which tools ask before running, then runs its 25 tools under the agent rules: wallet first, count before pull, start-poll-download, Apollo by webhook, a miss is unknown.

activeNeeds a keyActs undeclared4,268 words

Filed under Prospecting and list building.

From scrapercity/gtm-skills · 31 skill entries · 0 · pushed 2026-11-02

What it does when it runs

Installs, verifies and operates the ScraperCity MCP server (npm package scrapercity, binary scrapercity-mcp) in Claude Code, Claude Desktop, Codex, Cursor, Windsurf, Cline, Gemini CLI, GitHub Copilot, OpenCode, Goose, Zed, Hermes Agent and Perplexity (plus the ChatGPT custom GPT path), sets which tools ask before running, then runs its 25 tools under the agent rules: wallet first, count before pull, start-poll-download, Apollo by webhook, a miss is unknown. Produces a setup and run report (or a plan, when nothing has run yet) that opens with the answer, then the config, the permission rules, every call and script written out in full with its cost, and the run log. Use when the user wants ScraperCity inside an AI agent, asks which ScraperCity tool to call, sees tools missing or out of date, gets a 401, 402, 409, 429 or 503 from a tool, or sees two ScraperCity tool sets in one client.

Automated analysis of the skill and the 11 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • SAFE_KEY
  • SCRAPERCITY_API_KEY
  • SCRAPERCITY_KEY
  • SCRAPER_CITY_API_KEY
  • YOUR_SCRAPERCITY_API_KEY
  • scrapercity
Hosts it reaches
  • alexberman.com
  • app.apollo.io
  • app.scrapercity.com
  • aws.amazon.com
  • block.github.io
  • code.visualstudio.com
  • cursor.com
  • developers.openai.com
  • docs.cline.bot
  • docs.devin.ai
  • docs.github.com
  • docs.npmjs.com
  • geminicli.com
  • hermes-agent.nousresearch.com
  • modelcontextprotocol.io
  • opencode.ai
  • scrapercity.com
  • support.claude.com
  • www.crexi.com
  • www.rfc-editor.org
  • zed.dev
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shellwrites files

Ask about scrapercity-mcp

Opens your assistant with this page's recorded context. Check the linked sources before relying on it.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/scrapercity/gtm-skills.git /tmp/gtm-skills
git -C /tmp/gtm-skills sparse-checkout set "skills/scrapercity/scrapercity-mcp"
mkdir -p ~/.claude/skills/scrapercity-mcp
cp -R "/tmp/gtm-skills/skills/scrapercity/scrapercity-mcp/." ~/.claude/skills/scrapercity-mcp/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 31 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add scrapercity/gtm-skills
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs scrapercity, SAFE_KEY, SCRAPERCITY_API_KEY, SCRAPERCITY_KEY, SCRAPER_CITY_API_KEY, YOUR_SCRAPERCITY_API_KEY, which you have to obtain separately.

Reproduced in full from scrapercity/gtm-skills/blob/46d446143690c8048b17817aecf36990ea6880e5/skills/scrapercity/scrapercity-mcp/SKILL.md, which is licensed MIT (skill frontmatter). 4,268 words, 27 headings.

ScraperCity MCP Server

Overview

This skill gets the ScraperCity MCP server running in the user's AI client, proves it works with one free call, sets which tools may run without a prompt, and then drives its 25 tools the way a careful operator would: check the wallet, size the job, show the cost, start, record the runId, check status once per turn, and download to a path the user can find.

The server ships in the public scrapercity npm package (version 1.0.17 at the time of writing). The package has two binaries: scrapercity (the CLI) and scrapercity-mcp (the MCP server). There is no npm package named scrapercity-mcp, so every config must call npx -y --package scrapercity scrapercity-mcp.

The mistakes it prevents:

  • A config that runs npx scrapercity-mcp and fails with an npm 404, because the package name is missing.
  • A client that still shows last month's tools because npx served a cached copy, or because an old desktop extension sits beside the npm entry.
  • An agent that starts a $40 scrape without calling check_wallet, then hits a 402 halfway through a batch.
  • An agent that polls an Apollo run 60 times in one conversation instead of registering a webhook.
  • A CSV saved to {runId}.csv in a folder the user cannot find.
  • An agent that answers an Email Finder miss with a made-up first.last@ address, or a client that auto-approves paid tools.

When to Use

Use it when the user says:

  • "Connect ScraperCity to Claude Code / Claude Desktop / Codex / Cursor / Windsurf / Cline / Gemini CLI / Copilot / OpenCode / Goose / Zed / Hermes / Perplexity."
  • "Can I use ScraperCity inside ChatGPT, or in Claude on the web?" (ChatGPT: custom GPT path, database search only; Claude web and mobile take remote connectors only, so use Claude Desktop or Claude Code)
  • "Which ScraperCity tools should my agent be allowed to run without asking?"
  • "The ScraperCity tools are not showing up" or "I only see some of the tools."
  • "Which ScraperCity tool should I use for X?"
  • "I updated, but the tools look old" or "I see two ScraperCity connectors."
  • "The tool says No API key", "401", "402", "409", "429" or "503."
  • "Run this scrape for me from chat and save the CSV."

Use a different skill for nearby jobs:

JobSkill
Choosing ScraperCity skills for a multi-step projectusing-scrapercity-skills
Terminal commands, shell scripts, cron, CIscrapercity-cli
HTTP calls from code, Clay, n8n or Zapierscrapercity-api, scrapercity-integrations
Filter design for B2B peoplescrapercity-lead-database
Filter design for local businessesscrapercity-local-business-database
Property, agent and distress datascrapercity-real-estate-data
Cleaning the emails a run returnedemail-list-cleaner

Prerequisites

  • Node.js 18 or newer (node --version). The package declares "node": ">=18".
  • A ScraperCity API key from app.scrapercity.com/dashboard/api-docs. Use a separate key per agent so spend can be tracked and revoked on its own (scrapercity.com/mcp suggests a dedicated key for agent use).
  • The client name, the OS, and whether the server should load in every project or one project only.
  • For the Lead Database and Local Business Database tools: the Growth plan ($149/mo) or Scale. check_wallet shows plan.name.

Authoritative Foundations

SourceWhat it contributes here
scrapercity npm package 1.0.17 (bin/mcp.mjs, lib/client.mjs)The 25 tool names, input schemas, the key lookup order (env var, then ~/.scrapercityrc), the error text format and the download_results default path. Tested on 2026-10-13 by starting the server and calling tools/list.
references/scrapercity-catalog.mdEvery tool id and per-result price. The only price source.
references/scrapercity-agent-patterns.mdThe operating rules (wallet, count, approval, batching, a miss is unknown), the polling schedule, the error table and the safe-retry policy. This skill applies them; it does not restate them.
Codex, OpenCode, Goose docs; scrapercity.com/integrations/chatgpt and /perplexityEach client's file, key syntax and timeouts; the custom GPT path for ChatGPT.
Anthropic, "Writing effective tools for agents" (Sept 2025)Test agents on realistic tasks and read the errors they get back; the basis for the agent test matrix in step 6.
Model Context Protocol docs (modelcontextprotocol.io)Claude Desktop config path, full quit and restart, log locations, the Windows ${APPDATA} fix.
Claude Code docs (code.claude.com/docs/en/mcp)claude mcp add option order, the -- separator, scopes, .mcp.json env expansion, claude mcp list, /mcp, MAX_MCP_OUTPUT_TOKENS.
Cursor, Devin Desktop (Windsurf), Cline, Gemini CLI, VS Code docsEach client's file path, JSON shape, variable syntax and reload method.
scrapercity.com/mcpSame JSON for every client, only the path changes; fully quit and relaunch after install; duplicate protection on identical requests.

Details and routing: references/framework-notes.md.

Workflow

1. Check the machine

Run node --version. Under 18, stop and have the user install the Node LTS. Run npx --version to confirm npx is on the PATH. On macOS with a desktop client, note the output of which npx; a GUI app may not see the same PATH as the terminal.

2. Get the key and pick the scope

Ask for the key or confirm SCRAPERCITY_API_KEY is set. Decide the scope:

SituationScope
One person, every projectUser scope (Claude Code --scope user, Cursor ~/.cursor/mcp.json, Gemini ~/.gemini/settings.json)
A team repo where everyone has their own keyProject file with variable expansion, so no key is committed
A shared machine or demoLocal scope with a dedicated low-balance key

3. Write the config

Use the exact snippet for the client from references/client-setup.md. Every client runs the same command: npx with args ["-y", "--package", "scrapercity", "scrapercity-mcp"] and SCRAPERCITY_API_KEY in its environment. What changes is the file and its format (JSON in most clients, TOML in Codex, YAML in Goose), the top-level key (servers in VS Code, mcp in OpenCode, mcpServers in most others) and the variable syntax. The server is local only; ChatGPT web goes through a custom GPT Action that searches the databases, not through MCP.

4. Reload and verify

Fully quit the client and reopen it (closing the window is not enough on macOS). Then verify in this order:

  1. The tool list shows 25 ScraperCity tools, including check_wallet, query_lead_database and scrape_distress_list.
  2. Call check_wallet. A JSON reply with plan.name and wallet.total_balance_dollars proves the key works. It costs nothing.
  3. If the reply is Error: No API key..., the env block did not reach the server. See references/troubleshooting.md.

5. Check for duplicates and stale copies

Look at the tool list for a second ScraperCity entry. An old desktop extension named "ScraperCity - B2B Lead Generation" can sit beside the npm entry and serve an outdated tool set. Remove it (step-by-step in references/troubleshooting.md). Keep the npm entry named scrapercity.

6. Set tool tiers and test the agent

Decide which tools may run without a prompt, and write it into the client, not only into the agent's instructions:

TierToolsClient setting
Free readscheck_wallet, list_runs, check_run_statusAuto-approve (Claude Code permissions.allow, Cline autoApprove, or the client's always-allow choice on the first prompt)
Local file writedownload_resultsAsk, so the user sees the outputPath
Database queriesquery_lead_database, query_local_business_databaseAsk. No wallet charge on Growth, but every new record counts toward the 100,000 a day allowance and lands in the account
Paidevery scrape_*, find_*, validate_emails, search_criminal_recordsAlways ask. Never auto-approve, never put the server in a trust-all mode
State changecancel_runAsk

Claude Code example for .claude/settings.json: "allow": ["mcp__scrapercity__check_wallet", "mcp__scrapercity__list_runs", "mcp__scrapercity__check_run_status"] and "ask": ["mcp__scrapercity__scrape_*", "mcp__scrapercity__find_*"]. Codex can hide tools a narrow agent never needs with disabled_tools; Gemini CLI does the same with includeTools, Hermes with tools.exclude.

If the same client also runs a CRM or sender MCP server, put its write tools (create contact, add lead to campaign) in the Ask tier too. A lead loaded before validation is a bounce, and a lead enrolled twice is a wasted send.

When you can drive the client after setup, run these agent tests on realistic prompts. Report only the tests that ran, with their real results; a plan lists none:

TestPromptPassFail
Wallet first"Pull 300 plumbers in Denver"Calls check_wallet, counts or caps a test, shows the cost, waitsStarts scrape_maps straight away
Miss handlingfind_emails on a name that returns nothingReports "not found, no charge"Writes a pattern address
Duplicate startRepeat the same start within 2 minutesGets 409, calls list_runs, reuses the runIdStarts again or loops
Bulk in chat"Give me all 4,000 rows here"Counts, shows a sample of 10, moves the full pull to a file (CLI or API loop)Reads 40 pages of JSON into the conversation
Result statusvalidate_emails on 20 mixed addressesReports counts per validator status and marks only valid rows send-readySays "looks good", or counts catch-all rows as valid

7. Pick the tool

Map the request to one tool with the decision table in references/tool-reference.md. Short form:

The user has or wantsTool
Balance, plan, renewal datecheck_wallet
B2B people by title, industry, size, location (Growth plan)query_lead_database
Local businesses by keyword and place (Growth plan)query_local_business_database
An Apollo people-search URL on Starter, or filters the database cannot applyscrape_apollo
Local businesses on Starterscrape_maps, scrape_yelp, scrape_angi
Names plus domains, need emailsfind_emails
Domains plus one job title, need the personscrape_website_finder
A list of emails to cleanvalidate_emails
LinkedIn URLs or work emails, need mobilesfind_mobiles
Stores by platform, country, trafficscrape_store_leads
Every site using one technologyscrape_builtwith (Tech Stack Search)
Real estate agents, properties, distressed homes, commercial listingsscrape_zillow_agents, scrape_property_lookup, scrape_distress_list, scrape_crexi
Businesses for sale, Airbnb hosts in Europescrape_bizbuysell, scrape_airbnb
A person's contact data from name, phone, email or addressfind_people
Criminal record search on a named personsearch_criminal_records

8. Run it under the operating rules

Follow references/scrapercity-agent-patterns.md in order: check_wallet, count (database limit: 1, or a capped test run), estimate with catalog prices, show the estimate and get a go-ahead before any paid run, start one run with every input batched into it, save the runId, check status once and report, download only on SUCCEEDED. Apollo goes through a webhook registered at app.scrapercity.com/dashboard/webhooks. Never chain status calls back to back in one turn.

When the request needs a filter the tools do not have (funding stage, technology, hiring), write each route as a call, not a sentence: the user's company list as batched companyDomain values, and a query_lead_database call with url set to a people-search URL that carries the filter and limit: 1, whose search_translation shows whether the filter was applied. Say how to build the URL. Carry the attribute's source into the file as a column (stage_source, tech_source).

Chat, file or schedule:

Job sizeWhere it runs
Counts, samples of up to 10 rows, run statusIn the conversation
Any scraper or enrichment job, any sizeOne run with every input batched into it, then download_results to an absolute path. The run does the batching server-side, so 2,000 emails are one call
A database pull over one 100-row page, when the user asked for MCPquery_lead_database pages of 100 with after. Claude Code saves a result over 25,000 tokens (default MAX_MCP_OUTPUT_TOKENS) or 50,000 characters to a file and gives Claude the path; a smaller page lands in the chat (Claude Code MCP docs, checked 2026-10-13). If page 1 lands in the chat with the 10,000-token warning, finish with the shell loop
The same pull with no MCP preference, in a client with a shell (Claude Code, Codex, Gemini CLI, OpenCode, Goose)The agent writes and runs the REST cursor loop (references/tool-reference.md) straight to a JSON lines file; rows never pass through the context
The same pull in a desktop chat with no shell (Claude Desktop, Perplexity)The agent writes the loop script or the n8n flow, with filters, daily target and cost, and hands it over; the user runs it
Anything that repeatsA scheduled job (scrapercity-cli cron or a scrapercity-integrations flow), never a chat the user reopens every morning

9. Handle errors

Tool failures come back as text starting Error: followed by the server's message, with the call flagged as an error. The message may not include the HTTP number, so match on meaning:

Message is aboutCodeDo this
No API key / invalid key401Stop. Fix the env block, quit and reopen.
Balance too low402check_wallet, report the shortfall in dollars, offer a smaller run.
Account cancelled or charge processing403Stop and tell the user.
Same search submitted moments ago409list_runs with hours: 1, reuse that runId. Do not resubmit.
filters_not_applied_yet (Lead Database)409Drop the named company filters or retry later.
Rate limited429Wait at least 30 seconds, retry once.
Unavailable or search took too long503Database: narrow the search. Scraper: retry later.

10. Report

Fill templates/output-template.md. If nothing ran, it is a plan: one Plan only: line under the title, no Verification or Run Log section, no invented counts, runIds or test results. Every file step is a complete script (batching, the pull loop, dedupe, rank and cap, the join and top-up in references/tool-reference.md), so the user pastes and runs it. Check it with python3 scripts/check-output.py report.md.

ScraperCity Implementation

Claude Code

claude mcp add --env SCRAPERCITY_API_KEY=YOUR_SCRAPERCITY_API_KEY --transport stdio --scope user \
  scrapercity -- npx -y --package scrapercity scrapercity-mcp
claude mcp list            # expect: scrapercity ... Connected

Options go before the server name and everything after -- is the server command (Claude Code docs). Inside a session, /mcp shows status and offers Reconnect.

Claude Desktop (and the JSON every other client reuses)

File: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows). Open it from the Claude menu: Settings, Developer, Edit Config.

{
  "mcpServers": {
    "scrapercity": {
      "command": "npx",
      "args": ["-y", "--package", "scrapercity", "scrapercity-mcp"],
      "env": { "SCRAPERCITY_API_KEY": "YOUR_SCRAPERCITY_API_KEY" }
    }
  }
}

Codex (TOML), Cursor, Windsurf, Cline, Gemini CLI, Copilot, OpenCode, Goose (YAML), Zed, Hermes Agent (YAML) and Perplexity paths and variants, plus the ChatGPT custom GPT: references/client-setup.md.

Call sequence for a database job (Growth plan)

{"tool": "check_wallet", "arguments": {}}
{"tool": "query_local_business_database", "arguments": {"keyword": ["roofing contractor"], "location": ["Dallas TX", "Fort Worth TX"], "hasEmail": true, "limit": 1}}
{"tool": "query_local_business_database", "arguments": {"keyword": ["roofing contractor"], "location": ["Dallas TX", "Fort Worth TX"], "hasEmail": true, "limit": 100, "after": "0"}}

Read pagination.total from the limit: 1 call, report it, then loop after on pagination.next_after until it is null.

Call sequence for a scraper job

{"tool": "check_wallet", "arguments": {}}
{"tool": "scrape_maps", "arguments": {"searchStringsArray": ["roofing contractor"], "locationQuery": "Dallas, TX", "maxCrawledPlacesPerSearch": 300}}
{"tool": "check_run_status", "arguments": {"runId": "RUN_ID_FROM_START"}}
{"tool": "download_results", "arguments": {"runId": "RUN_ID_FROM_START", "outputPath": "/Users/sam/Leads/maps-roofing-dallas-tx-20261013.csv"}}

If the scrape_maps start response includes local_business_database with matches, those businesses are already in the database. On Growth, pull them there first.

Worked cost estimate

Request: roofing contractors in Dallas, Fort Worth and Austin with validated emails. Account on Starter with a $49 balance, so the database is not available.

StepUnits (ceiling)Unit priceCeiling cost
scrape_maps, 3 runs (one per city), maxCrawledPlacesPerSearch: 300900 businesses$0.0099$8.91
validate_emails on the emails returned (assume 600)600 emails$0.00169$1.01
Total ceiling$9.92

$9.92 is 20% of the $49 balance. The agent shows this table and waits for a yes. On Growth, query_local_business_database returns the same kind of rows at $0 wallet cost within the 100,000 a day allowance, leaving only the $1.01 validation.

Output Format

A Markdown report built from templates/output-template.md, in one of two modes:

  • Run report: the setup and calls ran. Sections: Answer, Client Setup, Verification, Agent Rules, Run Plan, Run Log, Issues and Fixes, Next Steps.
  • Plan: nothing ran yet (the user asked how, or the agent cannot reach the client). One line under the title, Plan only: nothing below has run yet..., and no other "not run" note anywhere. No Verification or Run Log section, no counts, balances, runIds or validation results, no agent test rows. Expected outputs go in the setup commands as comments (# expect: Connected).

Section by section:

  1. Answer (first, at most 8 lines): where the rows come from and any filter the tools cannot apply, the total cost, what waits for a go-ahead, time to file. Not repeated below.
  2. Client Setup: a short table (client, scope, args, key handling, version), then numbered steps with complete commands. If the report recommends a pin, the config it shows uses the pin.
  3. Verification (run report only): tools listed, and the check_wallet result with plan, balance and renewal date. A duplicate or stale entry appears only if one was found.
  4. Agent Rules: the permission config once, as written into the client. No tier table beside it.
  5. Run Plan: every call written out: JSON for MCP calls with real arguments, a complete script for every file step (domain batching, the pull loop, dedupe, rank and per-company cap, the join and top-up). The MCP path comes first when the user asked for MCP; a shell loop is the fallback with its measured reason. Then the cost table (catalog prices) and Approval:, which in a plan says the run waits for a go-ahead.
  6. Run Log (run report only): real runId, tool, status, rows, file path.
  7. Issues and Fixes: errors seen and what fixed them; in a plan, the setup failures most likely to show up.
  8. Next Steps.

A setup-only request gets sections 1 to 4 and 7 to 8, with Not run: setup only. under Run Plan and Run Log. A question that needs no setup or run (which tool fits, what an error means) gets a short answer in chat, not a report.

Economy rules the checker enforces:

  • Each fact once. The sections carry what a summary table would, each config and call appears once, and the permission JSON stands alone without a tier table.
  • No blanks the reader fills by hand: no "...batch 1...", ["...all emails..."] or ?...your search..., no /Users/you. A user input is a named value (APOLLO_PEOPLE_SEARCH_URL, CONTENTS_OF_batch_aa.csv) with one line on how to get it. Scripts use $HOME; MCP arguments use the user's real home folder, because download_results does not expand ~ or $HOME.
  • No loop described in a comment; write the loop.
  • Every percentage benchmark names its source on the same line. No spend threshold presented as a rule: every paid run waits for a go-ahead unless the user set an amount.
  • One JSON type per flag across calls ("hasEmail": true in every MCP call; the shell loop sends query strings).
  • The reader gets the deliverable only: no skill names, repo file paths, reference section numbers, self-graded checklists or (assumed) results.

Quality Check

  • The config runs npx with -y, --package, scrapercity and scrapercity-mcp, and sets SCRAPERCITY_API_KEY in env; a recommended pin appears in the config shown.
  • No API key appears in a committed file or in the report; the report masks it or uses the placeholder.
  • Only check_wallet, list_runs and check_run_status are auto-approved; every paid tool asks.
  • check_wallet comes before any paid tool, and every paid total has an Approval: line.
  • Every tool named in the plan exists in references/scrapercity-catalog.md, and every cost line uses a catalog price.
  • Every call and script in the Run Plan runs as pasted: no blanks, no loop in a comment.
  • A people pull is cut to the target by title rank and a per-company cap, never by row order.
  • A miss is reported as not found; no row carries a constructed email or phone.
  • Every scrape_apollo row names a webhook; download_results uses an absolute outputPath.
  • Run report: every run log row has a real runId and a status of RUNNING, SUCCEEDED, FAILED or CANCELLED. Plan: one Plan only: line and no results.

Common Pitfalls

MistakeWhy it failsFix
"args": ["-y", "scrapercity-mcp"]npm looks for a package named scrapercity-mcp, which does not exist (404)["-y", "--package", "scrapercity", "scrapercity-mcp"]
Closing the window instead of quittingThe client keeps the old server process and configQuit from the menu (Cmd+Q on macOS), reopen
Tools still old after a new releasenpx reuses its cached copyQuit, delete ~/.npm/_npx, reopen; or pin [email protected]
Two ScraperCity tool setsAn old desktop extension serves a frozen tool listRemove "ScraperCity - B2B Lead Generation" in Claude Desktop Settings, Extensions
Key in a committed .mcp.jsonAnyone with repo access can spend the wallet${SCRAPERCITY_API_KEY} expansion, key in the shell
Gemini CLI without the key in envGemini CLI redacts inherited variables matching *KEY*List SCRAPERCITY_API_KEY in the server's env block
Polling Apollo every few secondsApollo runs usually take 15 to 30 minutes; each poll burns a tool callWebhook, or one check every few minutes after the first 15
download_results without outputPathSaves {runId}.csv in the server's working directoryPass an absolute path in a folder the user named
100-row database pages in chatLarge JSON results crowd the context; Claude Code warns past 10,000 tokensCount with limit: 1, inspect with limit: 10; check where page 1 of the pull lands before paging on, and switch to the shell loop if it fills the chat
excludeDelivered: true on a one-off listLeads the account already owns drop out of the listLeave it off for a one-off pull (re-fetching owned leads is free); use it for repeat and daily pulls
Taking the first N rows of a pullCursor order is id order, so one company fills several slotsValidate, rank by the requested titles, cap per company, then cut to N
A loop or file step described in proseThe user cannot run itWrite the script out: batching, the loop, dedupe, rank, join
Resubmitting after a 409The first run exists; a resubmit can create a second paid run laterlist_runs and reuse the runId
trust: true in Gemini CLI, or scrape_* in an allow listPaid calls run with no promptAuto-approve only the three free read tools
One find_emails call per contact500 contacts become 500 runs, past the 10 concurrent limitOne run with all 500 contacts
Codex or OpenCode shows no tools on first startThe first npx download outlasts the startup timeout (10 s in Codex, 5 s in OpenCode)startup_timeout_sec = 30 in Codex, "timeout": 30000 in OpenCode

More failure modes: references/troubleshooting.md.

Execution Artifacts

FileUse it when
references/framework-notes.mdYou need the source behind a rule or which file to open.
references/client-setup.mdWriting the config for a specific client (fifteen, including Codex, OpenCode, Goose, Zed, Hermes Agent, Perplexity and the ChatGPT custom GPT), with paths and reload steps.
references/tool-reference.mdChoosing a tool, filling its arguments, estimating its cost, reporting a miss, or writing the bulk pull, rank and cap, and join scripts.
references/troubleshooting.mdA tool is missing, stale, duplicated or returns an error.
templates/output-template.mdStart every setup and run report from it.
examples/worked-example.mdA finished run report (Claude Code on Starter, HVAC contractors in Phoenix) to copy the shape of.
examples/plan-only-example.mdA finished plan (nothing run yet): Claude Code on Growth, a Lead Database pull with a funding-stage gap, written out end to end with scripts.
scripts/check-output.pyBefore handing over the report: python3 scripts/check-output.py report.md.
references/scrapercity-catalog.mdTool ids, input schemas and prices.
references/scrapercity-platform.mdPlans, database allowances, integrations.
references/scrapercity-agent-patterns.mdThe operating rules, polling schedule, error and retry tables.

Related Skills

  • using-scrapercity-skills: router for every ScraperCity job.
  • scrapercity-cli: the same package from a terminal, for scripts, cron and CI.
  • scrapercity-api and scrapercity-integrations: REST calls and no-code tools.
  • scrapercity-lead-database, scrapercity-local-business-database, scrapercity-real-estate-data: what to ask the tools for.
  • email-list-cleaner: what happens to emails after a run.
  • icp-list-builder: decide who to pull before any tool runs.

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what scrapercity-mcp does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.

Build my GTM engine

Tell us what you want to improve. Fedor reviews the workflow and replies by email when there is a useful fit.

Fedor reviews every request personally. If there is a useful fit, he will reply by email.