Claude Code finds leads well when it has a data source it can query. Give it LeadOcean over MCP, keep the ICP in a file, and it sizes, pulls and scores a list in one session.
This is the short version: real queries, a real count, no theory. It takes about 20 minutes.
TL;DR
- Connect the MCP server, count the audience for free, pull 25 people, enrich the 5 that score best.
- Time: about 20 minutes. Records spent: about 30. Counting spends none.
- The Free plan (1,000 records for life, no card) covers this run many times over.
Prerequisites
- Claude Code installed.
- A free LeadOcean account at app.leadocean.io. The MCP server signs in with OAuth, so no key is pasted.
- For the REST fallback in Step 4, an API key from the app, exported as
$LEADOCEAN_API_KEY. - A one-paragraph ICP. Ours below is a placeholder: swap in yours.
Step 1: Connect the MCP server
Add the hosted server and sign in. The command format is from the Claude Code MCP docs, September 2026.
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp login leadoceanStart claude and run /mcp. LeadOcean should list 13 tools. The sizing and lookup tools are free: leadocean_count_leads, leadocean_count_companies, leadocean_list_filters and leadocean_list_enum_values, plus the account and export status tools. See the LeadOcean MCP docs.
Step 2: Write the ICP into a file
Claude qualifies against what you write down, so write it down. Put this in ICP.md:
ICP
- Buyer: VP of Sales at a B2B software company, based in Canada.
- Company: 51 to 500 employees.
- Disqualify: agencies, staffing firms, anyone with "assistant" or "intern" in the title.
- Good fit signal: the person's own profile mentions outbound or pipeline.
- Output: a table with name, title, company, fit score 1 to 5, one-line reason.Keep it to rules Claude can check against fields in the data. "Innovative companies" is not checkable. "51 to 500 employees" is.
Step 3: Size the audience before you pull anything
Ask Claude to count first. Counting is free, so there is no reason to guess.
Read ICP.md. Use leadocean_list_enum_values to resolve exact filter values,
then run leadocean_count_leads with facets=false. Tell me which filters
you used and what the number is. Do not search yet.Claude resolves the enum strings (job level VP, job function Sales & Business Development, country CA) and counts. Enum values are exact strings, so a guess like "vp" returns nothing. The count is mailable by default: verified, catch_all_valid and catch_all addresses only.
Step 4: Pull a small batch
Search 25 people, not 2,500. A small batch tells you whether the filters are right before you spend more.
Run leadocean_search_leads with the same filters plus employeeRange
["51-200","201-500"] and excludeTitle ["assistant","intern"].
Limit 25. Then score each person against ICP.md and show the table.The REST equivalent, for a script or CI job, is a flat JSON body with array filters. It returns 25 records and uses 25.
curl -s https://api.leadocean.io/v1/people/search \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["CA"],
"employeeRange": ["51-200", "201-500"],
"excludeTitle": ["assistant", "intern"],
"limit": 25
}'Page with the cursor value from the previous response. One search pages to 10,000 rows, so narrow the filters rather than walking the index.
Step 5: Enrich only the winners
Search rows are thin on purpose. Take the five highest scores and enrich them by person_id. Enrich takes exactly one of linkedin_url, email, phone or person_id.
curl -s -X POST https://api.leadocean.io/v1/people/enrich \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"person_id": "PERSON_ID_FROM_SEARCH", "reveal_email": true}'Since October 2026 the enrich response carries career history in resume_data: past roles, education, certifications and awards. Claude can use it for the second scoring pass, for example "has held a quota-carrying role before". A person with no match is a 404 and costs nothing.
In Claude Code, ask in one line.
Enrich the top 5 with leadocean_get_lead and add a column for prior roles.What you get
This is a live run of leadocean_count_leads on 2026-10-21. Filters: jobLevel VP, jobFunction Sales & Business Development, country CA. The total is mailable (verified, catch_all_valid or catch_all).
{
"total": 5574,
"totalIsExact": true,
"totalAll": 18800,
"distinctCompanies": 3873,
"credits": 0
}totalAll is the same filters with no email condition. The 5,574 are the ones worth sending to. The cost of that call was zero records.
A person record has this top-level shape, from the API reference (placeholder values, not a real person):
{
"profile_data": { "...": "name, headline, current role" },
"contact_data": { "has_email": true, "has_phone": true, "email_status": "verified" },
"resume_data": { "...": "past roles, education, when held" },
"meta": { "...": "request details" }
}Response shape from the API reference, September 2026. contact_emails appear only when reveal_email is true. Check openapi.json for the inner fields before you parse.
Claude's scored table then looks like this (placeholders):
| Name | Title | Company | Fit | Reason |
|---|---|---|---|---|
| Jane Doe | VP of Sales | Acme | 5 | 120 employees, profile mentions outbound |
| John Roe | VP Sales Ops | Example Inc | 3 | Ops role, no quota history |
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-copy the key from the app and check $LEADOCEAN_API_KEY is exported. |
| 429 | Above the plan's rate limit: 5 requests a second on Free, 200 on Agency | Honor Retry-After. Slow the loop or move to a plan with a higher limit. |
| 402 | Free records spent | Free is 1,000 records for life. Move to Solo at $97 a month. |
| Empty results | A closed-list filter got a value that is not exact, such as vp for job level | Call leadocean_list_enum_values and pass the exact string, such as VP. |
Search stops with no nextCursor | One search pages to 10,000 rows (meta.depthCapped) | Add filters and split the audience into smaller searches. |
| Export refused | Bulk CSV export is not on Free, or the file hit 50,000 rows | Upgrade for exports, or split into requests of up to 50,000 rows. |
FAQ
Does Claude Code need an API key for LeadOcean?
Not for MCP. The server signs in with OAuth 2.1. You only need $LEADOCEAN_API_KEY for direct REST calls from scripts.
How many records does a qualification run use?
Sizing is free. A 25-row search uses 25 records and each enrichment that finds a person uses one. A miss costs nothing. See pricing.
Can Claude Code send the emails too?
No. LeadOcean has no sequencer. Export the scored list and load it into the tool you send from. Check email_status first: bounced emails are not refunded.
How is this different from asking Claude to browse the web?
Browsing returns whatever a page says today. The MCP tools return structured fields with an email status, so scoring and filtering are deterministic. The dataset refreshes monthly and each record has its own fetched_at date.
Where do I go for more complex filters?
See find leads using firmographics and find ICP matched leads. For cold email lists, see find prospects for cold email.
Point Claude Code at 693M people and score your first 25 free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →