Why mcptoon
Every MCP agent (Claude Code, Cursor, Codex, β¦) loads the full description of every tool and every skill into its context window before it does any work β and re-sends it every turn. On 255 tools that is 71,929 tokens: more than half of a 128K window spent on descriptions, before the first question.
How the token saving works
mcptoon keeps those descriptions on disk, not in context, and hands the agent a compact view instead:
- A name index, not full schemas. Picking a tool only needs its name β 255 tools become 581 tokens (β99.2%). The full schema is fetched on demand with
mcptoon inspect, only when a tool is actually called.
- Skills the same way. One resident pointer (39 tokens) plus one lookup (501 tokens) replaces loading every
SKILL.md in full β 926,232 β 39 + 501 (β99.9%).
- Results too.
--toon re-encodes a tool's result as standard TOON.
Measured 5.7% smaller on a mixed result sample, ranging 1.8%-48.6% by
result shape β a list of records barely shrinks, a single record halves. Not a
flat 34%: see assets/benchmark_results.json.
Nothing is lost: the full schema and the full skill text stay one command away. Only the context window is spared.
mcptoon is a 341KB, zero-dependency native CLI that manages every MCP tool and agent skill on your computer β and shares them across all your agents with no config written by you.
This isn't just us talking
Those numbers are ours β but "loading every tool schema into context is expensive" is not
a claim only we make:
mcptoon is the one you can use today, covering every agent at once.
Two ways in
|
Install once, and every desktop AI you have β Claude Desktop, Claude Code, Codex, Cursor, Windsurf, Cline, VS Code Copilot and any other agent β shares all the tools and skills you already have. You write nothing in any agent's config.
β Install and go
|
π§ I build with MCP / agents
Script it. mcptoon is a plain CLI with stable JSON output and an mcptoon serve MCP endpoint β wire it into your own agent, CI, or app.
β Commands and formats
|
Measure your numbers: pip install mcptoon && mcptoon bench β it reports your own
catalog, not the fixed 255-tool sample below (that sample's method is in
docs/tiktoken-benchmarks.md).
| Without mcptoon | With mcptoon |
|---|
| Descriptions in context | full description of every tool + skill, re-sent every turn | a compact view β 581 tokens for 255 tools (β99.2%, lossless) |
| Adding a tool or skill | hand-write JSON in every agent | one command β no agent config touched |
| Which agents get it | only the ones you configured | every agent on the machine β they just run mcptoon |
| Finding tools & skills | hunt GitHub by hand | install --search (17,000+ MCP servers) + skills search |
| Starting from scratch | wire tools one by one | 4 built-in starter packs β one command to a working set |
Skills work the same way: 926,232 tokens of SKILL.md text β 39 resident + 501 per lookup (β99.9%). Call results shrink a further ~6% with --toon (shape-dependent).
You have a desktop AI β Claude, Codex, Cursor, Windsurf, Cline, VS Code Copilot. Today, adding a tool or a skill means hand-editing that agent's JSON. mcptoon removes that step:
-
Install once.
pip install mcptoon && mcptoon quickstart
quickstart finds your MCP servers, writes your config, and registers mcptoon in every agent it detects.
(Skip quickstart and the first command you run still self-heals: it installs
mcptoon's own skill into each agent and builds the skill index, once per machine.)
-
Add tools and skills in one place β here, not in each agent.
mcptoon install --search github
mcptoon skills search "make a PDF"
-
Use them from any agent. Your agent runs mcptoon like any other command β no config, no restart. See Works with every AI agent.
Want a head start? Four built-in starter packs β essentials, web-research, code-review, docs β stand up a working toolset in one command:
mcptoon install --pack essentials
Path 2 Β· I build with MCP / agents
mcptoon is a plain CLI with scriptable output, plus an MCP endpoint when you want one.
mcptoon manifest --format json
mcptoon call <server> <tool> '{}'
mcptoon serve
- Stable output β JSON by default,
--toon for smaller results (shape-dependent,
5.7% on a mixed sample), --format mcp to export standard MCP JSON.
mcptoon serve β stdio or HTTP, connection pooling, per-agent keys, for clients that insist on a proxy.
- Zero dependencies β pure Python standard library, so it drops into any environment (CI, containers, air-gapped).
Full reference: DEVELOPERS.md and All commands.
Contents
30 seconds up and running
pip install mcptoon
mcptoon quickstart
mcptoon manifest
mcptoon call everything echo '{"message":"hi"}'
quickstart is also what makes mcptoon visible: it writes mcptoon serve into each
agent's config as the reserved server mcptoon, so your agent can see mcptoon itself.
Already synced? Re-register with mcptoon sync --self (plain mcptoon sync only writes
your servers); check the state any time with mcptoon status.
Two ways in β and you don't pick one. mcptoon is a CLI first: a shell-capable agent
runs mcptoon commands, and that is the cheapest path β the schemas never enter context.
quickstart also registers mcptoon's own MCP entry (mcptoon serve) with each agent that
takes one, so a client that can only see MCP servers still reaches your tools. The MCP entry
ships in compact mode: it keeps your upstream tool list out of the model's context and
sends it to mcptoon_manifest β inspect β call instead. mcptoon status shows both ledgers.
And it is fully reversible. The install registers the gateway, and by default
quickstart also takes over β it routes your existing servers through the gateway
and removes their direct entries (without that step your agent sees the same tools
twice, once direct and once through the gateway, which costs more, not less). It
is a listed, confirmed step, and it is undoable: mcptoon restore drops the
gateway entry and puts your servers back exactly where they were. Anything you
added to a config afterwards is left untouched. mcptoon off is the lighter
switch β it removes only the gateway entry and leaves your servers where they are.
Preview either with --dry, and preview the complete removal plan with
mcptoon uninstall --dry (it prints exactly what it will remove first).
Don't want to install yet? Watch it work instead (needs Node):
It boots the official "everything" reference server, calls one tool, and prints the token
math on your screen β no API key, none of your servers, nothing written to disk.
What it does
The full schema is compressed to a name index. When you need one, mcptoon inspect
fetches its real parameters, then call runs it. You pay for a listing, not for every
turn.
Skills: one resident pointer
No more loading the whole catalog. A single pointer line stays resident (39 tokens) and
one lookup returns the most relevant skills (501 tokens). Views are links (a junction
on Windows, no admin needed), so one edit at the source is live everywhere and there is no
second copy to drift.
Install once, share everywhere
Install mcptoon once and every AI on the machine gets all your tools and skills. Add more
later and it is live immediately β no agent restart, no per-agent JSON.
mcptoon install brave-search --npm @modelcontextprotocol/server-brave-search
mcptoon install my-tool --pip mcp-my-tool
mcptoon install remote-api --url https://example.com/mcp
mcptoon add my-server --stdio npx -y @any/mcp-package
mcptoon install --list
mcptoon install --remove brave-search
One command per server, from npm / pip / HTTP. Or let mcptoon scan what you already have:
mcptoon discover.
A remote server that needs a token reads it from the environment, so no credential is
ever written to disk:
mcptoon install remote-api --url https://example.com/mcp \
--header 'Authorization: Bearer ${BAIZHI_TOKEN}'
${NAME} is resolved at request time, so the config, the generated handler and every log
keep the template β rotate the variable and the next call uses the new value, with no
reinstall. A missing or empty variable fails loudly, naming it, never as an empty header.
On a new machine the first question isn't "how do I save tokens", it's "which tools do I
even want". The old answer is to hunt GitHub for mcpServers snippets and hand-copy them
into JSON.
mcptoon ships no tools and bundles no catalog. It queries the upstream registries, so
you search for exactly what you need:
mcptoon install --search github
mcptoon install --search postgres
mcptoon install github
Results carry a β (registry-verified), a type tag (npm / pypi / hosted / remote)
and a call count. Data comes from two upstreams, queried live and never stored:
| Source | What it is | Scale |
|---|
| Smithery | the largest MCP registry | 17,000+ entries |
| Official MCP Registry | the official meta-registry | installable npm / pypi packages |
Why nothing is bundled: a built-in list would need a release to update and would pull
someone else's source into your supply chain. mcptoon stores only a pointer β the
search writes one line into your own ~/.mcptoon/config.json; third-party source never
lands inside mcptoon.
Then distribute to every agent:
mcptoon sync
mcptoon manifest
How to read a result: the index mixes official @modelcontextprotocol/* servers with packages individuals publish. A β means the registry verified the entry β your cue to read the source before you hand it credentials.
The skills half: skills search <query> queries the open skills index (skills.sh) β find a skill by what it does, then install it with skills add <git-url>. mcptoon installs the repos you point it at β the catalog is the open ecosystem itself.
Starter packs: if you'd rather not pick tool-by-tool, four built-in packs β essentials, web-research, code-review, docs β each bundle a few tools plus a ready-made prompt. mcptoon install --packs lists them; mcptoon install --pack essentials installs one. The two research packs need no API key.
The three bills, and why you must not mix them
mcptoon saves tokens in three separate places. Comparing the numbers across them is
meaningless.
There are two ways to read "how much does this save?", and they answer different
questions. The gateway figure β full schemas versus what the agent actually loads
under the default compact exposure β is what installing mcptoon buys, and it is the
honest headline (89% on the machine this was written on). The slim-schema figure
(same tools, terser descriptions) is the smaller, secondary claim (88.5%), and it is
what manifest --slim buys. mcptoon status prints both, side by side, from one
measurement, so the two can never drift apart.
mcptoon manifest with no flags is this tier. Want more? --slim (names plus param
types, 8,282 tokens, β88.5%) or --full (the complete schema).
Bill 2 Β· Call results (call): optional, --toon saves ~6%
This bill comes due after a tool returns. mcptoon call prints JSON by default and
saves nothing by default. Add --toon to shrink the result.
Bill 3 Β· Skill catalog (skills): 926,232 β 39 resident + 501 per lookup
mcptoon skills manifest
mcptoon skills resolve "make a PDF" --k 5
One table, all three, on the machine this README was written on:
| Path | What the agent loads | Tokens | vs native |
|---|
| Tool schemas (1109) | every full schema | 139,863 | β |
| manifest (name index) | 5,406 | 96.1% |
| manifest --slim | 16,396 | 88.3% |
| Skill files (371) | every SKILL.md, full text | 926,232 | β |
| skills manifest (pointer) | 39 | 100.0% |
| skills resolve --k 5 | 501 | 99.9% |
The fixed headline benchmark β a synthetic sample of 255 tools across 50 servers,
tiktoken cl100k_base. It is not your catalog; run mcptoon status to see your own
numbers:
| Format | Tokens | Savings |
|---|
| JSON | 71,929 | β |
| TOON | 47,438 | 34% |
| SLIM | 8,282 | 88.5% |
| Compact | 581 | 99.2% |
Measure your own catalog with mcptoon bench (it reports your tools, not this fixed
sample). The exact three-format table above is reproducible too β no clone needed:
mcptoon manifest
python -m mcptoon.bench_tokens
Method and caliber:
docs/tiktoken-benchmarks.md.
Install
Linux (Debian/Ubuntu 23.04+, and any distro that follows PEP 668), and
Homebrew Python on macOS. A plain pip install into the system Python is
refused there with error: externally-managed-environment. That is the distro
protecting itself, not a problem with mcptoon. Install it the clean way instead:
pipx install mcptoon
python3 -m venv ~/.mcptoon-venv && ~/.mcptoon-venv/bin/pip install mcptoon
pip install --break-system-packages mcptoon also works, but it writes into the
system Python β prefer pipx or a venv. On Windows, pip install mcptoon just works.
Other ways to install
uvx mcptoon demo --quick
pipx install mcptoon
git clone https://github.com/activeing123/mcptoon.git
cd mcptoon
pip install -e . --no-build-isolation
/plugin marketplace add activeing123/mcptoon
Works with every AI agent
mcptoon is a CLI tool β a manager, not a resident proxy or service, and not a client
library. Your agent never talks to your upstream MCP servers directly: it either runs
mcptoon commands, or reaches them through mcptoon's own MCP entry (mcptoon serve). Both
are registered by quickstart; you don't pick one (see the table for which host takes
which). So the config is written once and shared:
| Agent | How it hooks up |
|---|
| Claude Desktop | mcptoon sync --self adds one mcptoon entry to claude_desktop_config.json |
| Claude Code | mcptoon sync --self writes its config and a pointer into ~/.claude/CLAUDE.md |
| Codex | mcptoon sync --self writes a pointer into ~/.codex/AGENTS.md |
| Cursor | mcptoon sync --self adds it to Cursor's MCP config; or put it in AGENTS.md |
| Windsurf | mcptoon sync --self writes mcp_config.json |
| Cline | mcptoon sync --self writes Cline's MCP config |
| VS Code Copilot | mcptoon sync --self writes VS Code's MCP config |
| Any agent that can run a shell | call mcptoon directly β zero config |
mcptoon add github --url https://api.githubcopilot.com/mcp/
mcptoon serve is the other direction: run all your configured servers behind one MCP
endpoint, with connection pooling and per-agent keys, for clients that insist on a proxy.
You don't have to choose between the two β the CLI stays the primary way in, and the bridge
is wired alongside it wherever the host can take one.
Why a CLI, not a proxy
MCP's premise is that every capability is a server your agent must be configured to
reach β which is why one new tool means editing per-agent JSON in a different format for
each, restarting everything, and re-paying the full schema cost in every agent.
A command line is the one interface every agent already has. And the form factor is
measurably cheaper on its own, before mcptoon does anything:
- Firecrawl: the same task cost 1,365 tokens via CLI vs 44,026 via MCP β 32Γ
- Scalekit: CLI 10β32Γ cheaper, 100% reliable vs MCP's 72%
The proxy form exists too β mcptoon serve puts all configured servers behind one MCP
endpoint β and quickstart wires it alongside the CLI, so you never have to choose. This
section is about the shape mcptoon is built around, not a switch you have to flip.
All commands
mcptoon quickstart
mcptoon discover
mcptoon import
mcptoon init
mcptoon list
mcptoon manifest
mcptoon manifest --slim
mcptoon inspect <server> <tool>
mcptoon search <query>
mcptoon call <server> <tool> '{"args":"here"}'
mcptoon add <name> --stdio|--http <cmd|url>
mcptoon remove <name>
mcptoon install <name> --npm|--pip|--url <pkg>
mcptoon install --search <kw>
mcptoon update
mcptoon plugin install <dir>
mcptoon sync
mcptoon health
mcptoon serve
mcptoon skills list
mcptoon skills sync <src>
mcptoon skills resolve "<task>"
mcptoon bench
mcptoon demo
mcptoon demo-server
mcptoon doctor
mcptoon status
mcptoon stats
mcptoon report
mcptoon usage
mcptoon footer-facts
mcptoon retrieve <handle>
mcptoon config
mcptoon toggle <server> <tool>
mcptoon policy
mcptoon completion ps
mcptoon off
mcptoon restore
mcptoon uninstall
Full reference in DEVELOPERS.md.
All optional; the default is already the leanest tier.
| Tier | Output | vs native schema | Origin |
|---|
| compact (default) | names only search_web | 99.2% smaller | common design |
| slim | name + param types search_web|query:s* | 88.5% smaller | mcptoon original |
| full | full schema with params | baseline | native MCP |
| toon (results) | reversible structured encoding | 5.7% on a mixed sample (1.8-48.6% by shape) | open TOON standard |
Why compact by default? Choosing which tool to use only needs names (581 tokens for
255 tools); parameter detail matters at call time and is fetched on demand. Defaulting to
full schemas would hand the 99.2% right back.
The rule for agents: use manifest to choose, inspect before you call. Measured on
41 live tools: an agent guessing arguments from names alone lands ~10% valid calls, while
one that runs inspect once for the 2β3 tools a turn actually uses hits 100% β identical
to injecting every schema, at a fraction of the cost.
Trust and safety
It's just a 341KB native CLI β delete it anytime; keep it, and you never have to configure tools or skills for any agent again. mcptoon touches your agent configs, so it is built to be transparent β and easy to walk away from.
Three guards run on every tool result before your agent sees it:
| Guard (on by default) | What it does |
|---|
| Destructive-action block | a dangerous call is refused unless you pass --destructive |
| Prompt-injection guard | results are scanned for injection patterns like "ignore previous instructions" and blocked |
| Credential-leak detection | a result carrying an API key or token is blocked before it enters context |
- Reversible.
mcptoon restore undoes a takeover (drops the gateway and returns
your servers); mcptoon off removes only the gateway entry; mcptoon uninstall --dry prints the full removal plan first. Your servers are never deleted unless you ask.
- No telemetry. No analytics, no crash reports, nothing phoned home.
- Local-first. Your tools, skills and files stay on your machine. The only thing that leaves is
install --search, which asks the registries for a catalog listing β it never sends your data.
- No stored credentials. API keys pass straight from your config or environment.
- No dependencies. Pure Python standard library β nothing in the supply chain to audit.
CI enforces it with
scripts/check_zero_deps.py.
- No daemon. Pure CLI β no resident process, no listening port.
- Formats don't break compatibility. The wire protocol is always standard JSON-RPC;
compact/slim/toon only affect mcptoon's output to the agent. If
--toon decoding ever
fails it falls back to JSON, and one --full restores the native schema. No lock-in.
Scope, in one line: mcptoon is an index and a config manager β it points you to each tool's own source, which you can review on its own terms.
Credits and references
- TOON standard β v4.1 (MIT), vendored from
python-toon and credited in NOTICE
- ToonDeck β a GUI console for mcptoon
(pre-alpha): same engine, point and click instead of typing commands
Who builds this: mcptoon is an independent third-party project maintained by
@activeing123. It is not affiliated with Anthropic.
Contributing
git clone https://github.com/activeing123/mcptoon.git
cd mcptoon
pip install -e . --no-build-isolation
pip install pytest pytest-cov
python -m pytest tests/ -v
Three hard rules: zero dependencies (CI-enforced), new behavior ships with tests, Windows
is a first-class target. New here? Start with
CONTRIBUTING.md and
DEVELOPERS.md.
The codebase: 25,227 lines of Python across 43 modules, zero third-party dependencies.
License
Apache 2.0. See LICENSE and
NOTICE.
mcptoon is an independent third-party MCP client, not affiliated with Anthropic.
If mcptoon cut your context bill, star it β that's how other builders find small tools.
