GodotCAUTION
MCP server for full Godot 4.x engine control: 157 tools for AI-driven game development (GDScript and C#/.NET). Tested with Godot 4.7.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://modelcontextprotocol.io/introduction) [](https://godotengine.org) [](https://www.typescriptlang.org/) [](https://opensource.org/licenses/MIT)
A comprehensive Model Context Protocol (MCP) server that gives AI assistants full control over the Godot game engine. 157 tools spanning networking, 3D/2D rendering, UI controls, audio effects, animation trees, file I/O, runtime code execution, property inspection, scene manipulation, signal management, physics, project creation, and more.
Acknowledgments
This project is built upon and extends godot-mcp by Solomon Elias (Coding-Solo). The original project provided the foundational architecture including the TypeScript MCP server, headless GDScript operations system, and TCP-based runtime interaction server. Thank you for making this possible with your excellent open-source work!
What's New (Improvements Over Original)
The original godot-mcp provided 20 tools for basic project management and scene creation. This fork extends it to 157 tools with the following major additions:
New in 3.1
- `validate_script` autoload resolution - Script validation now compiles the target through a
SceneTreeat_initialize()(after project autoloads are registered) instead of--check-onlyat_init(). References to autoload singletons no longer produce false `Identi
a1d79855c196OBSERVED · 2026-10-01Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add godot-mcp -- npx -y @tugcantopaloglu/[email protected]
Exposed tools (157)
62 read · 78 write · 17 destructive. Blast radius: 17 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
add_node | write | Add a node to an existing scene |
attach_script | read | Attach a GDScript to a scene node (headless) |
create_csharp_script | write | Create a C# script file in a Godot .NET project |
create_directory | write | Create a directory inside a Godot project |
create_project | write | Create a new Godot project from scratch |
create_resource | write | Create a .tres resource file (headless) |
create_scene | write | Create a new Godot scene file |
create_script | write | Create a GDScript file from a template |
delete_file | destructive | Delete a file from a Godot project |
export_mesh_library | read | Export a scene as a MeshLibrary resource |
export_project | read | Export a Godot project using a preset |
game_3d_effects | write | Create ReflectionProbe, Decal, or FogVolume |
game_add_collision | write | Add a collision shape to a physics body node |
game_animation_control | read | AnimationPlayer seek/queue/speed/info control |
game_animation_tree | read | AnimationTree state machine travel and params |
game_audio_bus | write | Set volume, mute, or solo on an audio bus |
game_audio_bus_layout | destructive | Create/remove audio buses and routing |
game_audio_effect | destructive | Add/remove/configure audio bus effects |
game_audio_play | write | Play, stop, or pause an AudioStreamPlayer node |
game_audio_spatial | read | Configure AudioStreamPlayer3D spatial properties |
game_await_signal | read | Await a signal with timeout and return args |
game_bone_pose | write | Get or set bone poses on a Skeleton3D node |
game_call_method | read | Call a method on any node in the running game with optional arguments |
game_camera_attributes | read | Configure DOF, exposure, auto-exposure on camera |
game_canvas | write | Create/configure CanvasLayer and CanvasModulate |
game_canvas_draw | destructive | 2D drawing: line/rect/circle/polygon/text/clear |
game_change_scene | read | Switch to a different scene file in the running game |
game_click | read | Click at a position in the running Godot game window |
game_connect_signal | read | Connect a signal from one node to a method on another node in the running game |
game_create_animation | write | Create an animation with tracks and keyframes |
game_create_joint | write | Create a physics joint between two bodies |
game_create_timer | write | Create a Timer node with configuration |
game_csg | write | Create/configure CSG nodes with boolean operations |
game_debug_draw | read | Draw debug lines, spheres, or boxes in 3D |
game_disconnect_signal | read | Disconnect a signal connection in the running game |
game_emit_signal | read | Emit a signal on a node in the running game, optionally with arguments |
game_environment | write | Get or set environment and post-processing settings |
game_eval | write | Execute GDScript in the running game. Use |
game_find_nodes_by_class | read | Find all nodes of a specific class type in the running game |
game_gamepad | write | Send gamepad button or axis input event |
game_get_audio | read | Get audio bus layout and playing streams |
game_get_camera | read | Get active camera position, rotation, and size |
game_get_errors | read | Get new push_error/push_warning messages since last call |
game_get_logs | read | Get new print output from the running game since last call |
game_get_node_info | read | Get node info: class, properties, signals, methods, children |
game_get_nodes_in_group | read | Get all nodes belonging to a specific group in the running game |
game_get_property | read | Get a property value from any node in the running game by its path |
game_get_scene_tree | read | Get scene tree structure of the running game |
game_get_ui | read | Get visible UI elements from the running game |
game_gi | write | Create/configure VoxelGI or LightmapGI |
game_gridmap | destructive | GridMap set/get/clear cells and query used cells |
game_http_request | destructive | HTTP GET/POST/PUT/DELETE with headers and body |
game_input_action | read | Manage runtime InputMap actions and strength |
game_input_state | read | Query pressed keys, mouse position, connected pads |
game_instantiate_scene | write | Load a PackedScene and add it as a child of a node in the running game |
game_key_hold | read | Hold a key down without auto-releasing |
game_key_press | write | Send a key press or input action to the running game |
game_key_release | read | Release a previously held key |
game_light_2d | write | Create/configure 2D lights and light occluders |
game_light_3d | write | Create/configure 3D lights (directional/omni/spot) |
game_list_signals | read | List all signals on a node with connections |
game_locale | write | Set/get locale and translate strings at runtime |
game_manage_group | destructive | Add or remove a node from a group, or list groups |
game_mesh_instance | write | Create MeshInstance3D with primitive meshes |
game_mouse_drag | read | Drag mouse between two points over N frames |
game_mouse_move | write | Move the mouse in the running Godot game |
game_multimesh | write | Create/configure MultiMeshInstance3D for instancing |
game_multiplayer | write | ENet multiplayer create server/client/disconnect |
game_navigate_path | read | Query a navigation path between two points |
game_navigation_3d | write | Create/configure NavigationRegion3D and bake |
game_os_info | read | Get platform, locale, screen, adapter, memory info |
game_parallax | write | Create/configure ParallaxBackground and layers |
game_path_2d | read | Path2D/Curve2D management and AnimatedSprite2D |
game_path_3d | write | Create Path3D/Curve3D and manage curve points |
game_pause | read | Pause or unpause the running game |
game_performance | read | Get performance metrics (FPS, memory, draw calls) |
game_physics_2d | read | Area2D queries and 2D point/shape intersections |
game_physics_3d | read | Area3D queries and point/shape intersection tests |
game_physics_body | read | Configure physics body properties (mass, velocity, etc.) |
game_play_animation | write | Control an AnimationPlayer node: play, stop, pause, or list animations |
game_procedural_mesh | read | Generate meshes via ArrayMesh from vertex data |
game_process_mode | write | Set node process mode (pausable/always/disabled) |
game_raycast | read | Cast a ray and return collision results |
game_remove_node | destructive | Remove and free a node from the running game\ |
game_render_settings | write | Get/set MSAA, FXAA, TAA, scaling mode/scale |
game_reparent_node | write | Move a node to a new parent in the running game\ |
game_resource | write | Runtime resource load, save, or preload |
game_rpc | read | Call or configure RPC methods on nodes |
game_screenshot | read | Screenshot the running game (returns base64 PNG) |
game_script | read | Attach, detach, or get source of node scripts |
game_scroll | write | Send mouse scroll wheel event at position |
game_serialize_state | write | Save or load node tree state as JSON |
game_set_camera | write | Move or rotate the active camera |
game_set_particles | write | Configure GPUParticles2D/3D node properties |
game_set_property | write | Set a property on a node in the running game |
game_set_shader_param | write | Set a shader parameter on a node\ |
game_shape_2d | read | Line2D/Polygon2D point manipulation |
game_skeleton_ik | write | SkeletonIK3D start/stop/set target position |
game_sky | write | Create/configure Sky with procedural/physical sky |
game_spawn_node | write | Create a new node of any type at runtime |
game_terrain | write | Create/modify terrain meshes from heightmap data |
game_tilemap | write | Get or set cells in a TileMapLayer node |
game_time_scale | write | Get/set Engine.time_scale and timing info |
game_touch | read | Simulate touch press/release/drag and gestures |
game_tween_property | read | Tween a node property in the running game |
game_ui_control | write | Set focus, anchors, tooltip, mouse filter on Control |
game_ui_item_list | destructive | ItemList/OptionButton: get/select/add/remove items |
game_ui_menu | destructive | PopupMenu/MenuBar: add/remove/get menu items |
game_ui_popup | read | Show/hide/popup for Popup/Dialog/Window nodes |
game_ui_range | write | ProgressBar/Slider/SpinBox/ColorPicker get/set |
game_ui_tabs | write | TabContainer/TabBar: get/set current tab |
game_ui_text | read | LineEdit/TextEdit/RichTextLabel text operations |
game_ui_theme | write | Apply theme overrides to a Control node |
game_ui_tree | destructive | Tree control: get/select/collapse/add/remove items |
game_video | write | Video playback control: play, pause, stop, seek on VideoStreamPlayer |
game_viewport | write | Create or configure a SubViewport node |
game_visual_shader | write | Create and edit VisualShader graphs: add/connect/disconnect nodes |
game_wait | read | Wait N frames in the running game |
game_websocket | write | WebSocket client connect/disconnect/send messages |
game_window | write | Get/set window size, fullscreen, title, position |
game_world_settings | write | Get/set gravity, physics FPS, and world settings |
get_debug_output | read | Get the current debug output and errors |
get_godot_version | read | Get the installed Godot version |
get_project_info | read | Retrieve metadata about a Godot project |
get_uid | read | Get the UID for a specific file in a Godot project (for Godot 4.4+) |
launch_editor | read | Launch Godot editor for a specific project |
list_project_files | read | List project files, optionally filtered by extension |
list_projects | read | List Godot projects in a directory |
load_sprite | read | Load a sprite into a Sprite2D node |
manage_autoloads | destructive | Add, remove, or list autoloads in a Godot project |
manage_ci_pipeline | write | Create/read GitHub Actions workflow for automated Godot exports |
manage_docker_export | write | Create Dockerfile for headless Godot export |
manage_export_presets | write | Create or modify export preset configuration |
manage_input_map | destructive | Add, remove, or list input actions and bindings |
manage_layers | write | List/set named layer definitions in project |
manage_plugins | write | List/enable/disable editor plugins |
manage_resource | write | Read or modify .tres/.res resource files |
manage_scene_signals | destructive | List/add/remove signal connections in .tscn files |
manage_scene_structure | write | Rename/duplicate/move nodes within .tscn scenes |
manage_shader | write | Create or read .gdshader files |
manage_theme_resource | write | Create/read/modify Theme .tres resources |
manage_translations | destructive | List/add/remove translation files in project |
modify_project_settings | write | Modify a project.godot setting |
modify_scene_node | write | Modify node properties in a scene file (headless) |
read_file | read | Read a text file from a Godot project |
read_project_settings | read | Read project.godot as structured JSON |
read_scene | read | Read scene file as JSON node tree (headless) |
remove_scene_node | destructive | Remove a node from a scene file (headless) |
rename_file | write | Rename or move a file within the project |
run_project | write | Run the Godot project and capture output |
save_scene | write | Save changes to a scene file |
set_main_scene | write | Set the main scene in project.godot |
stop_project | write | Stop the currently running Godot project |
update_project_uids | write | Update UID references by resaving resources (4.4+) |
validate_script | write | Check a GDScript file for syntax/type errors (headless, no run) |
validate_scripts | read | Batch-check GDScript files (git-changed by default, or all) |
write_file | destructive | Create or overwrite a text file in a Godot project |
Trust audit
CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (4 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (9)
'/usr/local/bin/godot',
description: 'Path to the node (e.g., "/root/Player", "/root/Main/Enemy")',
description: 'Path to the node (e.g., "/root/Player")',
delete_file, game_audio_bus_layout, game_audio_effect, game_canvas_draw, game_gridmap, game_http_request, game_manage_group, game_remove_node, game_ui_item_list, game_ui_menu, game_ui_tree, manage_aut
const args = normalizeParameters({ node_path: '/root/Player', property: 'position' });expect(r.commandArgs).toEqual({ node_path: '/root/Player', property: 'position' });const r = fakeHeadlessOp({ projectPath: '../../etc/passwd' }, simpleArgsFn);expect(validatePath('../../../etc/passwd')).toBe(false);axios, fs-extra, @types/node, @vitest/coverage-v8, typescript, vitest
Gates applied: no_behavioural_pass.
a1d79855c196full audit observations/trust-audit/mcp-server/tugcantopaloglu__godot-7.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-01 | a1d79855c196 | CAUTION | B | 89 | first audit |
Questions
What is the Godot MCP server?
MCP server for full Godot 4.x engine control: 157 tools for AI-driven game development (GDScript and C#/.NET). Tested with Godot 4.7.
What tools does Godot expose?
157 in total: 62 read-only, 78 that write, and 17 that can delete or overwrite (delete_file, game_audio_bus_layout, game_audio_effect, game_canvas_draw, game_gridmap). Every one is listed on this page with its risk.
Is Godot safe to connect to an agent?
With care. The audit graded it B (89/100) and found 9 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 17 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Godot need?
No credential environment variables were found in its source, so it appears to need none.
How does Godot run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as @tugcantopaloglu/godot-mcp at 3.1.0.
How current is this page?
The grade is for one exact copy of the source (a1d79855c196), read on 2026-10-01. The repository is watched and re-audited when it changes.