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:

ToolREST endpointCredits
list_productsGET /productsFree
get_productGET /products/:idFree
list_prospectsGET /prospectsFree
get_prospectGET /prospects/:tickerFree
search_excerptsGET /excerptsFree
list_outreach_templatesGET /outreach/templatesFree
get_dealmapGET /dealmapFree
generate_dealmapPOST /dealmap/generate0-10
override_stakeholder_rolePATCH /dealmap/node-roleFree
set_top_pickPATCH /dealmap/node-top-pickFree
craft_outreachPOST /outreach1

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-29minor

Improved publication status descriptions in the tool guidance. Older clients keep working.

2.12.02026-10-27minor

Published generations: generation_id paging for list_prospects, an unavailable assessment status, publication metadata, and 409 reasons in error text. Older clients keep working.

  • assessment_status adds unavailable (analysis not available for this company in the current results). These rows carry null scores and rank after scored rows, before unassessed rows; unavailable is not a low score.
  • list_prospects takes generation_id so a results update cannot mix pages; a 409 generation_unavailable means restart from offset 0 without it.
  • get_prospect returns facts only for children without analysis (unassessed or unavailable). search_excerpts and craft_outreach return 409 analysis_unavailable for those companies, before any credit is charged.
2.11.02026-10-24minor

Newest 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_dealmap and 10 craft_outreach calls 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_progress instead of a generic error.
  • craft_outreach waits 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-23minor

Outreach drafts say whether they cite a company fact. Existing fields are unchanged.

  • craft_outreach returns evidence_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-21patch

Security 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-11minor

Hosted MCP server and a Claude Desktop extension. No tool changes.

  • Hosted Streamable HTTP endpoint at /api/mcp with 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.
  • DealSurfaceClient accepts an injected fetch.
2.8.02026-10-09minorbehavior change

Outreach templates now fully control voice and length.

  • craft_outreach no longer accepts tone or length, 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-09patch

Bug fixes and reliability improvements.

2.7.02026-10-09minorbehavior change

Complaint Index by line of business, a new nurture verdict, and a heavier buying-signal weight in the deal score.

  • list_prospects accepts complaint_line, min_complaint_index and min_complaints; sort_by: "complaint_index" can rank by one CIS policy line. Rows carry complaints.by_line_of_business.
  • get_prospect returns a family complaint rollup with a per-carrier by_entity breakdown for parents without their own NAIC cocode; observations flag low_sample below 10 complaints.
  • account_verdict can be "nurture": the company fits the product but no current trigger is evidenced. deprioritize is only used at a deal score of 1 or 2. Group-grain detail now carries group_verdict with 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-23minor

Team 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_templates lists active templates with their channel and credit cost. craft_outreach uses the product default unless an explicit template_key is supplied.
  • Optional company_event identifies a materially current event that also passed the selected product's sales-relevance policy.
  • date_is_approximate marks 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 change

Omitting 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_prospects and get_prospect default 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 population object on both list and detail responses. private_companies states the requested policy and rank_scope states 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_dealmap billing restated: 10 credits for a successful org_fresh or org_fresh_empty result — the latter being a fresh empty org result supplemented with people. Cached org_cache and annotated_cache_hit results stay free.
  • DealMap generation is limited to 5 requests per minute; respect Retry-After on 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_unresolved from dealmap_data_unavailable; neither is a temporary-service or timeout diagnosis. dealmap_temporarily_unavailable and dealmap_timeout are surfaced the same way.
2.4.12026-09-06patch

DealMap 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. null means not applicable.
2.4.02026-09-01minor

Sentence-level highlights on evidence excerpts. Additive — no field was removed or renamed.

  • New include_highlights parameter on search_excerpts and get_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 a highlights array 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-30minor

Insurance-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_prospects under 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_excerpts returns their excerpts with per-excerpt source_ticker and source_company_name attribution, and craft_outreach works for scored groups instead of returning 404.
  • New additive fields on prospect detail and excerpt responses: evidence_scope (own | family | none) and family_role (head | member | standalone); group detail responses use narrative_scope: "group".
2.2.02026-08-26minor

Hierarchical lines of business and union-premium targeting. Additive — no field was removed or renamed.

  • The lines_of_business vocabulary 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 widened licensed_footprint with bands and states_any. Per-line premium fields remain for segments saved under the previous per-line contract.
  • Prospect detail CIS observations keep line_of_business as the roll-up key and add policy_line_of_business (for example individual_life). The premium block adds rollup_lines_of_business: roll-up keys whose policy-type splits are also present in by_line_of_business — a roll-up’s total contains its splits, so never sum the two together.
2.1.02026-08-17minor

Human-readable company names. The value of company_name has changed — no field was removed or renamed, but the text it returns is different.

  • company_name now 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_name carries the name the company files under. If you were matching on company_name against filings or a CRM, switch to this field.
  • New logo_domain gives 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-12patch

Agent-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_score qualitatively: 1.0 means strong buying-signal indicators were found in the evidence, hedging proportionally down to 0 (none detected).
  • get_prospect now documents that only assessed subsidiaries resolve; an unassessed hierarchy.children ticker returns 404 by design.
  • search_excerpts now documents that keyword matches the excerpt’s tagged pain points, not the raw quote text.
2.0.02026-08-03breaking

Targets 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_status labels; 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.children ticker back to get_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_category removed from search_excerpts and 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-21

Added optional include_disabled metadata access for list_products and get_product. Operational tools continue to use active products only.

0.1.32026-04-06

Added 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-03

Improved tool descriptions for clarity.

0.1.12026-03-15

Initial public release. Published to npm and MCP Registry.

MCP Server Overview | DealSurface Docs