You build a sales contact finder in Claude Code by connecting the LeadOcean MCP server, sizing the list with a free count, searching by title, then enriching only the people worth contacting. Claude Code runs the steps. LeadOcean holds the data.
This guide is the short version, with the real queries.
TL;DR
- You add one MCP server, then ask for contacts in plain English. It takes about 15 minutes the first time.
- Sizing is free. A run spends about 15 LeadOcean records: up to 10 from the search page and 5 from enriching.
- Enrich by
person_idfrom the search, not by name. There is no name plus domain lookup.
Prerequisites
- A LeadOcean account. Start free: no card, 1,000 records, one-off.
- Claude Code installed. Its MCP docs, September 2026, cover adding remote servers.
- For the REST steps:
curland a key from the app, exported as$LEADOCEAN_API_KEY.
export LEADOCEAN_API_KEY="paste-your-key-here"The MCP steps need no key. The server signs in with OAuth. Examples use Acme and acme.com as placeholders.
Step 1: Connect the LeadOcean MCP server
Add the hosted server over HTTP, then sign in. See Connect LeadOcean to Claude Code for the full setup.
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp list/mcpPick leadocean and approve the sign-in. The server exposes 13 tools. Seven of them are free: count leads, count companies, list filters, list enum values, get account and the two export lookups.
Step 2: Resolve the filter values for free
Enum filters take exact strings. Guessing returns nothing, so ask first. This prompt costs 0 records.
Use the leadocean MCP server. List the valid values for job_level and
job_function. Do not search for any person.Claude Code calls leadocean_list_enum_values. Job levels are C-Team, VP, Director, Manager, Staff and Other. A job function looks like Sales & Business Development. Case matters.
Step 3: Size the list before you pull anyone
Ask for a count. It is free however often you run it.
Count VP-level people in Sales & Business Development in Canada.
Say which email filter the count used.Claude Code calls leadocean_count_leads with jobLevel, jobFunction and country. The default count covers only addresses worth sending to: verified, catch_all_valid and catch_all. State that when you report the number, because it is a mailable count, not everyone.
Step 4: Search by title and read the page
Pull one small page. Each person returned costs 1 record, so keep the limit low while you check the shape.
Search the same audience with limit 10. Show name, title, company and
email_status as a table. Keep each row's person_id.The REST call does the same. The body is flat JSON, filters are arrays and limit runs 1 to 100.
curl -s -X POST 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"],"limit":10}'Page on with cursor from meta.nextCursor. One search pages to 10,000 rows, then meta.depthCapped turns true and no cursor comes back. Narrow the filters instead.
Step 5: Enrich the people you picked
Search rows are thin. Enrich to get the email and phone. Send 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":"1234567890","reveal_email":true}'reveal_email returns every address and phone LeadOcean holds, at no extra record. A person we hold nothing for is a 404 and costs 0. Since October 2026 the response also carries career history in resume_data: past roles, education and certifications.
Step 6: Keep only mailable rows
Each address comes back with its own type and status. Keep the sendable ones, because LeadOcean gives no refund for bounces.
From the enriched people, keep rows where email_status is verified,
catch_all_valid or catch_all. Write them to contacts.csv with columns
name, title, company, email, email_status, phone. Report rows in, rows kept.For more than a few hundred rows, stop chatting and export. POST /v1/exports takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the Free plan.
What you get
This count ran on 2026-10-21 through leadocean_count_leads, with jobLevel VP, jobFunction Sales & Business Development and country CA. It spent 0 records.
{
"total": 5574,
"totalIsExact": true,
"totalAll": 18800,
"distinctCompanies": 3873,
"credits": 0,
"defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all)"
}So 5,574 of 18,800 matching people have a mailable address, across 3,873 employers. That is the mailable count, filtered by email status.
An enriched record has this shape (response shape from the API reference, placeholder values):
{
"success": true,
"data": {
"contact_data": {
"contact_emails": [
{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
],
"contact_phones": [
{ "phone": "+14155550133", "type": "direct" }
],
"has_email": true,
"has_phone": true,
"email_status": "verified",
"email_type": "work"
},
"resume_data": {}
}
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Check $LEADOCEAN_API_KEY is exported in the shell Claude Code runs in. |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honor Retry-After. Run the loop one request at a time. |
| 402 | Records spent | Free is 1,000 records for life. Move to Solo ($97 a month) or Agency ($497 a month). See pricing. |
| Empty results | A filter value that is not an exact enum string | Resolve it with leadocean_list_enum_values. VP and Sales & Business Development are case-sensitive. |
| 404 on enrich | LeadOcean holds nothing for that person | Costs 0. Skip the row. |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export into smaller filtered runs. |
FAQ
Does Claude Code find contacts on its own?
No. Claude Code has no contact database. It calls the LeadOcean MCP tools, and LeadOcean returns the emails and phones it holds.
Can I look a person up by name and company?
Not directly. Search by domain or title first, then enrich by person_id. The enrich call takes one of linkedin_url, email, phone or person_id.
How many records does a run cost?
Counts, filter lists and a 404 cost nothing. A search spends 1 record per person returned. An enrichment spends 1 per match. See how to enrich a CSV in Claude Code for the file version.
Should I run big lists as chat calls?
No. Claude Code warns when MCP tool output passes 10,000 tokens, September 2026. Past a page or two, use a script or POST /v1/exports.
Find your first 100 sales contacts from Claude Code
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →