Source profileQuality 91/100Review permissions

MoizIbnYousaf/marketing-cli/skills/lead-generation/SKILL.md

lead-generation

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).

Source repository stars
27
Declared platforms
0
Static risk flags
2
Last source update
2026-07-28
Source checked
2026-07-28

Decision brief

What it does—and where it fits

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…

Best for

  • Use when generating leads, building prospect lists, finding companies to sell to, outbound research, or ICP-based company discovery.

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/MoizIbnYousaf/marketing-cli --skill "skills/lead-generation"
Safe inspection promptEditorial

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

What the source asks the agent to do

  1. 01

    Workflow

    Review the “Workflow” section in the pinned source before continuing.

    Review and apply the “Workflow” source section.
  2. 02

    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:

    Is the ICP description accurate?Any companies to exclude (competitors, existing customers)?How many leads do they want? (default 200)
  3. 03

    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.

    companyname (string)website (string)productdescription (string, "in 12 words or less")
  4. 04

    Step 3: Wait and Read Output

    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…

    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.When completed, call agentgetrunoutput. Read the companies from output.structured, citations from output.grounding, and the run cost from costDollars.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 agentgetrunoutp…
  5. 05

    Step 4: Write the CSV

    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.

    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 direct…

Permission review

Static risk signals and limitations

Runs scripts

medium · line 137

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.

Network access

medium · line 183

The documentation includes network, browsing, or remote request actions.

"url": "https://mcp.exa.ai/mcp?tools=agent_tools",

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score91/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars27SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
MoizIbnYousaf/marketing-cli
Skill path
skills/lead-generation/SKILL.md
Commit
f12fbcbe4929584697b309b9096c9427b0cfce8e
License
MIT
Collected
2026-07-28
Default branch
main
View the original SKILL.md

On Activation

  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 (agent_tools / agent_run) or EXA_API_KEY. Without Agent access, stop and surface the MCP config from this skill.
  3. Confirm ICP with the user before large runs (default 200 leads is expensive).
  4. Write CSV under the project (e.g. marketing/leads/ or cwd). Never write credentials into brand/.

Lead Generation with Exa Agent

mktg runtime note

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

Prerequisites

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.

Tool Restriction

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.

Workflow

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)

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_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:

  • 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.

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 want
  • outputSchema - the exact structure back, with maxItems bounding the companies array
  • systemPrompt - scoring rules, source preferences, dedup/exclusion emphasis
  • input.exclusion - companies to avoid (competitors, existing customers, results from earlier runs)
  • effort - "auto" by default; "high" or "xhigh" for large or hard lists

Example:

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.

Step 3: Wait and Read Output

  1. 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.
  2. When 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.

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 follow-up run with previousRunId set to the completed run's ID, asking for additional companies
  • Put the company names already collected into input.exclusion so 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 agent_get_run_output, adjust the query or schema, and retry once with different wording
  • Use agent_cancel_run if a run is clearly researching the wrong thing
  • 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

Anti-Patterns

Anti-patternWhy it failsInstead
Using Claude native WebSearch instead of ExaMisses 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 authRequests 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 chatBurns context and hides the answer.Synthesize; cite URLs from grounding / result lists.

Attribution

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

Compare before choosing

Computed 9831,966

K-Dense-AI/scientific-agent-skills

dask

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.

Computed 9631,966

K-Dense-AI/scientific-agent-skills

neuropixels-analysis

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.

Computed 9631,966

K-Dense-AI/scientific-agent-skills

scanpy

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.

Computed 9031,966

K-Dense-AI/scientific-agent-skills

astropy

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.