Lead Generation Claude Skill: Build a Reusable SKILL.md (2026)
By Kushal Magar · September 28, 2026 · 14 min read
Key Takeaway
A lead gen Claude Skill is a SKILL.md file that runs the same ICP account search → decision-maker find → email enrichment → CSV export chain every time — with a check_credits guardrail, fixed result caps, and a locked output schema. Write it once in .claude/skills/, invoke it with /lead-list-builder, and every run is consistent. Start from SyncGTM's pre-built GTM skill files to skip the MCP wiring.
Definition
A lead generation Claude Skill is a SKILL.md file that packages a complete ICP account search, decision-maker discovery, waterfall email enrichment, and CSV export workflow as a single slash command in Claude Code. It enforces fixed ICP filters, a credit-balance guardrail, per-step result caps, and a locked output schema — so every run is identical regardless of who runs it.
Every sales team that uses Claude for lead generation eventually hits the same problem: the prompt gets longer, the filters change between runs, the CSV schema drifts, and a new rep re-invents the whole thing from memory. The fix is not a better prompt — it is a lead generation Claude Skill.
A Claude Skill is a SKILL.md file stored in .claude/skills/ that packages an entire workflow as a slash command. For lead generation, that means one command — /lead-list-builder — runs the full chain: ICP account sourcing, decision-maker discovery, waterfall email enrichment, email verification, and CSV export, with the same filters, result caps, and output columns every single time.
This guide walks through the anatomy of a lead gen SKILL.md, the complete copy-paste skill using SyncGTM's MCP tools, how to install it in Claude Code and the Claude app, how to invoke and debug it, and how to skip the blank-page problem by starting from SyncGTM's ready-made GTM agent skill files.
TL;DR
- A Claude Skill (
SKILL.md) packages a repeatable lead gen workflow as a slash command — same filters, same caps, same CSV schema every run. - The anatomy: YAML frontmatter (name + description), a Goal line, numbered steps with one SyncGTM MCP tool per step, a
check_creditsguardrail, result caps, and a fixed CSV output schema. - The four-step chain is:
find_companies→find_people→find_work_email→verify_email. - Install in Claude Code at
.claude/skills/lead-list-builder/SKILL.md. Invoke with/lead-list-builder. - Skip the blank page: copy SyncGTM's pre-built GTM skill files, swap your ICP parameters, and run.
Why Package Lead Gen as a Skill (vs. Prompting Ad Hoc)
Ad hoc prompting for lead generation has four failure modes that a skill fixes permanently.
1. Filter drift
When you type ICP filters in each prompt, they change run to run — different headcount ranges, different seniority levels, different country lists. Lists become incomparable and dedup breaks down. A skill hard-codes your ICP filters in one file, version-controlled.
2. Uncapped credit burns
Claude picks the wrong tool or calls find_work_email 500 times when you meant 50. A skill puts a check_credits call at the top and a hard result cap at each step — so a runaway loop stops before it drains your balance.
3. Schema drift
Without a locked CSV schema, every run produces slightly different columns — some with "Work Email", some with "email", some with "verified_email". Downstream sequences break. The skill declares the exact column order in the Output Schema section.
4. Non-portability
A prompt lives in your head or a Notion doc no one reads. A skill lives in the repo at .claude/skills/, gets committed to git, and any team member can run it. New rep onboarding becomes: clone the repo, open Claude Code, type /lead-list-builder.
According to HatchWorks' Claude Skills guide, the description field in a skill's frontmatter is "the whole game" — it is the routing rule Claude uses to decide whether a given slash command or user message should fire the skill. For lead gen specifically, that means the description must name the exact trigger phrase your team will type.
SKILL.md Anatomy
A lead gen SKILL.md has six components. Each one does a specific job — leave one out and the skill either fires incorrectly, burns credits unpredictably, or outputs an unusable CSV.
Frontmatter: name and description
The YAML frontmatter block sits at the top of SKILL.md between triple-dashes. It has two required fields:
---
name: lead-list-builder
description: >
Use when asked to 'build a lead list', 'find target accounts',
'source decision-makers', 'run lead gen', or 'generate a prospect CSV'.
Runs find_companies → find_people → find_work_email → verify_email
and exports a deduplicated CSV with verified contacts.
---name becomes the slash command: /lead-list-builder. Keep it lowercase with hyphens — no spaces.
description is the trigger condition. Claude reads this at startup to decide whether to load the skill. List every phrase a rep might type to kick off a lead gen run. If the phrase is not in the description, the skill will not fire automatically — only the slash command will invoke it.
Goal Line
The first line of the skill body is a single Goal sentence that tells Claude the purpose and output of the entire run. This anchors every decision Claude makes in the steps below.
## Goal
Build a verified lead list of up to 25 contacts matching the ICP defined below.
Export a CSV with the columns: Company, Domain, First Name, Last Name,
Title, Seniority, LinkedIn URL, Work Email, Email Status.The cap (25 contacts) in the Goal line is intentional — it is a second guardrail on top of the per-step result caps. If the steps somehow run longer than expected, the Goal line is Claude's instruction to stop at 25.
Numbered Steps With One MCP Tool Per Step
Each step maps to exactly one SyncGTM MCP tool. One tool per step prevents Claude from improvising a different tool sequence on each run.
## Steps
### Step 1 — Source target accounts
Tool: mcp__syncgtm__find_companies
Parameters:
- industry: ["SaaS", "Software"]
- headcount_min: 50
- headcount_max: 500
- country: ["US", "CA", "GB", "AU"]
- keywords: ["sales engagement", "revenue operations"]
Cap: 10 companies maximum.
### Step 2 — Find decision-makers
Tool: mcp__syncgtm__find_people
Parameters:
- titles: ["VP Sales", "Head of Sales", "Director of Sales",
"VP Revenue", "Chief Revenue Officer"]
- seniority: ["Director", "VP", "C-Suite"]
Cap: 3 contacts per company, 25 contacts total.
### Step 3 — Enrich work emails
Tool: mcp__syncgtm__find_work_email
Input: linkedin_url from Step 2 results.
Cap: 25 contacts maximum (matches Goal cap).
Note: 1 credit per contact. Do not call for contacts already
in outbound.csv or CRM.
### Step 4 — Verify emails
Tool: mcp__syncgtm__verify_email
Input: email from Step 3 results.
Keep only contacts where status is "valid" or "catch_all".
Drop contacts where status is "invalid" or "unknown".
Note: 0.3 credits per contact.The Cap line in each step is the per-step result limit. Setting it here means Claude will stop calling the tool once the cap is hit — even if the MCP returns more results.
check_credits Guardrail
The guardrail lives before Step 1 and calls mcp__syncgtm__check_credits to read the current balance. If the balance is below the minimum threshold, the skill halts before spending a single credit.
## Guardrail — Run BEFORE Step 1
Tool: mcp__syncgtm__check_credits
If remaining credits < 50:
STOP. Print: "Insufficient credits. Current balance: [N].
Top up at https://app.syncgtm.com/billing before running this skill."
Do NOT proceed to any step.
Credit estimate for a full run (25 contacts):
Step 3 (find_work_email): 25 × 1 = 25 credits
Step 4 (verify_email): 25 × 0.3 = 7.5 credits
Total: ~33 creditsThe credit estimate comment makes it easy for any rep to know whether they can afford a run before starting — no mental math required. Update these numbers if you change the cap.
Result Caps
Result caps appear in three places in the skill: the Goal line (total cap), each Step (per-tool cap), and the Guardrail (credit floor). The three work together:
| Cap type | Where it lives | What it prevents |
|---|---|---|
| Goal cap (25 contacts) | Goal section | Claude enriching the entire company database |
| Per-step cap | Each Step block | One step ballooning and starving the next |
| Credit floor (50 credits) | Guardrail section | Starting a run that will fail mid-way out of credits |
CSV Output Schema
The Output Schema section declares the exact columns, in order, that every run must produce. Sequences, CRM imports, and dedup scripts all depend on this being stable.
## Output Schema
Export a CSV named leads-YYYY-MM-DD.csv with these columns in this exact order:
Company, Domain, First Name, Last Name, Title, Seniority,
LinkedIn URL, Work Email, Email Status, Country, Headcount
Rules:
- Email Status values: valid | catch_all | invalid | unknown
- Drop rows where Email Status is "invalid" or "unknown"
- Deduplicate on LinkedIn URL — one row per person
- File encoding: UTF-8Full Copy-Paste Lead List Builder Skill
Below is the complete SKILL.md. Copy it into .claude/skills/lead-list-builder/SKILL.md, update the ICP parameters in Step 1 and Step 2 for your own target market, and run.
---
name: lead-list-builder
description: >
Use when asked to 'build a lead list', 'find target accounts',
'source decision-makers', 'run lead gen', or 'generate a prospect CSV'.
Runs find_companies → find_people → find_work_email → verify_email
and exports a deduplicated CSV with verified contacts.
allowed-tools: mcp__syncgtm__check_credits, mcp__syncgtm__find_companies,
mcp__syncgtm__find_people, mcp__syncgtm__find_work_email,
mcp__syncgtm__verify_email, Write
---
## Goal
Build a verified lead list of up to 25 contacts matching the ICP defined below.
Export a CSV named leads-YYYY-MM-DD.csv with these columns in this exact order:
Company, Domain, First Name, Last Name, Title, Seniority,
LinkedIn URL, Work Email, Email Status, Country, Headcount.
## ICP Definition
Customize these values for your target market:
- Industries: ["SaaS", "Software"]
- Headcount: 50–500 employees
- Countries: ["US", "CA", "GB", "AU"]
- Keywords: ["sales engagement", "revenue operations", "GTM"]
- Decision-maker titles: ["VP Sales", "Head of Sales", "Director of Sales",
"VP Revenue", "Chief Revenue Officer", "CRO"]
- Seniority levels: ["Director", "VP", "C-Suite"]
## Guardrail — Run BEFORE Step 1
Tool: mcp__syncgtm__check_credits
If remaining credits < 50:
STOP. Print: "Insufficient credits. Current balance: [N].
Top up at https://app.syncgtm.com/billing before running this skill."
Do NOT proceed to any step.
Credit estimate for a full run (25 contacts):
Step 3 (find_work_email): 25 × 1.0 = 25 credits
Step 4 (verify_email): 25 × 0.3 = 7.5 credits
Total: ~33 credits
## Steps
### Step 1 — Source target accounts
Tool: mcp__syncgtm__find_companies
Parameters: use ICP Definition values above.
Cap: 10 companies maximum.
Output: company name, domain, LinkedIn company URL, headcount, country.
### Step 2 — Find decision-makers
Tool: mcp__syncgtm__find_people
Input: company LinkedIn URL from Step 1 results.
Parameters:
- titles: from ICP Definition
- seniority: from ICP Definition
Cap: 3 contacts per company, 25 contacts total across all companies.
Output: first name, last name, title, seniority, LinkedIn profile URL, company name.
### Step 3 — Enrich work emails
Tool: mcp__syncgtm__find_work_email
Input: linkedin_url from Step 2 results, one call per contact.
Cap: 25 contacts maximum.
Do NOT call for contacts where a work email is already present.
Note: 1 credit per contact.
### Step 4 — Verify emails
Tool: mcp__syncgtm__verify_email
Input: email from Step 3 results, one call per contact with a returned email.
Keep: status "valid" or "catch_all"
Drop: status "invalid" or "unknown"
Note: 0.3 credits per contact.
## Output Schema
Export a CSV named leads-YYYY-MM-DD.csv (today's date) with columns in this order:
Company, Domain, First Name, Last Name, Title, Seniority,
LinkedIn URL, Work Email, Email Status, Country, Headcount
Rules:
- Drop rows where Email Status is "invalid" or "unknown"
- Deduplicate on LinkedIn URL — one row per person
- Sort by Company name ascending
- File encoding: UTF-8
- Save to the current working directory
## Completion Report
After exporting, print:
- File name and path
- Total companies sourced (Step 1)
- Total contacts found (Step 2)
- Total emails found (Step 3)
- Total emails verified as valid or catch_all (Step 4)
- Credits used this run (check_credits balance before minus after)
- Credits remainingThe allowed-tools field in the frontmatter locks the skill to only those six tools — it cannot call anything else, including expensive or irrelevant tools that Claude might otherwise reach for. This is an important security boundary for agentic workflows.
The Completion Report section ensures every run ends with a structured audit trail — not just a CSV file with no metadata about how it was built.
Installing the Skill
Skills install in two places: Claude Code (for automated, code-adjacent workflows) and the Claude app (for conversational use). The SKILL.md format works in both, but the MCP tool chain only runs in Claude Code.
In Claude Code (.claude/skills/)
Create the directory and file from your repository root:
# From your repo root
mkdir -p .claude/skills/lead-list-builder
# Paste the SKILL.md content above into this file
touch .claude/skills/lead-list-builder/SKILL.mdSkills in .claude/skills/ are project-scoped — they are available to every team member who clones the repo and opens Claude Code from that directory. Commit the file to git so the workflow is version-controlled.
For personal skills that should not be shared with the team, install at the user level instead:
# User-level install (personal, not repo-specific)
mkdir -p ~/.claude/skills/lead-list-builderAfter saving the file, Claude Code picks it up on the next session start. No restart or reinstall command is required — Claude re-reads the skills directory at the beginning of each conversation.
You also need to ensure the SyncGTM MCP is connected. If you have not set it up yet, the SyncGTM company search MCP guide covers the full connection flow: Claude Code settings, the MCP server URL, and OAuth.
In the Claude App
The Claude app (claude.ai) supports a simplified version of SKILL.md via the Projects feature. Navigate to your Project → Settings → Custom instructions and paste the skill body (without the frontmatter) into the instructions box.
The limitation: the Claude app cannot call MCP tools like find_work_email or check_credits. In the app, the skill works as a workflow guide — Claude will walk you through the steps and tell you what to look up, but it cannot execute the tool calls automatically. For the full automated pipeline, use Claude Code with the SyncGTM MCP connected.
Invoking by Slash Command
With the skill installed and the SyncGTM MCP connected, open a new Claude Code session from your repo root and type:
/lead-list-builderClaude loads the SKILL.md, reads the ICP parameters, runs the guardrail, and begins the four-step chain. The first output you see is the check_credits result confirming your balance is sufficient.
You can also trigger the skill through natural language — any phrase matching the description field fires it:
# All of these invoke the skill:
build a lead list
find target accounts in SaaS with 50–500 employees
source decision-makers for our outbound campaign
generate a prospect CSV for this week's sequencesTo override a specific parameter for one run without editing the skill file, pass it inline:
/lead-list-builder -- cap 10 contacts, UK companies onlyThe --separator tells Claude that everything after it is a runtime override, not a new prompt. The skill's core logic still runs; only the specified parameters change for that run.
For fully automated runs (cron, CI, or a scheduled agent), pass the argument as a non-interactive flag:
# Run non-interactively from a cron job or script
claude -p "/lead-list-builder" --no-interactiveDebugging Bad Runs
Most skill failures fall into one of five categories. Here is how to identify and fix each one.
1. Skill did not fire — Claude answered from memory
Symptom: You type /lead-list-builder and Claude writes a paragraph about lead generation instead of running tools.
Cause: The skill file is not in the right directory, or the name field does not match the slash command you typed.
Fix: Confirm the file exists at .claude/skills/lead-list-builder/SKILL.md (not lead_list_builder with an underscore). The directory name must match the name field exactly. Start a fresh Claude Code session after creating the file — skills load at session start.
2. MCP tool not found
Symptom: Claude tries to call mcp__syncgtm__find_companies and returns a tool-not-found error.
Cause: The SyncGTM MCP server is not connected or not authorized in this Claude Code session.
Fix: Open Claude Code settings (/mcp or Settings → MCP Servers) and verify the SyncGTM MCP server shows as connected. Re-authorize via OAuth if the token has expired. The server URL is https://api.syncgtm.com/mcp.
3. Guardrail fires even though credits are sufficient
Symptom: The skill stops at the guardrail and reports insufficient credits, but your SyncGTM dashboard shows a healthy balance.
Cause: The credit floor in your skill (< 50) is higher than your current balance, but you set it too conservatively — or the credit estimate in the skill was written for a larger run than your current cap allows.
Fix: Either top up credits to exceed the floor, or lower the floor to match the actual credit estimate for your configured cap. The formula is: (cap × 1.0) + (cap × 0.3) + 10 buffer.
4. CSV has wrong columns or missing rows
Symptom: The exported CSV has different column names than the schema, or some rows are missing the Work Email field entirely.
Cause: Claude improvised the output format, or some contacts had no email found in Step 3 but were not dropped as specified.
Fix:Add an explicit instruction at the top of the Output Schema section: "Do not rename, reorder, or add columns. Drop any row missing a Work Email or with Email Status invalid or unknown." Explicit rules beat implicit expectations every time.
5. Skill stops mid-run and never finishes
Symptom: Claude completes Step 1 and Step 2 but stops before running find_work_email.
Cause:Claude hit its context limit mid-run, or it interpreted the Step 3 cap as "25 total tool calls in the session" rather than "25 contacts to enrich."
Fix:Add a continuity instruction after the Steps section: "If the session interrupts before completing all steps, resume from the last completed step. Do not restart from Step 1." For very large runs, split the list — run find_companies once, save the output, then run find_people and enrichment in a separate session.
Start From SyncGTM's Ready-Made GTM Skill Files
Building a SKILL.md from scratch means getting every MCP tool name, parameter structure, and credit cost right the first time. SyncGTM ships a library of pre-built GTM agent skill files so you can skip that.
The SyncGTM Claude skills for B2B sales library includes pre-built skills for the most common GTM workflows:
| Skill file | What it does | Tools used |
|---|---|---|
| lead-list-builder | ICP accounts → decision-makers → verified emails → CSV | find_companies, find_people, find_work_email, verify_email |
| signal-prospecting | Job changes + funding signals → triggered outreach list | check_job_change, check_promotions, newly_hired_executives |
| crm-enrichment | Missing CRM fields → waterfall enrichment → write-back | enrich_organization, find_work_email, verify_email |
| linkedin-engager-list | LinkedIn post engagers → enriched contacts → outreach CSV | linkedin_post_engagers, find_work_email, verify_email |
| google-maps-leads | Local business search → verified contact list | google_maps_listings, find_work_email, verify_email |
To use a pre-built skill file, copy it from the SyncGTM dashboard into your .claude/skills/ directory. Open the SKILL.md, find the ICP Definition section, and replace the default values with your target market. That is the only edit required for most teams — the tool chain, guardrails, caps, and CSV schema are already production-ready.
For the signal-prospecting skill specifically, the Claude skills for RevOps guide explains how to configure the trigger thresholds — headcount growth rate, funding amount, and seniority level — so the signal list stays focused rather than flooding your queue every morning.
Extending a pre-built skill
Pre-built skills are starting points, not locked templates. Common extensions teams add:
- Step 5 — Mobile phone enrichment: add
find_mobile_numberafter verify_email for contacts flagged as high-priority. Note: 15 credits per contact — set a tighter cap (5–10 contacts). - Step 5 — LinkedIn first-line generation: after the CSV export, pass company name and title to Claude to write a personalized first line for each contact. Zero additional MCP credits — Claude generates this from the data already in the CSV.
- Step 0 — Dedup against existing CSV: before the guardrail, check whether the LinkedIn URL already appears in
outbound.csv. Skip enrichment for any contact already there.
Conclusion
A lead generation Claude Skill solves the four failure modes of ad hoc prompting — filter drift, uncapped credit burns, schema drift, and non-portability — by encoding your ICP, tool chain, result caps, and output schema into a version-controlled SKILL.md that every team member runs the same way.
The four-step chain (find_companies → find_people → find_work_email → verify_email) costs roughly 33 credits per 25 contacts — a fixed, predictable cost you can budget per campaign. The guardrail ensures no run starts unless the balance covers it.
Start with the copy-paste skill in this post, swap the ICP parameters for your target market, and run /lead-list-builder. Or copy a pre-built skill file from the SyncGTM platform and skip the wiring entirely. Either way, your first verified lead list is 30 minutes away.
