Best for
- Use when generating leads, building prospect lists, finding companies to sell to, outbound research, or ICP-based company discovery.
MoizIbnYousaf/marketing-cli/skills/lead-generation/SKILL.md
Generate enriched ICP-based lead lists with Exa Agent, including structured scoring and CSV output. Use when generating leads, building prospect lists, finding companies to sell to, outbound research, or ICP-based company discovery. Triggers on leads, lead gen, prospect list, find companies, ICP, outbound list. Distinct from lead-magnet (content asset that captures emails).
Decision brief
1. Read brand/audience.md, brand/positioning.md, and brand/competitors.md if present to seed ICP + exclusions. All optional. 2. Confirm Exa MCP with Agent tools (agenttools / agentrun) or EXAAPIKEY. Without Agent access, stop and surface the MCP config from this skill. 3. Confir…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/MoizIbnYousaf/marketing-cli --skill "skills/lead-generation"Inspect the Agent Skill "lead-generation" from https://github.com/MoizIbnYousaf/marketing-cli/blob/f12fbcbe4929584697b309b9096c9427b0cfce8e/skills/lead-generation/SKILL.md at commit f12fbcbe4929584697b309b9096c9427b0cfce8e. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Review the “Workflow” section in the pinned source before continuing.
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:
Design an outputSchema with a bounded companies array. Keep schemas small, flat, and explicit; always bound arrays with maxItems.
1. Call agentwaitforrun with the run ID. It polls until the run reaches a terminal status (completed, failed, or cancelled) or times out - call it again if the run is still going. 2. When completed, call agentgetrunoutput. Read the companies from output.structured, citations fro…
Write output.structured.companies to {targetcompany}leads{YYYY-MM-DD}.csv, sorted by icpfitscore descending. Join any array fields with " | ". Use Python's csv.writer (handles quoting/escaping) via Bash, or Write directly for small lists.
Permission review
The documentation asks the agent to run terminal commands or scripts.
Call `agent_wait_for_run` with the run ID. It polls until the run reaches a terminal status (`completed`, `failed`, or `cancelled`) or times out - call it again if the run is still going.The documentation includes network, browsing, or remote request actions.
"url": "https://mcp.exa.ai/mcp?tools=agent_tools",Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 27 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
brand/audience.md, brand/positioning.md, and brand/competitors.md if present to seed ICP + exclusions. All optional.agent_tools / agent_run) or EXA_API_KEY. Without Agent access, stop and surface the MCP config from this skill.marketing/leads/ or cwd). Never write credentials into brand/.Prefer Exa MCP when available (tools: web_search_exa, web_search_advanced_exa, web_fetch_exa, agent_run).
If MCP Agent tools use the older create/wait/get names (agent_create_run, agent_wait_for_run, agent_get_run_output), use those equivalently.
Without MCP, call the HTTP API with x-api-key: $EXA_API_KEY (POST https://api.exa.ai/search, /contents, /agent).
Firecrawl remains the path for deep scrape of a known URL after Exa discovery.
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://docs.exa.ai/websets/api/overview
This skill requires the Exa MCP server with the Agent tools enabled (agent_tools): agent_create_run, agent_wait_for_run, agent_get_run_output, agent_cancel_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://docs.exa.ai/reference/exa-mcp
Then stop.
Use the Exa Agent tools (agent_create_run, agent_wait_for_run, agent_get_run_output, agent_cancel_run), plus Write and Bash (for CSV output). Do NOT use generic web search for the lead list itself.
1. Confirm the ICP with the user (one small Agent run if research is needed)
2. Create the lead-gen Agent run(s) with an outputSchema
3. Wait for completion (agent_wait_for_run)
4. Read output.structured (agent_get_run_output)
5. Write the CSV
6. Optional: expand with follow-up runs (previousRunId + input.exclusion)
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_create_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:
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.
Use the run inputs for the pieces the old manual pipeline handled by hand:
query - describe the list: the ICP, geography, stage, and how many companies you wantoutputSchema - the exact structure back, with maxItems bounding the companies arraysystemPrompt - scoring rules, source preferences, dedup/exclusion emphasisinput.exclusion - companies to avoid (competitors, existing customers, results from earlier runs)effort - "auto" by default; "high" or "xhigh" for large or hard listsExample:
agent_create_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": "auto",
"systemPrompt": "Prefer official company sites and recent funding announcements. Do not include duplicates or subsidiaries of the same parent company.",
"input": {
"exclusion": ["{competitor_1}", "{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_create_run returns an agent_run_... ID immediately. Save it.
agent_wait_for_run with the run ID. It polls until the run reaches a terminal status (completed, failed, or cancelled) or times out - call it again if the run is still going.completed, call agent_get_run_output. Read the companies from output.structured, citations from output.grounding, and the run cost from costDollars.Do not paste the full raw output into the conversation - go straight to 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}
If the user wants more leads than one run returned:
previousRunId set to the completed run's ID, asking for additional companiesinput.exclusion so the new run avoids themFor 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?"
failed, read the error from agent_get_run_output, adjust the query or schema, and retry once with different wordingagent_cancel_run if a run is clearly researching the wrong thingRequires 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"
}
}
}
}
| Anti-pattern | Why it fails | Instead |
|---|---|---|
| Using Claude native WebSearch instead of Exa | Misses niche competitors, companies, and cited sources Exa ranks highly. | Use this skill (or Exa MCP) for all open-ended web research. |
Calling Exa without EXA_API_KEY / MCP auth | Requests 401 and the agent invents results. | Set EXA_API_KEY (dashboard.exa.ai) or configure .mcp.json; surface the fix via mktg doctor. |
| Dumping raw result JSON into the user chat | Burns context and hides the answer. | Synthesize; cite URLs from grounding / result lists. |
Ported from exa-labs/agent-skills - adapted for mktg's drop-in contract on 2026-07-18.
Upstream commit: 390ffee2d7e1d0dce2ed8efe4994c2b3c1c0173b
Drift detection: if the upstream skill changes, re-run mktg-steal https://github.com/exa-labs/agent-skills to evaluate the diff.
Alternatives
K-Dense-AI/scientific-agent-skills
Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.
K-Dense-AI/scientific-agent-skills
Analyze Neuropixels extracellular recordings end-to-end with SpikeInterface. Covers loading SpikeGLX/Open Ephys/NWB data, preprocessing, drift/motion correction, Kilosort4 (and CPU) spike sorting, quality metrics, and unit curation (threshold-based, model-based UnitRefine, and AI-assisted visual review). Use when working with Neuropixels 1.0/2.0 recordings, spike sorting, or extracellular electrophysiology analysis.
K-Dense-AI/scientific-agent-skills
Standard single-cell RNA-seq analysis pipeline. Use for QC, normalization, dimensionality reduction (PCA/UMAP/t-SNE), clustering, differential expression, visualization, and converting R-friendly single-cell formats such as Seurat or SingleCellExperiment RDS files into h5ad for Scanpy. Best for exploratory scRNA-seq analysis with established workflows. For deep learning models use scvi-tools; for data format questions use anndata.
K-Dense-AI/scientific-agent-skills
Core Python library for astronomy and astrophysics workflows that need Astropy APIs, including units/quantities, coordinates, FITS I/O, tables, time systems, WCS, and cosmology. Use when implementing or debugging astronomical data analysis code with Astropy.