TL;DR
- Windsurf reaches LeadOcean through one
mcp_config.jsonentry and a browser sign-in. Cascade counts every filter set you describe and returns exact totals, so TAM, SAM and SOM become a handful of counts instead of one 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.
- Windsurf installed. The Windsurf MCP docs, September 2026, name no paid plan for remote HTTP servers. Enterprise users must turn MCP on in settings, and team admins can allowlist servers.
- Optional, for the REST check in Step 6:
curl,jqand 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 Windsurf
Windsurf has two agents, and they keep MCP servers in different files. The Windsurf MCP docs say mcp_config.json applies to the legacy Cascade agent only. In the Cascade panel, open the ... menu, then the Open MCP config file icon in the MCPs section. A remote HTTP server needs a serverUrl or url field.
{
"mcpServers": {
"leadocean": {
"serverUrl": "https://api.leadocean.io/mcp"
}
}
}Save the file and check the server's status in the MCPs section. Sign-in is OAuth in your browser, so add no headers block and paste no key. The docs list OAuth support for each transport type.
A sizing run needs none of the tools that spend records. The same docs let you hide tools with a disabledTools array, so turn the spending ones off for this job.
{
"mcpServers": {
"leadocean": {
"serverUrl": "https://api.leadocean.io/mcp",
"disabledTools": [
"leadocean_search_leads",
"leadocean_get_lead",
"leadocean_find_phone",
"leadocean_get_company",
"leadocean_search_companies",
"leadocean_export_leads"
]
}
}
}That leaves seven of LeadOcean's 13 tools: count leads, count companies, filter list, enum list, account, get export and list exports. None of them spend records. Remove the list when you want to pull real rows.
The Devin Local agent is the default for new tabs, and it reads MCP servers from the Devin CLI config instead. That is .devin/config.json in the project or ~/.config/devin/config.json for your user, per the Devin Local docs. File paths for both agents are on Connect LeadOcean to Windsurf.
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: marketing leaders (VP or C-level, Advertising & Marketing) at software
companies with 51 to 500 employees. Product: a marketing analytics 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" matches nothing, and "Software Development" does. Make Cascade 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 (marketing). Show me the values you
will use. Do not call any tool that spends records.The lookup is free. For this buyer it should settle on these values.
{
"industry": ["Software Development"],
"employeeRange": ["51-200", "201-500"],
"jobLevel": ["VP", "C-Team"],
"jobFunction": ["Advertising & Marketing"]
}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 Cascade to use only the free count tools 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 C-Team, jobFunction Advertising & Marketing, 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.Devin Local asks for approval before any MCP tool call, by default. Allow the tool for the session once you have read the arguments.
A count is a people count. Dollars come from accounts, not people, so the next step counts companies.
Step 5: Count the accounts behind SAM
leadocean_count_companies counts companies for free. It 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 and 201-500, hqCountry US. Give me the total, the split by headcount band
and the top five HQ states. Then multiply the total by $15,000, my annual
contract value, and label the result as a dollar SAM.Put your own contract value in the prompt. LeadOcean holds no figure for your product, so Cascade should never guess one.
Step 6: 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"],
"jobFunction": ["Advertising & Marketing"],
"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 says when it stopped at the cap.
What you get
We ran the four counts from Step 4 on 2026-10-21 with leadocean_count_leads, plus the company count from Step 5. Each call spent 0 records, and each total was exact.
| Tier | Filters added | Mailable people | All people (totalAll) | Employers |
|---|---|---|---|---|
| TAM | VP and C-Team, Advertising & Marketing, Software Development | 8,855 | 21,707 | 4,690 |
| Narrowed | + employeeRange 51-200 and 201-500 | 2,882 | 6,982 | 1,863 |
| SAM | + country US | 1,804 | 3,795 | 1,242 |
| SOM pool | VP only | 1,160 | 2,513 | 869 |
The mailable column counts people with a verified, catch_all_valid or catch_all email, which is the tool's default. The totalAll column is the same filters with no email condition. Employers is distinctCompanies, how many companies those people work at.
Here is the raw result for the SOM row, as the tool returned it.
{
"total": 1160,
"totalIsExact": true,
"totalAll": 2513,
"distinctCompanies": 869,
"credits": 0,
"sample": 1,
"hasMore": true,
"source": "leadocean",
"unsupportedFilters": []
}Read the table as a funnel. Of 2,882 mailable marketing leaders at 51 to 500 employee companies, 1,804 sit in the US, and 1,160 of those are VPs.
The Step 5 company count returned 11,577 US software development companies with 51 to 500 employees: 9,261 in the 51-200 band and 2,316 in 201-500. Only 1,242 of them employ a mailable VP or C-level marketing leader in our data. That gap is the difference between your account SAM and your reachable SAM.
Counts move as the data refreshes, so date every number you publish. These counts leave out funding, revenue and headquarters filters on people, which the people count does not support. Those narrow the list further at search time. Total spend for the run: 0 records.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| Windsurf cannot reach the server, no tools appear | A typo in the URL, a wrong config key, or an admin allowlist | Check the URL is exactly https://api.leadocean.io/mcp and the entry uses serverUrl or url. On a team plan, ask your admin to allow leadocean. |
| 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: 5 requests a second on Free, 50 on Solo, 200 on Agency, per account | 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 the account, or move to Solo ($97 a month) or Agency ($497 a month) on pricing. Free records do not reset. |
| Empty results or a count of 0 | A filter value outside the catalogue, such as industry: "Software" | Ask Cascade 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 Windsurf cost?
Zero. People counts, company 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. Multiply accounts 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.
Does Windsurf see my API key?
Not through the MCP server. It uses OAuth sign-in and no key sits in mcp_config.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 Cursor and in Claude. More recipes are on the MCP hub.
Size your market in Windsurf, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →