Skip to content

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_commands now enforces each sub-command's own safety class; the bridge authenticates a new peer before evicting the active one; the WebSocket/HTTP listeners check Origin/Host; every file-path parameter is contained to res://; the safety-class audit reclassified six tools (create_resource, set_setting, register_autoload/unregister_autoload, cross_scene_set_property, disconnect_signal) as destructive and 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_coerce covers the full shape set and property writes are verified by read-back; own_recursive no longer descends into instanced sub-scenes; the over-threshold batch path marks the scene dirty; a timed-out mutation is flagged may_have_applied; cross_scene_set_property validates 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_expression runs in-game through the probe; get_stack_frames/get_frame_variables return a structured UNSUPPORTED on 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 dict params are typed; enable_toolset accepts 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 destructive now require confirm=True (default False). 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_check and godot_get_server_info report the connected addon's version and flag a server↔addon mismatch; a new godot_check_for_updates tool (opt-in via GODOT_MCP_CHECK_UPDATES, off by default — no silent phone-home) reports whether a newer release exists, and a known update is surfaced in get_server_info and the editor dock.
  • Reliable asset import (#628) — godot_asset_import_asset no 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 reports scan_deferred when 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/listen served and advertised (#620) — the server registers a ListenHandler (backed by an in-memory bus) on FastMCP's low-level server, so the modern handshake advertises tools.listChanged: true and a subscribing client receives notifications/tools/list_changed after a toggle. Previously the flag was advertised as false on the modern era, so capable clients (Claude Code CLI) never subscribed.
  • Self-sufficient enable result (#621) — godot_enable_toolset returns 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 stalls enable_toolset/disable_toolset for the 10s request timeout.
  • MCP stack upgrade (#622) — FastMCP 4.1.0 / mcp 2.3.0, with ResultValidationMiddleware adapted to FastMCP 4.1's _ToolBodyError body-error tag so a result-shape mismatch stays a structured INTERNAL_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_REPLACED notice before closing it; the dock shows a distinct "Replaced by another editor" state (never a misleading green) and stops reconnecting. New additive error code PEER_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_update pushes 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 to godot-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_id polls 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().paused game.
  • 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_ERROR instead of passing through (#567).
  • ui_elements replies 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 ConnectionResetError demoted 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_class no 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), .uid sidecar relocation, uid re-point; structured refusals for missing source / existing destination / open-and-unsaved scene; honest undoable: false with a recovery hint.
  • Snapshot + diff a subtree (#535) — godot_inspection_snapshot_subtree
    • godot_inspection_diff_snapshots (both read_only): verify a batch mutation in one round-trip; server-side bounded LRU store; group changes surface as property: "groups".
  • Push-on-change property sampling (#536) — monitor_property dedupes unchanged values by default (epsilon-tolerant floats, recursively through Vector2/Color shapes); requested/dropped_duplicates/sampling_usec honesty stats; on_change_only=False restores legacy sampling.
  • Optional bridge auth token (#538) — GODOT_MCP_BRIDGE_TOKEN on 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); list gains language=gd|cs; a .cs write carries a validate-via-build hint (never a false parse-OK); parse/patch refuse .cs until Phase 2 (#560); get_server_info().bridge.backend surfaces {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_info cached per peer; get_server_info exposes addon_version/addon_commands + a drift warning; the dock labels godot-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_completed exec_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 for batch_set_property and apply_node_edits; live e2e asserts the saved file agrees with every verdict.
  • godot_scene_edit_set_editable_children (#487) — the action the instanced_child_not_editable hints name; the tree marks instanced nodes with owner / editable_children.
  • Readiness/reason envelope (#456/#457/#459) — every poll handler carries a stable reason token; poll_ready relays it in timeout errors.
  • godot_shader_validate (#423) — real headless engine compile check; get_parse_errors documented as syntax-level.
  • Audio effect property echo (#427) — get_bus_layout echoes per-effect properties (read/write parity).
  • AudioStreamWAV loop settings (#418) — import_asset accepts loop_mode/loop_begin/loop_end for .wav; loop_applied verdict.
  • 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_timeout param (#490).
  • run_commands reports aborted_at/skipped_count on early stops (#437).
  • batch_set_property reports undoable (false above 20 nodes) (#461).
  • set_setting refuses unknown keys with a did-you-mean hint (#462).
  • Input simulation refused while paused at a debugger break (#443).
  • get_parse_errors gates on the editor's filesystem scan (rescan_pending) (#453).
  • Addon RefCounted leak cycles fixed (#492, by Vincent Huang).
  • tools/list_changed emitted 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, …).

194 tools · 29 toolsets · contract version 1