Paste a phone number into Claude or Cursor and the agent calls get_lead to name the person who holds it. One URL, OAuth sign-in, 1 record per hit, nothing for a miss.
This page covers client setup and prompts. For the endpoint, field tables and coverage, see Reverse Phone Lookup. Developers who prefer plain HTTP want the Reverse Phone Lookup API. Other clients are on the MCP hub.
Connect the server
The server is https://api.leadocean.io/mcp. It signs in with OAuth 2.1, so there is no key to paste. Create a free account first.
Claude Code. The command format is from the Claude Code MCP docs, September 2026:
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp login leadoceanYou can also run /mcp inside a session and finish the browser sign-in.
Cursor. Add a remote server to mcp.json, in the url form from the Cursor MCP docs, September 2026:
{
"mcpServers": {
"leadocean": {
"url": "https://api.leadocean.io/mcp"
}
}
}Cursor starts the sign-in the first time the server is used. Other clients follow the same pattern, see the LeadOcean MCP docs.
The tool
There is no tool named for reverse lookup. Use get_lead and pass phone. The server lists it as leadocean_get_lead. It costs 1 record per call.
| Input | Type | Meaning |
|---|---|---|
phone | string | A number in any common format. The reverse lookup: who is this number. |
reveal_email | boolean | true returns every email and phone we hold. Default false. No extra record. |
linkedin_url | URL | Preferred key when you have it. |
email | string | Work email address. Used when you have no LinkedIn URL. |
person_id | string | The id a search row carries. Use it after a search. |
Send one identifier per call. Sending two is a 400 on the REST side, so keep each prompt to a single number. The REST twin is GET /v2/people/reverse, which returns a thinner identity block.
find_phone also accepts a number, but it answers the other question: what other numbers do we hold for this person. It costs 1 record.
Prompts that work
| Prompt | What the agent calls | Records |
|---|---|---|
| "Who holds +1 415 555 0133? Give me name, title, company and LinkedIn URL." | get_lead with phone | 1 |
| "These 10 numbers called our sales line. Identify each in a table. Skip any you cannot find. Stop at 10 lookups." | get_lead per number | 10 at most |
| "I have +1 415 555 0133 for Jane Doe. What other numbers do you hold for her?" | find_phone with phone | 1 |
Put the record limit in the prompt. The agent holds a batch when you tell it where to stop.
The agent picks the tool from your wording. "Who is this number" goes to get_lead. "What else do you have for this person" goes to find_phone. Both cost 1 record on a hit, so name the question you actually want answered.
Format the number the way you have it. The tool accepts any common format, so there is no need to strip spaces or add a country code first.
What the agent gets back
get_lead returns one leadocean.person.v1 record plus a meta block. Shape from the enrich docs, September 2026. Values are placeholders.
{
"person": {
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_headline": "Finance Manager at Acme",
"profile_url": "https://www.linkedin.com/in/jane-doe"
},
"contact_data": {
"has_email": true,
"contact_phones": [{ "phone": "+14155550133" }],
"contact_current_experiences": [{
"company_name": "Acme",
"company_domain": "acme.com",
"job_title": "Finance Manager"
}]
}
},
"meta": { "source": "...", "schema": "leadocean.person.v1" }
}contact_phones and contact_emails stay empty unless reveal_email is true. Unknown values are null. A match is evidence, not proof: switchboards and reassignment mean one number can belong to several people over time. Tell the agent to say so in its answer, and to run its own do-not-call check before anyone dials.
Free checks first
count_leads, list_enum_values and get_account spend no records. get_account shows your balance before a batch.
We ran count_leads with hasPhone: true and country: ["US"] on 2026-10-01. It returned total: 97128374, totalIsExact: true, credits: 0. That counts people with a phone number in the US. Passing hasPhone replaces the tool's default email filter, so it says nothing about email status. It is not every number we hold.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | The OAuth sign-in is missing or expired. | Run /mcp in Claude Code and re-authenticate. In Cursor, sign in again from MCP settings. |
| 402 | The free 1,000 records are spent. The free plan is one-off. | Move to Pro at $499 a month. |
| 429 | Over 100 requests per second per key. | Wait one second and retry. Ask the agent to work in small batches. |
| Wrong enum | A sizing filter used a value not in the catalogue. | Call list_enum_values with a search term and use the exact string. |
| Not found | Nobody holds the number. | Nothing to fix and nothing charged. Coverage is partial, so expect misses. Try a LinkedIn URL if you have one. |
FAQ
Do I need an API key for MCP?
No. The MCP server uses OAuth sign-in. The REST API uses an x-api-key header. Both draw on the same records.
What does a call cost, and what does a miss cost?
A found person costs 1 record. A get_lead that finds nobody costs nothing over MCP, the same as a REST 404. See pricing for Free and Pro.
Can the agent go from an email to a person too?
Yes. get_lead accepts email with the same cost rules. The reverse email lookup MCP page covers it.
The free plan is 1,000 records, one-off, no card. Pro is $499 a month, flat.
Run your first reverse phone lookup from Claude, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →