A Claude sales team is three Claude Code subagents that share one data source and split the work. This guide builds them, caps the records they can spend and shows the real output of the first step.
TL;DR
- A Claude sales team is a set of subagents, each a markdown file with its own job and its own tool list. Three is enough: a sizer, a researcher and a drafter.
- It takes about 40 minutes. The example run spends about 13 of your 1,000 free LeadOcean records. The sizer spends none.
- Give only the researcher a tool that spends records. The cap then lives in the file, not in your prompt.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off.
- Claude Code installed and signed in, and an empty project folder.
- Optional, for the REST check:
curl,jqand your key in the shell.
export LEADOCEAN_API_KEY="paste-your-key-here"
mkdir sales-team && cd sales-team && mkdir -p .claude/agentsStep 1: Connect the data source
Claude has no live people or company data. Add LeadOcean as an HTTP MCP server so every agent reads the same source.
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp listRun /mcp in a session and approve the OAuth sign-in. No key is pasted. The server exposes 13 tools. Seven never spend records: the people count, the company count, filter list, enum list, account, get export and list exports.
Step 2: Write the team rules
Subagents are markdown files with YAML frontmatter, stored in .claude/agents/. Claude Code's docs say the tools field limits what each one can call. Put shared rules in CLAUDE.md so all three read them.
Sales team for Acme (project management software)
## ICP
- Buyer: VP of Sales, US, software companies with 51 to 200 staff.
## Team rules
- Every fact about a person or company comes from the leadocean MCP server.
- Missing value: write "unknown". Never guess.
- Never send anything. Drafts go to drafts/ as files.
- Records cap per run: 13 (10 from one search, 3 full lookups).Step 3: The sizer (no records spent)
The sizer is the cheapest agent and runs first. It only counts, so it gets only free tools.
---
name: sizer
description: Counts how many people match the ICP and reports the number. Use before any search.
tools: mcp__leadocean__leadocean_count_leads, mcp__leadocean__leadocean_list_enum_values, Read
model: haiku
---
Count the ICP with leadocean_count_leads. If a filter value is rejected or the total is 0,
resolve the exact string with leadocean_list_enum_values and retry once.
Report: total, distinctCompanies, and which email statuses were counted.
Do not search. Do not look anyone up.The REST equivalent is a search with count=true as a query parameter and limit at 1. It returns meta.total and no rows.
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{"jobLevel":["VP"],"jobFunction":["Sales & Business Development"],
"country":["US"],"industry":["Software Development"],
"employeeRange":["51-200"],"limit":1}' | jq '.meta'Step 4: The researcher (the only agent that spends records)
The researcher searches and looks people up. It is the one place a spend can happen, so its limits are written into its prompt.
---
name: researcher
description: Finds ICP buyers and pulls full records for the top three. Use after the sizer returns a non-zero total.
tools: mcp__leadocean__leadocean_search_leads, mcp__leadocean__leadocean_get_lead, Write
model: sonnet
---
1. Call leadocean_search_leads with the ICP filters and limit 10. One call only.
2. Pick the 3 people with email_status verified whose title best matches "VP Sales".
3. Call leadocean_get_lead once per pick. Three calls at most.
4. Write the three records to research/YYYY-MM-DD.json. Keep only fields that came back.Search is flat JSON with array filters and limit from 1 to 100. A person returned counts one record, so limit 10 is a ceiling of 10. If you later switch to REST enrich, it takes exactly one of linkedin_url, email, phone or person_id.
Step 5: The drafter (no data access)
The drafter reads the researcher's file and writes. It gets no LeadOcean tools, so it cannot spend a record or invent a fact by looking one up.
---
name: drafter
description: Writes one first email per researched person. Use after the researcher has written its file.
tools: Read, Write
model: sonnet
---
Read the latest file in research/. For each person write a first email of 60 words or fewer.
Use one fact from the record: current role, company, or a past role from resume_data.
Quote only fields present in the file. If a field is missing, say so in a note, not in the email.
Save to drafts/YYYY-MM-DD.md.Step 6: Run the team
Tell Claude to chain the three. The main session delegates by each agent's description.
claude
> Run the sizer. If the total is above 0, run the researcher, then the drafter.Once the output looks right, run it unattended. claude -p runs a prompt non-interactively. Pre-approve the tools by name so nothing off the list can run. Agent is the tool that starts a subagent; Claude Code's docs say it was called Task before version 2.1.63.
claude -p "Run the sizer, then the researcher, then the drafter." \
--allowedTools "Agent,Read,Write,mcp__leadocean__leadocean_count_leads,mcp__leadocean__leadocean_list_enum_values,mcp__leadocean__leadocean_search_leads,mcp__leadocean__leadocean_get_lead"Check the balance afterwards. GET /v1/account is free.
curl -s https://api.leadocean.io/v1/account -H "x-api-key: $LEADOCEAN_API_KEY" | jqWhat you get
The sizer's output is a real call. On 21 October 2026 the free MCP count tool returned this for the ICP in Step 2.
{
"total": 1649,
"totalIsExact": true,
"totalAll": 4141,
"distinctCompanies": 1125,
"credits": 0,
"defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all)",
"facets": {
"country": [{ "value": "US", "count": 1649 }],
"industry": [{ "value": "Software Development", "count": 1649 }],
"seniority": [{ "value": "vp", "count": 1649 }],
"company_size": [{ "value": "51-200", "count": 1649 }]
}
}That is 1,649 mailable VPs of Sales at US software companies of 51 to 200 staff, across 1,125 companies. Without the email condition the same filters match 4,141 people.
The researcher's search page has a different shape. This is the response shape from the API reference, with placeholder values.
{
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "VP Sales at Acme" },
"contact_data": {
"has_email": true, "email_status": "verified", "email_type": "work",
"contact_current_experiences": [{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }]
},
"meta": { "source_ids": { "person_id": "<person_id>" } }
}
],
"meta": { "count": 10, "limit": 10, "nextCursor": "<opaque cursor>" }
}The drafter's file is three short emails. Their quality depends on the prompts in Steps 4 and 5, so read the first run line by line.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked key (REST steps) | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY again. |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Wait the Retry-After seconds. Run agents one after another, not in parallel. |
| 402 | Free plan: the 1,000 records are spent | Check GET /v1/account. Free records do not reset. Solo is $97 a month; see pricing. |
| 400, or a count of 0 | A filter value outside the catalogue, such as industry: "Software" | Resolve the exact string with leadocean_list_enum_values or GET /v1/enums/<name>. |
| Agent says a tool is unavailable | The tool name is missing from the subagent's tools list | Add the exact mcp__leadocean__... name to that agent's frontmatter. |
| 400 or 429 on an export | 400: over 50,000 rows in one export. 429: past 500,000 rows a day | Split the audience by country or headcount band and run several. Bulk CSV export is not on Free. |
FAQ
Why three agents and not one?
Separate tool lists. The sizer cannot spend, the drafter cannot look anything up, and only the researcher touches paid calls. One agent with all tools relies on its prompt to behave.
Can the agents run in parallel?
Yes, but start with one after another. Parallel runs share one key and one rate limit: 5 requests a second on Free, 200 on Agency. See the GTM agent build for the single-agent version.
Does the team send email?
No. It writes drafts to files. LeadOcean is a data source with no sequencer, dialer or CRM, so add a sending tool only after you trust several runs.
What does a daily run cost?
About 13 records, so the free 1,000 covers a few weeks of tests. For a team running every day, Agency is $497 a month with a fair-use pace instead of credits. See pricing.
Where do I go next?
Read the Claude GTM masterclass for the wider build and AI agent tools for GTM and sales teams to compare options. More recipes are in the blog hub.
Give your Claude sales team live B2B data today
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →