Problem
MCP tool schemas are fixed per-session context overhead — they live in the model's system prompt for the entire session whether or not the tool is ever called. Measured via Claude Code's /context:
configure = 1.9k tokens — the single largest tool in the server
- Whole
speech-to-cli server = ~4.5k tokens
- So
configure alone is ~42% of the server's footprint
The schema enumerates 36 properties, each with a full description (key, region, tts_region, player, recorder, mic_source, all the chime_*, subtitle_color_*, barge_in_*, etc.).
Why it's avoidable
handle_request already treats configure as a generic key→value setter ("Pass any setting as a key-value pair to update it"). The 36-property schema is effectively documentation stored in the most expensive place possible — re-sent every session.
Proposal
- Replace the 36 enumerated properties with a single free-form object:
{"settings": {"type": "object", "description": "Key→value settings to update. Call with no args to list all available settings + current values."}}
- Make
configure() with no args return the full catalog (key, type, current value, one-line doc) — discovery moves to runtime, on demand.
- Move the per-key reference into
README.md / docs/.
Impact
Reclaims ~1.7k tokens of always-on context (~90% of this tool). No behavior change — the handler already accepts arbitrary keys.
Filed from a context-footprint audit of the MCP tool surface.
Problem
MCP tool schemas are fixed per-session context overhead — they live in the model's system prompt for the entire session whether or not the tool is ever called. Measured via Claude Code's
/context:configure= 1.9k tokens — the single largest tool in the serverspeech-to-cliserver = ~4.5k tokensconfigurealone is ~42% of the server's footprintThe schema enumerates 36 properties, each with a full description (
key,region,tts_region,player,recorder,mic_source, all thechime_*,subtitle_color_*,barge_in_*, etc.).Why it's avoidable
handle_requestalready treats configure as a generic key→value setter ("Pass any setting as a key-value pair to update it"). The 36-property schema is effectively documentation stored in the most expensive place possible — re-sent every session.Proposal
{"settings": {"type": "object", "description": "Key→value settings to update. Call with no args to list all available settings + current values."}}configure()with no args return the full catalog (key, type, current value, one-line doc) — discovery moves to runtime, on demand.README.md/docs/.Impact
Reclaims ~1.7k tokens of always-on context (~90% of this tool). No behavior change — the handler already accepts arbitrary keys.
Filed from a context-footprint audit of the MCP tool surface.