io.github.tomyud1/godot-mcp
NPM · GODOT-MCP-SERVER · SCANNED SEP 21
MCP server for Godot game engine integration — control the Godot editor with AI
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security81
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects @modelcontextprotocol/sdk 1.25.3, a direct dependency. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 31 of 94 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 27 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 16090 tokens (~191/item across 84 items; 77 tools + 7 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
- Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage98
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 95% of tool parameters carry a description.Partial
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 7 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "remove_node" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 78 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the io.github.tomyud1/godot-mcp server?
io.github.tomyud1/godot-mcp runs locally as an npm package, launched with npx -y godot-mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · godot-mcp-server
claude mcp add tomyud1-godot-mcp -- npx -y godot-mcp-server
{
"mcpServers": {
"tomyud1-godot-mcp": {
"command": "npx",
"args": [
"-y",
"godot-mcp-server"
]
}
}
} {
"servers": {
"tomyud1-godot-mcp": {
"command": "npx",
"args": [
"-y",
"godot-mcp-server"
]
}
}
} codex mcp add tomyud1-godot-mcp -- npx -y godot-mcp-server
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tomyud1-godot-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"godot-mcp-server"
],
"enabled": true
}
}
} openclaw mcp add tomyud1-godot-mcp --command npx --arg -y --arg godot-mcp-server
mcp_servers:
tomyud1-godot-mcp:
command: "npx"
args: ["-y", "godot-mcp-server"] {
"McpServers": {
"tomyud1-godot-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"godot-mcp-server"
]
}
}
} assistant mcp add tomyud1-godot-mcp -t stdio -c npx -a -y godot-mcp-server
{
"mcpServers": {
"tomyud1-godot-mcp": {
"command": "npx",
"args": [
"-y",
"godot-mcp-server"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 −2
- Stability: fail → 0.80 functional
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 92 to 95.
- 13 Sept 26 +1
- Security disclosure: unverified → fail ▼ functional
- 12 Sept 26 0
- Security disclosure: fail → unverified ▼ functional
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 78 to 82.
- 10 Sept 26 −3
No change was recorded against any check on this day. Stability & Change Management went from 98 to 78.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed npm/godot-mcp-server@0.6.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 1 finding
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-345p-7cg4-v4c7 | CVE-2026-25536 | high | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 94 packages
| Packages resolved | 94 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
read_file ~103
Read a text file from the Godot project, optionally a specific line range. Useful for reading GDScript files, scene files, or any text-based content.
| Name | Type | Req | Description |
|---|---|---|---|
| end_line | number | – | Inclusive end line; 0 or missing means to end of file (optional) |
| path | string | yes | res:// path to the file (e.g., res://scripts/player.gd) |
| start_line | number | – | 1-based inclusive start line (optional) |
No output schema declared.
No examples provided.
read_scene ~161
Read and parse a scene file to get its full node structure and properties. Use this to understand a scene before editing. NOTE: `include_properties: true` returns a hand-picked subset (position, rotation, scale, size, offset, visible, modulate, z_index, text, collision_layer, collision_mask, mass) optimized for quick scene overviews. To see ALL properties on a specific node — including @export'd script vars — use `get_scene_node_properties`.
| Name | Type | Req | Description |
|---|---|---|---|
| include_properties | boolean | – | Include the curated property subset above on each node (default: false). For a full per-node property dump use get_scene_node_properties. |
| scene_path | string | yes | Path to the scene file (res://path/to/scene.tscn) |
No output schema declared.
No examples provided.
remove_node ~52
Remove a node from an existing scene file.
| Name | Type | Req | Description |
|---|---|---|---|
| node_path | string | yes | Path to the node to remove (cannot be root, use relative path) |
| scene_path | string | yes | Path to the scene file |
No output schema declared.
No examples provided.
rename_file ~248
Rename or move a project file. By default also rewrites every literal reference to the old path in other text-format project files (.tscn, .tres, .gd, .cs, .gdshader, project.godot) and updates any matching `autoload/*` entry in ProjectSettings, so scenes and preloads keep working. When Godot exposes a reliable scene-dirty API, clean open scene tabs that referenced the renamed file are reloaded (close + reopen), while dirty tabs are preserved and returned in scenes_skipped_dirty. On Godot versions without that API, open scene reload is skipped with scene_reload_warnings to avoid discarding unsaved changes; the files are still correct on disk, but the user may need to manually reopen the tab to clear stale editor paths. Pass update_references:false to skip both reference rewrite and reload. Returns references_updated:[{file, replacements}], scenes_reloaded:[paths], and optionally scenes_skipped_dirty or scene_reload_warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| new_path | string | yes | New file path |
| old_path | string | yes | Current file path |
| update_references | boolean | – | Update references in other files (default: true) |
No output schema declared.
No examples provided.
rename_node ~55
Rename a node in a scene.
| Name | Type | Req | Description |
|---|---|---|---|
| new_name | string | yes | New name for the node |
| node_path | string | yes | Path to the node to rename |
| scene_path | string | yes | Path to the scene file |
No output schema declared.
No examples provided.
rescan_filesystem ~108
Trigger a full filesystem rescan in the Godot editor. Use after creating, deleting, or modifying files externally (e.g. from the terminal or another tool). The scan is asynchronous and returns immediately. If a scan is already in progress (often happens right after a batch of mutations), the call returns ok:true with already_scanning:true — the in-flight scan will pick up your recent disk changes, no new scan is triggered. Response: {ok, already_scanning, message}.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
run_scene ~481
Launch a scene in the Godot editor. By default the call BLOCKS until the editor flips to playing state (so the next get_errors / take_screenshot / send_input call sees a real game). The response includes started, runtime_connected, wait_for_started_ms, wait_for_runtime_ms, scene_path, and runtime_root. Use runtime_root (e.g. "/root/Main") as the prefix for query_runtime_node node_path arguments — it is computed from the actual root node name in the .tscn, NOT from the file name. Set wait_for_runtime=true to additionally wait for the in-game MCPRuntime helper to connect (required before take_screenshot / send_input will work). By default this watermarks the log surfaces so the subsequent get_console_log / get_errors only show THIS run's output — no more mistaking stale errors from a previous run for fresh ones (set clear_output:false to keep reading the full history). Recommended testing loop: run_scene({wait_for_runtime:true}) → query_runtime_node / send_input / take_screenshot → get_errors → stop_scene.
| Name | Type | Req | Description |
|---|---|---|---|
| block_until_started | boolean | – | Wait until the editor reports playing=true before returning (default: true). Up to startup_timeout_ms. |
| clear_output | boolean | – | Watermark the Output panel and Debugger > Errors tab at launch so get_console_log / get_errors only return entries from THIS run, preventing stale output from a previous run being read as current err… |
| scene | string | – | Scene to run: omit for main scene, "current" for the currently open scene, or a res:// path for a specific scene |
| startup_timeout_ms | number | – | Max time in ms to wait for the above signals. Default: 10000. Bump to 15000–20000 on slower machines or autoload-heavy projects. Values above 25000 are clamped (response would otherwise miss the tran… |
| wait_for_runtime | boolean | – | Wait until the MCPRuntime in-game helper connects back (required for take_screenshot/send_input). Default: false. |
No output schema declared.
No examples provided.
save_resource_to_file ~147
Save a Resource currently held by a node (or sub-resource) to a standalone .tres file so it can be referenced by other scenes / shared / committed. The node's property is then re-pointed to the loaded-from-disk version, so future set_resource_property calls write through to that file. Works for any Resource subclass: Material, Mesh, Shape, Curve, Gradient, etc.
| Name | Type | Req | Description |
|---|---|---|---|
| node_path | string | – | – |
| resource_path | string | yes | Path from node to the resource (e.g. "shape", "material") |
| save_to | string | yes | Destination path (res://.../foo.tres) |
| scene_path | string | yes | – |
No output schema declared.
No examples provided.
scene_tree_dump ~429
Dump the scene tree of the scene currently open in the Godot editor (node names, types, and attached scripts) as an indented text block. Reflects unsaved edits (uses the live editor tree, not the .tscn on disk). All args are optional; with no args the entire tree is returned (existing behavior). Opt-in scoping / pagination (use these on large scenes to keep responses small): • subtree_root — start at a node path relative to the scene root (e.g. "UI/HUD"). Empty or "." means the scene root. Depth resets to 0 at this node. • max_depth — stop traversal at depth N from the (subtree_)root. 0 = only the root itself. Omit or pass a negative value for unlimited. • offset / limit — paginate by flat DFS preorder index. offset skips the first N nodes; limit caps how many are emitted. Response fields: • tree — the indented text (only nodes inside the window are rendered). • scene_path — the editor scene file. • total_node_count — total nodes inside the (subtree_root + max_depth) scope. Always returned. • truncated — true ONLY when offset/limit clipped output. max_depth is intentional scoping, not truncation. • next_offset — set to offset + emitted when truncated; call again with this offset to continue. • subtree_root — echoed when you passed one.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | number | – | Maximum number of nodes to render after offset. Omit for unlimited. |
| max_depth | number | – | Stop traversal at depth N from the (subtree_)root. 0 = only that root node. Omit or pass a negative value for unlimited depth. |
| offset | number | – | Skip the first N nodes in DFS preorder (used for pagination). Default 0. |
| subtree_root | string | – | Scene-relative node path to start the dump at (e.g. "UI/HUD"). Empty or "." = scene root. Errors if the node is not found. |
No output schema declared.
No examples provided.
search_project ~72
Search the Godot project for a substring and return file hits with line numbers. Useful for finding usages of functions, variables, or any text pattern.
| Name | Type | Req | Description |
|---|---|---|---|
| glob | string | – | Optional glob filter like **/*.gd to search only GDScript files |
| query | string | yes | Case-insensitive substring to find |
No output schema declared.
No examples provided.
send_input ~221
Synthesize an InputEvent and dispatch it to the running game via Input.parse_input_event. REQUIRES the game to be running with the MCPRuntime autoload connected. Use this to drive automated tests: click buttons, press keys, fire input actions. For multi-step interactions, alternate send_input → wait → query_runtime_node / take_screenshot.
| Name | Type | Req | Description |
|---|---|---|---|
| event | object | yes | InputEvent descriptor: Key: {type:"key", key:"Space", pressed:true, shift?:bool, ctrl?:bool, alt?:bool} or {type:"key", keycode:32, pressed:true} Mouse button: {type:"mouse_button", button_index:… |
No output schema declared.
No examples provided.
set_collision_shape ~168
Create and assign a collision shape resource to a CollisionShape2D or CollisionShape3D node. Supports: CircleShape2D, RectangleShape2D, CapsuleShape2D, SphereShape3D, BoxShape3D, etc.
| Name | Type | Req | Description |
|---|---|---|---|
| node_path | string | – | Path to the CollisionShape2D/3D node |
| scene_path | string | yes | Path to the .tscn scene file |
| shape_params | object | – | Shape parameters: {radius: 32} for circles, {size: {x: 64, y: 64}} for rectangles, etc. |
| shape_type | string | yes | Shape type: CircleShape2D, RectangleShape2D, CapsuleShape2D, SphereShape3D, BoxShape3D, etc. |
No output schema declared.
No examples provided.
set_editor_selection ~280
Replace or extend the editor's Scene-dock selection. Two main uses: (1) after `add_node`, focus the user's gizmo on the freshly-created node so they can see/manipulate it immediately, and (2) draw the user's attention to a node the AI just modified or discovered ("here is the offending node — selected for you in the Scene dock"). Pre-validates every path against the live edited scene tree before mutating — if any path is unresolved, no selection change happens and `not_found` is returned. Args: `node_paths` (string OR array of strings; scene-relative, "." = scene root, "UI/HUD/Label" for nested), `mode` ("replace" default = clear existing then select; "add" = append to existing). Returns `{ok, scene_path, selected:[{path,name,type}], not_found:[], mode, count}`. Use `get_editor_selection` afterwards (or `scene_tree_dump`) to verify.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | "replace" (default) clears the existing selection first; "add" appends to it. |
| node_paths | – | yes | Scene-relative path(s) to select. "." = scene root, "UI/HUD/Label" for nested. Accepts a single string OR an array of strings; both forms behave identically. |
No output schema declared.
No examples provided.
set_material ~205
Create and assign a material to a MeshInstance3D, CSG, or GeometryInstance3D node. Supports StandardMaterial3D or loading from file.
| Name | Type | Req | Description |
|---|---|---|---|
| material_params | object | – | StandardMaterial3D: {albedo_color:{r,g,b,a}, metallic:0-1, roughness:0-1, emission:{r,g,b}, emission_energy:float, transparency:0=disabled/1=alpha/2=scissor/3=hash/4=depth_pre_pass}. file: {path:"res… |
| material_type | string | yes | "StandardMaterial3D" or "file" to load from a resource path |
| node_path | string | – | Path to the target node |
| scene_path | string | yes | Path to the .tscn scene file |
| surface_index | number | – | For MeshInstance3D only: surface index for per-surface override. Omit for material_override on all surfaces. |
No output schema declared.
No examples provided.
set_mesh ~279
Create and assign a mesh resource to a MeshInstance3D node. REQUIRED to make 3D geometry visible. Primitive types: BoxMesh, SphereMesh, CylinderMesh, CapsuleMesh, PlaneMesh, PrismMesh, TorusMesh, QuadMesh, TextMesh. Or load from file.
| Name | Type | Req | Description |
|---|---|---|---|
| mesh_params | object | – | BoxMesh: {size:{x,y,z}}. SphereMesh: {radius,height,radial_segments,rings}. CylinderMesh: {top_radius,bottom_radius,height}. CapsuleMesh: {radius,height}. PlaneMesh: {size:{x,y}}. PrismMesh: {left_to… |
| mesh_type | string | yes | Mesh class: "BoxMesh", "SphereMesh", "CylinderMesh", "CapsuleMesh", "PlaneMesh", "PrismMesh", "TorusMesh", "QuadMesh", "TextMesh", or "file" to load from a resource path |
| node_path | string | – | Path to the MeshInstance3D node within the scene |
| scene_path | string | yes | Path to the .tscn scene file |
No output schema declared.
No examples provided.
set_node_groups ~124
Set, add, or remove a node's group memberships in a .tscn scene file. Groups persist to disk so the running game can call get_tree().get_nodes_in_group(name).
| Name | Type | Req | Description |
|---|---|---|---|
| groups | array | yes | List of group names to apply |
| mode | string | – | replace (default): node ends up in EXACTLY the listed groups. add: union with existing. remove: drop the listed groups. |
| node_path | string | – | Path to the node (. for root) |
| scene_path | string | yes | Path to the .tscn scene file |
No output schema declared.
No examples provided.
set_node_properties ~237
Set MULTIPLE properties on a node in a single tool call. **Atomic pre-validation** — every entry is checked (name exists on the node's class plus its attached script's @export'd properties; Resource-typed properties must use the dedicated resource tools) BEFORE anything is written. If ANY entry fails, the response is `ok: false` with a `validation_errors` array (e.g. `properties.color: property does not exist on Sprite2D`) and ZERO mutation occurs — no scene save, no half-applied state. On success, returns the `applied` list with old/new values per property. Resource-typed properties must use set_resource_property / set_sprite_texture / set_mesh / set_material / set_collision_shape.
| Name | Type | Req | Description |
|---|---|---|---|
| node_path | string | – | Path to the node (. for root, or relative path) |
| properties | object | yes | Map of property_name -> value. Each value follows the same form as modify_node_property.value (primitives, arrays, or {type:"Vector3",...} discriminated objects). |
| scene_path | string | yes | Path to the .tscn scene file |
No output schema declared.
No examples provided.
set_resource_property ~200
Modify a property on a Resource that is currently held by a node (or by another resource attached to that node). Use this to tweak shape radii, material colors, gradient stops, etc., WITHOUT recreating the resource. resource_path walks from the node down to the resource using "/"-separated property names, e.g. "shape", "material", or "material/next_pass". After the change, saves the scene.
| Name | Type | Req | Description |
|---|---|---|---|
| node_path | string | – | Path to the node owning the resource |
| property_name | string | yes | Property on the target resource to set (e.g. "radius", "albedo_color") |
| resource_path | string | yes | Path from node to the target resource via property names. Examples: "shape", "material", "material/next_pass" |
| scene_path | string | yes | Path to the .tscn scene file |
| value | – | yes | New value (same shape as modify_node_property.value) |
No output schema declared.
No examples provided.
set_sprite_texture ~322
Assign a texture resource to a Sprite2D / Sprite3D / TextureRect node in a .tscn scene file. Modes: • FromPath — load any texture file from disk (png/jpg/webp/svg/.tres) via load(). Returns whatever Texture2D the importer produced (usually CompressedTexture2D). Most common after generate_2d_asset. • ImageTexture (DEPRECATED ALIAS for FromPath, kept for back-compat) • NewImageTexture — force-create an ImageTexture (in-memory) from a raw image file. • PlaceholderTexture2D — in-scene placeholder of a given size. • GradientTexture2D / NoiseTexture2D — procedural textures. Response always includes texture_class (the actual Godot class the texture decoded to), width, height, and texture_path so the agent can confirm what landed without an extra get_resource_info call.
| Name | Type | Req | Description |
|---|---|---|---|
| node_path | string | – | Path to the Sprite2D/Sprite3D/TextureRect node |
| scene_path | string | yes | Path to the .tscn scene file |
| texture_params | object | – | Texture parameters. FromPath / ImageTexture / NewImageTexture: {path: "res://assets/sprite.png"}. PlaceholderTexture2D: {size: {x: 64, y: 64}}. GradientTexture2D / NoiseTexture2D: {width, height}. |
| texture_type | string | yes | How to obtain the texture. Prefer FromPath for assets on disk. |
No output schema declared.
No examples provided.
setup_autoload ~103
Register, unregister, or list autoload singletons. Autoloads are scripts/scenes loaded automatically at project start.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Autoload name (e.g., "GameManager", "AudioManager") |
| operation | string | yes | "add" to register, "remove" to unregister, "list" to show all autoloads |
| path | string | – | res:// path to the script or scene file (required for "add") |
No output schema declared.
No examples provided.
snap_node_to_grid ~153
Snap a Node3D position to a grid in local or global space. Useful for modular level building and keeping 3D scenes aligned.
| Name | Type | Req | Description |
|---|---|---|---|
| axes | array | – | Axes to snap. Any of: ["x"], ["x","z"], ["x","y","z"] (default: all axes) |
| grid_size | – | yes | Positive grid size. Use a number for uniform snapping or {x,y,z} for per-axis snapping. |
| node_path | string | – | Path to the Node3D to snap |
| scene_path | string | yes | Path to the .tscn scene file |
| space | string | – | Coordinate space: "local" or "global" (default: "global") |
No output schema declared.
No examples provided.
stop_scene ~33
Stop the currently running scene in the Godot editor. Always stop the scene before editing code to avoid errors repeating every frame.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
take_screenshot ~152
Capture the current viewport of the running game and save it as a PNG. REQUIRES the game to be running with the MCPRuntime autoload connected (run_scene with wait_for_runtime=true first). Returns resource_path, absolute_path, width, height, and (optionally) base64_png. Default save location is res://addons/godot_mcp/cache/screenshots/.
| Name | Type | Req | Description |
|---|---|---|---|
| return_base64 | boolean | – | Also include the PNG bytes inline as base64 (default: false). Useful when the agent has no filesystem access. |
| save_to | string | – | Optional res:// or user:// destination path. Defaults to res://addons/godot_mcp/cache/screenshots/screenshot_<ms>.png |
No output schema declared.
No examples provided.
update_project_settings ~122
Update one or more Godot project settings. Pass a dictionary of setting paths to their new values. Use list_settings first to discover available setting paths, current values, and valid options for a category. For input action bindings, prefer configure_input_map — if you do pass input/* keys here, partial updates are merged safely (existing events are preserved).
| Name | Type | Req | Description |
|---|---|---|---|
| settings | object | yes | Dictionary of setting paths to new values (e.g., {"display/window/size/viewport_width": 1920, "display/window/size/viewport_height": 1080}) |
No output schema declared.
No examples provided.
validate_script ~109
Validate a GDScript file for syntax errors using Godot's built-in parser. Good for ordinary project scripts after editing. For @tool/editor-plugin addon scripts this isolated parser path may return valid:false with diagnostics_available:false because dependencies and editor context are not fully loaded; in that case, use get_errors/get_console_log after enabling or reloading the addon for actionable details.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the GDScript file to validate (e.g., res://scripts/player.gd) |
No output schema declared.
No examples provided.
wait ~87
Sleep server-side. Useful between input events to let the game process them. Capped at 30000ms / 30s. Pass either ms or seconds (ms wins if both given).
| Name | Type | Req | Description |
|---|---|---|---|
| ms | number | – | Milliseconds to wait (1..30000). |
| seconds | number | – | Seconds to wait (0.001..30). Convenient when the agent is thinking in seconds. |
No output schema declared.
No examples provided.
write_file ~632
Write UTF-8 text content to any file in the project. Creates the file if missing; REFUSES to clobber an existing file unless overwrite=true. Parent directories are auto-created (override with create_dirs=false). Refuses to write to plugin source (anywhere under res://addons/godot_mcp/ except res://addons/godot_mcp/cache/) unless force=true. Refuses paths containing ".." or "." traversal segments (would escape the project tree). Use this for non-GDScript text: .gdignore, .gitignore, README.md, .json configs, .gdshader files, custom .tres data, fixture files for tests, any plain-text content. For GDScript with boilerplate (class_name / extends), prefer create_script which adds those automatically and validates the path is .gd. The write is captured by the undo system: a single mcp_undo restores the prior content (when overwriting) or deletes the file (when creating new). Binary content is NOT supported — for binary files write a GDScript helper that produces the file and run it via run_scene, or copy/move via rename_file. Editor sync after write: the call replaces the ResourceLoader cache entry for .tscn/.tres/.gdshader/.scn so the next load() sees the new content (sets cache_evicted:true on success), force-reloads any Script resource for .gd writes (sets script_reloaded:true), and reloads an open scene tab whose .tscn was just written (sets scene_reloaded:true). The refresh runs unconditionally for the recognized extensions — flags reflect whether each step succeeded, not whether a stale cache happened to exist beforehand, because Godot keeps resources alive in places ResourceLoader.has_cached() cannot see (open tabs, EditorFileSystem index). The script editor's in-memory tab buffer is NOT swapped (Godot exposes no public API for that) — if you wrote to a .gd that is currently open in the editor, the user may need to refocus the tab to see the new source. When any refresh action ran successfully, an editor_refresh:{cache_evicted, scene_reloaded, script_reloaded}…
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | Text content to write. Encoded as UTF-8. Pass an empty string to create a zero-byte file. |
| create_dirs | boolean | – | If true (default), missing parent directories are auto-created. If false, missing parent dirs return an error. |
| force | boolean | – | Bypass the plugin-source-protection guard. Required to overwrite anything under res://addons/godot_mcp/ except res://addons/godot_mcp/cache/. Default false. |
| overwrite | boolean | – | REQUIRED to replace an existing file. Default false — calls against an existing path without overwrite=true return file_exists:true and refuse. |
| path | string | yes | File path (res://... — res:// is prepended if missing). |
No output schema declared.
No examples provided.
What is the io.github.tomyud1/godot-mcp server?
io.github.tomyud1/godot-mcp is listed in the public MCP registry as io.github.tomyud1/godot-mcp. MCP server for Godot game engine integration, control the Godot editor with AI. This page covers its npm package (godot-mcp-server).
Is the io.github.tomyud1/godot-mcp server safe to use?
io.github.tomyud1/godot-mcp scores 77 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 21 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.tomyud1/godot-mcp server expose?
io.github.tomyud1/godot-mcp exposes 77 tools: get_godot_status, get_guide, list_dir, read_file, search_project, and 72 more. Their descriptions and schemas cost roughly 15,868 tokens of context every time the server is loaded.
Is the io.github.tomyud1/godot-mcp server still maintained?
io.github.tomyud1/godot-mcp is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.tomyud1/godot-mcp server under?
io.github.tomyud1/godot-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.