
lead-generation
Generate enriched lead lists using Exa Agent. Finds companies matching an ICP, enriches with signals/news/scores, and outputs CSV. Use when generating leads, building prospect lists, finding companies to sell to, doing outbound research, or ICP-based company discovery. Triggers on "leads", "lead gen", "prospect list", "find companies", "ICP", "outbound list".
- Installs
- 945
- Last 24h
- +12
- Trending rank
- #8077
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/exa-labs/agent-skills --skill lead-generation- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads lead-generation automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Lead Generation with Exa Agent
Generate enriched lead lists using the Exa Agent API. An Agent run is an asynchronous, multi-step web research task: you describe the list you want plus an output schema, and Exa handles query decomposition, searching, verification, enrichment, and structured output internally. You do NOT need to orchestrate parallel searches, subagents, or manual deduplication.
For very large or continuously maintained lead lists with per-item verification, consider Exa Websets instead: https://exa.ai/docs/websets/quickstart
Prerequisites
This skill requires the Exa MCP server with the Agent tool enabled. Use the agent_tools URL selection alias to enable agent_run.
If the Agent tools are not available, tell the user:
You need the Exa MCP server installed with the Agent tools and your API key. Instructions: https://exa.ai/docs/get-started/exa-mcp
Then stop.
Tool Restriction
Use agent_run, plus Write and Bash (for CSV output). Do NOT use generic web search for the lead list itself.
Workflow
1. Confirm the ICP with the user (one small Agent run if research is needed)
2. Call `agent_run` with an outputSchema
3. If the result is still running, call `agent_run` again with its `runId`
4. Read `output.structured` from the `agent_run` result
5. Write the CSV
6. Optional: expand with follow-up runs (previousRunId + input.exclusion)
Step 1: Understand the ICP
When the user says something like "Make a list of 200 leads for [company]", first establish the Ideal Customer Profile. If the user already described the ICP, confirm it. If not, run one small Agent run to research it:
agent_run {
"query": "Research {company_name}: what they sell, who their existing customers are, and what their ideal customer profile is.",
"effort": "low",
"outputSchema": {
"type": "object",
"properties": {
"company_description": { "type": "string", "description": "What the company does in 2 sentences or less" },
"icp_description": { "type": "string", "description": "Concise ICP description that clearly defines target companies" },
"sub_verticals": { "type": "array", "maxItems": 10, "items": { "type": "string" }, "description": "Sub-verticals breaking down the ICP" },
"useful_enrichments": { "type": "array", "maxItems": 8, "items": { "type": "string" }, "description": "Enrichment columns useful for filtering high-signal companies" }
},
"required": ["company_description", "icp_description", "sub_verticals", "useful_enrichments"]
}
}
Present the ICP to the user and confirm:
- Is the ICP description accurate?
- Any companies to exclude (competitors, existing customers)?
- How many leads do they want? (default 200)
- Any specific enrichment columns they care about?
Step 2: Create the Lead-Gen Run
Design an outputSchema with a bounded companies array. Keep schemas small, flat, and explicit; always bound arrays with maxItems.
Core fields to always include:
company_name(string)website(string)product_description(string, "in 12 words or less")icp_fit_score(integer, 1-10)icp_fit_reasoning(string, "compelling one-liner in 20 words or less")
Add enrichment fields tailored to the campaign (funding stage, headcount range, headquarters, hiring signals, etc.). Give string fields a length hint in their description to keep CSV output clean.
Set these run inputs:
query— describe the list: the ICP, geography, stage, and how many companies you wantoutputSchema— the exact structure back, withmaxItemsbounding the companies arraysystemPrompt— scoring rules, source preferences, dedup/exclusion emphasisinput.exclusion— companies to avoid (competitors, existing customers, results from earlier runs)effort—"low"by default;"auto","high", or"xhigh"for large or hard lists
Example:
agent_run {
"query": "Find 100 companies matching this ICP: {icp_description}. Prioritize {sub_verticals}. For each company, score ICP fit 1-10 for {user_company}.",
"effort": "low",
"systemPrompt": "Prefer official company sites and recent funding announcements. Do not include duplicates or subsidiaries of the same parent company.",
"input": {
"exclusion": [
{ "company_name": "{competitor_1}" },
{ "company_name": "{existing_customer_1}" }
]
},
"outputSchema": {
"type": "object",
"properties": {
"companies": {
"type": "array",
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"company_name": { "type": "string" },
"website": { "type": "string", "format": "uri" },
"product_description": { "type": "string", "description": "in 12 words or less" },
"icp_fit_score": { "type": "integer", "description": "1-10" },
"icp_fit_reasoning": { "type": "string", "description": "one-liner in 20 words or less" }
},
"required": ["company_name", "website", "product_description", "icp_fit_score", "icp_fit_reasoning"]
}
}
},
"required": ["companies"]
}
}
agent_run returns the completed result when possible. If it returns status: "running" with an agent_run_... ID, save the ID and continue with agent_run using only runId.
Step 3: Wait and Read Output
- If the run is still running, call
agent_runwith itsrunIduntiloutputReadyis true or the run reaches a terminal status (failedorcancelled). - Read the companies from
output.structured, citations fromoutput.grounding, and the run cost fromcostDollarsin theagent_runresult.
Do not paste the full raw output into the conversation — go straight to CSV.
Step 4: Write the CSV
Write output.structured.companies to {target_company}_leads_{YYYY-MM-DD}.csv, sorted by icp_fit_score descending. Join any array fields with " | ". Use Python's csv.writer (handles quoting/escaping) via Bash, or Write directly for small lists.
Print a summary:
## Lead Generation Complete
- Total leads: {count}
- ICP score distribution: 8-10: {N} | 5-7: {N} | 1-4: {N}
- Run ID: {agent_run_id}
- Cost: ${costDollars}
- Output: {filename}
Step 5: Expanding the List
If the user wants more leads than one run returned:
- Create a new follow-up run with
previousRunIdset to the completed run's ID, asking for additional companies - Put the company records already collected into
input.exclusionso the new run avoids them - Append the new results to the CSV and re-deduplicate by normalized company name (strip "Inc"/"Ltd"/etc., case-insensitive)
For lists in the many hundreds, run a few runs sequentially this way rather than one giant run, and confirm scope with the user first: "This will require ~{N} Agent runs. Proceed?"
Handling Failures
- If a run ends
failed, read the error from theagent_runresult, adjust the query or schema, and retry once with different wording - Aborting an in-progress
agent_runcall does not cancel the run - If results are consistently below the requested count, narrow the ICP into 2-3 sub-vertical runs instead of one broad run
MCP Configuration
Requires an Exa API key. Get yours at https://dashboard.exa.ai/api-keys
{
"servers": {
"exa": {
"type": "http",
"url": "https://mcp.exa.ai/mcp?tools=agent_tools",
"headers": {
"x-api-key": "YOUR_EXA_API_KEY"
}
}
}
}
References
- Exa Agent guide: https://exa.ai/docs/agent/quickstart
- Exa MCP setup: https://exa.ai/docs/get-started/exa-mcp
- Websets (verified list-building at scale): https://exa.ai/docs/websets/quickstart
- Full docs for LLMs: https://exa.ai/docs/llms.txt
FAQ
What does the lead-generation skill do?
Generate enriched lead lists using Exa Agent. Finds companies matching an ICP, enriches with signals/news/scores, and outputs CSV. Use when generating leads, building prospect lists, finding companies to sell to, doing outbound research, or ICP-based company discovery. Triggers on "leads", "lead gen", "prospect list", "find companies", "ICP", "outbound list".
How do I install lead-generation?
Run npx skills add https://github.com/exa-labs/agent-skills --skill lead-generation in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/lead-generation/ (personal) or .claude/skills/lead-generation/ (project).
Which AI agents can use lead-generation?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is lead-generation safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains lead-generation?
It is published by exa-labs in exa-labs/agent-skills. It has 945 recorded installs.
More from exa-labs/agent-skills
build-with-exa
exa-labs/agent-skills
Build applications and agents with Exa's API: search, contents extraction, answer, Agent API, monitors, websets, OpenAI-compatible endpoints, and exa-py/exa-js SDKs. Use when choosing Exa endpoints, writing Exa API calls, integrating semantic web search or research into products, or debugging Exa request shapes.
exa-search
exa-labs/agent-skills
Call Exa Search directly with cURL or raw HTTP. Use when an agent needs Exa semantic web retrieval from POST /search without an SDK, including ranked results, domain or category filters, freshness-aware result content, highlights or text extraction, structured output, or streaming search responses.
exa-contents
exa-labs/agent-skills
Call Exa Contents directly with cURL or raw HTTP. Use when an agent already has URLs and needs POST /contents without an SDK for extracted text, highlights, summaries, links, image links, subpages, freshness-controlled crawling, or per-URL status handling.
company-research
exa-labs/agent-skills
Company research using Exa. Finds company info, competitors, news, financials, LinkedIn profiles, builds company lists. Use when researching companies, doing competitor analysis, market research, or building company lists.
Popular data & databases skills
supabase-postgres-best-practices
supabase/agent-skills
Postgres best practices maintained by Supabase, for Postgres running anywhere. Load this skill BEFORE writing or changing anything that lives in a Postgres database: creating or altering tables and columns (including choosing column types), schema design, migrations and declarative schema files, RLS policies and the tests that verify them, indexes, triggers, database functions, queues and scheduled jobs (pgcron, pgmq), vector/semantic search (pgvector), and restoring dumps (pgrestore) or importing data. Also load it when diagnosing slow queries, high CPU, timeouts, EXPLAIN plans, connection exhaustion, locking, bloat, or rows visible to the wrong user or tenant. This is not just a performance guide — schema, migration, security, and SQL authoring tasks need these rules too, even for a one-column change or a single query.
prisma-client-api
prisma/skills
Prisma Client API reference covering model queries, filters, operators, and client methods. Use when writing database queries, using CRUD operations, filtering data, or configuring Prisma Client. Triggers on "prisma query", "findMany", "create", "update", "delete", "$transaction".
prisma-database-setup
prisma/skills
Deprecated compatibility name for prisma-orm-setup. Use only when a user or existing integration explicitly invokes prisma-database-setup; otherwise select prisma-orm-setup.
prisma-cli
prisma/skills
Prisma ORM 7 CLI reference for existing Prisma 7 applications or explicitly selected Prisma 7 workflows. Covers prisma init, generate, migrate, db, dev, studio, and mcp. For setup, connection repair, or Prisma 8, use prisma-orm-setup; not the Prisma Platform CLI.
prisma-postgres
prisma/skills
Deprecated compatibility name for prisma-postgres-setup. Use only when a user or existing integration explicitly invokes prisma-postgres; otherwise select prisma-postgres-setup.
prisma-driver-adapter-implementation
prisma/skills
Required reference for Prisma ORM 7 SQL driver adapter work. Use when implementing or modifying adapters, adding database drivers, or touching SqlDriverAdapter, Transaction, savepoint, result mapping, or DriverAdapterError behavior. Covers current transaction lifecycle, optional savepoint hooks, original database-error preservation, and verification.