v1.1.1 — the release that came from building a test
godot-mcp-bridge 1.1.1 — the release that came from building a test
1.1.0 shipped a debugger and a language server. This one shipped almost nothing
you can point at, and is probably the most important release so far.
It started as a chore: write an automated test for the live-scene path — the case
where the scene is open in the editor and tools mutate the real node tree instead
of a file on disk. That half of the project carries its hardest invariants and had
no automated coverage at all. The GDScript suite runs without an EditorPlugin, so
it only ever exercised the disk path, and the end-to-end suite skipped in CI for
want of a Godot binary. Green by omission.
The test found four things that had been true for months.
Fifteen tools destroyed unsaved work
They loaded the scene from disk, mutated the copy, and saved it. On an open scene
that does two destructive things at once: the save throws away whatever is unsaved
in the editor, and the reload that follows wipes the live tree.
Confirmed by hand before the test existed — an attach_script call deleted an
unsaved node from a real project outright. Not "failed to save it". Deleted it.
attach_script, detach_script, set_node_groups, set_collision_shape,
set_sprite_texture, set_mesh, set_material, set_anchor_preset,
snap_node_to_grid, set_scene_node_property, set_resource_property,
instance_scene, connect_signal, disconnect_signal, and the batch editor.
Not clobbering your work is the first thing this project claims about itself. It
was false for fifteen tools, and nothing would have caught it.
Eleven read tools had the mirror problem: they reported last-saved state, so an
agent that edited and then read back got stale values with no way to tell — which
reads as "the edit silently failed". Also fixed.
Undo was mostly an illusion
Only seven structural actions ever reached Godot's undo history. Every other live
edit — properties, materials, animation tracks, tilemap cells, physics layers —
had no undo entry at all, so Ctrl+Z did nothing and the only way back was closing
the scene without saving.
Worse, the seven that did register were filing into the wrong history.
EditorUndoRedoManager keeps one per scene and infers it from the first object an
action registers; add_node registered the tool node itself, which lives under
the EditorPlugin rather than in the scene. Ctrl+Z on the scene never reached it.
Every live edit now registers, with the history pinned explicitly. Tilemaps record
one snapshot of the layer's whole cell payload rather than an entry per
coordinate, so a hundred-thousand-cell fill costs one undo step. A batch_scene_edit
is a single entry, so Ctrl+Z reverts the whole batch.
undo_last / redo_last are new: the agent can take back its own last change
without asking you to reach for the keyboard. The history is shared with you, so
if you acted after it did, it undoes your action — the response says what it
actually undid rather than assuming.
"Batch discarded, nothing saved" was a lie
batch_scene_edit said that on failure while leaving its earlier operations
applied, because the discard path is a no-op on a live scene. The batch is now
committed as one undo entry and immediately undone on failure, so the message is
finally true.
The advertised Godot version was wrong
The badge said 4.3+. It isn't. The editor-mode scene path — the one every scene
tool depends on — fails outright on 4.3 and 4.4.
This was not a guess or a reading of release notes: the live harness was run
against each release. 4.3 fails, 4.4 fails, 4.5 passes all 28 assertions. The
minimum is now stated as 4.5, and CI pins that version, so the badge is
something you can check rather than something we hope is true.
CI had been pinned at 4.3 the whole time and stayed green, because the old parse
check called load() — too weak to notice. Three constructs needing even newer
engines were replaced with portable equivalents along the way.
validate_scripts flagged a file that was fine
It compiled a throwaway copy built from source alone, which has no path — and
several GDScript warning settings are path-sensitive, notably exclude_addons.
Without a path that exemption is lost, and any warning the project promotes to an
error fails the compile with an empty error list. The copy now gets a path next to
the original.
Also
- The port is configurable.
GODOT_MCP_PORT, or agodot_mcp/network/port
project setting. More useful:GODOT_MCP_PROJECTmakes the bridge refuse any
editor that doesn't have that project open. The addon dials a fixed port and
cannot tell which server answered, so without this the first editor to connect
is trusted with every tool call — which is how a test suite once created a
scene inside an unrelated game project. query_runtime_nodedistinguishes "this property is null" from "this
property doesn't exist". A typo used to read as legitimate state.- Stringified arguments no longer coerce
"true"/"false"on free-form text
keys. A node namedtrueused to become a boolean. - PathGuard now covers five script-writing functions in the visualizer that
had been skipping it.
Testing
- The live harness: 28 assertions against a real headless editor, now running in
CI where the e2e suite previously skipped. - GDScript suite: 150 → 207 assertions.
parse_all.gdcompiles every addon script instead of callingload(), whose
resource cache let a genuinely broken file through three times.
Upgrade notes
211 tools (209 + undo_last, redo_last). Nothing removed, no schemas changed;
1.1.0 usage keeps working. Versions bumped across mcp-server/package.json,
mcp-server/server.json and addons/godot_mcp/plugin.cfg.
The addon is where nearly all of this lives, so reinstall it (npx godot-mcp-bridge install) rather than only updating the npm package.