Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
GODOT_AI_DISABLE_TELEMETRYNoSet to true to disable telemetry. No code, scene structure, or file paths are ever transmitted.false

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

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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.

pingA

Lightweight readiness probe echoing engine status, version, and memory metrics.

Verifies the end-to-end MCP communication path between the AI agent, the local MCP server, and the active Godot Editor session.

session_manageC

Session listing.

Resource form: godot://sessions — prefer for resource-aware clients.

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 exclude_domains (tool domains not registered on this server via --exclude-domains).

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

editor_stateA

Get current Godot editor state: version, readiness, open scene, play state.

Resource form: godot://editor/state — prefer for active-session reads. Also reachable as editor_manage(op="state") (same handler) for clients that prefer a single rolled-up tool.

Code-mode MCP adapters keep the server and tool names separate: call('godot-ai', 'editor_state', {}). Never pass a server-prefixed tool name such as godot-ai/get_editor_state; that is neither the adapter's call signature nor a registered tool. For dedicated current- scene data, use readResource('godot-ai', 'godot://scene/current').

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 EDITOR_NOT_READY (state=playing) when you already know the game has stopped — calling editor_state once syncs the cache and the next write proceeds. Issue #262.

Response includes game_status for authoritative game liveness, plus helper_live (status == "live") and session_active (status not in {"not_live", "stopped"}) mirrored from the same fields inside game_status. is_playing remains raw editor play-state; use game_status.status for liveness decisions. game_status.status="break" means the game process is parked in a remote-debugger break (boot-time parse errors do this before the game helper registers); it will not resume on its own — call project_manage(op="stop").

logs_readA

Read recent log lines from the Godot editor, plugin, or running game.

Resource form: godot://logs/recent — prefer for active-session reads.

Sources:

  • "plugin" (default): MCP plugin recv/send/event traffic. Buffer 500.

  • "game": stdout/stderr/push_error/push_warning from playing game via _mcp_game_helper autoload. Buffer 2000, with lines retained across runs and tagged by run_id. Default reads return current-run lines only; pass since_run_id from an earlier response to read that prior run. Entries: {source, level, text, run_id}; response carries run_id, current_run_id, game_status, helper_live, session_active, dropped_count, stale_run_id. helper_live and session_active mirror the same fields inside game_status; is_running is retained as a compatibility alias of session_active. Boot-time parse/load errors fire before the game helper's logger attaches, so they are NEVER in this buffer; when editor-side errors were recorded during the current run the response adds editor_errors_count and editor_errors_hint pointing at source="editor" — treat a clean game log carrying that hint as a run that lost scripts, not a clean launch.

  • "editor": editor-process script errors and the Debugger dock's visible Errors-tab rows — parse errors, GDScript reload warnings, @tool/EditorPlugin runtime errors, push_error/push_warning. Logger-backed entries and Errors-tab rows are read from the editor UI when available. Use when the editor Output or Debugger Errors panel shows red/yellow rows but other sources turned up nothing. Buffer 500 for logger-backed entries; Debugger rows are live UI state. Entries: {source, level, text, path, line, function}. Filtered to .gd/.cs in the user project for Logger-backed entries; addons/godot_ai/ dropped. Logger entries fired before plugin enable are not captured.

  • "all": plugin → editor → game lines (with source per entry).

Tail pattern: for game logs, poll the current run with offset=N and keep the returned run_id. current_run_id identifies the active run; run_id identifies the run being read. Passing since_run_id=old_run_id reads retained lines for that prior run, and stale_run_id: true means the requested run is not the current run. For editor logs, read once to capture next_cursor and pass it back as since_cursor on later calls. since_cursor reads Logger-backed editor entries only; live Debugger Errors-tab rows are included in regular source="editor" reads but do not have stable cursors. When since_cursor is set, it supersedes offset. truncated: true means older entries fell out of the ring before the poll; continue from the returned next_cursor and treat oldest_cursor as the earliest retained sequence. Set include_details=True for Errors-tab style metadata on game/editor entries: original code/rationale, error type, resolved source, and stack frames. Default false preserves compact responses.

editor_screenshotA

Capture a screenshot of the Godot editor viewport or running game.

Picking a source: the default "viewport" captures the editor's 3D viewport, which is empty if the edited scene has no Node3D anywhere in the tree (or no scene is open). Those cases return EDITOR_NOT_READY with error.data = {editor_state: "viewport_not_3d", scene_root_type} and an actionable error.message — switch to "cinematic" if the scene has a Camera3D, or open a scene with 3D content.

Sources:

  • "viewport" (default): editor 3D viewport. Requires Node3D content in the edited scene (root or any descendant); see above for the no-3D-content / no-scene error shape.

  • "viewport_2d": editor 2D viewport. Use for 2D scenes. Not compatible with view_target/coverage/elevation/azimuth/fov.

  • "cinematic": render edited scene through its active Camera3D (no editor gizmos). Prefers a Camera3D marked current; falls back to the first Camera3D found in a depth-first walk. NODE_NOT_FOUND only when the scene contains no Camera3D at all.

  • "game": running game's framebuffer (only when project is running). A backgrounded/minimized game window freezes its main loop; the capture then returns the last rendered frame with stale_frame: true and a note in the metadata — focus the game window and retry for a current frame. GAME_HELPER_TIMEOUT means the game process never replied at all (nothing rendered yet, main thread blocked, or helper dead) — focus the window and retry, or use game_command to confirm liveness.

include_image=True (default) returns an MCP ImageContent block. view_target (comma-separated Node3D paths) reframes editor camera; AABB metadata always returned. coverage=True with view_target captures perspective + orthographic top-down references.

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:

  • Plugin-managed (default install): returns a pre-flight ack {status: "reload_initiated", transport_will_drop: true, old_session_id, guidance} immediately. The reload kills this server, so the WebSocket transport drops; reconnect and call session_manage(op="list") to find the new session_id.

  • Externally launched (e.g. python -m godot_ai --transport streamable-http --port 8000 --reload): waits for the new session to register and returns {status: "reloaded", old_session_id, new_session_id}. If the old bridge disappears and no replacement registers within 90 seconds, raises PLUGIN_DISCONNECTED with data.reason == "reload_timeout" and recovery diagnostics.

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. • eval(code, mode="auto", inputs={}) Execute arbitrary GDScript directly in the Godot Editor process with full permissions. • execute_script(code="", path="", inputs={}) Execute a script file or inline GDScript code in the Godot Editor process. • 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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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: godot://scene/hierarchy — prefer for active-session reads.

scene_openA

Open an existing scene file (.tscn) in the editor.

If path is already the currently edited scene this is a no-op — the in-memory state (including any unsaved MCP mutations) is preserved. Pass force_reload=True when the file on disk is the authority and the editor should discard the open in-memory copy and re-read the scene from disk.

The reply is sent only after the editor has actually switched to the requested scene (switched: true), so follow-up writes are safe immediately. switched: false with settle: "timeout" means the switch had not landed within the wait window. In synchronous contexts (e.g. inside batch_execute) the reply returns immediately with switched: false and settle: "not_waited". In both of those cases, re-check editor_state before issuing follow-up writes.

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: godot://scene/current and godot://scene/hierarchy — prefer for active-session reads.

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. • instantiate_batch(instances, parent_path="") Instantiate multiple PackedScenes into the active scene in a single UndoRedo action. instances: [{scene_path, name?, position?, rotation?, scale?, properties?}]. • diagnose(root_path="") Comprehensive health check / scene doctor for the open scene. Validates orphan collision shapes, unassigned shapes, non-uniform scaling, missing textures, camera configuration, and control hierarchy with actionable error/warning reports and fix suggestions.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

node_get_propertiesA

Get properties of a node.

Resource form: godot://node/{path}/properties — prefer for active-session reads (returns the full property set).

The default returns every editor-visible property, which can be 50-150 entries. Pass fields to return only the properties you need — a large response-size cut on this hot read. The response always carries total_count (all editor-visible properties) alongside count (returned): an unfiltered call returns the full set, so count == total_count; only the fields filter can make count smaller. Requested names that match no editor-visible property are listed in unknown_fields, so a nonexistent name is distinguishable from a property that exists with a null value.

Null-valued properties are included: an unset object/resource slot (script on an unscripted node, an empty mesh or material, …) returns "value": null with its declared type. An attached script serializes to its res:// path; built-in scripts (no resource path) fall back to their string representation.

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 scene_path. type and scene_path are mutually exclusive — when scene_path is given, type is ignored.

node_set_propertyA

Set a property on a node.

Verify the property name first — call node_get_properties (or read godot://node/{path}/properties) to confirm the exact name and type before writing. Guessing common Godot names often fails with PROPERTY_NOT_ON_CLASS because Godot's actual properties differ from intuition (e.g. Camera3D uses fov/current, not field_of_view; Sprite2D uses texture, not image; Node3D uses position/rotation/scale, not transform.origin).

Coerces value to the property's type:

  • Vector2/Vector3: dict with x/y/z keys.

  • Color: dict {r,g,b,a} or hex string ("#ff0000").

  • NodePath: string ("../Other/Node").

  • Resource: res:// path string (loads + assigns); null/"" clears. {"__class__": "BoxMesh", ...} creates a built-in resource owned by this property. After scene_save it is serialized in-place as a [sub_resource] inside the .tscn; it is not a reusable .tres. For sharing, first call resource_manage(op="create", params={"type": "BoxMesh", "properties": {...}, "resource_path": "res://meshes/box.tres"}), then pass that res:// path here (or use resource_manage(op="assign")).

  • StringName: plain string. Array/Dictionary: JSON list/object.

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. • rotate(path, degrees, axis="y", relative=false, scene_file="") Rotate a 2D or 3D node by degrees. Undoable. • scale(path, scale, relative=false, scene_file="") Scale a 2D or 3D node or Control. Undoable. • translate(path, offset, relative=true, scene_file="") Move / offset a node position. Undoable. • call_method(path, method, args=[], scene_file="") Call any method on a node with arguments.

All write ops accept the optional scene_file guard — if non-empty, the mutation fails with EDITED_SCENE_MISMATCH when the editor's current scene doesn't match.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

project_runA

Run (play) the Godot project from the editor.

Modes:

  • "main": Run the project's main scene (default).

  • "current": Run the currently open scene.

  • "custom": Run a specific scene (requires scene).

Idempotent: if the project is already running, returns success with data.was_already_running=true (no scene switch). To switch scenes, call project_manage(op="stop") first, then project_run again.

After starting playback, waits briefly for the Godot AI game helper to check in. The response includes game_status, helper_live (status == "live"), session_active (status not in {"not_live", "stopped"}), and any recent_errors observed during the run window. The top-level booleans mirror the same fields inside game_status. game_status.status="not_live" means playback launched but the game did not become live before the helper-ready window elapsed; "no_helper" means the project has no _mcp_game_helper autoload, as with some headless/custom-main-loop setups (helper_live=false, session_active=true); "stopped" means playback stopped or never became active before liveness could be confirmed (helper_live=false, session_active=false); "break" means the game process is parked in a remote-debugger break — during boot this is a GDScript parse/load error that froze the game before the helper could register, and the response names the failing script when captured (game_status.break = {reason, can_debug, pre_live}). A game at a break cannot continue on its own: call project_manage(op="stop"), fix the error, and relaunch. Poll editor_state to see late transitions.

project_manageA

Project run/stop and project.godot settings.

Resource form: godot://project/info and godot://project/settings — prefer for active-session reads.

Ops: • stop() Stop the running project (game). Takes no params — call as project_manage(op="stop") or with params={}. Idempotent: succeeds with was_running=false if the project isn't running. Do NOT pass extra fields like force or reason inside params — only the registered keys are accepted (here, none). For multi-editor setups, pass session_id as a sibling of op/params, not inside params. • settings_get(key) Read a ProjectSettings key (e.g. "application/config/name"). • settings_set(key, value) Write a ProjectSettings key and persist to project.godot. Refuses the startup-execution keys (autoload/*, editor_plugins/*, application/run/main_scene, editor/run/main_run_args, editor/script/templates_search_path); use set_main_scene / autoload_manage(op="add") for the two that have a validated route. • set_main_scene(path) Set the project's main scene — the scene project_run(mode="main") boots and the engine loads at startup. Writes application/run/main_scene and persists to project.godot. path must be a res:// scene inside the project that already exists and loads as a PackedScene, so a scaffolded project can be made runnable without opening the generic startup-execution surface. • apply_preset(preset="pixel_art_2d", viewport_width=None, viewport_height=None) Configure project display resolution, stretch modes, and texture filtering in one atomic operation. Presets: 'pixel_art_2d' (320x180 viewport stretch, nearest filter), 'hd_2d' (1920x1080 canvas_items stretch, linear filter), 'low_poly_3d' (1280x720 canvas_items expand, FXAA), 'cinematic_3d' (1920x1080 canvas_items expand, 4x MSAA, FXAA, TAA).

  • get_info() Retrieve comprehensive project metadata: Godot version, project name, project path, display settings, rendering settings, active scenes, and registered autoloads.

  • get_map(max_files=180) Compact, read-only map of scenes, scripts, assets, resources, autoloads, input actions and open scenes. Results are capped and mark truncation.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

script_createA

Create a new GDScript source file (.gd) on disk.

Writes content to a .gd file in the project. Overwrites if it exists. Triggers a filesystem scan. New files include data.cleanup.rm listing the .gd + .gd.uid sidecar; overwrite omits it.

script_patchA

Anchor-based string-replace edit on a .gd file.

Finds an exact old_text and replaces with new_text. Fails on multiple matches unless replace_all=True; fails on zero matches. Exact byte match (whitespace significant). Triggers filesystem scan and refreshes an already-loaded GDScript in place so the next call runs the new code (response reloaded=true; otherwise reload_reason says why). Not undoable via Ctrl+Z.

script_attachA

Attach a script to a node in the scene tree.

Replaces any existing script on the node. Undoable.

script_manageA

Script (.gd) reading, detachment, and outline.

Resource form: godot://script/{path} — prefer for active-session reads.

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 .gd — class_name, extends, functions, signals, @export vars. • validate(path="", content="") Validate a GDScript file or source string and return compiler diagnostics. • delete(path) Delete a script file and its .uid sidecar from the project.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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. • 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. • environment_setup_3d(preset="daylight", parent_path="", create_sun=True, volumetric_fog=False, glow=False) Scaffold complete 3D environment and lighting. Presets: daylight | sunset | dark_dungeon | neon_night | clear. Auto-creates WorldEnvironment and DirectionalLight3D with matching sky, lighting, shadows, and tone mapping in a single undoable step. • environment_setup_2d(preset="dungeon", parent_path="", add_torch_to="", torch_energy=1.2, torch_radius=2.0, shadows=True) Scaffold complete 2D atmospheric lighting environment. Presets: dungeon | midnight | sunset | spooky | foggy. Creates CanvasModulate ambient tint, and optionally attaches a PointLight2D radial torch with falloff texture and shadows to the target character/object. • 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", scene_file="") Generate a StaticBody3D or Area3D 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: box | sphere | capsule | cylinder (or the class name); a sphere/capsule/cylinder under a non-uniformly scaled parent is refused. body_type: static | area. 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}], 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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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:

  • get_class(class_name, sections=None, include_inherited=False, include_inheritors=False, offset=0, limit=100) Return selected class-reference sections without creating a scene instance. sections may be a comma-separated string or list containing properties, methods, signals, enums, constants, inheritors. Defaults to ["properties"] only — a bare get_class answers "what properties does X have" without the multi-thousand-token full dump. Pass the sections you want by name, or "all" for the full set (properties, methods, signals, enums, constants). "all" does NOT include the heavier "inheritors" section — request that by name. For pagination, request one section at a time so offset/limit apply only to the list you are paging.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

filesystem_manageA

Project filesystem access via the Godot editor's EditorFileSystem.

Ops: • read_text(path) Read a text file at a res:// path. Returns content, size, line_count. • write_text(path, content="") Create or overwrite a text file. Updates the editor filesystem entry for that one file (single-file update, not a full scan). Newly-created files include data.cleanup.rm for transient smoke tests; overwrite omits the field. • reimport(paths) Force-reimport the listed files via EditorFileSystem.update_file. paths is a list of res:// paths. Intended for imported assets such as textures, models, and audio. Paths that are not imported resources (.gd scripts, .tscn, hand-written .tres, or an asset the editor has not imported yet) report under skipped_non_imported rather than reimported: their filesystem entry is refreshed, but no import runs, so a success there is not evidence that a script parsed or that diagnostics were produced. Use script_patch/script_create to save a script and receive fresh diagnostics, or scan for an asset awaiting its first import. Returns reimported, skipped_non_imported, not_found and their counts. • list(path="res://", recursive=False, max_depth=1) Browse the project's res:// tree (files, sizes, UIDs, and directories). • delete(path) Delete a file or directory from the project along with its .uid and .import sidecars. • move(from_path, to_path) Move or rename a file in the project, keeping sidecars consistent. • scan() Force a full EditorFileSystem.scan() and wait for it to settle. This is the headless equivalent of the editor regaining window focus: write_text/script_create register single files but do NOT rebuild the global class_name table, so a freshly-created class_name MyThing extends Resource is invisible to resource_manage/type references until a scan runs. Call this once after adding class_name scripts when the editor isn't focused. Single-flight (awaits any in-progress scan rather than stacking another). Returns scan_completed and global_classes_registered_delta. • search(name="", type="", path="", offset=0, limit=100) Find files by name, resource type, or path substring. At least one filter must be set. Paginated. • download_and_import(url, dest="", path="", extract=False, filter="", reimport=True) Download an asset or archive, optionally unpack, configure filter ("nearest" for pixel art), and trigger Godot reimport and scan. • download_asset(url, path="", dest="", extract=False, filter="", reimport=True) Download an asset or zip archive from the internet directly into the Godot project (res:// path). If extract=True or archive is zip, extracts into target directory. Automatically triggers editor reimport and scan. Returns: {url, path, size_bytes, is_archive, extracted_files, filter_applied} • search_assets(query="", category="all", limit=20) Search curated free/CC0 game assets (tilesets, audio, textures, UI, 3D models). Categories: "all", "tileset", "audio", "texture", "ui". Returns matching assets with direct download URLs ready for download_asset.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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. client is one of the ids returned by status(). • remove(client) Remove this server's entry from the named client's config.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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 include_editor=True to surface them. The response carries editor_connection_count so an agent can tell how many were hidden. • connect(path, signal, target, method) Connect a signal from path to a method on the target node. Undoable. • disconnect(path, signal, target, method) Remove an existing connection. Undoable.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

autoload_manageA

Autoload (global singleton) management. Autoloads are scripts or scenes loaded automatically at project start, accessible globally by name when singleton=True. Persisted to project.godot.

Ops: • list() List autoloads with name, path, and singleton flag. • add(name, path, singleton=True) Register an autoload (script or PackedScene) by res:// path. • remove(name) Unregister an autoload by name. The underlying file is not deleted. • scaffold_game_manager(name="GameManager", script_path="res://scripts/game_manager.gd", max_lives=3) Scaffold and register a production-ready GameManager singleton with score, lives, level tracking, typed signals, and scene transition methods.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

input_map_manageA

InputMap actions and bindings (keyboard, mouse, gamepad). Persisted to project.godot.

Resource form: godot://input_map — prefer for active-session reads.

Ops: • list(include_builtin=False) List input actions and their bound events. By default only user-authored actions (those persisted in project.godot under input/<name>) are returned; pass include_builtin=True to also surface Godot's ui_* and editor-runtime actions (spatial_editor/*, etc.). The is_builtin field on each entry is true for any action not authored by the user. • add_action(action, deadzone=0.5) Create a new empty input action. deadzone must be in [0.0, 1.0] — Godot uses it as the analog-stick dead-zone threshold; values outside this range are rejected with VALUE_OUT_OF_RANGE. Typical values are 0.2-0.5; leave the default 0.5 unless you have a reason. Not a key-repeat delay. • ensure_action(action, deadzone=0.5) Idempotently create or persist an input action. If the action exists in live InputMap or in project.godot, the existing state is preserved. • remove_action(action) Remove an action and all its event bindings. Also removes actions persisted in project.godot but not loaded in the live InputMap (loaded_in_input_map: false in list), e.g. actions created by a previous editor session. • bind_event(action, event_type, keycode="", ctrl=False, alt=False, shift=False, meta=False, button=None, axis=None, axis_value=1.0) Bind a key/mouse/gamepad event to an action. The action must already exist (call add_action first). event_type is "key" | "mouse_button" | "joy_button" | "joy_axis". - key: keycode is a Godot keycode name string like "A", "Space", "Enter", "Escape", "F1", "Left" — not an integer and not KEY_*. Modifier booleans ctrl / alt / shift / meta optional. - mouse_button: button is an int — 1=left, 2=right, 3=middle, 4=wheel up, 5=wheel down. - joy_button: button is the JoyButton index (e.g. 0=A/Cross, 1=B/Circle). - joy_axis: axis is the JoyAxis index and axis_value is the direction/value, usually -1.0 or 1.0. • ensure_binding(action, event_type, ...) Idempotently ensure the action exists and has the requested binding. • scaffold_preset(preset="wasd_platformer") Scaffold a standard input mapping preset. Presets: 'wasd_platformer' (A/D/Space/W/Arrows), 'wasd_topdown' (WASD/Arrows/E/Space), 'first_person' (WASD/Space/Shift/E), 'driving' (W/S/A/D/Arrows/Space).

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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:

  • get_scene_tree(depth=10, root_path="") Inspect the running scene tree. root_path accepts an absolute runtime path or a scene-relative path rooted at the current scene.

  • get_node_info(path, include_properties=True) Inspect one running node's metadata and optional property snapshot.

  • get_ui_elements(root_path="", include_hidden=False, include_disabled=True, max_depth=10) Inspect visible runtime Control nodes for UI testing. Includes path, type, text where present, disabled state, and rect metadata.

  • suspend() Suspend the running game through Godot's native debugger path.

  • resume() Resume a suspended game. Idempotent when it is already running.

  • next_frame() Advance exactly one process tick while suspended. The response reports verification and any Embedded Game View focus handoff. Runtime-control mutations also report path="embed_signal" or "direct_session"; the direct fallback works without embedding but cannot synchronize the Game View suspend button's visual pressed state.

  • debug_status() Probe suspend state and the game-helper process tick counter through the debugger capture, including while SceneTree processing is suspended.

  • input_key(key, pressed=True, echo=False) Send a key press/release to the running game.

  • input_mouse(event, position=None, button="left", pressed=True) Send a mouse motion or button event. event: "motion" | "button". position is a {x, y} object or [x, y] array; omit it to use the game's current cursor position. A present but malformed position is rejected rather than silently falling back to the cursor.

  • input_gamepad(device=0, control="button", index=0, pressed=True, value=0.0) Send a joypad button or axis event. control: "button" | "axis".

  • input_action(action, pressed=True, strength=1.0) Set a project action's pressed state directly in the running game.

  • input_sequence(steps, settle_frames=0) Apply a frame-timed action timeline in one call — the frame-accurate, multi-step form of input_action. Each step is {at_frame, action, pressed=True, strength=1.0}; the game applies each step's action on its scheduled frame, awaits settle_frames more, then replies once. Use this instead of separate input_action calls whenever timing matters (jump arcs, combos, walk-into-trigger): per-call network latency makes hitting a target frame impossible otherwise. Steps must be ordered by non-decreasing at_frame; frames (not ms) are the timing basis. Action-based input is focus-independent, so it works on a backgrounded game window. Cannot run inside batch_execute.

  • simulate_input(action="", key="", duration=0.5, press=True, strength=1.0) Simulate hardware or action input with duration and automatic clean release. For actions, executes a timed sequence and releases after duration seconds.

  • input_state(actions=None) Read current action pressed states. Empty actions = all project actions.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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 duration_ms).

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 edited_scene (the scene currently open in the editor). Many suites assume the project's main scene is open; if it is not and there are failures, the response also carries a scene_warning — open the main scene (scene_open) and re-run before treating those failures as real.

test_manageA

Test result inspection (re-fetches the most recent test_run payload).

Resource form: godot://test/results — prefer for active-session reads.

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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

batch_executeA

Execute a list of editor sub-commands in order, stopping on first error.

Each item must be {"command": "<plugin_command>", "params": {...}}. Use the underlying plugin command names (e.g. create_node, set_property, delete_node, attach_script), not the MCP tool names. Commands run sequentially; execution stops at the first error. When undo is True (default), any successful sub-commands are rolled back via the scene's undo history if a later sub-command fails, producing atomic-on-failure semantics.

With preview=True, only create_node/delete_node commands are accepted; returns the scene node list before and after, then undoes all changes. To keep the proposed change, call again with preview=False.

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. batch_execute itself is not allowed as a sub-command.

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. • 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. properties is direct node properties only. Theme constants like container spacing live under theme_override_constants/<name> — e.g. {"theme_override_constants/separation": 8} on a VBoxContainer, not {"separation": 8} (which errors). theme and anchor_preset require a Control / Window — for a HUD, nest a Control under a CanvasLayer and apply them to the Control child, not the layer itself. • draw_recipe(path, ops, clear_existing=True) Attach a declarative list of vector _draw() ops to a Control — radar sweeps, gauges, corner brackets, crosshairs, waveforms. Op kinds: line | rect | arc | circle | polyline | polygon | string. • scaffold_screen(kind="main_menu", parent_path="", name="", title="", layer=10, buttons=None) Instantly scaffold a complete, production-ready UI screen hierarchy under a CanvasLayer with responsive anchors, panels, title headers, and buttons. Supported kinds: main_menu | pause_menu | hud | game_over | dialog_box.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

theme_manageA

Theme authoring (Godot's stylesheet-like resource for Controls). Cascades down a Control subtree when assigned via theme_apply.

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. • apply(node_path, theme_path="") Assign the theme to a Control (cascades to descendants). Empty theme_path clears. • apply_preset(preset="dark_modern", theme_path="", node_path="", set_as_default=False, overwrite=True) Apply a full cohesive Theme preset (Button states, Panels, LineEdits, Sliders, ProgressBars, Labels) in one call. Presets: 'cyberpunk_neon', 'dark_modern', 'retro_pixel', 'fantasy_parchment', 'clean_light'.

All ops accept session_id on the wrapper to target a specific editor.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

animation_createA

Create a new Animation clip inside an AnimationPlayer's default library.

After creating the clip, add tracks via animation_manage ops add_property_track / add_method_track / create_simple. Track node paths are stored relative to the AnimationPlayer's root_node (default: its parent), not to the scene root — see animation_manage preset ops for a forgiving target_path that accepts either form. If player_path doesn't resolve, an AnimationPlayer is auto-created at that path (parent must exist).

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 ..-prefixed track path via root_node.get_path_to(target), the same shape the relative form already accepts.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

material_manageA

Material authoring (StandardMaterial3D, ORMMaterial3D, ShaderMaterial, CanvasItemMaterial). Albedo, metallic/roughness, emission, transparency, shader uniforms.

Resource form: godot://materials — prefer for active-session reads.

Ops: • create(path, type="standard", shader_path="", overwrite=False) Create + save a material .tres at a res:// path. type: "standard" | "orm" | "canvas_item" | "shader". For "shader", shader_path points to the .gdshader. • set_param(path, param, value) Set a built-in property on a .tres material. Enum-valued params accept names ("alpha" -> TRANSPARENCY_ALPHA). Color/Vector dicts. Texture properties accept res:// paths. • set_shader_param(path, param, value) Set a shader uniform on a ShaderMaterial. • get(path) Inspect a material (type, params, uniforms, current values). • list(root="res://", type="") List materials under root, optional type filter. • assign(node_path, resource_path="", slot="override", create_if_missing=False, type="standard") Assign a material to a node slot. Slots: "override" | "surface_" | "canvas" | "process". When create_if_missing=True and no resource_path, makes an inline material of type. • apply_to_node(node_path, type="standard", params=None, slot="override", save_to="", overwrite=False) High-level: build + set params + assign in one undo. save_to optionally persists to disk; errors if the file already exists unless overwrite=True. • apply_preset(preset, path="", node_path="", overrides=None) Curated looks: metal, glass, emissive, unlit, matte, ceramic. path saves to disk; node_path assigns to a node; overrides merge.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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. • scaffold_follow_2d(target_path="", parent_path="", name="FollowCamera2D", smoothing_speed=5.0, zoom=None, enable_shake=True, make_current=True, limits=None) Scaffold complete follow Camera2D with position smoothing and trauma-based screen shake (adds add_trauma() method to camera). • 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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

audio_manageB

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). • generate_procedural_sfx(preset="jump", dest_path="", duration=0.0, sample_rate=22050) Synthesize a chiptune PCM .wav sound effect directly into res://. Presets: jump | coin | laser | hit | explosion | powerup | step | click. • scaffold_buses(volumes=None) Configure standard Master, Music, SFX, and UI audio buses in AudioServer. • scaffold_music_player(parent_path="", name="MusicPlayer", stream_path="", autoplay=True, volume_db=0.0, bus="Music", loop=True) Scaffold a dedicated background music player (AudioStreamPlayer) routed to the Music bus with autoplay and loop configuration. • scaffold_sound_manager(name="SoundManager", script_path="res://scripts/sound_manager.gd", pool_size=16, bus="SFX", register_autoload=True) Scaffold a multi-channel sound effect manager singleton with AudioStreamPlayer pooling, pitch variation, and 2D spatial audio helper. • bus_list() List all AudioServer buses with their properties and effects. • bus_add(name, send="Master", volume_db=0.0, at_pos=-1) Add a new audio bus and route it to a parent bus. • bus_remove(bus) Remove an audio bus by name or index. • bus_set_properties(bus, volume_db?, send?, solo?, mute?, bypass_effects?) Update properties on an existing bus. • bus_add_effect(bus, effect_type, at_position=-1, enabled=True, params={}) Add an audio effect to a bus. Types: Reverb, Delay, Chorus, Phaser, Distortion, EQ, Compressor, Limiter, LowPassFilter, HighPassFilter, BandPassFilter, NotchFilter, Amplify. • bus_save_layout(path="res://default_bus_layout.tres") Save the current AudioServer bus layout to a resource file.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

character_manageA

2D and 3D Character Controller Scaffolding.

Ops: • scaffold_2d(parent_path="", name="Player", genre="platformer", speed=200.0, jump_velocity=-350.0, acceleration=1200.0, friction=1000.0, coyote_time=0.12, jump_buffering=0.1, attach_camera=True, script_path="") Instantly scaffold a complete 2D player character (CharacterBody2D) with CollisionShape2D, placeholder graphics, optional follow camera with screen shake, and production-ready controller script with coyote time, jump buffering, floor snapping, and move_and_slide(). Genres: 'platformer' (gravity, jump) | 'topdown' (4/8-way movement).

• scaffold_3d(parent_path="", name="Player3D", genre="first_person", speed=5.0, sprint_speed=8.0, jump_velocity=4.5, mouse_sensitivity=0.002, script_path="") Instantly scaffold a complete 3D player character (CharacterBody3D) with CapsuleShape3D, CapsuleMesh, and Camera3D with mouse-look capture, sprinting, jumping, gravity, and move_and_slide(). Genres: 'first_person' (head-mounted camera) | 'third_person' (SpringArm3D).

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

dialogue_manageA

Dialogue and Narrative System Management.

Ops: • scaffold_system(name="DialogueManager", script_path="res://scripts/dialogue_manager.gd", scene_path="res://scenes/dialogue_box.tscn", register_autoload=True, typewriter_speed=0.03) Scaffold a complete dialogue manager singleton and UI box with typewriter animation, BBCode rich text, continue indicator, branching choice buttons, and event signals (dialogue_started, line_displayed, choice_selected, dialogue_ended).

• create_dialogue(path="res://dialogues/dialogue.json", dialogue_id="intro_conversation", nodes={}, overwrite=False) Create a structured branching dialogue graph with speakers, text lines, choice options, and next-node pointers.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

save_manageA

Save Game and Persistence Management.

Ops: • scaffold_save_system(name="SaveManager", script_path="res://scripts/save_manager.gd", save_directory="user://saves/", register_autoload=True, enable_encryption=False, encryption_password="") Scaffold an atomic, corruption-resistant SaveManager singleton that automatically orchestrates saving and loading across all nodes in the 'saveable' group, with optional password encryption and slot management.

• save_slot(slot_name="slot_1", data={}, directory="user://saves/") Save arbitrary game state data into a designated slot atomically.

• load_slot(slot_name="slot_1", directory="user://saves/") Load state data from a designated slot.

• list_slots(directory="user://saves/") List all saved game slots, timestamps, and metadata.

• delete_slot(slot_name="slot_1", directory="user://saves/") Delete a save game slot.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

fsm_manageB

Finite State Machine (FSM) Management.

Ops: • scaffold_fsm(target_node_path="", name="StateMachine", script_dir="res://scripts/fsm/", preset="enemy_ai", custom_states=[], initial_state="") Scaffold a modular node-based finite state machine architecture with base State class and StateMachine controller. Presets: - 'enemy_ai': Idle, Patrol, Chase, Attack, Hurt, Dead states. - 'character': Idle, Move, Jump, Fall states. - 'custom': Generates scripts for names listed in custom_states. If target_node_path is specified, attaches the StateMachine and child State nodes directly to the target node in the active scene.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

tilemap_manageA

TileMap / TileMapLayer authoring (set tiles, fill rects, clear, read cells, generate layouts).

CRITICAL DIRECTIVE: ALWAYS place tiles directly down into the TileMap or TileMapLayer node in the active editor scene using this tool. NEVER generate maps by writing procedural GDScript code in _ready() unless the user explicitly requested runtime procedural generation. Direct tile placement enables visual editing, native Godot physics, and instant editor inspection.

All operations target TileMapLayer or TileMap 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}

• tilemap_place_tile(path, source_id, atlas_col, atlas_row, map_x, map_y, rotation_degrees=0, flip_h=false, flip_v=false, alternative_tile=-1) Place a tile with exact rotation (0, 90, 180, 270) and flip flags. Returns: {map_x, map_y, source_id, atlas_col, atlas_row, alternative_tile, rotation_degrees, flip_h, flip_v}

• tilemap_rotate_cell(path, map_x, map_y, degrees=90) Rotate tile cell at (map_x, map_y) clockwise by degrees (90, 180, 270). Returns: {map_x, map_y, degrees, old_alternative, new_alternative}

• tilemap_flip_cell(path, map_x, map_y, flip_h=false, flip_v=false) Flip an existing tile cell at (map_x, map_y) horizontally and/or vertically. Returns: {map_x, map_y, flip_h_applied, flip_v_applied, new_alternative}

• tilemap_erase_cell(path, map_x, map_y) Erase a single tile cell at (map_x, map_y). Returns: {map_x, map_y, erased}

• tilemap_get_cell(path, map_x, map_y) Get detailed information of a tile cell. Returns: {has_tile, map_x, map_y, source_id, atlas_col, atlas_row, alternative_tile, flip_h, flip_v, transpose}

• tilemap_generate_layout(path, genre="platformer", rect_w=32, rect_h=18, rect_x=0, rect_y=0, source_id=0, floor_col=0, floor_row=0, wall_col=1, wall_row=0, accent_col=2, accent_row=0, layer=0) Generate a complete layout placed directly into the editor. Supported genres: 'platformer', 'topdown', 'rpg', 'dungeon', 'arena'. Returns: {genre, cells_placed, rect, source_id, layer, undoable}

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

tileset_manageB

TileSet management — atlas inspection tools.

Ops: • tileset_diagnose(tileset_path, check_collision=False, physics_layer=0, max_findings=80) Read-only TileSet doctor: missing textures, atlas sizing, tiles outside textures, tile pixel-size inconsistencies, and optional missing collision. Collision checks are opt-in because decorative tiles need no shapes. Rotated tile variants are not errors by themselves.

• 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_path: res:// path to the .tres TileSet resource (required)
    source_id:    raw TileSet source id of the TileSetAtlasSource to query (required, ≥ 0)

    Returns:
      {"tiles": [{"col": int, "row": int}, ...], "count": int}

    Error codes (passed through from GDScript handler):
      MISSING_REQUIRED_PARAM  — tileset_path empty or source_id absent
      RESOURCE_NOT_FOUND      — tileset_path does not exist on disk
      WRONG_TYPE              — not a TileSet, or source is not a TileSetAtlasSource
      VALUE_OUT_OF_RANGE      — source_id does not exist in this TileSet

• 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.

    tileset_path: res:// path to the .tres TileSet resource (required)
    source_id:    raw TileSet source id of the TileSetAtlasSource to query (required, ≥ 0)
    max_size:     optional int; if > 0, scale the image so its longest
                  edge is at most max_size pixels (default 0 = full res)

    Returns:
      {"image_base64": str, "width": int, "height": int,
       "original_width": int, "original_height": int, "format": "png"}

    Error codes (passed through from GDScript handler):
      MISSING_REQUIRED_PARAM  — tileset_path empty or source_id absent
      RESOURCE_NOT_FOUND      — tileset_path does not exist on disk
      WRONG_TYPE              — not a TileSet, source not a TileSetAtlasSource,
                                or source has no texture assigned
      VALUE_OUT_OF_RANGE      — source_id does not exist in this TileSet

• 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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

navigation_manageA

2D and 3D Navigation and Pathfinding.

Ops: • setup_region_2d(parent_path="", name="NavigationRegion2D", polygon=None, cell_size=1.0, agent_radius=10.0, parsed_geometry_type="mesh_instances_and_colliders") Setup NavigationRegion2D with NavigationPolygon, boundary vertices, and geometry parsing configuration in one undo action. • attach_agent_2d(node_path, agent_name="NavigationAgent2D", radius=16.0, max_speed=150.0, path_desired_distance=20.0, target_desired_distance=20.0, avoidance_enabled=True) Attach and configure NavigationAgent2D under character/enemy node. • bake_2d(region_path, on_thread=False) Trigger in-editor baking of 2D navigation polygon. • setup_region_3d(parent_path="", name="NavigationRegion3D", cell_size=0.25, cell_height=0.25, agent_radius=0.5, agent_height=1.8) Setup NavigationRegion3D with NavigationMesh in one undo action. • attach_agent_3d(node_path, agent_name="NavigationAgent3D", radius=0.5, height=1.8, max_speed=5.0, path_desired_distance=1.0, target_desired_distance=1.0, avoidance_enabled=True) Attach and configure NavigationAgent3D under character/enemy node. • bake_3d(region_path, on_thread=False) Trigger in-editor baking of 3D navigation mesh.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

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: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

omni_manageA

Universal Godot engine control, reflection, script evaluation, and editor UI automation.

Ops:

  • eval(code, mode="auto", inputs={}) Execute arbitrary GDScript in the Editor process with full permissions.

  • call(target, method, args=[]) Call ANY method on ANY Godot Object (Node, Resource, Singleton, RefCounted).

  • get(target, property) Read any property on any Godot Object.

  • set(target, property, value) Write any property on any Godot Object.

  • inspect(target) Inspect complete methods, properties, and signals of any Object.

  • instantiate(class_name="", script_path="") Instantiate any ClassDB class or GDScript.

  • ui_tree(max_depth=8) Extract the full hierarchical semantic UI Control tree of the Editor.

  • ui_click(text="", path="") Click any button, tab, checkbox, or control in the Editor.

  • ui_type(text, target="") Type text into any LineEdit or TextEdit in the Editor.

  • instantiate_prefab(scene_path, parent_path="", node_name="", position=None) Instantiate any .tscn prefab directly into the edited scene.

  • shader_create(shader_path, shader_type="canvas_item", code="", target_node_path="") Create a new GDShader and optionally assign it as a ShaderMaterial to a node.

  • mesh_primitive(primitive_type="box", node_name="", parent_path="", size=None, albedo_color=None, position=None) Create a 3D primitive mesh (box, sphere, cylinder, plane, capsule, prism).

  • collision_shape(parent_path, shape_type="box", is_2d=True, size=None, radius=16.0, height=32.0, node_name="CollisionShape") Create a 2D or 3D CollisionShape and attach it to a physics body.

  • preset_motion(preset="pulse", target_node_path="", animation_player_path="", anim_name="", duration=1.0, loop=True) Inject procedural motion presets (pulse, fade_in, fade_out, slide_in).

  • ping() Quick diagnostic ping returning engine version, process frames, and memory metrics.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

shader_manageA

Shader System and Visual Effect Management.

Ops:

  • create(path="res://shaders/custom.gdshader", shader_type="canvas_item", code="", overwrite=False) Create a new .gdshader resource with boilerplate for canvas_item, spatial, particles, sky, or fog.

  • apply_preset(preset="outline_2d", target_node_path="", shader_path="", params={}) Compile and apply production shader presets: - outline_2d: Dynamic sprite border outline (outline_color, outline_width). - hit_flash: Combat damage flash effect (flash_color, flash_modifier). - dissolve_2d: Burning noise dissolve effect (dissolve_amount, burn_color, burn_size). - water_2d: Wave distortion and reflection (water_tint, wave_speed, wave_freq, wave_amp). - foliage_wind: Vertex displacement wind sway (wind_speed, wind_strength). - crt_scanline: Retro CRT monitor scanlines, curvature, and vignette. - hologram_glitch: Sci-fi holographic glitch and scanlines (holo_color, scanline_density). Optionally assign directly to target node's material.

  • set_param(param="outline_width", value=2.0, target_node_path="", material_path="") Set a uniform parameter on a ShaderMaterial by target node or material path.

  • get_params(target_node_path="", material_path="") Inspect shader code and parameters from a target node or material path.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

physics_manageA

Physics Queries, Raycasting, and Sensor Scaffolding.

Ops:

  • raycast_2d(from_pos=[0, 0], to_pos=[0, 100], collision_mask=4294967295, collide_with_bodies=True, collide_with_areas=False, hit_from_inside=False) Perform a 2D raycast query directly through the active World2D physics space, returning collision point, normal, collider path, and shape.

  • raycast_3d(from_pos=[0, 10, 0], to_pos=[0, -10, 0], collision_mask=4294967295, collide_with_bodies=True, collide_with_areas=False, hit_from_inside=False) Perform a 3D raycast query directly through the active World3D physics space, returning collision point, normal, collider path, and shape.

  • query_point_2d(point=[0, 0], collision_mask=4294967295, max_results=32, collide_with_bodies=True, collide_with_areas=False) Query intersecting physics bodies and areas overlapping a 2D world coordinate.

  • scaffold_sensor(parent_path="", target_position=[0, 50], is_2d=True, sensor_name="GroundSensor", collision_mask=1, enabled=True) Instantiate and attach a RayCast2D or RayCast3D sensor to a character or node.

  • query_point_3d(point=[0, 0, 0], collision_mask=4294967295, max_results=32, collide_with_bodies=True, collide_with_areas=False) Query intersecting physics bodies and areas overlapping a 3D world coordinate.

  • shapecast_scaffold(parent_path="", shape_type="sphere", radius=1.0, is_2d=False, sensor_name="ShapeCast", collision_mask=1) Create a ShapeCast2D or ShapeCast3D node with the specified collision shape.

  • set_layer_names(layer_type="2d_physics", layers={"1": "Environment", "2": "Player"}) Set project-wide layer names (layer_type: 2d_physics | 3d_physics | 2d_render | 3d_render).

  • get_layer_names(layer_type="all") Get configured layer names (layer_type: 2d_physics | 3d_physics | 2d_render | 3d_render | all).

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

localization_manageA

Godot TranslationServer Localization and CSV Translation Workflows.

Ops:

  • scaffold_csv(path="res://localization.csv", languages=["en", "es", "fr", "de", "ja", "zh"]) Generate a starter localization CSV file and register it in ProjectSettings.

  • add_entry(path="res://localization.csv", key="ui_start", translations={"en": "Start", "es": "Iniciar"}) Add or update a translation string row in the project's localization CSV.

  • get_locales() Query loaded locales, active locale, and translation settings from TranslationServer.

  • set_locale(locale="es") Switch the active test locale in TranslationServer.

  • translate(message="ui_start", context="") Test and evaluate translation string resolution via TranslationServer.

  • extract_strings(root_dir="res://") Scan project GDScript and scene files for tr() message lookup occurrences.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

geometry_manageA

Constructive 2D Solid Geometry and Procedural 3D Mesh Generation.

Ops:

  • polygon_boolean(operation="merge", poly_a=[...], poly_b=[...]) Perform 2D constructive solid polygon operations (merge, clip, intersect, exclude).

  • polygon_offset(polygon=[...], delta=5.0, join_type="square") Deflate or inflate a 2D polygon via Geometry2D.offset_polygon.

  • triangulate(polygon=[...]) Triangulate a 2D polygon into index arrays via Geometry2D.triangulate_polygon.

  • convex_hull(points=[...]) Compute the 2D convex hull wrapping an arbitrary point set.

  • scaffold_polygon_2d(parent_path="", points=[...], polygon_name="CustomPolygon", is_collision=False, color=[1.0, 1.0, 1.0, 1.0]) Instantiate and attach a Polygon2D or CollisionPolygon2D to the active scene.

  • generate_mesh(mesh_type="cube", size=[2.0, 2.0, 2.0], dest_path="", parent_path="") Generate a procedural 3D mesh via SurfaceTool (cube, plane, pyramid) and attach to scene or save.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

viewport_manageA

Godot Viewport and SubViewport Lifecycle, Splitscreen, and Render Texture Routing.

Ops:

  • create_subviewport(parent_path="", name="SubViewport", size=[512, 512], render_target_update_mode=3, transparent_bg=false, own_world_3d=false, as_container=false) Create a SubViewport or SubViewportContainer in the active scene.

  • scaffold_splitscreen(layout="2p_horizontal", is_3d=false, parent_path="") Scaffold a multi-player splitscreen layout (2p_horizontal, 2p_vertical, 4p_quad) with SubViewports, SubViewportContainers, and independent cameras.

  • wire_render_texture(viewport_path, target_node_path, target_property="") Route a SubViewport's ViewportTexture into a Sprite2D, TextureRect, or MeshInstance3D material albedo.

  • get_viewport_tree() Inspect all Viewports in the active scene, their sizes, update modes, and active cameras.

  • set_properties(viewport_path, size=..., transparent_bg=..., render_target_update_mode=..., own_world_3d=..., msaa_2d=..., msaa_3d=..., screen_space_aa=..., use_hdr_2d=...) Configure rendering fidelity and options for an existing Viewport.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

multiplayer_manageA

High-Level Godot Multiplayer Networking Scaffolding and Topology Inspection.

Ops:

  • scaffold_network_manager(save_path="res://scripts/network_manager.gd", default_port=8910, max_clients=32, as_autoload=false, autoload_name="NetworkManager") Generate an ENetMultiplayerPeer network manager script with host/join/disconnect methods and peer signal handling.

  • scaffold_spawner(parent_path="", spawner_name="MultiplayerSpawner", spawn_path="..", spawnable_scenes=[...], auto_spawn=true) Attach and configure a MultiplayerSpawner node with spawnable scene paths.

  • scaffold_synchronizer(parent_path="", synchronizer_name="MultiplayerSynchronizer", root_path="..", properties=[":position", ":rotation"]) Attach and configure a MultiplayerSynchronizer node with SceneReplicationConfig.

  • get_network_status() Query active multiplayer peer state, server role, unique ID, and connected peers.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

tween_manageA

Procedural Motion, Game-Feel Tween Recipes, and Tween Code Generation.

Ops:

  • create(node_path, property, target_value, duration=0.5, trans_type="linear", ease_type="in_out", delay=0.0, relative=false) Create and run a Tween interpolating a property on a node.

  • preset_animation(node_path, preset="punch_scale", duration=0.3, ...) Execute instant procedural animation presets: - punch_scale: impact scale pop and overshoot (punch_factor) - shake_2d: screen/node trauma shake with decay (amplitude) - float_bob: looping levitation / idle hover (bob_distance, loops) - fade: alpha fade (target_alpha) - flash_color: flash modulate highlight (flash_color) - progress_fill: smooth bar / gauge value fill (target_value) - bounce_in: drop into place with bounce ease (drop_offset) - spin: rotation spin (revolutions)

  • generate_code(target_var="self", property="position", target_value="Vector2(100, 100)", duration=0.5, trans_type="linear", ease_type="in_out", delay=0.0, relative=false) Generate production GDScript Tween code.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

profiler_manageA

Engine Diagnostics, Performance Monitors, and Memory Analysis.

Ops:

  • get_monitors() Read active Godot Performance monitors (FPS, process time, physics time, draw calls, object counts, memory, and audio latency).

  • get_memory_info() Read detailed static, peak, message buffer, VRAM, and texture memory breakdown.

  • get_render_info() Read render pipeline frame statistics (draw calls, primitive count, render objects, VRAM).

  • get_physics_info() Read 2D and 3D physics server stats (active bodies, collision pairs, islands).

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

display_manageA

DisplayServer Configuration, Window Controls, and SubWindow Scaffolding.

Ops:

  • set_mode(mode="windowed", borderless=None, always_on_top=None) Set window mode (windowed, fullscreen, exclusive_fullscreen, maximized, minimized).

  • get_display_info() Read active screen dimensions, window geometry, refresh rate, VSync, and mouse mode.

  • set_window_rect(size=None, position=None) Resize and reposition the active window.

  • set_vsync(vsync_mode="enabled") Configure VSync (disabled, enabled, adaptive, mailbox).

  • set_mouse_mode(mouse_mode="visible") Set mouse capture mode (visible, hidden, captured, confined, confined_hidden).

  • scaffold_subwindow(parent_path="", window_type="Window", name="SubWindow", title="Window", size=[400, 300], transient=true, exclusive=false) Scaffold a Window, AcceptDialog, or ConfirmationDialog in the scene.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

loader_manageA

Asynchronous Threaded Resource Loading, Progress Polling, and Loading Screen Scaffolding.

Ops:

  • start_load(path, type_hint="", use_sub_threads=false, cache_mode=1) Begin background asynchronous loading of a scene or resource.

  • get_status(path) Poll progress percentage (0.0 - 1.0) and status (in_progress, loaded, failed).

  • get_resource(path) Retrieve confirmation and metadata for a loaded resource.

  • scaffold_loading_screen(save_path="res://scripts/loading_screen.gd") Scaffold a complete asynchronous loading screen script.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

compute_manageA

GPU Compute Shaders, RenderingDevice Uniform Buffers, and GPU Pipeline Execution.

Ops:

  • create_shader(shader_path="res://shaders/compute_example.glsl", code="") Create a GLSL compute shader template file.

  • get_device_info() Inspect RenderingDevice capabilities, workgroup limits, and driver version.

  • run_compute(shader_path, input_buffer=[...], x_groups=1, y_groups=1, z_groups=1) Compile and dispatch a compute pipeline on the GPU and read back output data.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

export_manageA

Project Export Automation, Presets Inspection, and Headless Game Builds.

Ops:

  • list_presets() List all configured platform export targets in export_presets.cfg.

  • get_preset_info(preset_name) Inspect detailed build settings and options for a specific preset.

  • run_export(preset_name, output_path="", debug=false) Execute a headless project export via Godot CLI.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

xr_manageA

AR/VR OpenXR Rigging, Controller Setup, and XRServer Tracking Status.

Ops:

  • scaffold_xr_rig(parent_path="", rig_name="XROrigin3D") Scaffold complete OpenXR player hierarchy (origin, camera, left/right controllers).

  • get_xr_status() Inspect XRServer active interfaces, tracking status, and OpenXR availability.

  • generate_xr_startup_script(save_path="res://scripts/xr_initializer.gd") Generate an OpenXR initialization bootstrap script.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

undo_redo_manageA

Editor Undo/Redo History Introspection and Transaction Execution.

Ops:

  • get_history() Query active action name, undo stack depth, and history IDs.

  • undo() Execute an undo action in the active editor.

  • redo() Execute a redo action in the active editor.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

path_manageB

Path2D/Path3D Curves, Splines, and Patrol Route Automation.

Ops:

  • create_curve_2d(points=None, closed=false, save_path="") Create a Curve2D resource with Bezier control points.

  • create_curve_3d(points=None, closed=false, save_path="") Create a Curve3D resource with Bezier control points.

  • scaffold_path(parent_path="", type="Path3D", name="Path", with_follow=true, loop=true) Scaffold a Path2D or Path3D node with an optional PathFollow child.

  • sample_baked_points(path_node_path, interval=1.0) Sample baked positions along a Path2D or Path3D at fixed intervals.

  • generate_spline(shape="circle", is_3d=true, radius=5.0, points_count=16, save_path="") Procedurally generate standard spline curves (circle, sine, spiral, rect, s_curve).

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

mesh_manageC

Procedural 3D Mesh Synthesis, MeshDataTool Deformation, and Primitive Generation.

Ops:

  • generate_surface_mesh(primitive_type="TRIANGLES", vertices=None, normals=None, uvs=None, colors=None, indices=None, generate_normals=false, generate_tangents=false, save_path="", attach_to="") Generate custom ArrayMesh geometry via SurfaceTool.

  • deform_mesh(mesh_path, mode="displace", axis="y", factor=1.0, save_path="") Inspect and deform an existing mesh via MeshDataTool.

  • create_primitive(primitive="BoxMesh", properties=None, save_path="", attach_to="") Create a configured PrimitiveMesh resource.

  • get_mesh_info(mesh_path="", node_path="") Read mesh class, surface count, and AABB dimensions.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

rendering_manageB

WorldEnvironment, Post-Processing Effects, CameraAttributes, and Lighting Presets.

Ops:

  • scaffold_world_environment(parent_path="", sky_mode="procedural", tonemap_mode="aces", name="WorldEnvironment") Scaffold a WorldEnvironment node with sky and tonemapping.

  • set_environment_effects(node_path="", glow_enabled=None, glow_intensity=None, ssr_enabled=None, ssao_enabled=None, ssil_enabled=None, sdfgi_enabled=None, volumetric_fog_enabled=None, volumetric_fog_density=None) Configure post-processing and volumetric lighting effects.

  • set_camera_attributes(camera_path, attributes_type="practical", auto_exposure_enabled=None, dof_blur_far_enabled=None, dof_blur_far_distance=None) Configure CameraAttributes on a Camera3D node.

  • apply_lighting_preset(preset="outdoor_sunny", node_path="") Apply a visual lighting preset to the environment.

  • get_environment_info(node_path="") Read active environment properties, background mode, and post-processing toggles.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

skeleton_manageA

Skeleton3D Rigging, Bone Transform Inspection, BoneAttachment3D Sockets, and Ragdolls.

Ops:

  • get_skeleton_info(skeleton_path="") Inspect bone hierarchy, rest transforms, and pose transforms.

  • set_bone_pose(skeleton_path, bone_name, position=None, rotation=None, scale=None) Set position, rotation, or scale for a specific bone.

  • scaffold_bone_attachment(skeleton_path, bone_name, name="BoneAttachment3D") Scaffold a BoneAttachment3D node attached to a designated bone.

  • scaffold_ragdoll(skeleton_path, collision_layer=1, collision_mask=1, total_mass=70.0) Generate PhysicalBone3D nodes for all bones in a Skeleton3D.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

crypto_manageA

Cryptographic Operations, File/String Checksums, Random Tokens, RSA, and X509 Certificates.

Ops:

  • hash_file(file_path, algorithm="sha256") Compute checksum digest of a project file (sha256, sha1, md5).

  • hash_string(content, algorithm="sha256") Compute checksum digest of a string (sha256, sha1, md5).

  • generate_random_bytes(size=32, format="hex") Generate cryptographically secure random bytes (hex or base64).

  • generate_rsa_key(key_size=2048, save_path="") Generate and optionally save an RSA private key.

  • generate_self_signed_cert(key_path="", cert_save_path="", common_name="localhost", issuer_name="GodotMCP") Generate a self-signed X509 certificate.

  • hmac_digest(key, message, algorithm="sha256") Compute HMAC authentication digest.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

plugin_manageB

EditorPlugin Discovery, Addon Enable/Disable, and Custom Plugin Scaffolding.

Ops:

  • list_plugins(addons_dir="res://addons") Scan res://addons and list all installed editor plugins and statuses.

  • set_plugin_enabled(plugin_name, enabled=true) Enable or disable an editor plugin in ProjectSettings.

  • scaffold_plugin(plugin_id="my_custom_addon", plugin_name="My Custom Addon", description="A custom Godot EditorPlugin", author="Developer", version="1.0.0", with_dock=true) Generate complete scaffolding for a new custom EditorPlugin.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

pck_manageA

PCK Virtual Package Creation, Dynamic Mounting, and Inspection.

Ops:

  • create_pck(pck_path, files=[], alignment=32) Pack a list of project resource files into a standalone .pck package.

  • load_pck(pck_path, replace_files=True) Dynamically mount a .pck package into the virtual filesystem.

  • inspect_pck(pck_path) Check existence and size in bytes of a .pck package.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

system_manageA

Operating System Information, Time APIs, Engine Time Scale, Clipboard, and Environment.

Ops:

  • get_system_info() Inspect OS name, processor count, device model, video adapter, and locale.

  • get_time() Query current Unix epoch, ISO 8601 string, timezone offset, and datetime dict.

  • set_time_scale(time_scale=1.0) Accelerate or slow down the game engine time scale.

  • get_clipboard() Retrieve text from the system clipboard.

  • set_clipboard(text="") Set text into the system clipboard.

  • get_env(var_name) Read a process environment variable.

  • set_env(var_name, value="") Set a process environment variable.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

light_manageA

2D and 3D Lighting, Shadow Tuning, Decal Projection, and Reflection/GI Probes.

Ops:

  • scaffold_light_3d(type="DirectionalLight3D", parent_path="", name="Light3D", color=None, energy=1.0, shadows=True, range=5.0, attenuation=1.0, spot_angle=45.0) Scaffold a DirectionalLight3D, OmniLight3D, or SpotLight3D node.

  • scaffold_light_2d(type="PointLight2D", parent_path="", name="Light2D", color=None, energy=1.0, shadows=False) Scaffold a PointLight2D or DirectionalLight2D node.

  • scaffold_decal(parent_path="", name="Decal", size=None, texture_albedo="") Scaffold a Decal node with projection volume and albedo texture.

  • scaffold_probe(type="ReflectionProbe", parent_path="", name="Probe", size=None) Scaffold a ReflectionProbe, LightmapGI, or VoxelGI node.

  • set_light_properties(light_path, color=None, energy=None, shadows=None, volumetric_fog_energy=None) Update lighting parameters on an existing 2D or 3D light node.

  • get_light_info(light_path) Inspect light energy, color, and shadow properties.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

http_manageA

In-Engine HTTP Requests, File Downloads, and HTTPRequest Scaffolding.

Ops:

  • scaffold_http_request(parent_path="", name="HTTPRequest", timeout=30.0) Scaffold an HTTPRequest node into the scene hierarchy.

  • send_request(url, method="GET", headers=[], body="", timeout=10.0) Execute an in-engine REST/HTTP request via Godot's networking stack.

  • download_file(url, target_path, timeout=30.0) Download a remote file into the project virtual filesystem (res:// or user://).

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

shader_global_manageB

Global Shader Parameters, Uniform Variables, and Project-Wide Shader Settings.

Ops:

  • list_globals() List all global shader parameters defined in RenderingServer.

  • set_global(name, value) Set or update runtime value of a global shader parameter.

  • add_global(name, type="float", value=None) Define a new global shader parameter in ProjectSettings (shader_globals/).

  • remove_global(name) Remove a global shader parameter definition.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

recording_manageA

Viewport Capture, Image Export, and MovieWriter Recording Automation.

Ops:

  • capture_viewport(target_path="res://screenshot.png", viewport_path="") Capture current frame from a Viewport and save to PNG.

  • configure_movie_writer(movie_file="res://movie.avi", fps=60, quality=0.8) Configure MovieWriter settings in ProjectSettings.

  • get_writer_status() Check if MovieWriter mode is active and inspect configured output file.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

texture_manageA

Texture and Image Resource Management.

Ops:

  • create_image(width=64, height=64, use_mipmaps=False, format="rgba8", fill_color=None, save_path="") Create a new Image resource and optionally fill color and save to disk.

  • create_atlas(atlas_path, region_rect=[0,0,32,32], filter_clip=False, save_path="") Create an AtlasTexture referencing a region of an existing texture.

  • get_texture_info(path) Get metadata for a texture or image resource.

  • create_curve_texture(points=[[0.0,0.0],[1.0,1.0]], width=256, save_path="") Create a CurveTexture resource from control points.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

font_manageA

Font and Label Styling Management.

Ops:

  • create_system_font(font_names=["Sans-Serif"], italic=False, weight=400, save_path="") Create a SystemFont resource and optionally save to disk.

  • create_font_variation(base_font_path, variation_embolden=0.0, save_path="") Create a FontVariation resource derived from a base font.

  • create_label_settings(font_path="", font_size=16, font_color="#ffffff", outline_size=0, outline_color="#000000", shadow_size=0, shadow_color="#000000", save_path="") Create a LabelSettings resource with font styling options.

  • get_font_info(font_path) Inspect metadata and properties of a font resource.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

network_manageA

Networking and Socket Scaffolding.

Ops:

  • scaffold_tcp_server(parent_path="", port=8080, bind_address="*", node_name="TcpServer") Scaffold a TCP server node in the current scene.

  • scaffold_websocket_peer(parent_path="", url="", node_name="WebSocketClient") Scaffold a WebSocket peer node in the current scene.

  • scaffold_udp_peer(parent_path="", port=9000, node_name="UdpPeer") Scaffold a UDP packet peer node in the current scene.

  • get_network_interfaces() List local network IP addresses and adapter interfaces.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

visual_shader_manageC

VisualShader Graph Management.

Ops:

  • create_visual_shader(shader_type="spatial", save_path="") Create a new VisualShader resource for spatial, canvas_item, particles, etc.

  • add_node(shader_path, node_type="VisualShaderNodeColorConstant", shader_type_enum=0, position=[0,0]) Add a VisualShaderNode into the visual shader graph.

  • connect_nodes(shader_path, shader_type_enum=0, from_node=0, from_port=0, to_node=0, to_port=0) Connect two node ports in a VisualShader graph.

  • get_graph(shader_path, shader_type_enum=0) Inspect all nodes and connections in a VisualShader graph.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

animation_tree_manageA

AnimationTree State Machine and Blend Tree Management.

Ops:

  • scaffold_state_machine(parent_path="", anim_player_path="", node_name="AnimationTree") Scaffold an AnimationTree with an AnimationNodeStateMachine root.

  • add_state(tree_path, state_name, animation_name="", position=[0,0]) Add an animation state node into an AnimationNodeStateMachine.

  • add_transition(tree_path, from_state, to_state, auto_advance=False) Add a transition between two states in an AnimationNodeStateMachine.

  • scaffold_blend_tree(parent_path="", anim_player_path="", node_name="AnimationTreeBlend") Scaffold an AnimationTree with an AnimationNodeBlendTree root.

  • get_tree_info(tree_path) Inspect root node configuration and status of an AnimationTree.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

sprite_manageA

Sprite, MultiMesh, and Line2D Management.

Ops:

  • create_sprite_frames(animations=[{"name":"default","fps":5.0,"loop":true}], save_path="") Create a new SpriteFrames resource with named animations.

  • scaffold_animated_sprite(parent_path="", sprite_type="2d", sprite_frames_path="", node_name="AnimatedSprite") Scaffold an AnimatedSprite2D or AnimatedSprite3D in current scene.

  • scaffold_multimesh(parent_path="", mesh_type="box", instance_count=100, is_2d=False, node_name="MultiMeshInstance") Scaffold a MultiMeshInstance2D or MultiMeshInstance3D with instances.

  • configure_line_2d(node_path, points=[], width=10.0, default_color="#ffffff") Configure points and styling of a Line2D node.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

editor_settings_manageA

Editor Settings and Configuration Management.

Ops:

  • get_setting(setting_name) Get an editor setting value by its configuration key path.

  • set_setting(setting_name, value) Set an editor setting value.

  • list_settings(prefix="") List available editor setting key paths matching an optional prefix.

  • get_editor_paths() Get standard Godot editor directory paths from EditorPaths.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

joint_manageA

Physics Joints Management (2D and 3D).

Ops:

  • scaffold_joint_2d(parent_path="", joint_type="pin", node_a_path="", node_b_path="", node_name="Joint2D") Scaffold a 2D physics joint (pin, groove, damped_spring).

  • scaffold_joint_3d(parent_path="", joint_type="pin", node_a_path="", node_b_path="", node_name="Joint3D") Scaffold a 3D physics joint (pin, hinge, slider, cone_twist, generic_6dof).

  • configure_joint(joint_path, properties={}) Configure properties and parameters of a physics joint node.

  • get_joint_info(joint_path) Inspect connected nodes and properties of a physics joint node.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

occluder_manageA

Occlusion Culling Management.

Ops:

  • scaffold_occluder_3d(parent_path="", occluder_type="box", size=[1.0,1.0,1.0], node_name="OccluderInstance3D") Scaffold a 3D occlusion culling node (box, sphere, quad).

  • scaffold_occluder_2d(parent_path="", polygon_points=[[-16,-16],[16,-16],[16,16],[-16,16]], closed=True, node_name="LightOccluder2D") Scaffold a 2D light/occlusion polygon node in current scene.

  • get_occluder_info(occluder_path) Inspect occluder node and attached occluder resource.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

config_manageA

ConfigFile, JSON, and Expression Utilities.

Ops:

  • config_read(file_path, section="", key="") Read values or entire sections from an INI ConfigFile.

  • config_write(file_path, section, key, value) Write a section and key value into an INI ConfigFile.

  • json_parse(json_string) Parse a JSON string into Godot Variant data structure.

  • json_generate(data, indent="") Serialize data into a formatted JSON string.

  • expression_eval(expression_string, input_names=[], input_values=[]) Evaluate a mathematical or logic expression via Godot Expression.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

parallax_manageA

Parallax and Canvas Layer Management.

Ops:

  • scaffold_parallax(parent_path="", scroll_scale=[1.0,1.0], repeat_size=[0.0,0.0], node_name="Parallax2D") Scaffold a Parallax2D node for background layer scrolling.

  • scaffold_canvas_layer(parent_path="", layer=1, follow_viewport=False, node_name="CanvasLayer") Scaffold a CanvasLayer node in the scene tree.

  • scaffold_visibility_notifier(parent_path="", is_2d=True, rect_size=[100.0,100.0], node_name="VisibilityNotifier") Scaffold a VisibleOnScreenNotifier2D or 3D node.

  • get_parallax_info(node_path) Inspect properties of a parallax or canvas layer node.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

body_manageA

Physics Body & Collision Management (2D and 3D).

Ops:

  • configure_body(node_path, properties={}) Configure physics parameters of a body (mass, gravity_scale, damping).

  • apply_impulse(node_path, impulse=[0,0], position=None) Apply an impulse to a 2D or 3D RigidBody.

  • set_collision_layer_mask(node_path, collision_layer=None, collision_mask=None, collision_priority=None) Set collision layers and masks for a 2D or 3D collision object.

  • scaffold_character_body(parent_path="", node_name="Player", is_3d=False) Scaffold a CharacterBody2D or CharacterBody3D with collision shape.

  • get_body_info(node_path) Inspect collision layers, mass, and properties of a physics body.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

world_manageB

WorldEnvironment, Sky, and Post-Processing Management.

Ops:

  • configure_world_environment(node_path="", properties={}) Configure properties of WorldEnvironment and its Environment resource.

  • create_sky_material(node_path="", sky_type="procedural", sky_top_color="", ground_bottom_color="", texture_path="") Create and assign procedural or panorama sky material to Environment.

  • set_volumetric_fog(node_path="", enabled=True, density=None, albedo=None, emission=None, anisotropy=None, length=None) Enable and configure volumetric fog parameters on Environment.

  • configure_camera_attributes(node_path="", attribute_type="practical", properties={}) Configure CameraAttributesPractical or CameraAttributesPhysical.

  • get_world_info(node_path="") Inspect active world environment, fog, sky, and post-processing settings.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

audio_effect_manageA

AudioServer DSP Bus Effects Management.

Ops:

  • add_effect_to_bus(bus_name="Master", effect_class="AudioEffectReverb", at_position=-1, properties={}) Add an AudioEffect to an audio bus at the specified index.

  • configure_effect(bus_name="Master", effect_index=0, enabled=None, properties={}) Configure parameters and enable state of an audio bus effect.

  • remove_effect(bus_name="Master", effect_index=0) Remove an audio effect from a bus by index.

  • list_bus_effects(bus_name="Master") List all audio effects assigned to an audio bus.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

nav_query_manageB

Navigation Queries and Spatial Pathfinding Management.

Ops:

  • query_path_2d(start=[0,0], end=[0,0], optimize=True) Query 2D navigation path between start and end coordinates.

  • query_path_3d(start=[0,0,0], end=[0,0,0], optimize=True) Query 3D navigation path between start and end coordinates.

  • scaffold_nav_link(parent_path="", start_position=None, end_position=None, bidirectional=True, is_3d=False, node_name="NavLink") Scaffold a 2D or 3D NavigationLink connecting disjoint navmesh areas.

  • scaffold_nav_obstacle(parent_path="", radius=32.0, is_3d=False, node_name="NavObstacle") Scaffold a 2D or 3D NavigationObstacle for avoidance navigation.

  • get_nav_map_info(is_3d=False) Inspect navigation map cell size, margins, and properties.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

headless_manageB

Standalone Headless Engine & CLI Management.

Ops:

  • run_script(script_path="", inline_code="") Execute a GDScript file or inline code snippet in headless mode.

  • run_headless_scene(scene_path, quit_after_frames=60) Execute a scene headlessly for testing or headless game simulation.

  • export_project_cli(preset, output_path, is_debug=False) Trigger a headless project export via Godot CLI preset.

  • reimport_assets_cli() Reimport modified assets via a headless editor pass.

  • get_engine_info() Inspect Godot engine version, platform, and headless CLI capabilities.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

cloud_manageA

Cloud Bridge and ChatGPT Tunnel Management.

Ops:

  • get_tunnel_status() Check cloud tunnel and REST gateway operational status.

  • get_action_schema_url(host="http://127.0.0.1:8000") Get OpenAPI schema URL and setup instructions for ChatGPT Custom GPT.

  • test_cloud_connection() Test round-trip responsiveness between Godot editor and gateway.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

gi_manageB

Global Illumination, Decal Projections, and Lighting Probes Management.

Ops:

  • create_decal(parent_path="", name="Decal", size=[2.0, 2.0, 2.0], texture_albedo="") Create a Decal node under parent with optional albedo texture and dimensions.

  • configure_decal(node_path="", size=None, texture_albedo=None, texture_normal=None, texture_orm=None, emission_energy=None, upper_fade=None, lower_fade=None) Configure properties and PBR textures of an existing Decal node.

  • create_reflection_probe(parent_path="", name="ReflectionProbe", size=[20.0, 20.0, 20.0], update_mode="once") Create a ReflectionProbe node for local specular reflections.

  • create_voxel_gi(parent_path="", name="VoxelGI", size=[20.0, 20.0, 20.0], subdivide=1) Create a VoxelGI node for real-time indirect lighting and ambient bounce.

  • create_lightmap_gi(parent_path="", name="LightmapGI", bounces=3) Create a LightmapGI node for high-performance baked lighting.

  • get_gi_info(node_path="") Inspect properties and settings of a Decal, ReflectionProbe, VoxelGI, or LightmapGI.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

input_event_manageA

Input Event Simulation, Macro Replay, and Virtual Actions.

Ops:

  • simulate_action(action, pressed=True, strength=1.0) Simulate an input action press or release in the running game or editor.

  • simulate_key(key, pressed=True, echo=False, shift=False, ctrl=False, alt=False) Simulate a keyboard key event (e.g. 'W', 'Space', 'Escape', or keycode).

  • simulate_mouse_button(button_index=1, pressed=True, position=[0.0, 0.0]) Simulate a mouse button press or release at coordinates (1=Left, 2=Right, 3=Middle).

  • simulate_mouse_motion(position=[0.0, 0.0], relative=[0.0, 0.0], velocity=[0.0, 0.0]) Simulate a mouse cursor motion event.

  • replay_macro(events=[]) Replay a sequential list of input events for automated gameplay testing.

  • get_input_state(action) Inspect whether an input action is pressed and its current strength.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

physics_query_manageA

Direct 2D and 3D Physics Space State Raycasts, Point Overlaps, and Shape Queries.

Ops:

  • intersect_ray_3d(from_pos=[0.0, 0.0, 0.0], to_pos=[0.0, -10.0, 0.0], collision_mask=0xFFFFFFFF, collide_with_bodies=True, collide_with_areas=False) Cast a ray in 3D world space and return hit position, normal, and collider.

  • intersect_ray_2d(from_pos=[0.0, 0.0], to_pos=[0.0, 100.0], collision_mask=0xFFFFFFFF, collide_with_bodies=True, collide_with_areas=False) Cast a ray in 2D world space and return hit position, normal, and collider.

  • intersect_point_3d(position=[0.0, 0.0, 0.0], max_results=32, collision_mask=0xFFFFFFFF) Query 3D colliders overlapping a point in world space.

  • intersect_point_2d(position=[0.0, 0.0], max_results=32, collision_mask=0xFFFFFFFF) Query 2D colliders overlapping a point in world space.

  • intersect_shape_3d(shape_type="sphere", radius=1.0, max_results=32) Query 3D colliders overlapping a shape in world space.

  • cast_motion_3d(shape_type="sphere", radius=1.0, motion=[0.0, -1.0, 0.0]) Simulate shape motion to determine safe and unsafe collision fractions.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

curve_manageA

Curve (1D, 2D, 3D), Splines, Gradients, and Color Ramps Management.

Ops:

  • create_curve_1d(points=[[0.0, 0.0], [1.0, 1.0]], min_value=0.0, max_value=1.0, save_path="") Create a 1D interpolation/easing Curve resource.

  • create_curve_2d(points=[[0.0, 0.0], [100.0, 100.0]], in_tangents=[], out_tangents=[], save_path="") Create a 2D bezier spline Curve2D resource for paths and animation.

  • create_curve_3d(points=[[0.0, 0.0, 0.0], [0.0, 5.0, 10.0]], in_tangents=[], out_tangents=[], save_path="") Create a 3D bezier spline Curve3D resource for 3D paths and rail movement.

  • create_gradient(offsets=[0.0, 1.0], colors=["#000000", "#ffffff"], save_path="") Create a multi-stop color ramp Gradient resource.

  • create_gradient_texture(gradient_path="", width=256, is_2d=False, height=256, save_path="") Create a GradientTexture1D or GradientTexture2D resource.

  • sample_curve(curve_path, offset=0.5) Sample value or baked position on a Curve resource.

  • sample_gradient(gradient_path, offset=0.5) Sample RGBA color on a Gradient resource.

Canonical call shape: {"op": "<verb>", "params": {...}}. Flat op parameters are accepted as a compatibility alias when the client transmits them; op and session_id remain top-level.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
get_sessionsAll connected Godot editor sessions and their metadata.
get_current_sceneCurrent scene path and root node info from the active Godot editor.
get_scene_hierarchyScene 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_selectionCurrently selected nodes in the Godot editor.
get_recent_logsLast 100 log lines from the Godot editor console.
get_project_infoProject name, Godot version, paths, and play state.
get_project_settingsCommon project settings subset (display, physics, rendering).
get_editor_stateEditor version, project name, current scene, readiness, play state.
get_materialsAll Material resources under res:// (every Material subclass + .tres).
get_input_mapAll input map actions and their bound events. Excludes built-in ui_*.
get_performancePerformance singleton snapshot (FPS, memory, draw calls, frame time).
get_test_resultsMost recent ``test_run`` results without re-executing tests.
get_custom_tools

TDQS

B3.1/5.0

Scored across 100 tools

Disambiguation1/5

Several tools perform the same operation under different names: eval appears in editor_manage, omni_manage, and execute_script; raycasting is duplicated in physics_manage and physics_query_manage; curve creation exists in resource_manage, path_manage, and curve_manage; input simulation is split across game_manage and input_event_manage. An agent will frequently misselect between these duplicate or near-duplicate tools.

Naming Consistency2/5

Most tools follow a snake_case *_manage pattern, but the same capability is named inconsistently (raycast_2d vs intersect_ray_2d, input_key vs simulate_key, editor_manage op=state vs standalone editor_state), and op naming inside *_manage tools mixes styles. The pattern is readable but not predictable enough across 100 tools.

Tool Count1/5

100 tools is far beyond a well-scoped MCP surface. Even a comprehensive Godot development server would struggle to justify this many, and a large portion of them are redundant with each other rather than earning their place.

Completeness4/5

Coverage of the Godot game-development domain is remarkably thorough: scenes, nodes, scripts, resources, UI, input, animation, physics, rendering, networking, localization, and more are present with no obvious dead-end workflows. Minor gaps exist (e.g., no 2D shape cast, some duplicated features are shallow), but the surface is essentially complete.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive