MCP Server
Connect DealSurface to Claude or Codex in about a minute, no installation needed. Then research prospects, map buying committees, and draft outreach by just asking.
What is MCP?
The Model Context Protocol (MCP) is an open standard for connecting AI assistants to external tools. The DealSurface MCP server (@dealsurface/mcp-server) wraps the REST API into a set of tools that any MCP-compatible AI agent can use.
The server is available hosted at https://dealsurface.com/api/mcp with nothing to install, or you can run it locally via npx. Both use the same API key and expose the same tools. See Installation & Setup.
When to use MCP vs REST
Use the MCP server when:
- Building an AI agent or conversational workflow
- Working in Claude Desktop or an MCP-compatible client
- You want the AI to decide which tools to call and in what order
- Prototyping a multi-step sales research workflow
Use the REST API when:
- Building a custom integration or script
- You need precise control over every API call
- Integrating with a CRM, dashboard, or automation platform
- Processing data in bulk
Available tools
The MCP server exposes 11 tools, each mapping to a REST API endpoint:
| Tool | REST endpoint | Credits |
|---|---|---|
| list_products | GET /products | Free |
| get_product | GET /products/:id | Free |
| list_prospects | GET /prospects | Free |
| get_prospect | GET /prospects/:ticker | Free |
| search_excerpts | GET /excerpts | Free |
| list_outreach_templates | GET /outreach/templates | Free |
| get_dealmap | GET /dealmap | Free |
| generate_dealmap | POST /dealmap/generate | 0-10 |
| override_stakeholder_role | PATCH /dealmap/node-role | Free |
| set_top_pick | PATCH /dealmap/node-top-pick | Free |
| craft_outreach | POST /outreach | 1 |
Upgrading to 2.8.0
Templates now set voice and length
2.8.0 removes the tone and length inputs from craft_outreach. The selected template's instructions now decide voice, structure, and length, matching drafts written in the app.
Older MCP clients still work: the API ignores tone and length and adds a deprecation notice to the response. A future release will reject them, so update to 2.8.0 or later.
Release notes
2.13.02026-10-29minorImproved publication status descriptions in the tool guidance. Older clients keep working.
2.12.02026-10-27minorPublished generations: generation_id paging for list_prospects, an unavailable assessment status, publication metadata, and 409 reasons in error text. Older clients keep working.
assessment_statusaddsunavailable(analysis not available for this company in the current results). These rows carry null scores and rank after scored rows, before unassessed rows;unavailableis not a low score.list_prospectstakesgeneration_idso a results update cannot mix pages; a 409generation_unavailablemeans restart from offset 0 without it.get_prospectreturns facts only for children without analysis (unassessedorunavailable).search_excerptsandcraft_outreachreturn 409analysis_unavailablefor those companies, before any credit is charged.
2.11.02026-10-24minorNewest MCP protocol support, and faster work through long company lists.
- Speaks MCP 2026-07-28 as well as earlier versions, so newer clients such as Claude connectors connect directly, with no fallback step. Existing setups keep working unchanged.
- Agents are told to run up to 10
generate_dealmapand 10craft_outreachcalls at once instead of one at a time. Limits per API key are now 20 DealMap generations, 60 outreach drafts and 120 requests in total per minute, plus 40 DealMap generations per workspace. - Rate-limit errors say how many seconds to wait before retrying, and a DealMap already being generated for the same company returns
dealmap_generation_in_progressinstead of a generic error. craft_outreachwaits up to 75 seconds for a draft (was 30), so slow drafts are no longer abandoned.- Running locally with npx now needs Node.js 20 or later.
- Calling a tool name that doesn't exist now returns a standard JSON-RPC "invalid params" error (code -32602) instead of a tool result marked as an error. Clients that only call the listed tools are unaffected.
2.10.02026-10-23minorOutreach drafts say whether they cite a company fact. Existing fields are unchanged.
craft_outreachreturnsevidence_mode(a specific fact or a general message), the cited facts, the lead's own company, and warnings when the lead's company is outside the prospect's group or the role is outside the usual buyers.
2.9.12026-10-21patchSecurity update. No tool changes.
- Updates the MCP SDK to 1.32.1 and its HTTP dependencies to versions without known vulnerabilities.
2.9.02026-10-11minorHosted MCP server and a Claude Desktop extension. No tool changes.
- Hosted Streamable HTTP endpoint at
/api/mcpwith API-key authentication. Nothing to install; works with Claude Code, Codex, and Claude Desktop custom connectors. - Claude Desktop extension (
.mcpb) that runs on Claude Desktop's bundled Node runtime. DealSurfaceClientaccepts an injectedfetch.
2.8.02026-10-09minorbehavior changeOutreach templates now fully control voice and length.
craft_outreachno longer acceptstoneorlength, and responses no longer include them. Put voice and length in the template instructions instead. Older clients keep working for now: the API ignores both fields and returns a deprecation notice.- Generation prompts are no longer forced to a 140-word “typical” length, and the old minimum and maximum lengths are gone (LinkedIn messages are no longer capped at 600 characters). Short templates, for example a four-line conference note, are followed as written.
- Team templates may ground a draft in a single fact instead of at least two.
2.7.12026-10-09patchBug fixes and reliability improvements.
2.7.02026-10-09minorbehavior changeComplaint Index by line of business, a new nurture verdict, and a heavier buying-signal weight in the deal score.
list_prospectsacceptscomplaint_line,min_complaint_indexandmin_complaints;sort_by: "complaint_index"can rank by one CIS policy line. Rows carrycomplaints.by_line_of_business.get_prospectreturns a family complaint rollup with a per-carrierby_entitybreakdown for parents without their own NAIC cocode; observations flaglow_samplebelow 10 complaints.account_verdictcan be"nurture": the company fits the product but no current trigger is evidenced.deprioritizeis only used at a deal score of 1 or 2. Group-grain detail now carriesgroup_verdictwith the same values.- Settled buying signals weigh more in
deal_score: +20 for a potential opening and +40 for a strong buying opportunity (previously +10 and +20), applied as each product is next processed.
2.6.02026-09-23minorTeam outreach templates, plus additive product-relevant company-event metadata on excerpts acquired from general web, trade-publication, filings, earnings, company-page, and DOI evidence lanes.
- New free
list_outreach_templateslists active templates with their channel and credit cost.craft_outreachuses the product default unless an explicittemplate_keyis supplied. - Optional
company_eventidentifies a materially current event that also passed the selected product's sales-relevance policy. date_is_approximatemarks dates anchored to a verified source publication/call date or a nearby uncertain event date. Present these as reported dates rather than exact effective dates.- Event highlights use the accepted event's grounded evidence quote; hidden system queries remain absent from public keyword fields.
2.5.02026-09-22minorbehavior changeOmitting include_private now requests your team's entitled population instead of public-only results. This is a server-side change: existing clients are affected by the API deployment even without upgrading the package. Pass include_private: false to keep public-only lists and public-company ranks.
list_prospectsandget_prospectdefault to the team-entitled population, so entitled teams may see more companies and different ranks and totals. Private-company detail keeps its private-inclusive rank population, and team access restrictions remain enforced.- New additive
populationobject on both list and detail responses.private_companiesstates the requested policy andrank_scopestates what the rank is measured against — lists rank filtered families, detail ranks unfiltered families."included_if_entitled"describes policy only; it does not guarantee private rows or override the live team entitlement. generate_dealmapbilling restated: 10 credits for a successfulorg_freshororg_fresh_emptyresult — the latter being a fresh empty org result supplemented with people. Cachedorg_cacheandannotated_cache_hitresults stay free.- DealMap generation is limited to 5 requests per minute; respect
Retry-Afteron 429. After a timeout, read the current DealMap before retrying — background completion is not guaranteed. - DealMap failures now name their code in the client error message. A 422 distinguishes
company_identity_unresolvedfromdealmap_data_unavailable; neither is a temporary-service or timeout diagnosis.dealmap_temporarily_unavailableanddealmap_timeoutare surfaced the same way.
2.4.12026-09-06patchDealMap stakeholders gain an optional placement field. Additive — no field was removed or renamed.
"placed"means the person sits in the company's reporting hierarchy;"unplaced"means they are listed at the company but their reporting line is unknown (no edges are implied). Unplaced people are added when the placed hierarchy is sparse.nullmeans not applicable.
2.4.02026-09-01minorSentence-level highlights on evidence excerpts. Additive — no field was removed or renamed.
- New
include_highlightsparameter onsearch_excerptsandget_prospect. The MCP tools default it to on; the underlying REST parameter defaults to off. - Each excerpt gains
text_marked— the excerpt text with<mark>…</mark>tags around the most relevant sentence(s) — and ahighlightsarray of character-offset spans with a score and matched keyword. Excerpts that predate highlight extraction (including blended family evidence today) return an empty array and unmarked text; that is an ordinary state, not an error.
2.3.02026-08-30minorInsurance-group family heads become first-class prospects. Additive fields; one behavior change in family representation.
- Behavior change: a scored private insurance group now represents its family in
list_prospectsunder the group's own ticker (previously a subsidiary's ticker carried the family row). Subsidiary tickers remain valid for direct lookup. - Group heads without their own filings serve blended subsidiary evidence:
search_excerptsreturns their excerpts with per-excerptsource_tickerandsource_company_nameattribution, andcraft_outreachworks for scored groups instead of returning 404. - New additive fields on prospect detail and excerpt responses:
evidence_scope(own | family | none) andfamily_role(head | member | standalone); group detail responses usenarrative_scope: "group".
2.2.02026-08-26minorHierarchical lines of business and union-premium targeting. Additive — no field was removed or renamed.
- The
lines_of_businessvocabulary grows to 43 filterable keys: the eight CIS policy-type splits (individual_life, group_life, individual_annuity, group_annuity, individual_accident_health, group_accident_health, medicare_supplement, long_term_care) plus the life / annuity / accident_health roll-ups, title, aggregate_write_ins and international. The split keys are populated once the CIS re-ingest has run for an environment and may return empty results until then. - Product target segments report
carrier_facts.union_premium(rank window or gross USD band measured across the union of the selected lines) and a widenedlicensed_footprintwithbandsandstates_any. Per-line premium fields remain for segments saved under the previous per-line contract. - Prospect detail CIS observations keep
line_of_businessas the roll-up key and addpolicy_line_of_business(for example individual_life). The premium block addsrollup_lines_of_business: roll-up keys whose policy-type splits are also present inby_line_of_business— a roll-up’s total contains its splits, so never sum the two together.
2.1.02026-08-17minorHuman-readable company names. The value of company_name has changed — no field was removed or renamed, but the text it returns is different.
company_namenow returns the name a person would use — Aflac rather than AMERICAN FAMILY LIFE ASSURANCE COMPANY OF COLUMBUS. It falls back to the filed name for companies that have not been through name resolution yet.- New
legal_namecarries the name the company files under. If you were matching oncompany_nameagainst filings or a CRM, switch to this field. - New
logo_domaingives a bare domain for the company logo, or null. Most companies have none; that is an ordinary state, not an error. - Applies to prospect lists, prospect detail, hierarchy children, the family pointer, and the DealMap chart. DealMap charts generated earlier report the new name too — it is resolved at request time, not stored.
2.0.12026-08-12patchAgent-guidance patch — descriptions and server instructions only, no tool or API behavior changes.
- Server-level MCP instructions (surfaced in the initialize handshake): agents are told to present fields with plain-English labels (“Buying Signal Score”, “Deal Score”) rather than raw identifiers, and to interpret
buying_signal_scorequalitatively: 1.0 means strong buying-signal indicators were found in the evidence, hedging proportionally down to 0 (none detected). get_prospectnow documents that only assessed subsidiaries resolve; an unassessedhierarchy.childrenticker returns 404 by design.search_excerptsnow documents thatkeywordmatches the excerpt’s tagged pain points, not the raw quote text.
2.0.02026-08-03breakingTargets the /api/v2 REST surface; the version number now tracks the API major. Requires v2 — /api/v1 has been removed, so 0.2.x stops working.
- Insurance filters on
list_prospects— lines of business, premium bands, licensed states, entity type, ownership, name search, and sorting — with the line, state, and sort vocabularies enum-validated in the tool schemas, so an invalid value is rejected client-side with the accepted set in front of the model. - Lists cover the full candidate universe with
assessment_statuslabels; unassessed rows carry null scores and rank last. - Premium and complaint data on every list row and prospect detail, including the family complaint index (complaint share ÷ premium share) and full per-year, per-line series.
- Subsidiary drill-down: pass any assessed
hierarchy.childrenticker back toget_prospect; DealMap and outreach tools resolve subsidiary tickers upward to the corporate family. - New tool
set_top_pick(wraps PATCH /dealmap/node-top-pick) completes the buying committee workflow. - Breaking:
framework_categoryremoved fromsearch_excerptsand from every excerpt result. - A rebuilding or out-of-date prospect projection now returns a clear not-ready failure instead of an empty list, so agents retry rather than concluding a product has no prospects.
0.2.02026-05-21Added optional include_disabled metadata access for list_products and get_product. Operational tools continue to use active products only.
0.1.32026-04-06Added get_dealmap, generate_dealmap, and override_stakeholder_role tools for buying committee mapping. Removed get_leads tool (use get_dealmap instead). Updated craft_outreach for role-aware personalization.
0.1.22026-04-03Improved tool descriptions for clarity.
0.1.12026-03-15Initial public release. Published to npm and MCP Registry.