mcptoon
This MCP gateway lets an agent discover, inspect, call, and manage upstream MCP tools and skills while keeping schemas and large results out of context.
List upstream tools grouped by server via a compact manifest, optionally filtered or with descriptions.
Report configured MCP servers, transports, tool counts, and whether tools loaded.
Run a gateway health/self-check for version, config, indexed tools, uptime, and failures.
Report token savings, tools compressed, and recorded call counts.
List indexed skills and resolve the best skills for a task using offline BM25 ranking.
Inspect a specific upstream toolβs full input schema before calling it.
Call any upstream tool by namespaced name with validated arguments.
Retrieve the full uncompressed text behind a compressed result handle.
Index local files or URLs into a knowledge base and search matching passages instead of whole documents.
Summarize session activity, including tools used, files written, errors, and git operations.
Supports installing, scanning, and syncing Agent Plugins for Amazon's AI agents as part of the cross-vendor Agent Plugins Specification, enabling them to use configured MCP tools even without a native plugin loader.
Supports OpenAI agents such as Codex by syncing MCP servers and Agent Plugins, allowing them to use the same configured tools as other agents.
Allows Vercel's AI agents to use configured MCP tools by installing and syncing Agent Plugins from the cross-vendor Agent Plugins Specification.
https://github.com/user-attachments/assets/0272d3a8-c74f-428d-8559-fbf804ce0685
π Quick Start (Choose Your Way)
When installed, mcptoon automatically injects its own official skill (/mcptoon) into your agents. You never need to memorize terminal commands β just ask directly in Cursor, Claude Code, Windsurf, or DSH:
# Ask the built-in skill anytime:
"Load /mcptoon skill and check what MCP tools I currently have."
"Help me find an MCP tool that converts HTML to PDF and call it."
"The tool output was truncated, retrieve the full original copy."
"How many tokens did mcptoon save for me today?"
"Doctor self-check: are all my MCP servers connected properly?"Your agent loads /mcptoon and drives everything behind the scenes!
# 1. Install (zero dependencies, 534KB)
pip install mcptoon
# 2. One command: detect MCP servers & auto-configure agents
# (Also self-installs `/mcptoon` skill into all detected agents)
mcptoon quickstart
# 3. View compact tool catalog (-99.2% tokens)
mcptoon manifest
# 4. Route tasks to skills or doc chapters (<5ms)
mcptoon skills resolve "write git commit message"
mcptoon docs resolve "how does release gating work"Is it actually saving you anything? After a fresh install mcptoon can sit in
direct mode β installed but not wired into the agent β and save nothing. See
Which mode is cheapest?, or just run mcptoon mode.
β‘ Core Capabilities at a Glance
π₯ Save context (why β ) | π§© One config, every agent (why β‘) |
β’ β
Compact name index (β99.2%): 255 tools β 581 tokens, full schema fetched on demandβ’ β
Lossless result compression: reversible, | β’ β
Native CLI: any shell-capable agent runs |
π Find & call (why β’) | π Drive any API, not just MCP |
β’ β
17,000+ registry: plain-language | β’ β
OpenAPI / Swagger: any REST API as commands ( |
π‘οΈ Safe, small, private | π Docs & doctor |
β’ β
Zero dependencies: pure standard library, | β’ β
Docs router: |
Every command, with flags, is in All commands.
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.
Related MCP server: typer-mcp
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 (791 tokens) replaces loading every
SKILL.mdin full β 1,572,330 β 39 + 791 (β99.99%).Results too.
--toonre-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%: seeassets/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 534KB, 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:
Anthropic's engineering write-up β tool schemas flooding the context window is a real cost; one example drops from 150,000 tokens to 2,000
Firecrawl's benchmark β the same task cost 1,365 tokens via CLI vs 44,026 via MCP (32Γ)
Scalekit's benchmark β CLI 10β32Γ cheaper, 100% reliable vs MCP's 72%
MCP-Zero (arXiv:2506.01056) β on-demand tool retrieval, near-constant cost regardless of tool count
mcptoon is the one you can use today: it covers any agent that can run a shell, and writes a single hookup line into the mainstream GUI clients it knows.
Two ways in
Install once, and every AI you have β Claude Desktop, Claude Code, Codex, Cursor, Windsurf, Cline, VS Code Copilot, Gemini CLI, Qwen Code, Zed, Crush, opencode and any other agent β shares all the tools and skills you already have. You write nothing in any agent's config.
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.
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 |
Finding tools & skills | hunt GitHub by hand |
|
Starting from scratch | wire tools one by one | 4 built-in starter packs β one command to a working set |
Skills work the same way: 1,572,330 tokens of SKILL.md text β 39 resident + 791 per lookup (β99.99%). Call results shrink a further ~6% with --toon (shape-dependent).
Path 1 Β· I just use AI tools
You have a desktop AI β Claude, Codex, Cursor, Windsurf, Cline, VS Code Copilot, and 97 more (full list of 103 β). Today, adding a tool or a skill means hand-editing that agent's JSON. mcptoon removes that step:
Install once.
pip install mcptoon && mcptoon quickstartquickstartfinds your MCP servers, writes your config, and registers mcptoon in every agent it detects. (Skipquickstartand 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 # find and install any MCP server mcptoon skills search "make a PDF" # find a skill by what it doesUse them from any agent. Your agent runs
mcptoonlike 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 essentialsPath 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 # machine-readable tool index
mcptoon call <server> <tool> '{}' # call any tool, JSON or --toon output
mcptoon serve # expose every configured server behind one MCP endpointStable output β JSON by default,
--toonfor smaller results (shape-dependent, 5.7% on a mixed sample),--format mcpto 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
Works with every AI agent β 103 clients (42 CLI Β· 61 serve)
30 seconds up and running
pip install mcptoon # pure stdlib, 534KB, zero dependencies
# One command: find your MCP servers, write your config, register the gateway
# in every agent you have, and show you what it found:
mcptoon quickstart
# See every tool available (names-only by default; 255 tools cost 581 tokens):
mcptoon manifest
# Call a tool (JSON output by default; add --toon to save more).
# `everything` is only present if you already had it; otherwise add the built-in
# zero-dependency demo server first (no Node, no network) and call that:
mcptoon add demo --stdio python -m mcptoon demo-server
mcptoon call demo echo_message '{"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):
uvx mcptoon demo --quickIt 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
Tools: schema on demand
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 (791 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.
Add tools your way
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 # see what's installed
mcptoon install --remove brave-search # uninstall oneOne 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}' # BAIZHI_TOKEN set in your environment${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.
Where the tools come from β search 17,000+, install with one command
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 # search, list only β nothing installed
mcptoon install --search postgres
mcptoon install github # search and installResults 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 |
the largest MCP registry | 17,000+ entries | |
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 # push the new tools to every detected agent
mcptoon manifest # see every tool (name index, the cheapest view)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.
The figures below come from catalogs of three different sizes β a 255-tool synthetic sample (the fixed headline benchmark), a 1,109-tool machine, and whatever your own machine has. Do not compare a percentage from one against a token count from another; each table states which catalog it measures.
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 (it scales with catalog size: the more tools you have, the larger it
gets). 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.
Bill 1 Β· Tool discovery (manifest): 99.2% smaller by default
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): 1,572,330 β 39 resident + 791 per lookup
mcptoon skills manifest # 39 tokens, resident
mcptoon skills resolve "make a PDF" --k 5 # 791 tokens, the 5 most relevantOne table, all three, on the machine this README was written on:
Path | What the agent loads | Tokens | vs native |
Tool schemas (212) | every full schema | 640,787 | β |
| 914 | 99.85% | |
| 3,056 | 99.52% | |
Skill files (480) | every | 1,572,330 | β |
| 39 | 99.99% | |
| 791 | 99.94% |
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 # populate the schema cache
python -m mcptoon.bench_tokens # the same JSON / --slim / --compact counts, your toolsMethod and caliber: docs/tiktoken-benchmarks.md.
Install
pip install mcptoonLinux (Debian/Ubuntu 23.04+, and any distro that follows PEP 668), and Homebrew Python on macOS. A plain
pip installinto the system Python is refused there witherror: externally-managed-environment. That is the distro protecting itself, not a problem with mcptoon. Install it the clean way instead:pipx install mcptoon # isolates the CLI; recommended # or, into a virtualenv you control: python3 -m venv ~/.mcptoon-venv && ~/.mcptoon-venv/bin/pip install mcptoon
pip install --break-system-packages mcptoonalso works, but it writes into the system Python β preferpipxor a venv. On Windows,pip install mcptoonjust works.
# Run without installing (needs Node)
uvx mcptoon demo --quick
# Isolated CLI install (avoids the PEP 668 error on Linux / Homebrew Python)
pipx install mcptoon
# From source (for development)
git clone https://github.com/activeing123/mcptoon.git
cd mcptoon
pip install -e . --no-build-isolation
# Claude Code plugin
/plugin marketplace add activeing123/mcptoonNix
Packaged by numtide/llm-agents.nix β a bot follows every PyPI release, so the flake is never a version behind by hand:
# Run straight from the flake, no install step
nix run github:numtide/llm-agents.nix#mcptoon -- --helpThe plugin and the skill are both surfaced through
sudosubin/agents.nix as
pkgs.agent-plugins.github.activeing123.mcptoon.<plugin-name> and
pkgs.agent-skills.github.activeing123.mcptoon.<skill-name>.
Works with every AI agent
mcptoon reaches an agent one of two ways, and every client below falls into one of them.
You don't pick β quickstart registers both, and each host takes whichever it can:
CLI leg β the agent runs
mcptoonitself. Anything with a shell (a CLI agent, or a coding IDE with a terminal) needs zero config: it runsmcptoon call,mcptoon search,mcptoon skills resolve. Nothing is written into it at all.serve leg β the client can't run a shell. A chat app or GUI mounts MCP instead, so it gets one entry:
mcptoon serveas a single MCP server. One line, one place.
The market, covered. 103 clients, taken from awesome-mcp-clients plus vendor docs for the coding agents that postdate it; developer libraries (mcp-agent, mcp-client-go) are excluded because a user does not run them. Evidence is per client β we name what we verified, not what we assumed.
CLI leg β 42 clients, zero config (they run mcptoon themselves):
AdaL Β· Aider Β· Amazon Q Developer Β· auggie Β· Autohand Code CLI Β· Claude Code Β· Claude Code Open Β· ClaudeMind Β· Cline Β· Codex Β· ContextKit Β· Continue Β· Copilot CLI Β· Copilot-MCP Β· Crush Β· Cursor Β· Dexto Β· Dolphin-MCP Β· Enola Β· Gemini CLI Β· Goose Β· JDBCX Β· Junie Β· KiloCode Β· Kiro Β· McPico Β· MCPOmni Connect Β· mistral-vibe Β· Nerve Β· Octomind Β· opencode Β· OpenHands Β· PraisonAI Β· Qwen Code Β· Roo Code Β· Slack MCP Client Β· SwarmClaw Β· Trae Β· VS Code GitHub Copilot Β· Warp Β· Windsurf Β· Zed
serve leg β 61 clients, one mcptoon serve entry (no shell, so they mount MCP):
5ire Β· Agent Bridge Β· Agent-cli Β· AgentOne Β· AIaW Β· Ano Β· AnythingLLM Β· Argo-LocalAI Β· askit-mcp Β· AstrBot Β· BoltAI Β· BrowseWiz Β· Canvas MCP Client Β· CarrotAI Β· Chainlit Β· ChatMCP Β· Cherry Studio Β· Claude Desktop Β· console-chat-gpt Β· DeepChat Β· DocsGPT Β· eechat Β· Enconvo Β· Fastchat MCP Β· FLUJO Β· Glue Β· HyperChat Β· kibitz Β· Klavis AI Β· LangBot Β· LibreChat Β· LobeHub Β· Lutra Β· MCP Chatbot Β· MCP CLI client Β· MCP Playground Β· MCP Simple Slackbot Β· MCP SuperAssistant Β· MCPCLIHost Β· MCPHost Β· Memex Β· MindPal Β· NextChat Β· OpenClaw Β· oterm Β· Qordinate Β· Runbear Β· SeekChat Β· Simple AI Β· Superinterface Β· Tambo Β· Taskade Β· Tester MCP Client Β· Tiles Notebook Β· Tome Β· Vercade Β· WhatsMCP Β· Witsy Β· y-cli Β· Yume Β· Zin-MCP-Client
Evidence status β sync --self writes a hookup line into the 12 hosts we have verified
against their own docs; every other host above is reached by the CLI or by mcptoon serve
without a host-specific file, so there is nothing to verify per host.
What mcptoon writes, host by host
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).
For the hosts that take a file, this is exactly what lands where:
Agent | How it hooks up |
Claude Desktop |
|
Claude Code |
|
Codex |
|
Gemini CLI |
|
Qwen Code |
|
Zed |
|
Crush |
|
opencode |
|
Cursor |
|
Windsurf |
|
Cline |
|
VS Code Copilot |
|
Any agent that can run a shell | call |
# Agent needs GitHub access mid-task? It just runs:
mcptoon add github --url https://api.githubcopilot.com/mcp/
# Done. No JSON editing. No restart. No lost context.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.
Which mode is cheapest?
There are three ways mcptoon can hand tools to an agent, and they cost very
differently. Only one is the cheapest, and it is not the state a fresh install
starts in. (The token figures below are from the 255-tool sample; your own catalog
differs β mcptoon mode prints your numbers.)
Mode | What the agent loads | Fixed cost every turn | When to use |
CLI (cheapest) | nothing until it runs a command β then a name index (581 tokens for 255 tools) plus the one schema it needs | 0 | any agent that can run a shell |
serve | mcptoon's own gateway tools instead of every upstream schema (the gateway figure β scales with catalog size) | small, fixed | a client that can only see MCP servers |
direct | every full schema of every tool (71,929 tokens on the 255-tool sample) | largest | never, once mcptoon is installed |
CLI is cheapest because it is idle at zero. It costs nothing on a turn that
uses no tool, and a few hundred tokens only on the turn it does. serve is a close
second β a small fixed bill every turn. direct is what you pay when mcptoon is
installed but not wired into the agent, and it is where a fresh install sits, which
is why mcptoon can feel invisible until you run mcptoon quickstart.
The "99%" in this README is the definition-side saving β from not loading every schema. CLI and serve both get it; direct does not. Result compression is a separate, much smaller bill (Bill 2 above) and is never the reason to install.
Find out which mode you are in β and what each costs on your catalog β with
mcptoon mode; print a one-line badge with mcptoon statusline.
All commands
mcptoon quickstart # one-shot start (discover + configure + register the gateway)
mcptoon discover # scan this machine for MCP servers (--write to keep, --health to probe)
mcptoon import # import servers from Claude Desktop / Cursor / Cline / Windsurf
mcptoon init # create a sample config (--auto to discover and fill it)
mcptoon list # show configured servers
mcptoon manifest # all tool names (compact by default; 255 tools = 581 tokens)
mcptoon manifest --sort alpha|usage|recent # order the list (usage = your most-called first)
mcptoon manifest --top 3 --verbose # cap to N tools per server; --verbose adds descriptions
mcptoon inspect <server> <tool> # inspect one tool's schema
mcptoon search <query> # search tools across servers
mcptoon select "<task>" # top 3 tools for a task (past ~40 tools, models pick wrong)
mcptoon select "<task>" --top 5 # ...or how many you want
mcptoon call <server> <tool> '{"args":"here"}' # call a tool
mcptoon call <server> <tool> ... --transport sse|streamable # HTTP transport preference (default auto)
mcptoon exec python "print(len(open('big.log').readlines()))" # run code; only stdout enters context
mcptoon exec python --file analyze.py # same, from a script file
mcptoon exec --langs # what this machine can actually run
mcptoon openapi list <spec> # any OpenAPI/Swagger REST API as commands
mcptoon openapi call <spec> <cmd> pet-id=2 # call one operation (params: name=value)
mcptoon openapi call <spec> <cmd> --base-url U # override the server (prod vs staging)
mcptoon openapi call <spec> <cmd> --cache-ttl 0 --cache-key v2 # re-fetch the spec; keep versions apart
mcptoon graphql list <endpoint> # any GraphQL endpoint as commands
mcptoon graphql call <endpoint> <cmd> --fields "name id" # one query/mutation
mcptoon auth login <name> --auth-url U --token-url U --client-id ID # OAuth (PKCE)
mcptoon auth creds <name> --token-url U --client-id ID # OAuth client credentials
mcptoon auth login <name> ... --register REG_URL --client-name mine # DCR (RFC 7591) β no client-id needed
mcptoon openapi call <spec> <cmd> --auth oauth:<name> # use a stored token
mcptoon resources list [server] # list a server's MCP resources
mcptoon resources read <server> <uri> # read one resource by URI
mcptoon prompts list [server] # list a server's prompt templates
mcptoon prompts get <server> <name> a=1 # render a prompt with arguments
mcptoon complete <server> <ref>:<arg>=<prefix> # ask the server to finish a value
mcptoon bake create <name> --openapi <spec> # save a connection under a name
mcptoon bake create <name> --openapi <spec> --auth-header 'K: env:VAR' # secret by reference only (env:/file:)
mcptoon bake run <name> <action> ... # reuse a saved connection
mcptoon bake install <name> --bin ~/.local/bin # write a launcher that only carries the bake name
mcptoon add <name> --stdio|--http <cmd|url> # add any MCP server
mcptoon remove <name> # remove a server
mcptoon install <name> --npm|--pip|--url <pkg> # install + auto-generate handler
mcptoon install --search <kw> # search the live registries (nothing installed)
mcptoon update # refresh each server's cached tool surface; report what moved
mcptoon upgrade # update mcptoon itself to the latest PyPI release
mcptoon plugin install <dir> # install an Agent Plugins 1.0.0 plugin
mcptoon sync # sync native config to every detected agent
mcptoon health # health-check every MCP server
mcptoon serve # run as an MCP server (stdio/HTTP)
mcptoon skills list # list the skill catalog (--usage adds hit counts)
mcptoon skills sync <src> # distribute a skill catalog to every agent's folder
mcptoon skills resolve "<task>" # BM25 shortlist of skills (offline, no LLM)
mcptoon docs index <dir> # index a Markdown tree so agents stop reading it whole
mcptoon docs resolve "<query>" # best files for a query β returns paths (offline)
mcptoon docs list # every indexed document, by slug
mcptoon docs doctor # check the docs index against the disk
mcptoon kb index <path> # index documents so you can search INSIDE them
mcptoon kb fetch <url> # fetch a URL and index it (24h TTL cache)
mcptoon kb search "<query>" # ranked passages, not whole files (porter + trigram, RRF)
mcptoon kb list # indexed sources with size and age
mcptoon kb stats # chunks, DB size, trigram support
mcptoon session # what happened this session (catch up after a compaction)
mcptoon bench # prove the savings on this machine (tools + skills, one table)
mcptoon demo # one command, live demo on your machine
mcptoon demo-server # the same proof with zero downloads (11 stdlib tools)
mcptoon doctor # self-check: Python, config, connectivity
mcptoon status # one screen: what's configured, gateway wired, tokens saved
mcptoon stats # token-savings dashboard (vs raw JSON)
mcptoon report # the whole savings account: tools + skills + cumulative
mcptoon savings # milestones you've crossed (1B? ~12,000 novels?)
mcptoon credit # one screen: your mode, what it really saves, one action
mcptoon mode # which delivery mode you're in (cli/serve/direct) and what each costs
mcptoon statusline # one-line savings badge for a status bar or turn header
mcptoon usage # local call statistics
mcptoon activity # who used mcptoon, when, on what (last 20 calls)
mcptoon footer-facts # one line of savings for a chat footer (never blocks)
mcptoon retrieve <handle> # get back the original behind any --smart handle
mcptoon config # show gateway settings (footer, welcome, lang)
mcptoon toggle <server> <tool> # enable/disable a single tool (--list to show all)
mcptoon policy # per-tool compression policy (raw / toon / slim)
mcptoon completion ps # shell completion (bash/zsh/fish/powershell)
mcptoon off # remove the gateway entry from your agents (reversible)
mcptoon restore # drop the gateway and put your servers back
mcptoon uninstall # full cleanup β prints the plan first (--dry to preview)Full reference in DEVELOPERS.md.
Format family: four tiers, compact by default
All optional; the default is already the leanest tier.
Tier | Output | vs native schema | Origin |
compact (default) | names only | 99.2% smaller | common design |
slim | name + param types | 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 534KB 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 |
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 restoreundoes a takeover (drops the gateway and returns your servers);mcptoon offremoves only the gateway entry;mcptoon uninstall --dryprints 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
--toondecoding ever fails it falls back to JSON, and one--fullrestores 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 # 3010 passed, 2 skippedThree 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: 41,104 lines of Python across 56 modules, zero third-party dependencies.
Support
Hitting an error? Troubleshooting & FAQ covers the common ones
(Server 'X' not configured, the skills sync mis-delete gate, unknown
command/option exit codes, why a saving reads 99% not 100%, and a stale skills
count).
mcptoon is a one-person side project and stays free for individuals. If it cut your context bill:
Sponsor it on GitHub β one-off or monthly.
Star the repo β that's how other builders find small tools.
Team features are not built yet. One shared server list synced to every teammate's machine; a log of what got hydrated when. No pricing and no waitlist page β mail activeing123@gmail.com and it moves up the list.
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.
Available Tools
12 toolsmcptoon_callCall any upstream toolADestructive
Run any upstream tool by its namespaced name (server_tool). Under the default compact exposure the tool list is withheld, so this is how you run one found via mcptoon_manifest. Arguments are validated first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Namespaced name in server_tool form, e.g. fetch_fetch. | |
| arguments | No | Arguments object for the tool; see mcptoon_inspect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| result | No | |
| server | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate the open-world/destructive nature, so the description only needs to add context; it does so by noting the withheld tool list and that arguments are validated first. There is no contradiction between the description and the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: core action, usage context, and validation behavior. No filler or repetition of schema/annotation data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an open-world dispatcher, the description covers how a name is found, what form it takes, how to obtain the arguments object, and the validation guarantee. The output schema covers return expectations, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents the name pattern and points to mcptoon_inspect for the arguments object. The description's 'validated first' is behavioral rather than semantic parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific actionβ'Run any upstream tool'βand names the exact resource format ('namespaced name (server_tool)'). It also separates this execution tool from sibling discovery/introspection tools by pointing to how one arrives at a name via mcptoon_manifest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete when-to-use signal: under default compact exposure the tool list is withheld, so this is the route to run a tool discovered through mcptoon_manifest. It does not explicitly list when-not-to-use cases or name alternative tools, which keeps it a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_healthGateway self-checkARead-onlyIdempotent
Self-check of this gateway process: version, config path, servers configured, tools indexed and uptime. Read this first when a tool you expect is missing; it distinguishes an empty config from a server that failed to load.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| python | No | |
| status | Yes | ok, degraded, error or starting. |
| version | Yes | |
| configPath | No | |
| outputFormat | No | |
| toolsIndexed | Yes | |
| failedServers | No | |
| uptimeSeconds | No | |
| serversConfigured | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description adds genuinely useful behavioral context the annotations do not: this is a diagnostic/introspection call that reveals configuration and load state, and that it is the correct first step in a missing-tool investigation. It does not discuss cost or failure modes, but the read-only nature makes those minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The enumerated outputs come first, then the diagnostic guidance, so the agent gets the gist immediately. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, yet the description still names the salient fields. A parameterless, closed-world, read-only diagnostic tool is fully specified here; nothing an agent needs in order to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate β baseline 4 applies. The description correctly implies the call takes no arguments, matching the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Self-check of this gateway process') and enumerates exactly what it reports: version, config path, servers configured, tools indexed, uptime. This clearly distinguishes it from siblings like mcptoon_manifest and mcptoon_servers, which expose registry contents rather than process health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Read this first when a tool you expect is missing') and names the diagnostic distinction it resolves (empty config vs. server that failed to load). The condition for choosing this tool over any sibling is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_inspectInspect one tool's parametersARead-onlyIdempotent
Show one upstream tool's full input schema β the parameters to call it with. Read-only; nothing runs. Use it after mcptoon_manifest names a tool.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Namespaced name from mcptoon_manifest, e.g. fetch_fetch. A bare name works when only one server owns it. | |
| server | No | Server that owns the tool; disambiguates a shared bare name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| server | Yes | |
| inputSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description reinforces this with 'Read-only; nothing runs' and adds the workflow sequencing, but adds little beyond what annotations already convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that lead with the core action, then state the read-only behavior and the suggested usage context. There is zero filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only inspection tool with full schema coverage, annotations, and an output schema, the description covers purpose, safety, and when to call it. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, including the namespaced tool name and server disambiguation. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Show') and resource ('one upstream tool's full input schema'), and clarifies that it is read-only and executes nothing. This distinguishes it from mcptoon_call and other siblings despite not naming them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use it after mcptoon_manifest names a tool,' giving a clear workflow context. The statement 'nothing runs' implies it is not for execution, but it does not name an alternative like mcptoon_call, so it stops short of a full when-not alternatives list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_kb_indexIndex a document for searchAIdempotent
Chunk a local file or a URL into the knowledge base so mcptoon_kb_search can find passages in it. Indexing is what keeps the document out of your context window while staying searchable.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A URL to fetch and index instead of a local path. Reuses the cached copy within its TTL. | |
| path | No | A local file path to index. | |
| source | No | Optional label for this source in the index. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | No | |
| error | No | |
| chunks | Yes | |
| source | Yes | |
| indexed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose idempotence, non-destructiveness, and open-world behavior. The description adds real value beyond them by explaining chunking and the context-window rationale, though it doesn't address duplicate re-indexing or what happens when both url and path are supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; purpose comes first and the searchability rationale second. Nothing repeats the title or schema unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations cover the safety profile. However, with zero required parameters the description should clarify that at least one of url or path must be supplied and how they interact, which it leaves implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, including URL caching TTL and optional source label. The description only restates the local-file-or-URL choice at a high level and adds no syntax or precedence detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (chunk/index) and resource (local file or URL into the knowledge base) and explicitly ties it to sibling mcptoon_kb_search, so an agent can distinguish it from the retrieval tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'so mcptoon_kb_search can find passages in it' gives a clear use context: index first, then search. No explicit when-not or alternative indexing paths are named, which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_kb_searchSearch inside indexed documentsARead-onlyIdempotent
Return the PASSAGES in already-indexed documents that match a query, not the whole file. Use it instead of reading a large document whole when you need a few lines from it. Index a document first with mcptoon_kb_index.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | How many passages to return (default 5). | |
| query | Yes | Words to find. Substrings and typos are handled. | |
| source | No | Restrict to sources whose name contains this text. Omit to search everything indexed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes | |
| notes | No | |
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the description's job is light. It still adds real context: results are passages rather than whole files, and the tool operates only on pre-indexed content, which explains the prerequisite ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the scope distinction before the usage guidance and prerequisite. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter coverage, and clear annotations, the description supplies what remains missing: passage-level return shape and the indexing prerequisite. Only edge behavior (for example searching before anything is indexed) is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents query, k, and source fully. The description mentions only that a query matches passages and adds no detail on count or source restriction, so the 3 baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the PASSAGES in already-indexed documents that match a query') and explicitly contrasts the scope with whole-file reading. That scope line alone separates it from mcptoon_retrieve and mcptoon_kb_index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it instead of reading a large document whole when you need a few lines from it' gives a clear selection condition against the reading alternative. The prerequisite ('Index a document first with mcptoon_kb_index') is stated by name, though there is no explicit statement of when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_manifestTool manifestARead-onlyIdempotent
List the upstream tools this gateway currently exposes, grouped by server. Returns names by default; that compact view is what an agent should read instead of pulling every full schema. Pass include_descriptions for a one-line summary per tool.
| Name | Required | Description | Default |
|---|---|---|---|
| server | No | Restrict the listing to one server name. Omit to list every server the gateway has loaded. | |
| include_descriptions | No | Attach each tool's first description sentence to the listing. Costs tokens; the default false keeps the manifest small. |
Output Schema
| Name | Required | Description |
|---|---|---|
| servers | Yes | One entry per server that contributed tools. |
| totalTools | Yes | |
| totalServers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so safety is covered. The description adds real behavioral context beyond that: the default response contains names only, and enabling descriptions costs tokens, letting the agent reason about output size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool returns, then the recommended usage, then the optional parameter. Every sentence carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile. The description covers scope, defaults, and cost; only minor details (e.g., how grouping keys are structured) are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented there, so the baseline is 3. The description largely restates the include_descriptions effect ('one-line summary per tool' / default false) and adds nothing about the server filter's matching semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the upstream tools this gateway currently exposes') plus the grouping scope ('grouped by server') and the default output shape (names only). It is clearly distinguishable from sibling tools like mcptoon_servers, which enumerates servers rather than exposed tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to read this compact view 'instead of pulling every full schema,' which is real when-to-use guidance, and it explains when to pass include_descriptions (one-line summaries) versus keeping the small default. It stops short of naming a specific alternative sibling tool or stating exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_resolve_skillsResolve skills for a taskARead-onlyIdempotent
Return the skills that best match a task description, best first. Call this with the user's request before acting, then read the chosen skill's SKILL.md. Offline BM25 ranking, no LLM.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | How many candidates to return. The default 5 is enough to pick from; larger only when the top few look wrong. | |
| task | Yes | What the user wants to do, in their own words. More detail ranks better than a single keyword. |
Output Schema
| Name | Required | Description |
|---|---|---|
| k | Yes | |
| query | Yes | |
| shortlist | Yes | Best matches first, each with its BM25 score. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description adds that ranking is 'Offline BM25 ranking, no LLM.' This tells the agent the algorithm is deterministic and fast, and that no external LLM call is involved. This is useful behavioral context that the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences. The first states the core function; the second gives the usage timing and the algorithm. No wasted words, and the most important info (purpose and when to call) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values don't need explanation. The description covers what it does, when to call it, and the follow-up step (read SKILL.md). For a simple read-only resolution tool, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra guidance: 'More detail ranks better than a single keyword' for task, and for k it explains the default and when to increase it ('larger only when the top few look wrong'). These go beyond the schema descriptions, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Return the skills that best match a task description, best first.' It specifies the resource (skills) and the matching criterion, and distinguishes this from simply listing all skills (a likely sibling). The verb is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a direct usage instruction: 'Call this with the user's request before acting.' It also implies the workflow by telling the agent to read the chosen skill's SKILL.md after. It doesn't explicitly name alternatives or state when not to use it, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_retrieveRetrieve a compressed resultARead-onlyIdempotent
Get back the full, uncompressed text of a tool result mcptoon compressed. When a result ends with a line naming a handle, call this if the summary lacks a detail you need.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | The handle from a result's 'mcptoon_retrieve handle=...' line, e.g. ab12cd34ef56. |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | Yes | |
| handle | Yes | |
| original | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: it describes what the call returns (the full uncompressed text) and the dependency on a handle emitted by the compression step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded with purpose then trigger; every clause earns its place and nothing is repeated or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail can be omitted, and the description covers the remaining essentials: what is retrieved, why it exists (compression round-trip), and when to invoke it. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single handle parameter is already documented in the schema's own description, including its format and where it comes from. The description adds no syntax or format detail beyond what the structured field provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get back the full, uncompressed text of a tool result mcptoon compressed') and ties it to the compression mechanism, which no sibling tool does. An agent can distinguish this from mcptoon_call or mcptoon_inspect without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger condition: 'When a result ends with a line naming a handle, call this if the summary lacks a detail you need.' This is clear when-to-use context, though it stops short of stating when not to call it or naming an alternative retrieval path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_serversConfigured serversARead-onlyIdempotent
Report the MCP servers configured behind this gateway: transport, tool count and whether their tools loaded. Use it to see what is actually reachable before calling a tool, and to spot a server that configured but published nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| server | No | Report one server by name instead of all of them. Aliases resolve to the canonical server name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| servers | Yes | |
| configured | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, openWorld=false, non-destructive). The description adds genuine behavioral context beyond that: it discloses what state is examined (load status) and surfaces a diagnostic condition ('configured but published nothing') that an agent would not know to look for from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the purpose is front-loaded and the usage sentence adds distinct value rather than restating the first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers purpose, usage, and the optional narrowing parameter. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the single optional 'server' parameter including alias resolution. The description only implies an all-by-default scope, adding nothing the schema does not already say, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('report the MCP servers configured behind this gateway') and enumerates the reported fields (transport, tool count, load status). An agent can distinguish this from siblings like mcptoon_manifest and mcptoon_health without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: 'see what is actually reachable before calling a tool' and spot servers that published nothing. No explicit when-not or named alternative sibling, but the diagnostic framing makes the use case unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_sessionThis session's activityARead-onlyIdempotent
Summarise what has routed through this gateway in this project: tools used, files written, errors, git operations. Call it after a context compaction to catch up on where you were. It is on-demand, not automatic β the gateway cannot inject into your context itself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | No | |
| events | Yes | |
| gitOps | No | |
| project | Yes | |
| toolsUsed | No | |
| filesWritten | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely non-derivable behavior: it must be pulled explicitly and cannot be auto-injected, which explains why an agent should invoke it proactively. Return shape is covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the content summary comes first, then the invocation guidance and the caveat about non-automatic delivery. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema describing the return value and annotations covering the safety profile, the description supplies exactly the missing pieces β what is aggregated and when to call it. Nothing an agent needs to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate; the baseline for a parameterless tool applies. The description correctly implies no inputs are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Summarise') and resource ('what has routed through this gateway in this project') and enumerates the covered content: tools used, files written, errors, git operations. The scope is unambiguous, though it never explicitly contrasts itself with siblings like mcptoon_usage or mcptoon_inspect that might also report activity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger β 'Call it after a context compaction to catch up on where you were' β plus the important clarification that it is on-demand and the gateway cannot inject into context. No alternatives or exclusions are named, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_skillsSkill catalogARead-onlyIdempotent
List the skills mcptoon indexes on this machine: slug and one-line description per skill. Read it once to learn what skills exist, then resolve the one you need with mcptoon_resolve_skills. Offline and read-only; pass include_aliases to also see alias cards.
| Name | Required | Description | Default |
|---|---|---|---|
| include_aliases | No | Include alias cards, not only canonical skills. The default false keeps one row per real skill. |
Output Schema
| Name | Required | Description |
|---|---|---|
| skills | Yes | One entry per skill, sorted by slug. |
| totalSkills | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply readOnlyHint, idempotentHint, and destructiveHint, so the description adds value by clarifying 'offline and read-only' and explaining the alias-card behavior. No contradiction with annotations; the only minor gap is no detail about result ordering or size, but the output schema covers return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, information-dense sentences with no filler. The purpose is front-loaded, and the follow-up tool reference and optional parameter hint each occupy their own meaningful sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, read-only catalog tool with one optional boolean parameter and a provided output schema, the description is complete. It covers what the tool returns, how to use it in the broader discovery flow, and its safety/offline characteristics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the include_aliases parameter is already well-documented in the schema. The description mostly restates the same meaning ('pass include_aliases to also see alias cards'), adding little beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List'), a clear resource ('the skills mcptoon indexes'), and the output shape (slug and one-line description). It also distinguishes itself from the sibling mcptoon_resolve_skills by framing itself as the discovery step before resolution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to read this once to learn available skills and then resolve the target with mcptoon_resolve_skills. It also gives the optional include_aliases usage condition, making the intended workflow unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcptoon_usageToken savings so farARead-onlyIdempotent
How much this gateway has saved: tools compressed, tokens saved and the session call count. Call this when you want to tell the user what mcptoon did. Report these numbers verbatim; never estimate them yourself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| savingsPct | Yes | |
| tokensSaved | Yes | |
| callsRecorded | No | Calls mcptoon has recorded, cumulative across sessions. |
| footerEnabled | Yes | False when the user turned the disclosure off. |
| toolsCompressed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds genuinely useful behavioral context beyond those: 'Report these numbers verbatim; never estimate them yourself.' This is a real instruction about how to handle output data that prevents a common agent failure mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The first front-loads the resource and the specific metrics; the second delivers the when-to-call guidance and the verbatim-handling instruction. Zero filler words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only reporting tool with an output schema and full annotation coverage, nothing essential is missing. The description explains what the report contains, when to invoke it, and how the values must be handled. Low complexity means low documentation burden, and this fully meets it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. Schema coverage is provably complete at 100% since the schema is an empty object. The description's mention of the three reported metrics is output-related rather than parameter-related, but no compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (this gateway's savings) and enumerates the exact data points returned: tools compressed, tokens saved, and session call count. This verb+resource framing distinguishes it from siblings like mcptoon_health, mcptoon_manifest, and mcptoon_servers without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: 'Call this when you want to tell the user what mcptoon did.' This provides clear context for when the tool is appropriate. It stops short of a 5 because it doesn't explicitly name alternatives or state when not to use it, but the use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.8.26- Added
mcptoon_kb_index - Added
mcptoon_kb_search - Added
mcptoon_session
1 tool update
v0.8.2- Added
mcptoon_retrieve
13 tool updates
v0.8.1- Removed
demo_build_tool_manifest - Removed
demo_compare_formats - Removed
demo_decode_toon - Removed
demo_describe_runtime - Removed
demo_echo_message - Removed
demo_encode_toon - Removed
demo_estimate_tokens - Removed
demo_list_supported_agents - Removed
demo_report_benchmark_rows - Removed
demo_simplify_tool_schema - Removed
demo_validate_config_draft - Added
mcptoon_call - Added
mcptoon_inspect
2 tool updates
v0.7.23- Added
mcptoon_resolve_skills - Added
mcptoon_skills
1 tool update
v0.7.19- Added
mcptoon_usage
14 tool updates
v0.7.14- Added
demo_build_tool_manifest - Added
demo_compare_formats - Added
demo_decode_toon - Added
demo_describe_runtime - Added
demo_echo_message - Added
demo_encode_toon - Added
demo_estimate_tokens - Added
demo_list_supported_agents - Added
demo_report_benchmark_rows - Added
demo_simplify_tool_schema - Added
demo_validate_config_draft - Added
mcptoon_health - Added
mcptoon_manifest - Added
mcptoon_servers
TDQS
Scored across 12 tools
Each tool has a describable job and the descriptions cross-reference each other (manifestβinspectβcall, skillsβresolve_skills, indexβsearchβretrieve), which makes the intended chains clear. The weak spot is the meta/status cluster: health, servers, session and usage are all 'report something about the gateway', and an agent may briefly hesitate between health and servers or between session and usage.
Every tool shares the same mcptoon_ namespace prefix and snake_case, so the set reads as one family. The trailing segment mixes verbs (call, inspect, retrieve, resolve_skills) with bare nouns (manifest, session, health, servers, skills, usage), so there is no strict verb_noun grammar, but it is predictable and readable.
Twelve tools is squarely in the sweet spot for a gateway. Each one maps to a distinct need β discover, introspect, invoke, decompress, index, search, skills, and observability β and none looks like filler.
The invoke path (serversβmanifestβinspectβcallβretrieve) and the skills path are fully covered, with health and usage for diagnostics. The knowledge-base path is the gap: you can index and search, but there is no way to list what is indexed, delete or re-index a stale document, so an agent can create state it cannot clean up.
Maintenance
Related MCP Connectors
MCP server for progressive tool usage at any scale (see https://klavis.ai)
One AI endpoint to search and call 22k+ MCP servers; 50+ hosted tools work instantly, no key.
A registry of AI agent tools β MCP servers, APIs, CLIs, SDKs β kept current by automated ingestion.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that publishes CLI tools on your machine for discoverability by LLMs5 npm1MIT
- AlicenseNot gradedqualityBmaintenanceAutomatically converts any CLI built with Python's Typer into an MCP server without changing code. Gives AI agents instant access to thousands of CLI tools.AGPL 3.0
- AlicenseCqualityDmaintenanceTurn any REST API into an MCP server in one command. Point mcpify at an OpenAPI spec and every endpoint becomes a tool your AI agent (Claude, Cursor, Windsurf) can call β zero glue code, always in sync with the spec.35MIT
- AlicenseNot gradedqualityCmaintenanceThis MCP server is a zero-config CLI tool that lets developers tap into any stdio-based MCP server from their terminal, enabling them to list tools/resources/prompts, call tools with JSON arguments, and health-check servers without requiring a full AI client or browser setup.1MIT