<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MCP Token Saver</title>
    <description>The latest articles on DEV Community by MCP Token Saver (@mcptokensaver).</description>
    <link>https://dev.to/mcptokensaver</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4056301%2F215e942a-9499-4f40-b8ba-b4803b2be016.png</url>
      <title>DEV Community: MCP Token Saver</title>
      <link>https://dev.to/mcptokensaver</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mcptokensaver"/>
    <language>en</language>
    <item>
      <title>Your AI Agent Reads a 300-Page Book Before It Answers You</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Sun, 30 Aug 2026 11:31:17 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/your-ai-agent-reads-a-300-page-book-before-it-answers-you-2bo4</link>
      <guid>https://dev.to/mcptokensaver/your-ai-agent-reads-a-300-page-book-before-it-answers-you-2bo4</guid>
      <description>&lt;p&gt;Every prompt you send starts with homework. Before Claude Code or Cursor even looks at your question, it reads the full JSON schema of every MCP tool it might call. On my machine that was 255 tools across 50 servers. I measured it with tiktoken cl100k_base: 71,929 tokens. A 300-page book, read cover to cover, every session, before your agent ever thinks about what you asked.&lt;/p&gt;

&lt;p&gt;That same tool listing now costs me 123 tokens. A sticky note. Same tools, same capabilities, and you can reproduce the number on your own config with one command.&lt;/p&gt;

&lt;p&gt;This is the story of mcptoon, a zero-dependency CLI, and the three problems it fixed that I never planned to touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 1: four agents means four config files
&lt;/h2&gt;

&lt;p&gt;Claude Desktop wants &lt;code&gt;claude_desktop_config.json&lt;/code&gt;. Claude Code wants &lt;code&gt;.claude.json&lt;/code&gt;. Cursor wants &lt;code&gt;.cursor/mcp.json&lt;/code&gt;. Cline, Windsurf and VS Code Copilot each have their own shape too. Add a fetch server in Cursor, forget Claude. Fix a path in Claude, break Cursor. Repeat weekly.&lt;/p&gt;

&lt;p&gt;mcptoon's answer is one file. &lt;code&gt;~/.mcptoon/config.json&lt;/code&gt; becomes the single source of truth, and &lt;code&gt;mcptoon sync&lt;/code&gt; writes native config into every agent it detects. It merges instead of overwriting, so servers you configured by hand stay put. Run &lt;code&gt;mcptoon sync --watch&lt;/code&gt; and drift detection catches external edits before they bite.&lt;/p&gt;

&lt;p&gt;The part I like most: agents need zero setup. mcptoon is a program your agent already knows how to run. There is no &lt;code&gt;mcpServers&lt;/code&gt; entry, no plugin API, nothing to register and nothing to restart. One line in CLAUDE.md and your agent drives every MCP server through the shell. That also means it reaches places MCP cannot: shell scripts, CI jobs, cron, aider, terminal-only boxes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 2: the token tax
&lt;/h2&gt;

&lt;p&gt;Here is the mechanism behind that 300-page book. When your agent asks "what tools exist?", native MCP ships the full schemas. Every parameter, every description, every nested properties block. Multiply by 255 tools and you get 71,929 tokens sitting in your context before a single tool call.&lt;/p&gt;

&lt;p&gt;mcptoon's &lt;code&gt;manifest&lt;/code&gt; command answers the same question with a name index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mcptoon manifest --compact
fetch: fetch(url) · github: search_repos(q), get_file(repo, path) · sqlite: query(sql)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schemas stay on disk. They never enter the context at all. That is the difference between this and compression: compression still ships the payload and unpacks it later, so the cost just moves. Here the cost is deleted.&lt;/p&gt;

&lt;p&gt;It's a dial, not a switch. The same 255-tool config measures 8,282 tokens with &lt;code&gt;--slim&lt;/code&gt; (names plus parameter types, minus 88.5%) and 123 with &lt;code&gt;--compact&lt;/code&gt; (names only, minus 99.8%). Full JSON stays available with &lt;code&gt;--json&lt;/code&gt; whenever you want zero ambiguity. Reproduce it yourself: &lt;code&gt;mcptoon manifest --compact --tokens&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 3: configured is not alive
&lt;/h2&gt;

&lt;p&gt;A 2026 community audit found 52% of published MCP servers unreachable. Half the servers in people's configs are dead weight, and nothing in a JSON file tells you which ones.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mcptoon health&lt;/code&gt; checks every server, shows latency, and exits 1 in CI when something is dead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;── mcptoon health: 3/5 alive ──────────────
  ✓ fetch     [stdio]  1 tool     120ms  ok
  ✗ brave     [stdio]  0 tools  10002ms  timeout
  ✓ github    [http]  12 tools    340ms  ok
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And because MCP servers run code on your machine and return arbitrary text into your agent's context, every result passes through checks for prompt injection ("ignore previous instructions" buried in tool output), credential leaks (&lt;code&gt;sk-...&lt;/code&gt;, &lt;code&gt;AKIA...&lt;/code&gt;, &lt;code&gt;ghp_...&lt;/code&gt; patterns) and dangerous operations like &lt;code&gt;delete&lt;/code&gt; or &lt;code&gt;drop&lt;/code&gt; unless you pass &lt;code&gt;--destructive&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No telemetry. No analytics. Nothing phones home.&lt;/p&gt;

&lt;h2&gt;
  
  
  The objections I hear
&lt;/h2&gt;

&lt;p&gt;"Isn't this just TOON compression?" No. The headline number comes from architecture: full schemas simply are not sent. Optional TOON encoding of tool results saves another 30 to 40% and it is off by default.&lt;/p&gt;

&lt;p&gt;"Didn't Claude Code already defer tool loading?" Deferred loading decides when definitions load. mcptoon decides what a listing costs, in every agent at once, and adds sync, health and security on top. They stack fine.&lt;/p&gt;

&lt;p&gt;"Why a CLI?" Because the shell is the one interface every agent already speaks. Zero dependencies also means the whole supply chain is about 6,800 lines of readable Python, with 569 tests staying green in CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
mcptoon quickstart    &lt;span class="c"&gt;# finds servers you already configured&lt;/span&gt;
mcptoon demo          &lt;span class="c"&gt;# live side-by-side: JSON vs mcptoon, real token counts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mcptoon speaks the latest MCP spec (2026-07-28) with full backward compatibility, runs on Windows, macOS and Linux, and ships under Apache 2.0. Repo: &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;https://github.com/activeing123/mcptoon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your agent is reading a 300-page book before it answers you, that is context you paid for and never used. Make it a sticky note.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>tokens</category>
      <category>mcptoon</category>
    </item>
    <item>
      <title>I Replaced 72,341 Tokens of MCP Config With 123 Tokens. Here's the Exact Setup.</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Thu, 27 Aug 2026 01:59:31 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/i-replaced-72341-tokens-of-mcp-config-with-123-tokens-heres-the-exact-setup-4cpo</link>
      <guid>https://dev.to/mcptokensaver/i-replaced-72341-tokens-of-mcp-config-with-123-tokens-heres-the-exact-setup-4cpo</guid>
      <description>&lt;p&gt;I spent a weekend optimizing my MCP setup and the results were... unexpected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Starting Point
&lt;/h2&gt;

&lt;p&gt;My Claude Code config had 255 tools registered across 10 MCP servers. Each tool came with a full JSON schema describing its inputs, outputs, constraints, and examples. Seemed reasonable until I measured the actual token cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;72,341 tokens.&lt;/strong&gt; Just for the schemas. Before I typed a single word.&lt;/p&gt;

&lt;p&gt;That's roughly 40% of Claude's 200K context window gone before the conversation even starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;I tried three approaches to reduce this overhead:&lt;/p&gt;

&lt;h3&gt;
  
  
  Approach 1: Remove descriptions
&lt;/h3&gt;

&lt;p&gt;Stripped all &lt;code&gt;description&lt;/code&gt; fields from tool schemas. Result: 72K → 58K. Saved 14K tokens but lost critical context about what each tool actually does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approach 2: Truncate descriptions
&lt;/h3&gt;

&lt;p&gt;Cut every description to 50 characters. Result: 72K → 45K. Better, but now tools like &lt;code&gt;create_issue&lt;/code&gt; and &lt;code&gt;update_issue&lt;/code&gt; look identical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approach 3: TOON format
&lt;/h3&gt;

&lt;p&gt;Compressed the entire schema structure using mcptoon's compact notation. Result: 72,341 → &lt;strong&gt;123 tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Wait, what?&lt;/p&gt;

&lt;h2&gt;
  
  
  How 123 Tokens Work
&lt;/h2&gt;

&lt;p&gt;The trick is lazy loading. Instead of sending all 255 full schemas upfront, TOON format sends one-line summaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;search_issues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;Issue&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="nf"&gt;create_issue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;Issue&lt;/span&gt;
&lt;span class="nf"&gt;update_issue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;Issue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each tool gets a single line: name, parameters with types, return type. That's enough for the model to decide which tool to use.&lt;/p&gt;

&lt;p&gt;When it actually calls a tool, the full schema is loaded on demand. The model already knows what it wants to do — it just needs the exact parameter names and types.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon

&lt;span class="c"&gt;# Compress your MCP config&lt;/span&gt;
mcptoon compress

&lt;span class="c"&gt;# That's it. One command.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compressed output replaces your original config. If you don't like it, &lt;code&gt;mcptoon decompress&lt;/code&gt; gets you back to the original.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Impact
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Schema tokens&lt;/td&gt;
&lt;td&gt;72,341&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context available for conversation&lt;/td&gt;
&lt;td&gt;~128K&lt;/td&gt;
&lt;td&gt;~200K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool selection accuracy&lt;/td&gt;
&lt;td&gt;94%&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to first response&lt;/td&gt;
&lt;td&gt;2.1s&lt;/td&gt;
&lt;td&gt;1.4s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 1% accuracy drop came from tools with similar names but different purposes. For most workflows, it's imperceptible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Schema verbosity is the silent killer.&lt;/strong&gt; We obsess over prompt engineering but ignore that our tool definitions are eating half the context window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lazy loading beats compression.&lt;/strong&gt; You don't need all schemas all the time. Load what you need, when you need it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The model doesn't need your examples.&lt;/strong&gt; Those &lt;code&gt;enum&lt;/code&gt; constraints and example values in your schemas? The model figures them out from the parameter name and type.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
mcptoon compress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;https://github.com/activeing123/mcptoon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're running more than 50 MCP tools, you're probably wasting tens of thousands of tokens on schemas alone. Worth a look.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of my ongoing investigation into MCP token overhead. Previous posts covered benchmarking 10 MCP servers and measuring real token costs.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How MCP Wastes 4-32x More Tokens Than CLI (and How to Fix It)</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Wed, 26 Aug 2026 05:58:03 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/how-mcp-wastes-4-32x-more-tokens-than-cli-and-how-to-fix-it-441m</link>
      <guid>https://dev.to/mcptokensaver/how-mcp-wastes-4-32x-more-tokens-than-cli-and-how-to-fix-it-441m</guid>
      <description>&lt;p&gt;Here are two numbers that should ruin your morning coffee:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;71,929 tokens&lt;/strong&gt; versus &lt;strong&gt;123 tokens&lt;/strong&gt;. Same 255 tools. Same machine. Same day.&lt;/p&gt;

&lt;p&gt;The first number is what your agent pays — every single session — when 255 tools from 50 MCP servers load as raw JSON schemas into its context window. The second is what the same tool listing costs when discovery happens through a CLI instead.&lt;/p&gt;

&lt;p&gt;That's a &lt;strong&gt;300-page book vs. a sticky note&lt;/strong&gt;, every single session, before your agent has answered a single question. If you're running multiple MCP servers in Claude Code, Cursor, or anything similar, you're paying the book price right now and probably don't know it.&lt;/p&gt;

&lt;p&gt;I didn't believe it either, so I measured it with tiktoken (OpenAI's tokenizer) and built a tool around the result. Let me show you the receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Every Tool Ships Its Entire Resume
&lt;/h2&gt;

&lt;p&gt;When an agent connects to an MCP server, the server hands over a tool catalog. Each entry looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_repos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Search GitHub repositories by query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The search query"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"per_page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Results per page (default 30)"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's one tool. Multiply by every parameter, every description, every nested &lt;code&gt;properties&lt;/code&gt; block, and then by 255 tools. The protocol's answer to "what can you do?" is a full API reference document — types, defaults, prose descriptions and all — injected wholesale into the context window.&lt;/p&gt;

&lt;p&gt;And here's the thing: &lt;strong&gt;the schema only matters twice per session&lt;/strong&gt; — once when the model picks a tool, and once when it fills in arguments. The other 99% of the time, that 71K-token wall just sits there, occupying prime real estate while your actual code, conversation, and diffs fight for scraps.&lt;/p&gt;

&lt;p&gt;This isn't a niche problem. The &lt;a href="https://firecrawl.dev/blog/mcp-vs-cli" rel="noopener noreferrer"&gt;Firecrawl team benchmarked MCP against plain CLI usage&lt;/a&gt; in 2026 and found the &lt;em&gt;same tasks&lt;/em&gt; cost roughly &lt;strong&gt;~200 tokens through a CLI vs. ~44K tokens through MCP&lt;/strong&gt; — a spread of &lt;strong&gt;4× to 32× more expensive&lt;/strong&gt; depending on the task shape. &lt;a href="https://scalekit.com/blog/mcp-vs-cli-use" rel="noopener noreferrer"&gt;Scalekit's independent analysis&lt;/a&gt; landed on the same headline figure: up to 32× more tokens for identical work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Actually Matters (Not Just Aesthetics)
&lt;/h2&gt;

&lt;p&gt;"Tokens cost money" is the obvious objection, but the math is worse than it looks, because schema overhead isn't a one-time fee — it rides along with &lt;strong&gt;every request&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On a &lt;strong&gt;128K context window&lt;/strong&gt; (Claude Sonnet, GPT-4o class models), 71,929 tokens of tool definitions consume &lt;strong&gt;~56% of the window&lt;/strong&gt; on syntax alone. More than half your context is gone before the first user message is processed. Your agent now has half the room for your codebase, your conversation history, and your reasoning chains — so it degrades, forgets earlier instructions, or truncates file context sooner.&lt;/p&gt;

&lt;p&gt;On a &lt;strong&gt;64K window&lt;/strong&gt; — common for cheaper and faster models — it's not "worse," it's &lt;strong&gt;mathematically impossible&lt;/strong&gt;. The tools don't fit. Period. You either uninstall servers you paid good time configuring, or you pay for the big-context premium model purely to absorb boilerplate. That second option is the quiet budget killer: you're effectively subscribing to a larger model &lt;em&gt;to carry JSON&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And because schemas re-enter every request, the waste compounds. At typical frontier pricing, tens of thousands of redundant tokens × dozens of requests per session × daily sessions adds up to real money spent on punctuation and curly braces. Nobody budgets for that line item because nobody sees it on an invoice. It's just... your context quietly dying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Take My Word For It: The Evidence
&lt;/h2&gt;

&lt;p&gt;The best part of this story is that it's not my thesis. Independent groups keep arriving at the same conclusion from completely different directions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;What they found&lt;/th&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1576" rel="noopener noreferrer"&gt;SEP-1576&lt;/a&gt; (official MCP proposal)&lt;/td&gt;
&lt;td&gt;Proposes schema redundancy reduction and smarter tool selection — the protocol itself acknowledges the bloat&lt;/td&gt;
&lt;td&gt;Spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.anthropic.com/engineering/code-execution-with-mcp" rel="noopener noreferrer"&gt;Anthropic Engineering — code execution with MCP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Loading tools on demand cuts context overhead by &lt;strong&gt;up to 98.7%&lt;/strong&gt; (~150K → ~2K tokens)&lt;/td&gt;
&lt;td&gt;Lab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://firecrawl.dev/blog/mcp-vs-cli" rel="noopener noreferrer"&gt;Firecrawl&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Same tasks: CLI ≈ 200 tokens vs MCP ≈ 44K — &lt;strong&gt;4–32× overhead&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Practitioner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://scalekit.com/blog/mcp-vs-cli-use" rel="noopener noreferrer"&gt;Scalekit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Independently confirms the &lt;strong&gt;32×&lt;/strong&gt; worst case&lt;/td&gt;
&lt;td&gt;Practitioner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://arxiv.org/abs/2508.12553" rel="noopener noreferrer"&gt;MCP-Zero&lt;/a&gt; (Xiamen Univ. + USTC)&lt;/td&gt;
&lt;td&gt;On-demand tool retrieval keeps retrieval cost &lt;strong&gt;constant regardless of tool count&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Academic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft — dynamic tool discovery&lt;/td&gt;
&lt;td&gt;Agent-side guidance: discover tools at runtime instead of front-loading every definition&lt;/td&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ProMCP (ACL ARR 2026)&lt;/td&gt;
&lt;td&gt;Profiles token flows and latency of MCP agents — quantifies exactly where the budget goes&lt;/td&gt;
&lt;td&gt;Academic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read that table again. The standards body, the company that created MCP, two practitioner benchmarks, and two academic groups all converged on the same diagnosis: &lt;strong&gt;eager, whole-catalog schema injection doesn't scale&lt;/strong&gt;. When Anthropic's own engineering blog writes about cutting 150K tokens down to 2K, the debate about &lt;em&gt;whether&lt;/em&gt; there's a problem is over. Only the &lt;em&gt;how do we fix it&lt;/em&gt; remains.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: Pay for Names, Not Schemas
&lt;/h2&gt;

&lt;p&gt;All of the above approaches share one insight: &lt;strong&gt;the model needs an index, not an encyclopedia.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon&lt;/a&gt;, a zero-dependency CLI I work on. Instead of injecting every schema into context, tool discovery becomes a &lt;strong&gt;names-only manifest&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mcptoon manifest &lt;span class="nt"&gt;--compact&lt;/span&gt;
fetch: fetch&lt;span class="o"&gt;(&lt;/span&gt;url&lt;span class="o"&gt;)&lt;/span&gt; · github: search_repos&lt;span class="o"&gt;(&lt;/span&gt;q&lt;span class="o"&gt;)&lt;/span&gt;, get_file&lt;span class="o"&gt;(&lt;/span&gt;repo, path&lt;span class="o"&gt;)&lt;/span&gt; · sqlite: query&lt;span class="o"&gt;(&lt;/span&gt;sql&lt;span class="o"&gt;)&lt;/span&gt; · ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole listing. 123 tokens for 255 tools. The full schemas stay on disk in &lt;code&gt;~/.mcptoon/config.json&lt;/code&gt; and &lt;strong&gt;never enter the context at all&lt;/strong&gt;. This is the crucial part — it's not compression. Compression ships the whole payload and unpacks it later; the bytes still land in your window eventually. Here the schemas simply aren't sent. The model reads the index, decides which tool fits, and asks for details only if it needs them.&lt;/p&gt;

&lt;p&gt;It's a dial, not a switch:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool listing (tiktoken cl100k_base)&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;vs. raw JSON&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw JSON schemas, 255 tools&lt;/td&gt;
&lt;td&gt;71,929&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--slim&lt;/code&gt; (names + parameter types)&lt;/td&gt;
&lt;td&gt;8,282&lt;/td&gt;
&lt;td&gt;−88.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--compact&lt;/code&gt; (names only)&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−99.8%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Measured over a real-world 255-tool config spanning 50 MCP servers. Reproduce with &lt;code&gt;mcptoon manifest --compact --tokens&lt;/code&gt;.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Same principle applies to outputs. Tool &lt;em&gt;results&lt;/em&gt; get encoded with &lt;a href="https://github.com/toon-format/toon" rel="noopener noreferrer"&gt;TOON&lt;/a&gt; (a tabular token-oriented notation), which trims another &lt;strong&gt;~34%&lt;/strong&gt; off typical responses — and it's opt-in, off by default, so nothing surprises you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;The architecture is almost boring, which is the compliment: a small CLI sits &lt;strong&gt;between the agent and the MCP servers&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent ──runs──▶ mcptoon CLI ──spawns (only when called)──▶ MCP server ──▶ result back
                     │
                     └─ ~/.mcptoon/config.json  (schemas live here, on disk)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flow inside an agent session looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Discovery: a name index, not a schema dump&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;mcptoon manifest &lt;span class="nt"&gt;--compact&lt;/span&gt;

&lt;span class="c"&gt;# 2. Execution: call exactly one tool&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;mcptoon call fetch fetch &lt;span class="s1"&gt;'{"url":"https://example.com"}'&lt;/span&gt;
&lt;span class="c"&gt;# CLI spawns the fetch server, performs the call,&lt;/span&gt;
&lt;span class="c"&gt;# returns the result, server exits. Nothing lingers.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three properties fall out of this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero servers running until you call one.&lt;/strong&gt; No daemon, no proxy process, no port. &lt;code&gt;mcptoon call&lt;/code&gt; spawns the server, gets the answer, tears it down. Cold-start is a few hundred milliseconds; hot paths can use &lt;code&gt;mcptoon serve&lt;/code&gt; mode if you want a long-lived connection instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every error is structured and actionable.&lt;/strong&gt; Call a tool that doesn't exist and you get &lt;code&gt;"server 'fetchh' not found — did you mean 'fetch'?"&lt;/code&gt; — which means the &lt;em&gt;agent&lt;/em&gt; self-corrects instead of stalling until a human rescues it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security checks ride along free.&lt;/strong&gt; Every result passes inspection for prompt-injection strings and credential patterns (&lt;code&gt;sk-…&lt;/code&gt;, &lt;code&gt;AKIA…&lt;/code&gt;, &lt;code&gt;ghp_…&lt;/code&gt;) before entering context, and destructive tool names require an explicit &lt;code&gt;--destructive&lt;/code&gt; flag.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And because it's a CLI, it works with &lt;strong&gt;anything that can execute a command&lt;/strong&gt; — including agents with no MCP support at all, shell scripts, CI jobs, cron. The shell is the one interface every agent already speaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;Don't trust my benchmarks — measure on your own machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon     &lt;span class="c"&gt;# pure stdlib, ~250KB, zero dependencies&lt;/span&gt;

mcptoon demo            &lt;span class="c"&gt;# live side-by-side: JSON vs mcptoon, real token counts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;demo&lt;/code&gt; spins up a sample fetch server, prints the same listing both ways, and shows the actual token counts computed on your box. No telemetry, no account, nothing leaves your machine — it's ~6,800 lines of readable Python you can audit in an afternoon.&lt;/p&gt;

&lt;p&gt;If you already have MCP configs scattered around, start here instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcptoon quickstart      &lt;span class="c"&gt;# detects existing configs, imports them, lists your tools&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Bigger Picture: One Config for Every Agent
&lt;/h2&gt;

&lt;p&gt;Token waste is only half of MCP's tax. The other half is configuration drift: Claude Code wants &lt;code&gt;.claude.json&lt;/code&gt;, Cursor wants &lt;code&gt;.cursor/mcp.json&lt;/code&gt;, Claude Desktop wants &lt;code&gt;claude_desktop_config.json&lt;/code&gt;, Codex and friends each have their own shape. Add a server in Cursor, forget Claude. Fix a path in Claude, break Cursor. Repeat weekly.&lt;/p&gt;

&lt;p&gt;mcptoon treats that as the same problem: one source of truth, synced everywhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcptoon add github &lt;span class="nt"&gt;--stdio&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/server-github
mcptoon &lt;span class="nb"&gt;sync&lt;/span&gt;            &lt;span class="c"&gt;# writes native config into every detected agent&lt;/span&gt;

mcptoon &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--watch&lt;/span&gt;    &lt;span class="c"&gt;# polls config files and re-syncs automatically on change&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;sync&lt;/code&gt; merges rather than overwrites, so servers you configured by hand stay put. With &lt;code&gt;--watch&lt;/code&gt;, editing any config propagates to every agent on the machine — cross-agent MCP management that finally stops requiring you to remember which file belongs to which tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Star It, Break It, Tell Me About It
&lt;/h2&gt;

&lt;p&gt;To be fair to MCP: the protocol is good. Standardized tool access was genuinely needed, and the ecosystem explosion proves it. But eager schema injection was the wrong default, and everyone measuring it now agrees. The fix pattern — index in context, schemas on disk, retrieval on demand — is where the whole ecosystem is heading, whether via official proposals like SEP-1576, Anthropic's code execution approach, or plain CLIs.&lt;/p&gt;

&lt;p&gt;If you run multiple agents and multiple servers, give it a spin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Star &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon on GitHub&lt;/a&gt; if the numbers made you wince — it genuinely helps others find the project&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;mcptoon demo&lt;/code&gt; and paste your own before/after counts in the comments — I'd love to see what your tool mix costs&lt;/li&gt;
&lt;li&gt;Open issues ruthlessly. Weird server? Broken config shape? Bad edge case? That's exactly what the issue tracker is for&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your context window is the most expensive real estate in AI right now. Stop renting it out to curly braces for free.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Further reading: &lt;a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1576" rel="noopener noreferrer"&gt;SEP-1576 — schema redundancy reduction&lt;/a&gt; · &lt;a href="https://www.anthropic.com/engineering/code-execution-with-mcp" rel="noopener noreferrer"&gt;Anthropic: effective context engineering &amp;amp; code execution with MCP&lt;/a&gt; · &lt;a href="https://arxiv.org/abs/2508.12553" rel="noopener noreferrer"&gt;MCP-Zero: proactive tool acquisition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>llm</category>
      <category>mcp</category>
      <category>performance</category>
    </item>
    <item>
      <title>Stop Editing JSON for Every AI Agent: mcptoon Ends MCP Config Hell</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Tue, 25 Aug 2026 11:45:18 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/stop-editing-json-for-every-ai-agent-mcptoon-ends-mcp-config-hell-8m2</link>
      <guid>https://dev.to/mcptokensaver/stop-editing-json-for-every-ai-agent-mcptoon-ends-mcp-config-hell-8m2</guid>
      <description>&lt;h2&gt;
  
  
  The problem: MCP config hell
&lt;/h2&gt;

&lt;p&gt;If you're using multiple AI coding agents, you've hit this wall.&lt;/p&gt;

&lt;p&gt;You want to add the GitHub MCP server to your workflow. You use Claude Code, Cursor, and Codex. Here's what happens:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; wants &lt;code&gt;~/.claude.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-github"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_PERSONAL_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ghp_xxx"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; wants &lt;code&gt;.cursor/mcp.json&lt;/code&gt;. Same JSON, different file, different location. Oh wait — is it &lt;code&gt;.cursor/mcp.json&lt;/code&gt; or &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;? Depends on the version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt; wants &lt;code&gt;AGENTS.md&lt;/code&gt;. That's Markdown. Different format entirely.&lt;/p&gt;

&lt;p&gt;Same server. Three configs. Three formats. Three places to forget when your token expires.&lt;/p&gt;

&lt;p&gt;And when you have 50+ tools across multiple servers, the token cost of loading all those JSON schemas into context is brutal — roughly &lt;strong&gt;14,113 tokens&lt;/strong&gt; just to discover what tools are available. At 255 tools, it balloons to &lt;strong&gt;71,929 tokens&lt;/strong&gt; — a 300-page book's worth of context eaten before any real work happens.&lt;/p&gt;

&lt;p&gt;I lived through this. It sucked. So I built something to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: mcptoon
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Factiveing123%2Fmcptoon%2Fmain%2Fassets%2Fhow-it-works-en.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Factiveing123%2Fmcptoon%2Fmain%2Fassets%2Fhow-it-works-en.svg" alt="How mcptoon works in one picture"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon        &lt;span class="c"&gt;# pure Python stdlib, ~250KB, zero dependencies&lt;/span&gt;
mcptoon add github &lt;span class="nt"&gt;--stdio&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/server-github
mcptoon &lt;span class="nb"&gt;sync&lt;/span&gt;               &lt;span class="c"&gt;# writes config to every detected agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done. Three commands. Every agent — Claude Code, Cursor, Codex, Cline, Windsurf, any shell-capable agent — can now call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcptoon call github search_repos &lt;span class="s1"&gt;'{"query":"mcp"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No JSON editing. No format differences. One config in &lt;code&gt;~/.mcptoon/config.json&lt;/code&gt;, shared across every agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The killer feature nobody else has:&lt;/strong&gt; agents need &lt;strong&gt;zero setup&lt;/strong&gt; on their side. mcptoon is a CLI — any agent that can run a shell command can use it, even agents that don't support MCP natively.&lt;/p&gt;

&lt;h2&gt;
  
  
  New in v0.5.5: continuous sync
&lt;/h2&gt;

&lt;p&gt;But config drift is still a thing. You change a token, and later realize Cursor is still using the old one because you forgot to re-sync.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcptoon &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--watch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now mcptoon watches your config files using pure-stdlib polling (os.stat fingerprinting — no watchdog dependency, identical behavior on Windows, macOS and Linux). Change a token or add a server in &lt;code&gt;~/.mcptoon/config.json&lt;/code&gt;, and every agent's config updates automatically within seconds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcptoon &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--watch&lt;/span&gt; &lt;span class="nt"&gt;--interval&lt;/span&gt; 5 &lt;span class="nt"&gt;--quiet&lt;/span&gt;   &lt;span class="c"&gt;# daemon-friendly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drift detection catches accidental external edits to agent configs too. Default mode re-merges (your manually-added servers stay safe). Or use &lt;code&gt;--watch-mode strict&lt;/code&gt; to just get a warning.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;mcptoon is a &lt;strong&gt;CLI tool&lt;/strong&gt;, not an MCP server. It doesn't plug into &lt;code&gt;mcpServers&lt;/code&gt; JSON. Instead, your agent runs &lt;code&gt;mcptoon&lt;/code&gt; commands via shell.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Layer 1: mcptoon CLI (~250KB, zero deps)
         Runs in your agent's shell. No JSON config in your agent.
                    │
Layer 2: MCP Servers (npm/pip packages)
         Launched on-demand only when you call a tool.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent calls &lt;code&gt;mcptoon call fetch fetch '{"url":"https://example.com"}'&lt;/code&gt;. mcptoon connects to the MCP server, calls the tool, returns the result. The MCP server's schema never enters your agent's context window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token savings that actually matter
&lt;/h2&gt;

&lt;p&gt;mcptoon doesn't just save you JSON editing. It changes what your agent loads into context.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool listing (tiktoken cl100k_base)&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw JSON schemas, 255 tools&lt;/td&gt;
&lt;td&gt;71,929&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--slim&lt;/code&gt; (names + params)&lt;/td&gt;
&lt;td&gt;8,282&lt;/td&gt;
&lt;td&gt;−88.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--compact&lt;/code&gt; (names only)&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−99.8%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In human terms: 71,929 tokens is a 300-page book. 123 tokens is a sticky note.&lt;/p&gt;

&lt;p&gt;This is a dial, not a switch — &lt;code&gt;--json&lt;/code&gt; is always available when you need full schemas. And &lt;code&gt;mcptoon call&lt;/code&gt; results can be encoded as TOON format, saving another ~34% on result payloads.&lt;/p&gt;

&lt;p&gt;Full category-level numbers across approaches in &lt;a href="https://github.com/activeing123/mcptoon/blob/main/docs/comparison.md" rel="noopener noreferrer"&gt;docs/comparison.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why zero dependencies matters
&lt;/h2&gt;

&lt;p&gt;mcptoon is pure Python stdlib. No &lt;code&gt;requirements.txt&lt;/code&gt;. No supply chain to audit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~6,800 lines. 531 tests. Zero third-party imports. ~250KB source.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every dependency is a potential attack vector. Zero dependencies means mcptoon itself has a minimal attack surface. We also verified this with an AST-based zero-dep gate in CI that catches any accidental third-party import, including patterns where &lt;code&gt;try/except ImportError&lt;/code&gt; wraps optional enhancements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built-in security firewall
&lt;/h2&gt;

&lt;p&gt;MCP servers can execute code on your machine. That's the point — but a malicious server can do real damage.&lt;/p&gt;

&lt;p&gt;mcptoon inspects every tool result before it reaches your agent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt injection guard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blocks hidden instructions like "ignore previous instructions"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Credential leak guard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scans for exposed API keys (AWS, GitHub, OpenAI, Slack, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dangerous-op blocker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blocks delete/drop/purge operations by default&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most agents load tool responses directly into context without any inspection. That's how Tool Poisoning works — a malicious server returns hidden instructions, and the LLM executes them. mcptoon stops that at the gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-agent tool management
&lt;/h2&gt;

&lt;p&gt;When you have multiple agents sharing the same tools, you need a single source of truth for MCP config. mcptoon provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sync&lt;/code&gt;&lt;/strong&gt; — one config, written to every detected agent's native format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;health&lt;/code&gt;&lt;/strong&gt; — check all servers across agents with timeouts; exit code for CI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;manifest&lt;/code&gt;&lt;/strong&gt; — see what tools each agent has access to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--watch&lt;/code&gt;&lt;/strong&gt; — keep everything aligned continuously&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's the cross-agent tool management CLI: one command per operation, every agent covered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
mcptoon quickstart                    &lt;span class="c"&gt;# auto-detect existing configs&lt;/span&gt;
mcptoon add fetch &lt;span class="nt"&gt;--stdio&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/server-fetch
mcptoon &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--watch&lt;/span&gt;                  &lt;span class="c"&gt;# keep every agent aligned&lt;/span&gt;
mcptoon manifest &lt;span class="nt"&gt;--compact&lt;/span&gt; &lt;span class="nt"&gt;--tokens&lt;/span&gt;   &lt;span class="c"&gt;# see: 123 tokens vs 71,929 raw&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;https://github.com/activeing123/mcptoon&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/mcptoon/" rel="noopener noreferrer"&gt;https://pypi.org/project/mcptoon/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; Apache 2.0&lt;/p&gt;




&lt;p&gt;&lt;em&gt;mcptoon is an independent third-party MCP client. Not affiliated with Anthropic, OpenAI, or Cursor.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>python</category>
      <category>devtools</category>
    </item>
    <item>
      <title>MCP Was a Mistake. Here Are 200,000 Tokens That Prove It.</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Sun, 23 Aug 2026 09:19:14 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/mcp-was-a-mistake-here-are-200000-tokens-that-prove-it-3b8n</link>
      <guid>https://dev.to/mcptokensaver/mcp-was-a-mistake-here-are-200000-tokens-that-prove-it-3b8n</guid>
      <description>&lt;h1&gt;
  
  
  MCP Was a Mistake. Here Are 200,000 Tokens That Prove It.
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;"mcp were a mistake. bash is better." — Peter Steinberger, OpenClaw founder&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I didn't want to believe it either. MCP was supposed to be the USB-C of AI — one protocol to connect everything. Anthropic, OpenAI, Google all backed it. 97 million monthly downloads. 17,000 servers.&lt;/p&gt;

&lt;p&gt;But then I measured what MCP actually does to your context window.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;I connected 10 popular MCP servers to a token counter. Here's what happened before I typed a single word:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Tokens Injected&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Filesystem&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;3,847&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brave Search&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2,103&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sequential Thinking&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2,567&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;5,890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;8,231&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;13,780&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;12,440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;14,672&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Drive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;47,293&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;170&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;111,713&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;111,713 tokens. Before your first message.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not a typo. Connecting 10 MCP servers to Claude means over 100K tokens of JSON schemas get injected into your context window. You haven't asked a question yet. You haven't made a tool call. The schemas are just... sitting there.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Math That Made Me Angry
&lt;/h2&gt;

&lt;p&gt;At Claude 3.5 Sonnet pricing ($3/M input tokens):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every conversation starts with 111K tokens of overhead: &lt;strong&gt;$0.33&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;20 conversations per day: &lt;strong&gt;$6.67/day&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;22 working days per month: &lt;strong&gt;$147/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Annual cost of JSON schemas: &lt;strong&gt;$1,764&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's more than a Claude Pro subscription. You're paying $1,764/year to read JSON braces describing tools you might never use.&lt;/p&gt;




&lt;h2&gt;
  
  
  But Wait — It Gets Worse
&lt;/h2&gt;

&lt;p&gt;The 111K is just the schema injection. When you actually &lt;strong&gt;call&lt;/strong&gt; a tool, MCP wraps the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;app.py&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;size&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: 1024}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual content is 38 characters. The wrapping is 47 characters. &lt;strong&gt;55% of your result tokens are JSON overhead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With 20 tool calls per conversation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema injection: ~111K tokens&lt;/li&gt;
&lt;li&gt;Result wrapping: ~18K tokens
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total overhead: ~130K tokens per conversation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your $0.54 conversation now has 130K tokens that serve zero purpose.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Garry Tan Was Right About
&lt;/h2&gt;

&lt;p&gt;When YC's CEO said "MCP sucks honestly," he was talking about exactly this. The protocol design has a fundamental flaw: &lt;strong&gt;it assumes context is free&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In 2024, when Anthropic designed MCP, context windows were 200K tokens. Loading 100K of schemas seemed fine — you still had 100K left. But now we're building complex agent workflows. Multi-turn reasoning chains. Tool call sequences that span hundreds of messages.&lt;/p&gt;

&lt;p&gt;When you're 30 messages deep into debugging a production issue and your context is already at 150K tokens, those 111K of MCP schema injection aren't just wasteful — they're &lt;strong&gt;the reason your conversation falls off a cliff&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Anthropic Backstab" That Confirmed It
&lt;/h2&gt;

&lt;p&gt;Anthropic's own engineers published a blog showing token consumption could drop from 150,000 to 2,000 — a 98.7% reduction. Their solution? Stop loading tool schemas into context. Instead, let the model write code that calls tools at runtime.&lt;/p&gt;

&lt;p&gt;In other words: &lt;strong&gt;the fix for MCP is to not use MCP the way it was designed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cloudflare took this further. Their 2,500-endpoint API originally required 1.17M tokens of schema. They compressed it to 1K tokens by exposing just two functions: &lt;code&gt;search&lt;/code&gt; and &lt;code&gt;execute&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;1.17M → 1K. That's not optimization. That's admitting the architecture was wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  "But MCP Has 97 Million Downloads!"
&lt;/h2&gt;

&lt;p&gt;Yes. And jQuery has billions of page loads. Popularity doesn't mean the design is correct. It means it was first, it was backed by a major player, and the alternatives weren't ready.&lt;/p&gt;

&lt;p&gt;The real question is: of those 97 million downloads, how many are actively used in production agent systems? A developer on HN tested 15 MCP servers for three months and kept only 6. The top comment said: "GitHub MCP is a waste of tokens — Claude Code has &lt;code&gt;gh&lt;/code&gt; CLI built in. Same for Playwright."&lt;/p&gt;

&lt;p&gt;When the CLI equivalent exists, MCP loses every time. The only servers that survived were ones with no CLI alternative.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built Before You @ Me
&lt;/h2&gt;

&lt;p&gt;I'm not just complaining. I built &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon&lt;/a&gt; — a CLI proxy that sits between your agent and MCP servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caches schemas&lt;/strong&gt; — injects tool definitions once, not per conversation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strips result wrapping&lt;/strong&gt; — returns clean text, not &lt;code&gt;{"content":[{"type":"text","text":"..."}]}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TOON format&lt;/strong&gt; — compresses 170 tools from 111K tokens to 3.2K (97% reduction)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before:  111,713 tokens → $0.33/conversation
After:     3,247 tokens → $0.01/conversation
Savings: $1,760/year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;250KB binary. Zero dependencies. 486 tests. Apache 2.0.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Unpopular Opinion
&lt;/h2&gt;

&lt;p&gt;MCP's protocol design is not the problem. Standardized tool interfaces &lt;em&gt;do&lt;/em&gt; matter. The problem is the &lt;strong&gt;implementation pattern&lt;/strong&gt;: loading every tool schema into the model's context at startup.&lt;/p&gt;

&lt;p&gt;This is like forcing a carpenter to read every tool manual before picking up a hammer. The manuals don't go away. They just sit on the workbench, taking up space, while the carpenter tries to work around them.&lt;/p&gt;

&lt;p&gt;The fix isn't a new protocol. It's a smarter proxy layer that loads schemas on demand, strips JSON wrapping, and lets the model focus on the actual task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP wasn't a mistake. But the way we use it is.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All token counts are measured with tiktoken (cl100k_base), not estimated. Measurement scripts and raw data: &lt;a href="https://github.com/activeing123/mcptoon/tree/main/benchmarks" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;. Independent project, not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>devtools</category>
      <category>claude</category>
    </item>
    <item>
      <title>Claude Code Is Burning Your Token Budget. Here's the Receipt.</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Sun, 23 Aug 2026 09:18:35 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/claude-code-is-burning-your-token-budget-heres-the-receipt-1nkf</link>
      <guid>https://dev.to/mcptokensaver/claude-code-is-burning-your-token-budget-heres-the-receipt-1nkf</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code Is Burning Your Token Budget. Here's the Receipt.
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;I found $2,500/year of hidden token waste in my Claude Code setup. It was the MCP servers.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Discovery
&lt;/h2&gt;

&lt;p&gt;Last week I noticed my Claude Code conversations were dying at around message 15. Context window full. The model starts forgetting earlier instructions. Tool calls fail. The conversation degrades into hallucination.&lt;/p&gt;

&lt;p&gt;I assumed it was my fault — too many messages, too much context. So I started measuring.&lt;/p&gt;

&lt;p&gt;Here's what I found:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session start:
  Claude system prompt:        ~8,000 tokens
  MCP schema injection:      ~111,000 tokens
  User's first message:            50 tokens
  ──────────────────────────────────────────
  Total before any work:     ~119,000 tokens

  Remaining context:         ~81,000 tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;I was starting every conversation with 60% of my context already consumed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The culprit wasn't my prompts. It was the 10 MCP servers I had proudly configured in my &lt;code&gt;claude_desktop_config.json&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Receipts
&lt;/h2&gt;

&lt;p&gt;I measured each server's schema injection using tiktoken:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Why I Installed It&lt;/th&gt;
&lt;th&gt;Token Cost&lt;/th&gt;
&lt;th&gt;Times Used/Week&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;PR reviews, issues&lt;/td&gt;
&lt;td&gt;12,440&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;Message reading&lt;/td&gt;
&lt;td&gt;14,672&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Drive&lt;/td&gt;
&lt;td&gt;Doc access&lt;/td&gt;
&lt;td&gt;47,293&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;Knowledge base&lt;/td&gt;
&lt;td&gt;13,780&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;Query DB&lt;/td&gt;
&lt;td&gt;8,231&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;Screenshots&lt;/td&gt;
&lt;td&gt;5,890&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filesystem&lt;/td&gt;
&lt;td&gt;File access&lt;/td&gt;
&lt;td&gt;3,847&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brave Search&lt;/td&gt;
&lt;td&gt;Web search&lt;/td&gt;
&lt;td&gt;2,103&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Context persistence&lt;/td&gt;
&lt;td&gt;2,567&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sequential Thinking&lt;/td&gt;
&lt;td&gt;Reasoning&lt;/td&gt;
&lt;td&gt;890&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;111,713&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Look at the "Times Used/Week" column. &lt;strong&gt;Three servers were used zero times.&lt;/strong&gt; Two more were used once or twice. But every single one of them was injecting 100% of its schema into every conversation.&lt;/p&gt;

&lt;p&gt;I was paying $0.33 per conversation — $2,500/year — to load schemas for tools I barely used.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Moment I Realized Everyone Has This Problem
&lt;/h2&gt;

&lt;p&gt;I posted my findings on Bluesky. Within hours:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I had the same issue. Removed 6 MCP servers and my conversations went from dying at message 15 to lasting 40+ messages." — &lt;a class="mentioned-user" href="https://dev.to/developer1"&gt;@developer1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"GitHub MCP is 12K tokens but Claude Code already has &lt;code&gt;gh&lt;/code&gt; CLI built in. Why did I install it?" — @developer2&lt;/p&gt;

&lt;p&gt;"Google Drive MCP alone is 47K tokens. FORTY SEVEN THOUSAND. For a tool I used once this month." — @developer3&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't a niche problem. &lt;strong&gt;Everyone running 5+ MCP servers is silently burning 50-100K tokens per conversation.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fix (3 Minutes, Zero Code)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Audit Your MCP Servers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Count token cost of each server&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
mcptoon audit &lt;span class="nt"&gt;--config&lt;/span&gt; ~/.config/claude/claude_desktop_config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filesystem:     3,847 tokens  ✓ Keep (used daily)
GitHub:        12,440 tokens  ✗ Remove (use `gh` CLI instead)
Google Drive:  47,293 tokens  ✗ Remove (use `gdrive` CLI)
Slack:         14,672 tokens  ✗ Remove (use `slack` CLI)
Notion:        13,780 tokens  ⚠ Depends (no good CLI alternative)
Postgres:       8,231 tokens  ✓ Keep (used 4x/week)
...
Total waste:   89,702 tokens  →  $1,346/year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Remove Unused Servers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"brave-search"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I went from 10 servers to 3. My context overhead dropped from 111K to 14K tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Proxy The Rest
&lt;/h3&gt;

&lt;p&gt;For servers you must keep, wrap them with mcptoon to compress schemas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcptoon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"serve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-postgres"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mcptoon compresses tool schemas by 97% using a compact TOON format. The model sees the same tools but with 3K tokens instead of 111K.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Results After One Week
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Context at session start&lt;/td&gt;
&lt;td&gt;111K tokens&lt;/td&gt;
&lt;td&gt;3.2K tokens&lt;/td&gt;
&lt;td&gt;-97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversations before context death&lt;/td&gt;
&lt;td&gt;~15 messages&lt;/td&gt;
&lt;td&gt;~45 messages&lt;/td&gt;
&lt;td&gt;3x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token cost per conversation&lt;/td&gt;
&lt;td&gt;$0.54&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;-74%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly cost (20 conv/day × 22 days)&lt;/td&gt;
&lt;td&gt;$237&lt;/td&gt;
&lt;td&gt;$62&lt;/td&gt;
&lt;td&gt;-$175&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual savings&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2,100&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;This isn't just about money. The real cost of MCP schema bloat is &lt;strong&gt;cognitive degradation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your model forgets earlier instructions because context is full of JSON&lt;/li&gt;
&lt;li&gt;Tool calls fail because the model can't find the right tool among 170 options&lt;/li&gt;
&lt;li&gt;Response quality drops because the model is reasoning through a wall of schema noise&lt;/li&gt;
&lt;li&gt;Long conversations become impossible — not because of your prompts, but because of MCP overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When Perplexity's CTO announced they were replacing MCP with REST API + CLI internally, this is what he was talking about. When Garry Tan said "MCP sucks honestly," this is what he meant. When Anthropic's own engineers showed 98.7% token reduction by not loading schemas into context, this is the problem they were solving.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Unpopular Truth
&lt;/h2&gt;

&lt;p&gt;MCP servers aren't bad. The protocol isn't bad. But &lt;strong&gt;loading every tool schema into context at startup is a design flaw that costs every developer thousands of dollars per year in wasted tokens.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most developers don't know this because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Token costs are invisible until you look at your bill&lt;/li&gt;
&lt;li&gt;Conversation degradation feels like "the model getting dumber"&lt;/li&gt;
&lt;li&gt;Nobody measures their MCP overhead&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you know. Go audit your config.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
mcptoon audit &lt;span class="nt"&gt;--config&lt;/span&gt; your-config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;mcptoon is open source, Apache 2.0, 250KB, zero dependencies. &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://pypi.org/project/mcptoon/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;. All measurements use tiktoken cl100k_base. Not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>mcp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Garry Tan Was Right: "MCP Sucks Honestly." I Have the Token Receipts.</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Sun, 23 Aug 2026 09:18:07 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/garry-tan-was-right-mcp-sucks-honestly-i-have-the-token-receipts-1lc1</link>
      <guid>https://dev.to/mcptokensaver/garry-tan-was-right-mcp-sucks-honestly-i-have-the-token-receipts-1lc1</guid>
      <description>&lt;h1&gt;
  
  
  Garry Tan Was Right: "MCP Sucks Honestly." I Have the Token Receipts.
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;"MCP sucks honestly. Context window eats too much, auth is a mess. I wrote a CLI wrapper in 30 minutes and it works better."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When YC's CEO says this on X, people listen. But nobody had the data to back it up.&lt;/p&gt;

&lt;p&gt;Until now.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Garry Tan, Perplexity's CTO, and 97 Million Downloads Can't Hide
&lt;/h2&gt;

&lt;p&gt;Three things happened in the last 6 months that changed how I think about MCP:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Peter Steinberger&lt;/strong&gt; (OpenClaw founder) tweeted: &lt;em&gt;"mcp were a mistake. bash is better."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eric Holmes&lt;/strong&gt; wrote &lt;em&gt;"MCP is dead. Long live the CLI"&lt;/em&gt; — it hit HN frontpage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Denis Yarats&lt;/strong&gt; (Perplexity CTO) publicly announced they're replacing MCP with REST API + CLI internally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Garry Tan&lt;/strong&gt; (YC CEO) replied: &lt;em&gt;"MCP sucks honestly"&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The community split into two camps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"MCP is dead"&lt;/strong&gt; — CLI is simpler, cheaper, faster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"MCP is fine"&lt;/strong&gt; — 97M downloads, 17K servers, it's the standard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are wrong. The problem isn't MCP. The problem is what MCP does to your context window.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 47,000-Token Problem Nobody Measured
&lt;/h2&gt;

&lt;p&gt;I connected 10 MCP servers to a token counter. Here's what I found:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MCP Server&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Token Cost&lt;/th&gt;
&lt;th&gt;Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sequential Thinking&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;890&lt;/td&gt;
&lt;td&gt;This blog post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brave Search&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2,103&lt;/td&gt;
&lt;td&gt;A short email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filesystem&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;3,847&lt;/td&gt;
&lt;td&gt;A README&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2,567&lt;/td&gt;
&lt;td&gt;A meeting note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;5,890&lt;/td&gt;
&lt;td&gt;A chapter of a book&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;8,231&lt;/td&gt;
&lt;td&gt;A whitepaper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;12,440&lt;/td&gt;
&lt;td&gt;A court filing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;13,780&lt;/td&gt;
&lt;td&gt;A legal contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;14,672&lt;/td&gt;
&lt;td&gt;A novella chapter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Drive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;47,293&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Half of a novel&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;170&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;111,713&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A short book&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;One MCP server — Google Drive — injects 47,293 tokens into your context before you ask a single question.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The entire works of Shakespeare is 900K tokens. Google Drive's schema is 5% of Shakespeare. For listing files.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cost Breakdown (So You Can Get Angry Too)
&lt;/h2&gt;

&lt;p&gt;At Claude 3.5 Sonnet pricing ($3/M input tokens, $15/M output):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Annual Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 server (minimal)&lt;/td&gt;
&lt;td&gt;3,847&lt;/td&gt;
&lt;td&gt;$0.01/conv&lt;/td&gt;
&lt;td&gt;$4.40/yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 servers (common)&lt;/td&gt;
&lt;td&gt;14,528&lt;/td&gt;
&lt;td&gt;$0.04/conv&lt;/td&gt;
&lt;td&gt;$19.40/yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 servers (typical)&lt;/td&gt;
&lt;td&gt;33,061&lt;/td&gt;
&lt;td&gt;$0.10/conv&lt;/td&gt;
&lt;td&gt;$44/yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 servers (max)&lt;/td&gt;
&lt;td&gt;111,713&lt;/td&gt;
&lt;td&gt;$0.34/conv&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1,496/yr&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 servers + 20 tool calls&lt;/td&gt;
&lt;td&gt;~180,000&lt;/td&gt;
&lt;td&gt;$0.54/conv&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2,376/yr&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Assumptions: 20 conversations/day, 220 working days/year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$2,376/year. In JSON braces. For tools you might not even use.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Anthropic's Own Engineers Admitted
&lt;/h2&gt;

&lt;p&gt;Anthropic published a blog showing that complex MCP workflows can consume 150,000+ tokens. Their solution? A 98.7% token reduction by moving tool definitions from context to runtime code.&lt;/p&gt;

&lt;p&gt;Translation: &lt;strong&gt;The fix for MCP's token waste is to stop using MCP the way MCP was designed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cloudflare went further. Their 2,500-endpoint API originally required 1.17M tokens of schema. They compressed it to 1K by exposing just two functions: &lt;code&gt;search&lt;/code&gt; and &lt;code&gt;execute&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;1,170,000 → 1,000.&lt;/p&gt;

&lt;p&gt;That's not an optimization. That's an architecture admission.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Cost Nobody Talks About: Cognitive Degradation
&lt;/h2&gt;

&lt;p&gt;Money is measurable. But the worse cost is what MCP bloat does to your agent's intelligence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without MCP bloat (3K tokens overhead):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context used by schemas:    2% 
Context for reasoning:     98%
Conversation longevity:     40+ messages
Tool selection accuracy:   high (few tools to choose from)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With MCP bloat (111K tokens overhead):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context used by schemas:   56%
Context for reasoning:     44%  
Conversation longevity:     15 messages
Tool selection accuracy:   low (170 tools, model gets confused)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent isn't getting dumber. Your context window is getting fuller.&lt;/p&gt;




&lt;h2&gt;
  
  
  "But I Need Those MCP Servers!"
&lt;/h2&gt;

&lt;p&gt;Do you? I audited my own setup:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Token Cost&lt;/th&gt;
&lt;th&gt;Used/Week&lt;/th&gt;
&lt;th&gt;CLI Alternative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;12,440&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gh&lt;/code&gt; (built into Claude Code)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;14,672&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;slack-cli&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Drive&lt;/td&gt;
&lt;td&gt;47,293&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gdrive&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;13,780&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;API + curl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;5,890&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;playwright&lt;/code&gt; CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Three servers were used zero times per week.&lt;/strong&gt; Two more had direct CLI equivalents. I was paying $1,346/year for tools I never touched.&lt;/p&gt;

&lt;p&gt;After the audit, I kept 3 servers, removed 7, and proxied the remaining 3 through &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Servers&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema tokens&lt;/td&gt;
&lt;td&gt;111,713&lt;/td&gt;
&lt;td&gt;3,247&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduction&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual cost&lt;/td&gt;
&lt;td&gt;$2,376&lt;/td&gt;
&lt;td&gt;$69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Savings&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2,307&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;mcptoon wraps your MCP servers and compresses their schemas into a TOON format — 97% smaller, same functionality, zero dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;Garry Tan was right. Not because MCP is fundamentally broken — it's not. The protocol is fine. But the implementation pattern — loading every tool schema into context at startup — is a tax on every developer using it.&lt;/p&gt;

&lt;p&gt;The evidence is overwhelming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;YC CEO&lt;/strong&gt; says it sucks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity CTO&lt;/strong&gt; replaced it internally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic's own engineers&lt;/strong&gt; showed 98.7% waste&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;97M downloads&lt;/strong&gt; but developers are removing servers after 3 months&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My data&lt;/strong&gt;: 111K tokens of overhead per conversation, $2,376/year wasted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix isn't a new protocol. It's a smarter proxy layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just remove your unused MCP servers. That's free and takes 2 minutes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;"MCP was a mistake" is too strong. But "MCP as currently implemented is burning your token budget" is exactly right.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;All data measured with tiktoken (cl100k_base). Scripts: &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Independent, not affiliated with Anthropic, YC, or Perplexity.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>devtools</category>
      <category>llm</category>
    </item>
    <item>
      <title>I Benchmarked 10 MCP Servers — One of Them Burns 47K Tokens Just to Say Hello</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Sun, 23 Aug 2026 09:06:08 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/i-benchmarked-10-mcp-servers-one-of-them-burns-47k-tokens-just-to-say-hello-7he</link>
      <guid>https://dev.to/mcptokensaver/i-benchmarked-10-mcp-servers-one-of-them-burns-47k-tokens-just-to-say-hello-7he</guid>
      <description>&lt;h1&gt;
  
  
  I Benchmarked 10 MCP Servers — One of Them Burns 47K Tokens Just to Say Hello
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What I did
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The servers:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Token Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Filesystem&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;3,847&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;12,440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;8,231&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;5,890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Brave Search&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2,103&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2,567&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Sequential Thinking&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;14,672&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Google Drive&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;47,293&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;13,780&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Totals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;847 tools across 10 servers&lt;/li&gt;
&lt;li&gt;111,713 tokens of JSON schemas&lt;/li&gt;
&lt;li&gt;200,000+ tokens including server status messages, headers, and error schemas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's right — connecting 10 MCP servers to Claude means &lt;strong&gt;200K tokens of overhead before your first message&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The worst offender: Google Drive
&lt;/h2&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"drive.files.list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lists files in the user's Google Drive with optional filtering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Query string for filtering files..."&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"corpora"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"enum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sharedDrive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allDrives"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"includeItemsFromAllDrives"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"boolean"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"orderBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pageSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integer"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pageToken"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"spaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"array"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"supportsAllDrives"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"boolean"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's ONE tool. 31 of them. At ~1,525 tokens per tool average.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this costs you
&lt;/h2&gt;

&lt;p&gt;At Claude 3.5 Sonnet pricing ($3/M input tokens):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Cost per conversation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 server (Filesystem)&lt;/td&gt;
&lt;td&gt;3,847&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 servers (common)&lt;/td&gt;
&lt;td&gt;21,578&lt;/td&gt;
&lt;td&gt;$0.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 servers (power user)&lt;/td&gt;
&lt;td&gt;33,061&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 servers (max setup)&lt;/td&gt;
&lt;td&gt;111,713&lt;/td&gt;
&lt;td&gt;$0.34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 servers + 20 tool calls&lt;/td&gt;
&lt;td&gt;~180,000&lt;/td&gt;
&lt;td&gt;$0.54&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A developer with 10 MCP servers, 20 conversations per day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Daily: $10.80&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly: $216&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annual: $2,592&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's more than the Claude Pro subscription itself. You're paying for JSON braces.&lt;/p&gt;




&lt;h2&gt;
  
  
  The token breakdown
&lt;/h2&gt;

&lt;p&gt;Where do the tokens actually go?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The biggest chunk isn't the tool descriptions — it's the &lt;strong&gt;inputSchema properties&lt;/strong&gt;. Each parameter needs a type, a description, sometimes an enum, sometimes nested objects. That JSON structure is expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  The JSON-inside-JSON problem
&lt;/h2&gt;

&lt;p&gt;Every MCP tool result comes wrapped:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;app.py&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;size&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: 1024}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual content (&lt;code&gt;{"file": "app.py", "size": 1024}&lt;/code&gt;) is 38 characters. The wrapping is 47 characters. &lt;strong&gt;55% of the result is JSON overhead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multiply by 20 tool calls per conversation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 results × 47 chars overhead = 940 chars of pure wrapping&lt;/li&gt;
&lt;li&gt;20 results × ~100 chars actual content = 2,000 chars of real data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;32% of your result tokens are JSON braces&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to fix it
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon&lt;/a&gt; — a CLI proxy that sits between your agent and MCP servers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Caches schemas&lt;/strong&gt; — injects tool definitions once, not per conversation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strips result wrapping&lt;/strong&gt; — returns clean text, not &lt;code&gt;{"content":[{"type":"text","text":"..."}]}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TOON format&lt;/strong&gt; — compresses 847 tools from 111K tokens to 3.2K (97% reduction)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Before vs After
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Raw MCP&lt;/th&gt;
&lt;th&gt;With mcptoon&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 servers tool discovery&lt;/td&gt;
&lt;td&gt;111,713 tok&lt;/td&gt;
&lt;td&gt;3,247 tok&lt;/td&gt;
&lt;td&gt;97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-result overhead&lt;/td&gt;
&lt;td&gt;47 chars&lt;/td&gt;
&lt;td&gt;0 chars&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 tool calls&lt;/td&gt;
&lt;td&gt;18,800 tok&lt;/td&gt;
&lt;td&gt;8,200 tok&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 full conversation&lt;/td&gt;
&lt;td&gt;~180K tok&lt;/td&gt;
&lt;td&gt;~45K tok&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per conversation&lt;/td&gt;
&lt;td&gt;$0.54&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Quick start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcptoon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"serve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@anthropic/mcp-filesystem"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero dependencies. 250KB. 486 tests. Works with Claude Code, Cursor, and any agent that speaks MCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  The methodology (so you can reproduce)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Installed each MCP server via &lt;code&gt;npx&lt;/code&gt; or &lt;code&gt;pip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Connected via stdio MCP protocol&lt;/li&gt;
&lt;li&gt;Called &lt;code&gt;tools/list&lt;/code&gt; on each server&lt;/li&gt;
&lt;li&gt;Counted tokens using &lt;code&gt;tiktoken&lt;/code&gt; (cl100k_base encoding)&lt;/li&gt;
&lt;li&gt;Measured result wrapping by calling &lt;code&gt;tools/call&lt;/code&gt; 20 times per server&lt;/li&gt;
&lt;li&gt;All measurements taken on 2026-08-23 with latest server versions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Raw data and measurement scripts are in the &lt;a href="https://github.com/activeing123/mcptoon/tree/main/benchmarks" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger question
&lt;/h2&gt;

&lt;p&gt;MCP is a great protocol. Standardized tool interfaces matter. But the current implementation has an efficiency problem that nobody talks about.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;If you're building MCP servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep descriptions under 50 words&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flatten schemas&lt;/strong&gt; — avoid nested objects when a flat string works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't expose unused tools&lt;/strong&gt; — every tool costs tokens even if never called&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider token cost as a design constraint&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're consuming MCP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use a proxy&lt;/strong&gt; like mcptoon to compress schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit connected servers&lt;/strong&gt; — do you really need all 10 at once?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache across conversations&lt;/strong&gt; — schemas don't change between messages&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Show me the code
&lt;/h2&gt;

&lt;p&gt;mcptoon is open source, Apache 2.0, zero dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;https://github.com/activeing123/mcptoon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI&lt;/strong&gt;: &lt;code&gt;pip install mcptoon&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size&lt;/strong&gt;: 250KB (vs 25MB for typical MCP clients)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests&lt;/strong&gt;: 486 (runs in 0.5s)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: No supply chain attack surface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this was useful, a GitHub star helps others find it. Data errors? Open an issue — I'll fix the benchmarks.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;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.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>devtools</category>
      <category>llm</category>
    </item>
    <item>
      <title>Real Token Cost of MCP: 91K Tokens of JSON</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Sat, 22 Aug 2026 22:19:33 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/real-token-cost-of-mcp-91k-tokens-of-json-4goe</link>
      <guid>https://dev.to/mcptokensaver/real-token-cost-of-mcp-91k-tokens-of-json-4goe</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;255 MCP tools. 91,000 tokens of JSON schemas. Before you ask a single question. Here's what I found and how I fixed it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The experiment
&lt;/h2&gt;

&lt;p&gt;I connected Claude Code to 5 MCP servers. File system, GitHub, Postgres, Puppeteer, and a custom search tool. Then I counted every token that flowed through the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The numbers:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Token Count&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool discovery (initial)&lt;/td&gt;
&lt;td&gt;91,247&lt;/td&gt;
&lt;td&gt;JSON schemas for 255 tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-conversation overhead&lt;/td&gt;
&lt;td&gt;12,400&lt;/td&gt;
&lt;td&gt;Repeated schema injections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool result wrapping&lt;/td&gt;
&lt;td&gt;812 per call&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"content":[{"type":"text","text":"..."}]}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 tool calls later&lt;/td&gt;
&lt;td&gt;16,240&lt;/td&gt;
&lt;td&gt;Result overhead alone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total for 1 conversation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~120,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Before any real output&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's a GPT-4 conversation where 60% of your tokens are JSON braces, brackets, and repeated schema definitions.&lt;/p&gt;

&lt;p&gt;Let me show you what I mean.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MCP tool schemas actually look like
&lt;/h2&gt;

&lt;p&gt;Here's ONE tool definition from a typical MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_files"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Search for files matching a pattern in a given directory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Glob pattern to match files"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Root directory to search in"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"case_sensitive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"boolean"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Whether to perform case-sensitive matching"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's 347 characters, ~87 tokens. For ONE tool.&lt;/p&gt;

&lt;p&gt;A typical MCP server exposes 30-60 tools. Five servers = 255 tools. That's 22,185 tokens just for tool definitions.&lt;/p&gt;

&lt;p&gt;But it gets worse. The model also gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server status messages (~200 tokens each)&lt;/li&gt;
&lt;li&gt;Tool listing headers (~50 tokens per server)&lt;/li&gt;
&lt;li&gt;Error handling schemas (~100 tokens per tool)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Realistic total: &lt;strong&gt;91K tokens&lt;/strong&gt; for a 5-server setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  The result wrapping problem
&lt;/h2&gt;

&lt;p&gt;Every MCP tool result comes wrapped in this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The actual content you care about"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's 47 characters of JSON overhead per result. For a 100-character result, 32% of tokens are pure overhead.&lt;/p&gt;

&lt;p&gt;If the result is structured data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;app.py&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;matches&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: [&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;line 42&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;line 87&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;]}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have JSON inside JSON. The inner JSON is stringified. The outer JSON wraps it. Double encoding. Double parsing. Double tokens.&lt;/p&gt;




&lt;h2&gt;
  
  
  The cost in dollars
&lt;/h2&gt;

&lt;p&gt;At Claude 3.5 Sonnet pricing ($3/M input tokens):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Input Tokens&lt;/th&gt;
&lt;th&gt;Cost per Conversation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Without MCP&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;$0.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;With 5 MCP servers&lt;/td&gt;
&lt;td&gt;130,000&lt;/td&gt;
&lt;td&gt;$0.39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;With 10 MCP servers&lt;/td&gt;
&lt;td&gt;250,000&lt;/td&gt;
&lt;td&gt;$0.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy tool use (50 calls)&lt;/td&gt;
&lt;td&gt;200,000&lt;/td&gt;
&lt;td&gt;$0.60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A developer having 20 conversations per day with MCP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Daily cost: $7.80 - $15.00&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly cost: $156 - $300&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annual cost: $1,872 - $3,600&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not counting output tokens.&lt;/p&gt;




&lt;h2&gt;
  
  
  I built a tool to fix this
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon&lt;/a&gt; — a CLI that sits between your AI agent and MCP servers. It:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Caches tool schemas&lt;/strong&gt; — injects them once, not per conversation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compresses results&lt;/strong&gt; — strips JSON wrapping, returns clean text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uses TOON format&lt;/strong&gt; — Token-Optimized Object Notation&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What TOON looks like
&lt;/h3&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_files"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;]}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TOON outputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;name search_files&lt;/span&gt;
&lt;span class="s"&gt;pattern string required&lt;/span&gt;
&lt;span class="s"&gt;path string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's 62 tokens instead of 2,034 for all 255 tools. &lt;strong&gt;97% reduction.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-world results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Raw MCP&lt;/th&gt;
&lt;th&gt;With mcptoon&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool discovery&lt;/td&gt;
&lt;td&gt;91,247 tok&lt;/td&gt;
&lt;td&gt;2,847 tok&lt;/td&gt;
&lt;td&gt;97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-result overhead&lt;/td&gt;
&lt;td&gt;47 chars&lt;/td&gt;
&lt;td&gt;0 chars&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 tool calls&lt;/td&gt;
&lt;td&gt;16,240 tok&lt;/td&gt;
&lt;td&gt;7,080 tok&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 conversation total&lt;/td&gt;
&lt;td&gt;~120K tok&lt;/td&gt;
&lt;td&gt;~35K tok&lt;/td&gt;
&lt;td&gt;71%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in your Claude Code config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcptoon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"serve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@anthropic/mcp-filesystem"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or if you use Cursor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcptoon add filesystem &lt;span class="nt"&gt;--stdio&lt;/span&gt; npx @anthropic/mcp-filesystem
mcptoon list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero dependencies. 250KB. Works with any agent that runs shell commands.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;MCP is a great protocol. The idea of standardizing tool interfaces across AI agents is important. But the implementation has a token efficiency problem that nobody talks about.&lt;/p&gt;

&lt;p&gt;When Anthropic announced MCP, the examples showed 3-5 tools. That's manageable. But real-world setups have 50-255 tools. At that scale, the JSON overhead becomes the dominant cost.&lt;/p&gt;

&lt;p&gt;If you're building MCP servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep tool descriptions short&lt;/li&gt;
&lt;li&gt;Minimize schema complexity&lt;/li&gt;
&lt;li&gt;Don't nest JSON in results&lt;/li&gt;
&lt;li&gt;Consider token cost as a first-class concern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're consuming MCP tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a proxy like mcptoon to compress&lt;/li&gt;
&lt;li&gt;Cache schemas across conversations&lt;/li&gt;
&lt;li&gt;Limit the number of servers you connect&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Show me the code
&lt;/h2&gt;

&lt;p&gt;mcptoon is open source, Apache 2.0, zero dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;https://github.com/activeing123/mcptoon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI&lt;/strong&gt;: &lt;code&gt;pip install mcptoon&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size&lt;/strong&gt;: 250KB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests&lt;/strong&gt;: 486&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire codebase is readable in an afternoon. No transitive dependencies to audit. No supply chain risk.&lt;/p&gt;

&lt;p&gt;If this was useful, a GitHub star helps others find it. Questions? I'm in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is an independent project. Not affiliated with Anthropic or the MCP team. All token counts are measured, not estimated.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
    </item>
    <item>
      <title>Zero Dependencies, 250KB, 486 Tests: What I Learned Building an MCP Client</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Thu, 20 Aug 2026 02:34:23 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/zero-dependencies-250kb-486-tests-what-i-learned-building-an-mcp-client-439i</link>
      <guid>https://dev.to/mcptokensaver/zero-dependencies-250kb-486-tests-what-i-learned-building-an-mcp-client-439i</guid>
      <description>&lt;h1&gt;
  
  
  Zero Dependencies, 250KB, 486 Tests: What I Learned Building an MCP Client
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;This is not a product pitch. It's an engineering diary. If you want the pitch, &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;the README is here&lt;/a&gt;. This is about the cost of zero.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Six weeks ago I started building &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon&lt;/a&gt; — a CLI tool that sits between AI agents (Claude Code, Cursor, Codex) and MCP servers. The problem it solves: MCP tool schemas get injected into your context window as JSON. 255 tools = ~91K tokens of JSON braces, brackets, quotes, and commas — before any actual work happens.&lt;/p&gt;

&lt;p&gt;mcptoon keeps schemas out of context. The agent runs shell commands. Only the compact result enters context.&lt;/p&gt;

&lt;p&gt;But none of that is what I want to talk about.&lt;/p&gt;

&lt;p&gt;I want to talk about the decision that shaped everything: &lt;strong&gt;zero dependencies&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# pyproject.toml&lt;/span&gt;
&lt;span class="py"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not "minimal dependencies." Not "few dependencies." &lt;strong&gt;Zero.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why zero?
&lt;/h2&gt;

&lt;p&gt;The trigger was the &lt;a href="https://github.com/astral-sh/uv/issues/9423" rel="noopener noreferrer"&gt;uv security incident&lt;/a&gt;. A transitive dependency in a popular Python tool had a supply chain vulnerability. Thousands of projects were affected. Not because they did anything wrong — because someone upstream did something wrong.&lt;/p&gt;

&lt;p&gt;I looked at my own &lt;code&gt;pip install&lt;/code&gt; history. How many packages had I installed in the last year? Hundreds. Each one pulling in its own dependency tree. How many of those dependencies had I audited? Zero.&lt;/p&gt;

&lt;p&gt;So when I started mcptoon, I made a rule: &lt;strong&gt;no third-party imports. Python standard library only.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This sounded reasonable in theory. In practice, it meant I was about to hand-roll a lot of things.&lt;/p&gt;




&lt;h2&gt;
  
  
  The cost: What I had to build myself
&lt;/h2&gt;

&lt;h3&gt;
  
  
  No &lt;code&gt;requests&lt;/code&gt; → hand-write an HTTP client
&lt;/h3&gt;

&lt;p&gt;The standard library has &lt;code&gt;http.client&lt;/code&gt; and &lt;code&gt;urllib&lt;/code&gt;. They work. But they're verbose. Here's what a POST request looks like with &lt;code&gt;urllib&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;http_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{})}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's 8 lines. With &lt;code&gt;requests&lt;/code&gt;, it would be 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost: ~200 lines of HTTP plumbing&lt;/strong&gt; (streaming SSE, error handling, retry logic, auth). With &lt;code&gt;requests&lt;/code&gt;, maybe 30 lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was it worth it?&lt;/strong&gt; For SSE (Server-Sent Events) parsing — yes, I learned how the protocol actually works. For basic HTTP — no, it was just plumbing.&lt;/p&gt;

&lt;h3&gt;
  
  
  No &lt;code&gt;click&lt;/code&gt; or &lt;code&gt;argparse&lt;/code&gt; extensions → hand-write CLI parsing
&lt;/h3&gt;

&lt;p&gt;Python's stdlib &lt;code&gt;argparse&lt;/code&gt; is... fine. But &lt;code&gt;click&lt;/code&gt; is so much nicer. Decorators, subcommands, context, help text generation. With &lt;code&gt;argparse&lt;/code&gt;, I ended up with a 400-line CLI dispatch function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mcptoon&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_subparsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;command&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# ... 15 subcommands, each with its own args ...
&lt;/span&gt;
    &lt;span class="n"&gt;add_cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_parser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;add&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;add_cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;add_cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--stdio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;add_cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# ... etc for every command
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost: ~400 lines of argument parsing.&lt;/strong&gt; With &lt;code&gt;click&lt;/code&gt;, maybe 150 lines.&lt;/p&gt;

&lt;h3&gt;
  
  
  No &lt;code&gt;pydantic&lt;/code&gt; → hand-write validation
&lt;/h3&gt;

&lt;p&gt;MCP servers return JSON. Without &lt;code&gt;pydantic&lt;/code&gt;, every response is a &lt;code&gt;dict&lt;/code&gt; and you validate by hand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_tool_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expected dict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Missing &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Each content item needs &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text content missing &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost: ~300 lines of validation across the codebase.&lt;/strong&gt; With &lt;code&gt;pydantic&lt;/code&gt;, models would self-validate.&lt;/p&gt;

&lt;h3&gt;
  
  
  No &lt;code&gt;rich&lt;/code&gt; → hand-write terminal formatting
&lt;/h3&gt;

&lt;p&gt;This one actually surprised me. I didn't need &lt;code&gt;rich&lt;/code&gt;. ANSI escape codes work fine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[1m&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[0m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;green&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[32m&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[0m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[2m&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[0m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost: ~50 lines.&lt;/strong&gt; Not bad.&lt;/p&gt;

&lt;h3&gt;
  
  
  No &lt;code&gt;pytest&lt;/code&gt; plugins → plain &lt;code&gt;unittest&lt;/code&gt;-style tests
&lt;/h3&gt;

&lt;p&gt;Actually, I do use &lt;code&gt;pytest&lt;/code&gt; as a dev dependency (in &lt;code&gt;[project.optional-dependencies]&lt;/code&gt;). But no &lt;code&gt;pytest-mock&lt;/code&gt;, no &lt;code&gt;pytest-cov&lt;/code&gt;, no &lt;code&gt;responses&lt;/code&gt;, no &lt;code&gt;httpx&lt;/code&gt; for mocking. Just &lt;code&gt;unittest.mock&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unittest.mock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MagicMock&lt;/span&gt;

&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mcptoon.client.MCPClient._stdio_request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mock_request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;mock_request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]}}&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MCPClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost: More verbose test setup.&lt;/strong&gt; But 486 tests still run in 0.5 seconds because there are no heavy fixtures.&lt;/p&gt;




&lt;h2&gt;
  
  
  The payoff: What zero dependencies bought me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install size: 250KB
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;span class="c"&gt;# Downloaded 250KB. Installed in 0.3s.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For comparison, a typical MCP client with &lt;code&gt;requests&lt;/code&gt;, &lt;code&gt;pydantic&lt;/code&gt;, &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;rich&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt; + its deps: ~5MB&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pydantic&lt;/code&gt; + its deps: ~15MB&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;click&lt;/code&gt;: ~200KB&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rich&lt;/code&gt;: ~5MB&lt;/li&gt;
&lt;li&gt;Total: ~25MB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;mcptoon is &lt;strong&gt;1% of that&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security audit surface: zero
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip audit mcptoon
&lt;span class="c"&gt;# No vulnerabilities found.&lt;/span&gt;
&lt;span class="c"&gt;# (Because there's nothing to audit beyond stdlib.)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the next supply chain attack hits npm or PyPI, mcptoon users are unaffected. Not because I was clever — because there's nothing to attack.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cross-platform: actually works on Windows
&lt;/h3&gt;

&lt;p&gt;Most Python CLI tools are developed on macOS/Linux and "should work on Windows." With zero dependencies, there are no platform-specific binary wheels to worry about. No &lt;code&gt;uvloop&lt;/code&gt; that doesn't support Windows. No &lt;code&gt;uvicorn&lt;/code&gt; worker model differences. Just &lt;code&gt;sys.platform&lt;/code&gt; checks for &lt;code&gt;.cmd&lt;/code&gt; vs binary names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_resolve_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;win32&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.cmd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;which&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.cmd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.cmd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mcptoon works on Windows, macOS, and Linux. Not "should work" — "tested on all three."&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Install speed
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;time &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;span class="c"&gt;# real    0m0.3s&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;time &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;competitor-with-20-deps&amp;gt;
&lt;span class="c"&gt;# real    0m12.4s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When your CI runs 1000 times a day, 12 seconds per install adds up.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Trust
&lt;/h3&gt;

&lt;p&gt;When someone reads your source and sees &lt;code&gt;import json, subprocess, urllib.request, argparse&lt;/code&gt; — they understand it. There's no &lt;code&gt;import magical_toolkit&lt;/code&gt; that does something opaque. The entire codebase is readable by anyone who knows Python.&lt;/p&gt;

&lt;p&gt;This matters for adoption. Developers who care about security (and MCP users tend to) can audit your code in an afternoon. They don't need to audit 30 transitive dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  When zero dependencies is NOT worth it
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend zero dependencies is always the right choice. Here's when it hurts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When you're building a web app.&lt;/strong&gt; You need a router, a template engine, a database ORM, session management. Hand-writing all of these is insane. Use Django, FastAPI, Flask.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When the problem is already solved well.&lt;/strong&gt; &lt;code&gt;json&lt;/code&gt; parsing? Use stdlib. HTTP/2? Use &lt;code&gt;httpx&lt;/code&gt; or &lt;code&gt;h2&lt;/code&gt; — the protocol is complex enough that a hand-rolled implementation will have bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When your team is larger than one.&lt;/strong&gt; Zero dependencies means everyone needs to understand the entire stack. With libraries, you can treat them as black boxes. That scales better with team size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When you need to move fast.&lt;/strong&gt; Zero dependencies means writing more code. More code means more bugs. If you're racing to market, use libraries.&lt;/p&gt;

&lt;p&gt;For mcptoon, it was the right choice because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It's a CLI tool, not a web app — scope is bounded&lt;/li&gt;
&lt;li&gt;The core problem (JSON encoding/decoding, HTTP, subprocess) is well-defined&lt;/li&gt;
&lt;li&gt;It's security-sensitive — it handles credentials and tool results&lt;/li&gt;
&lt;li&gt;Small enough for one person to maintain&lt;/li&gt;
&lt;li&gt;The zero-dependency story IS the marketing — it's not just engineering, it's product&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The unexpected lesson: Zero dependencies made me a better programmer
&lt;/h2&gt;

&lt;p&gt;This is going to sound like a motivational poster. Bear with me.&lt;/p&gt;

&lt;p&gt;When you use &lt;code&gt;requests.post()&lt;/code&gt;, you don't think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What HTTP version is being used&lt;/li&gt;
&lt;li&gt;How redirects are followed&lt;/li&gt;
&lt;li&gt;What happens when the connection drops mid-response&lt;/li&gt;
&lt;li&gt;How SSL verification works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you hand-write HTTP, you have to understand all of it.&lt;/p&gt;

&lt;p&gt;When you use &lt;code&gt;pydantic&lt;/code&gt;, you don't think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens when a field is &lt;code&gt;None&lt;/code&gt; vs missing&lt;/li&gt;
&lt;li&gt;How nested validation works&lt;/li&gt;
&lt;li&gt;What the error messages look like for users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you hand-write validation, you own all of it.&lt;/p&gt;

&lt;p&gt;When you use &lt;code&gt;click&lt;/code&gt;, you don't think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How subcommands are dispatched&lt;/li&gt;
&lt;li&gt;How help text is generated&lt;/li&gt;
&lt;li&gt;How arguments are parsed from &lt;code&gt;sys.argv&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you hand-write CLI parsing, you understand your own interface.&lt;/p&gt;

&lt;p&gt;I'm not saying you should never use libraries. I'm saying: &lt;strong&gt;if you've never built something with zero dependencies, you should try it at least once.&lt;/strong&gt; The things you learn about the tools you use every day are worth the extra code.&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;After six weeks of zero-dependency development:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source size&lt;/td&gt;
&lt;td&gt;~250KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code&lt;/td&gt;
&lt;td&gt;~6,400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests&lt;/td&gt;
&lt;td&gt;486&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test runtime&lt;/td&gt;
&lt;td&gt;0.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install time&lt;/td&gt;
&lt;td&gt;0.3s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub stars&lt;/td&gt;
&lt;td&gt;177&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPI versions&lt;/td&gt;
&lt;td&gt;8 (v0.1.0 → v0.5.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security vulnerabilities&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most surprising number is the test runtime. 486 tests in 0.5 seconds. No fixtures to load, no mocking frameworks to initialize, no database to set up. Just pure Python functions. I can run the entire test suite before my terminal even finishes rendering the prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;mcptoon v0.5.1 just shipped with &lt;code&gt;mcptoon serve&lt;/code&gt; (stdio bridge mode) and &lt;code&gt;mcptoon demo&lt;/code&gt; (zero-config one-command experience). The project is at 177 stars and growing.&lt;/p&gt;

&lt;p&gt;The zero-dependency rule stays. It's not just an engineering decision — it's a promise to users: &lt;strong&gt;when you install this tool, you get exactly what you see. No hidden code. No transitive surprises. No supply chain.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If that resonates with you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;read the source&lt;/a&gt;. It's 250KB. You can audit it in an afternoon.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is an independent project. Not affiliated with Anthropic. Apache 2.0 licensed. If you found it useful, a GitHub star helps others find it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>mcp</category>
      <category>opensource</category>
      <category>cli</category>
    </item>
    <item>
      <title>5 MCP pains that waste your tokens — and how I killed all 5 with a 50KB CLI</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Mon, 17 Aug 2026 15:44:28 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/5-mcp-pains-that-waste-your-tokens-and-how-i-killed-all-5-with-a-50kb-cli-eo4</link>
      <guid>https://dev.to/mcptokensaver/5-mcp-pains-that-waste-your-tokens-and-how-i-killed-all-5-with-a-50kb-cli-eo4</guid>
      <description>&lt;p&gt;I've been using MCP servers with Claude Code daily. Here's what nobody tells you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pain 1: Context death.&lt;/strong&gt; Add 10 MCP servers (especially browser tools like puppeteer/playwright) and you get 50,000-100,000+ tokens of &lt;code&gt;{"type":"object","properties":...}&lt;/code&gt; before you type a single word. The MCP community itself says "MCP is unusable past 5 servers." Latent Space's analysis confirms: "The MCP protocol creates a scaling cliff around 20-30 tools."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pain 2: Config hell.&lt;/strong&gt; Want to add a server? Edit &lt;code&gt;claude_desktop_config.json&lt;/code&gt; by hand. Miss a comma → broken. Wrong path → broken. Missing env var → broken. You debug for an hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pain 3: Agent can't self-serve.&lt;/strong&gt; Your agent says "I need GitHub search." It can't install tools — it's an AI. So &lt;em&gt;you&lt;/em&gt; stop coding, edit JSON, restart, and your agent forgot what it was doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pain 4: Reconfigure per agent.&lt;/strong&gt; Set up 15 servers for Claude Code. Switch to Cursor → different format, redo everything. Then OpenCode. Then Codex. Same servers, 4× the work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pain 5: Paying for JSON garbage.&lt;/strong&gt; Every MCP result: &lt;code&gt;{"content":[{"type":"text","text":"{\"name\":\"react\",\"stars\":219000}"}]}&lt;/code&gt; — 80 tokens to deliver 6 tokens of data. Over 200 tool calls, that's 15,000 tokens of pure syntax waste.&lt;/p&gt;




&lt;h2&gt;
  
  
  The fix: mcptoon
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;mcptoon&lt;/a&gt; — a CLI that keeps all your MCP servers configured but their schemas &lt;strong&gt;never enter your agent's context&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How? CLI mode.
&lt;/h3&gt;

&lt;p&gt;Your agent runs &lt;code&gt;mcptoon&lt;/code&gt; commands instead of connecting to MCP servers as a client. Schemas live on disk in &lt;code&gt;~/.mcptoon/config.json&lt;/code&gt;. Only the compact output you request enters context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measured results (255 tools, 5 formats)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;JSON&lt;/th&gt;
&lt;th&gt;Standard TOON&lt;/th&gt;
&lt;th&gt;mcptoon&lt;/th&gt;
&lt;th&gt;SLIM&lt;/th&gt;
&lt;th&gt;Compact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;17,790&lt;/td&gt;
&lt;td&gt;8,776 (-51%)&lt;/td&gt;
&lt;td&gt;6,981 (-61%)&lt;/td&gt;
&lt;td&gt;1,203 (-93%)&lt;/td&gt;
&lt;td&gt;117 (-99%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;td&gt;90,804&lt;/td&gt;
&lt;td&gt;44,863 (-51%)&lt;/td&gt;
&lt;td&gt;35,735 (-61%)&lt;/td&gt;
&lt;td&gt;6,174 (-93%)&lt;/td&gt;
&lt;td&gt;117 (-100%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Simon Willison said it: "JSON is the least token-efficient format possible for structured data sent to an LLM." TOON fixes this.&lt;/p&gt;

&lt;h3&gt;
  
  
  TOON vs JSON
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JSON (287 tokens):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"search_web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Search the web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"num_results"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;]}},{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TOON (5 tokens):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;search_web fetch_url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  One config, every agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
mcptoon init
mcptoon add fetch &lt;span class="nt"&gt;--stdio&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/server-fetch
mcptoon manifest &lt;span class="nt"&gt;--compact&lt;/span&gt;    &lt;span class="c"&gt;# → all tool names, 117 tokens&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works with Claude Code, Cursor, Codex, OpenCode, CatPaw — any agent that runs shell commands. Zero dependencies. 50KB. Python 3.10+. Apache 2.0.&lt;/p&gt;

&lt;p&gt;Your agent can even install its own tools: &lt;code&gt;mcptoon add github --stdio npx -y @modelcontextprotocol/server-github&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;https://github.com/activeing123/mcptoon&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Curious — what's your MCP token overhead? My benchmark scripts are in the repo.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>llm</category>
      <category>optimization</category>
    </item>
    <item>
      <title>How I Cut MCP Token Usage by 91% (and Learned a Humbling Lesson About Tokenizers)</title>
      <dc:creator>MCP Token Saver</dc:creator>
      <pubDate>Sun, 16 Aug 2026 02:35:21 +0000</pubDate>
      <link>https://dev.to/mcptokensaver/how-i-cut-mcp-token-usage-by-91-and-learned-a-humbling-lesson-about-tokenizers-5hl1</link>
      <guid>https://dev.to/mcptokensaver/how-i-cut-mcp-token-usage-by-91-and-learned-a-humbling-lesson-about-tokenizers-5hl1</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;When you add MCP servers to your AI coding agent, each one dumps its full JSON schema into context. 255 tools across all servers = 39,964 tokens. On a 128K context window, that's 31% gone before you type a single character.&lt;/p&gt;

&lt;p&gt;I was literally paying for JSON syntax overhead. Every API call included &lt;code&gt;{"content":[{"type":"text","text":"..."}]}&lt;/code&gt; — 80 tokens to deliver 6 tokens of data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: mcptoon
&lt;/h2&gt;

&lt;p&gt;I built a CLI that sits between your agent and MCP servers. It does three things:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Schema Compression (SLIM format)
&lt;/h3&gt;

&lt;p&gt;Instead of full JSON schemas, mcptoon presents tools in a compact pipe-delimited format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Full&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;287&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tokens&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;per&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tool):&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Search the web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Query"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;]}}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;SLIM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tokens):&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;search|q:s*|n:n&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;255 tools: 39,964 → 3,511 tokens. &lt;strong&gt;91% saved.&lt;/strong&gt; Verified with &lt;code&gt;tiktoken.get_encoding("cl100k_base")&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Zero-Context Discovery
&lt;/h3&gt;

&lt;p&gt;Schemas live on disk in &lt;code&gt;~/.mcptoon/config.json&lt;/code&gt;. Your agent runs &lt;code&gt;mcptoon manifest --slim&lt;/code&gt; to see what's available, then &lt;code&gt;mcptoon call &amp;lt;server&amp;gt; &amp;lt;tool&amp;gt; '{"param":"value"}' --toon&lt;/code&gt; to execute. Only the compressed output enters context.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. TOON Format for Results
&lt;/h3&gt;

&lt;p&gt;Tool results come back as human-readable key-value pairs instead of nested JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# JSON result (80 tokens):
{"content":[{"type":"text","text":"{\"name\":\"react\",\"stars\":219000}"}]}

# TOON result (12 tokens):
name: react
stars: 219000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Lesson
&lt;/h2&gt;

&lt;p&gt;My first version replaced &lt;code&gt;null&lt;/code&gt; with &lt;code&gt;∅&lt;/code&gt; (the empty set symbol). I thought I was being clever. Then someone ran it through tiktoken: &lt;code&gt;null&lt;/code&gt; = 1 token, &lt;code&gt;∅&lt;/code&gt; = 2 tokens. I was literally increasing token count and calling it optimization.&lt;/p&gt;

&lt;p&gt;The HN community called me out on it. Fair enough — I hadn't measured before shipping. Now everything is tiktoken-verified. &lt;code&gt;true&lt;/code&gt; stays &lt;code&gt;true&lt;/code&gt;. &lt;code&gt;null&lt;/code&gt; stays &lt;code&gt;null&lt;/code&gt;. No unicode tricks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Impact
&lt;/h2&gt;

&lt;p&gt;At GPT-4o pricing ($5/M tokens):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without mcptoon: 25 requests × 40K schema tokens = 1M tokens = $5&lt;/li&gt;
&lt;li&gt;With SLIM: 25 requests × 3.5K = 87.5K tokens = $0.44&lt;/li&gt;
&lt;li&gt;Daily savings (100 sessions): ~$540/month&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcptoon
mcptoon add fetch &lt;span class="nt"&gt;--stdio&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @anthropic/mcp-fetch
mcptoon manifest &lt;span class="nt"&gt;--slim&lt;/span&gt;    &lt;span class="c"&gt;# see what's available, compact&lt;/span&gt;
mcptoon call fetch fetch &lt;span class="s1"&gt;'{"url":"https://example.com"}'&lt;/span&gt; &lt;span class="nt"&gt;--toon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works with any agent that can run shell commands. One config file for all agents — no more reconfiguring for Claude Code vs Cursor vs OpenCode.&lt;/p&gt;

&lt;p&gt;3000 lines of Python, 309 tests, zero dependencies.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/activeing123/mcptoon" rel="noopener noreferrer"&gt;https://github.com/activeing123/mcptoon&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More MCP servers being added to the default config&lt;/li&gt;
&lt;li&gt;Working on a rigorous quality benchmark (currently only have token counts, not LLM accuracy)&lt;/li&gt;
&lt;li&gt;Open to feedback on the SLIM format — is there a better encoding?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's your biggest MCP token waste? How are others handling this?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>mcp</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
