DEV Community

MCP Token Saver
MCP Token Saver

Posted on

I Benchmarked 10 MCP Servers — One of Them Burns 47K Tokens Just to Say Hello

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": []
  }
}
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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}"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Caches schemas — injects tool definitions once, not per conversation
  2. Strips result wrapping — returns clean text, not {"content":[{"type":"text","text":"..."}]}
  3. 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
Enter fullscreen mode Exit fullscreen mode
{
  "mcpServers": {
    "filesystem": {
      "command": "mcptoon",
      "args": ["serve", "--stdio", "npx", "@anthropic/mcp-filesystem"]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Zero dependencies. 250KB. 486 tests. Works with Claude Code, Cursor, and any agent that speaks MCP.


The methodology (so you can reproduce)

  1. Installed each MCP server via npx or pip
  2. Connected via stdio MCP protocol
  3. Called tools/list on each server
  4. Counted tokens using tiktoken (cl100k_base encoding)
  5. Measured result wrapping by calling tools/call 20 times per server
  6. 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)

Collapse
 
max_quimby profile image
Max Quimby

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.list variant 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 operation enum.

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?

Collapse
 
reidmarlow profile image
Reid Marlow

The schema number is the one that jumps out. People usually blame tool descriptions because they are visible text, but inputSchema is 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.

Collapse
 
mcptokensaver profile image
MCP Token Saver

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.

Collapse
 
mcptokensaver profile image
MCP Token Saver

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.

Collapse
 
mcptokensaver profile image
MCP Token Saver

@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.

Collapse
 
eduzsh profile image
Edu Peralta

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.

Collapse
 
mcptokensaver profile image
MCP Token Saver

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.