Godot MCP

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

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add godot -- npx -y godot-mcp-server
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "godot": {
      "command": "npx",
      "args": [
        "-y",
        "godot-mcp-server"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "godot": {
      "command": "npx",
      "args": [
        "-y",
        "godot-mcp-server"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "godot": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "godot-mcp-server"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.godot]
command = "npx"
args = ["-y", "godot-mcp-server"]
Gemini CLITerminal
gemini mcp add --scope user godot npx -- -y godot-mcp-server
Local (from source)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

FirstTerminal
git clone https://github.com/tomyud1/godot-mcp.git
cd godot-mcp/mcp-server
npm install
npm run build
Claude CodeTerminal
claude mcp add godot -- node '<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js'
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "godot": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "godot": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "godot": {
      "type": "stdio",
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.godot]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js"]
Gemini CLITerminal
gemini mcp add --scope user godot node -- '<ABSOLUTE_PATH_TO_CLONE>/mcp-server/dist/index.js'

Settings 4

GODOT_MCP_PORT Optional: WebSocket port the Godot plugin connects to. Default 6505.
GODOT_MCP_HTTP_PORT Optional: Port the primary copy listens on for other copies. Default 6506.
GODOT_MCP_TIMEOUT_MS Optional: Per-tool timeout in milliseconds. Default 30000.
GODOT_MCP_IDLE_TIMEOUT_MS Optional: Idle timeout in milliseconds. Default 30000.

What it does

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.

What it needs

RuntimeNode.js
Runs onmacOS, Windows, Linux
Also
  • Godot 4.4 or newer, with the project open in the editor
  • The Godot MCP editor plugin, installed and enabled in the project

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.

Limits

  • Not covered Works with one Godot editor at a time on the same machine. There is no remote mode.
  • Limit Godot's own Ctrl+Z does not undo its edits, because the plugin writes files to disk. Use mcp_undo instead.
  • Limit call_method in editor mode refuses to run user-written methods of scripts that are not @tool.
  • Limit write_file refuses paths with ".." segments and, unless force=true, the plugin's own folder.
  • Limit Tool calls time out after 30 seconds by default (GODOT_MCP_TIMEOUT_MS).
  • Early release Its makers call it in active development and say it struggles with complex UI layouts, compositing scenes and some node properties.
  • Limit Newer features need the plugin and the server at the same version. get_godot_status warns when they differ.

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.

Who it suits

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.

Tools 60 of 71

26 only read, 32 change things, 2 can delete or overwrite. A ? marks an optional parameter.

get_godot_status
Reports whether the editor plugin is connected and which versions run
get_guide
Lists the built-in markdown guides or returns one by slugslug?: string
list_dir
Lists files and folders under a project pathpath?: stringinclude_hidden?: boolean
read_file
Reads a project text file, optionally a line rangepath: stringstart_line?: numberend_line?: numbermax_bytes?: number
search_project
Finds text across project files with line numbersquery: stringglob?: stringmax_results?: numbercase_sensitive?: boolean
create_script changes
Creates a new GDScript file with the given codepath: stringcontent: string
edit_script changes
Replaces one snippet of text in an existing scriptpath: stringold_text: stringnew_text: stringcontext_before?: stringcontext_after?: string
validate_script
Checks a GDScript file for parse errorspath: string
write_file changes
Writes a text file, replacing an existing one only with overwrite=truepath: stringcontent: stringoverwrite?: booleancreate_dirs?: booleanforce?: boolean
rename_file changes
Renames or moves a file and updates references to itold_path: stringnew_path: stringupdate_references?: boolean
delete_file deletes
Deletes a file when confirm=true is passed. A .bak copy is made by defaultpath: stringconfirm: booleancreate_backup?: booleanforce?: boolean
create_folder changes
Creates a folder in the projectpath: string
delete_folder deletes
Deletes a folder once confirm=true is passed, non-empty ones only with recursive=truepath: stringconfirm: booleanrecursive?: booleanforce?: booleanforce_orphan?: booleanallow_no_undo?: boolean
list_scripts
Lists the GDScript files in the project
create_scene changes
Creates a .tscn scene with a whole node tree in one callscene_path: stringroot_node_name?: stringroot_node_type: stringnodes?: arrayattach_script?: string
read_scene
Returns the node tree of a scene filescene_path: stringinclude_properties?: boolean
get_scene_node_properties
Returns every property of one node in a scene filescene_path: stringnode_path?: string
add_node changes
Adds a node, with optional properties, script and children, to a scenescene_path: stringnode_name: stringnode_type: stringparent_path?: stringproperties?: objectscript?: stringgroups?: arraychildren?: array
remove_node changes
Removes a node from a scenescene_path: stringnode_path: string
rename_node changes
Renames a node in a scenescene_path: stringnode_path: stringnew_name: string
move_node changes
Moves a node under another parent or to another indexscene_path: stringnode_path: stringnew_parent_path: stringsibling_index?: number
set_node_properties changes
Sets one or more properties on a node, including textures, shapes and materialsscene_path: stringnode_path?: stringproperties: object
attach_script changes
Attaches a script to a nodescene_path: stringnode_path?: stringscript_path: string
detach_script changes
Removes the script from a nodescene_path: stringnode_path: string
instance_scene changes
Adds another scene as a child instancescene_path: stringinstance_path: stringnode_name?: stringparent_path?: stringproperties?: object
get_node_spatial_info
Returns positions, rotation, scale and bounds of a Node3Dscene_path: stringnode_path?: stringinclude_bounds?: boolean
snap_node_to_grid changes
Snaps a Node3D position to a gridscene_path: stringnode_path?: stringgrid_size: numberaxes?: arrayspace?: string
find_nodes
Searches a scene for nodes by name pattern, type or groupscene_path?: stringname_pattern?: stringtype?: stringin_group?: stringrecursive?: boolean
set_node_groups changes
Sets, adds or removes the groups a node belongs toscene_path: stringnode_path?: stringgroups: arraymode?: enum
get_resource_info
Inspects a resource on disk or one held by a nodepath?: stringscene_path?: stringnode_path?: stringresource_property?: string
save_resource_to_file changes
Saves a node resource to its own .tres file and points the node at itscene_path: stringnode_path?: stringresource_path: stringsave_to: string
list_signal_connections
Lists signal connections of a node in the scene file or the running gamesource?: enumscene_path?: stringnode_path: stringinclude_outgoing?: booleaninclude_incoming?: boolean
connect_signal changes
Connects a node signal to a method in a scene filescene_path: stringfrom_node_path: stringsignal: stringto_node_path: stringmethod: stringflags?: number
disconnect_signal changes
Removes a signal connection from a scene filescene_path: stringfrom_node_path: stringsignal: stringto_node_path: stringmethod: string
call_method changes
Calls a method on a node in a scene or in the running gamenode_path: stringmethod: stringargs?: arrayscene_path?: stringruntime?: booleanexpect_return?: booleanconfirm?: boolean
get_project_settings
Summarises main scene, window, physics and render settingsinclude_render?: booleaninclude_physics?: boolean
list_settings
Lists project settings in a categorycategory?: string
update_project_settings changes
Changes one or more project settingssettings: object
get_input_map
Returns the input actions and their bindingsinclude_deadzones?: boolean
configure_input_map changes
Adds, removes or changes an input action and its eventsaction: stringoperation: stringdeadzone?: numberevents?: array
get_node_properties
Lists the properties a Godot node type hasnode_type: string
classdb_query
Looks up a class in the engine ClassDBclass_name: stringquery?: stringinclude_virtual?: boolean
setup_autoload changes
Registers, removes or lists autoload singletonsname?: stringoperation: stringpath?: string
get_console_log
Returns recent lines from the editor Output panelmax_lines?: numberdebug?: boolean
get_errors
Returns errors and warnings from the editormax_errors?: numberinclude_warnings?: booleanwait_ms?: number
scene_tree_dump
Prints the live tree of the scene open in the editor, unsaved edits includedsubtree_root?: stringmax_depth?: numberoffset?: numberlimit?: number
get_editor_selection
Returns the nodes selected in the editor
rescan_filesystem changes
Makes the editor rescan the project files
run_scene changes
Starts a scene, or the main scene, in play modescene_path?: stringblock_until_started?: booleanwait_for_runtime?: booleanstartup_timeout_ms?: numberclear_output?: boolean
stop_scene changes
Stops the running game
take_screenshot changes
Saves the running game viewport as a PNGsave_to?: stringreturn_base64?: boolean
send_input changes
Sends a key, mouse or action event to the running gameevent: object
query_runtime_node
Reads the live state of a node in the running gamenode_path: stringproperties?: arrayinclude_children?: booleaninclude_groups?: boolean
get_performance_monitors
Returns performance counters from the running game
get_runtime_log
Returns lines the game pushed to the in-game MCPRuntime loglimit?: numbersince_ms?: number
generate_2d_asset changes
Renders SVG code to a PNG file in the projectsvg_code: stringfilename: stringsave_path?: stringwidth?: numberheight?: numberscale?: number
map_project
Opens a browser map of scripts and scenes on localhost:6510path?: stringinclude_addons?: boolean
mcp_undo changes
Reverts the last changes made through the servercount?: numberpreview?: boolean
mcp_redo changes
Reapplies changes that mcp_undo revertedcount?: numberpreview?: boolean
batch_execute changes
Runs a list of tool calls as one change, rolled back on failure by defaultcommands: arrayatomic?: booleanstop_on_error?: boolean

Resources 7

godot-mcp://guide/testing-loop
Guide to testing a running game
godot-mcp://guide/scene-editing
Guide to editing scenes and property values
godot-mcp://guide/asset-generation
Guide to generating 2D assets
godot-mcp://guide/troubleshooting
Guide to common failures
godot-mcp://guide/batching
Guide to batching changes with batch_execute
godot-mcp://guide/selection-workflow
Guide to working with the editor selection
godot-mcp://guide/tool-index
Index of tools by goal

Similar servers