Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Build a Sales Contact Finder (in Claude Code)

Connect one MCP server, size the list for free, search by title, then enrich only the people you pick. The queries below are the ones to reuse.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

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_id from 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: curl and a key from the app, exported as $LEADOCEAN_API_KEY.
bash
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.

bash
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp list
text
/mcp

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

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

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

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

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

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

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

json
{
  "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):

json
{
  "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

ErrorCauseFix
401Missing or wrong x-api-keyCheck $LEADOCEAN_API_KEY is exported in the shell Claude Code runs in.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honor Retry-After. Run the loop one request at a time.
402Records spentFree is 1,000 records for life. Move to Solo ($97 a month) or Agency ($497 a month). See pricing.
Empty resultsA filter value that is not an exact enum stringResolve it with leadocean_list_enum_values. VP and Sales & Business Development are case-sensitive.
404 on enrichLeadOcean holds nothing for that personCosts 0. Skip the row.
Export refusedOver 50,000 rows a request or 500,000 a daySplit 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 →