v1.2.1 — 12% off what every request pays
Tool definitions are sent on every request, so the default surface is a standing
cost on every message. This release cuts it from 10,835 tokens to 9,533
without removing a capability, and fixes the measurement that had been
understating it.
The number was wrong
Seven of the tools in tools/list are answered by the server itself — status,
the guides, find_tools, the toolset controls. They are not Godot tools and are
not in TOOLSETS, but they ride in every request. They were defined inline in
the ListTools handler, which put them out of reach of the measurement script,
because importing index.ts starts a server.
So the published figure was 8,764 for a surface that cost 10,067. The
definitions live in meta-tools.ts now; the handler and the script share one
copy, and the README quotes what a request actually pays.
What came out
Prose that was already somewhere else. modify_node_property.value listed
the whole Godot variant table, which the scene-editing guide lists word for
word — 213 tokens down to 91, keeping inline the part that prevents a mistake
(Resource-typed properties need a different tool). run_scene enumerated its
own response fields and repeated the testing loop that get_guide exists for.
add_node explained the two child key styles, then children explained them
again. delete_file's confirm and force restated the tool description.
dry_run had eight different wordings across sixteen core tools, most of
them describing what the caller sees in the response anyway. They share the
short form now, except on create_script and edit_script, where the preview
reports something the response cannot: whether the snippet would have matched.
Lists that belonged in the schema. The 22 toolset names appeared four times
in prose across enable_toolset, disable_toolset and list_toolsets, and the
guide slugs twice. Both are enum now — shorter than the sentence that listed
them, and a field a client can validate against.
One behaviour change
modify_node_property is no longer in the default surface. It is
set_node_properties with exactly one entry in the map — same target, same
parse, same save — and carrying both cost 354 tokens per request while giving a
model two near-identical tools to choose between.
It is not gone. It falls back to the scene_editing toolset, so it is
advertised whenever that toolset is on, and it stays callable by name either
way (execution has never been gated on toolsets). set_node_properties takes
one property as happily as many, and now carries the warning
modify_node_property held: a "script" property there rewrites the file and
leaves the editor's in-memory node scriptless, which makes connect_signal
fail.
If your setup calls it by name, nothing changes. If it relies on seeing it in
tools/list, add scene_editing to GODOT_MCP_TOOLSETS.
Numbers
| before | after | |
|---|---|---|
| Default surface, as a client sees it | 10,835 | 9,533 |
| Tools in that surface | 45 | 44 |
list_toolsets |
2,006 | 855 |
| Everything on | 50,563 | 50,934 |
Tests: 243 Node, 44 live, 786 GDScript. set_node_properties with a single
property, modify_node_property itself, create_scene, a dry-run add_node,
delete_file's confirm gate, and all seven server-side tools were checked
against a live editor after the cuts.