Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Run Revenue Operations (in Claude Code)

One MCP connection, one CLAUDE.md and three small scripts. Size the market, fill CRM gaps and ship a clean CSV, with the cost of each step.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

TL;DR

  • Revenue operations breaks when marketing, sales and the CRM each hold a different version of the account. Claude Code can fix that if it reads one data source and one rulebook.
  • It takes about 30 minutes. Sizing and sanity checks spend 0 records. The optional enrichment spot-check spends about 10 of your 1,000 free records.
  • Everything below runs against LeadOcean, a B2B people and company data API with a hosted MCP server. Claude Code does the glue work. LeadOcean is not a CRM, a sequencer or a dialer.

Prerequisites

  • A LeadOcean account from app.leadocean.io. The free plan has no card, 1,000 records for life and 5 requests a second.
  • Claude Code installed. The MCP route signs in with OAuth, so no key goes into the chat.
  • For the REST steps: curl, jq and your key in the shell.
  • A CSV export of your CRM accounts or contacts, with a domain or email column.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Connect the data source once

Add the hosted server over HTTP, then sign in. Claude Code's docs say to run /mcp inside a session to authenticate a remote server.

bash
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp list
text
/mcp

Pick leadocean and approve the sign-in. The server exposes 13 tools. Seven never spend records: leadocean_count_leads, leadocean_count_companies, leadocean_list_filters, leadocean_list_enum_values, leadocean_get_account, leadocean_get_export and leadocean_list_exports. Full setup is on Connect LeadOcean to Claude Code.

Step 2: Write the rulebook in CLAUDE.md

A RevOps stack drifts because every tool has its own definition of "ICP". Put yours in one file. Claude Code loads CLAUDE.md at the start of a session, per its memory docs.

markdown
RevOps rules

ICP: US software companies, 51 to 1,000 staff. Buyer: VP or head of Revenue Operations.
Filters are exact strings. Resolve enums with leadocean_list_enum_values before use.
Never call a tool that spends records unless I say "spend". Counts are always free.
Every number you report gets the date and the filters behind it.
Mailable means emailStatus verified, catch_all_valid or catch_all. Say so on every count.
Write outputs to ./out/, never over an input file.

The "never spend" rule is the guardrail. It keeps an agent from burning your 1,000 records on a loose prompt.

Step 3: Size the market for free

Ask for counts before you ask for rows. People and accounts are different numbers, so run both.

text
Use the leadocean MCP server. Call leadocean_list_enum_values for industry with q "software".
Then leadocean_count_companies for that industry, hqCountry ["US"], employeeRange
["51-200","201-500","501-1000"]. Then leadocean_count_leads for title
["Head of Revenue Operations","VP Revenue Operations","Director of Revenue Operations"],
same industry, country and size, facets false. Report both, dated, with the filters.

Both calls are free, however often you run them. The people count describes the mailable audience by default. The tool also returns totalAll, the same filters with no email condition, so the gap is visible.

Step 4: Audit your CRM export for gaps

Export contacts from your CRM as crm.csv. Ask Claude Code to find the rows that are missing a work email, without calling anything that spends records.

text
Read crm.csv. List the columns. Count rows where email is empty, and rows where
linkedin_url is empty. Write the rows with a LinkedIn URL but no email to ./out/gaps.csv.
Do not call any LeadOcean tool in this step.

This step is local. It tells you how many records an enrichment run would cost before you run it. One enrichment is one record, and a lookup that finds nobody costs nothing.

Step 5: Fill the gaps with enrichment

Enrich takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup. Test on 10 rows first.

bash
head -n 11 out/gaps.csv | tail -n +2 | cut -d, -f3 | while read url; do
  curl -s -X POST "https://api.leadocean.io/v1/people/enrich" \
    -H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
    -d "{\"linkedin_url\": \"$url\", \"reveal_email\": true}" \
    > "out/enriched/$(echo "$url" | md5).json"
  sleep 0.3
done
ls out/enriched | wc -l

Save the raw JSON, then let Claude Code read the files and map fields, so you never hard-code a guess. Create the folder first with mkdir -p out/enriched. On Linux, swap md5 for md5sum | cut -d' ' -f1. reveal_email returns the address at no extra record. The sleep keeps you under the Free limit of 5 requests a second. Adjust the cut -d, -f3 column to where your LinkedIn URL sits. Read email_status before you load anything into the CRM, because bounced emails are not refunded.

Step 6: Pull the buying committee for one account

For a named account, list the people we hold at the domain. The roster is thin, with no contact points, so it spends one record per person. Cap it with limit.

bash
curl -s "https://api.leadocean.io/v1/companies/acme.com/people?limit=5" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  | jq '{returned: (.data | length), next: .meta.nextCursor}'

To get an email for one of them, pass the person_id the row carries at meta.source_ids.person_id to POST /v1/people/enrich. The roster stops at 10,000 rows and sets meta.depthCapped when it does.

Step 7: Ship a clean CSV back to the CRM

Claude Code writes the file. Your CRM does the import. LeadOcean has no CRM connector of its own, so the CSV is the handoff.

text
Merge the enriched rows into ./out/crm-clean.csv. Columns: first_name, last_name, title,
company_domain, email, email_status. Drop rows where email_status is not verified,
catch_all_valid or catch_all. Add a last line to ./out/README.md with today's date,
the filters used and the records spent.

For lists of thousands, skip the loop. The app at app.leadocean.io has an Exports page with a filter builder, a column picker, the record price before you start and a CSV download. The API route is POST /v1/exports, up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the Free plan.

Step 8: Re-run it on a schedule you control

Drift comes back. The dataset refreshes monthly, and each record carries its own fetched_at date. So a monthly pass is enough for most teams.

Save the Step 3 to Step 7 prompts as a single file, revops-monthly.md, and run it from the same project folder each month. The CLAUDE.md rules travel with it. Compare the new counts with last month's README.md line and flag any segment that moved more than you expect.

text
Read out/README.md. Re-run the Step 3 counts with the same filters. Show last month's
number, this month's number and the change. Do not call any tool that spends records.

Counts are free, so the monthly check costs nothing. Only the enrichment of new gaps spends records. That is the whole point of keeping the sizing and the spending in separate steps.

What this does not do

Be clear about the edges before you promise this to a team.

  • It does not move data into your CRM. You import the CSV, or you build that connector yourself.
  • It does not send email, dial or sequence. Use your sequencer for that.
  • It does not clean deal data. LeadOcean holds people and company records, not your pipeline.
  • It does not guess. A person we hold nothing for is a 404 and costs nothing. Handle that row in your script.

If you want a table or workflow builder around the data, that is a different product. LeadOcean has the data and the API, and the app handles exports, keys and usage.

What you get

This is the output of the two free count calls in Step 3, run on 2026-10-21. It cost 0 records.

json
{
  "accounts": {
    "total": 12380,
    "totalIsExact": true,
    "employee_range": [
      {"value": "51-200", "count": 9261},
      {"value": "201-500", "count": 2316},
      {"value": "501-1000", "count": 803}
    ]
  },
  "people": {
    "total": 300,
    "totalIsExact": true,
    "totalAll": 518,
    "distinctCompanies": 284
  }
}

Read it as follows. There are 12,380 US companies in Software Development of that size. At 284 of them we hold a mailable head, VP or director of Revenue Operations, 300 people in all. With no email condition the same filters match 518 people.

The enrich response shape from the API reference, placeholder values:

json
{
  "success": true,
  "data": {
    "profile_data": {"profile_full_name": "Jane Doe"},
    "contact_data": {
      "email_status": "verified",
      "contact_emails": [{"email": "jane.doe@acme.com", "type": "work", "status": "verified"}],
      "contact_phones": [{"phone": "+1 415 555 0133", "type": "mobile"}],
      "contact_current_experiences": [{"job_title": "Head of RevOps", "company_name": "Acme"}]
    },
    "resume_data": {"experiences": [], "educations": []}
  },
  "meta": {"credits": 1}
}

That block is the response shape from the API reference, not a real record. Since October 2026 enrich also returns past roles, education and certifications under resume_data. Past employers carry no company_id yet.

Troubleshooting

ErrorCauseFix
Needs authentication in claude mcp listServer added, sign-in not doneRun /mcp, pick leadocean and approve the sign-in.
401Missing, wrong or revoked keyRe-copy the key from the app and re-export $LEADOCEAN_API_KEY.
429Above the plan's rate limit: 5 a second on Free, 200 on AgencyWait the Retry-After seconds. Add a sleep to the loop.
402The 1,000 free records are spentCounts stay free. Choose a paid plan on pricing.
Count of 0 or a 400A guessed enum value such as industry: "Software"Resolve it with leadocean_list_enum_values and pass the exact string.
Export refusedOver 50,000 rows a request or 500,000 a daySplit the filters into several smaller exports.

FAQ

Can Claude Code replace my CRM or sequencer?

No. Claude Code runs scripts and writes files. LeadOcean supplies data. You still need a CRM to hold deals and a sequencer to send. This recipe fixes the data going into them.

How many records does this recipe spend?

Sizing, the CRM audit and the troubleshooting calls spend 0. The Step 5 spot-check spends one record per found person, about 10. An enrichment that finds nothing costs nothing.

Which plan does a RevOps team need?

Free covers the recipe. For a team running weekly refreshes, Agency at $497 a month has 200 requests a second, 5 keys and exports of 50k rows a file. Solo at $97 a month suits one person. See pricing.

Where do I go next?

Read Claude Code RevOps workflows for scheduled jobs and Claude Code for GTM engineering for the engineering side. For skills worth installing, see the Claude Code GTM skills roundup. More recipes live in the blog hub.

Give Claude Code a clean data source for RevOps

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →