Godot MCP
Lets an assistant launch the Godot editor, run projects, read debug output and edit scenes.
Drives an open Godot 4 editor: scenes, nodes, GDScript, project settings and test runs of the game
By Tomer Yudovich (individual) TypeScript Local · stdio Developer toolsTesting
53 popularity score ★ 451 ↓ 820/wk
Opens the app, which asks before it adds the server.
claude mcp add godot -- npx -y godot-mcp-server{
"mcpServers": {
"godot": {
"command": "npx",
"args": [
"-y",
"godot-mcp-server"
]
}
}
}{
"mcpServers": {
"godot": {
"command": "npx",
"args": [
"-y",
"godot-mcp-server"
]
}
}
}{
"servers": {
"godot": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"godot-mcp-server"
]
}
}
}[mcp_servers.godot]
command = "npx"
args = ["-y", "godot-mcp-server"]gemini mcp add --scope user godot npx -- -y godot-mcp-serverOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/tomyud1/godot-mcp.git
cd godot-mcp/mcp-server
npm install
npm run buildclaude mcp add godot -- node '<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js'{
"mcpServers": {
"godot": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"
]
}
}
}{
"mcpServers": {
"godot": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"
]
}
}
}{
"servers": {
"godot": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"
]
}
}
}[mcp_servers.godot]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"]gemini mcp add --scope user godot node -- '<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js'GODOT_MCP_PORT |
Optional: WebSocket port the Godot plugin connects to. |
|---|---|
GODOT_MCP_HTTP_PORT |
Optional: Port the primary copy listens on for other copies. |
GODOT_MCP_TIMEOUT_MS |
Optional: Per-tool timeout in milliseconds. |
GODOT_MCP_IDLE_TIMEOUT_MS |
Optional: Idle timeout in milliseconds. |
Godot MCP connects an MCP client to a Godot 4 editor you already have open on the same machine. There are two halves: a Node.js server that the client starts over stdio, and an editor plugin ("Godot MCP", listed on the Asset Store as Godlink MCP) that talks to the server over a local WebSocket on port 6505. With both in place the assistant can search project files and write GDScript. It builds scenes, often a whole node tree in one call, and sets node properties down to textures and collision shapes. Project settings, the input map and autoloads are in reach as well.
It can also run the game. While a scene plays it reads the log and errors, saves screenshots, sends key and mouse events and pokes at live nodes, so it works for quick play tests. Every change lands in the server's own history, which mcp_undo and mcp_redo walk through. batch_execute applies a list of calls as one change and by default rolls the lot back if a step fails. map_project serves a browser map of the scripts on localhost:6510, where code can be edited too.
The README counts 69 tools, but v0.6.1 lists 71 because get_godot_status and get_guide come on top (src/index.ts, src/tools/server-tools.ts). Six older names such as set_mesh and set_material still work but are hidden from the list, their job now done by set_node_properties (src/tools/scene-tools.ts).
Several clients can share one editor. The first copy becomes the primary and later copies forward their calls to it on port 6506.
| Runtime | Node.js |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Install Node.js (LTS) for npx. In Godot 4.7 or newer, install "Godlink MCP" from the Asset Store tab. In 4.6 or older, search "mcp" in the AssetLib tab and install "Godot AI Assistant tools MCP", or copy addons/godot_mcp/ from the repository. Enable the Godot MCP plugin under Project Settings > Plugins, then restart the project until the editor shows "MCP: Agent Active". The runtime tools (take_screenshot, send_input, query_runtime_node) need the MCPRuntime autoload connected, so start the game with run_scene and wait_for_runtime=true. On Windows the docs launch it through cmd /c npx.
Works on one Godot editor at a time, on the same machine; it has no remote mode. Godot's own Ctrl+Z does not undo its edits, because the plugin writes files to disk rather than the editor's live tree; only mcp_undo reverts them. call_method in editor mode refuses to run user-written methods of scripts that are not @tool. write_file refuses paths with ".." segments and, unless force=true, the plugin's own folder. Tool calls time out after 30 seconds by default (GODOT_MCP_TIMEOUT_MS). Its makers say it is in active development and that it struggles with complex UI layouts, compositing scenes and some node properties. The README's tool table (42) and the npm page (32) are out of date.
Suits a Godot 4.4+ developer who wants an assistant working inside a project they have open: writing GDScript, assembling scenes, adjusting settings, and running the game to check errors, take screenshots or feed it input. It runs locally and writes to the project, so keep the project under version control as well as relying on mcp_undo. Without the editor plugin and a running editor it does nothing, which rules out headless or CI use, other engines and Godot 3 projects. It is a community project, not one from the Godot team.
26 only read, 32 change things, 2 can delete or overwrite. A ? marks an optional parameter.
get_godot_statusget_guideslug?: stringlist_dirpath?: stringinclude_hidden?: booleanread_filepath: stringstart_line?: numberend_line?: numbermax_bytes?: numbersearch_projectquery: stringglob?: stringmax_results?: numbercase_sensitive?: booleancreate_script changespath: stringcontent: stringedit_script changespath: stringold_text: stringnew_text: stringcontext_before?: stringcontext_after?: stringvalidate_scriptpath: stringwrite_file changespath: stringcontent: stringoverwrite?: booleancreate_dirs?: booleanforce?: booleanrename_file changesold_path: stringnew_path: stringupdate_references?: booleandelete_file deletespath: stringconfirm: booleancreate_backup?: booleanforce?: booleancreate_folder changespath: stringdelete_folder deletespath: stringconfirm: booleanrecursive?: booleanforce?: booleanforce_orphan?: booleanallow_no_undo?: booleanlist_scriptscreate_scene changesscene_path: stringroot_node_name?: stringroot_node_type: stringnodes?: arrayattach_script?: stringread_scenescene_path: stringinclude_properties?: booleanget_scene_node_propertiesscene_path: stringnode_path?: stringadd_node changesscene_path: stringnode_name: stringnode_type: stringparent_path?: stringproperties?: objectscript?: stringgroups?: arraychildren?: arrayremove_node changesscene_path: stringnode_path: stringrename_node changesscene_path: stringnode_path: stringnew_name: stringmove_node changesscene_path: stringnode_path: stringnew_parent_path: stringsibling_index?: numberset_node_properties changesscene_path: stringnode_path?: stringproperties: objectattach_script changesscene_path: stringnode_path?: stringscript_path: stringdetach_script changesscene_path: stringnode_path: stringinstance_scene changesscene_path: stringinstance_path: stringnode_name?: stringparent_path?: stringproperties?: objectget_node_spatial_infoscene_path: stringnode_path?: stringinclude_bounds?: booleansnap_node_to_grid changesscene_path: stringnode_path?: stringgrid_size: numberaxes?: arrayspace?: stringfind_nodesscene_path?: stringname_pattern?: stringtype?: stringin_group?: stringrecursive?: booleanset_node_groups changesscene_path: stringnode_path?: stringgroups: arraymode?: enumget_resource_infopath?: stringscene_path?: stringnode_path?: stringresource_property?: stringsave_resource_to_file changesscene_path: stringnode_path?: stringresource_path: stringsave_to: stringlist_signal_connectionssource?: enumscene_path?: stringnode_path: stringinclude_outgoing?: booleaninclude_incoming?: booleanconnect_signal changesscene_path: stringfrom_node_path: stringsignal: stringto_node_path: stringmethod: stringflags?: numberdisconnect_signal changesscene_path: stringfrom_node_path: stringsignal: stringto_node_path: stringmethod: stringcall_method changesnode_path: stringmethod: stringargs?: arrayscene_path?: stringruntime?: booleanexpect_return?: booleanconfirm?: booleanget_project_settingsinclude_render?: booleaninclude_physics?: booleanlist_settingscategory?: stringupdate_project_settings changessettings: objectget_input_mapinclude_deadzones?: booleanconfigure_input_map changesaction: stringoperation: stringdeadzone?: numberevents?: arrayget_node_propertiesnode_type: stringclassdb_queryclass_name: stringquery?: stringinclude_virtual?: booleansetup_autoload changesname?: stringoperation: stringpath?: stringget_console_logmax_lines?: numberdebug?: booleanget_errorsmax_errors?: numberinclude_warnings?: booleanwait_ms?: numberscene_tree_dumpsubtree_root?: stringmax_depth?: numberoffset?: numberlimit?: numberget_editor_selectionrescan_filesystem changesrun_scene changesscene_path?: stringblock_until_started?: booleanwait_for_runtime?: booleanstartup_timeout_ms?: numberclear_output?: booleanstop_scene changestake_screenshot changessave_to?: stringreturn_base64?: booleansend_input changesevent: objectquery_runtime_nodenode_path: stringproperties?: arrayinclude_children?: booleaninclude_groups?: booleanget_performance_monitorsget_runtime_loglimit?: numbersince_ms?: numbergenerate_2d_asset changessvg_code: stringfilename: stringsave_path?: stringwidth?: numberheight?: numberscale?: numbermap_projectpath?: stringinclude_addons?: booleanmcp_undo changescount?: numberpreview?: booleanmcp_redo changescount?: numberpreview?: booleanbatch_execute changescommands: arrayatomic?: booleanstop_on_error?: booleangodot-mcp://guide/testing-loopgodot-mcp://guide/scene-editinggodot-mcp://guide/asset-generationgodot-mcp://guide/troubleshootinggodot-mcp://guide/batchinggodot-mcp://guide/selection-workflowgodot-mcp://guide/tool-index