Repository navigation
Releases
Releases · NPGameDev/godot-mcp-server
v1.1.2
[1.1.2] - 2026-10-29
Fixed
game_startwithwait_for_runtimenow finds the playtest's runtime within about a second of the game registering its port, on Linux and macOS. Before, the server's watch on the editor's project registry went quiet once the editor had rewritten the file, so the server found the port only at its next registry poll, up to 30 seconds later. Until thengame_startreturned withoutruntime_readyand runtime tools answeredGAME_NOT_RUNNING. On every platform,game_startalso returned withoutruntime_readywhen the server started before the registry file existed. A runtime call no longer fails withCLOSEDwhen the server finds the game while that call is in flight. Reported by @pragmabits (NPGameDev/godot-mcp-toolkit#128).
Full Changelog: v1.1.1...v1.1.2
v1.1.1
[1.1.1] - 2026-10-28
Fixed
- The
resource_writepropertiesdescription now names the tagged form for an existing resource file,{type:'Resource', path:'res://...'}, and says that a bare path (ares://,uid://oruser://String) on a top-level Resource property is not set and the response warns. The warning needs toolkit 1.1.1; an older toolkit drops or saves the bare path without one. Reported by @benfeather (NPGameDev/godot-mcp-toolkit#48). debugger_get_lognow answers at once while the game sits at an error break or a breakpoint pause. The server asks the editor's debugger first, and at a break it reads the editor side and skips the game, which can't answer there. Before, each of these calls first waited for the game to time out, up to about 10 seconds. On Windows the answer carries the debugger state with toolkit 1.1.1, and at an error break the file and line the editor's debugger reports for the break. An older toolkit returnsLOG_BUSYthere on Godot 4.4 and later, and on 4.2 and 4.3 a note that the log file was not found. Reported by @pragmabits (NPGameDev/godot-mcp-toolkit#97).- When the game can't answer
debugger_get_logand the editor's own read returns an error, the tool now passes on the editor's error code and hint. Before, it returned the game'sGAME_NOT_RUNNINGwith its hint about a stopped game, even while the game sat at a break. - A runtime tool call that can't connect to the game, as at an error break, no longer logs an
uncaughtExceptionto the server's stderr. The call still returns the same error. game_startwithwait_for_runtimenow returns within about a second of the editor's debugger stopping the game before the runtime connects, as a parse error in a game script does. Before, it waited the full 10 seconds and then said the runtime did not connect. At an error break the hint says waiting won't help and reports the error, file and line the editor's debugger gives for the break and, with them, names the preloaded script when a script preload failed; at a breakpoint pause it says to calldebug_continue. The error, file, line and preloaded script need toolkit 1.1.1. Reported by @pragmabits (NPGameDev/godot-mcp-toolkit#95).- With the runtime port pinned for the server (
GODOT_MCP_RUNTIME_PORTor--runtime-port),game_startwithwait_for_runtimealways waited 10 seconds and then said the runtime did not connect within 10s, even though the game was running. It now returns as soon as the game answers on the pinned port, and still gives up after 10 seconds if nothing does. Found by @pragmabits while testing #102.
Full Changelog: v1.1.0...v1.1.1
v1.1.0
[1.1.0] - 2026-10-25
Added
- The auth handshake now sends
server_versionandmin_toolkit(this server's declared toolkit floor, 1.0) and reads the toolkit'smin_server. When either side is below the other's floor, the connect-time message says which side to update and how. The existing version messages are unchanged, and none of them refuses the connection. GODOT_MCP_SKIP_VERSION_CHECK=1turns the connect-time version check off, floor messages included, and the server prints one line saying so. The toolkit writes it into the.mcp.jsonentry it builds for a local server build, whose version says nothing about what it supports.input_map_actionhas arenameaction.{"action": "rename", "name": "old", "new_name": "new"}moves a project input action to the new name with its events and deadzone, and the response gives the old name asold_name. Each ofadd,removeandrenamenow returns its own hint; rename's reminds the agent that scripts and scenes keep the old name. Needs the toolkit release that adds therenamehandler; an older toolkit answersINVALID_PARAMS. Thanks to @benfeather (NPGameDev/godot-mcp-toolkit#18, #15).script_editdeclares an optionaleditsarray ofold_string/new_string/replace_allobjects. The toolkit applies them in order in one call and writes nothing if one fails.old_stringandnew_stringare now optional, so a call can passeditsalone. Needs the toolkit release that handlesedits; an older toolkit answersINVALID_PARAMS. Thanks to @benfeather (NPGameDev/godot-mcp-toolkit#44, #19).input_map_list, a read-only tool in theinput_mapgroup, lists input actions with their events. By default it returns the project actions and the built-in actions whose events or deadzone differ from their default;include_builtin: trueadds the rest, andnamereturns one action. A changed built-in action hascan_revert: trueand itsdefault. A dotted name such asjump.macosis listed with itsfeaturetag, and a built-in action's feature entry is read-only. The tool stays available in read-only mode. Needs the toolkit release that addsinput_map.list; an older toolkit answers that the method is unknown.input_map_actionhas arevertaction.{"action": "revert", "name": "ui_accept"}puts a built-in action back to its default events and deadzone, andproject.godotdrops its line. Needs the matching toolkit release; an older toolkit answersINVALID_PARAMS.- The
input_map_eventdescription now lists the fields an event takes:key_kindandlocation(Godot 4.3+) on a key, the modifiers andcommand_or_controlon a key or a mouse button,double_clickon a mouse button, anddeviceon every event. An event read frominput_map_listcan be passed back tounbindas it is, and a response lists inwarningsany field the toolkit accepted but ignored.
Changed
scene_instantiate's description now names the files it takes: a.tscnor.scn, or a 3D model imported as a scene (.glb,.gltf,.dae...). A toolkit before 1.1.0 still refuses every file but a.tscn. Thanks to @benfeather (NPGameDev/godot-mcp-toolkit#39, NPGameDev/godot-mcp-toolkit#40).
Fixed
game_startno longer reports a game as ready when the game had already exited by the time the bridge read its registry entry, and the bridge now picks up a game relaunched on the same runtime port when no editor cleared the old entry.- The
node_set_scriptdescription now says that on Godot 4.2.2 and later it reloads a.gdthat changed on disk since the editor loaded it, for every node running the script. The toolkit does the reload, and only when the new source compiles; otherwise the response carriesvalid: falseand a hint that says so and points atscript_check. With an older toolkit, or on Godot 4.2.0 and 4.2.1, where reloading a script in place can crash the editor,node_set_scriptstill sets the version the editor loaded first. Thanks to @benfeather (NPGameDev/godot-mcp-toolkit#43, #20). - With the matching toolkit,
input_map_eventmatches events the way Godot does when it checks an action. A mouse button'spressedno longer splits a binding or misses onunbind, a joypad motion matches on its axis and direction, an event with nodevicematches any device, and the logical keys of a built-in action, such asui_accept's Enter, can be unbound. - The
script_checkandeditor_get_consoledescriptions now say what holds on the connected Godot version: on 4.5+ every compile error carries its line and the console is the live editor output, and on older versions they say what is missing and where--log-fileapplies. Until the editor reports its version they give the text that is true on every version, and they update when the editor reconnects on another Godot version. The server also stops readingmin_godot_versionandmax_godot_versionfrom extension commands, which the toolkit never sent. - With zod 4.6.7,
lsp_completionlistslimitas optional intools/list, as its default of 10 implies; before, the schema marked it required. Calls that omit it behave as before. - The tool reference and the token figures now come from the entries
tools/listsends. The reference listsvisibility(node_get_property_listandruntime_get_script_vars) andgame_start'swait_for_runtimeas optional, as the server already advertised them. The token figures now countdiscover_tools' full group list and, in read-only mode, the two meta tools: the startup surface is about 9,500 tokens (was 9,000), the full surface about 29,100 (was 29,700) and read-only mode about 8,700 (was 8,100).
Security
- zod moves from 4.3.6 to 4.6.7, outside the affected range of GHSA-mrhx-c7xc-m3w5. The vulnerable validation runs on array arguments in the connected client's tool calls. 1.0.4 pinned an affected version, so every install carried it.
Full Changelog: v1.0.4...v1.1.0
v1.0.4
[1.0.4] - 2026-10-14
Security
- The MCP TypeScript SDK moves from 1.29.0 to 1.32.1, past GHSA-6qxp-vccf-f47h. The flaw is in the SDK's OAuth client, which the server never runs, but 1.0.3 pinned the affected version, so every install carried it.
Changed
- When a tool call has an invalid parameter, the error now lists one problem per line, as
<message> at <parameter>, instead of a JSON array of the validation issues.
Fixed
- An editor that comes back on a different port now receives the limits set by
GODOT_MCP_SCRIPT_READ_LIMITandGODOT_MCP_WS_BUFFER_LIMIT. - Restarting the MCP client without a limit variable now clears the env override the editor held, with toolkit 1.0.4 or later.
- A playtest call whose runtime port another program took after the game crashed now reports that the game is not running, instead of an authentication failure.
- An empty
GODOT_MCP_PROJECT_PATHis now treated as unset, so the server uses its working directory instead of naming a project that can never connect. - The dock's LSP line now shows the server's verdict (active, conflict or unavailable) as soon as the server connects to the editor. Before, it waited for the first LSP tool call or a reconnect, so after a fresh start a conflict over the LSP port went unflagged.
What's Changed
- fix(server): move the MCP SDK to 1.32.1 and clear three npm advisories by @NPGameDev in #12
- ci: run the npm audit drift check daily; name and time-box the unit jobs by @NPGameDev in #13
- fix(server): push env overrides on every auth, check cached port by @NPGameDev in #14
- docs: re-attest the LSP figures, complete the error table, reword the Windows npx note by @NPGameDev in #16
- fix(bridge): push the registry LSP verdict on the editor's first connect by @NPGameDev in #17
- docs: bring the docs in line with what 1.0.4 ships by @NPGameDev in #18
Full Changelog: v1.0.3...v1.0.4
1.0.4 pins zod 4.3.6, which GHSA-mrhx-c7xc-m3w5 affects through array arguments in your MCP client's tool calls; upgrade to 1.1.0, which moves zod to 4.6.7.
v1.0.3
[1.0.3] - 2026-10-05
Fixed
- The server no longer resets the editor's response limits (the script read cap and the WebSocket buffer) to their defaults every time it connects. Limits set in the dock or in Project Settings now stay in force while a client is connected, and saving project settings no longer drops them from
project.godot.GODOT_MCP_SCRIPT_READ_LIMITandGODOT_MCP_WS_BUFFER_LIMITstill override them when set. The server ignores an invalid value in either, with a warning, instead of falling back to the default.
What's Changed
- fix(server): push only the response caps the env actually sets by @NPGameDev in #7
- chore: remove leaked markup and an iteration id from comments by @NPGameDev in #8
- Release script: non-interactive mode, a paginated CI check and --verify exit codes by @NPGameDev in #9
- docs(arch): re-attest the stale architecture diagrams by @NPGameDev in #10
Full Changelog: v1.0.2...v1.0.3
v1.0.2
v1.0.1
[1.0.1] - 2026-09-21
Fixed
- The server no longer outlives its MCP client, and no longer spins a CPU core at 100%
when the client exits without a signal (a crash, a closed terminal, a hard kill).
Before, the first stderr write after the client's pipes closed raisedEPIPE, the
crash handler reported that failure to the same dead stderr, and the process
re-entered that handler forever; with an editor connected the orphan idled until the
editor closed, then spun. The server now shuts down when its stdin ends or its stdout
becomes unwritable (closing the editor connection politely, bounded to 2 s), treats a
dead stderr as a lost log sink rather than a reason to exit, and never exits from its
crash handlers. Reported and first fixed by @nickkurkan
(#2,
#3).
If you ran 1.0.0: orphans from earlier sessions may still be running. macOS/Linux:
pgrep -fl godot-mcp-server, thenkill -9 <pid>; Windows: end thenodeprocesses
runninggodot-mcp-serverin Task Manager. From 1.0.1 on the server exits on its own.
Added
npm run probe:departure— a hand-run probe (test/probes/client-departure-probe.ts)
that drives a built server through the client-departure scenarios, with or without an
editor; part of the release checklist (§1 B9).
Changed
- The connect-time version check no longer warns when the server and the toolkit differ
only by a patch version. A minor-version difference still warns; a major-version
difference still errors. - Refreshed five transitive dependencies of
@modelcontextprotocol/sdk—
brace-expansion,fast-uri,hono,ip-addressandqs— to versions without open
npm advisories. None of the advisories were reachable from this server: they concern the
SDK's HTTP-server surface, which a stdio-only bridge never instantiates. Nothing about
the server's behaviour changes; this is dependency hygiene, not a security fix.
Full Changelog: v1.0.0...v1.0.1
v1.0.0
[1.0.0] - 2026-07-26
Breaking Changes
These are pre-1.0 clean breaks with no aliases or deprecation shims. Update any
.mcp.json, shell environment, or scripts that use the old names.
- Renamed the editor-port environment variable
GODOT_MCP_PORTto
GODOT_MCP_EDITOR_PORT, so all three channels (editor, runtime, LSP) now use a
consistentGODOT_MCP_*_PORTscheme. - Changed the default ports: the editor channel now uses
6550(was6505) and
the runtime channel uses6570(was6525). - Canonicalized tool parameter names in a single pass so every tool uses one
clear name for the same idea (for example, folder tools now takepath, not
folder_path;project_set_settingtakessetting, notkey;input_map
takesname, notaction_name). There are no aliases for the old names. - Removed the profile system. The
GODOT_MCP_PROFILEenvironment variable is no
longer read, the no-op--liteflag is gone, and there is no custom-tool list
(GODOT_MCP_CUSTOM_TOOLS). SetGODOT_MCP_READ_ONLY=1for a read-only tool
surface; the full tool surface is otherwise always available and expands
on demand. - Removed the feature-gate system, including the
GODOT_MCP_ALLOW_*environment
variables. Tools are no longer gated behind allow flags. - Removed the
enable_tool_grouptool. Usediscover_toolsto find and activate
the tool group you need.
Added
- Language-server tools backed by each project's GDScript language server:
diagnostics, document symbols, go-to-definition, find-references, hover, and
completion, plus a project-widelsp_project_diagnosticserror scan. LSP ports
are discovered per project, and a port collision is reported instead of silently
reaching the wrong editor. - A debugger tool group: set and clear breakpoints, step through code, and inspect
debug state. - A
discover_toolsmeta-tool that finds and activates on-demand tool groups by
keyword. It reports honestly when a group is already loaded, returns each newly
available tool's schema in the activation response, and matches on keywords
rather than exact names. - On-demand extension tools: tools registered by third-party addons appear and
disappear live as extensions are loaded, reloaded, or removed, with an
extensions_refreshtool to resync on demand. - New tool groups mirroring the toolkit's expanded command surface: TileSet
authoring, theme editing, AnimationTree editing, project layer-name management,
3D scene helpers, Path2D curve editing, collision-shape generation from a
texture, inherited-scene creation, audio-bus editing, SpriteFrames editing, GPU
particle systems, navigation, and a filteredscene_query. execute_code, which runs a snippet in the editor or in the running game
(selected bycontext, defaulting to the running game).scene_spatial_map, reporting node positions and bounds, plus
texture_generateandsound_generatefor placeholder assets, and
script_editfor targeted edits to a script instead of whole-file rewrites.- A
send_textevent oninput_simulatefor typing into a focused text field,
and support for passing a single input event instead of only an array. - CLI flags
--editor-port,--runtime-port,--lsp-port,--lsp-host, and
--help, resolved with the precedence CLI flag > environment variable >
registry discovery > default.--tools-countand--list-eagerprint the tool
surface (counts and the eager tool list) and exit without needing an editor. - A generated tool-reference document (
docs/tool-reference/) covering every
built-in tool and its operations, kept in sync with the catalogue by the
docs:toolsscript. - Startup diagnostics: each channel logs its resolved port and where the value
came from (CLI, environment, discovery, or default), and pinned ports are
validated as integers in range so an invalid value exits with a precise error
instead of crashing at first connection. - A fail-fast desync check: a pinned editor port that cannot connect, or whose
handshake fails because another server occupies it, now reports exactly which
port is wrong instead of hanging on a dead socket. - A version handshake between the server and the plugin, reporting a clear
incompatibility message when the two are out of sync. - Client-side cancellation of in-flight tool calls.
runtime_pollongame_startto re-probe the running game's connection
without restarting it, andwait_for_runtimeso a singlegame_startcall
waits for the game to be ready and reports the precise stage and hint if it is
not.scene_closereports whether it discarded unsaved changes, and gains a
destructive marker in its tool metadata.- A
root_nameinput parameter onscene_create. - Next-step
successHintsuggestions on many tools, and per-tool path validation
that reports a clearPATH_DENIEDerror for a path outside the project. - A clear error at startup when the Node.js version is below the supported
minimum.
Changed
- Renamed
game_evaltoexecute_codeandeditor_reload_scriptsto
editor_refresh. - Screenshot tools take an
image_detailoption (replacingsize) to choose
between an inline downscaled image and a save-to-disk path, and clearly report
when a viewport cannot be captured instead of returning a blank image. game_startwaits for the running game to actually be ready in a single call
and reports the precise failure stage and a recovery hint when it is not.- Real pagination (offset, limit, and total) on class-browsing, script and save
reads, and scene queries, with configurable size caps. - Read-only visibility is derived from each tool's own annotations, so
GODOT_MCP_READ_ONLY=1consistently hides every mutating tool. - The eager tool set was re-tiered as tools landed, so the most commonly needed
tools (including runtime screenshot, input, and log tools, and node and group
management) are available immediately on connect. - Schemas were tightened across several tools:
wait_for_runtimedefaults to
true, animationtrack_typeis a fixed enum, and node-group inputs are stricter. - Raised the supported Godot version ceiling to 4.7.
- Simplified the macOS setup guidance: the standard
npxinvocation works with
modern clients, and fallbacks are documented only where they are actually needed. - Error hints no longer mention retired concepts (feature gates, profiles, or
documentation that does not ship).
Fixed
- A startup race that could omit extension or version-gated tools from the first
tool list, and a double-registration crash that could occur when the client
reconnected. .gdshaderfiles are no longer mis-parsed as GDScript by the language tools.- Windows LSP paths are returned as
res://paths rather than leaking a raw
filesystem path. - Optional parameters that take a JSON-encoded string are no longer advertised as
required. - A false "the toolkit did not report its version" warning that could appear when
launching the game. - Crash-context and error reporting: the correct error code and richer hints are
returned, log reads distinguish a transient lock from a missing log and fall
back to the debug log, andLOG_BUSYandLOG_UNAVAILABLEhints point at the
real cause. Console and log tools gainsource,text_filter, andis_regex
options. debug_set_breakpointhandles itsenabledandlineparameters correctly.- Many tool descriptions and schemas were corrected to match actual behavior.
Removed
- The placeholder security gates (
os_execute,outbound_http) and the
never-enforced user-scope allowlist.
Full Changelog: https://github.com/NPGameDev/godot-mcp-server/commits/v1.0.0