Skip to main content
Glama
nickcals

exitvalue-mcp

by nickcals

exitvalue-mcp

An MCP (Model Context Protocol) server that answers "what multiple do businesses in industry X sell for?" with real M&A data: median, 25th and 75th percentile EV/EBITDA and EV/Revenue multiples, by industry and deal size, from disclosed transactions (2018-2026).

  • Free, open source (MIT), no API key, no telemetry.

  • Data: the open ExitValue.ai multiples dataset (CC-BY 4.0): by deal size and by deal year, each fetched once and cached in memory for an hour.

  • Honest by design: every figure comes with its deal count (n); cells with fewer than the dataset's min_cell_n (10) disclosed deals are withheld, never extrapolated.

  • Works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code and any other MCP client (stdio transport).

Don't want to install anything? Use the hosted connector: https://exitvalue.ai/api/mcp (Streamable HTTP, no auth). Setup guide: https://exitvalue.ai/ai-connector. It is also in the official MCP Registry as ai.exitvalue/ma-multiples.

Tools

All tools are read-only (readOnlyHint, idempotentHint), take no credentials and return plain text ending with a link to the free calculator.

Tool

When to use it

Inputs

Output

list_industries

Find a valid id

none

Industries and sub-vertical ids (dental practice, HVAC, SaaS, trucking, ...), * marks those with published multiples

get_valuation_multiples

"What multiple does X sell for?" (one industry)

industry (id or plain English: "dentist", "med spa", "plumber", "MSP"); optional size_bracket (under_5m_ev, 5m_25m_ev, 25m_100m_ev, 100m_500m_ev, over_500m_ev)

Median + interquartile range with n per enterprise-value bracket

compare_industries

"Which sells for more, X or Y?"

industries (2-6 ids/names); optional size_bracket; optional metric (ev_ebitda default, ev_revenue)

One row per industry: median, IQR and n per bracket; rows below the threshold are marked INSUFFICIENT DATA

get_multiples_trend

"Are multiples rising or falling for X?"

industry; optional metric

Median, IQR and n per deal year 2018-2026 from multiples-by-year.json; years under n=10 are listed as gaps, never interpolated

Related MCP server: Market Sizing MCP Server

Example

Question: "What multiple do dental practices sell for?"

get_valuation_multiples({"industry": "dental practice"}) (real output, dataset of 2026-10-29):

Dental Practice - M&A valuation multiples (ExitValue.ai)
By deal size (enterprise value), disclosed deals 2018-2026:
- $5M-$25M EV: EV/EBITDA median 7.0x (middle 50%: 6.5x-8.3x), n=10
- $100M-$500M EV: EV/EBITDA median 11.9x (middle 50%: 11.2x-14.3x), n=14
- $500M and up EV: EV/EBITDA median 14.0x (middle 50%: 11.9x-15.8x), n=17; EV/Revenue median 2.65x (middle 50%: 2.11x-6.18x), n=10
These are population medians; a specific business's multiple depends on its margins, growth, customer concentration and owner dependence.
Source: ExitValue.ai analysis of disclosed M&A transactions (2018-2026) from a licensed historical M&A database, SEC EDGAR filings and verified press releases. Data CC-BY 4.0: https://exitvalue.ai/data/multiples.json

Get a free, business-specific valuation range (adjusted for your margins, growth and owner dependence) in about 2 minutes: https://exitvalue.ai/valuate?src=mcp-oss&industry=dental-practice

Plain-English names are mapped to the closest category and say so (e.g. "plumber" uses HVAC, "MSP" uses IT services, "med spa" uses other healthcare). When a category has no cell with enough deals, the tool says that rather than guessing.

Install

uvx (no install step)

uvx --from git+https://github.com/nickcals/exitvalue-mcp exitvalue-mcp

pip

pip install git+https://github.com/nickcals/exitvalue-mcp
exitvalue-mcp

Requires Python 3.10+. Works with the mcp Python SDK 1.x and 2.x.

Client configuration

Claude Desktop

claude_desktop_config.json (Settings -> Developer -> Edit Config):

{
  "mcpServers": {
    "exitvalue": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/nickcals/exitvalue-mcp", "exitvalue-mcp"]
    }
  }
}

Cursor

~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "exitvalue": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/nickcals/exitvalue-mcp", "exitvalue-mcp"]
    }
  }
}

Claude Code

claude mcp add exitvalue -- uvx --from git+https://github.com/nickcals/exitvalue-mcp exitvalue-mcp

Zero-install: hosted server

Any client that supports remote MCP servers can skip the local install and point at the hosted endpoint:

{
  "mcpServers": {
    "exitvalue": { "url": "https://exitvalue.ai/api/mcp" }
  }
}

In Claude (web/desktop) add it under Settings -> Connectors -> Add custom connector with the URL https://exitvalue.ai/api/mcp. Step-by-step instructions for ChatGPT, Claude, Cursor and others: https://exitvalue.ai/ai-connector.

Development

git clone https://github.com/nickcals/exitvalue-mcp && cd exitvalue-mcp
python -m venv .venv && . .venv/bin/activate
pip install -e ".[test]"
pytest
npx @modelcontextprotocol/inspector exitvalue-mcp   # optional: poke at it in the MCP Inspector

EXITVALUE_DATA_URL overrides the dataset URL (e.g. to point at a mirror).

Data and license

  • Code: MIT (see LICENSE).

  • Data: exitvalue.ai/data/multiples.json, CC-BY 4.0. Aggregate medians/quartiles of disclosed M&A multiples by sub-vertical and enterprise-value bracket, built from a licensed historical M&A database, SEC EDGAR filings and verified press releases; cells need n >= 10 per metric and outliers are excluded. Please cite https://exitvalue.ai if you use it. Also mirrored, with a datapackage and citation file, at github.com/nickcals/multiples.

These are population medians, not a valuation of any particular business. For a business-specific range (adjusted for margins, growth, customer concentration and owner dependence), try the free calculator at https://exitvalue.ai/valuate?src=mcp-oss.

Available Tools

4 tools
compare_industriesCompare industries' M&A multiplesA
Read-onlyIdempotent

Read-only. Puts 2-6 industries side by side for one metric: median multiple, middle 50% (25th-75th percentile) and deal count n per enterprise-value bracket, using the same data, name matching and n>=10 threshold as get_valuation_multiples. Pass size_bracket to compare a single deal-size bracket. Industries without enough deals are marked INSUFFICIENT DATA rather than estimated; unmatched names and industry-group ids are flagged per row. Use it for 'which sells for more, X or Y?' questions; use get_valuation_multiples for one industry's full breakdown.

NameRequiredDescriptionDefault
metricNoMultiple to use: ev_ebitda (enterprise value / EBITDA) or ev_revenue (enterprise value / revenue). Default ev_ebitda.ev_ebitda
industriesYes2 to 6 sub-vertical ids or plain-English industry names to compare, e.g. ['dental-practice', 'veterinary-practice', 'physical therapy']. Sub-vertical id from list_industries (e.g. 'hvac', 'dental-practice'), or a plain-English name ('HVAC', 'dentist', 'plumber', 'MSP'); plain names are mapped to the closest tracked category and the answer says which one was used.
size_bracketNoOptional enterprise-value (deal size) bracket: under_5m_ev = under $5M, 5m_25m_ev = $5M-$25M, 25m_100m_ev = $25M-$100M, 100m_500m_ev = $100M-$500M, over_500m_ev = $500M and up. Omit to show every published bracket per industry.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnly/idempotent/non-destructive), and the description still adds real behavioral detail: the n>=10 threshold, name-matching behavior shared with get_valuation_multiples, the INSUFFICIENT DATA fallback instead of estimation, and per-row flagging of unmatched names and industry-group ids. That is exactly the disclosure that prevents an agent from misinterpreting sparse output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded — the core comparison behavior comes first, then the fallback rules, then the sibling routing. Slight deduction because the leading 'Read-only.' restates annotation fields and the first sentence is heavily packed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return structure, and it still covers thresholds, fallbacks, name resolution, and the alternative tool. Nothing an agent needs to select or invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the schema already documents metric values, the 2-6 item constraint, and every size_bracket enum with dollar ranges. The description adds only marginal framing (one metric at a time, size_bracket for a single bracket) rather than new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource (compares 2-6 industries side by side on one metric) and enumerates exactly what output each row carries: median multiple, 25th-75th percentile, and deal count n per EV bracket. A reader can distinguish it from get_valuation_multiples without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit routing rule with the sibling named: 'Use it for which sells for more, X or Y? questions; use get_valuation_multiples for one industry's full breakdown.' It also states the condition for size_bracket (single-bracket comparison vs. omit for all brackets).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_multiples_trendGet M&A multiples trend by yearA
Read-onlyIdempotent

Read-only. Year-by-year history for ONE sub-vertical: for each deal year 2018-2026, the median EV/EBITDA and/or EV/Revenue multiple with middle 50% (25th-75th percentile), deal count n and median deal value, from the open per-year dataset. Only years with at least 10 disclosed deals for a metric are shown; missing years are listed as gaps and never interpolated, so many sub-verticals have few or no years. Use it for 'are multiples rising or falling for X?' questions; use get_valuation_multiples for pooled figures by deal size.

NameRequiredDescriptionDefault
metricNoOptional. Multiple to use: ev_ebitda (enterprise value / EBITDA) or ev_revenue (enterprise value / revenue). Omit to show both where published.
industryYesSub-vertical id from list_industries (e.g. 'hvac', 'dental-practice'), or a plain-English name ('HVAC', 'dentist', 'plumber', 'MSP'); plain names are mapped to the closest tracked category and the answer says which one was used.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only annotations, the description discloses important behavior: only years with at least 10 disclosed deals per metric appear, missing years are listed as gaps and never interpolated, and many sub-verticals have few or no years. This is exactly the kind of caveat an agent needs before invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key scope is front-loaded, and the description is dense with useful information rather than filler. Every sentence contributes either scope, data behavior, caveats, or routing guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex enough to need caveats, and the description covers the year range, threshold behavior, gaps, non-interpolation, and sibling routing. With annotations, full schema coverage, and an output schema already present, nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents metric and industry thoroughly, including enum values and plain-English mapping. The description reinforces that only one sub-vertical is used and that metric may show one or both multiples, but it adds little beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: year-by-year history for one sub-vertical, with named metrics, date range, percentiles, and deal counts. It clearly distinguishes itself from get_valuation_multiples by contrasting per-year trend data with pooled figures by deal size.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit use case ('are multiples rising or falling for X?') and names the alternative tool for pooled figures by deal size. The condition that selects this tool versus get_valuation_multiples is therefore clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_valuation_multiplesGet M&A valuation multiplesA
Read-onlyIdempotent

Read-only. Answers 'what multiple does a business in industry X sell for?' for ONE industry. Returns median EV/EBITDA and EV/Revenue multiples with the middle 50% (25th-75th percentile) and deal count n for each enterprise-value bracket (disclosed deals 2018-2026). Cells with fewer than 10 deals are withheld, never estimated. Passing an industry group id (e.g. 'healthcare') returns a median per sub-vertical. Use compare_industries to put several industries side by side and get_multiples_trend for year-by-year history. Population medians only: it does not value a specific business.

NameRequiredDescriptionDefault
industryYesSub-vertical id from list_industries (e.g. 'hvac', 'dental-practice'), or a plain-English name ('HVAC', 'dentist', 'plumber', 'MSP'); plain names are mapped to the closest tracked category and the answer says which one was used. An industry group id such as 'healthcare' or 'home-services' is also accepted.
size_bracketNoOptional enterprise-value (deal size) bracket: under_5m_ev = under $5M, 5m_25m_ev = $5M-$25M, 25m_100m_ev = $25M-$100M, 100m_500m_ev = $100M-$500M, over_500m_ev = $500M and up. Omit for every published bracket.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantive behavior: cells with fewer than 10 deals are withheld and never estimated, the data window is 2018-2026, and group ids return per-sub-vertical medians rather than a single figure. What is missing is a note on latency/caching or the response shape, but the critical statistical caveat is disclosed in detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core question and the read-only constraint, and every clause carries information. It is dense, but the four sentences pack return shape, coverage period, suppression rule, and alternatives without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-field documentation is not required, and the description still sketches the result shape (IQR, n, brackets). Combined with the explicit exclusion of company-specific valuation and the sibling routing, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are fully documented in structured fields. The description adds that an industry group id yields a median per sub-vertical, which is return behavior rather than parameter meaning, and it never mentions size_bracket at all. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb and resource: answers the multiple question for ONE industry and returns median EV/EBITDA and EV/Revenue with IQR and deal counts. It explicitly bounds scope ('Population medians only: it does not value a specific business'), which separates it from a business-valuation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names both alternatives and the condition that selects them: compare_industries for side-by-side multi-industry views and get_multiples_trend for year-by-year history. It also implies list_industries as the source of valid ids via the schema, leaving no routing ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_industriesList industriesA
Read-onlyIdempotent

Read-only. Lists every industry and sub-vertical ExitValue.ai tracks, with ids and display names; ids marked * have published multiples in the open dataset. Takes no input. Use it first when you are unsure of an id; the other tools accept these ids or plain-English names.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The 'Read-only' opener merely restates readOnlyHint=true, earning no credit, but the description adds genuinely new behavioral context: it takes no input, returns both ids and display names, and flags that starred ids have published multiples in the open dataset. It does not discuss ordering or dataset size, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, all front-loaded: read-only status, then what is returned, then the routing advice. No filler and nothing buried at the end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, yet the description still tells the agent what the payload means (ids, display names, starred ids with multiples) and how to use the result downstream. For a no-argument discovery tool this is fully sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, which is the baseline 4 case, and the description correctly confirms 'Takes no input' so the agent will not hunt for optional filters. No further parameter semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Lists every industry and sub-vertical ExitValue.ai tracks, with ids and display names.' It also scopes the content (which taxonomy, what fields, and the * marker for published multiples), so an agent can distinguish it from get_valuation_multiples and compare_industries without reading either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use it first when you are unsure of an id' and notes that 'the other tools accept these ids or plain-English names' — it names the alternative path and the condition that selects this tool. That is both when-to-use and when-you-might-skip guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.2.0
    • First observedcompare_industries
    • First observedget_multiples_trend
    • First observedget_valuation_multiples
    • First observedlist_industries

TDQS

A4.5/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a clearly different query shape: taxonomy lookup (list_industries), single-industry breakdown (get_valuation_multiples), multi-industry side-by-side (compare_industries), and time series (get_multiples_trend). The descriptions explicitly cross-reference each other with 'use X instead for Y' guidance, leaving no plausible misselection path.

Naming Consistency4/5

All names are snake_case verb_noun (list_/get_/compare_ + resource), so the pattern is predictable. Minor deviation: the noun varies between 'valuation_multiples' and 'multiples_trend', and two tools share the generic 'get_' prefix, but intent is still readable.

Tool Count5/5

Four tools map cleanly onto the four natural access patterns of a multiples dataset — enumerate, single, compare, trend — with no filler. The surface is tightly scoped for the server's narrow stated purpose.

Completeness4/5

Lookup, single-industry breakdown, comparison, and temporal trend are all covered, and name-to-id resolution is handled inside the tools rather than requiring a separate step. Minor gaps: no way to inspect bracket definitions/thresholds, deal-value distributions beyond the median, or filter by deal year within the cross-sectional tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Deliver real-time investment research with extensive private and public market data.
    3
    78 npm
    147
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides comprehensive market research and business analysis capabilities by integrating with eight major economic data sources like FRED, World Bank, and Census Bureau. It offers 28 specialized tools for calculating TAM/SAM, conducting industry analysis, and performing financial forecasting.
    8 npm
    36
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Access ServiceGraph — a structured catalog of 100k+ US professional-services firms (law, marketing, consulting, accounting, IT services, architecture, engineering, HR, PR, design) with filters for industry, services offered, location, size, ratings, and third-party listing presence.
    61
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Access industrial fingerprint data for insight into supply chain and company performance
    MIT