Changelog
Full release notes live on GitHub Releases. This page summarizes the recent ones.
2026.10.15 — Security hardening, honest results, and a leaner agent surface
A deep review pass across the whole server and addon: the safety/permission model is now enforced end to end, partial failures are reported honestly instead of as success, the debugger tells the truth about what the engine cannot do, and the tool surface is easier for an agent to select from. Surface: 194 tools (unchanged). Shape is additive — contract_version stays 1 — with one behavioural note below.
- Security (#634–#638, #649, #650) —
run_commandsnow enforces each sub-command's own safety class; the bridge authenticates a new peer before evicting the active one; the WebSocket/HTTP listeners checkOrigin/Host; every file-path parameter is contained tores://; the safety-class audit reclassified six tools (create_resource,set_setting,register_autoload/unregister_autoload,cross_scene_set_property,disconnect_signal) asdestructiveand made code-execution/disk-write tools approval-gated with a fail-closed default; the publish workflow builds the tagged commit, gates on tests, and pins actions by SHA; every CI job guards against fork PRs. - Honest results (#640–#645, #670/#671) — asset edits land in the scene undo history;
type_coercecovers the full shape set and property writes are verified by read-back;own_recursiveno longer descends into instanced sub-scenes; the over-threshold batch path marks the scene dirty; a timed-out mutation is flaggedmay_have_applied;cross_scene_set_propertyvalidates tabs and ownership; runtime and debugger reads are request-scoped so a stale reply cannot be mistaken for the current one. - Debugger & runtime (#677, #648) —
evaluate_expressionruns in-game through the probe;get_stack_frames/get_frame_variablesreturn a structuredUNSUPPORTEDon Godot 4.7 instead of a wrong answer; the probe stays parseable on the 4.4 floor. - Reliability & lifecycle (#655, #675, #647, #646, #683) — bridge/runtime lifecycle leaks closed; the leaked runtime-probe autoload is removed from the project; addon scan re-entrancy, oversize replies, and property type names fixed; autoload names validated and save errors surfaced; visual-shader create is redoable.
- Agent experience (#652, #653, #654, #691) — every tool reference in hints and docstrings resolves; tool schemas gained description budgets and enums; known-shape
dictparams are typed;enable_toolsetaccepts a bundle (author/playtest/ship) or a comma-separated list, collapsing the setup loop to one call. - CI & docs (#651, #672, #656) — live-editor e2e coverage closed and the play-session e2e runs under a virtual display; a portable hook plus a version-consistency test keep the CalVer copies in lockstep; docs, skills, and examples refreshed against the final surface.
Behavioural note: the six tools moved to
destructivenow requireconfirm=True(defaultFalse). Calls that omitted it and previously succeeded must now pass it.
2026.10.12 — Version awareness, a resilient addon, and a friendlier site
The server can now tell you when it — or the addon — is out of date, the addon can no longer silently drop an import, and the docs are rebuilt around getting you to a first working session fast. Surface: 194 tools (one new). Additive — contract_version stays 1.
- Version drift & update check (#629) —
godot_health_checkandgodot_get_server_inforeport the connected addon's version and flag a server↔addon mismatch; a newgodot_check_for_updatestool (opt-in viaGODOT_MCP_CHECK_UPDATES, off by default — no silent phone-home) reports whether a newer release exists, and a known update is surfaced inget_server_infoand the editor dock. - Reliable asset import (#628) —
godot_asset_import_assetno longer silently drops its filesystem scan when one is already in flight: the addon defers and re-issues it, so a freshly copied asset actually imports (and reportsscan_deferredwhen it queued one). - The addon is "Godot Editor MCP - Addon" — its in-editor plugin name and its Godot Asset Store listing now match.
- A friendlier site — a creator-first home, a getting-started path that leads with the skill (so your assistant enables toolsets itself), and a clearer split between the hands-on guides and the deep "Under the hood" reference. The
godot_*calls are the assistant's; the docs no longer ask you to type them.
2026.10.10 — Gating that works on the sessionless protocol
Toolset gating now works end to end on the 2026-07-28 sessionless protocol, and the server no longer trusts the client to refresh its tool list. Surface: 193 tools (unchanged). Additive — contract_version stays 1.
subscriptions/listenserved and advertised (#620) — the server registers aListenHandler(backed by an in-memory bus) on FastMCP's low-level server, so the modern handshake advertisestools.listChanged: trueand a subscribing client receivesnotifications/tools/list_changedafter a toggle. Previously the flag was advertised asfalseon the modern era, so capable clients (Claude Code CLI) never subscribed.- Self-sufficient enable result (#621) —
godot_enable_toolsetreturns each enabled tool's name, description, and input schema, so a client that ignores the notification (most of them) can still call the tools straight from the result. - Fire-and-forget dock push (#624) — the editor dock's toolset row is pushed with the new
Bridge.notify(no awaited reply), so a silent addon no longer stallsenable_toolset/disable_toolsetfor the 10s request timeout. - MCP stack upgrade (#622) — FastMCP
4.1.0/mcp2.3.0, withResultValidationMiddlewareadapted to FastMCP 4.1's_ToolBodyErrorbody-error tag so a result-shape mismatch stays a structuredINTERNAL_ERROR. - Front-door README + cleanup — the README is now a short landing pointing at this docs site; stale historical docs and non-OpenCode harness artifacts were dropped.
2026.09.30 — Dock feedback, peer-replacement notice, authoring docs
The editor dock becomes a trustworthy supervisor's view, plus two additive bridge-contract changes and a documentation pass. Surface: 193 tools (unchanged). Additive — contract_version stays 1.
- Dock logs command outcomes (#589) — the recent-command log is fed from completion, not dispatch:
✓on success,✗ <ERROR_CODE>on failure, so a failed command reads differently from a successful one. - Replaced-editor state (#593) — when a second editor takes over the bridge, the server sends the replaced peer a
PEER_REPLACEDnotice before closing it; the dock shows a distinct "Replaced by another editor" state (never a misleading green) and stops reconnecting. New additive error codePEER_REPLACED; reconnect attempts and auth refusals now land in the dock log too. - Visible UndoRedo guarantee (#590) — a "Last action" row shows the most recent undoable change and how to revert (Ctrl+Z).
- Dirty-scene + play/probe rows (#591) — the scene row marks unsaved edits (
main.tscn ●); a "Playing" row shows the running scene and probe state. - Toolsets row fed from the server (#592) —
cmd_toolsets_updatepushes the enabled-set on connect and after every toggle, so the dock no longer shows a permanent(none)(unknown until the first push, honestly). - Dock log polish (#594) — depth 10 → 50 (survives a 20-command batch), a Copy recent commands button, and a session-scoped command count.
- Skills: correctness + authoring guides (#611, #614) — dropped stale hardcoded counts (defer to the live inventory), documented the
godot://resource surface, fixed the per-project addon guidance, and added five authoring reference guides togodot-expert(TileSet/GridMap, VisualShader, text shaders, theme/UI, particles/animation/navigation).
2026.09.28 — One-shot runtime reads, screenshot transport, probe hardening
Robustness and honesty pass over the runtime-session surface, plus one new tool. Surface: 193 tools (was 192; +godot_runtime_read_property). All changes additive — contract_version stays 1.
- Dedicated one-shot property read (#571) —
godot_runtime_read_property(read_only): reads a live property once without disturbing the monitor capture; mid-capture reads and stale-request_idpolls are safe (#577). - Full-screenshot transport (#563) — raised WebSocket buffer caps on both sides so full-resolution captures transfer instead of truncating.
- Probe runs while paused (#565) — the runtime probe keeps processing frames while the SceneTree is paused, so captures don't stall behind a
get_tree().pausedgame. - Physical-keycode binding probe (#570) — injected keys match physical-keycode (
KEY_) bindings, not just keycode ones. - Result models are JSON-strict (#580) — addon-produced fields on result models are strictly typed; malformed bridge payloads surface as
INTERNAL_ERRORinstead of passing through (#567). ui_elementsreplies gated on the pending request_id (#577) — a stale capture's late reply can no longer resolve the wrong waiter.- CI hardening (#579, #583, #587) — setup-uv pinned (no manifest fetch), the e2e suite bounded with
timeout --kill-after, stray godot processes reaped; previously-unverified smokes wired into CI. - Proactor
ConnectionResetErrordemoted to DEBUG (#572) — benign disconnect noise no longer logs at ERROR. - Timer-based filesystem auto-refresh (opt-in) — the editor can pick up external edits on a timer; off by default.
- Class info accepts Variant-shaped defaults (#564) —
describe_classno longer chokes on Variant-typed property defaults.
2026.09.23 — Prefab workflow, snapshot verification, C# authoring
Closes the authoring gaps: the editor's inverse moves, one-round-trip verification, and C# authoring behind a capability gate. Surface: 192 tools (was 184). All changes additive — contract_version stays 1.
- Extract subtree to PackedScene (#531) —
godot_scene_edit_extract_scene(mutating): the editor's "Save Branch as Scene" — packs a subtree into a reusable.tscn, optionally replacing it with an instance in one UndoRedo action; refuses non-owned/mixed-ownership subtrees (#477 family). - Move/rename project file (#532) —
godot_project_move_file(mutating):res://move with project-wide dependency remap (path + uid forms),.uidsidecar relocation, uid re-point; structured refusals for missing source / existing destination / open-and-unsaved scene; honestundoable: falsewith a recovery hint. - Snapshot + diff a subtree (#535) —
godot_inspection_snapshot_subtreegodot_inspection_diff_snapshots(bothread_only): verify a batch mutation in one round-trip; server-side bounded LRU store; group changes surface asproperty: "groups".
- Push-on-change property sampling (#536) —
monitor_propertydedupes unchanged values by default (epsilon-tolerant floats, recursively through Vector2/Color shapes);requested/dropped_duplicates/sampling_usechonesty stats;on_change_only=Falserestores legacy sampling. - Optional bridge auth token (#538) —
GODOT_MCP_BRIDGE_TOKENon both sides; the addon authenticates as its first message; a mismatch is refused at the handshake with a structured envelope (reconnect loop shows the reason); unset = byte-identical no-auth path. Never logged. - C# Phase 1 (#207) — language-aware script authoring: read/write/list accept
.cs(default GDScript, contracts unchanged);listgainslanguage=gd|cs; a.cswrite carries a validate-via-build hint (never a false parse-OK); parse/patch refuse.csuntil Phase 2 (#560);get_server_info().bridge.backendsurfaces{csharp_supported, csharp_project, csharp_build}. - ClassDB discovery (#533) —
godot_describe_class: properties/methods/ signals for agent discovery before setting. - Game console output (#534) —
godot_runtime_get_game_output: the running game's stdout/stderr/script errors from a bounded ring. - Server↔addon handshake (#530/#521) —
cmd_get_addon_infocached per peer;get_server_infoexposesaddon_version/addon_commands+ a drift warning; the dock labelsgodot-mcp <ver> / Godot <ver>. - Peer identity (#537) — the addon announces project path/Godot/addon versions at connect; peer replacement is logged naming both paths.
- Undo/redo parity (#529) —
godot_redo+godot_list_history. - Refactors: single-sourced add-child undo commits (#528), unified probe/break guards (#526), shared helpers extraction (#546), honest
command_completedexec_ms (#520), prop-cache staleness fix (#540), dock status-icon texture cache (#539).
2026.09.19 — Persistence truth everywhere + verification tools
Completes the persistence-truth family, formalizes the readiness/reason envelope, adds the verification tools the "advertised verification" trust gap needed. Surface: 184 tools (was 181). All changes additive — contract_version stays 1.
- Persistence truth for structural edits + batches (#477) — parent rule for 13 create-family handlers, destination rule for moves, node rule for deletes, per-target
persistence[]verdicts forbatch_set_propertyandapply_node_edits; live e2e asserts the saved file agrees with every verdict. godot_scene_edit_set_editable_children(#487) — the action theinstanced_child_not_editablehints name; the tree marks instanced nodes withowner/editable_children.- Readiness/reason envelope (#456/#457/#459) — every poll handler carries a stable
reasontoken;poll_readyrelays it in timeout errors. godot_shader_validate(#423) — real headless engine compile check;get_parse_errorsdocumented as syntax-level.- Audio effect property echo (#427) —
get_bus_layoutechoes per-effectproperties(read/write parity). - AudioStreamWAV loop settings (#418) —
import_assetacceptsloop_mode/loop_begin/loop_endfor.wav;loop_appliedverdict. godot_scene_edit_rescan_filesystem(#486) — pick up external file edits non-destructively.- Skills teach the honesty semantics + round-trip economy (#501).
2026.09.17 — Honest reporting & trust-class fixes
- Timeout ≠ crash: no false
NON-ZERO EXIT;expected_timeoutparam (#490). run_commandsreportsaborted_at/skipped_counton early stops (#437).batch_set_propertyreportsundoable(false above 20 nodes) (#461).set_settingrefuses unknown keys with a did-you-mean hint (#462).- Input simulation refused while paused at a debugger break (#443).
get_parse_errorsgates on the editor's filesystem scan (rescan_pending) (#453).- Addon RefCounted leak cycles fixed (#492, by Vincent Huang).
tools/list_changedemitted on enable/disable (#491).- Toolset-gating text reflects the effective
GODOT_MCP_DEFAULT_TOOLSETS(#425). - OpenWebUI setup guide (#484, by Randall Lasini).
2026.09.10 — Game frame capture + silent-failure hardening
- Live game screenshots/frames via the probe; silent-failure fixes across persistence previews (#458/#475/#476); debugger session hygiene (#454).
Earlier
See the releases page for the full history (2026.09.02 "First Stable", 2026.08.31b4, …).