TL;DR
- Add a jobs MCP server (we use Coresignal's) and the LeadOcean MCP server to Claude Code. Setup takes about 15 minutes.
- Claude lists open roles from the jobs server, then asks LeadOcean for the VP, Director or Head who would hire for each one.
- The LeadOcean side spends about 10 records for the walkthrough. Counts cost 0. The jobs server bills in its own credits.
LeadOcean does not hold job postings. The working setup is two MCP servers in one Claude session: a jobs data server finds the open roles, and the LeadOcean server finds the people who own those roles. This guide wires both up.
Prerequisites
- Claude Code, installed. Any MCP client that supports remote servers over Streamable HTTP works the same way.
- A free LeadOcean account from app.leadocean.io/register. The Free plan gives 1,000 records for life, with no card.
- A Coresignal account for the jobs side. Its pricing page lists a free trial of 2,000 credits for 7 days (September 2026).
- For the REST steps, your key in the shell:
export LEADOCEAN_API_KEY=.... The MCP steps need no key. LeadOcean's server signs in with OAuth.
Be clear on the split. The jobs server answers "who is hiring". LeadOcean answers "who do I talk to". We do not scrape LinkedIn jobs, and we do not claim to.
Step 1: Connect both servers
Both servers are remote and use browser sign-in. The command format is from the Claude Code MCP docs, September 2026.
claude mcp add --transport http coresignal https://mcp.coresignal.com/mcp/v2
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp listStart a session, run /mcp, and finish the sign-in for each server. The Coresignal endpoint and OAuth flow are in its MCP docs, September 2026. Coresignal says its older /mcp endpoint is deprecated on 1 November 2026, so use /mcp/v2.
LeadOcean's server exposes 13 tools. Three matter here: leadocean_count_leads (free), leadocean_search_leads (1 record per person returned) and leadocean_get_lead (1 record).
Step 2: Ask for the job listings
Describe the roles in plain language. The Coresignal server builds the query, explains it and returns an exact-match count with a preview. Its docs say field discovery is free and that a search costs 20 credits.
Using the coresignal tools, find job postings for "GTM Engineer" or
"Revenue Operations Manager" posted in the last 14 days, at US companies
with 50 to 500 employees. Show company name, company website domain,
job title and posting date. Preview 20 rows, tell me the exact match
count and the credits spent. Do not pull full records yet.Ask for the company domain on every row. It is the join key for the next steps. If a row has no domain, drop it.
Per the Coresignal pricing docs (September 2026), a job posting record costs 1 credit and a search preview costs 10 to 20 credits per call. Preview first, pull full records only for the rows you keep.
Once the roles are on screen, run the whole chain in one prompt so Claude does not pull more than you allow.
For the first 10 companies above, use the leadocean tools. For each
domain, run count_leads for VP or Director level people in the function
that owns the role. Skip any company with a count of 0. Then search
for 1 person at each remaining company. Stop at 10 records total
and show me the record count before each paid call.Setting a hard stop in the prompt matters. Search costs 1 record per person returned, and an agent left alone will keep paging.
Step 3: Size the hiring team for free
Pick one company from the list and count its likely hiring owners before you spend a record. leadocean_count_leads takes the same filters as search and costs nothing. Give Claude this prompt.
Using the leadocean tools, for the domain acme.com, count the people
with jobFunction "Sales & Business Development" and jobLevel "VP" or
"Director". Use count_leads only. Do not pull anyone.The same sizing works over REST with count=true as a query parameter and limit=1. Send the filters as a flat JSON body, arrays for every filter. The call returns no rows and spends nothing.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"domain": ["acme.com"],
"jobFunction": ["Sales & Business Development"],
"jobLevel": ["VP", "Director"]
}'Read meta.total (capped at 100,000) and meta.countOnly. A total of 0 means LeadOcean holds nobody who matches, so move to the next company.
Step 4: Pull the hiring managers
Match the contact to the role. A GTM Engineer posting is owned by a Head of Revenue Operations or a VP Sales. An engineering posting is owned by a VP or Director of Engineering. Search, five rows, VP and Director only.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"domain": ["acme.com"],
"jobFunction": ["Sales & Business Development"],
"jobLevel": ["VP", "Director"],
"limit": 5
}'Use this map to pick the filters from the posting.
| Posting | jobFunction | jobLevel |
|---|---|---|
| Backend or platform engineer | Engineering | VP, Director |
| SDR, AE or GTM engineer | Sales & Business Development | VP, Director |
| Demand generation manager | Advertising & Marketing | VP, Director |
| Recruiter or talent partner | Human Resources | Manager, Director |
These are starting points, not rules. Small companies often have no VP, so add Manager or widen to C-Team when the count in Step 3 is 0.
Five rows spend 5 records. Each row carries a person_id. In Claude, the same step is one line: "Search LeadOcean for the 5 most senior sales leaders at acme.com. Stop at 5 records."
Enum values are exact strings. Ask leadocean_list_enum_values if you are unsure. Free text such as "VP Sales" belongs in title, not in jobLevel.
Step 5: Get the work email
Enrich one person by person_id and set reveal_email to true. A person we hold nothing for is a 404 and costs nothing.
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": "1234567", "reveal_email": true }'Enrich takes exactly one of linkedin_url, email, phone or person_id. Read email_status before you send. LeadOcean gives no refund for bounced emails, so send only to verified or catch_all_valid.
For a list of 50 or more companies, stop prompting row by row. Collect the domains from the jobs server, then run POST /v1/exports with the same filters. Exports take up to 50,000 rows a request and 500,000 a day, and bulk CSV export is not on Free.
What you get
Step 3 is free, so we ran it. On 2026-10-21 we called leadocean_count_leads with jobFunction: Engineering, jobLevel: VP, hqCountry: US and employeeRange: 51-200. These are the hiring owners for engineering roles at small US companies.
{
"total": 4046,
"totalIsExact": true,
"totalAll": 12213,
"distinctCompanies": 3016,
"credits": 0,
"unsupportedFilters": []
}total counts people with a mailable email (verified, catch_all_valid or catch_all), which is the tool's default. totalAll is everyone matching, with or without an email. Spent: 0 records.
We did not run the Coresignal step, so we show no output for it. Its docs show illustrative, fictional sample results only.
A person record from Step 5 looks like this. It is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": {
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_url": "https://www.linkedin.com/in/jane-doe"
},
"contact_data": {
"has_email": true,
"email_status": "verified",
"contact_emails": [
{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
]
}
},
"meta": { "schema": "leadocean.person.v1" }
}Two things to check before you use any of this. First, a hiring signal is a reason to write, not a guarantee of a reply, so lead the email with the open role. Second, a posting can be weeks old, so look at the posting date the jobs server returns before you mention it.
Read type before sending. work is the current employer. work_other is usually one the person has left.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | The x-api-key header is missing or wrong, or the MCP sign-in expired. | Check $LEADOCEAN_API_KEY. For MCP, run /mcp in Claude Code and sign in again. |
| 402 | The Free plan's 1,000 records are spent. Free is one-off and does not reset. | Move to Solo at $97 a month or Agency at $497. |
| 429 | Requests above your plan's rate limit: 5 a second on Free, 200 on Agency. | Wait for the Retry-After time and retry. Ask Claude to work in batches of 5. |
| Empty results | A filter value is not an exact enum string, such as "vp" in jobLevel or "Sales" in jobFunction. | Call leadocean_list_enum_values and copy the string. jobLevel takes VP. seniority takes lowercase vp. |
| Export refused | The request is over 50,000 rows, or the day is past 500,000 rows. | Split the export by country or headcount band, or run the rest tomorrow. |
FAQ
Does LeadOcean have job listings?
No. LeadOcean holds people and companies. It has no job-posting feed, so pair it with a jobs data source. The people-side filters let you target the likely hiring owner, such as jobFunction and jobLevel.
Is the job data from LinkedIn?
Not as far as its docs say. Coresignal's jobs data overview says postings come from job boards, company career pages and ATS globally, merged into one record per posting. It does not name LinkedIn (Coresignal jobs data overview, October 2026). If you need a specific board, ask the vendor in writing.
Can I use another jobs server?
Yes. Crustdata runs a hosted MCP server at https://install.crustdata.com/mcp and lists job search at 0.03 credits per result (both from its docs, September 2026). The LeadOcean steps do not change. Anything that returns a company domain works.
What does the LeadOcean side cost?
Counts and get_account cost 0. Search costs 1 record per person returned and enrichment 1 record per match. Paid plans have a fair-use pace instead of credits. See pricing.
Where do I go next?
Turn one URL into an email with LinkedIn to email over MCP, or go the other way with email to LinkedIn over MCP. The wider setup is on the B2B database MCP guide and the MCP hub.
Turn every open role into a named hiring manager
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →