TL;DR
- Cursor reaches LeadOcean through one
mcp.jsonentry. It counts every filter set you describe and returns exact totals, so TAM, SAM and SOM become four counts instead of one analyst guess. - It takes about 15 minutes. The sizing run spends 0 records, because counts and lookups are free.
- Only people returned to you count as records. An optional 10-row spot-check spends 10 of the 1,000 free records.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and gives 1,000 records, one-off.
- Cursor installed. The Cursor MCP docs, October 2026, name no paid plan for adding a remote server. On an Enterprise plan, an admin can restrict remote servers by URL pattern.
- Optional, for the REST check in Step 5:
curland a key in your shell as$LEADOCEAN_API_KEY. The chat steps need no key.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Add LeadOcean to Cursor
Cursor reads remote servers from mcp.json. Use ~/.cursor/mcp.json for every project, or .cursor/mcp.json inside one project. Sign-in is OAuth in your browser, so no key is pasted.
{
"mcpServers": {
"leadocean": {
"url": "https://api.leadocean.io/mcp"
}
}
}Save the file, open Customize in the sidebar, enable leadocean and start the sign-in. Approve it on the LeadOcean page. The server exposes 13 tools. Button labels vary by Cursor version, and the full walkthrough is on Connect LeadOcean to Cursor.
Step 2: Write the buyer in one sentence
A market size is only as good as the buyer definition behind it. Write one sentence that names the industry, company size and role. Keep it to filters LeadOcean holds.
Buyer: engineering leaders (VP or Director, Engineering) at software companies
with 51 to 500 employees. Product: a developer tool. Question: how big is the
market, how much of it can I sell into from the US, and how many VPs is that?Everything after this step turns that sentence into counts. For the method behind the tiers, see TAM, SAM and SOM.
Step 3: Resolve the exact filter values
Filter values are exact strings. "Software" is not an industry value, and "Software Development" is. Make Cursor look each value up before it counts anything.
Use leadocean_list_enum_values to find the exact strings for: industry (software),
employee_range, job_level and job_function (engineering). Show me the values you
will use. Do not call any tool that spends records.Cursor asks for approval before it runs an MCP tool, by default. The arrow beside the tool name shows the arguments, so read them. For this buyer, the lookup should settle on these values.
{
"industry": ["Software Development"],
"employeeRange": ["51-200", "201-500"],
"jobLevel": ["VP", "Director"],
"jobFunction": ["Engineering"]
}Step 4: Count TAM, SAM and SOM
Ask for one count per tier. Each tier keeps the filters above it and adds one. The prompt tells Cursor to use only the free count tool and to label each number.
Use leadocean_count_leads, with facets false, for four counts. Never call a tool
that spends records.
1. TAM: jobLevel VP and Director, jobFunction Engineering, industry Software
Development. No size or country filter.
2. Add employeeRange 51-200 and 201-500.
3. SAM: add country US.
4. SOM pool: same as 3, but jobLevel VP only.
Put the results in a table with the exact filters beside each count. Say which
email statuses were counted.A count is a people count. To turn it into dollars you need accounts, and leadocean_count_companies counts those for free. It takes the company-search filters and breaks the total down by industry, headcount band, HQ country, HQ state and NAICS.
Use leadocean_count_companies with industry ["Software Development"],
employeeRange ["51-200","201-500"], hqCountry ["US"]. Report the total and
the split by headcount band. Multiply the total by my contract value of $X.Give Cursor your own price, since LeadOcean holds no figure for your product. The REST version is /v1/companies/count, also free.
Step 5: Check one count over REST
You can reproduce any chat count from a terminal. The sizing call is a search with count=true as a query parameter and limit at 1. The body is flat JSON with arrays.
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"jobLevel": ["VP", "Director"],
"jobFunction": ["Engineering"],
"industry": ["Software Development"],
"employeeRange": ["51-200", "201-500"],
"country": ["US"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"],
"limit": 1
}' | jq '.meta'The REST total is capped at 100,000. For a bigger market, use the MCP count tool, which returns the total with totalIsExact beside it.
What you get
We ran the four counts from Step 4 on 2026-10-01 with leadocean_count_leads. Each one spent 0 records, and each total was exact.
| Tier | Filters added | Mailable people |
|---|---|---|
| TAM | VP and Director, Engineering, Software Development | 20,405 |
| Narrowed | + employeeRange 51-200 and 201-500 | 4,658 |
| SAM | + country US | 2,430 |
| SOM pool | VP only | 937 |
Every figure is a mailable count: people with a verified, catch_all_valid or catch_all email, which is the tool's default. It is not everyone we hold for those filters, so label it that way in your deck.
Here is the raw result for the SAM row, as the tool returned it.
{
"total": 2430,
"totalIsExact": true,
"credits": 0,
"sample": 1,
"hasMore": true,
"unsupportedFilters": []
}Read the table as a funnel. Of 4,658 mailable people at 51 to 500 employee companies, 2,430 sit in the US, and 937 of those are VPs. Your numbers will move as the data changes, so date every count you publish.
The account count ran on 2026-10-21 with leadocean_count_companies and spent 0 records. It found 11,577 US-headquartered Software Development companies with 51 to 500 staff, exact: 9,261 at 51-200 and 2,316 at 201-500. At a $10,000 contract value that is a $115.8M account TAM. Swap in your own price.
The people counts leave out funding, revenue and headquarters city or state filters, which the people count tool does not support. Use leadocean_count_companies for those cuts, or apply them at search time. Total spend for the run: 0 records.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| Cursor cannot reach the server | A typo in the URL, invalid JSON in mcp.json, the server toggled off, or an admin URL allowlist | Check the URL is exactly https://api.leadocean.io/mcp and the file parses. On an Enterprise plan, ask your admin to allow it. |
| 401 | Missing, wrong or revoked key on a REST call | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY again. |
| 429 | Above your plan's rate per account (5 requests a second on Free, 200 on Agency) | Wait the Retry-After seconds, then slow the loop. Five counts need nothing near that rate. |
| 402 | Free plan: the 1,000 records are spent | Counts stay free. Check leadocean_get_account, or move to Solo at $97 a month. Free records do not reset. |
| Empty results or a count of 0 | A filter value outside the catalogue, such as industry: "Software" | Ask Cursor to call leadocean_list_enum_values and use the exact string it returns. |
| Total stops at 100,000 | The REST count is capped at 100,000 | Use leadocean_count_leads, or add a filter and count the pieces. |
FAQ
How many records does sizing a TAM in Cursor cost?
Zero. Counts, filter lookups and enum lookups are free, however many you run. Records are spent only on people returned by a search, a lookup or an export.
Is a people count the same as a market size?
No. It is the number of reachable buyers in a segment. Count accounts with leadocean_count_companies, multiply by your contract value to get dollars, and use your own price for that step.
Why does the count say "mailable"?
The count tool defaults to verified, catch_all_valid and catch_all emails. Pass emailStatus, hasEmail or reachable to change that. Say which one you used next to every number.
How often should I re-run the counts?
Once a month is enough. The dataset is refreshed monthly, and each record carries its own fetched_at date. Keep the filters fixed in a file in your repo, re-run the same prompt, and compare totals by date.
Can I pull the whole SAM into a list?
Not in one search. One search pages to 10,000 rows, and the capped page carries meta.depthCapped. Split the SAM by country or headcount band, or use an export from Solo up, which takes up to 50,000 rows a request.
Does Cursor see my API key?
Not through the MCP server. It uses OAuth sign-in and no key sits in mcp.json. Only the optional REST check reads $LEADOCEAN_API_KEY from your shell.
Can I do this in another editor?
Yes. The same MCP URL works elsewhere. See size your TAM in VS Code, in Windsurf and in Claude. More recipes are on the MCP hub.
Size your market in Cursor, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →