callwitness  /  baseline

What MCP servers actually return

Every published measurement of MCP context cost counts the schemas a server declares at install time. Nobody counts what it hands the model at runtime, because nobody runs the servers. This is that measurement.

140 calls 65 of 82 servers 1,070 tools declared generated 2026-09-13 commit 08abf3c

Declared size does not predict delivered size. Not loosely — not at all.

mcp-deepwiki declares 774 B of schema, close to the smallest menu in the census, and returned 62 KB in a single call — 81x its declared size. mcp-sympy declares 63 KB and returned 198 B. Ranked by what they declare, these two servers sit at opposite ends of the table from where they land when ranked by what they deliver.

The install-time number, in other words, tells you almost nothing about the runtime cost — and the install-time number is the only one anyone currently publishes.

Declared against delivered

100 B 1 KB 10 KB 100 KB 1.0 MB mcp-deepwiki mcp-deepwiki declared 774 B and returned 62 KB (81x) 81x shadcn-ui-mcp-server shadcn-ui-mcp-server declared 3 KB and returned 193 KB (62x) mcp-chess mcp-chess declared 3 KB and returned 40 KB (13x) mcp-trends-hub mcp-trends-hub declared 12 KB and returned 131 KB (11x) server-filesystem server-filesystem declared 13 KB and returned 97 KB (7.46x) rcsb-mcp rcsb-mcp declared 82 KB and returned 496 KB (6.01x) mermaid-mcp-server mermaid-mcp-server declared 2 KB and returned 6 KB (3.54x) react-spectrum/mcp react-spectrum/mcp declared 4 KB and returned 9 KB (2.23x) shadcn-ui-mcp-server shadcn-ui-mcp-server declared 2 KB and returned 3 KB (2.09x) mcp-server-tree-sitter mcp-server-tree-sitter declared 21 KB and returned 36 KB (1.71x) duckduckgo-mcp-server duckduckgo-mcp-server declared 5 KB and returned 8 KB (1.64x) primeng/mcp primeng/mcp declared 8 KB and returned 14 KB (1.62x) primevue/mcp primevue/mcp declared 8 KB and returned 13 KB (1.54x) geocode-mcp geocode-mcp declared 497 B and returned 655 B (1.32x) server-everything server-everything declared 8 KB and returned 10 KB (1.24x) mcp-gnu-units mcp-gnu-units declared 10 KB and returned 10 KB (0.99x) chrome-devtools-mcp chrome-devtools-mcp declared 26 KB and returned 25 KB (0.97x) mcp-server-git mcp-server-git declared 6 KB and returned 5 KB (0.91x) crossref-mcp crossref-mcp declared 11 KB and returned 9 KB (0.86x) markitdown-mcp markitdown-mcp declared 318 B and returned 264 B (0.83x) mcp-dice mcp-dice declared 335 B and returned 261 B (0.78x) knip/mcp knip/mcp declared 4 KB and returned 3 KB (0.76x) uuid-mcp uuid-mcp declared 185 B and returned 129 B (0.70x) mcp-geo mcp-geo declared 18 KB and returned 12 KB (0.63x) mcp-hn mcp-hn declared 2 KB and returned 951 B (0.57x) unit-converter-mcp unit-converter-mcp declared 15 KB and returned 8 KB (0.52x) mcp-nixos mcp-nixos declared 7 KB and returned 3 KB (0.48x) mcp-youtube-transcript mcp-youtube-transcript declared 4 KB and returned 2 KB (0.42x) polars-mcp polars-mcp declared 4 KB and returned 2 KB (0.41x) pypi-query-mcp-server pypi-query-mcp-server declared 13 KB and returned 5 KB (0.39x) mcp-server-fetch-python mcp-server-fetch-python declared 2 KB and returned 665 B (0.35x) mcp-server-calculator mcp-server-calculator declared 421 B and returned 129 B (0.31x) open-meteo-mcp open-meteo-mcp declared 2 KB and returned 580 B (0.30x) calculator-mcp-server calculator-mcp-server declared 294 B and returned 77 B (0.26x) mcp-server-fetch mcp-server-fetch declared 1 KB and returned 281 B (0.24x) mcp-server-time mcp-server-time declared 1 KB and returned 235 B (0.19x) readability-mcp readability-mcp declared 2 KB and returned 269 B (0.17x) swiss-holidays-mcp swiss-holidays-mcp declared 44 KB and returned 7 KB (0.16x) code-index-mcp code-index-mcp declared 9 KB and returned 1 KB (0.15x) dictionary-mcp-server dictionary-mcp-server declared 7 KB and returned 969 B (0.13x) wikipedia-mcp wikipedia-mcp declared 23 KB and returned 3 KB (0.11x) mcp-molecules mcp-molecules declared 7 KB and returned 765 B (0.11x) arxiv-mcp-server arxiv-mcp-server declared 18 KB and returned 2 KB (0.11x) math-mcp math-mcp declared 1 KB and returned 153 B (0.11x) orcid-mcp-server orcid-mcp-server declared 3 KB and returned 327 B (0.11x) pubchem_mcp_server pubchem_mcp_server declared 1 KB and returned 135 B (0.10x) feed-mcp feed-mcp declared 3 KB and returned 319 B (0.10x) server-sequential-thinking server-sequential-thinking declared 5 KB and returned 338 B (0.07x) calculator-mcp calculator-mcp declared 1 KB and returned 99 B (0.07x) mantine/mcp-server mantine/mcp-server declared 1 KB and returned 78 B (0.06x) uniprot-mcp-server uniprot-mcp-server declared 56 KB and returned 3 KB (0.05x) mcp-server-math mcp-server-math declared 4 KB and returned 204 B (0.05x) astronomy-mcp astronomy-mcp declared 7 KB and returned 319 B (0.04x) mcp-ast-explorer mcp-ast-explorer declared 5 KB and returned 172 B (0.04x) mcp-abacus mcp-abacus declared 33 KB and returned 935 B (0.03x) registry-mcp registry-mcp declared 145 KB and returned 4 KB (0.03x) mcp-yahoo-finance mcp-yahoo-finance declared 4 KB and returned 101 B (0.03x) random-number-mcp random-number-mcp declared 5 KB and returned 127 B (0.03x) browser-tools-mcp browser-tools-mcp declared 26 KB and returned 558 B (0.02x) kegg-mcp-server kegg-mcp-server declared 109 KB and returned 2 KB (0.02x) server-memory server-memory declared 11 KB and returned 173 B (0.02x) playwright-mcp-server playwright-mcp-server declared 14 KB and returned 129 B (0.01x) playwright/mcp playwright/mcp declared 19 KB and returned 167 B (0.01x) mcp-numpy mcp-numpy declared 38 KB and returned 208 B (0.01x) mcp-sympy mcp-sympy declared 63 KB and returned 198 B (0.00x) 0.00x
declared at install time (tools/list) largest single response observed
65 servers where both halves were measured, ordered by ratio. Logarithmic scale — the delivered values span four orders of magnitude, and a linear axis would stack fifteen of these rows on one pixel. Hover any pair for its numbers.

The distribution

580 B
median response
36 KB
95th percentile
496 KB
largest observed
6,437x
min to max spread

A typical tool response is 580 B. One in twenty is 36 KB or larger. The largest single response measured was 496 KB, from 774 B of declared schema and a handful of bytes of argument.

This is why a fixed context budget behaves unpredictably in practice: the cut point is static, and the pressure on it varies by 6,437x depending on which argument the model happens to pick at runtime.

The same server, measured twice

Two censuses have been run. mcp-deepwiki appears in both, declaring the same 774 B of schema each time, and the size it handed back moved by 11x:

rundeclareddeliveredratio
first census774 B701 KB906x
second census774 B62 KB81x

Nothing about the server changed. Its declared size is a constant; only the argument differed. Whatever an install-time number can tell you, it could not have told you this — and no ranking built on declared size survives a 11x swing in what actually gets delivered.

Both runs are published, as census/data/census-r1.jsonl and census/data/census.jsonl. The comparison above is computed from them rather than typed in.

Every measured server

packagedeclared largest returnedratiocalls
mcp-deepwiki774 B62 KB81x1
@jpisnice/shadcn-ui-mcp-server3 KB193 KB62x3
mcp-chess3 KB40 KB13x3
mcp-trends-hub12 KB131 KB11x11
@modelcontextprotocol/server-filesystem13 KB97 KB7.46x3
rcsb-mcp82 KB496 KB6.01x2
mermaid-mcp-server2 KB6 KB3.54x2
@react-spectrum/mcp4 KB9 KB2.23x2
@heilgar/shadcn-ui-mcp-server2 KB3 KB2.09x2
mcp-server-tree-sitter21 KB36 KB1.71x3
duckduckgo-mcp-server5 KB8 KB1.64x1
@primeng/mcp8 KB14 KB1.62x3
@primevue/mcp8 KB13 KB1.54x3
geocode-mcp497 B655 B1.32x1
@modelcontextprotocol/server-everything8 KB10 KB1.24x8
mcp-gnu-units10 KB10 KB0.99x2
chrome-devtools-mcp26 KB25 KB0.97x6
mcp-server-git6 KB5 KB0.91x2
crossref-mcp11 KB9 KB0.86x7
markitdown-mcp318 B264 B0.83x1
mcp-dice335 B261 B0.78x1
@knip/mcp4 KB3 KB0.76x1
uuid-mcp185 B129 B0.70x1
mcp-geo18 KB12 KB0.63x3
mcp-hn2 KB951 B0.57x1
unit-converter-mcp15 KB8 KB0.52x2
mcp-nixos7 KB3 KB0.48x1
@sinco-lab/mcp-youtube-transcript4 KB2 KB0.42x1
polars-mcp4 KB2 KB0.41x1
pypi-query-mcp-server13 KB5 KB0.39x2
mcp-server-fetch-python2 KB665 B0.35x1
mcp-server-calculator421 B129 B0.31x1
open-meteo-mcp2 KB580 B0.30x1
calculator-mcp-server294 B77 B0.26x1
mcp-server-fetch1 KB281 B0.24x1
mcp-server-time1 KB235 B0.19x1
readability-mcp2 KB269 B0.17x1
swiss-holidays-mcp44 KB7 KB0.16x3
code-index-mcp9 KB1 KB0.15x4
dictionary-mcp-server7 KB969 B0.13x1
wikipedia-mcp23 KB3 KB0.11x1
mcp-molecules7 KB765 B0.11x2
arxiv-mcp-server18 KB2 KB0.11x4
math-mcp1 KB153 B0.11x2
orcid-mcp-server3 KB327 B0.11x1
pubchem_mcp_server1 KB135 B0.10x1
feed-mcp3 KB319 B0.10x1
@modelcontextprotocol/server-sequential-thinking5 KB338 B0.07x1
@wrtnlabs/calculator-mcp1 KB99 B0.07x1
@mantine/mcp-server1 KB78 B0.06x1
uniprot-mcp-server56 KB3 KB0.05x1
mcp-server-math4 KB204 B0.05x1
astronomy-mcp7 KB319 B0.04x1
mcp-ast-explorer5 KB172 B0.04x1
mcp-abacus33 KB935 B0.03x3
registry-mcp145 KB4 KB0.03x1
mcp-yahoo-finance4 KB101 B0.03x1
random-number-mcp5 KB127 B0.03x1
@agentdeskai/browser-tools-mcp26 KB558 B0.02x9
kegg-mcp-server109 KB2 KB0.02x2
@modelcontextprotocol/server-memory11 KB173 B0.02x2
@executeautomation/playwright-mcp-server14 KB129 B0.01x1
@playwright/mcp19 KB167 B0.01x3
mcp-numpy38 KB208 B0.01x2
mcp-sympy63 KB198 B0.00x1

17 further servers declared a menu but exposed no tool that could be called safely without side effects, so they have a declared size and no delivered one. They are in the raw data with their declared sizes intact.

What this is not

140 calls across 65 servers, on one machine. That is a small sample, and it is the weakest thing about this work. I could not find another published measurement of delivered size, which makes this the best number available and still a thin one. If one exists, I would rather cite it than be the only source.

Every figure here carries its n. If you take a number from this page, take the n with it.

The servers were exercised with read-only tools chosen by an allowlist, one request at a time. Nothing was written, deleted or executed. Servers that refused without credentials, and servers that would not start, are published as part of the dataset rather than dropped from it — a census that silently excludes its failures is not a census.

The full method, every server that failed and why, and the rule that decided which tools were safe to call: how the census was taken.

Use it

The distribution is published as a versioned document, not a number in a blog post. Fetch it rather than copying constants, and it improves without you editing anything:

https://callwitness.tech/baseline/v1.json

Inside callwitness.baseline.v1, field names, units and meanings will not change. A breaking change becomes v2 at a new path, and v1 keeps resolving. Every server carries its per-call sizes, not only the aggregate, and returned_bytes_all holds every delivered size in one sorted list so any percentile is a line of code away.

Measure your own servers

These are someone else's servers. Yours will differ, and the numbers that matter for your context budget are yours:

pip install callwitness
callwitness run --label docs -- npx -y <your mcp server>
callwitness baseline --out mine.json

That produces the same schema, from your traffic. Anything reading the public baseline reads your file unchanged — the only field to branch on is origin, which is "census" in the published document and "local" in yours.

Make the baseline less thin

The sample above is one person's afternoon. callwitness contribute sends the shape of your traffic — sizes, counts and durations, never arguments, paths, hostnames or results — to widen it. It is off unless you turn it on, nothing is sent while the proxy is running, and --dry-run prints the exact bytes that would leave.