Godot MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GODOT_MCP_DEBUG | No | Set to any value to enable debug logging in the server |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_project_infoB | Get project metadata including name, version, engine version, and main scene |
| get_filesystem_treeC | Get the project filesystem tree structure |
| search_filesC | Search for files in the project by name pattern or content |
| get_project_settingsC | Get all project settings (project.godot values) |
| set_project_settingC | Set a project setting value |
| uid_to_project_pathB | Convert a Godot UID to a project file path |
| project_path_to_uidB | Convert a project file path to its UID |
| get_scene_treeC | Get the node tree of the specified or currently open scene |
| get_scene_file_contentB | Read the raw .tscn/.scn file content of a scene |
| create_sceneB | Create a new empty scene with a specified root node type |
| open_sceneB | Open a scene file in the editor |
| delete_sceneC | Delete a scene file from the project |
| add_scene_instanceB | Add an instance of a scene as a child of a node in the current scene |
| play_sceneA | Start playing the current or specified scene. Required before using any runtime tools (get_game_*, capture_frames, etc.) |
| stop_sceneA | Stop the currently playing scene |
| save_sceneC | Save the current scene or save it to a new path |
| get_loaded_scenesB | Get a list of all currently loaded scenes in the editor |
| set_main_sceneB | Set the project's main scene |
| add_nodeB | Add a new node to the scene tree |
| delete_nodeB | Delete a node from the scene tree |
| duplicate_nodeC | Duplicate a node in the scene tree |
| move_nodeB | Move a node to a new parent in the scene tree |
| update_propertyC | Update a property value on a node |
| get_node_propertiesB | Get all properties of a node |
| add_resourceC | Add a resource (material, texture, etc.) to a node property |
| set_anchor_presetC | Set anchor preset on a Control node |
| rename_nodeB | Rename a node in the scene tree |
| connect_signalB | Connect a signal from one node to another node's method |
| disconnect_signalB | Disconnect a signal connection |
| get_node_groupsB | Get all groups a node belongs to |
| set_node_groupsB | Set the groups a node belongs to (replaces existing groups) |
| find_nodes_in_groupA | Find all nodes belonging to a specific group |
| get_editor_selectionA | Get the currently selected nodes in the editor |
| select_nodesC | Select nodes in the editor |
| clear_editor_selectionA | Clear the current editor selection |
| list_scriptsB | List all GDScript files in the project with class info |
| read_scriptA | Read the contents of a GDScript file |
| create_scriptC | Create a new GDScript file |
| delete_scriptB | Delete a GDScript file from the project |
| edit_scriptB | Edit an existing GDScript file by replacing a text segment |
| attach_scriptB | Attach a GDScript to a node in the scene |
| get_open_scriptsA | Get list of scripts currently open in the script editor |
| validate_scriptB | Validate a GDScript file for syntax errors |
| search_in_filesC | Search for text across project files |
| get_editor_errorsA | Validate all GDScripts in the current scene tree and return compilation errors |
| get_editor_screenshotB | Take a screenshot of the Godot editor window |
| get_game_screenshotC | Take a screenshot of the running game viewport |
| execute_editor_scriptB | Execute a GDScript snippet in the editor context (EditorScript) |
| clear_outputA | Clear the editor output log |
| get_signalsC | Get all signals and their connections for a node |
| reload_pluginA | Reload editor plugins (triggers plugin re-initialization) |
| reload_projectA | Rescan the project filesystem for new or changed files |
| get_output_logB | Get the contents of the editor output log |
| simulate_keyB | Simulate a keyboard key press/release in the running game |
| simulate_mouse_clickB | Simulate a mouse click at a screen position |
| simulate_mouse_moveB | Simulate mouse movement to a screen position |
| simulate_actionA | Simulate an input action (from InputMap) being pressed/released |
| simulate_sequenceA | Simulate a sequence of input events with timing |
| get_input_actionsA | Get all input actions defined in the InputMap |
| set_input_actionB | Add or modify an input action and its event mappings |
| get_game_scene_treeA | 🔴 Game must be running. Get the scene tree of the running game (runtime state) |
| get_game_node_propertiesB | 🔴 Game must be running. Get all properties of a node in the running game |
| set_game_node_propertyA | 🔴 Game must be running. Set a property on a node in the running game |
| execute_game_scriptA | 🔴 Game must be running. Execute a GDScript snippet in the running game context |
| capture_framesA | 🔴 Game must be running. Capture frames from the running game viewport as PNG files |
| monitor_propertiesA | 🔴 Game must be running. Monitor specific properties on a game node for changes over time |
| start_recordingA | 🔴 Game must be running. Start recording game state changes |
| stop_recordingA | 🔴 Game must be running. Stop recording and return the recorded game state data |
| replay_recordingC | 🔴 Game must be running. Replay a previously recorded game session |
| find_nodes_by_scriptB | 🔴 Game must be running. Find all nodes in the game that use a specific script |
| get_autoloadA | 🔴 Game must be running. Get properties of an autoload singleton from the running game |
| batch_get_propertiesB | 🔴 Game must be running. Get multiple properties from multiple nodes in one call |
| find_ui_elementsB | 🔴 Game must be running. Find UI elements in the running game by type, text, or name |
| click_button_by_textB | 🔴 Game must be running. Find and click a button by its text content |
| wait_for_nodeB | 🔴 Game must be running. Wait for a node to appear in the running game tree |
| find_nearby_nodesB | 🔴 Game must be running. Find nodes within a radius of a world position |
| navigate_toB | 🔴 Game must be running. Navigate a node to a target position using pathfinding |
| move_toC | 🔴 Game must be running. Directly move a node to a target position |
| watch_signalsA | 🔴 Game must be running. Watch for signal emissions from a game node |
| list_animationsA | List all animations on an AnimationPlayer |
| create_animationB | Create a new animation on an AnimationPlayer |
| add_animation_trackC | Add a track to an animation |
| set_animation_keyframeC | Set a keyframe in an animation track |
| get_animation_infoB | Get detailed information about an animation including tracks and keyframes |
| remove_animationB | Remove an animation from an AnimationPlayer |
| create_animation_treeC | Create an AnimationTree node on a given path |
| get_animation_tree_structureB | Get the structure of an AnimationTree including state machines and blend trees |
| set_tree_parameterB | Set a parameter on an AnimationTree (e.g. blend amount, state) |
| add_state_machine_stateC | Add a state to an AnimationNodeStateMachine |
| tilemap_set_cellB | Set a single cell in a TileMap |
| tilemap_fill_rectB | Fill a rectangular area of a TileMap with a tile |
| tilemap_get_cellB | Get the tile data at a specific cell |
| tilemap_clearB | Clear cells in a TileMap area or the entire map |
| tilemap_get_infoA | Get TileMap configuration and TileSet information |
| tilemap_get_used_cellsB | Get all used cell coordinates in a TileMap |
| create_themeC | Create a new Theme resource |
| delete_themeC | Delete a theme resource file from the project |
| set_theme_colorB | Set a color in a theme for a specific control type |
| set_theme_constantC | Set a constant value in a theme |
| set_theme_font_sizeC | Set a font size in a theme |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 321 tools
Many tool groups have near-identical purposes, e.g. get_project_settings/get_all_project_settings, set_project_setting/set_project_setting_config, add_autoload/add_autoload_config, export_project/export_for_platform, and validate_export/validate_platform_export/validate_export_for_platform. With 321 tools, these overlapping clusters make it very hard for an agent to reliably select the intended tool.
Although the names are snake_case, the semantic pattern is inconsistent: add/create/setup are used for similar node/resource creation, delete/remove for destruction, get/list for reads, and several near-duplicate suffixes like _config and _platform fragment the vocabulary. Duplicate pairs such as add_autoload vs add_autoload_config and get_project_settings vs get_all_project_settings further undermine predictability.
321 tools is an extreme over-fragmentation for an MCP surface. It far exceeds any practical selection budget and contains dozens of redundant variants that could be merged into parameterized tools. This count will overwhelm agent context and degrade tool-selection accuracy.
The set is remarkably comprehensive, covering scenes, scripts, resources, animation, physics, audio, navigation, rendering, export, debugging, testing, and project settings. A few lifecycle gaps exist, such as no remove_animation_track or remove state machine state, but most gaps can be worked around with generic node/property/script tools.