schema_bytes is JSON.stringify(schema).length for one registered tool, captured from the startup payload when a client calls initialize.
Why it is a cost
Every tool your server registers is sent to the model at the start of every session, whether or not it is ever called. The name, the description and the full input schema all land in the context window before the conversation begins. A server with forty tools averaging 400 bytes of schema each spends 16kB — roughly 4,000 tokens — before answering a single question. That is paid once per session, by every user, forever. This is the cost that is completely invisible without instrumentation, because nothing in the protocol reports it back to the author.Where it appears
It comes from startup, not from calls
A tool appears in MCPulse the moment a client initialises against your server. That is what makes a tool “registered but never called” a thing MCPulse can see at all — the counters would never know the tool existed. Two consequences:- A tool you removed keeps its last recorded schema size until a new startup payload replaces the list.
- A server nothing has connected to yet has no tool list, so schema sizes are absent rather than zero.
Reading it
There is no threshold on schema size alone, because a large schema for a heavily used tool is money well spent. It becomes an insight only when combined with disuse — see Dead tools. Rough shape of what is normal:
Long descriptions are usually worth their bytes; deeply nested optional objects usually are not.