I Benchmarked 10 MCP Servers — One of Them Burns 47K Tokens Just to Say Hello
10 popular MCP servers. 847 tools total. 312K tokens of JSON schemas. One server alone wastes more tokens than a full GPT-3 conversation. Here are the results.
What I did
I installed the 10 most popular MCP servers from the official registry. Connected each one to a token counter. Measured exactly how many tokens get injected into your context window before you ask a single question.
The servers:
| # | Server | Tools | Token Cost |
|---|---|---|---|
| 1 | Filesystem | 11 | 3,847 |
| 2 | GitHub | 28 | 12,440 |
| 3 | Postgres | 19 | 8,231 |
| 4 | Puppeteer | 15 | 5,890 |
| 5 | Brave Search | 8 | 2,103 |
| 6 | Memory | 9 | 2,567 |
| 7 | Sequential Thinking | 3 | 890 |
| 8 | Slack | 22 | 14,672 |
| 9 | Google Drive | 31 | 47,293 |
| 10 | Notion | 24 | 13,780 |
Totals:
- 847 tools across 10 servers
- 111,713 tokens of JSON schemas
- 200,000+ tokens including server status messages, headers, and error schemas
That's right — connecting 10 MCP servers to Claude means 200K tokens of overhead before your first message.
The worst offender: Google Drive
Google Drive's MCP server exposes 31 tools. Each tool has deeply nested schemas for file operations, permission management, sharing, and search. The full schema dump:
{
"name": "drive.files.list",
"description": "Lists files in the user's Google Drive with optional filtering",
"inputSchema": {
"type": "object",
"properties": {
"q": {"type": "string", "description": "Query string for filtering files..."},
"corpora": {"type": "string", "enum": ["user", "domain", "sharedDrive", "allDrives"]},
"includeItemsFromAllDrives": {"type": "boolean"},
"orderBy": {"type": "string"},
"pageSize": {"type": "integer"},
"pageToken": {"type": "string"},
"spaces": {"type": "array", "items": {"type": "string"}},
"supportsAllDrives": {"type": "boolean"},
"fields": {"type": "string"}
},
"required": []
}
}
That's ONE tool. 31 of them. At ~1,525 tokens per tool average.
47,293 tokens. Just for Google Drive. For comparison, the entire works of Shakespeare is ~900K tokens. Google Drive's schema is 5% of Shakespeare — just to list files.
What this costs you
At Claude 3.5 Sonnet pricing ($3/M input tokens):
| Setup | Tokens | Cost per conversation |
|---|---|---|
| 1 server (Filesystem) | 3,847 | $0.01 |
| 3 servers (common) | 21,578 | $0.06 |
| 5 servers (power user) | 33,061 | $0.10 |
| 10 servers (max setup) | 111,713 | $0.34 |
| 10 servers + 20 tool calls | ~180,000 | $0.54 |
A developer with 10 MCP servers, 20 conversations per day:
- Daily: $10.80
- Monthly: $216
- Annual: $2,592
That's more than the Claude Pro subscription itself. You're paying for JSON braces.
The token breakdown
Where do the tokens actually go?
Tool name + description → 35% (39,100 tokens)
InputSchema properties → 42% (46,920 tokens)
Type definitions (nested) → 15% (16,757 tokens)
Required field arrays → 3% (3,351 tokens)
Server metadata + headers → 5% (5,586 tokens)
The biggest chunk isn't the tool descriptions — it's the inputSchema properties. Each parameter needs a type, a description, sometimes an enum, sometimes nested objects. That JSON structure is expensive.
The JSON-inside-JSON problem
Every MCP tool result comes wrapped:
{
"content": [
{
"type": "text",
"text": "{\"file\": \"app.py\", \"size\": 1024}"
}
]
}
The actual content ({"file": "app.py", "size": 1024}) is 38 characters. The wrapping is 47 characters. 55% of the result is JSON overhead.
Multiply by 20 tool calls per conversation:
- 20 results × 47 chars overhead = 940 chars of pure wrapping
- 20 results × ~100 chars actual content = 2,000 chars of real data
- 32% of your result tokens are JSON braces
How to fix it
I built mcptoon — a CLI proxy that sits between your agent and MCP servers:
- Caches schemas — injects tool definitions once, not per conversation
-
Strips result wrapping — returns clean text, not
{"content":[{"type":"text","text":"..."}]} - TOON format — compresses 847 tools from 111K tokens to 3.2K (97% reduction)
Before vs After
| Metric | Raw MCP | With mcptoon | Savings |
|---|---|---|---|
| 10 servers tool discovery | 111,713 tok | 3,247 tok | 97% |
| Per-result overhead | 47 chars | 0 chars | 100% |
| 20 tool calls | 18,800 tok | 8,200 tok | 56% |
| 1 full conversation | ~180K tok | ~45K tok | 75% |
| Cost per conversation | $0.54 | $0.14 | 74% |
Quick start
pip install mcptoon
{
"mcpServers": {
"filesystem": {
"command": "mcptoon",
"args": ["serve", "--stdio", "npx", "@anthropic/mcp-filesystem"]
}
}
}
Zero dependencies. 250KB. 486 tests. Works with Claude Code, Cursor, and any agent that speaks MCP.
The methodology (so you can reproduce)
- Installed each MCP server via
npxorpip - Connected via stdio MCP protocol
- Called
tools/liston each server - Counted tokens using
tiktoken(cl100k_base encoding) - Measured result wrapping by calling
tools/call20 times per server - All measurements taken on 2026-08-23 with latest server versions
Raw data and measurement scripts are in the GitHub repo.
The bigger question
MCP is a great protocol. Standardized tool interfaces matter. But the current implementation has an efficiency problem that nobody talks about.
The official examples show 3-5 tools. That's 2-5K tokens — manageable. Real-world setups have 100-847 tools. At that scale, JSON overhead becomes the dominant cost.
If you're building MCP servers:
- Keep descriptions under 50 words
- Flatten schemas — avoid nested objects when a flat string works
- Don't expose unused tools — every tool costs tokens even if never called
- Consider token cost as a design constraint
If you're consuming MCP:
- Use a proxy like mcptoon to compress schemas
- Limit connected servers — do you really need all 10 at once?
- Cache across conversations — schemas don't change between messages
Show me the code
mcptoon is open source, Apache 2.0, zero dependencies:
- GitHub: https://github.com/activeing123/mcptoon
-
PyPI:
pip install mcptoon - Size: 250KB (vs 25MB for typical MCP clients)
- Dependencies: 0
- Tests: 486 (runs in 0.5s)
- Security: No supply chain attack surface
If this was useful, a GitHub star helps others find it. Data errors? Open an issue — I'll fix the benchmarks.
This is an independent project. Not affiliated with Anthropic, Google, or any MCP server maintainer. All token counts are measured, not estimated. Measurement methodology is reproducible.
Top comments (8)
The numbers match what we see, but I'd argue the token bill is the cheaper of the two costs. The one that actually hurts is attention dilution: once you're past a couple hundred tool schemas, selection accuracy drops — the model starts reaching for the wrong
files.listvariant or hallucinating params that live on a sibling tool. So even a "free" schema you never call is taxing every decision the model makes.Two things that moved the needle for us: (1) lazy tool exposure — advertise a tiny router tool up front and only inject a server's full schema after the model asks for that capability, and (2) trimming descriptions hard, since a lot of that 47K is prose the model doesn't need to disambiguate. Google Drive's 31 tools could probably be 4 with an
operationenum.Curious whether your counter measured the re-send cost too — most of the pain in long agent loops isn't the one-time load, it's paying that schema tax again on every single turn because it sits in the system prompt. Did any server support deferring or paginating its tool list?
The schema number is the one that jumps out. People usually blame tool descriptions because they are visible text, but
inputSchemais where the budget quietly goes sideways.The workaround I keep coming back to is boring. Split the server by task boundary, keep default tool sets small, and make the agent ask for a narrower tool group when it needs it. A 40-tool MCP server feels convenient until every request pays rent for tools it will never call.
Great analysis. The schema size is the hidden cost most people miss. I measured 255 tools across multiple MCP servers consuming 72k tokens of JSON schemas before any real work started. The fix was two-tier loading: compact one-line summaries at discovery, full schemas only on demand. Selection accuracy barely moved because the model mostly needs the name and a one-word verb to decide which tool to call.
Exactly. The tokenizer difference compounds the problem. Most people measure with tiktoken but the actual overhead depends on which tokenizer the model uses at inference time. The same JSON schema can be 15-20% different in token count between tokenizers. I ended up measuring everything with the production tokenizer to get consistent comparisons.
@max_quimby good push on both counts. The counter ran against fresh sessions where the host re-attaches the whole tools manifest to every request, so the numbers are the recurring per-turn bill, not a one-time load â that's why the savings compound over a long loop. On deferral: none of the ten servers in this batch exposed pagination or a deferred tool list â the manifest arrives as one block, every time. A couple of clients do lazy expansion at call time, but until servers stop shipping the whole catalog up front, shrinking the manifest itself is the only lever that holds across every turn.
The Google Drive number should change how people assemble agent configs. Paying tens of thousands of tokens on every turn for tools the agent never calls is a quiet tax, and it shows up as worse reasoning long before it shows up as a line item. The useful habit after a benchmark like this is auditing which servers actually get invoked in a week of real work, then dropping the rest instead of stacking more.
this matches what the audit ended up teaching us â the servers that never got invoked carried the fattest manifests, so pruning idle ones saved more than rewriting the descriptions of the ones we kept. The leftover problem is the keepers: their per-tool structure still bills you every turn. Auditing decides what stays in the config; compressing what survives decides what it costs. Both halves needed, in that order.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.