You get one Claude chat that searches people in LeadOcean, enriches them, and writes them to Attio as person records. LeadOcean has no Attio sync, so Claude is the bridge. It uses two connectors: the LeadOcean MCP to read, the Attio MCP to write. Reruns update records instead of duplicating them.
How it works
- Connect the LeadOcean MCP. Add
https://api.leadocean.io/mcpas a custom connector in Claude and sign in with OAuth. No key is pasted. - Connect the Attio MCP. Attio's hosted server is
https://mcp.attio.com/mcp. In Claude open Settings, Connectors, search for Attio and install it. You sign in as your Attio user (Attio MCP docs, September 2026). - Size the list for free. Ask Claude to run
leadocean_count_leadswith your filters. A count costs nothing. - Search and enrich. Claude calls
leadocean_search_leads, thenleadocean_get_leadfor the people you keep. A lookup that finds nobody costs nothing. - Preview the mapping. Claude calls Attio's
list-attribute-definitionson the people object, then shows five rows mapped to those attributes. Fix the mapping now. - Upsert. Claude calls Attio's
upsert-recordwith the work email as the matching attribute. Attio's docs say write operations ask you to confirm (Attio MCP docs, September 2026).
Configuration
Both sides are connectors, so there is no config file. A prompt that works:
Count VPs of Sales in Canada with leadocean_count_leads (mailable only).
If under 500, search them, enrich with work email, and show 5 rows
mapped to Attio people attributes. Wait for my OK, then upsert by email.If you script it instead, this is the LeadOcean call and the Attio upsert behind it. Attio's REST upsert is PUT /v2/objects/people/records with the matching_attribute query parameter (Attio API docs, September 2026).
curl -X POST https://api.leadocean.io/v1/people/enrich \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"linkedin_url": "https://www.linkedin.com/in/jane-doe-example", "reveal_email": true}'
curl -X PUT "https://api.attio.com/v2/objects/people/records?matching_attribute=email_addresses" \
-H "Authorization: Bearer $ATTIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"data": {"values": {"email_addresses": ["jane@acme.com"], "name": [{"first_name": "Jane", "last_name": "Doe", "full_name": "Jane Doe"}]}}}'Enrich takes exactly one of linkedin_url, email, phone or person_id. To start from a company, search people by domain first, then enrich by person_id.
Field mapping
Attio attribute names come from the Attio docs. Check yours with list-attribute-definitions.
| LeadOcean field | Attio attribute | Note |
|---|---|---|
Work email (reveal_email: true) | email_addresses | The matching attribute. Skip invalid, risky and unknown. |
email_status | Custom text attribute | Keep it. LeadOcean gives no refund for bounces. |
Phone (contact_phones[].phone) | phone_numbers | Phone lookups on the v2 endpoints cost a record per call. |
| Full name | name | Attio takes first, last and full name. |
| LinkedIn URL | linkedin | Second dedupe check. |
| Current company domain | company | Attio can link by domain. Docs show a domains reference. |
fetched_at | Custom date attribute | Shows record age. The dataset refreshes monthly. |
Cost at 10,000 rows
Searching 10,000 people and enriching them is 20,000 records on LeadOcean, because search results and enrichments both count. Free holds 1,000 for life, so it tests the mapping and no more.
| Plan | Fits 10,000 rows? | Note |
|---|---|---|
| Free ($0) | No | 1,000 records, once. |
| Solo ($97 a month) | Yes | 10k enrichments every 5 hours, 100k search records every 5 hours. |
| Agency ($497 a month) | Yes | 1M enrichments a day, 200 requests a second. |
Attio bills per seat. Its list prices are Free $0, Plus $44 and Pro $99 per user a month, with Plus at $35 and Pro at $79 billed yearly (Attio pricing, September 2026). Free allows 50,000 records, so 10,000 people fit. Attio's write limit is 25 requests a second (Attio rate limits, September 2026). Attio's MCP docs list an active workspace as the only prerequisite (Attio MCP docs, September 2026). See pricing.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Claude has no Attio tools | Connector not added or off in this chat | Enable both connectors, start a new chat |
| Duplicate people in Attio | Writes were creates, not upserts | Ask for upsert-record matched on email |
| Enrich returns 404 | LeadOcean holds nothing for that person | Nothing is charged. Skip the row |
| 402 from LeadOcean | The 1,000 Free records are spent | Move to Solo or Agency |
| 429 from either side | Over a rate limit | Wait for Retry-After, then go slower |
| Run stops halfway | Chat length | Run batches of 500 to 1,000 rows |
FAQ
Does LeadOcean write to Attio by itself?
No. LeadOcean returns data through the API and MCP. Claude with the Attio connector does the writing.
Can I use the REST API instead of the MCP?
Yes. Use the upsert call above from a script. The MCP route needs no code.
How do I keep bad emails out of Attio?
Filter on email_status before the write. Keep verified and catch-all valid, hold the rest.
Is there a similar recipe for another tool?
Yes: search, enrich from Claude and push to monday.com. For the prompts, see enrich leads and enrich data.
Enrich the next list straight into Attio
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →