Systems Lab

Agent skill

icp-lead-list

Turn an ideal customer profile into a scored lead list with RouterGrowth: agree the ICP in one exchange (industry, size, geography, buyer titles), find matching companies (company_search) and the buyers inside them (people_search, cheapest lead database first), add company facts only for the accounts that make the cut (company_enrich, company_technologies, company_funding), then find and verify a work email for the people kept (contact_find, contact_verify).

activeReaches the webInstructions only999 words

Filed under Prospecting and list building.

From RouterGrowth/skills · 17 skill entries · 2 · pushed 2026-10-28

What it does when it runs

Turn an ideal customer profile into a scored lead list with RouterGrowth: agree the ICP in one exchange (industry, size, geography, buyer titles), find matching companies (company_search) and the buyers inside them (people_search, cheapest lead database first), add company facts only for the accounts that make the cut (company_enrich, company_technologies, company_funding), then find and verify a work email for the people kept (contact_find, contact_verify). Every row says why it fits. Use when the user says "build me a lead list", "find companies like X", "find heads of growth at Series A SaaS in Europe", "who should I sell to", "find 50 prospects", or describes their buyer and asks for names.

Automated analysis of the skill and the 1 file 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
None found.
Hosts it reaches
  • www.routergrowth.com
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about icp-lead-list

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/RouterGrowth/skills.git /tmp/skills
git -C /tmp/skills sparse-checkout set "skills/icp-lead-list"
mkdir -p ~/.claude/skills/icp-lead-list
cp -R "/tmp/skills/skills/icp-lead-list/." ~/.claude/skills/icp-lead-list/

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 17 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add RouterGrowth/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.

Reproduced in full from RouterGrowth/skills/blob/f745e770fa4001dd0f1a2bba0cd1a10e551fd2dd/skills/icp-lead-list/SKILL.md, which is licensed MIT (skill frontmatter). 999 words, 10 headings.

ICP lead list

From a description of the buyer to a list of real people at real companies, each with a verified email and one line on why they fit. The list is small and right before it is big: the first pass is 10 to 25 rows the user can judge, then it scales.

Before you start

  • The RouterGrowth tools must be in your tool list. If they are missing, the user connects RouterGrowth (Claude settings, Connectors: sign in, approve a workspace). Confirm with the free get_workspace_balance.
  • Write the ICP back to the user in one block and get a yes before spending: industry or what the company sells, headcount band, geography, the buyer's titles and seniority, two or three exclusions (agencies, competitors, existing customers). If the user only gave their own website, read it (web_scrape, one page) and propose the ICP from it.
  • Ask for the size of the first pass (default 20 people) and whether they need emails now or only names.
  • Call get_operation_pricing (free) once for people_search, company_search, contact_find and contact_verify, and any enrichment you will run. Read waterfall.max_cost_for_all for each lookup: it is the max_cost that lets every provider try, and you pay only for the one that finds. Quote the first pass as a whole and get a yes on anything likely above about $1. When no human is in the loop, the budget the caller set is the approval.
  • Call list_tables (free). When tables are on, keep the list in a table named after the ICP (for example seriesa-saas-eu-growth), resume it if it exists, and say its name once. Otherwise write out/<name>.csv (Claude Code) or a markdown table in the chat.

Steps

1. People first when the titles are clear

When the ICP names titles and filters the lead database understands, search people directly; the companies come with them:

{"input": {"titles": ["Head of Growth", "VP Growth"], "industries": ["software"],
  "company_headcount": ["11-50", "51-200"], "locations": ["Germany", "France", "United Kingdom"], "limit": 25},
 "max_cost": "<cap>"}

company_headcount takes the bands 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+, contiguous. seniority takes entry, senior, manager, director, vp, cxo, partner, owner. The cheapest route is a lead database: it serves titles or seniority, not both together, so pick one. Its rows carry name, title, company, company domain and LinkedIn URL, without email. Priced per person returned; ask for the number you will use. For the next page, pass next_cursor back as cursor with the same filters.

2. Companies first when the fit is about the company

When the fit is "companies that do X" (a niche, a technology, a business model), find the accounts first:

{"input": {"query": "warehouse robotics", "location": "Netherlands", "limit": 25}, "max_cost": "<cap>"}

Keep name, domain, employee_count, industry, linkedin_url. Drop accounts outside the size band and the exclusions now, before any people search. Then the buyers inside the accounts that remain, two per account at most:

{"input": {"company_domains": ["acme.com", "beta.io"], "titles": ["Head of Operations", "COO"], "limit": 4},
 "max_cost": "<cap>"}

Small companies often return nobody: that is a miss, not an error. For a founder-led company, the founder is the buyer: search seniority: ["owner", "cxo"] instead.

3. Qualify and score (mostly free)

Score each row 1 to 3 against the ICP using what you already have (title, company, size, location), and write one line of reason ("VP Growth at a 60-person fintech in Berlin, matches title and band"). Optional paid signals, only on rows that scored 2 or 3 and only when the user wants a tighter list:

  • company_enrich {"domain": ...}: industry, headcount, founded, funding, competitors.
  • company_technologies {"domain": ...}: running the tool the user replaces or integrates with.
  • company_funding {"domain": ...}: a recent round is budget that must be spent.

These are charged only when data is found. Lookups take max_cost at their max_cost_for_all.

4. Emails for the rows kept

Use the root domain: rows sometimes carry a subdomain (app.acme.com); strip it before looking up emails. Free first: get_subjects_history on the LinkedIn URLs (reuse what the workspace already found, drop people it already contacted if the user says so) and list_suppressions when tables are on. Then contact_find per row:

{"input": {"first_name": "Lena", "last_name": "Vogel", "company_domain": "acme.com"}, "max_cost": "<max_cost_for_all>"}

Charged only when an email is found. Then contact_verify with {"email": ...} on every address: keep valid, drop invalid, flag catch_all and risky in their own column. A no_match saying the person opted out ends it for that person.

Gate

Show the first pass before scaling: rows by score, emails found and valid, the total spent (from list_runs for this job, not a wallet difference), and every row with its reason. Ask what to change in the ICP (titles too junior, wrong size, an industry to exclude). Scale only after a yes, in pages of 25 to 100, reporting the running total.

Rules

  • max_cost on every paid call; on lookups, the waterfall.max_cost_for_all. Never cap a lookup at the cheapest provider's price.
  • Never invent a company, a person, a title or a reason. Every row comes from a result and carries the run id that produced it.
  • Search with structured filters (titles, locations, domains), not with a person's name in a web search.
  • Collect only the fields the list needs. Emails and profiles come from RouterGrowth's third-party data providers; if anyone asks where a value came from, point to https://www.routergrowth.com/privacy and https://www.routergrowth.com/privacy/opt-out.
  • This skill sends nothing. To write to the list, hand the verified rows to email-list-pipeline (email after approval) or linkedin-drafts (drafts the user sends).
  • If a tool fails in a way its error does not explain, offer to report it and call submit_feedback only if the user says yes.

Output

One row per person: score, reason, first_name, last_name, title, company, domain, employee_count, location, linkedin_url, email, verify_status, signals, run_ids. Plus the ICP as agreed, the totals (companies, people, emails found, valid, spent) and the rows dropped with the reason.

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 icp-lead-list 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.