TL;DR
- Add one
httpUrlentry to Gemini CLI, sign in with OAuth in your browser, and no API key is pasted anywhere. - It takes about 10 minutes. The run spends about 13 records: 10 people from one search and 3 full lookups. That is an estimate from the metering rules, not a measured bill.
- The free plan covers it: 1,000 records, one-off, no card.
Prerequisites
- A LeadOcean account. Start free: 1,000 records, no card, work email required.
- Gemini CLI installed, and a machine that can open a browser. OAuth needs a local browser and a redirect to
localhost, so it does not work over plain SSH or in a headless container (Gemini CLI MCP docs, October 2026). $LEADOCEAN_API_KEYset in your shell, only if you also run Step 5. The MCP steps need no key.- A target domain. The examples use the placeholder company Acme (acme.com). Swap in your own.
One thing to check first. The Gemini CLI docs banner says Gemini CLI was replaced by Antigravity CLI on June 18th, 2026 for unpaid-tier and Google One users. If that is you, read the banner before you start. Everything below assumes a working Gemini CLI.
Step 1: Add the LeadOcean MCP server
The server URL is https://api.leadocean.io/mcp. Gemini CLI reads MCP servers from the mcpServers object in settings.json, and httpUrl selects the streamable HTTP transport.
Add the entry with one command:
gemini mcp add --transport http --scope user leadocean https://api.leadocean.io/mcpThe --scope flag defaults to project. Using user writes to ~/.gemini/settings.json, so the server is there in every folder. You can edit the file by hand instead:
{
"mcpServers": {
"leadocean": {
"httpUrl": "https://api.leadocean.io/mcp"
}
}
}Do not add a headers block with an API key. The server signs you in with OAuth. The MCP for agents docs list the config for every client, Gemini CLI included.
Step 2: Sign in and check the connection
Start Gemini CLI, then authenticate the server from inside the session:
/mcp auth leadoceanYour browser opens on LeadOcean. Approve the connection and return to the terminal. You do not register an OAuth client yourself. The LeadOcean OAuth server supports dynamic client registration at https://api.leadocean.io/oauth/register (scope mcp).
Confirm it worked from your shell:
gemini mcp listYou should see leadocean marked Connected. In the session, /mcp list shows the same status and the 13 tools.
Step 3: Count the buyers first (free)
Ask for a number before you ask for people. leadocean_count_leads costs 0 records, however often you call it.
How many VPs and C-level people in Sales & Business Development in the
US can I email? Count only. Do not pull anyone.Gemini CLI calls leadocean_count_leads with jobLevel set to ["C-Team", "VP"], jobFunction set to ["Sales & Business Development"] and country set to ["US"]. If the agent guesses a level name, tell it to check leadocean_list_enum_values first. Enum values are exact strings.
The count uses the tool's default email filter: verified, catch_all_valid or catch_all. It is the mailable audience, not everyone who matches.
Step 4: Pull the decision makers at one company
Now narrow to one company. Cap the pull so the record cost is known before it runs.
Search LeadOcean for people at acme.com whose job level is C-Team or VP.
Return at most 10. Show name, title, level and email status.
Then get the full profile for the top 3 and show their work emails.The agent calls leadocean_search_leads with domain set to ["acme.com"], jobLevel set to ["C-Team", "VP"] and limit set to 10. That is 10 records. Each leadocean_get_lead call is 1 record, so 3 more. A get_lead that finds nobody costs nothing. The full profile includes career history when we hold it: past roles, education and certifications.
Narrow further with seniority (c_suite, vp, director), jobFunction or title. title takes keywords. Wrap a value in brackets, such as [Head of Sales], for an exact match. Add excludeTitle for assistants and interns.
Gemini CLI asks you to confirm each MCP tool call by default. Read the filters in the prompt before you approve a search. Allow it once, not for the whole server, until you trust the pattern.
Step 5: Run the same query as a script (optional)
For a repeatable job, call the REST API with the same filters. The body is flat JSON, filters are arrays, and limit runs from 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"],
"limit": 10
}'Search rows carry flags, not addresses. To get an email, enrich by person_id from meta.source_ids.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 }'Enrich takes exactly one of linkedin_url, email, phone or person_id. Revealing the email costs no extra record. To page past 10 rows, pass meta.nextCursor back as cursor, unchanged.
What you get
Two free calls ran on 2026-10-21. First, the level names Step 3 depends on. The call is leadocean_list_enum_values with name set to job_level.
{
"name": "job_level",
"total": 6,
"values": ["C-Team", "Director", "Manager", "Other", "Staff", "VP"]
}Second, the Step 3 count from leadocean_count_leads, with the same filters as the prompt. It spent 0 records.
{
"total": 279115,
"totalIsExact": true,
"totalAll": 954471,
"credits": 0,
"defaults": "emailStatus: verified or catch_all_valid or catch_all"
}That is 279,115 mailable US sales leaders at VP or C-level on 2026-10-21: people whose best email is verified, catch_all_valid or catch_all. Everyone we hold for those filters is totalAll: 954,471.
A record-level response is not shown, because it would spend records. This is the abridged response shape from the API reference, with placeholder values:
{
"success": true,
"data": [
{
"contact_data": {
"has_email": true,
"has_phone": false,
"email_status": "verified",
"email_type": "work"
},
"meta": { "source_ids": { "person_id": "PERSON_ID" } }
}
],
"meta": { "source": "leadocean", "count": 1, "nextCursor": null }
}Search rows come back thin. Names, titles and the company sit in profile_data. Addresses appear only after you enrich with reveal_email set to true.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked key (REST only) | Check $LEADOCEAN_API_KEY. MCP uses OAuth, so re-run /mcp auth leadocean. |
| 402 | Free plan: the 1,000 records are spent | They are a one-off and do not reset. Move to Solo at $97 a month. |
| 429 | Faster than your plan's rate (5 a second on Free, 50 on Solo, 200 on Agency), or a fair-use window reached, which paces you to 1 a minute until it resets | Wait for Retry-After. Request full pages of 100 rather than more calls. |
| Empty results | A value that is not an exact enum string, such as VP of Sales as a jobLevel | Check leadocean_list_enum_values. Levels are C-Team, Director, Manager, Other, Staff, VP. |
No nextCursor, depthCapped true | One search pages at most 10,000 rows | Narrow the filters and run smaller searches. |
leadocean shows Disconnected | OAuth needs a local browser and a localhost redirect | Run on a machine with a browser. Not over plain SSH or in a headless container. |
FAQ
Do I need an API key to use LeadOcean in Gemini CLI?
No. The MCP server signs you in with OAuth 2.1 in your browser, and Gemini CLI stores the token. You need $LEADOCEAN_API_KEY only for the REST calls in Step 5.
What does this cost?
The free plan has 1,000 records, one-off, with no card. Solo is $97 a month and Agency $497 a month, with a fair-use pace instead of credits. Counting, listing filters and checking an enum cost nothing. See pricing.
Will every company have decision makers on file?
Search by domain, then narrow by jobLevel, seniority, jobFunction or title. Not every company has every role on file. A free count with domain set tells you what exists before you spend.
Will Gemini CLI run a paid tool without asking?
Not by default. Gemini CLI asks for confirmation on each MCP tool call unless you set trust to true for that server. Leave trust off for a server that can spend records.
Does it work in other editors and agents?
Find the decision makers at your next target account
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →