Godot MCP Runtime
Godot MCP Runtime
An MCP server that gives AI assistants direct access to a running Godot 4.x game. Not just file editing, not just scene manipulation. Actual runtime control: input simulation, screenshots, UI discovery, and live GDScript execution while the game is running.
When you run a project through this server, it injects a lightweight UDP bridge as an autoload, and suddenly the AI can interact with your game the same way a player would: press keys, click buttons, read what's on screen, and run arbitrary code against the live scene tree.
The distinction matters: the AI doesn't just write your game, it can check its work.
No addon required. Most Godot MCP servers that offer runtime support ship as a Godot addon — something you install into your project, commit to version control, and manage as a dependency. This server does none of that. The bridge script is injected on run_project or attach_project, then removed on stop_project or detach_project. Your project files are left exactly as they were. All you need is Node.js and a Godot executable, no addon installation, no project modifications, no cleanup.
Think of it as Playwright MCP, but for Godot. Playwright lets agents verify that a web app actually works by driving a real browser. This does the same thing for games: run the project, take a screenshot, simulate input, read what's on screen, execute a script against the live scene tree. The agent closes the loop on its own changes rather than handing off to you to verify.
This is not a playtesting replacement. It doesn't catch the subtle feel issues that only a human notices, and it won't tell you if your game is fun. What it does is let an agent confirm that a scene loads, a button responds, a value updated, a script ran without errors. That's a fundamentally different development workflow, and it's what this server is built for.
Every operation is its own tool with only its relevant parameters, no operation discriminators, no conditional schemas. Each tool teaches agents how to use it through its description and response messages: what to call next, when to wait, and how to recover from errors.
What It Does
Headless editing. Create scenes, add nodes, set properties, attach scripts, connect signals, manage UIDs, validate GDScript. All the standard operations, no editor window required.
Runtime bridge. When run_project or attach_project is called, the server injects McpBridge as an autoload. This opens a UDP channel on port 9900 (localhost only) and enables:
Screenshots: Capture the viewport at any point during gameplay
Input simulation: Batched sequences of key presses, mouse clicks, mouse motion, UI element clicks by name or path, Godot action events, and timed waits
UI discovery: Walk the live scene tree and collect every visible Control node with its position, type, text content, and disabled state
Live script execution: Compile and run arbitrary GDScript with full SceneTree access while the game is running
Background mode. Pass background: true to run_project and the Godot window moves off-screen with physical input blocked: borderless, unfocusable, mouse-passthrough. Programmatic input, screenshots, and all runtime tools work exactly the same. Useful for automated agent-driven testing where the window shouldn't be visible or interactive.
Manual attach mode. When something other than MCP launches the game (a CI pipeline, an external debugger, your own shell), call attach_project first. It injects the bridge and marks the project active without spawning Godot, so when you launch the game manually, runtime tools work against it. The tradeoff: get_debug_output is unavailable in attached mode because stdout and stderr only flow through processes MCP started itself. Use detach_project when done.
The bridge cleans itself up automatically when stop_project or detach_project is called. No leftover autoloads, no modified project files.
Related MCP server: Godot MCP
Quick Start
Prerequisites
That's it. No Godot addon, no project modifications.
Configure Your MCP Client
Add the following to your MCP client config. Works with Claude Code, Claude Desktop, Cursor, or any MCP-compatible client.
Zero-install via npx (recommended):
{
"mcpServers": {
"godot": {
"command": "npx",
"args": ["-y", "godot-mcp-runtime"],
"env": {
"GODOT_PATH": "<path-to-godot-executable>"
}
}
}
}Or install globally:
npm install -g godot-mcp-runtime{
"mcpServers": {
"godot": {
"command": "godot-mcp-runtime",
"env": {
"GODOT_PATH": "<path-to-godot-executable>"
}
}
}
}Or clone from source:
git clone https://github.com/Erodenn/godot-mcp-runtime.git
cd godot-mcp-runtime
npm install
npm run build{
"mcpServers": {
"godot": {
"command": "node",
"args": ["<path-to>/godot-mcp-runtime/dist/index.js"],
"env": {
"GODOT_PATH": "<path-to-godot-executable>"
}
}
}
}If Godot is on your PATH, you can omit GODOT_PATH entirely. The server will auto-detect it. Set "DEBUG": "true" in env for verbose logging.
Verify
Ask your AI assistant to call get_project_info. If it returns a Godot version string (e.g., 4.4.stable), you're connected and working.
Tools
Project Management
Tool | Description |
| Open the Godot editor GUI for a project |
| Run a project and inject the MCP bridge. Pass |
| Inject the MCP bridge for a project you'll launch yourself |
| Remove the injected bridge after manual-launch use, leaving the external process alone |
| Stop the running project and remove the bridge (also detaches attached-mode state) |
| Read stdout/stderr from an MCP-spawned project (unavailable in attached mode) |
| Find Godot projects in a directory |
| Get project metadata and Godot version |
Runtime (requires run_project or attach_project first)
After run_project, or after attach_project plus launching Godot manually, wait 2-3 seconds for the bridge to initialize before using these tools.
Tool | Description |
| Capture a PNG of the running viewport |
| Send batched input: key, mouse, click_element, action, wait |
| Get all visible Control nodes with positions, types, and text |
| Execute arbitrary GDScript at runtime with full SceneTree access |
Scene Editing (headless)
All mutation operations save automatically. Use save_scene only for save-as (newPath) or to re-canonicalize a .tscn file.
Tool | Description |
| Create a new scene file |
| Add a node to an existing scene (supports promoted spatial params) |
| Set a texture on a Sprite2D, Sprite3D, or TextureRect |
| Re-pack and save the scene, or save-as with |
| Export scenes as a MeshLibrary for GridMap |
| Run multiple add_node/load_sprite/save ops in a single Godot process |
Node Editing (headless)
All mutation operations save automatically.
Tool | Description |
| Get the full scene tree hierarchy (use |
| Read properties from a node |
| Read properties from multiple nodes in one process |
| Set a property on a node |
| Set multiple properties in one process |
| Attach a GDScript to a node |
| Duplicate a node within the scene |
| Remove a node from the scene |
| List all signals on a node with their connections |
| Connect a signal to a method on another node |
| Disconnect a signal connection |
Project Config (no Godot process required)
These tools edit project.godot directly or read the filesystem. Safe to use even when autoloads are broken.
Tool | Description |
| List all registered autoloads with paths and singleton status |
| Register a new autoload |
| Unregister an autoload by name |
| Modify an existing autoload's path or singleton flag |
| Read settings from |
| Get the project file tree with types and extensions |
| Search for a string across project source files |
| List all resources a scene depends on |
Validation: validate
Validate before attaching or running. Catches syntax errors and missing resource references before they cause headless crashes or runtime failures. Supports scriptPath, source (inline GDScript), scenePath, or a targets array for batch validation.
UIDs: manage_uids (Godot 4.4+)
Operation | Description |
| Get a resource's UID |
| Resave all resources to update UID references |
Architecture
src/
├── index.ts # MCP server entry point, routes tool calls
├── tools/
│ ├── project-tools.ts # Project, runtime, autoload, filesystem, search, settings
│ ├── scene-tools.ts # Scene creation, node addition, sprite loading, batch ops, UIDs
│ ├── node-tools.ts # Node properties, scripts, tree, duplication, signals
│ └── validate-tools.ts # GDScript and scene validation
├── scripts/
│ ├── godot_operations.gd # Headless GDScript operations
│ └── mcp_bridge.gd # UDP autoload for runtime communication
└── utils/
└── godot-runner.ts # Process spawning, output parsing, shared validation helpersHeadless operations spawn Godot with --headless --script godot_operations.gd, perform the operation, and return JSON. Runtime operations communicate over UDP with the injected McpBridge autoload.
How the Bridge Works
When run_project or attach_project is called:
mcp_bridge.gdis copied into the project directoryIt's registered as an autoload in
project.godotGodot launches with the bridge listening on
127.0.0.1:9900. Withrun_project, MCP spawns the process; withattach_project, you launch it yourself.Runtime tools send JSON commands to the bridge and await responses
stop_projectordetach_projectremoves the bridge script and autoload entry
Files generated during runtime (screenshots, executed scripts) are stored in .mcp/ inside the project directory. This directory is automatically added to .gitignore and has a .gdignore so Godot won't import it.
Broken Autoloads
If any registered autoload fails to initialize (syntax error, missing resource, display dependency), Godot's headless process will crash before any operation runs. Use list_autoloads and remove_autoload to inspect and remove the failing autoload. These tools edit project.godot directly, with no Godot process involved.
Acknowledgments
Built on the foundation laid by Coding-Solo/godot-mcp for headless Godot operations.
Developed with Claude Code.
License
Available Tools
39 toolsadd_autoloadA
Register a new autoload in a project. autoloadPath accepts "res://..." or a project-relative path (auto-prefixed). singleton defaults true (accessible globally by name). No Godot process required. Warning: autoloads initialize in headless mode - a broken script will crash every subsequent headless op; validate before adding. Returns plain-text confirmation with the registered name, path, and singleton flag. Errors if an autoload with the same name already exists; use update_autoload to modify.
| Name | Required | Description | Default |
|---|---|---|---|
| singleton | No | Register as a globally accessible singleton by name (default: true) | |
| projectPath | Yes | Path to the Godot project directory | |
| autoloadName | Yes | Name of the autoload node (e.g. "MyManager") | |
| autoloadPath | Yes | Path to the script or scene (e.g. "res://autoload/my_manager.gd" or "autoload/my_manager.gd") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that no Godot process is needed, that autoloads initialize in headless mode, that a broken script crashes every subsequent headless op, what the return format is (plain-text name/path/singleton), and the duplicate-name error path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then layers path syntax, singleton default, environment behavior, the headless crash warning, return format, and error path — every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the mutation's side effects, the environment requirement, the return value, and the failure mode, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds real value by explaining that autoloadPath accepts both 'res://...' and project-relative paths (auto-prefixed) and by restating the singleton default and its global-access meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register a new autoload in a project') and explicitly routes the modify case to a named sibling (update_autoload), letting an agent distinguish it from list_autoloads, update_autoload, and remove_autoload.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context (no Godot process required) and names the alternative for modification, plus a pre-flight warning to validate before adding. It does not spell out the inverse case (when not to add an autoload) beyond the duplicate-name error, so it falls just short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_nodeA
Add a node to a Godot scene. Saves automatically. position, rotation, scale, visible, modulate are top-level params; anything else goes in properties. Values are checked against the property's declared type and error instead of silently storing that type's zero value. Object-typed properties take a res:// path, a {type: ClassName, ...props} dict that builds a Resource inline, or null; slash-suffixed keys like shader_parameter/ go inside that dict, not on the node. Value coercion, Packed*Array/Array[T] element rules and error details: Property Values in docs/tools.md. Returns plain-text confirmation of the new node and type. Errors and adds nothing if nodeType is not a registered class, the parent is missing, or a property name or value is invalid. Errors while a Godot runtime session is active; stop_project or detach_project clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | Vector2 scale (e.g. {"x": 2, "y": 2}) | |
| visible | No | Whether the node is visible | |
| modulate | No | Color modulation (e.g. {"r": 1, "g": 0, "b": 0, "a": 1}) | |
| nodeName | Yes | Name for the new node as it appears in the scene tree | |
| nodeType | Yes | Godot node class to instantiate (e.g. "Sprite2D", "CollisionShape2D", "Label"), or a project-relative scene path (.tscn or .scn, e.g. "scenes/enemy.tscn") to instance an existing scene as a child - instanced children serialize as `instance=ExtResource(...)` on save | |
| position | No | Position: {"x": 100, "y": 200} on a 2D node, {"x": 0, "y": 1, "z": 0} on a 3D node | |
| rotation | No | Rotation in radians | |
| scenePath | Yes | Scene file path relative to the project | |
| properties | No | Additional property values as a JSON object. Top-level params (position, rotation, etc.) take precedence over keys in this dict. | |
| projectPath | Yes | Path to the Godot project directory | |
| parentNodePath | No | Parent node path from scene root (e.g. "root/Player"). Defaults to the root node. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses automatic saving, type-checking with error instead of silent zero values, object-typed property input formats, runtime-session conflict behavior, and a specific docs reference. It also lists precise failure conditions. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries information, and the primary purpose is front-loaded. It is a single long paragraph rather than structured bullets, but the flow is logical and no sentence is filler. Slight length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers return format (plain-text confirmation), failure conditions, runtime-session constraint, and parameter semantics. It even points to a docs file for advanced coercion rules. For a tool with no output schema and no annotations, this is complete enough for an agent to call it correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds critical semantics beyond the schema: it distinguishes top-level params from the properties dict, explains type-checking behavior, and spells out the allowed formats for object-typed properties (res:// path, inline dict, or null) plus the slash-suffixed key convention. This materially improves the agent's ability to construct valid parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Add a node to a Godot scene'), immediately distinguishing it from siblings like set_node_properties or delete_nodes. The scope is unambiguous, and additional detail about saving and parameter handling reinforces the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance or named alternatives. Usage is implied by the tool name and first sentence, but no exclusions compare it to related tools like create_scene or duplicate_node. Error conditions are presented as failure modes, not as selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attach_projectADestructive
Inject the MCP bridge into a Godot process you launch yourself, then wait up to 20s for the bridge to start listening and up to 45s total once it has, so a large project's cold start is absorbed; a port that listens but answers no ping gives up sooner. Call BEFORE Godot launches - Godot reads autoloads only at process start, so a late call returns "bridge did not respond." Recommended pattern: kick off the Godot launch in parallel with this call so the wait absorbs startup. Prefer run_project unless MCP must not spawn Godot. Returns plain-text status with the resolved bridge port. Call detach_project or stop_project when done.
| Name | Required | Description | Default |
|---|---|---|---|
| bridgePort | No | TCP port for the MCP bridge. Omit to auto-select a free port (recommended). The chosen port is baked into the project's `mcp_bridge.gd` at inject time, so the running Godot listens on exactly this port. | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses wait-time budgets, early failure on unresponsive ports, the error message for late calls, and the plain-text return format. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: the core action is front-loaded and the timing, failure mode, recommended pattern, alternative, and cleanup are all packed efficiently without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and only a destructive hint annotation, the description is remarkably complete. It covers invocation timing, process lifecycle, timeout behavior, failure modes, return value, and related tools needed to finish the workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters fully at 100% coverage. The description adds useful behavioral nuance for bridgePort (e.g., a port that listens but answers no ping gives up sooner), but most parameter meaning already lives in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Inject the MCP bridge into a Godot process you launch yourself') and the target resource. It also distinguishes this tool from run_project by the launch-ownership condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit timing requirements ('Call BEFORE Godot launches'), a recommended parallel launch pattern, an explicit alternative ('Prefer run_project unless MCP must not spawn Godot'), and cleanup guidance ('Call detach_project or stop_project when done').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attach_scriptAIdempotent
Attach an existing GDScript file to a node in a scene. Use after writing the script with the standard file tools and validating it via the validate tool. Replaces any previously attached script. Saves automatically. Returns: success with the resolved nodePath and scriptPath that were attached. Errors if scriptPath does not exist or nodePath is not found. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| nodePath | Yes | Node path from scene root (e.g. "root/Player") | |
| scenePath | Yes | Scene file path relative to the project | |
| scriptPath | Yes | Path to the GDScript file relative to the project (e.g. "scripts/player.gd") | |
| projectPath | Yes | Path to the Godot project directory |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| nodePath | No | |
| scriptPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the lone idempotentHint annotation, it discloses that the operation replaces any previously attached script, that it saves automatically, the resolution behavior of the returned nodePath/scriptPath, and two distinct error conditions (missing scriptPath, unknown nodePath). The runtime-session constraint and its remedy are exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then prerequisites, side effects, and errors, with zero filler. Every sentence contributes operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description covers prerequisites, destructive behavior (script replacement), auto-save, return shape, and both failure modes plus the runtime blocker and its clear command. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented with examples (nodePath, scenePath, scriptPath, projectPath). The description adds little parameter-level syntax beyond reiterating that nodePath and scriptPath are resolved on return, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (attach) and resource (an existing GDScript file) plus its target (a node in a scene), and the scope is unambiguous against siblings like validate or run_script. An agent can distinguish this tool's job without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite workflow explicitly ('after writing the script with the standard file tools and validating it via the validate tool') and the blocking condition (runtime session active, cleared by stop_project/detach_project). It does not, however, point to an alternative for cases where attaching is the wrong choice versus run_script.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_scene_operationsADestructive
Use this instead of chaining add_node / load_sprite / save_scene calls when you have multiple mutations on the same or related scenes - runs in one Godot process (~3s startup avoided per call) and shares an in-memory scene cache, saving once at the end. Each item picks its own sub-operation (add_node, load_sprite, set_node_properties, save) and supplies its own params; add_node items accept the same promoted spatial params (position, rotation, scale, visible, modulate) as the standalone tool; set_node_properties items accept the same per-update params (nodePath, property, value) and per-operation scenePath and abortOnError as the standalone tool; abortOnError stops on first failure (default false continues). Returns: results[] in input order, each tagged with operation and scenePath plus success or error. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | Ordered list of scene operations. Each item has its own operation and scenePath. | |
| projectPath | Yes | Path to the Godot project directory | |
| abortOnError | No | Stop processing on first error (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits: it runs in a single Godot process, saves once at the end, shares an in-memory cache, and has specific error handling (abortOnError). It also warns that errors occur while a Godot runtime session is active and provides remediation (stop_project or detach_project). This adds substantial value beyond the destructiveHint annotation, which only warns of destructiveness. The description clearly explains the batch semantics and lifecycle, though it doesn't delve into every edge case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but structured, front-loading the primary purpose and key benefit (avoiding startup overhead, shared cache). It then lists sub-operations and their parameter equivalences, concluding with error handling and a note about Godot runtime conflicts. While it is somewhat long, every sentence provides useful information; no filler. The structure is logical, moving from purpose to mechanics to side effects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (multiple sub-operations with differing parameters, nested objects) and the presence of a rich output schema, the description is fairly complete. It covers the core usage, the sub-operation variants, error handling, and an important caveat about Godot runtime sessions. However, it doesn't explicitly explain the ordering semantics beyond 'in input order', which is implied in the schema, and the output schema likely covers return details. Minor gaps but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides detailed descriptions for each parameter (e.g., operation enum, per-operation fields like nodePath, properties). The description adds context by explaining how sub-operations map to standalone tools and mentions that add_node items accept the same promoted spatial params, and set_node_properties accept the same per-update params. However, since schema coverage is 100%, the description doesn't add significant semantic beyond what's already in the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to batch multiple mutations on scenes in one call, instead of chaining individual calls. It explicitly names the operations it replaces (add_node, load_sprite, save_scene) and lists the supported sub-operations, making its scope unmistakable. It also distinguishes itself from the standalone tools by emphasizing the shared cache and single save.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: when you have multiple mutations on the same or related scenes, to avoid per-call startup overhead and benefit from a shared cache. It names the alternative (chaining individual tools) and even mentions the error-handling behavior (abortOnError). This gives clear guidance on usage and comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_projectARead-only
Get project metadata (name, path, Godot version, structure summary) plus an always-present runtime block reporting whether a runtime session is active, its bridge is responsive, and its process is alive. Omit projectPath for just the Godot version and runtime status. Use as the first call before driving a running project. Never errors on the runtime probe itself. Returns: { name?, path?, structure?, godotVersion, runtime }. Errors if projectPath is set but lacks project.godot.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | No | Path to the Godot project directory (optional - omit to get Godot version and runtime status only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| path | No | |
| runtime | Yes | |
| structure | No | |
| godotVersion | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds meaningful behavioral context: the runtime probe is always present, never errors on the runtime probe itself, and errors only if projectPath is set but lacks project.godot. This goes beyond the annotation by disclosing error conditions and the always-present runtime block.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the main purpose is in the first sentence, the optional-parameter behavior is stated next, and the error condition is last. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description doesn't need to explain return values in detail, but it still summarizes the return shape. It covers the optional parameter behavior, error conditions, and usage context. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes projectPath. The description adds value by explaining the consequence of omitting it (returns only Godot version and runtime status) and the error condition when set to a non-project directory. This is more than the schema provides, though the schema already covers the basic meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('project metadata'), enumerates the exact fields returned (name, path, Godot version, structure summary), and adds a distinguishing runtime block. It clearly differentiates from siblings like get_project_settings and get_project_files by describing the metadata + runtime status scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use as the first call before driving a running project, and explains the optional projectPath behavior ('Omit projectPath for just the Godot version and runtime status'). This gives clear when-to-use guidance and implies when not to use it (when you need files/settings, use siblings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_signalA
Connect a signal on a source node to a method on a target node, persisting it in the .tscn. Use get_node_signals first to confirm names - connecting the same pair twice creates a duplicate connection. Saves automatically. Returns a plain-text confirmation naming source, signal, target, and method. Errors if the signal or method does not exist. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | Method name on the target node to call when the signal fires | |
| signal | Yes | Signal name on the source node (e.g. "pressed", "body_entered") | |
| nodePath | Yes | Source node path from scene root | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory | |
| targetNodePath | Yes | Target node path from scene root that receives the signal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so well: it discloses auto-save behavior, the idempotency hazard (duplicate connections), the exact error conditions (missing signal/method, active runtime session), and the return format. These are non-obvious traits an agent must know before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then prerequisites, side effects, return value, and failure modes in five tight sentences. No filler; each sentence contributes distinct operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, yet the description describes the return value ('plain-text confirmation naming source, signal, target, and method'), and it covers persistence, errors, and the runtime-session conflict. For a 6-required-param mutation tool this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters are already documented in structured form, which sets the baseline at 3. The description adds only indirect value by advising get_node_signals to validate signal/method names; it does not add format or path-syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (connect), resource (signal on source node to method on target node), and destination of the change (.tscn file). The pairing of source-signal / target-method is precise enough to distinguish it from disconnect_signal and get_node_signals without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to call get_node_signals first to confirm names, states the duplicate-connection consequence, and names stop_project/detach_project as the ways to clear the runtime-session blocker. That is genuine when-to-use and when-not-to-use guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sceneAIdempotent
Create a new Godot scene file with a single root node. Writes a fresh .tscn at scenePath. Use when starting a new scene from scratch; for adding nodes to an existing scene, use add_node. rootNodeType defaults to Node2D - pass "Node3D" for 3D scenes or "Control" for UI. Saves automatically. Overwrites silently if the file already exists. Returns: success and the scenePath that was written. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| scenePath | Yes | Scene file path relative to the project (e.g. "scenes/main.tscn") | |
| projectPath | Yes | Path to the Godot project directory | |
| rootNodeType | No | Root node type (default: Node2D) |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| scenePath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide idempotentHint=true, but the description goes much further: 'Overwrites silently if the file already exists,' 'Saves automatically,' and — critically — 'Errors while a Godot runtime session is active... stop_project (or detach_project) clears it.' This is a runtime precondition no annotation would convey, and it's exactly the kind of behavior that causes agent failures if missed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then the routing alternative, then parameter hints, then behavior (overwrite, save), then return shape, then the runtime precondition. Every clause is load-bearing; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values ('success and the scenePath') need not be explained in depth — the description summarizes anyway. Combined with the runtime-session precondition, silent-overwrite warning, and default handling, an agent has everything needed to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema for rootNodeType by giving concrete values ('pass "Node3D" for 3D scenes or "Control" for UI') and reinforcing the default, which the schema states only in one short clause. No enum is declared in the schema, so this guidance is otherwise unavailable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Create a new Godot scene file with a single root node.' Distinguishes from sibling add_node explicitly, and the write target (.tscn at scenePath) is stated. An agent can identify this tool without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('starting a new scene from scratch') and the alternative for the opposite case ('for adding nodes to an existing scene, use add_node'). Covers the main routing decision cleanly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_nodesADestructive
Remove one or more nodes (and their descendants) from a scene file. Always-array: pass a single-element nodePaths array for one-off deletes. Saves once at the end. Cannot delete the scene root - that entry returns an error and the rest still process. Returns: results array with one entry per nodePath in input order (success or error message). Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| nodePaths | Yes | Node paths from scene root to delete (e.g. ["root/Player/Sprite2D"]) | |
| scenePath | Yes | Scene file path relative to the project (e.g. "scenes/main.tscn") | |
| projectPath | Yes | Path to the Godot project directory |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, it discloses that descendants are removed, that the save happens once at the end, that a root-delete fails per-entry without aborting the batch, and that an active runtime session causes errors. These are meaningful behaviors an agent cannot get from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then packs array semantics, failure behavior, return shape, and prerequisites into tight sentences with zero filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive batch mutation with an output schema already defined, the description covers the safety-relevant behaviors, partial-failure semantics, prerequisites, and return structure. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds the non-obvious always-array contract (single-element array for one-off deletes), which prevents a common invocation mistake. The per-entry results ordering also clarifies how nodePaths maps to output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Remove) and resource (nodes and their descendants) plus scope (from a scene file). An agent can distinguish it cleanly from add_node, duplicate_node, and remove_autoload without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Adds operational guidance: always-array contract for one-off deletes, the scene-root exclusion, and the runtime-session prerequisite with concrete remedies (stop_project/detach_project). It stops short of an explicit when-to-use/when-not comparison against sibling mutation tools, but the context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detach_projectADestructive
Clear attached-mode runtime state and remove the injected McpBridge autoload. Does NOT stop the manually launched Godot process - that stays running. Use after attach_project when you are done driving the game from MCP. For spawned sessions (run_project), use stop_project instead. Mostly optional now: when the bridge disconnects (you closed Godot), the next runtime tool call probes once and ends the attached session itself, removing the autoload. Calling it afterwards still succeeds idempotently, wording the message to distinguish "an attached session existed and already ended" from "this server never attached to a project". Returns: message confirming detach plus externalProcessPreserved (always true here - that is the point of detach vs stop_project). Errors only when a spawned session is what is active; use stop_project for those.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| externalProcessPreserved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=true, but the description adds substantial context: it preserves the external Godot process, is idempotent on repeat calls, auto-cleans up when the bridge disconnects, distinguishes 'already ended' vs 'never attached' messages, and errors only when a spawned session is active. This is well beyond what the single annotation conveys and is consistent with it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded, leading with the core action and its key exclusion. It is on the long side and spends a full sentence detailing return values ('message confirming detach plus externalProcessPreserved') that the output schema already covers, which is mild redundancy but not padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, zero-ambiguity lifecycle tool with an output schema and a destructive annotation, the description covers scope, alternatives, idempotency, error conditions, and cleanup behavior. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters (schema is an empty object), so there are no parameter semantics to document. Per the baseline for 0-param tools, this is adequate; the description's discussion of externalProcessPreserved belongs to the output, not the input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('clear attached-mode runtime state and remove the injected McpBridge autoload') and immediately delimits its scope by naming what it does NOT do ('Does NOT stop the manually launched Godot process'). It explicitly distinguishes itself from siblings attach_project, run_project, and stop_project, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Use after attach_project when you are done driving the game'), the alternative for other cases ('For spawned sessions (run_project), use stop_project instead'), and notes it is 'mostly optional now' because the session auto-ends on disconnect. When-not/alternative guidance is fully present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnect_signalADestructive
Remove an existing signal connection between two nodes, persisting the change in the .tscn. Use get_node_signals first to confirm the connection exists; recovery requires reconnecting via connect_signal. Saves automatically. Returns a plain-text confirmation naming the disconnected signal and target. Errors if the connection does not exist. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | Method name on the target node | |
| signal | Yes | Signal name on the source node | |
| nodePath | Yes | Source node path from scene root | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory | |
| targetNodePath | Yes | Target node path from scene root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds far beyond that: it discloses persistence behavior ('persisting the change in the .tscn'), auto-save, the exact return format ('plain-text confirmation naming the disconnected signal and target'), two error conditions, and the runtime-session blocking condition with its workaround. Rich behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with the core action, then prerequisites, recovery, return, errors, and blocking condition. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 6-param mutation tool with no output schema, the description covers persistence, return format, error conditions, recovery, and the runtime-session blocker. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description alludes to 'two nodes' and a 'connection' but adds no syntax or format details beyond what the schema documents for each of the 6 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Remove an existing signal connection between two nodes') and distinguishes itself from siblings connect_signal and get_node_signals by naming both. An agent can identify the exact operation without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names get_node_signals as a prerequisite to confirm the connection exists, connect_signal as the recovery path, and stop_project/detach_project as the way to clear the runtime-blocking condition. Covers when to use, when it errors, and the alternative for recovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_nodeA
Duplicate a node and its descendants in a Godot scene, without rebuilding it node-by-node via add_node. newName defaults to the original name + "2"; targetParentPath defaults to the original parent. Saves automatically. Returns: success with originalPath and the newPath where the duplicate now lives. Errors if nodePath does not exist or targetParentPath cannot accept children. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| newName | No | Name for the duplicated node (default: original name + "2") | |
| nodePath | Yes | Node path from scene root to duplicate | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory | |
| targetParentPath | No | Parent node path for the duplicate (default: same parent as original) |
Output Schema
| Name | Required | Description |
|---|---|---|
| newPath | No | |
| success | No | |
| originalPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses automatic saving, default naming and parent behavior, return values (originalPath and newPath), error conditions, and the critical requirement that no Godot runtime session be active, naming stop_project and detach_project as remedies. This is strong, though it could mention reversibility or deeper semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, followed by defaults, return values, and error conditions. It is compact but includes some redundancy with the schema (defaults). Overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description needn't explain return values, yet it still summarizes them. It covers defaults, error cases, and a critical runtime prerequisite. For a mutation tool with no annotations, no output schema gaps, and complete parameter schema, this is fully adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters including defaults for newName and targetParentPath. The description repeats those defaults but adds no extra syntax or format details beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Duplicate a node and its descendants in a Godot scene') and explicitly contrasts itself with the node-by-node approach via add_node. This clearly distinguishes it from siblings like add_node.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by contrasting with add_node and explaining default behavior for newName and targetParentPath. It also defines error conditions (nodePath nonexistent, targetParentPath invalid) and runtime session conflicts. However, it doesn't explicitly state when to prefer this over other siblings beyond add_node.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_mesh_libraryADestructive
Export a scene of MeshInstance3D nodes as a MeshLibrary .res file for use in GridMap. For grid-based 3D tile palettes only, not 2D scenes. Source scene must contain MeshInstance3D children. Pass meshItemNames for a subset, or omit for all. Saves to outputPath, overwriting silently. Returns a plain-text confirmation with the exported item count. Errors if the scene contains no valid meshes. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| scenePath | Yes | Scene file path relative to the project | |
| outputPath | Yes | Output path for the MeshLibrary .res file (relative to project) | |
| projectPath | Yes | Path to the Godot project directory | |
| meshItemNames | No | Names of specific mesh items to export. Omit to export all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description goes far beyond by disclosing silent overwrite of outputPath, both error conditions (no valid meshes, active runtime session), the return format, and how to clear the session blocker. This is rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences, zero filler, with the core purpose and the 3D-only constraint front-loaded before parameters and error/return behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return format and count, covers error paths, prerequisite session state, and overwrite risk. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the parameters are self-documented, but the description still adds semantics the schema lacks: outputPath is overwritten silently and meshItemNames defines a subset vs. all-export behavior. It stops short of adding format detail on scenePath/projectPath.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Export a scene of MeshInstance3D nodes as a MeshLibrary .res file') and immediately scopes it ('For grid-based 3D tile palettes only, not 2D scenes'), which sharply distinguishes it from the many scene-manipulation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (grid-based 3D tile palettes), when-not (2D scenes), and prerequisite alternatives ('stop_project (or detach_project) clears it'). The routing to sibling tools for the runtime-session blocker is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_debug_outputARead-only
Get captured stdout/stderr from a spawned Godot project. Use whenever runtime tools fail unexpectedly - script errors, missing nodes, and crash backtraces all surface here. Still works after the process exits or crashes: the session clears itself on exit but the captured logs are retained until stop_project. Requires run_project (not attach_project; attached mode does not capture output). Returns: output/errors (last limit lines each, default 200), running (false after exit, null when attached), exitCode after exit, attached:true with empty arrays in attached mode.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max lines to return (default: 200, from end of output) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | |
| errors | No | |
| output | No | |
| running | No | |
| attached | No | |
| exitCode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnlyHint=true annotation: it discloses that captured logs survive process exit and crashes, that the session clears itself on exit, that logs are retained until stop_project, and that attached mode yields empty arrays with running=null. These are exactly the lifecycle and edge-case behaviors an agent needs and cannot get from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then usage trigger, then lifecycle caveats, then return shape in tight successive sentences. Despite being relatively long, every clause carries distinct operational information - no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers prerequisite tooling, retention semantics, post-crash retrieval, attached-mode behavior, and return-field semantics. Even though an output schema exists (making the return-value prose partly redundant), the description leaves no gap an agent needs filled before calling it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter at 100% schema coverage, the baseline is 3. The description restates the default of 200 and adds that it applies per-array ('last limit lines each'), which mildly enriches the schema's 'from end of output' wording, but it does not introduce new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get captured stdout/stderr from a spawned Godot project') and immediately scopes it to runtime diagnostics. It is clearly distinguishable from siblings like run_project, stop_project, and the editor/profiling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to reach for it ('whenever runtime tools fail unexpectedly - script errors, missing nodes, and crash backtraces all surface here') and names a hard prerequisite and its alternative ('Requires run_project (not attach_project; attached mode does not capture output)'). Both the trigger condition and the exclusion are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_node_propertiesARead-only
Read one or more nodes' current property values from a scene file in a single Godot process. Always-array: pass a single-element nodes array for one-off reads. Per-node changedOnly:true filters out properties matching class defaults (useful for compact diffs). Returns: { results: [{ nodePath, nodeType, properties?, error? }] }; failed reads include error and omit properties.
| Name | Required | Description | Default |
|---|---|---|---|
| nodes | Yes | Nodes to read properties from | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint:true, consistent with 'Read'. The description adds the return format structure and error behavior, which goes beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with four sentences, each providing essential information. It front-loads the purpose and packs in behavior, input nuance, and return format without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers the return shape, error handling, and parameter details. It could mention potential errors or scenarios, but it is sufficient for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by explaining the 'always-array' behavior for the nodes parameter and the semantics of 'changedOnly:true', which clarifies the parameter usage beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Read one or more nodes' current property values', providing a clear verb and resource. It distinguishes from siblings like 'set_node_properties' and 'get_node_signals' through its specific focus on property values and its 'always-array' behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers usage tips such as passing a single-element array for one-off reads and using 'changedOnly:true'. However, it does not compare with siblings like 'get_node_signals' or 'get_scene_tree', nor does it specify when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_node_signalsARead-only
List all signals defined on a node and their current connections. Use before connect_signal/disconnect_signal to verify signal/method names. The connections[].target field is already scene-root-relative in the "root/..." form connect_signal/disconnect_signal accept as targetNodePath (a self-connection reports as "root") - pass it straight through with no conversion. Returns: nodeType and signals[], each with name and current connections (signal/target/method). Errors if node not found.
| Name | Required | Description | Default |
|---|---|---|---|
| nodePath | Yes | Node path from scene root (e.g. "root/Button") | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory |
Output Schema
| Name | Required | Description |
|---|---|---|
| signals | No | |
| nodePath | No | |
| nodeType | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description goes further by disclosing that the connections[].target value is scene-root-relative, that 'root' means a self-connection, and that it errors when the node is not found. These are useful behavioral facts beyond the annotation, though return-shape detail is partly redundant with the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the routing guideline first, then adds format detail. Dense and mostly earned, though the path-format parenthetical is long enough to slightly strain readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with an output schema present, the description covers purpose, when to call it, the path-format quirk that could otherwise cause errors, and the error case. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value by tying the output's target field format to the targetNodePath argument that connect_signal/disconnect_signal accept, explaining that no path conversion is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: list signals defined on a node plus their current connections. It clearly distinguishes itself from connect_signal/disconnect_signal by describing a read/inspection role rather than a mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it 'before connect_signal/disconnect_signal to verify signal/method names', naming both alternatives and the condition that selects this tool. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_filesARead-only
Return a recursive file tree of a Godot project. Use to discover project structure when paths are unknown. Pass extensions to filter (e.g. ["gd","tscn"]); maxDepth caps recursion (-1 unlimited). Skips hidden (dot-prefixed) entries and the .mcp directory. Returns: { name, type, path, extension?, children? } (nested tree).
| Name | Required | Description | Default |
|---|---|---|---|
| maxDepth | No | Maximum recursion depth. -1 means unlimited (default: -1) | |
| extensions | No | Filter to only these file extensions (e.g. ["gd", "tscn"]). Omit to include all. | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds transparency about skipped entries ('Skips hidden (dot-prefixed) entries and the .mcp directory') and the return type. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: first states the core purpose, second covers parameters and behaviors. It is front-loaded, with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description provides the return structure '{ name, type, path, extension?, children? } (nested tree)'. It also covers filtering and hidden entries. It is reasonably complete for a tool with 3 parameters, though could mention the default for maxDepth explicitly (already in schema).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description adds some value with examples (e.g., '["gd","tscn"]') and explains maxDepth behavior, but doesn't significantly exceed the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Return a recursive file tree of a Godot project' clearly states the verb and resource. It distinguishes from sibling tools like search_project by specifying 'Use to discover project structure when paths are unknown', making it clear when this tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use to discover project structure when paths are unknown' and explains parameters like extensions filter and maxDepth. However, it does not explicitly mention when not to use it or compare to siblings, so it is slightly below a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_settingsARead-only
Parse project.godot into structured JSON. Use to inspect configured display, input, rendering, etc. settings without launching Godot. Pass section to filter to one INI section (e.g. "display", "application"). Returns: { settings: { [section]: { [key]: value } } } or { settings: { [key]: value } } when section is given. Complex Godot types (including multi-line arrays/dicts, e.g. the full "[input]" action map) are returned as their complete raw string, not just the first line; keys outside any section appear under global.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Filter to a specific INI section (e.g. "display", "application"). Omit for all sections. | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description goes well beyond that: it documents the return shape, the raw-string treatment of complex Godot types (multi-line arrays/dicts, the input action map), and the __global__ bucket for keys outside any section. These are non-obvious behaviors an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then usage, then return contract. Every sentence carries information, though the return-format sentence is dense enough to require careful reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the return-value burden by specifying the two response shapes and the raw-string/__global__ edge cases. Nothing essential for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value by giving example section names and clarifying that omitting section returns all sections, and that out-of-section keys land under __global__. It slightly exceeds the schema's documentation of the same fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Parse project.godot into structured JSON') and scopes it to reading configuration settings without launching Godot. This clearly separates it from siblings like get_project_info and get_project_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use it ('inspect configured display, input, rendering, etc. settings without launching Godot') and how to narrow with section. It does not name an alternative tool or state when not to use it, so it falls short of an explicit routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scene_dependenciesARead-only
Parse a .tscn file for ext_resource references (scripts, textures, subscenes). Use to inspect what a scene depends on before refactoring or moving files. Returns: the queried scene path and dependencies[] from ext_resource refs (path, type, optional uid). Errors if scene file does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| scenePath | Yes | Path to the .tscn file relative to the project root (e.g. "scenes/main.tscn") | |
| projectPath | Yes | Path to the Godot project directory |
Output Schema
| Name | Required | Description |
|---|---|---|
| scene | No | |
| dependencies | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and description adds details about return values (path, type, uid) and error condition (file missing). No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. Purpose first, then usage guidance, then return info. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema is described in prose (path, dependencies array with type and uid). Tool is simple and description covers behavior, inputs, and outputs adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers both parameters (projectPath, scenePath) with full descriptions. The description adds no further parameter-level context beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states it parses .tscn files for ext_resource references (scripts, textures, subscenes). Action and resource are clear. Distinct from sibling tools like add_node or get_scene_tree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states 'Use to inspect what a scene depends on before refactoring or moving files.' Provides context but does not explicitly exclude alternatives or mention when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scene_treeARead-only
Get the scene hierarchy as a nested tree of { name, type, path, script, children }. Use maxDepth:1 for a shallow listing of direct children only; default -1 returns the full tree. parentPath scopes the result to a subtree. Returns the nested tree as JSON text. Errors if scene does not exist or parentPath is not found.
| Name | Required | Description | Default |
|---|---|---|---|
| maxDepth | No | Maximum recursion depth. -1 for unlimited (default: -1). 1 returns only direct children. | |
| scenePath | Yes | Scene file path relative to the project | |
| parentPath | No | Scope to a subtree starting at this node path (e.g. "root/Player") | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true; description adds that it returns JSON text and errors on non-existent scene or path. This provides useful behavioral context beyond annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each adding distinct value: output definition, parameter usage, and error conditions. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the return format as JSON text. It covers errors and parameter effects. Could optionally mention performance implications for deep trees, but this is sufficient for a read-only utility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds meaning by explaining the effect of maxDepth values and parentPath scoping, as well as the nested structure returned. This compensates adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the tool retrieves a scene hierarchy as a nested tree with specific fields (name, type, path, script, children). It distinguishes itself from sibling tools like get_node_properties and get_debug_output by focusing on hierarchical structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on using maxDepth for shallow vs full tree and parentPath for subtree scoping. It implies when to use each parameter but does not explicitly state when not to use the tool, though the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ui_elementsARead-only
Walk the running scene tree and return all Control nodes with positions, sizes, types, and text content. Always call this before simulate_input click_element actions to discover valid element names and paths. Requires an active runtime session (run_project or attach_project). visibleOnly defaults true; pass false to include hidden Controls. filter narrows by class. Returns: elements[] with path/type/rect/visible plus optional text/disabled/tooltip.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter by Control node type (e.g. "Button", "Label", "LineEdit") | |
| visibleOnly | No | Only return nodes where Control.visible is true (default: true). Set false to include hidden elements. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | |
| elements | No | |
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only. The description adds details on default behavior (visibleOnly defaults true), optional parameters (filter narrows by class), and return fields (path, type, rect, visible, plus optional text/disabled/tooltip). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with no wasted sentences. It covers purpose, usage, prerequisites, parameter behavior, and return format efficiently. Each sentence serves a distinct purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional parameters with output schema), the description fully covers what the tool does, when to use it, prerequisites, parameter details, and return structure. It is complete without extending beyond necessary information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage for both parameters. The description reinforces the schema by stating defaults (visibleOnly defaults true) and explaining filter narrows by class, adding value beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool walks the running scene tree to return Control nodes with positions, sizes, types, and text content. It distinguishes from siblings by specifying it should be called before simulate_input actions, setting it apart from other get tools like get_scene_tree or get_node_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance to call this before simulate_input for discovering element names and paths. It also states the prerequisite of an active runtime session, implicitly indicating when not to use. However, it lacks explicit alternatives or situations to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launch_editorA
Open the Godot editor GUI for a project for the human user. Use only when the user explicitly asks to "open the editor"; for any agent-driven work, use the headless scene/node tools (add_node, set_node_properties, etc.) instead - the editor cannot be controlled programmatically. Returns plain-text confirmation after spawning the editor process. Errors if projectPath has no project.godot.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does most of it well: it discloses that the editor cannot be controlled programmatically, that it returns plain-text confirmation after spawning the process, and that it errors when projectPath lacks project.godot. It does not say whether the call blocks until the editor closes or how the spawned process is later managed, which is the main remaining gap for a process-spawning tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler; the primary purpose is front-loaded, followed by the routing rule and then the return/error contract. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers purpose, exclusions, alternatives, return type, and the failure condition. An agent has everything needed to decide whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100% for the single projectPath parameter, so the baseline is 3. The description adds real constraint semantics beyond the schema by stating the directory must contain project.godot or the call errors, which tells the agent how to validate the path before invoking.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open the Godot editor GUI for a project for the human user') and scopes it to the human user, which immediately separates it from the agent-driven siblings like add_node and set_node_properties. An agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when ('only when the user explicitly asks to "open the editor"') and an explicit when-not with named alternatives ('for any agent-driven work, use the headless scene/node tools (add_node, set_node_properties, etc.)'). Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_autoloadsARead-only
List all registered autoloads in a project with paths and singleton status. Use first when diagnosing headless failures - broken autoloads crash all headless ops, so this tells you what is loaded. No Godot process required (reads project.godot directly). Returns: [{ name, path, singleton }].
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds valuable behavioral context not in annotations: it requires no Godot process and reads project.godot directly, and it explains the consequence of broken autoloads. It could go further on failure/error behavior, but this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then why to use it, then operational notes, then return shape. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description includes a return shape '[{ name, path, singleton }]' and covers usage rationale, operational requirements, and data source. It is complete enough for an agent to call and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single projectPath parameter is fully documented in the schema. The description adds that no Godot process is needed, implying the call is lightweight and file-based, which is useful context beyond the parameter type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List all registered autoloads in a project') and adds scope details (paths, singleton status). It distinguishes itself from siblings like add_autoload/remove_autoload/update_autoload by being the read/list operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use first when diagnosing headless failures' and explains why (broken autoloads crash all headless ops). This tells the agent exactly when this tool is the right first step, which is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsARead-only
Find Godot projects under a directory by locating project.godot files. Use to discover available projects when the user has not specified one; for inspecting a known project, use check_project. recursive:true descends into subdirectories (skipping hidden ones); default false checks only the directory itself and its immediate children. Returns: [{ path, name }], empty array on no matches.
| Name | Required | Description | Default |
|---|---|---|---|
| directory | Yes | Directory to search for Godot projects | |
| recursive | No | Whether to search recursively (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates a safe read operation, and the description adds meaningful behavioral nuance beyond it: recursive descent skips hidden directories, default behavior checks only the directory and immediate children, and an empty array is returned when no matches exist. This is solid behavioral disclosure for a read-only discovery tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then covers usage distinction, recursion behavior, and return format in just three sentences. Every sentence earns its place with no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only discovery tool with two well-documented parameters and no output schema, the description is complete: it states input behavior, edge cases (hidden dirs, no matches), and the exact return shape. The agent has all necessary information to invoke the tool correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds value by explaining the semantic effect of recursive=true versus the default, including hidden-directory skipping. The directory parameter could use a little more elaboration, but the recursive parameter is meaningfully enriched beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: finding Godot projects by locating project.godot files. It also explicitly differentiates from check_project ('for inspecting a known project, use check_project'), resolving a key sibling ambiguity. The return shape is included, which further sharpens purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool: 'Use to discover available projects when the user has not specified one.' It also gives an exclusion and an alternative: for inspecting a known project, use check_project. Recursion behavior is also defined, removing any need for the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_spriteAIdempotent
Set the texture on an existing Sprite2D, Sprite3D, or TextureRect node. For new nodes, pass texture via add_node properties instead. Saves automatically. texturePath must be a real file under projectPath. Returns a plain-text confirmation message naming the loaded texture. Errors if the node is not one of those three classes, or the texture file does not exist. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| nodePath | Yes | Path to the target node from scene root (e.g. "root/Player/Sprite2D") | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory | |
| texturePath | Yes | Path to the texture file relative to the project (e.g. "assets/player.png") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond idempotentHint, the description discloses automatic saving, the plain-text confirmation return, error conditions for invalid node class and missing texture file, and a runtime-session conflict with the clearing alternatives. This is rich behavioral context that an agent cannot infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary action and supported node types. Every sentence adds operational value: sibling routing, save behavior, return format, error cases, and runtime conflict handling, with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation-style tool with only idempotentHint annotations and no output schema, the description supplies the missing context an agent needs: automatic save, confirmation return, supported node classes, texture path validation, and runtime session errors. Nothing essential for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters. The description adds useful constraints beyond the schema: texturePath must be a real file under projectPath, and nodePath must target one of three specific node classes. It does not elaborate every parameter, but the added validation semantics are meaningful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: set the texture on an existing Sprite2D, Sprite3D, or TextureRect node. It names the exact node classes and distinguishes the tool from add_node by explaining that new nodes should receive textures through add_node properties instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool (existing supported nodes) and when not to use it (new nodes, where add_node properties should be used). It also gives a runtime-session constraint and names stop_project and detach_project as ways to clear that blocker.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_projectA
Capture a window of Godot's function profiler - the editor's Profiler tab numbers. Requires run_project with profiling: true. Blocks for seconds (default 5). Times are elapsed, not CPU; inclusive rows overlap - never sum totalMs. Returns: rows (function, file, line, calls, selfMs/totalMs, per-frame averages, percentOfFrame, peak), the frame budget, servers, worstFrame, plus frames/frameGaps/limitReached for capture quality. Errors if profiling was off at launch or a capture is already open.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many functions to return, 1..100 (default: 20). | |
| sort | No | Rank by own time ("selfMs", default), inclusive time ("totalMs"), or invocation count ("calls"). | |
| seconds | No | Capture duration in seconds, greater than 0 and at most 60 (default: 5). | |
| captureLimit | No | Rows the engine puts in each frame packet, 16..512 (default: 512). Godot selects them by inclusive time, so a lower limit hides cheap functions and sets limitReached. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | |
| sort | No | |
| frame | No | |
| frames | No | |
| seconds | No | |
| servers | No | |
| frameGaps | No | |
| lastFrame | No | |
| firstFrame | No | |
| worstFrame | No | |
| captureLimit | No | |
| limitReached | No | |
| framesReceived | No | |
| functionsReceived | No | |
| undecodablePackets | No | |
| unresolvedFunctions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false) by disclosing blocking behavior ("Blocks for `seconds`"), the default capture length, error preconditions, and a crucial measurement caveat: times are elapsed not CPU and inclusive rows overlap so totalMs must never be summed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose, prerequisite, blocking duration, and the key measurement warning come first, with return details last. It is long for a single paragraph but nearly every clause carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description summarizes the return payload (rows, frame budget, servers, worstFrame, frames/frameGaps/limitReached) and flags interpretation pitfalls, so an agent has everything needed to call and read the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters; the baseline would be 3. The description adds genuine meaning on top by explaining that `seconds` is a blocking capture window and that `captureLimit` causes Godot to select rows by inclusive time, hiding cheap functions and setting limitReached.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource: "Capture a window of Godot's function profiler - the editor's Profiler tab numbers." It clearly differentiates this sampling tool from the start_profiler/stop_profiler siblings by describing a bounded capture window with returned data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite explicitly ("Requires run_project with profiling: true") and gives failure conditions ("Errors if profiling was off at launch or a capture is already open"), which is strong when-to-use guidance. It does not explicitly contrast with start_profiler/stop_profiler, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_autoloadADestructive
Unregister an autoload from a project by name. Use to recover from a broken autoload that is crashing headless ops. No Godot process required. Returns plain-text confirmation on success. Errors if no autoload with that name exists.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | Yes | Path to the Godot project directory | |
| autoloadName | Yes | Name of the autoload to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavioral traits beyond the 'destructiveHint' annotation: it states that no Godot process is required, returns a plain-text confirmation, and errors if the autoload name does not exist. This adds valuable context for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only three sentences, all front-loaded with the action. Every sentence adds value: the purpose, a use case, operational detail, and error behavior. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with annotations and no output schema, the description is complete. It covers the action, when to use it (broken autoloads), operational constraints (no Godot process), return type, and error case. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for both parameters (projectPath, autoloadName). The description adds no extra meaning beyond what the schema already provides; the parameter names and schema descriptions are self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Unregister an autoload from a project by name,' which is a specific verb+resource combination. It clearly distinguishes the tool from siblings like 'add_autoload' and 'list_autoloads' by focusing on removal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete usage scenario: 'Use to recover from a broken autoload that is crashing headless ops.' This guides the agent on when to invoke the tool, though it does not explicitly mention when not to use it or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_projectADestructive
Spawn a Godot project as a child process with stdout/stderr captured. Required before take_screenshot, simulate_input, get_ui_elements, run_script, or get_debug_output. Set profiling: true at launch to enable the profiler tools. Use attach_project for one you launched yourself. Verifies MCP bridge readiness before returning success. Returns status with the assigned bridge port. Call stop_project when done. Errors if projectPath is not a Godot project or another session is already active.
| Name | Required | Description | Default |
|---|---|---|---|
| scene | No | Scene to run (path relative to project, e.g. "scenes/main.tscn"). Omit to use the project's main scene. | |
| profiling | No | Attach Godot's own remote debugger so profile_project, start_profiler and stop_profiler can measure this session. Must be set at launch - a session already running cannot be profiled - and costs a little runtime overhead. | |
| background | No | If true, hides the Godot window off-screen and blocks all physical keyboard and mouse input, while keeping programmatic input (simulate_input, run_script) and screenshots fully active. Useful for automated agent-driven testing where the window should not be visible or interactive. | |
| bridgePort | No | TCP port for the MCP bridge. Omit to auto-select a free port (recommended). The chosen port is baked into the project's `mcp_bridge.gd` at inject time, so the running Godot listens on exactly this port. | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true, and the description adds rich behavioral context: stdout/stderr capture, MCP bridge readiness verification, port assignment, and explicit error conditions. It also warns that profiling must be set at launch and explains the background mode's effect on input and visibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: it starts with the core action, then dependencies, then optional features, and ends with cleanup and error conditions. Every sentence carries essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, no output schema), the description covers all critical aspects: prerequisites, side effects, profiling constraints, bridge port assignment, and error cases. It leaves no significant gaps for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds meaning by stating that profiling must be set at launch and that bridgePort is baked into mcp_bridge.gd. However, it does not elaborate on the scene, background, or projectPath parameters beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action ('Spawn a Godot project as a child process') and clarifies it as a prerequisite for multiple sibling tools, making its role unmistakable. It also distinguishes itself from attach_project by scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when to use this tool versus attach_project, specifies required predecessor relationships (must be called before take_screenshot, simulate_input, etc.), and provides a clear 'call stop_project when done' directive. The profiling parameter is linked to enabling profiler tools, and error conditions (invalid projectPath, active session) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scriptADestructive
Execute a custom GDScript in the live running project with full scene tree access. Requires an active runtime session. Script must extend RefCounted and define func execute(scene_tree: SceneTree) -> Variant. Return values are JSON-serialized (primitives, Vector2/3, Color, Dictionary, Array, and Node path strings). Use print() for debug output - it appears in get_debug_output, not in the result. In spawned mode, stderr runtime errors escalate to errors (when the script returns null) or surface as warnings. Returns: { success, result, warnings?, tip? } where result is the JSON-serialized return value of execute().
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | GDScript source code. Must contain "extends RefCounted" and "func execute(scene_tree: SceneTree) -> Variant". | |
| timeout | No | Timeout in ms (default: 30000). Increase for long-running scripts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | |
| result | No | |
| success | No | |
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=true given, the description carries real weight: it discloses the runtime-session requirement, that print() output is routed to get_debug_output rather than the result, that stderr errors escalate to errors or warnings depending on the return value, and the exact response envelope. This is unusually rich behavioral context that the annotation alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded: purpose first, then precondition, then script contract, then output routing and envelope. It is dense but every sentence carries distinct payload; the only minor cost is a slightly long middle section on return-type serialization.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool that executes arbitrary code with full scene-tree access, the description covers the precondition, the script contract, side-channel output routing, error semantics, and the response shape. Even though an output schema exists, the added framing of success/result/warnings/tip is appropriate rather than redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description goes further by specifying the script's structural contract (extends RefCounted, func execute(scene_tree: SceneTree) -> Variant) and enumerating which return types survive JSON serialization. That adds genuine meaning for constructing a valid parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a precise verb+resource+scope: 'Execute a custom GDScript in the live running project with full scene tree access.' This clearly separates it from read/query siblings like get_scene_tree or get_debug_output and from static-analysis siblings like validate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a hard precondition ('Requires an active runtime session') and explains mode-specific behavior (spawned mode error escalation), which tells the agent when this tool is applicable. It does not name an explicit alternative tool for when no runtime session exists, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_sceneAIdempotent
Re-pack and save a scene, optionally to a different path (save-as). Most mutations (add_node, set_node_properties, delete_nodes, etc.) auto-save - only use this for save-as via newPath, or to re-canonicalize a hand-edited .tscn. Overwrites silently. Returns a plain-text confirmation naming the save path. Errors if the scene file does not exist. Errors while a Godot runtime session is active on this project; stop_project (or detach_project) clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| newPath | No | Save to a different path (relative to project) instead of overwriting the original | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply idempotentHint, so the description carries the rest and does so well: it discloses silent overwrite, the plain-text confirmation return, an error when the scene file is absent, and a runtime-session precondition with the remedy. That is beyond what any structured field provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then constraints, then the runtime precondition. Dense but essentially every clause carries load; the only slight excess is stacking four separate constraint sentences where a tighter grouping would read faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema and minimal annotations, the description covers purpose, alternatives, overwrite semantics, return value, and both error conditions. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by framing newPath as "save-as" and contrasting it with the default overwrite, which tells the agent why the optional parameter exists rather than just what type it takes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Re-pack and save a scene") and immediately scopes it, distinguishing save-as from the auto-saving mutations named later (add_node, set_node_properties, delete_nodes). An agent can tell this apart from create_scene and the mutation siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when NOT to use it ("Most mutations ... auto-save - only use this for save-as via newPath, or to re-canonicalize a hand-edited .tscn") and names the precondition-clearing tools (stop_project, detach_project). This is exactly the when/when-not/alternative guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_projectARead-only
Plain-text (substring) search across project files. Use to find references, callers, or signatures across the codebase. Default fileTypes is ["gd","tscn","cs","gdshader"]; caseSensitive default false; maxResults default 100. Skips hidden entries and the .mcp directory. Returns: matches[] (project-relative file, 1-indexed lineNumber, line text) and truncated:true when maxResults was hit - consider raising it.
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Plain-text string to search for | |
| fileTypes | No | File extensions to search (default: ["gd", "tscn", "cs", "gdshader"]) | |
| maxResults | No | Maximum matches to return (default: 100) | |
| projectPath | Yes | Path to the Godot project directory | |
| caseSensitive | No | Case-sensitive search (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| matches | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations state readOnlyHint=true, so the description's addition of default values, hidden-entry skipping, and .mcp directory exclusion adds useful behavioral context. It also mentions truncation behavior, which is beyond annotations and helps set expectations for large result sets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then packs details into a compact paragraph. Every sentence carries information, though the default-value repetition is slightly redundant. Structure is efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be detailed, but the description still summarizes matches[] format and truncation, which is helpful. Combined with annotations covering safety, the description is nearly complete, missing only explicit when-not-to-use guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description repeats defaults for fileTypes, caseSensitive, and maxResults, which is redundant but not harmful. It adds no syntax or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb+resource ('Plain-text (substring) search across project files') and clarifies scope by naming example targets (references, callers, signatures). This distinguishes it from siblings like get_project_files or get_scene_dependencies, which enumerate rather than search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('to find references, callers, or signatures across the codebase'), which implies when to use it. No explicit exclusions or named alternatives, but the context is sufficient for an agent to distinguish use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_node_propertiesAIdempotent
Set one or more node properties on a scene in one Godot process. Always-array: pass a single-element updates array for one-off edits. Values are checked against the property's declared type and error instead of silently storing that type's zero value. Object-typed properties (e.g. CollisionShape2D.shape) take a res:// path, a {type: ClassName, ...props} dict that builds a Resource inline, or null to clear; slash-suffixed keys like shader_parameter/ go inside that dict, not on the node. Value coercion, Packed*Array/Array[T] element rules and error details: Property Values in docs/tools.md. Saves once at the end. Returns: results[] with one entry per update in input order (success or error). Errors while a Godot runtime session is active; stop_project or detach_project clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes | Property updates to apply | |
| scenePath | Yes | Scene file path relative to the project | |
| projectPath | Yes | Path to the Godot project directory | |
| abortOnError | No | Stop processing on first error (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the idempotentHint annotation, the description richly discloses behavior: values are type-checked and error instead of silently defaulting, object-typed properties accept paths/resources/null, saves happen once at the end, and runtime-session errors are cleared by stop_project or detach_project. This gives strong insight into side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes necessary operational detail. Key purpose and array convention are front-loaded, and later sentences efficiently cover resource values, coercion, errors, and return shape without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is complete: it covers parameters, value semantics, error behavior, return format, and interaction with runtime sessions. The output schema exists, so not restating return structure is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even with 100% schema coverage, the description adds substantial meaning: the always-array convention, object-typed property value forms, slash-suffixed shader_parameter keys, and the type-checking/error semantics. These details go well beyond the input schema's basic property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with "Set one or more node properties on a scene in one Godot process," which names a specific verb, resource, and scope. This clearly distinguishes the tool from siblings like get_node_properties or add_node.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage context: "Always-array: pass a single-element updates array for one-off edits" and explains error behavior during active runtime sessions. It does not explicitly name alternative tools or exclusion conditions, but the guidance is clear enough for selecting it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_inputADestructive
Simulate sequential input in a running project and report what each action did. Action type: key, mouse_button, mouse_motion, click_element, action, text, wait. For key/mouse_button/action, omit pressed to tap (press+release); set it to hold or release. click_element resolves by node path/name (see get_ui_elements), not visible text. Returns: results[] per action with ok, timing, signals fired, the Control hit, UI changes (appeared/disappeared/changed), watch samples, and errors from input handlers (spawned sessions only). Invalid batches inject nothing; a runtime failure stops the batch and skips the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| watch | No | Godot NodePath:property strings sampled after every action and reported per result, e.g. "/root/Main/Player:position". Property subnames are allowed ("/root/Main/Player:position:x"). Read-only; an unresolvable path samples as null instead of failing the batch. | |
| actions | Yes | Array of input actions to execute sequentially. Each object must have a "type" field. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No | One entry per requested action, in order. |
| success | No | False when an action failed and the remaining actions were skipped. |
| still_held | No | Inputs this batch pressed and did not release, e.g. "key:W", "action:jump". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true. The description adds significant behavior beyond that: it explains that invalid batches inject nothing, that a runtime failure stops the batch and skips the rest, and it details the result structure (ok, timing, signals, Control hit, changes, watch samples, errors). This goes well beyond the annotation's simple hint and gives the agent a realistic picture of side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but organized: it leads with purpose, then lists action types, gives key behavioral notes, and closes with return and failure handling. It is long but every clause earns its place. Minor structural improvement would be bullet lists for the action specifics, but it's already front-loaded and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two parameters, nested action objects, many conditional fields), the description covers the essential operational aspects: sequential execution, action types, return contents, failure behavior, and the get_ui_elements cross-reference for node resolution. It also mentions the watch sampling mechanism. It does not explicitly state that the project must already be running, but that is implied by 'running project' in the first sentence and by the tool's purpose. An output schema exists, so the return summary is a bonus rather than a necessity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add much parameter-level meaning beyond what the schema already provides; it summarizes action types and repeats the 'omit pressed to tap' rule, but the schema itself already explains each parameter in detail. It adds no new semantic insight beyond the overview, so it stays at baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Simulate sequential input in a running project and report what each action did,' which states a specific verb (simulate), resource (running project), and outcome (report). It enumerates the supported action types, making it immediately distinct from sibling tools like run_script or run_project, and clarifies that it interacts with a running project rather than editing it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong guidance on parameter usage (e.g., 'omit `pressed` to tap', 'click_element resolves by node path/name (see get_ui_elements)'), and warns about long waits being cut off. However, it does not explicitly contrast itself with alternatives or state when it should be preferred over similar tools, leaving the when-to-use-vs-others partly implicit. It provides no exclusions or 'do not use when' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_profilerA
Start a profiler capture and return immediately, so simulate_input, run_script and screenshots can drive the game while it records. Requires run_project with profiling: true. Stops itself after seconds (default 30, max 60); call stop_profiler for the results. Returns: active, firstFrame, captureLimit, maxSeconds. Use profile_project instead for an unattended window. Errors if a capture is already running or profiling was not enabled at launch.
| Name | Required | Description | Default |
|---|---|---|---|
| seconds | No | Maximum capture duration before the automatic stop, greater than 0 and at most 60 (default: 30). | |
| captureLimit | No | Rows the engine puts in each frame packet, 16..512 (default: 512). Godot selects them by inclusive time, so a lower limit hides cheap functions and sets limitReached. |
Output Schema
| Name | Required | Description |
|---|---|---|
| active | No | |
| firstFrame | No | |
| maxSeconds | No | |
| captureLimit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors beyond the annotations: it returns immediately, stops itself after `seconds`, requires prior profiling setup, errors under specific conditions, and returns a defined set of fields. Annotations only say readOnlyHint=false and destructiveHint=false, so the description carries the behavioral burden and does so thoroughly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but information-dense. Every sentence earns its place: what the tool does, why it returns immediately, prerequisites, auto-stop behavior, related tools, return values, and error conditions. It is front-loaded with the core purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full input schema and output schema, the description still adds essential context: how this tool fits into an interactive capture workflow, how to retrieve results, prerequisites, alternatives, and failure modes. An agent has everything needed to decide whether to call it and how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already fully documents `seconds` and `captureLimit`. The description mentions `seconds` with its default and max, but this repeats the schema rather than adding new meaning. There is some value in listing returned fields, but that is output semantics rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Start a profiler capture and return immediately.' It also differentiates itself from siblings by explicitly naming profile_project for unattended windows and stop_profiler for retrieving results, so an agent can distinguish it without opening other tool schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage conditions are explicit: it requires run_project with profiling: true, errors if a capture is already running or profiling was not enabled, and tells the agent to use profile_project instead for an unattended window. This is strong when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_profilerA
Stop the capture started by start_profiler and rank the recorded functions; a capture that already hit its time limit is read back as-is, and can be re-read with a different sort. Times are elapsed, not CPU; inclusive rows overlap - never sum totalMs. Returns: the same payload as profile_project - rows (file, line, function, calls, selfMs/totalMs, per-frame averages, percentOfFrame, peak frame), frame budget, servers, worstFrame, frames, frameGaps, limitReached. Errors if no capture was started.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many functions to return, 1..100 (default: 20). | |
| sort | No | Rank by own time ("selfMs", default), inclusive time ("totalMs"), or invocation count ("calls"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | |
| sort | No | |
| frame | No | |
| frames | No | |
| seconds | No | |
| servers | No | |
| frameGaps | No | |
| lastFrame | No | |
| firstFrame | No | |
| worstFrame | No | |
| captureLimit | No | |
| limitReached | No | |
| framesReceived | No | |
| functionsReceived | No | |
| undecodablePackets | No | |
| unresolvedFunctions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false/destructiveHint=false in annotations, the description carries real behavioral weight: it clarifies that stopping may just read back an expired capture, that results can be re-fetched with a different sort, that times are elapsed not CPU, that inclusive rows overlap and must not be summed, and that it errors when nothing was started.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the action leads, then the read-back caveats, then the return payload list. Every clause carries information, though the enumerated return fields are somewhat long for a tool that has an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the no-capture error case, the elapsed-vs-CPU timing caveat, the non-summing warning for inclusive rows, and the return shape, so an agent can invoke and interpret results correctly without additional sources.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by tying 'sort' to re-reading the same capture and by contrasting selfMs (own time) vs totalMs (inclusive) vs calls, which is directly the semantic distinction the sort enum encodes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Stop the capture started by start_profiler and rank the recorded functions') and names the sibling that creates the capture, so the agent can distinguish it from start_profiler/profile_project immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the read-back semantics: a capture that hit its time limit is read as-is and can be re-read with a different sort, plus the failure condition (errors if no capture was started). It stops short of an explicit when-not/alternative routing, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_projectADestructive
Stop the spawned Godot project and clean up bridge state. Call when done with runtime testing, even after a crash, and even if you closed the Godot window yourself: it frees the process slot and clears the flag blocking scene-editing tools. A process that exited on its own already removed the bridge autoload at that moment, and this still succeeds - it reports alreadyExited:true with the exit code and the logs captured before the exit, and leaves a finished profiler capture readable. Attached sessions detach without killing the external process. Returns: message, mode, externalProcessPreserved, alreadyExited, exitCode (already-exited case), and condensed finalOutput/finalErrors (capped at 200); get_debug_output has the full log. Errors only when there is no session and no exited process to report.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| message | No | |
| exitCode | No | |
| finalErrors | No | |
| finalOutput | No | |
| alreadyExited | No | |
| externalProcessPreserved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true, but the description adds substantial context beyond that: it clears a flag blocking scene-editing tools, frees a process slot, reports alreadyExited:true with exit code and logs when the process self-exited, detaches attached sessions without killing the external process, and errors only when there is nothing to report. This is rich behavioral disclosure that goes well beyond the single annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then follows with usage conditions and return details. The sentence about already-exited behavior is long but dense with relevant information. The return-value enumeration ('message, mode, ...') is somewhat list-like but earns its place given the output schema exists and the description summarizes key fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description helpfully summarizes the key return fields (especially alreadyExited, exitCode, finalOutput) and explains the error condition. It covers lifecycle, cleanup side effects, and interaction with other tools. Complete for a zero-parameter lifecycle tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description does not need to document parameters, and correctly focuses on behavior instead. No param meaning is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Stop the spawned Godot project') and adds scope ('clean up bridge state'), clearly distinguishing it from siblings like detach_project (which detaches without killing) and stop_profiler. An agent can pick this over its neighbors without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Call when done with runtime testing, even after a crash, and even if you closed the Godot window yourself') and specifies the consequences of not calling. It also implicitly distinguishes from detach_project by noting attached sessions preserve the external process. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_screenshotARead-only
Capture a PNG of the running viewport. responseMode: preview (default - saves full PNG, returns bounded inline preview at 960x540), full (full inline PNG; use for small text or pixel-level inspection), path_only (saved-path only, no inline image). Saved under .mcp/godot-runtime/screenshots/ (persists after stop_project). Returns: inline image block (full/preview modes), plus path and size of the saved PNG; previewPath/previewSize in preview mode; warnings for non-fatal runtime errors. Errors if no session or bridge times out (default 10000ms).
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Timeout in milliseconds to wait for the screenshot (default: 10000) | |
| responseMode | No | Response payload mode. "preview" returns a bounded inline preview plus paths (default). "full" returns the full inline PNG. "path_only" returns paths only. | |
| previewMaxWidth | No | Maximum preview width in pixels when responseMode is "preview" (default: 960) | |
| previewMaxHeight | No | Maximum preview height in pixels when responseMode is "preview" (default: 540) |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | No | |
| size | No | |
| warnings | No | |
| previewPath | No | |
| previewSize | No | |
| responseMode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description adds substantial behavioral context beyond that: the file is persisted under .mcp/godot-runtime/screenshots/ and survives stop_project, warnings are emitted for non-fatal runtime errors, and it errors when there is no session or the bridge times out. This is rich disclosure for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action followed by mode semantics, persistence location, and error conditions. It is dense and somewhat long, but nearly every clause conveys actionable information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and the description still clarifies the return payload (inline image block, saved path/size, previewPath/previewSize, warnings) and failure modes. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description exceeds it by explaining what each responseMode actually produces (preview saves the full PNG but returns a bounded inline preview; path_only returns no image) and by justifying the full mode. It adds rationale and consequences beyond the schema's terse enum docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Capture a PNG of the running viewport.' No sibling tool captures images, so it is unambiguously distinguishable, and the subject (running viewport) scopes it precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear mode-selection guidance, notably 'full ... use for small text or pixel-level inspection', which tells the agent when a given mode is appropriate. It stops short of naming an alternative tool or stating when to avoid screenshots entirely, so it is strong context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_autoloadAIdempotent
Modify an existing autoload's path or singleton flag. Pass either or both - omitted fields keep their current value. Use instead of remove_autoload + add_autoload (single edit, no orphan window). No Godot process required. Returns plain-text confirmation on success. Errors if autoloadName is not registered.
| Name | Required | Description | Default |
|---|---|---|---|
| singleton | No | New singleton flag | |
| projectPath | Yes | Path to the Godot project directory | |
| autoloadName | Yes | Name of the autoload to update | |
| autoloadPath | No | New path to the script or scene |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply idempotentHint, so the description carries most of the burden and does so well: it discloses partial-update semantics (omitted fields retained), that no Godot process is required, the return shape (plain-text confirmation), and a concrete error condition (unregistered autoloadName). This is meaningful behavior beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences with no filler: purpose first, then parameter contract, then sibling routing, then operational notes. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return value; it also covers the error case and execution requirements for a 4-parameter mutation tool. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by explaining that autoloadPath and singleton are optional edits whose omission preserves current values, which is semantic meaning the schema alone does not convey. It does not add format or validation detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Modify an existing autoload') and enumerates exactly the mutable fields ('path or singleton flag'). It is clearly distinguishable from the sibling pair add_autoload and remove_autoload, which it explicitly contrasts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance with an alternative named: 'Use instead of remove_autoload + add_autoload (single edit, no orphan window).' It also states the partial-update contract ('Pass either or both - omitted fields keep their current value'), so nothing about invocation conditions is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateARead-only
Validate GDScript syntax or scene integrity using headless Godot. Use before attach_script or run_script to catch parse errors early. Give exactly one of scriptPath, source, or scenePath, or a targets array validated in one Godot process. Returns { valid, errors } for one target, { results: [{ target, valid, errors }] } for a batch. An errors entry is { line?, message } for a parse error, or { check, problem?, message } for a checks[] finding. checks requires scenePath and instantiates the scene, running each attached script's _init(). Any parse error yields valid:false.
| Name | Required | Description | Default |
|---|---|---|---|
| checks | No | [single, requires scenePath] Structural and signal-verification checks to run against the scene. Types: "structure" (validate node tree against a schema) and "signals" (verify signal connections and handler methods, optional nodePath scope). Merged into the errors array with a "check" discriminator. | |
| source | No | [single] Inline GDScript source code to validate. Written to a temporary file and validated against the project. | |
| targets | No | [batch] Array of targets to validate in a single Godot process. Each item must have exactly one of: scriptPath, source, or scenePath. | |
| scenePath | No | [single] Path to a .tscn scene file relative to the project to validate (e.g. "scenes/main.tscn") | |
| scriptPath | No | [single] Path to a .gd file relative to the project to validate (e.g. "scripts/player.gd") | |
| projectPath | Yes | Path to the Godot project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses exact return shapes for single and batch calls, the discriminated error entry format, and the non-obvious behavior that checks instantiate the scene and run each script's _init(). It also clarifies that any parse error yields valid:false. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, usage timing, input constraints, return formats, and special behavior are each covered once and in a logical order. It front-loads the core action before details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and six parameters, the description fully compensates by specifying single vs. batch result shapes, error entry variants, and check execution behavior. The only implicit point is that check findings likely also set valid:false, but this is reasonably inferable from the stated error structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All six parameters are already described in the schema, so baseline is 3. The description adds critical semantics the schema alone does not express: the mutually-exclusive one-of rule and the batch optimization of 'targets array validated in one Godot process.' This is meaningful but not a huge departure from the existing schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Validate GDScript syntax or scene integrity using headless Godot.' It clearly distinguishes the tool from siblings like run_script and check_project by naming their relationship ('Use before attach_script or run_script').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use before attach_script or run_script to catch parse errors early.' It also states the key input constraint ('Give exactly one of scriptPath, source, or scenePath, or a targets array'), preventing invalid calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v3.8.0- Changed
batch_scene_operations1 field changed- changed
Input schema / properties / operations / items / properties / updates / items / properties / value / descriptionPrevious value: -"New value. Vector2/Vector3/Color auto-convert from {\"x\",\"y\"} / {\"x\",\"y\",\"z\"} / {\"r\",\"g\",\"b\",\"a\"} objects; primitives pass through"New value: +"New value. Vector2/Vector3/Color auto-convert from {\"x\",\"y\"} / {\"x\",\"y\",\"z\"} / {\"r\",\"g\",\"b\",\"a\"} objects; primitives pass through. For Packed*Array properties, a plain array applies the same conversions element-wise (e.g. [{\"x\":10,\"y\":20}, ...] for Polygon2D.polygon); an element that cannot represent the packed element type errors instead of silently storing zeros."
- Added
check_project - Removed
get_project_info - Changed
set_node_properties1 field changed- changed
Input schema / properties / updates / items / properties / value / descriptionPrevious value: -"New property value"New value: +"New property value. Vector2/Vector3/Color auto-convert from {\"x\",\"y\"} / {\"x\",\"y\",\"z\"} / {\"r\",\"g\",\"b\",\"a\"} objects; primitives pass through. Packed*Array and script-declared Array[T] properties take a plain array and the element conversions apply per element (e.g. [{\"x\":10,\"y\":20}, ...] for Polygon2D.polygon); an element that cannot represent the element type errors with its index instead of silently storing zeros."
- Changed
simulate_input14 fields changed- added
Input schema / properties / actions / items / properties / framesAdded value: +{ + "description": "[wait] Deterministic pause of N engine process frames, for stepping game logic rather than waiting on the clock. Exactly one of ms or frames is required. Max 600, budgeted at a 10fps floor, so a wait of several hundred frames may be cut off by your client before the server answers.", + "type": "number" +} - added
Input schema / properties / actions / items / properties / hold_msAdded value: +{ + "description": "[key, mouse_button, action] Tap hold duration in milliseconds, overriding the default (one process frame plus one physics frame for key/action, zero gap for mouse_button). Use it for code polling is_action_pressed over real time. Rejected when pressed is also set. Max 10000.", + "type": "number" +} - changed
Input schema / properties / actions / items / properties / ms / descriptionPrevious value: -"[wait] Duration in milliseconds to pause before the next action (~16ms = one frame at 60fps)."New value: +"[wait] Real-time pause in milliseconds, for time-driven things such as cooldowns and animations (~16ms = one frame at 60fps). Exactly one of ms or frames is required. Uncapped, but a batch whose total wait approaches 60s may be cut off by your client before the server answers: split it across calls." - changed
Input schema / properties / actions / items / properties / pressed / descriptionPrevious value: -"[key, mouse_button, action] Whether the input is pressed (true) or released (false). For mouse_button: omit to auto-click (press+release in one action); set explicitly only for hold/release. For key: defaults to true and does NOT auto-release - emit a second action with pressed:false to release."New value: +"[key, mouse_button, action] Omit to tap: the action presses, holds briefly, and releases by itself. Set true to press and hold across later actions (reported in still_held), false to release an earlier hold. Cannot be combined with hold_ms." - changed
Input schema / properties / actions / items / properties / strength / descriptionPrevious value: -"[action] Action strength (0–1, default 1.0)"New value: +"[action] Action strength (0 to 1, default 1.0)" - added
Input schema / properties / actions / items / properties / textAdded value: +{ + "description": "[text] String to type into whatever Control currently holds focus, expanded to one key press+release per character. Fails when nothing holds focus - click or focus the LineEdit first. Max 1000 characters.", + "type": "string" +} - changed
Input schema / properties / actions / items / properties / type / enumPrevious value: -[ - "key", - "mouse_button", - "mouse_motion", - "click_element", - "action", - "wait" -]New value: +[ + "key", + "mouse_button", + "mouse_motion", + "click_element", + "action", + "text", + "wait" +] - added
Input schema / properties / watchAdded value: +{ + "description": "Godot NodePath:property strings sampled after every action and reported per result, e.g. \"/root/Main/Player:position\". Property subnames are allowed (\"/root/Main/Player:position:x\"). Read-only; an unresolvable path samples as null instead of failing the batch.", + "items": { + "type": "string" + }, + "maxItems": 16, + "type": "array" +} - removed
Output schema / properties / actions_processedRemoved value: -{ - "type": "number" -} - added
Output schema / properties / resultsAdded value: +{ + "description": "One entry per requested action, in order.", + "items": { + "properties": { + "changes": { + "properties": { + "appeared": { + "items": { + "type": "string" + }, + "type": "array" + }, + "changed": { + "items": { + "type": "object" + }, + "type": "array" + }, + "disappeared": { + "items": { + "type": "string" + }, + "type": "array" + }, + "focus": { + "type": "string" + }, + "scene": { + "type": "string" + }, + "truncated": { + "type": "number" + } + }, + "type": "object" + }, + "elapsed_ms": { + "description": "Milliseconds since batch start.", + "type": "number" + }, + "error": { + "type": "string" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "focus": { + "description": "Path of the focus owner after the action.", + "type": "string" + }, + "frame": { + "description": "Process frames elapsed since batch start.", + "type": "number" + }, + "hit": { + "description": "Path of the Control under the pointer after the action settled.", + "type": "string" + }, + "index": { + "type": "number" + }, + "ok": { + "type": "boolean" + }, + "position": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "type": "object" + }, + "pressed": { + "description": "Whether the input action is still held after this entry.", + "type": "boolean" + }, + "signals": { + "description": "Which of pressed, toggled, item_selected, text_submitted the target emitted within the settle frame. A signal emitted later (call_deferred, a tween, a timer) is not observed, so an absent entry means \"not within one frame\", not \"never\".", + "items": { + "type": "string" + }, + "type": "array" + }, + "skipped": { + "description": "Present when an earlier failure ended the batch before this action.", + "type": "boolean" + }, + "type": { + "type": "string" + }, + "value": { + "description": "Resulting text of the focused text Control.", + "type": "string" + }, + "watch": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "index", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / still_heldAdded value: +{ + "description": "Inputs this batch pressed and did not release, e.g. \"key:W\", \"action:jump\".", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / success / descriptionAdded value: +"False when an action failed and the remaining actions were skipped." - removed
Output schema / properties / tipRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / warningsRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -}
- Changed
validate3 fields changed- added
Input schema / properties / checksAdded value: +{ + "description": "[single, requires scenePath] Structural and signal-verification checks to run against the scene. Types: \"structure\" (validate node tree against a schema) and \"signals\" (verify signal connections and handler methods, optional nodePath scope). Merged into the errors array with a \"check\" discriminator.", + "items": { + "properties": { + "nodePath": { + "description": "[signals] Optional node path to scope the check to a subtree (e.g. \"root/HUD\")", + "type": "string" + }, + "schema": { + "description": "[structure] Recursive node schema: { type?: string, children?: Schema[], hasProperty?: string }. Checks the root node and subtree.", + "type": "object" + }, + "type": { + "description": "The kind of check to run", + "enum": [ + "structure", + "signals" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / targets / items / properties / checksAdded value: +{ + "description": "[requires scenePath] Structural / signal checks for this target, run in the same Godot process as the rest of the batch. Same shape as the top-level checks array.", + "items": { + "properties": { + "nodePath": { + "description": "[signals] Optional node path to scope the check to a subtree (e.g. \"root/HUD\")", + "type": "string" + }, + "schema": { + "description": "[structure] Recursive node schema: { type?: string, children?: Schema[], hasProperty?: string }. Checks the root node and subtree.", + "type": "object" + }, + "type": { + "description": "The kind of check to run", + "enum": [ + "structure", + "signals" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / targets / items / properties / scenePath / descriptionPrevious value: -"Path to a .tscn file relative to the project"New value: +"Path to a .tscn scene file relative to the project"
7 tool updates
v3.6.0- Changed
add_node1 field changed- changed
Input schema / properties / nodeType / descriptionPrevious value: -"Godot node class to instantiate (e.g. \"Sprite2D\", \"CollisionShape2D\", \"Label\"), or a project-relative scene path (.tscn or .scn, e.g. \"scenes/enemy.tscn\") to instance an existing scene as a child — instanced children serialize as `instance=ExtResource(...)` on save"New value: +"Godot node class to instantiate (e.g. \"Sprite2D\", \"CollisionShape2D\", \"Label\"), or a project-relative scene path (.tscn or .scn, e.g. \"scenes/enemy.tscn\") to instance an existing scene as a child - instanced children serialize as `instance=ExtResource(...)` on save"
- Changed
batch_scene_operations5 fields changed- changed
Input schema / properties / operations / items / properties / modulate / descriptionPrevious value: -"[add_node] Color modulation — shorthand for properties.modulate"New value: +"[add_node] Color modulation - shorthand for properties.modulate" - changed
Input schema / properties / operations / items / properties / position / descriptionPrevious value: -"[add_node] Position — {\"x\",\"y\"} for 2D nodes, {\"x\",\"y\",\"z\"} for 3D. Shorthand for properties.position"New value: +"[add_node] Position - {\"x\",\"y\"} for 2D nodes, {\"x\",\"y\",\"z\"} for 3D. Shorthand for properties.position" - changed
Input schema / properties / operations / items / properties / rotation / descriptionPrevious value: -"[add_node] Rotation in radians — shorthand for properties.rotation"New value: +"[add_node] Rotation in radians - shorthand for properties.rotation" - changed
Input schema / properties / operations / items / properties / scale / descriptionPrevious value: -"[add_node] Vector2 scale — shorthand for properties.scale"New value: +"[add_node] Vector2 scale - shorthand for properties.scale" - changed
Input schema / properties / operations / items / properties / visible / descriptionPrevious value: -"[add_node] Visibility — shorthand for properties.visible"New value: +"[add_node] Visibility - shorthand for properties.visible"
- Changed
get_node_signals1 field changed- added
Output schema / properties / signals / items / properties / connections / items / properties / target / descriptionAdded value: +"Scene-root-relative path in \"root/...\" form (a self-connection is \"root\"), directly usable as targetNodePath in connect_signal/disconnect_signal. \"unknown\" for a freed or null object."
- Changed
get_project_info1 field changed- changed
Input schema / properties / projectPath / descriptionPrevious value: -"Path to the Godot project directory (optional — omit to get Godot version only)"New value: +"Path to the Godot project directory (optional - omit to get Godot version only)"
- Changed
run_project1 field changed- changed
Input schema / properties / profiling / descriptionPrevious value: -"Attach Godot's own remote debugger so profile_project, start_profiler and stop_profiler can measure this session. Must be set at launch — a session already running cannot be profiled — and costs a little runtime overhead."New value: +"Attach Godot's own remote debugger so profile_project, start_profiler and stop_profiler can measure this session. Must be set at launch - a session already running cannot be profiled - and costs a little runtime overhead."
- Changed
simulate_input1 field changed- changed
Input schema / properties / actions / items / properties / pressed / descriptionPrevious value: -"[key, mouse_button, action] Whether the input is pressed (true) or released (false). For mouse_button: omit to auto-click (press+release in one action); set explicitly only for hold/release. For key: defaults to true and does NOT auto-release — emit a second action with pressed:false to release."New value: +"[key, mouse_button, action] Whether the input is pressed (true) or released (false). For mouse_button: omit to auto-click (press+release in one action); set explicitly only for hold/release. For key: defaults to true and does NOT auto-release - emit a second action with pressed:false to release."
- Changed
stop_project2 fields changed- added
Output schema / properties / alreadyExitedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / exitCodeAdded value: +{ + "type": [ + "number", + "null" + ] +}
1 tool update
v3.5.0- Changed
batch_scene_operations3 fields changed- added
Input schema / properties / operations / items / properties / abortOnErrorAdded value: +{ + "description": "[set_node_properties] Stop processing on first error", + "type": "boolean" +} - changed
Input schema / properties / operations / items / properties / operation / enumPrevious value: -[ - "add_node", - "load_sprite", - "save" -]New value: +[ + "add_node", + "load_sprite", + "set_node_properties", + "save" +] - added
Input schema / properties / operations / items / properties / updatesAdded value: +{ + "description": "[set_node_properties] Property updates to apply in this operation", + "items": { + "properties": { + "nodePath": { + "description": "Node path from scene root", + "type": "string" + }, + "property": { + "description": "Property name in snake_case", + "type": "string" + }, + "value": { + "description": "New value. Vector2/Vector3/Color auto-convert from {\"x\",\"y\"} / {\"x\",\"y\",\"z\"} / {\"r\",\"g\",\"b\",\"a\"} objects; primitives pass through" + } + }, + "required": [ + "nodePath", + "property", + "value" + ], + "type": "object" + }, + "type": "array" +}
4 tool updates
v3.4.0- Added
profile_project - Changed
run_project1 field changed- added
Input schema / properties / profilingAdded value: +{ + "description": "Attach Godot's own remote debugger so profile_project, start_profiler and stop_profiler can measure this session. Must be set at launch — a session already running cannot be profiled — and costs a little runtime overhead.", + "type": "boolean" +}
- Added
start_profiler - Added
stop_profiler
2 tool updates
v3.3.0- Changed
add_node4 fields changed- changed
Input schema / properties / nodeType / descriptionPrevious value: -"Godot node class to instantiate (e.g. \"Sprite2D\", \"CollisionShape2D\", \"Label\")"New value: +"Godot node class to instantiate (e.g. \"Sprite2D\", \"CollisionShape2D\", \"Label\"), or a project-relative scene path (.tscn or .scn, e.g. \"scenes/enemy.tscn\") to instance an existing scene as a child — instanced children serialize as `instance=ExtResource(...)` on save" - changed
Input schema / properties / position / descriptionPrevious value: -"Vector2 position (e.g. {\"x\": 100, \"y\": 200})"New value: +"Position: {\"x\": 100, \"y\": 200} on a 2D node, {\"x\": 0, \"y\": 1, \"z\": 0} on a 3D node" - added
Input schema / properties / position / properties / zAdded value: +{ + "type": "number" +} - removed
Input schema / properties / position3dRemoved value: -{ - "description": "Vector3 position for 3D nodes (e.g. {\"x\": 0, \"y\": 1, \"z\": 0})", - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - }, - "z": { - "type": "number" - } - }, - "type": "object" -}
- Changed
batch_scene_operations5 fields changed- added
Input schema / properties / operations / items / properties / modulateAdded value: +{ + "description": "[add_node] Color modulation — shorthand for properties.modulate", + "type": "object" +} - added
Input schema / properties / operations / items / properties / positionAdded value: +{ + "description": "[add_node] Position — {\"x\",\"y\"} for 2D nodes, {\"x\",\"y\",\"z\"} for 3D. Shorthand for properties.position", + "type": "object" +} - added
Input schema / properties / operations / items / properties / rotationAdded value: +{ + "description": "[add_node] Rotation in radians — shorthand for properties.rotation", + "type": "number" +} - added
Input schema / properties / operations / items / properties / scaleAdded value: +{ + "description": "[add_node] Vector2 scale — shorthand for properties.scale", + "type": "object" +} - added
Input schema / properties / operations / items / properties / visibleAdded value: +{ + "description": "[add_node] Visibility — shorthand for properties.visible", + "type": "boolean" +}
1 tool update
v3.2.0- Changed
run_script1 field changed- removed
Output schema / properties / warningRemoved value: -{ - "type": "string" -}
36 tool updates
v3.1.1- Added
add_autoload - Added
add_node - Added
attach_project - Added
attach_script - Added
batch_scene_operations - Added
connect_signal - Added
create_scene - Added
delete_nodes - Added
detach_project - Added
disconnect_signal - Added
duplicate_node - Added
export_mesh_library - Added
get_debug_output - Added
get_node_properties - Added
get_node_signals - Added
get_project_files - Added
get_project_info - Added
get_project_settings - Added
get_scene_dependencies - Added
get_scene_tree - Added
get_ui_elements - Added
launch_editor - Added
list_autoloads - Added
list_projects - Added
load_sprite - Added
remove_autoload - Added
run_project - Added
run_script - Added
save_scene - Added
search_project - Added
set_node_properties - Added
simulate_input - Added
stop_project - Added
take_screenshot - Added
update_autoload - Added
validate
39 tool updates
v3.0.0- Removed
add_autoload - Removed
add_node - Removed
attach_project - Removed
attach_script - Removed
batch_get_node_properties - Removed
batch_scene_operations - Removed
batch_set_node_properties - Removed
connect_signal - Removed
create_scene - Removed
delete_node - Removed
detach_project - Removed
disconnect_signal - Removed
duplicate_node - Removed
export_mesh_library - Removed
get_debug_output - Removed
get_node_properties - Removed
get_node_signals - Removed
get_project_files - Removed
get_project_info - Removed
get_project_settings - Removed
get_scene_dependencies - Removed
get_scene_tree - Removed
get_ui_elements - Removed
launch_editor - Removed
list_autoloads - Removed
list_projects - Removed
load_sprite - Removed
manage_uids - Removed
remove_autoload - Removed
run_project - Removed
run_script - Removed
save_scene - Removed
search_project - Removed
set_node_property - Removed
simulate_input - Removed
stop_project - Removed
take_screenshot - Removed
update_autoload - Removed
validate
2 tool updates
v2.3.0- Changed
attach_project1 field changed- added
Input schema / properties / waitForBridgeAdded value: +{ + "description": "If true, poll the bridge until it responds (up to 15 seconds). Use this after Godot is already running to confirm runtime tools are ready. Defaults to false.", + "type": "boolean" +}
- Changed
create_scene1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "scenePath": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
TDQS
Scored across 39 tools
Every tool targets a distinct resource+action pair, from project discovery and scene mutation to autoload CRUD, runtime control, input simulation, and profiling. Close pairs like get_project_files vs get_scene_tree or profile_project vs start/stop_profiler are explicitly differentiated in their descriptions, so an agent can reliably select the right one.
All tools follow a consistent snake_case verb_noun pattern (list_projects, add_node, connect_signal, stop_profiler). Verbs are predictably grouped by domain: get/list for reads, add/remove/update for autoloads, create/delete/duplicate for scene structure, and run/stop/attach/detach for lifecycle control.
39 tools is far above the well-scoped 3-15 range and even beyond the 16-25 heavy band. Several tools are redundant conveniences rather than distinct capabilities: batch_scene_operations wraps existing scene operations, profile_project wraps start/stop_profiler, and save_scene is rarely needed because most mutations auto-save.
The tool set covers the core lifecycle well: project discovery, scene/node CRUD, signal connections, autoload management, runtime launching, input simulation, screenshots, profiling, and validation. Missing capabilities like project creation/deletion, script file editing, or node reparenting are either out of scope or workaroundable via run_script and external file tools.
Maintenance
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
A TypeScript MCP server for Home Assistant, enabling programmatic management of entities, automati…
An MCP server that gives your AI access to the source code and docs of all public github repos
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Related MCP Servers
- AlicenseBqualityFmaintenanceA Model Context Protocol server that enables AI assistants to interact with the Godot game engine, allowing them to launch the editor, run projects, capture debug output, and control project execution.14159 npm5,787MIT
- AlicenseNot gradedqualityDmaintenanceProvides a comprehensive integration between LLMs and the Godot Engine, enabling AI assistants to intelligently manipulate project files, scripts, and the live editor. It supports advanced workflows including version-aware documentation querying, automated E2E game testing, and real-time visual context capture.14 npm26MIT
- FlicenseNot gradedqualityAmaintenanceA local MCP server plus a bundled Godot editor addon that lets an AI agent create, inspect, run, debug, and export real Godot 4.6 games through tools.2-
- AlicenseNot gradedqualityBmaintenanceA TypeScript MCP server bridging MCP clients to Godot 4 editor, enabling scene, node, script editing and more via WebSocket.159 npmMIT