Skip to content

Release history

Erodenn/godot-mcp-runtime releases

MCP server for Godot 4.x with runtime control via injected UDP bridge: input simulation, screenshots, UI discovery, and live GDScript execution while the game is running.

All releases

19 shown

No immediate action
v3.1.2 Bug fix

Emit structuredContent

Config change
v3.1.1 Bug fix

GODOT_PATH misconfiguration handling

No immediate action
v3.1.0 New feature

Multi‑runtime bridge support

v3.0.0 Breaking risk
Breaking changes
  • `take_screenshot` now requires `responseMode` (default `preview`).
  • `set_node_property` / `*_batch` merged into `set_node_properties`; input must be an array.
  • `delete_node` renamed to `delete_nodes`; always expects an array.
Full changelog

Main v3 work: #12 @Erodenn.

Breaking changes

  • Compact screenshots (#11, thanks @johanravn). take_screenshot gets responseMode: preview (new default, 960×540 inline + full PNG saved), full, path_only.
  • Property tools batched. set_node_property / *_batch collapse into set_node_properties; same for get_node_properties. Always-array input — one-element for one-off, many for batched.
  • delete_nodedelete_nodes. Always-array, batched delete.
  • manage_uids removed. validate covers it.

Changes

  • Persistent TCP bridge replaces per-call UDP. Removes the silent ~65 KB payload ceiling on run_script / get_ui_elements, sidesteps AV/EDR interference, and turns crashes into ms-level rejects instead of 10 s timeouts.
  • stop_project / detach_project send a shutdown first so the port releases cleanly.
  • Vector/Color coercion. {x,y} / {x,y,z} / {r,g,b,a} dicts now write as typed literals, not dictionaries.
  • connect_signal serializes with CONNECT_PERSIST — connections survive save/reload.
  • validate treats stderr noise as failure; the GDScript flag alone was unreliable.
  • load_sprite errors explicitly on non-Texture2D or unimported assets instead of silently no-op'ing.
  • Path resolution accepts "", ".", "root", the scene root's name, and root/... prefixes.
  • simulate_input auto-derives unicode for ASCII so LineEdit / TextEdit receive typed text; pass explicitly for symbols/non-ASCII.
  • Bridge inject always overwrites the script — fixes stale-script issues across upgrades.
  • Internal: BridgeManager, autoload-ini, executeSceneOp extracted; project-tools.ts split. 704 unit tests.

Full Changelog: https://github.com/Erodenn/godot-mcp-runtime/compare/v2.3.0...v3.0.0

No immediate action
v2.3.0 New feature

Annotations, output schemas, descriptions

No immediate action
v2.2.3 Maintenance

Routine maintenance and dependency updates.

Config change
v2.2.2 Breaking risk
Breaking upgrade

Node version bump

No immediate action
v2.2.1 Bug fix

Error detection + -d removal + input defer

No immediate action
v2.2.0 New feature

Manual attach mode

No immediate action
v2.1.0 New feature

Background mode

v2.0.0 Breaking risk
⚠ Upgrade required
  • Update any hardcoded references from old umbrella tools to their new individual tool names (e.g., replace `manage_scene(operation: "create")` with `create_scene`).
  • No manual migration required for clients that discover tools dynamically; only scripts or prompts using explicit tool names need adjustment.
Breaking changes
  • Removed `manage_scene`, `manage_node`, and `manage_project` umbrella tools; all operations are now individual tools with dedicated names.
Notable features
  • Added guidance block in MCP server handshake describing tool purposes, runtime bridge workflow, and autoload caveat.
  • Promoted spatial parameters (`position`, `rotation`, `scale`) to top-level arguments on the `add_node` tool.
  • Enhanced `simulate_input` documentation with concrete action‑sequence examples.
Full changelog

Breaking: every tool gets its own name

The manage_scene, manage_node, and manage_project umbrella tools are gone. Each operation is now its own tool with only its relevant parameters. No more operation discriminators, no more conditional schemas.

This is the change recommended in the MCP design review (Jeremiah Lowin, "Your MCP Server is Bad"): name tools for the agent's intent, not the developer's implementation. set_node_property instead of manage_node(operation: "update_property"). list_autoloads instead of manage_project(operation: "list_autoloads").

Migration

If your agent workflows reference the old tool names, update them:

| Old | New |
|-----|-----|
| manage_scene(operation: "create") | create_scene |
| manage_scene(operation: "add_node") | add_node |
| manage_scene(operation: "load_sprite") | load_sprite |
| manage_scene(operation: "save") | save_scene |
| manage_scene(operation: "export_mesh_library") | export_mesh_library |
| manage_scene(operation: "batch") | batch_scene_operations |
| manage_node(operation: "delete") | delete_node |
| manage_node(operation: "update_property") | set_node_property |
| manage_node(operation: "batch_update_property") | batch_set_node_properties |
| manage_node(operation: "get_properties") | get_node_properties |
| manage_node(operation: "batch_get_properties") | batch_get_node_properties |
| manage_node(operation: "attach_script") | attach_script |
| manage_node(operation: "get_tree") | get_scene_tree |
| manage_node(operation: "duplicate") | duplicate_node |
| manage_node(operation: "get_signals") | get_node_signals |
| manage_node(operation: "connect_signal") | connect_signal |
| manage_node(operation: "disconnect_signal") | disconnect_signal |
| manage_project(operation: "launch_editor") | launch_editor |
| manage_project(operation: "run_project") | run_project |
| manage_project(operation: "get_debug_output") | get_debug_output |
| manage_project(operation: "stop_project") | stop_project |
| manage_project(operation: "list_projects") | list_projects |
| manage_project(operation: "get_project_info") | get_project_info |
| manage_project(operation: "list_autoloads") | list_autoloads |
| manage_project(operation: "add_autoload") | add_autoload |
| manage_project(operation: "remove_autoload") | remove_autoload |
| manage_project(operation: "update_autoload") | update_autoload |
| manage_project(operation: "get_filesystem_tree") | get_project_files |
| manage_project(operation: "search_in_files") | search_project |
| manage_project(operation: "get_scene_dependencies") | get_scene_dependencies |
| manage_project(operation: "get_project_settings") | get_project_settings |

In practice, most MCP clients discover tools dynamically, so no manual migration is needed. But if you have hardcoded tool names in prompts or scripts, this is the mapping.

Other changes

  • MCP server instructions — the server now sends a guidance block on handshake: what the tools do, the runtime bridge workflow, and the autoload caveat. Any MCP client gets this context automatically.
  • Promoted spatial params on add_nodeposition, rotation, and scale are top-level parameters instead of buried in a properties dict. Agents no longer need to know Godot's Vector2/Vector3 property format to place a node.
  • simulate_input examples — the tool description now includes concrete action sequence examples so agents can generalize from real patterns.
  • Tool count: 15 → 37 (same operations, just properly decomposed)
No immediate action
v1.1.1 Bugfix

McpBridge orphan fix

No immediate action
v1.1.0 New feature

Batch operations

Config change
v1.0.0 New feature
Breaking upgrade Auth

New validation & project tools

No immediate action
v0.5.2 Breaking risk

Documentation corrections

No immediate action
v0.5.1 New feature

Tool definition overhaul

No immediate action
v0.5.0 Feature

manage_project tool

No immediate action
v0.4.0 New feature

Docker support

No immediate action
v0.3.0 New feature

Headless editing & runtime bridge

Beta — feedback welcome: [email protected]