TL;DR
- VS Code chat reaches LeadOcean through one
mcp.jsonentry and a browser sign-in. It can then pull a company, its buying group and one contact, and draft a call brief. - It takes about 15 minutes the first time and about 5 after that. The example account spends about 11 of your 1,000 free records.
- Counts, filter lookups and enum lookups cost nothing. Only people and companies returned count, one record each.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off.
- VS Code with chat set up.
- The account's domain, such as
acme.com, and the name or LinkedIn URL of the person you are meeting. - Optional, for the REST versions: a key in your shell as
$LEADOCEAN_API_KEY, pluscurlandjq.
export LEADOCEAN_API_KEY="paste-your-key-here"The MCP steps need no key. Editor setup is on Connect LeadOcean to VS Code.
Step 1: Add the LeadOcean MCP server
Add the server with the guided flow. The VS Code MCP docs, October 2026, start it from the Command Palette.
Command Palette > MCP: Add Server
Type: HTTP (HTTP or Server-Sent Events)
URL: https://api.leadocean.io/mcp
ID: leadocean
Where: Global > Copilot Global (personal) or a workspace file (team)Do not add a headers entry. LeadOcean signs you in with OAuth 2.1 in the browser, so there is nothing to paste. Approve the sign-in when VS Code asks.
A workspace .vscode/mcp.json still works. The guided flow labels it deprecated but keeps it for compatibility. Its key is servers, not mcpServers.
{
"servers": {
"leadocean": {
"type": "http",
"url": "https://api.leadocean.io/mcp"
}
}
}The server exposes 13 leadocean_ tools. Seven never spend records: the two counts, filter list, enum list, account, get export and list exports. VS Code shows each tool call in the chat. Expand it to check the arguments before you approve.
Step 2: Size the buying group for free
Count before you pull anyone. This example uses VPs and C-level people at one company.
Use leadocean_count_leads with domain ["acme.com"] and jobLevel ["C-Team","VP"].
Pass facets false. Report the total and say which email statuses it counted.
Do not call any tool that spends records.The REST version is a people 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 '{"domain": ["acme.com"], "jobLevel": ["C-Team", "VP"], "limit": 1}' | jq '.meta'If the total is 0, check the domain spelling before you assume nobody is there. Counting is free however often you ask.
Step 3: Pull the company
One company lookup costs one record. It returns the firmographics you want on the first line of the brief.
Use leadocean_get_company with domain "acme.com". Give me industry, headcount,
HQ country, funding and detected technologies in six lines. Do not search people yet.The REST route is POST /v1/companies/enrich with a domain.
curl -s https://api.leadocean.io/v1/companies/enrich \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{"domain": "acme.com"}' | jq '.data | keys'A company we hold nothing for returns a 404 and costs nothing. To size a whole segment of companies like this one, leadocean_count_companies (REST: GET /v1/companies/count) is free and breaks the total down by industry, headcount band and HQ country.
Step 4: Pull the buying group
Now pull the people. Use the same filters and the same email statuses as the count, so the number you pay for matches the number you sized.
Use leadocean_search_leads with domain ["acme.com"], jobLevel ["C-Team","VP"],
emailStatus ["verified","catch_all_valid","catch_all"] and limit 10. Show a table of
name, job title, job function and email_status. Group it by function.Each person returned costs one record. The search returns thin records without addresses. The REST body is flat JSON with arrays for filters and a limit of 1 to 100.
curl -s https://api.leadocean.io/v1/people/search \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"domain": ["acme.com"],
"jobLevel": ["C-Team", "VP"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"],
"limit": 10
}' | jq '.data | length, .meta.nextCursor'To see everyone we hold at the company, use GET /v1/companies/{domain}/people. It pages with a cursor and stops at 10,000 rows. It also bills one record per person.
Step 5: Enrich the person you are meeting
Pick the contact from the table. Each search row carries meta.source_ids.person_id. Enrich by that id, or by a LinkedIn URL or email if you already have one.
Use leadocean_get_lead with the person_id of the VP of Sales from the table above.
Return the email, email_status, any phone numbers held, and their past roles
and education. Then stop.The REST call takes exactly one of linkedin_url, email, phone or person_id. Set reveal_email to true to get the address and numbers. A person we hold nothing for is a 404 and costs nothing.
curl -s 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}' | jq '.data.contact_data'The same record carries career history since October 2026: past roles with title, company name and dates, plus education and certifications when we hold them. Past employers carry no company ID yet.
Revealing the email costs no extra record. For numbers alone, GET /v2/people/phone takes the same identity, and a v2 call that finds nothing still costs one record.
Step 6: Write the call brief
The last step needs no tool calls. The data is already in the chat, so the agent only writes.
Using only the company, the table and the contact above, write a one-page call brief:
1. Who they are, in two lines.
2. Who is likely in the buying group, by function.
3. Three questions for the person I am meeting.
4. One thing I could not confirm from this data.
Do not invent funding, news or numbers. Do not call any more tools.The last line matters. The data holds role, company, headcount and contact status. It does not hold news or call notes, so the agent should say so rather than fill the gap.
What you get
The Step 2 count is real. On 21 October 2026 we ran leadocean_count_leads with domain acme.com and jobLevel C-Team and VP. It is free. This is what it returned.
{
"total": 9,
"totalIsExact": true,
"totalAll": 198,
"credits": 0,
"defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all)",
"sample": 1,
"hasMore": true
}The total describes the mailable people, meaning verified, catch_all_valid or catch_all emails. It is not everyone at the company: totalAll shows 198 C-Team and VP people with any email status or none. Your domain and the data's monthly refresh will change the number.
The enrich call returns the person's contact block. This is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": {
"contact_data": {
"has_email": true,
"has_phone": true,
"email_status": "verified",
"contact_emails": [{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }],
"contact_phones": [{ "phone": "+14155550133", "type": "direct" }]
}
},
"meta": { "credits": 1 }
}The run spends about 11 records: 1 for the company, 9 for the people and 1 for the contact. Read email_status before you send anything. A bounce is not refunded.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked key on a REST call | Re-copy the key from app.leadocean.io and re-export $LEADOCEAN_API_KEY. |
| 429 | Above your plan's rate limit (5 requests a second on Free, 200 on Agency), or a paid plan's fair-use window reached | Wait the Retry-After seconds, then send one search of up to 100 rows instead of many small calls. |
| 402 | The 1,000 free records are spent | Check leadocean_get_account. Free records do not reset, so move to Solo at $97 a month, or Agency at $497 for a team. |
| 400, or a total of 0 | A filter value outside the catalogue, such as jobLevel: "VP of Sales" | Resolve it with leadocean_list_enum_values. Job levels are C-Team, VP, Director, Manager, Staff and Other. |
| 404 on enrich | We hold nothing for that company or person | Nothing was charged. Try a LinkedIn URL or email, or search by domain and enrich by person_id. |
FAQ
How many records does one account cost?
About 11 on the example: 1 company, 9 people and 1 contact. Sizing is free. Cap the people search with limit to cap the spend.
What does a paid plan change?
Speed and pace, not data. Solo is $97 a month and Agency $497 a month. There are no credits: each paid plan has a fair-use pace, and reaching it slows the key until the window resets. See pricing.
Do I need an API key in VS Code?
Not for the MCP steps. The server uses OAuth sign-in and you paste nothing into chat. The REST steps read $LEADOCEAN_API_KEY from your shell.
Can I research ten accounts at once?
Yes, but pull in a loop, not in one prompt. Count each domain first, then search with a limit. For a whole list, build a lead list in VS Code with an export.
Does this work in other editors?
Yes. The same MCP URL works elsewhere. See Claude Code, Windsurf and Cursor. Plans are on pricing.
More recipes live in the blog hub.
Research your next account in VS Code, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →