Godot AI
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DISABLE_TELEMETRY | No | Set to 'true' to disable anonymous telemetry (cross-tool convention). | |
| GODOT_AI_DISABLE_TELEMETRY | No | Set to 'true' to disable anonymous telemetry. |
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
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| session_activateA | Set the active Godot editor session for subsequent tool calls. Accepts either an exact session_id or a substring hint matched against the session's short name (project folder basename), project_path, or session_id. An exact id match always wins; a substring must resolve to exactly one session or the tool returns an error listing the candidates. |
| session_manageB | Session listing. Resource form: Ops:
• list()
List every connected Godot editor with metadata: session_id, short
name, godot_version, project_path, plugin_version, server_version,
editor_pid, server_launch_mode, current_scene, play_state, readiness,
connected_at, last_seen, is_active. The response also carries the
server-global Canonical call shape: |
| editor_stateA | Get current Godot editor state: version, readiness, open scene, play state. Resource form: Code-mode MCP adapters keep the server and tool names separate:
Side effect: refreshes the server's session readiness cache from the
live editor reply. Useful as a recovery step after a write call is
rejected as Response includes |
| logs_readA | Read recent log lines from the Godot editor, plugin, or running game. Resource form: Sources:
Tail pattern: for game logs, poll the current run with offset=N and
keep the returned run_id. |
| editor_screenshotA | Capture a screenshot of the Godot editor viewport or running game. Picking a source: the default Sources:
|
| editor_reload_pluginA | Reload the Godot editor plugin. Disables and re-enables the plugin on the next frame. The response shape depends on whether this MCP server was spawned by the plugin or launched externally:
|
| editor_manageA | Editor selection, performance monitors, quit, log clearing, game eval. Resource forms (prefer for active-session reads): godot://editor/state, godot://selection/current, godot://performance Ops: • state() Editor version, project name, current scene, readiness, play state. • selection_get() Currently selected node paths in the editor. • selection_set(paths) Replace the selection with the given list of scene paths. • monitors_get(monitors=None) Performance singleton values (FPS, memory, draw calls, etc.). Pass a list of monitor names to filter; None returns everything. • quit() Gracefully quit the Godot editor on next frame. • logs_clear(clear_debugger_errors=False) Clear the MCP log buffer. Returns cleared_count. Pass clear_debugger_errors=True to also clear the Debugger dock's visible Errors-tab rows (user-facing UI, so opt-in only); the response then includes debugger_errors_cleared. • game_eval(code) Execute GDScript in the running game with return values. Uses 'await' so user code can await internally. Errors return fast and actionable: EVAL_COMPILE_ERROR for a syntax/parse error, EVAL_RUNTIME_ERROR (with the real message + line) for a runtime error; EVAL_GAME_NOT_READY if the game can't service evals — still launching (retry once it's up), the _mcp_game_helper autoload is missing/disabled, its main loop is not advancing (focus the game), or its debugger session closed; EVAL_HUNG for a live game's genuine infinite loop / never-firing await; EVAL_RESULT_TOO_LARGE if the returned value serializes past the debugger channel's capacity (return a smaller slice). Canonical call shape: |
| scene_get_hierarchyA | Get the scene tree hierarchy from the open scene. Returns a paginated flat list of nodes with name, type, path, and child count. Walks up to the specified depth. Resource form: |
| scene_openA | Open an existing scene file (.tscn) in the editor. If The reply is sent only after the editor has actually switched to the
requested scene ( |
| scene_saveA | Save the currently edited scene to disk. Node and property mutation tools change the editor's in-memory scene; call this explicitly to persist those mutations to the existing path. |
| scene_manageA | Scene authoring (create, save_as, list open roots). Resource form: Ops: • create(path, root_type="Node3D", root_name="") Create the initial .tscn with the given root and open it. root_name defaults to filename basename when empty. This initial root is written immediately, but later node_create/node_set_property mutations remain in editor memory until scene_save or save_as is called. • save_as(path) Save the currently edited scene to a new file path. • get_roots() List scenes currently open in the editor; flag the edited one. Canonical call shape: |
| node_get_propertiesA | Get properties of a node. Resource form: The default returns every editor-visible property, which can be
50-150 entries. Pass Null-valued properties are included: an unset object/resource slot
( |
| node_createA | Create (spawn) a new node in the scene tree. Creates a node of the given type and adds it to the parent, or
instantiates a PackedScene from |
| node_set_propertyA | Set a property on a node. Verify the property name first — call Coerces
|
| node_findA | Find nodes in the scene tree by name, type, or group. At least one filter must be provided. Filters AND together. Paginated. |
| node_manageA | Node tree manipulation (delete, duplicate, rename, reorder, reparent, groups, hierarchy reads). Resource forms (prefer for active-session reads): godot://node/{path}/properties, godot://node/{path}/children, godot://node/{path}/groups Ops: • get_children(path) Direct children of a node (name, type, path each). • get_groups(path) Group names the node belongs to. • delete(path, scene_file="") Remove the node. Cannot delete scene root. Undoable. • duplicate(path, name="", scene_file="") Deep-copy a node + children as a sibling. Cannot duplicate scene root. • rename(path, new_name, scene_file="") Rename a node. Sibling-name collision and "/" / ":" / "@" rules apply. • move(path, index, scene_file="") Reorder among siblings. Index 0 = first. • reparent(path, new_parent, scene_file="") Move under a new parent. Children preserved. Cannot move into descendants. • add_to_group(path, group, scene_file="") Add the node to a group. • remove_from_group(path, group, scene_file="") Remove the node from a group. All write ops accept the optional Canonical call shape: |
| project_runA | Run (play) the Godot project from the editor. Modes:
Idempotent: if the project is already running, returns success with
After starting playback, waits briefly for the Godot AI game helper to
check in. The response includes |
| project_manageA | Project run/stop and project.godot settings. Resource form: Ops:
• stop()
Stop the running project (game). Takes no params — call as
Canonical call shape: |
| script_createA | Create a script file on disk: GDScript (.gd, validated) or C# (.cs, text only). Writes content to the path. Overwrites if it exists. Registers the
file with the editor. New files include .gd: source is parse-validated and the response carries
|
| script_patchA | Anchor-based string-replace edit on a .gd or .cs file. Finds an exact |
| script_attachA | Attach a script to a node in the scene tree. Replaces any existing script on the node. Undoable. |
| script_manageA | Script (.gd / .cs) reading, detachment, and outline. Resource form: Ops:
• read(path)
Read full source, line count, file size.
• detach(path)
Remove the currently attached script from a node. Undoable.
• find_symbols(path)
Outline a script. .gd: class_name, extends, functions, signals,
@export vars. .cs: class, base type, methods, [Signal] delegates,
[Export] members. Response Language support: GDScript is the full contract. C# (.cs) is text-only —
files are written, read and outlined, but Godot AI does not build .NET or
report C# compiler errors; inspect the editor Build panel or Canonical call shape: |
| resource_manageA | Resource (asset) search, inspection, assignment, and creation. Covers generic Resource subclasses plus specialized authoring (Curve, Environment, physics shapes, gradient/noise textures). Ops: • search(type="", path="", offset=0, limit=100) Search for resources by type or path. Type matching includes subclasses. At least one filter required. Paginated. • load(path) Inspect a .tres / .res — returns type and editor-visible properties. • inspect(node_path, property, depth=2) Read a live native resource graph without loading or modifying files. Depth 0..3; shared references, omission reasons, fixed traversal and 64 KiB encoded-result limits. Scripted/dynamic properties excluded. • assign(path, property, resource_path) Load and assign a resource to a node property. Undoable. • get_info(type) Introspect a Resource class — properties, parent, abstract flag, concrete_subclasses (for abstract bases). Read-only. • create(type, properties=None, path="", property="", resource_path="", overwrite=False) Instantiate a Resource subclass. Either path+property (assign to a node, undoable) or resource_path (save to .tres). For specific families (Curve, Environment, etc.) prefer the dedicated ops. • curve_set_points(points, path="", property="", resource_path="") Replace all points on a Curve / Curve2D / Curve3D. Auto-creates the curve resource if the slot is empty (curve_created flag). • environment_create(path="", preset="default", properties=None, sky=None, resource_path="", overwrite=False) Build Environment + Sky chain. Presets: default | clear | sunset | night | fog. sky may be bool or a procedural sky dict such as {"sky_material": "procedural", "sky_top_color": "#0f172a"}. Either assign to a WorldEnvironment node or save .tres. • physics_shape_autofit(path, source_path="", shape_type="") Size a CollisionShape2D/3D to a nearby visual's bounds. Searches direct siblings then parent-siblings (handles nested Body→Collision layouts). Ambiguous matches return candidate paths in error.data.candidates. Auto-creates the concrete Shape subclass if needed. shape_type accepts either the short form ("box", "sphere", "capsule", "cylinder" for 3D; "rectangle", "circle", "capsule" for 2D) or the matching Godot class name ("BoxShape3D", "RectangleShape2D", etc.). • physics_shape_generate(paths, shape_type="box", body_type="static", reparent_mesh=False, scene_file="", overwrite=False) Generate a physics body sibling (named Collider) with a CollisionShape3D for every MeshInstance3D path. Shapes are fitted in body-local space; a mesh that already has a collider sibling, a duplicate path, or a scene-root mesh is refused before anything is written. shape_type: auto | box | sphere | capsule | cylinder | convex | trimesh (or the class name for explicit shapes). Opt-in auto selects matching primitives for BoxMesh, SphereMesh, CapsuleMesh and CylinderMesh, with box bounds for every other mesh. The default remains box. Auto uses bounding fits (including tapered cylinders), not exact mesh geometry. convex/trimesh derive the shape from the mesh's own triangles, with the mesh scale baked into the shape, and are limited to 2048 triangles and 6144 vertices per mesh, with bounded mesh types (the hull build runs synchronously inside one editor-frame item); trimesh needs a static or area body, and a non-uniformly scaled parent chain refuses every type except box. body_type: static | area | rigid | character. rigid/character always wrap the mesh under the generated body (a detached dynamic body would fall away from the stationary visual); reparent_mesh=True does the same for static/area while preserving the mesh's world transform, and the reported mesh_path is then the post-move path. overwrite=True refreshes only a marked generated collider's shape and collision transform, preserving body/collision identity and user settings. Requested body type and wrapping must match; unmarked legacy bodies or broken provenance links are refused. Mixed fresh/refresh batches prepare all resources before one undo action; stale edits refuse the batch. scene_file pins the request to that edited scene. Up to 1024 paths are processed in bounded work across editor frames; inside batch_execute at most 16. The bulk write is one undo action. Returns: {created: [{mesh_path, body_path, shape_path, shape_type, body_type, operation: "create"|"refresh"}], undoable: true}. • gradient_texture_create(stops, width=256, height=1, fill="linear", path="", property="", resource_path="", overwrite=False) Build GradientTexture2D from color stops. fill: linear | radial | square. • noise_texture_create(noise_type="simplex_smooth", width=512, height=512, frequency=0.01, seed=0, fractal_octaves=0, path="", property="", resource_path="", overwrite=False) Build NoiseTexture2D wrapping FastNoiseLite. Noise types: simplex | simplex_smooth | perlin | cellular | value | value_cubic. Canonical call shape: |
| api_manageA | Inspect Godot API documentation-shaped metadata from the connected editor's ClassDB: "what properties does X have", method signatures, signals, enums, constants, defaults, and property hint strings. Resource form (prefer for active-session reads): godot://class/{class_name} Ops:
Canonical call shape: |
| filesystem_manageA | Project filesystem access via the Godot editor's EditorFileSystem. Ops:
• read_text(path)
Read a text file at a move/rename/remove contract: Mutations require a direct call, not batch_execute. Directory results set scan_required: call scan afterward. All mutations are non-undoable. Errors report outcome unchanged/rolled_back/partial and actual affected paths. Never blindly retry a partial result. Canonical call shape: |
| client_manageA | Configure AI clients to use this Godot AI MCP server. Writes / removes client config files (Claude Code, Codex, Antigravity, Cursor, Devin Desktop (Windsurf), Zed, etc.). Ops:
• status()
List every supported client with id, display_name, status
(configured | not_configured | configured_mismatch | error),
and installed flag.
• configure(client)
Write the MCP server entry into the named client's config file.
Canonical call shape: |
| signal_manageA | Signals (Godot's event/observer mechanism) — list, connect, disconnect. Ops:
• list(path, include_editor=False)
List all signals on the node and their current connections (built-in
and custom). By default editor-internal connections (the
SceneTreeEditor dock and friends) are filtered out — pass
Canonical call shape: |
| autoload_manageA | Autoload (global singleton) management. Autoloads are scripts or scenes
loaded automatically at project start, accessible globally by name when
Ops:
• list()
List autoloads with name, path, and singleton flag.
• add(name, path, singleton=True)
Register an autoload (script or PackedScene) by Canonical call shape: |
| input_map_manageA | InputMap actions and bindings (keyboard, mouse, gamepad). Persisted to
Resource form: Ops:
• list(include_builtin=False)
List input actions and their bound events. By default only
user-authored actions (those persisted in Canonical call shape: |
| game_manageA | Runtime game inspection and input simulation. These ops target the running game process through Godot's EngineDebugger bridge. Start the project first with project_run and poll editor_state until game_capture_ready=true. Ops:
Canonical call shape: |
| test_runA | Run GDScript test suites inside the connected Godot editor. Discovers test_*.gd in res://tests/, instantiates them, and runs
all test_* methods. Returns a compact summary by default (counts,
suite names, duration) plus failures only. verbose=True includes
every individual test result (each with per-test Preloaded GDScript dependencies may remain stale after source edits; the response includes cache_warning. Restart the editor before using a rerun to validate dependency edits. ResourceLoader cache modes alone do not refresh the GDScript preload cache. The whole run has a 300s budget; the plugin aborts between tests shortly before it expires and returns TEST_RUN_TIMEOUT with the partial summary (full partials via test_manage(op="results_get")). Long suites are safe — the editor services the MCP transport between tests — but one single test blocking the main thread for 20s+ can still drop the session. Not allowed inside batch_execute. The response includes |
| test_manageA | Test result inspection (re-fetches the most recent Resource form: Ops: • results_get(verbose=False) Same shape as test_run — full results from the last run, no re-execution. verbose=True includes every individual test result. Canonical call shape: |
| batch_executeA | Execute a list of editor sub-commands in order, stopping on first error. Each item must be Use this to compose multi-step edits (create node + set property +
attach script) into a single tool call. Rollback works for sub-commands
that modify the currently edited scene. Scene paths are relative to the edited scene root (e.g. "/Main/Enemy"), NOT runtime "/root/..." paths. The example below assumes the scene root is named "Main" — substitute the actual root name. |
| ui_manageA | UI / Control authoring (HUD, menus, layouts, vector decoration). Ops:
• set_anchor_preset(path, preset, resize_mode="minsize", margin=0)
Apply a Control layout preset. preset: top_left | top_right |
bottom_left | bottom_right | center_left | center_top | center_right |
center_bottom | center | left_wide | top_wide | right_wide |
bottom_wide | vcenter_wide | hcenter_wide | full_rect.
resize_mode: minsize | keep_width | keep_height | keep_size.
Target must be a Control. CanvasLayer is the canonical HUD parent
but is not a Control — put a Control child under the CanvasLayer and
apply the preset to that overlay.
• set_text(path, text)
Set text on a Label/Button/LineEdit/TextEdit/RichTextLabel.
• set_richtext(path, text, bbcode=True)
Set a RichTextLabel's text with BBcode parsing on by default —
"[color=red]HP[/color]" renders as markup, and bbcode=False writes
literal text. Undoable.
• build_layout(tree, parent_path="")
Atomically build a UI subtree from a nested spec
({type, name?, properties?, anchor_preset?, anchor_margin?, theme?,
children?}). Validates everything before mutating.
Canonical call shape: |
| theme_manageA | Theme authoring (Godot's stylesheet-like resource for Controls). Cascades down a Control subtree when assigned via theme_apply. Stylebox numeric fields (border widths, corner radii, margins, shadow) must be finite numbers and stylebox flags (anti_aliasing, draw_center) must be real booleans; a non-numeric or non-finite value is refused with a structured error before anything is applied, so a refused call leaves the theme and undo history untouched. Slot changes are persisted immediately: if the theme file cannot be written the call fails with an error, the previous slot is restored, and no undo entry is committed. Ops (pass via op="..." plus a params dict):
• create(path, overwrite=False)
Create a new empty Theme .tres at a res:// path.
• set_color(theme_path, class_name, name, value)
Set a color slot. value: "#rrggbb"/"#rrggbbaa", named, or
{"r","g","b","a"}.
• set_constant(theme_path, class_name, name, value)
Set an integer constant (separation, margin, padding).
• set_font_size(theme_path, class_name, name, value)
Set a font_size slot in pixels.
• set_stylebox_flat(theme_path, class_name, name, bg_color?, border_color?,
border?, corners?, margins?, shadow?, anti_aliasing?)
Compose a StyleBoxFlat (panels, button states, line edits).
border/corners/margins/shadow each accept "all" + per-side keys.
• set_stylebox_texture(theme_path, class_name, name, texture_path,
region?, margins?, axis_stretch_horizontal?,
axis_stretch_vertical?, modulate_color?, draw_center?)
Compose a 9-slice StyleBoxTexture from an imported image — pixel-art
buttons and artwork-backed panels. region is {position, size} or
[x,y,w,h]; margins are {all|left|top|right|bottom}; axis stretch modes
are "stretch" | "tile" | "tile_fit".
• set_font(theme_path, class_name, name, font_path)
Assign a Font resource (FontFile .ttf/.otf, FontVariation) to a font
slot. Loads the imported resource from res://.
• set_icon(theme_path, class_name, name, texture_path)
Assign a Texture2D to an icon slot (checkbox marks, dropdown arrows).
• stylebox_override(path, slot, patch)
Per-node stylebox override: duplicate the stylebox the Control
resolves for All ops accept Canonical call shape: |
| animation_createA | Create a new Animation clip inside an AnimationPlayer's default library. After creating the clip, add tracks via |
| animation_manageA | AnimationPlayer authoring (player, tracks, autoplay, presets, playback). Ops: • player_create(parent_path, name="AnimationPlayer") Create an AnimationPlayer with empty default library. • delete(player_path, animation_name) Delete an animation clip from the default library. Undoable. • validate(player_path, animation_name) Check all track paths resolve. Returns broken_count + per-track issues. • add_property_track(player_path, animation_name, track_path, keyframes, interpolation="linear") Add a property track. track_path: "NodeName:property". keyframes: [{time, value, transition?}, ...]. interpolation: linear|nearest|cubic. • add_method_track(player_path, animation_name, target_node_path, keyframes) Add a method track. keyframes: [{time, method, args?}, ...]. • set_autoplay(player_path, animation_name="") Set autoplay. Empty animation_name clears. • play(player_path, animation_name="") Editor preview. Not saved with scene. • stop(player_path) Stop editor preview. Not saved with scene. • list(player_path) List animations with length, loop_mode, track_count. • get(player_path, animation_name) Inspect a clip's tracks and keyframes in detail. • create_simple(player_path, name, tweens, length=None, loop_mode="none", overwrite=False) High-level: build a multi-track clip from tween specs in one call. tweens: [{target, property, from, to, duration, delay?, transition?}]. • preset_fade(player_path, target_path, mode="in", duration=0.5, animation_name="", overwrite=False) One-call fade-in/out (modulate.a). • preset_slide(player_path, target_path, direction="left", mode="in", distance=None, duration=0.4, animation_name="", overwrite=False) One-call slide-in/out (position). • preset_shake(player_path, target_path, intensity=None, duration=0.3, frequency=30.0, seed=0, animation_name="", overwrite=False) One-call shake (jittered position). • preset_pulse(player_path, target_path, from_scale=1.0, to_scale=1.1, duration=0.4, animation_name="", overwrite=False) One-call pulse / hover-bounce (3-keyframe scale ping-pong). Preset target_path: accepts either a scene-absolute path (e.g. "/Main/World/Cube",
matching every other scene tool) or a path relative to the AnimationPlayer's
root_node (e.g. "World/Cube", matching how Animation tracks store node paths).
Scene-absolute targets outside the player's root_node subtree are converted to
a Canonical call shape: |
| material_manageA | Material authoring (StandardMaterial3D, ORMMaterial3D, ShaderMaterial, CanvasItemMaterial), raw shader source (.gdshader / .gdshaderinc), and VisualShader graph authoring/editing. Albedo, metallic/roughness, emission, transparency, shader uniforms, render modes. Resource forms: Ops:
• visual_shader_create_graph(resource_path, stages, shader_type="spatial",
overwrite=False, varyings=None)
Create/save a VisualShader .tres only (not undoable). Each stages entry is
{stage, nodes: [{id, type, position?, params?}], connections:
[{from_node, from_port, to_node, to_port}]}. Explicit stages must match
spatial/canvas_item (vertex/fragment/light), particles
(start/process/collide/start_custom/process_custom), sky (sky), or fog (fog).
IDs are stage-local integers >=2 or nonempty strings; output is "output"/0.
Limits: 256 nodes, 1024 connections total. Existing destination directory
required. Returns id_map by stage as [{id, node_id}] in request order.
varyings: [{name, mode: "vertex_to_frag_light"|"frag_to_light",
type: "float"|"int"|"uint"|"vector2"|"vector3"|"vector4"|"boolean"|"transform"}]
(spatial/canvas_item only).
The generated source is parsed through the engine's shader compiler
before saving; a graph it rejects (for example a parameter named after
a shader keyword) is not written. Renderers that cannot compile a
shader type fall back to validating the generated declarations, so the
advertised modes stay accepted.
Use create(type="shader", shader_path=<saved .tres>) then assign separately.
• visual_shader_get(path)
Inspect a VisualShader .tres: shader_type, per-stage nodes (id, type,
position, params), connections, and varyings. Use before visual_shader_edit.
• visual_shader_node_catalog(filter="", offset=0, limit=100)
List instantiable VisualShaderNode classes with the properties this tool
accepts, plus legacy aliases. Discover valid node types and params before
authoring a graph.
• visual_shader_edit(resource_path, operations)
Apply a validated operation list to an existing VisualShader .tres:
add_node / remove_node / replace_node / set_node_params /
set_node_position / connect / disconnect / add_varying / remove_varying.
Operations run in order; string node ids added by the call are returned
in Canonical call shape: |
| particle_manageA | Particle systems (GPUParticles2D/3D, CPUParticles2D/3D). All write ops create the node + sub-resources (ProcessMaterial, default QuadMesh draw pass) in a single undo action. Ops: • create(parent_path, name="Particles", type="gpu_3d") Create an emitter. type: "gpu_3d" | "gpu_2d" | "cpu_3d" | "cpu_2d". For GPU emitters, auto-creates ProcessMaterial; for gpu_3d, also a default QuadMesh draw pass. • set_main(node_path, properties) Node-level props: amount, lifetime, one_shot, explosiveness, preprocess, speed_scale, randomness, fixed_fps, emitting, local_coords, interp_to_end. • set_process(node_path, properties) Behavior props (auto-creates ProcessMaterial for GPU). Emission shape, velocity, gravity, color_ramp, scale_curve, turbulence. See full property list in the Godot reference. GPU gravity is a Vector3 — pass {x, y, z} or [x, y, z], including for gpu_2d (the shared ProcessMaterial is 3D; z is ignored in 2D). • set_draw_pass(node_path, pass_=1, mesh="", texture="", material="") What gets drawn per particle. GPU 3D: mesh in draw_pass_N + optional material override. GPU 2D / CPU 2D: texture. CPU 3D: mesh. • restart(node_path) Restart emission. Runtime-only, not undoable. • get(node_path) Inspect main props, process material, draw passes. • apply_preset(parent_path, name, preset, type="gpu_3d", overrides=None) Curated effects: fire, smoke, spark_burst, magic_swirl, rain, explosion, lightning. One-shot presets re-trigger via restart. overrides = {"main": {...}, "process": {...}, "draw": {...}}; bare keys are auto-routed to main (amount, lifetime, one_shot, ...) or process — draw keys must be nested under "draw". draw configures the gpu_3d draw-pass StandardMaterial3D (blend_mode, albedo_color, emission, ...); on gpu_2d only draw.texture (res:// path) applies; cpu_* types reject draw overrides. Unknown or malformed override keys return INVALID_PARAMS (never silently dropped); response reports applied_main / applied_process / applied_draw. GPU gravity requires {x, y, z} (or [x, y, z]) even for gpu_2d. Canonical call shape: |
| camera_manageA | Camera2D / Camera3D authoring (zoom, FOV, projection, smoothing, follow). Ops: • create(parent_path, name="Camera", type="2d", make_current=False) Create a Camera2D ("2d") or Camera3D ("3d"). When make_current=True, unmarks previously current cameras of the same class in one undo. • configure(camera_path, properties) Batch-set camera-specific properties (zoom, fov, projection, smoothing, drag, limits …). Class-aware. Enum-by-name (projection, keep_aspect, anchor_mode, doppler_tracking, process_callback). Vector2 dict coercion for zoom/offset. Transforms (position, rotation, scale, transform, global_*) live on the Node — set those via node_set_property, not here. • set_limits_2d(camera_path, left?, right?, top?, bottom?, smoothed?) Set Camera2D bounds. Pass only the edges to change. • set_damping_2d(camera_path, position_speed?, rotation_speed?, drag_margins?, drag_horizontal_enabled?, drag_vertical_enabled?) Smooth Camera2D motion (position/rotation smoothing speeds + drag deadzone). drag_margins: {left,top,right,bottom} fractions [0,1]. • follow_2d(camera_path, target_path, smoothing_speed=5.0, zero_transform=True) Reparent camera under target with smoothing — Godot-native follow. • get(camera_path="") Inspect a camera (class, current flag, all properties). Empty path resolves to the currently-active camera, falling back to the first. • list() List every Camera2D/Camera3D in the scene. • apply_preset(parent_path, name, preset, type=None, make_current=True, overrides=None) Spawn with opinionated defaults. Presets: topdown_2d, platformer_2d, cinematic_3d, action_3d. overrides merge over preset values. Canonical call shape: |
| audio_manageA | Sound effects, music, ambience (AudioStreamPlayer / 2D / 3D). Ops: • player_create(parent_path, name="AudioStreamPlayer", type="1d") Create an AudioStreamPlayer / 2D / 3D node. type: "1d" | "2d" | "3d". • player_set_stream(player_path, stream_path) Assign an AudioStream resource (.ogg/.wav/.mp3 or .tres). Returns duration_seconds. • player_set_playback(player_path, volume_db?, pitch_scale?, autoplay?, bus?) Update common playback properties atomically. Pass only fields to change; at least one of volume_db/pitch_scale/autoplay/bus required. • play(player_path, from_position=0.0) Start real editor preview playback. Not undoable. • stop(player_path) Stop editor preview playback. Not undoable. • list(root="res://", include_duration=True) Scan project for AudioStream resources (every subclass + .tres/.res). Canonical call shape: |
| tilemap_manageA | TileMap / TileMapLayer authoring (set tiles, fill rects, clear, read cells). All operations target TileMapLayer nodes in the currently edited scene by scene-relative path (e.g. "/LavaLake20x20/Ground"). All write ops are undoable via EditorUndoRedoManager. source_id is the TileSet source index. atlas_col/atlas_row are the atlas coordinates of the tile within that source. For full-tile animated sources (lava, water, sewage) use atlas_col=0, atlas_row=0. IMPORTANT — Source-ID remapping in specialized .tres files: When a layer uses a specialized .tres (e.g. volcano_animated.tres), Source-IDs are re-numbered from 0. Example: volcano lava is Source 8 in the main volcano.tres but Source 0 in volcano_animated.tres. Always use the remapped ID when the TileMapLayer references a specialized .tres, not the original ID from the main .tres. Ops: • tilemap_set_cell(path, source_id, atlas_col, atlas_row, map_x, map_y) Set a single tile at (map_x, map_y). Returns: {map_x, map_y, source_id, atlas_col, atlas_row} • tilemap_set_cells_rect(path, source_id, atlas_col, atlas_row, rect_x, rect_y, rect_w, rect_h) Fill a rect_w × rect_h region starting at (rect_x, rect_y) with one tile type in a single undo action. Returns: {cells_filled, rect: {x, y, w, h}} • tilemap_clear(path) Remove all tiles from the layer. Returns: {cleared: true} • tilemap_get_cells(path) Return all used cell coordinates. Returns: {cells: [{x, y}, ...], count: int} Canonical call shape: |
| tileset_manageA | TileSet management — atlas inspection tools. Ops: • tileset_get_atlas_tiles(tileset_path, source_id) Return all occupied atlas tile positions for one source in a TileSet. Read-only — does not modify any resource or project file. • tileset_get_atlas_image(tileset_path, source_id, max_size=0) Return the atlas sprite-sheet texture of a TileSetAtlasSource as a Base64-encoded PNG image. Read-only — reads the texture directly from the resource without any UI interaction. • Atlas image workflow: To visually inspect what tiles look like, use tileset_get_atlas_image instead of editor screenshots. It reads the texture directly from the resource — no UI interaction or editor state required. Canonical call shape: |
| gridmap_manageA | GridMap authoring (set items, fill 3D regions, clear, read cells + library items). All operations target GridMap nodes in the currently edited scene by scene-relative path (e.g. "/Main/Terrain"). All write ops are undoable via EditorUndoRedoManager. item is the item id from the GridMap's MeshLibrary. Use gridmap_list_library_items to discover valid ids and names before placing cells (the 3D analogue of tileset atlas inspection). orientation is the GridMap baked rotation index (0..24). Ops: • gridmap_set_item(path, item, map_x, map_y, map_z, orientation=0) Set a single cell item at (map_x, map_y, map_z). item=-1 erases. Returns: {map_x, map_y, map_z, item, orientation} • gridmap_fill(path, item, rect_x, rect_y, rect_z, rect_w, rect_h, rect_d, orientation=0) Fill a rect_w × rect_h × rect_d region starting at (rect_x, rect_y, rect_z) with one item in a single undo action. Returns: {cells_filled, rect: {x, y, z, w, h, d}} • gridmap_clear(path) Remove all cells from the GridMap. Returns: {cleared: true} • gridmap_get_used_cells(path) Return all used cell coordinates. Returns: {cells: [{x, y, z}, ...], count: int} • gridmap_list_library_items(path) List the MeshLibrary items available to the GridMap. Returns: {library, items: [{item, name, mesh}...], count: int} Canonical call shape: |
| navigation_manageA | Bounded 3D mesh-only navigation baking and 2D/3D path queries on an explicitly selected map. Ops: • bake(path, scene_file="", force_sync=True) Bake a 3D region from bounded mesh-only children. Requires NavigationMesh root-children source mode and mesh-instance or both geometry settings. Supports unscripted Node / Node3D containers and MeshInstance3D using plain ArrayMesh, BoxMesh, PlaneMesh, SphereMesh, CylinderMesh or CapsuleMesh. Rejects other source nodes/settings (groups, colliders, CSG, GridMap, obstacles); custom source parser callbacks are never invoked. 2D baking is unsupported. Limits: 256 source nodes, 2048 triangles, 6144 vertices in total, 32 surfaces per ArrayMesh, and 1000000 estimated voxel cells. Source collection advances one bounded node per editor frame, then the engine bakes the collected snapshot asynchronously. These input limits are not a hardware-independent per-frame timing guarantee. Replies are deferred with a 30 s deadline; source edits abort the operation. Cancellation restores the old region resource; an already-started engine task may finish into its detached working copy. parse_ms reports collection time. force_sync=True pushes the result and synchronizes the map; False leaves map synchronization to the engine. Undo/redo restore exact retained resources. Only one bake per region; call directly, not in batch_execute. Resource form: none - per-region write. • path_get(from_point, to_point, dimension="3d", optimize=True, navigation_layers=1, region_path="", force_sync=False) Query a path between two world points ({x,y[,z]} or [x,y[,z]]). region_path selects the NavigationRegion3D/2D whose map to query; when omitted the edited scene root's world map is used — the op never guesses a scene's "first" region. Read-only: force_sync=False (default) never touches the map's shared async-iteration policy; force_sync=True opts in to the same toggle + map_force_update that bake uses when the query must see a just-baked region immediately. Returns points, point_count. Resource form: none — per-query read. Canonical call shape: |
| csg_manageA | CSG authoring (create boolean shapes, set their operation). Create CSG shapes (box, sphere, cylinder, torus, polygon) under a Node3D parent in the currently edited scene and set their boolean operation (union / intersection / subtraction) so geometry like holes, caves and tunnels can be carved directly in the editor. All write ops are undoable via EditorUndoRedoManager. Sibling CSG shapes under the same parent combine automatically; use a CSGCombiner3D parent for explicit grouping. Size, position and material live on the created node — set them with node_set_property / material_manage after creation. Ops: • csg_create(parent_path, name="", shape="box", operation="union") Create a CSG shape under a Node3D parent (empty parent_path = scene root). shape: box | sphere | cylinder | torus | polygon. operation: union | intersection | subtraction. Returns: {path, name, shape, operation} • csg_set_operation(path, operation) Set the boolean operation of a CSG shape. operation: union | intersection | subtraction. Returns: {operation} Canonical call shape: |
| custom_manageA | List or invoke custom tools registered by third-party addons. Active session only. Use op="list" to discover registered tools. op="invoke" requires params: tool_name (string); optional: params (dict, forwarded to the addon handler unvalidated — shape per the tool's params_schema from op="list"). Inside batch_execute, address a custom tool as "custom_tool:" (deferred tools cannot run in batches). Some custom tools are also registered first-class as "custom_" with their own schema — prefer those when present. Canonical call shape: |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| get_sessions | All connected Godot editor sessions and their metadata. |
| get_current_scene | Current scene path and root node info from the active Godot editor. |
| get_scene_hierarchy | Scene tree hierarchy from the active Godot editor (first 100 nodes). A resource URI takes no arguments, so this read is capped; a truncated result sets `resource_truncated` with a hint. Use the `scene_get_hierarchy` tool for offset/limit pagination or a scoped depth. |
| get_current_selection | Currently selected nodes in the Godot editor. |
| get_recent_logs | Last 100 log lines from the Godot editor console. |
| get_project_info | Project name, Godot version, paths, and play state. |
| get_project_settings | Common project settings subset (display, physics, rendering). |
| get_editor_state | Editor version, project name, current scene, readiness, play state. |
| get_materials | All Material resources under res:// (every Material subclass + .tres). |
| get_input_map | All input map actions and their bound events. Excludes built-in ui_*. |
| get_performance | Performance singleton snapshot (FPS, memory, draw calls, frame time). |
| get_test_results | Most recent ``test_run`` results without re-executing tests. |
| get_custom_tools |
TDQS
Scored across 47 tools
Most tools have clearly distinct domains (scene, node, script, resource, animation, material, particles, camera, audio, tilemap, gridmap, navigation, CSG), and the _manage suffix groups related ops. However, there is some overlap: editor_state vs editor_manage(op=state), scene_get_hierarchy vs scene_manage(get_roots), and script_create/script_patch/script_manage vs filesystem_manage(write_text) all have partially redundant surfaces that could cause misselection.
The naming is mostly verb_noun (project_run, scene_open, node_create, script_attach, batch_execute) with a consistent _manage suffix for multi-op tools. But there are deviations: editor_screenshot and editor_reload_plugin break the pattern, some tools use noun_verb (editor_screenshot, project_run) while others use noun_manage, and the _manage tools mix verbs inside ops (e.g. settings_get vs get_class vs list). The pattern is readable but not fully uniform.
47 tools is a very large surface for a single MCP server. While the Godot editor is a broad domain, many tools are actually multi-op wrappers (e.g. project_manage, node_manage, resource_manage) that bundle dozens of operations, making the effective surface even larger. This exceeds the typical well-scoped range and will burden agent tool selection.
The tool surface is remarkably comprehensive for Godot editor automation: scene lifecycle, node manipulation, scripts, resources, materials, animations, particles, cameras, audio, tilemaps, gridmaps, navigation, CSG, UI, themes, input, signals, autoloads, tests, project settings, and runtime game control. There are no obvious dead ends; even niche areas like VisualShader and custom addon tools are covered.