tools/list is where the tokens go.This page is about the protocol method, not about your workflow. MCP is stateless: a client
cannot know which tool you will call, so tools/list returns the complete input schema of
every tool, and a well-behaved client puts all of it in front of the model. That response is the bill.
tools/list255 tools across a handful of servers, full inputSchema JSON, encoded with
tiktoken cl100k_base. The same catalog reduced to a name index is 581 tokens
(−99.2%) — same tools, same servers, same capabilities.
A single well-documented tool is typically 300–600 tokens of JSON: property names, nested types,
required arrays, defaults, and the prose descriptions that make the tool usable at all. None of
that is waste — it is what makes a call correct. The problem is scope, not quality: the model is
handed the schema of tools it will never call in that session, and handed it again on the next turn.
| What the model receives | On a 255-tool catalog |
|---|---|
tools/list, full schemas | 71,929 tokens |
| name index (names only) | 581 tokens |
name + parameter types (--slim) | 3,035 tokens |
| one tool's full schema, on demand | that tool only |
All four rows are the same catalog, measured the same way — the rows are directly comparable, which is the only reason quoting them together is fair.
Some clients cache the tools/list response to avoid refetching it. That saves the
round trip; it does not save the context. The tokens still enter the window, still occupy the
attention budget, and still need to be re-sent for the model to reason over them. Caching addresses
latency, not cost.
mcptoon answers tools/list with names and a short line instead of full schemas, keeps
the schemas on disk, and returns exactly one real schema when the model asks to inspect a tool. The
protocol interaction is unchanged from the model's point of view — it still chooses a tool and calls it —
but the standing cost drops by two orders of magnitude.
pip install mcptoon mcptoon manifest # what the model sees: 581 tokens mcptoon manifest --slim # names + param types: 3,035 tokens mcptoon inspect <server> <tool> # one full schema, on demand mcptoon bench # reproduce all of this on your catalog
Get mcptoon on GitHub Calculate your token cost
Is tools/list called on every turn?
Not necessarily the network call — but the result is re-sent with the conversation each turn, which is what costs tokens. Clients that cache the response still pay it in context.
Can I just trim the descriptions?
Partly, and it is a real lever — descriptions are a large share of the bytes. But trimming fights the documentation that makes tools usable, whereas indexing removes the need to send unused schemas at all.
How is this different from "too many MCP tools"?
Same symptom, different angle: this page is about what the protocol method returns. The tools guide is the diagnostic walkthrough — whether the problem is yours and what the alternatives cost.