Skip to main content
Glama

Godot Forge

AI game development for Godot 4. An MCP server plus a Godot editor add-on that let Claude Code, Cursor, Codex, Claude Desktop, VS Code and any other MCP client build, run, see, playtest and fix your game — in the live editor, with every change reviewable and reversible.

Think "Aura for Unreal", but for Godot, open source (MIT), and working with the AI assistant you already use.

You: add a double jump and make it feel good
AI:  docs.class CharacterBody2D → script.edit player.gd (0 errors) → run.play → input.send jump,jump
     → game.sample velocity → test.scenario "double jump" ✓ saved → particles.create dust → view.game
     "Done: double jump with coyote time + dust burst. Try it with Space twice. Review in the Forge dock."

Why it's different

Godot Forge

Typical Godot MCP servers

Grounded in your engine version

Class reference for the exact installed Godot (signatures via --doctool, descriptions from the matching release), live ClassDB introspection, Godot 3→4 migration hints

Model guesses the API (and often writes Godot 3 code)

Closed loop

Play the game, simulate input, screenshots (annotated), live tree/state, eval, wait-for-condition, time series sampling, scripted playtest scenarios with assertions saved as regression tests

Edit files, maybe run the project

Safe

Every edit through the editor's UndoRedo; automatic changesets with diff / approve / discard / checkpoints in a Forge dock (like Aura's sandbox); atomic batch with rollback

Direct file writes

Human collaboration (editor-first)

The AI builds real nodes, inspector properties, .tres resources, saved signal connections, AnimationPlayers and painted TileMaps — the same scenes you'd make by hand, fully editable in the Godot editor. Instructions, the skill and test.lint steer it away from building static content in _ready()

Scripts that construct the scene at runtime; nothing to see or tweak in the editor

Lean context

~30 consolidated tools with action parameters, rich descriptions, friendly value coercion, "did you mean" errors

100–190 tiny tools, or too few to be useful

Knows game dev

Built-in guides (platformer, top-down, 3D, UI, tilemaps, physics, enemies/AI, game feel, save/load, shaders, audio, …), templates, MCP prompts (new-game, add-feature, fix-bug, playtest, polish), a Claude Code skill

Raw tools only

Assets

Instant placeholder art, CC0 libraries (Poly Haven, ambientCG, Poly Pizza) with credits, optional AI generation (OpenAI images, ElevenLabs SFX, Meshy 3D)

—

Measured

30-task eval suite that lets an agent build features and grades them by playing the game

—

In-editor agent

Optional Forge Agent panel: chat with Claude inside Godot

—

Related MCP server: Godot MCP

Quick start

  1. Install Godot 4.4+ (4.7 recommended) and make sure godot is on your PATH (or set GODOT_PATH).

    • Windows: winget install GodotEngine.GodotEngine · macOS: brew install --cask godot · Linux: your package manager / Flathub.

  2. Add Godot Forge to your project (Node 20+):

    cd path/to/your/godot/project
    npx -y godot-forge-mcp@latest install          # copies addons/godot_forge, enables it, writes .mcp.json for Claude Code

    Or start a new game: npx -y godot-forge-mcp@latest new my-game --name "My Game" (--3d, --pixel optional).

  3. Open your AI client in the project folder. With Claude Code:

    claude                     # picks up .mcp.json; approve the "godot" server
    > /mcp                     # should list "godot" as connected

    If the editor isn't open, the server launches it for you (disable with --launch none).

Other clients

Client

Setup

Claude Code (global)

claude mcp add godot -- npx -y godot-forge-mcp@latest

Claude Code plugin

this repo is also a Claude Code plugin (MCP server + skill)

Cursor

npx -y godot-forge-mcp install --client cursor (writes .cursor/mcp.json)

VS Code (Copilot)

npx -y godot-forge-mcp install --client vscode (writes .vscode/mcp.json)

Codex

~/.codex/config.toml: [mcp_servers.godot] command = "npx" args = ["-y", "godot-forge-mcp@latest", "--project", "/path/to/project"]

Claude Desktop / others

stdio command npx -y godot-forge-mcp@latest --project /path/to/project

npx godot-forge-mcp doctor checks Godot, the add-on and the editor connection.

Try the demo

examples/demo is a small platformer built entirely through Godot Forge (TileMap level, player and coin scenes, HUD, signals connected in the scene, a saved playtest):

npx -y godot-forge-mcp@latest install examples/demo   # add-on + .mcp.json
godot --editor --path examples/demo                   # see the Forge dock and the Forge Agent panel

Tools

Tool

What it covers

project

info, settings, autoloads, input map, layer names, plugins, UIDs, create_project

files

list/search/read/write/edit (exact replacements)/move (updates references)/delete (to trash), view images

scene

create/open/save/tree/list, instance scenes, inherit, pack a branch into its own scene

node

add (whole subtrees + inline resources), set/get properties, duplicate, move, find, change type, groups, selection

signal

list, connect (generates handler stubs), disconnect, scene/project signal graph

script

create from templates, write/edit with compile diagnostics, validate project, outline, attach, references

resource

create/read/edit .tres (materials, shapes, custom data), assign, extract

introspect

live engine API: class members, where a member is declared, node types

docs

version-exact class reference search, migration notes, built-in guides

run

play/stop, startup errors, runtime errors with script file:line, output

game

running game: live tree, get/set/call/eval, wait for conditions/signals, sample values over time, time scale/pause/step, perf, raycasts, audio mute / what's playing

input

press actions/keys/gamepad, click/drag (or click a UI node), type text, record & replay

view

game screenshots (optionally annotated), offscreen scene renders from any angle, editor screenshots, resource previews

test

playtest scenarios (play → input → wait → assert → screenshot), lint, GUT/gdUnit4, screenshot baselines

changes

changesets: status/diff/checkpoint/restore/approve/discard/history

batch

many operations as one undoable transaction

exec

escape hatch: run GDScript in the editor or the game

animation

AnimationPlayer clips with tracks/keys in one call, SpriteFrames from images/sheets, AnimationTree state machines & blend spaces

tiles

TileSets from images (auto collision), TileMapLayer paint/fill/terrain, ASCII level layout

physics

bodies with shapes in one call, fit shapes to sprites/meshes, named layers/masks, joints

navigation

regions, baking, agents, links

world3d

primitives/CSG, materials, lights, environment presets, cameras, glTF import, GridMap/MeshLibrary, scattering

shader

templates (dissolve, outline, water, toon, …), validation, uniforms, material params

ui

build Control trees from a spec, layout presets, themes/styleboxes, fonts, menu builder, layout inspection

audio

buses & effects, players, loop import, procedural placeholder SFX

particles

GPU/CPU particles with presets (fire, smoke, sparks, explosion, rain, …)

assets

placeholders, CC0 search/download with credits, AI image/SFX/3D generation, import presets

export

presets, template check, headless export builds

Resources: godot://project/memory (your GODOT_AI.md), godot://project/summary, godot://scene/{path}, godot://docs/{Class}, godot://guides/{topic}. Prompts: new-game, add-feature, fix-bug, playtest, polish.

How it works

MCP client ──stdio──> godot-forge-mcp (Node) ──ws://127.0.0.1 (token)──> Godot editor add-on
                                  │                                        │ EngineDebugger channel
                                  └── godot --headless (docs, tests, export)  ▼
                                                                         ForgeRuntime autoload (in the running game)
  • The editor add-on (addons/godot_forge) hosts a loopback-only WebSocket with a per-session token and executes requests with the editor's own APIs (UndoRedo, EditorInterface), so the scene you see is the scene the AI edits.

  • The runtime autoload is inert unless the game was started from the editor with the debugger attached; it talks over Godot's debugger protocol (no extra ports) and ships nothing active in exported builds.

  • Changesets live in a private git history in .godot/forge/ (your own git repo is never touched). Needs git on PATH.

  • The server auto-installs/updates the add-on in the project when it launches the editor.

The Forge dock and Forge Agent

  • Forge dock (right side): connection status, files the AI changed since the last approval (Approve all / Discard all / Revert selected / Diff / Checkpoint), and a live activity feed of every AI action.

  • Forge Agent (bottom panel): chat with Claude from inside Godot. It runs Claude Code headless with Godot Forge attached, sends your current scene/selection as context, and streams what it does. Configure in Editor Settings → godot_forge/agent/*.

Configuration

Option

Default

--project <dir> / GODOT_PROJECT

found from the working directory

Godot project to use

--launch gui|headless|none / GODOT_FORGE_LAUNCH

gui

start the editor when it isn't running

--profile core|full / GODOT_FORGE_PROFILE

full

core = 16 essential tools for clients with small tool budgets

--tools a,b,c

all

explicit tool allowlist

--godot <exe> / GODOT_PATH

auto-detect

Godot 4 executable

OPENAI_API_KEY, ELEVENLABS_API_KEY, MESHY_API_KEY, POLY_PIZZA_API_KEY

–

optional asset generators/sources

Editor Settings godot_forge/autosave, auto_changeset, screenshot_max_size, mute_game_audio

on, on, 1280, off

editor-side behaviour. Playtest scenarios and headless/test editors always start the game muted (run.play {mute} / game.audio to control it)

Evals

npm run eval -- --tasks double_jump,coins_score --model sonnet copies a template project per task, lets Claude Code build the feature through Godot Forge with no human input, then grades it by playing the game (scenarios with input and assertions) and linting the project. See evals/ and the latest results in evals/RESULTS.md.

Development

See docs/DEVELOPMENT.md. Short version:

npm install && npm run build
npm test                 # unit tests
npm run test:e2e         # headless editor end-to-end tests (needs Godot)
bash scripts/check.sh    # parse-check every GDScript file of the add-on

License

MIT. Godot is a trademark of the Godot Foundation; this project is not affiliated with it.

Available Tools

29 tools
animationAnimationA

Animate anything: build AnimationPlayer animations with all tracks and keys in one call (property tweens, method calls, sounds, 3D transforms), SpriteFrames for AnimatedSprite2D/3D from image files or a sliced sprite sheet, and AnimationTree state machines / blend spaces / blend trees with transitions and conditions. All edits are undoable.

Actions:

  • create: {name ('walk' or 'lib/walk'), tracks: [{type?=value, path: 'Sprite2D:modulate', keys: [{time, value, easing?}]}], length? (default: last key time), loop?: none|linear|pingpong|true, path? (AnimationPlayer; created if it doesn't exist), parent?/player? (where/what to name a new player), library?='', autoplay?, reset?=true (key the current values of animated properties into the default library's RESET animation, like the editor does; the editor applies RESET before saving so previews/AnimationTrees don't leak into the scene), step?, validate?=true, overwrite?=true} build a complete animation; adds an AnimationPlayer when the scene has none. Values: '#ff0000', [x,y], numbers, 'res://tex.png'. 2D 'rotation' is radians (or animate 'rotation_degrees'). Call methods with a method track: {type: 'method', path: 'Player', keys: [{time, method, args}]}.

  • list: {path?} animations (length, loop, track summary) of one player, or of every AnimationPlayer in the scene.

  • get: {path?, name} full tracks and keys of an animation.

  • edit: {path?, name, length?, loop?, step?} change animation settings.

  • add_track: {path?, name, tracks: [{type, path, keys}]} (or track: {...}) add tracks to an existing animation; extends length to fit keys (extend?=true); reset?=true adds missing RESET tracks.

  • set_keys: {path?, name, track: index|'Sprite2D:modulate', keys: [...], replace?=true} replace a track's keys (replace=false merges, overwriting keys at the same time).

  • remove_track: {path?, name, track: index|path}

  • delete: {path?, name} delete an animation.

  • rename: {path?, name, new_name}

  • set_autoplay: {path?, name} play this animation when the scene starts (name='' clears).

  • sprite_frames: {path: AnimatedSprite2D/3D node or res://frames.tres, animations: {name: {frames: ['res://run_1.png', 'res://run_*.png', {texture, duration}] | sheet: {texture, hframes, vframes, row? | frames?: [indices] | start?/count?, frame_size?: [w,h], margin?, separation?}, fps?=10, loop?=true|false|pingpong}}, autoplay? (animation name, or true = the first one), play? (animation shown in the editor), replace? (default merges into existing frames), save_path?} create SpriteFrames and assign it (sheets are sliced into AtlasTextures). If the sprite already uses a SpriteFrames .tres file, that file is updated.

  • tree: {path? (AnimationTree; created if missing) | parent?+name?, anim_player? (default: the only AnimationPlayer), type?=state_machine|blend_space_1d|blend_space_2d|blend_tree, states: ['idle', {name, animation?} | {name, type: blend_space_2d, blend_points}], transitions: [{from (name, list or '*'), to, condition?, expression?, switch_mode?: immediate|sync|at_end, auto?, xfade?, priority?}], start?, blend_points?: [{animation, pos: number|[x,y]}], min_space?, max_space?, nodes?/connections? (blend_tree: [{name, type: animation|blend2|blend3|add2|sub2|one_shot|time_scale|time_seek|transition, animation?, inputs? (transition: ['idle', 'run']), props?}], [{from, to: name|'output', port?: index or input name}]), parameters?: {'conditions/moving': false, 'shot/request': 'fire'}, props? (AnimationTree node props), active?=true, reset?=true (add missing RESET tracks so the tree playing in the editor can't leak its pose into the saved scene)} build a complete AnimationTree in one call; replaces the tree_root of an existing tree.

  • tree_info: {path?} describe an AnimationTree: states, transitions, blend points, settable parameters, problems (missing animations).

  • set_parameter: {path?, name: 'conditions/moving' | 'blend_position' | 'shot/request' (fire|abort|fade_out) | 'state/transition_request', value} or {parameters: {name: value}} set AnimationTree parameters (in game code: $AnimationTree.set('parameters/conditions/moving', true)).

ParametersJSON Schema
NameRequiredDescriptionDefault
keysNoKeys [{time, value, easing?}] (method: {time, method, args}).
loopNonone | linear | pingpong (true = linear).
nameNoAnimation name ('walk' or 'library/walk'); for tree: the new AnimationTree's name.
pathNoAnimationPlayer / AnimationTree / AnimatedSprite node path (or res://*.tres for sprite_frames). Optional when the scene has exactly one player/tree.
playNosprite_frames: animation the sprite shows in the editor.
stepNoKeyframe snap step in seconds.
typeNoTrack type filter (set_keys/remove_track), or AnimationTree root type (tree).
nodesNotree (blend_tree): [{name, type, animation?, props?}].
propsNotree: properties of the AnimationTree node itself, e.g. {callback_mode_process: 'physics'}.
resetNocreate/add_track/tree: add missing RESET tracks with the current property values (default true).
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
startNotree: start state (default: the first state).
trackNoadd_track: a track object. set_keys/remove_track: track index or path.
valueNo
actionYesWhat to do. See the tool description for each action's parameters.
activeNotree: AnimationTree.active (default true).
extendNoExtend the animation length to fit new keys (default true).
lengthNoAnimation length in seconds.
parentNoParent node for a new AnimationPlayer / AnimationTree.
playerNoName for a new AnimationPlayer (create).
statesNotree: states ['idle', 'run'] or [{name, animation?, type?, blend_points?}].
tracksNoTracks to build.
libraryNoAnimation library name (default '' = the player's default library).
replaceNoset_keys: replace all keys (default true). sprite_frames: start from empty SpriteFrames.
autoplayNocreate: true to autoplay this animation. sprite_frames: animation name to autoplay (true = the first one).
new_nameNoNew animation name (rename).
validateNoCheck that track nodes/properties exist (default true).
max_spaceNoBlend space maximum (number or [x,y]); default from the points.
min_spaceNoBlend space minimum (number or [x,y]); default from the points.
overwriteNocreate: replace an existing animation of the same name (default true).
save_pathNosprite_frames: also save the SpriteFrames as this res:// .tres.
animationsNosprite_frames: {name: {frames | sheet, fps?, loop?}}.
parametersNotree/set_parameter: {parameter: value}, e.g. {'conditions/moving': true, 'move/blend_position': [1, 0]}.
root_propsNotree: properties of the root AnimationNode (e.g. a state machine's allow_transition_to_self).
anim_playerNotree: AnimationPlayer node path (relative to the scene root).
connectionsNotree (blend_tree): [{from, to, port?}] ('output' is the final node).
transitionsNotree: [{from, to, condition?, expression?, switch_mode?, auto?, xfade?}].
blend_pointsNotree: blend space points [{animation, pos}].

TDQS

A3.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=false, but the description advertises 'delete' animation, 'remove_track', 'overwrite?=true' and 'replace?=true' defaults that replace existing data. This contradicts the destructiveHint annotation even though the description notes all edits are undoable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but necessary for a 14-action, 38-parameter tool. It is front-loaded with a one-sentence summary and organized as an action list, though the bullets are extremely dense and repeat some schema detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity and lack of an output schema, the description covers return content for list/get/tree_info and explains mutation behavior and undoability. Some minor return/error details for edit and delete are absent, but the core operational picture is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 97%, but the description adds action-specific parameter mapping that the schema cannot express: which parameters apply to create vs tree vs sprite_frames, defaults, nested key/track object shapes, easing values, sheet slicing options, and example values. This is rich semantic guidance beyond the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 set: 'Animate anything: build AnimationPlayer animations... SpriteFrames... AnimationTree state machines' and enumerates every action. It clearly distinguishes the animation domain from sibling tools like node, scene, or signal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action is given clear context: create builds a complete animation, list returns one or all players, tree builds an AnimationTree and replaces an existing tree_root. It does not explicitly state when to prefer this tool over sibling tools, but the action-level guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assetsAssetsA

Get art and audio into the game. Instant procedural placeholders (no key needed) keep prototypes playable; free CC0 libraries (Poly Haven textures/HDRIs/models, ambientCG PBR materials, Poly Pizza low-poly models) are searched and imported with credits recorded in res://CREDITS.md; optional AI generators (images via OpenAI, sound effects via ElevenLabs, 3D models via Meshy) use keys from the server environment. Also import presets (pixel art, normal maps) and an inventory of existing assets.

Actions:

  • providers: {} which sources/generators are available (API keys configured).

  • placeholder: {path: res://assets/sprites/player.png, kind?: sprite|spritesheet|tileset|icon, shape?: rounded|rect|circle|triangle|diamond|capsule|star, size?: [32,32], color?, outline?, face?, frames? (spritesheet), colors? (tileset: one tile per color)} generate placeholder art instantly.

  • search: {query, source?: polyhaven|ambientcg|polypizza, type?: texture|hdri|model, limit?=10} search free asset libraries.

  • download: {source, id, resolution?='1k', dest?: res:// folder, material?=true} import an asset from search results. Textures also get a ready StandardMaterial3D .tres; HDRIs are for skies; models are glTF/GLB you can instance.

  • generate_image: {prompt, path: res://assets/sprites/x.png, size?: [64,64] (downscale after generating), transparent?=true, pixel_art?, style?} AI image (sprites, icons, backgrounds, textures). Needs OPENAI_API_KEY.

  • generate_sfx: {prompt: 'retro coin pickup', path: res://assets/sfx/coin.mp3, duration?} AI sound effect. Needs ELEVENLABS_API_KEY.

  • generate_model: {prompt, path: res://assets/models/x.glb, texture?=true, wait_seconds?=60} AI 3D model (takes minutes; returns a job id to poll). Needs MESHY_API_KEY.

  • job: {id, wait_seconds?} poll a 3D generation job; downloads the model when done.

  • import_options: {path | paths, preset?: pixel_art|2d|3d_texture|normal_map|ui, options?: {raw .import params}} change import settings and reimport. No preset/options = show current settings.

  • process_image: {path, resize?: [w,h], nearest?, trim?, save_as?} trim/resize an image (e.g. downscale a generated sprite to 32x32 with nearest).

  • inventory: {path?} project assets grouped by type (textures, audio, models, fonts, scenes, materials).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAsset id from search, or job id.
destNoDestination res:// folder or file.
kindNoPlaceholder kind.
pathNores:// file path.
sizeNo[width, height] in px.
typeNotexture | hdri | model.
colorNoHex color.
limitNoMax results.
pathsNoSeveral res:// paths.
queryNoSearch text.
shapeNoPlaceholder shape.
actionYesWhat to do. See the tool description for each action's parameters.
presetNoImport preset.
promptNoWhat to generate.
sourceNopolyhaven | ambientcg | polypizza.
optionsNoRaw import options.
resolutionNo1k, 2k, 4k.

TDQS

A3.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare openWorldHint=false, but the description explicitly describes searching external CC0 libraries and calling AI generation APIs (OpenAI, ElevenLabs, Meshy) — clearly networked/open-world operations. This direct contradiction overrides the otherwise useful behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but appropriately so for 11 actions. The overview is front-loaded, followed by compact action bullets. Each line provides necessary parameter or behavioral detail with no obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 actions, 17 parameters, nested objects, and no output schema, the description covers required API keys, defaults, return behavior (job id for polling), and file destinations. It is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but the schema descriptions are generic; the description supplies action-specific parameter semantics: enum-like values for kind/shape, defaults (limit=10, resolution='1k', wait_seconds=60), path conventions, and parameter combinations per action. This adds substantial meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Get art and audio into the game', and enumerates all actions clearly. It does not, however, explicitly differentiate from sibling tools such as resource, audio, or files.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear per-action context: placeholders for prototypes without keys, free libraries for real assets, AI generators when keys are available. It stops short of naming when to use this tool instead of siblings or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audioAudioA

Sound and music: audio buses with effects (saved to the project's default_bus_layout.tres, undoable), AudioStreamPlayer nodes, stream/import info, looping via import settings, and instant procedural placeholder sound effects (jump, coin, laser, explosion...) generated as .wav files so prototypes have sound without any assets.

Actions:

  • buses: {} list buses: volume, send target, mute/solo, effects with their changed properties.

  • add_bus: {name, send?='Master', volume_db? | volume? (linear 0..1), mute?, solo?, bypass_effects?, index?, effects?: ['reverb', {type: 'lowpass', cutoff_hz: 2000}, {type: 'compressor', props: {threshold: -12}}]} add a bus. Effect types: reverb, delay, compressor, limiter, eq/eq6/eq21, chorus, distortion, phaser, lowpass, highpass, bandpass, notch, lowshelf, highshelf, amplify, panner, pitch_shift, stereo_enhance, spectrum_analyzer, record, capture.

  • set_bus: {name, rename?, send?, volume_db?|volume?, mute?, solo?, bypass_effects?, effects? (replace all), add_effects?, remove_effects?: [index | type], effect_props?: {index|type: {prop: value}}} edit a bus (Master included, except send). Effect props accept aliases: cutoff -> cutoff_hz, mix -> wet (reverb), gain -> volume_db (amplify). Undoable.

  • remove_bus: {name} remove a bus; buses that sent to it are rerouted to Master.

  • player: {stream: res://x.wav|ogg|mp3 (or inline AudioStream), parent?='.', name?, type?: 1d|2d|3d, bus?='Master', autoplay?, volume_db?, pitch_scale?, loop?, max_distance?, props?} add an AudioStreamPlayer(2D/3D). type defaults to 1d (music/UI) at the scene root or for music, 2d/3d under a Node2D/Node3D entity. loop=true edits the file's import settings (wav/ogg/mp3) so it loops everywhere.

  • stream_info: {path} length, format, mix rate, stereo, loop settings, BPM and import parameters of an audio file.

  • import_loop: {path, loop, loop_offset? (ogg/mp3, seconds), loop_begin?/loop_end? (wav, frames), mode?: forward|pingpong|backward (wav)} set looping in the .import file and reimport.

  • generate_tone: {path: res://sfx/jump.wav, preset?: beep|blip|click|select|jump|coin|pickup|powerup|laser|shoot|hit|hurt|explosion|death|step|error, variation?: 0..1 (+seed) for random variants, wave?: square|sine|saw|triangle|noise (numbers only for the rest), freq?, freq_end? (exponential slide), duration?, attack?, decay?, duty?, volume?=0.6, vibrato_rate?, vibrato_depth?, arp_mult?, arp_time?, noise_mix?, lowpass?, lowpass_end?, loop?, overwrite?=true} synthesize a placeholder sound effect (sfxr-style, 16-bit mono 44.1 kHz) and import it. Preset values can be overridden individually.

ParametersJSON Schema
NameRequiredDescriptionDefault
busNoBus the player outputs to.
dutyNogenerate_tone: square wave duty cycle 0.05..0.95.
freqNoStart frequency in Hz.
loopNoLoop the audio (import setting for wav/ogg/mp3).
modeNoWAV loop mode: forward, pingpong, backward.
muteNoMute the bus.
nameNoBus name, or player node name.
pathNores:// audio file path (stream_info, import_loop, generate_tone output).
seedNoRandom seed for noise/variation.
sendNoBus this bus sends its output to (default Master).
soloNoSolo the bus.
typeNoPlayer type: 1d (non-positional), 2d, 3d.
waveNogenerate_tone waveform.
decayNogenerate_tone: fade-out seconds at the end.
indexNoBus position (1 = right after Master).
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
actionYesWhat to do. See the tool description for each action's parameters.
attackNogenerate_tone: fade-in seconds.
parentNoParent node path for the player (default '.').
presetNogenerate_tone preset name.
renameNoNew bus name.
streamNores:// audio file, or an inline AudioStream spec {type: ...}.
volumeNoLinear volume 0..1 (alternative to volume_db).
effectsNoEffects: names or {type, props?, enabled?, ...props}.
lowpassNogenerate_tone: low-pass cutoff in Hz at the start.
arp_multNogenerate_tone: pitch multiplier applied after arp_time (coin-style jump).
arp_timeNogenerate_tone: seconds before the arp_mult pitch jump.
autoplayNoStart playing when the scene starts.
durationNoLength in seconds.
freq_endNoEnd frequency in Hz.
loop_endNoimport_loop (wav): loop end in frames (-1 = end).
mix_rateNogenerate_tone: sample rate (default 44100).
noise_mixNogenerate_tone: 0..1 blend of noise into the tone.
overwriteNogenerate_tone: replace an existing file (default true).
variationNo0..1 randomisation of the preset (use different seeds for variants).
volume_dbNoVolume in dB (0 = unchanged, -6 = half as loud).
loop_beginNoimport_loop (wav): loop start in frames.
add_effectsNoEffects to append.
loop_offsetNoSeconds to jump back to when looping (ogg/mp3).
lowpass_endNogenerate_tone: low-pass cutoff in Hz at the end.
pitch_scaleNoPitch multiplier.
effect_propsNo{effect index or type: {prop: value}} to edit existing effects.
max_distanceNoPositional players: distance at which the sound becomes inaudible.
vibrato_rateNogenerate_tone: vibrato speed in Hz.
vibrato_depthNogenerate_tone: vibrato depth (fraction of the pitch, e.g. 0.05).
bypass_effectsNoBypass the bus effects.
remove_effectsNoEffect indices or type names to remove.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety profile (readOnly=false, destructive=false, openWorld=false), while the description adds substantial extra behavior: bus edits are saved to default_bus_layout.tres and are undoable, remove_bus reroutes senders to Master, loop=true modifies import settings so it loops everywhere, overwrite defaults to true, and Master cannot be re-sent. This is rich disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The one-paragraph overview is front-loaded, and the action list is organized per-action with parameters inline, which is efficient for an 8-action tool. It is dense and long, but nearly every clause carries actionable detail rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 actions, 48 parameters, nested objects, and no output schema, the description covers every action's inputs and side effects (undo, file writes, import reimports) so an agent can invoke each correctly. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema baseline is 3, but the description adds real value the schema lacks: the full effect-type list (reverb, delay, lowpass, ...), property aliases (cutoff->cutoff_hz, mix->wet, gain->volume_db), and preset-override semantics ('Preset values can be overridden individually'). These go beyond per-parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb+resource scope (audio buses, players, stream info, looping, procedural SFX) and names concrete artifacts like default_bus_layout.tres and .wav output. It is clearly distinguishable from sibling tools such as animation, shader, and particles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action is documented with its parameters and usage context, e.g. generate_tone is motivated ('so prototypes have sound without any assets') and player type selection is explained ('1d at scene root for music, 2d/3d under a Node2D/Node3D entity'). It does not, however, explicitly name external alternatives or state when NOT to use a given action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batchBatch operationsA

Run many editor operations in one round trip as a single transaction. With atomic=true (default) the batch stops at the first error and undoes everything it did. Use it to build a whole level or UI in one go.

Actions:

  • run: {operations: [{method: 'node.add', params: {...}}, ...], atomic?=true} method = '.' for editor-side tools (project, files, scene, node, signal, script, resource, animation, tiles, ui, physics, ...).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do. See the tool description for each action's parameters.
atomicNoRoll back everything on the first failure (default true).
operationsNoOperations in order.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety profile (readOnly=false, destructive=false, openWorld=false); the description goes further by disclosing transaction semantics: atomic=true is default, the batch stops at the first error and undoes prior work, and it operates on editor-side tools. It does not explain result reporting or how non-atomic partial failures are surfaced, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and transaction behavior in two tight sentences, then separates the action's parameter shape into a compact list. No redundant filler relative to the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description covers the transaction rollback behavior, default atomicity, and method addressing needed to invoke it correctly. It omits what a caller receives on success/partial failure, which matters for a batch executor, keeping it just below fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 the schema lacks: the 'method' field's required '<tool>.<action>' format and the list of valid tool namespaces, plus restating the atomic default. This is genuine added value over the bare string/boolean definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run many editor operations in one round trip as a single transaction') and immediately distinguishes itself from the sibling tools it composes by naming the '<tool>.<action>' method scheme. An agent can tell this apart from exec/run/node 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use case ('build a whole level or UI in one go') and implicitly frames the alternative — the individual sibling tools whose methods it references. It does not explicitly state when NOT to batch (e.g. single operations), so it stops short of the 5 tier.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

changesReview & rollbackA

Changesets make AI work reviewable and reversible (like a sandbox). A changeset opens automatically before the first edit and records a baseline of the whole project; the user sees pending files in the editor's Forge dock with Approve/Discard buttons. Use checkpoints before risky steps and restore if an approach fails. Backed by a private git history in .godot/forge (the user's own git is untouched; requires git).

Actions:

  • status: {} open changeset (label, baseline, checkpoints) and changed files.

  • diff: {path?, checkpoint?} unified diff of text files since the baseline (or a checkpoint) + stat.

  • begin: {label, accept_previous?=true} start a named changeset for a new task (closes the previous one as accepted).

  • checkpoint: {name?} save a restore point.

  • restore: {checkpoint} roll every file back to a checkpoint (changeset stays open).

  • revert_files: {paths} restore selected files to the baseline.

  • approve: {message?} accept all pending changes (only when the user asked you to, or at the end of a task they approved).

  • discard: {} restore everything to the baseline and close the changeset. Destructive: confirm with the user first.

  • history: {limit?} past changesets with outcomes and ids.

  • revert_changeset: {id} undo a previously approved changeset (opens a new changeset for the revert).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoChangeset id.
nameNoCheckpoint name.
pathNores:// file.
labelNoTask label shown to the user.
pathsNores:// files.
actionYesWhat to do. See the tool description for each action's parameters.
messageNoNote stored with the approval.
checkpointNoCheckpoint name or commit prefix.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the annotations: it discloses the automatic baseline creation, storage in a private git history under .godot/forge, that the user's own git is untouched, the git dependency, the Forge dock UI with Approve/Discard, that restore keeps the changeset open, that begin closes the previous changeset as accepted, that revert_changeset opens a new changeset, and that discard is destructive and needs user confirmation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The structure is exemplary for a 10-action tool: a short conceptual paragraph followed by one scannable line per action with inline parameter signatures. The introductory prose ('like a sandbox', the dock-button detail) is slightly chatty, but overall it is front-loaded and each action line earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing return shape per action (status returns the open changeset plus changed files; diff returns a unified diff plus stat; history returns past changesets with outcomes and ids). Combined with the mutation/destructive guidance and the git-dependency note, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so baseline is 3, but the description adds per-action parameter mapping and defaults that the schema does not convey (e.g. accept_previous?=true for begin, checkpoint as 'name or commit prefix', which actions take path/paths/id). This meaningfully exceeds the flat per-property schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens by defining exactly what a changeset is (a reviewable/reversible baseline recorded automatically before the first edit) and then enumerates all 10 supported actions with their parameters. Despite the generic tool name 'changes', an agent immediately understands this is the changeset/rollback manager, and no sibling tool (files, project, exec, etc.) overlaps that scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit situational guidance per action: checkpoints before risky steps, restore if an approach fails, approve 'only when the user asked you to, or at the end of a task they approved', and discard only after confirming with the user. It also implicitly distinguishes restore (whole changeset) from revert_files (selected files) from revert_changeset (undo an approved changeset). It does not name alternative sibling tools, which keeps it just 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.

docsGodot docsA
Read-only

Official Godot class reference for the EXACT engine version installed (signatures from the engine, descriptions from the matching release), plus Godot 3→4 migration notes and built-in game-dev guides. Check here before using an API you are not 100% sure exists in Godot 4 — most broken AI-written GDScript comes from Godot 3 habits.

Actions:

  • search: {query} find classes/methods/properties/signals, e.g. 'move and slide', 'tween property', 'raycast'.

  • class: {name, filter?, full?} class reference: description, properties, methods, signals, enums. filter narrows to members containing text.

  • member: {name: 'Class.member'} full docs for one member.

  • migrate: {query?} Godot 3 → 4 renames and syntax changes (filtered by query), e.g. 'yield', 'KinematicBody2D', 'export', 'tween'.

  • guide: {topic?} built-in guides (no topic = list): editor_first (read before building scenes), gdscript, best_practices, 2d_platformer, top_down, 3d_basics, ui, animation, physics, tilemaps, shaders, audio, save_load, performance, game_feel, and more.

  • status: {} docs index status (version, description download progress).

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoFull descriptions instead of summaries.
nameNoClass name, or 'Class.member'.
limitNoMax results.
queryNoSearch text.
topicNoGuide topic.
actionYesWhat to do. See the tool description for each action's parameters.
filterNoOnly members containing this text.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: signatures come from the installed engine, descriptions match the release, the migration action returns 3→4 renames, and status reveals index/download progress. It omits only minor operational details like caching or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and a high-value warning, then uses a tight action list with inline parameter hints and examples. Every sentence earns its place; the length is justified by the tool's six actions and seven-parameter schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action, read-only documentation tool with no output schema, the description is essentially complete. It explains each action's inputs, what each returns at a high level, and how the tool fits into a Godot workflow. No critical agent decision is left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, but the description adds substantial meaning by mapping parameters to actions: query for search, name/filter/full for class, Class.member for member, optional query for migrate, optional topic for guide, and no params for status. It also supplies concrete examples like 'move and slide' and 'KinematicBody2D', which the schema alone does not provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: official Godot class reference, migration notes, and built-in guides for the exact installed engine version. It enumerates all actions and distinguishes itself from sibling API/runtime tools by being a documentation lookup surface. An agent can immediately tell what it does and why it matters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: 'Check here before using an API you are not 100% sure exists in Godot 4' and provides action-level examples. However, it does not explicitly name sibling tools as alternatives or state when not to use it, so it stops short of the full when/when-not/alternatives criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

editorEditor & connectionA

Editor state and connection management: status, logs, undo/redo, notifications to the user, editor settings, and which Godot project/editor this server talks to.

Actions:

  • status: {} edited scene, selection, playing?, connected clients, log counts.

  • logs: {since?, level?: 'error'|'warning', source?: 'editor'|'game', limit?} editor + game output.

  • clear_logs: {} clear the captured log buffer.

  • undo: {steps?=1} undo AI or user edits in the edited scene.

  • redo: {steps?=1}

  • notify: {message} show a toast to the user in the editor.

  • main_screen: {name: '2D'|'3D'|'Script'|'AssetLib'}

  • get_setting: {name} editor setting.

  • set_setting: {name, value}

  • forge_settings: {set?: {autosave?, auto_changeset?, screenshot_max_size?}} Godot Forge behaviour.

  • restart: {save?=true} restart the editor (after enabling plugins, changing rendering method...).

  • connection: {} which project/editor is connected, Godot version, running editors.

  • use_project: {path} switch to another Godot project folder (launches its editor if needed).

  • install_addon: {path?, force?} copy/update the Godot Forge add-on in a project and enable it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSetting or screen name.
pathNoProject folder.
levelNo'error' or 'warning'.
sinceNoLog sequence number to read after (from a previous 'last_seq').
stepsNoHow many steps.
valueNo
actionYesWhat to do. See the tool description for each action's parameters.
sourceNo'editor' or 'game'.
messageNoText to show.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide coarse safety hints (readOnlyHint false, destructiveHint false). The description adds per-action behavioral detail beyond annotations: clear_logs empties the buffer, restart defaults save=true, install_addon copies and enables the add-on, and use_project launches an editor if needed. It does not state which actions are read-only versus mutating, but it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-sentence summary, then a scannable per-action list that packs parameter details without waste. For a 14-action multiplexer, this structure is efficient and every line contributes invocation guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the flat schema and absence of an output schema, the description is nearly complete for correct invocation, covering all actions with their parameters and defaults. A minor gap is that it does not indicate which actions return what data or are read-only, but the annotations and schema cover enough for selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 89%, so the schema already documents most parameters. The description still adds meaningful value by mapping parameters to specific actions and supplying defaults (steps=1, save=true) and allowed values (main_screen options, level/source values) that are absent or less specific in the schema. It also documents parameters like limit, force, and nested forge_settings that the schema does not list, compensating for gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: editor state and connection management, listing domains like status, logs, undo/redo, settings, and project connection. An agent can identify this as the editor-control tool, but the description does not explicitly differentiate it from siblings such as 'project' or 'scene' when their responsibilities overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action list implies when each action is appropriate (e.g., 'notify' to show a toast, 'use_project' to switch projects), giving implied usage. However, there is no explicit guidance on when to choose this tool over siblings like 'project' or 'run', and no exclusions or preconditions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execRun GDScriptA
Destructive

Escape hatch: run a GDScript snippet in the editor or in the running game when no dedicated action fits (bulk procedural generation, one-off fixes, complex queries). Prefer dedicated tools; file changes made here are still tracked by changesets.

Actions:

  • editor: {code} body of func run(editor: EditorInterface, scene: Node, forge) -> Variant; return a value. forge.find_node(path), forge.begin(name)/forge.commit() for undoable edits.

  • game: {code} body of func run(tree: SceneTree, scene: Node) in the running game; return a value.

  • eval: {expression, path?} evaluate one expression in the editor with a node as self.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoGDScript statements (tabs or spaces, consistently).
pathNoNode path relative to the scene root ('.' = root, 'Player/Sprite2D', '%Unique'), or a res:// file path, depending on the action.
actionYesWhat to do. See the tool description for each action's parameters.
expressionNoSingle Godot Expression.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds useful context beyond annotations: file changes are tracked by changesets, and forge.begin/commit enables undoable edits. It does not detail error behavior or return payload shape, so it falls just short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the escape-hatch purpose and preference for dedicated tools, then uses a compact action list. Every sentence and bullet earns its place by explaining a distinct execution mode or parameter convention. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex code-execution tool with three modes, the description covers when to use it, the side-effect tracking, undoability via forge, and action-specific parameters. With no output schema, it could say more about what the tool returns or how errors surface, but it gives the agent enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, but the description is essential because the action parameter explicitly redirects to it. It explains each action's parameter shape, including the expected function body signatures for editor and game, return semantics, and forge helper methods. This adds substantial meaning beyond the schema's field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action and scope: run a GDScript snippet in the editor or running game as an escape hatch. It explicitly positions itself against sibling tools by saying to prefer dedicated tools when one fits. An agent can identify its purpose and differentiation immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('when no dedicated action fits') and example use cases (bulk procedural generation, one-off fixes, complex queries). It also states the general alternative preference: 'Prefer dedicated tools.' This is about as clear as usage guidance gets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

exportExport / buildA

Ship the game: manage export presets (export_presets.cfg), check that export templates are installed, and build executables (Windows .exe, Linux, macOS .zip, Web .html, Android .apk) by running a headless Godot export. Typical flow: templates -> add_preset {platform} -> build {preset}.

Actions:

  • presets: {options?: bool} list export presets (name, platform, export_path, runnable) and whether templates are installed.

  • add_preset: {platform: windows|linux|macos|web|android|ios, name?=platform name, export_path?='build//.', options?: {'binary_format/embed_pck': true, 'application/product_name': ..., 'custom_template/release': path, ...}, runnable?=true, export_filter?: all_resources|scenes|resources|exclude, include_filter?, exclude_filter?, custom_features?, dedicated_server?} create a preset (or update the one with the same name). Unlisted options keep Godot's defaults.

  • remove_preset: {name} delete a preset.

  • templates: {} whether export templates for the running Godot version are installed (per platform), where they go, and the download URL.

  • build: {preset? (name or platform; optional if only one), path? (default: the preset's export_path, relative to the project), debug?=false, pack?: export only the .pck/.zip, timeout_s?=900} export the project with a separate headless Godot process (unsaved scenes are saved first; an output folder inside the project gets a .gdignore). Returns ok, output file + size, errors/warnings and a hint (e.g. missing templates).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPreset name.
packNobuild: only export the .pck/.zip data pack.
pathNobuild: output path overriding the preset's export_path.
debugNobuild: debug export (uses debug templates, keeps console/debugging).
actionYesWhat to do. See the tool description for each action's parameters.
presetNoPreset name (or platform) to build.
optionsNoPlatform export options, e.g. {'binary_format/embed_pck': true}.
platformNoTarget platform: windows, linux, macos, web, android, ios.
runnableNoMark as the runnable preset for its platform (default true).
timeout_sNobuild: timeout in seconds (default 900).
export_pathNoOutput file relative to the project, e.g. build/windows/game.exe.
export_filterNoall_resources (default), scenes, resources or exclude.
exclude_filterNoFiles to exclude, e.g. 'test/*'.
include_filterNoExtra non-resource files to include, e.g. '*.json, data/*'.
custom_featuresNoComma separated custom feature tags.
dedicated_serverNoadd_preset: export as a dedicated server (strips visuals).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, destructive=false, openWorld=false; the description adds substantial behavior beyond them: build runs a separate headless Godot process, saves unsaved scenes first, writes a .gdignore for in-project output folders, and returns ok/output file+size/errors/warnings/hint. It also discloses that add_preset overwrites a same-named preset and that unlisted options retain Godot defaults.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded flow statement followed by a per-action breakdown that keeps 5 actions and 16 params navigable. Dense but organized; minor redundancy where export_path/platform defaults repeat schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-action, 16-parameter tool with no output schema, the description explains each action's params, the workflow order, and the build return shape (ok, output file+size, errors/warnings, hint). Only trivial gap: the artifact list omits iOS even though it appears in the platform enum.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), and the description still adds meaning: defaults for name (=platform), export_path ('build/<platform>/<game>.<ext>'), runnable (=true), timeout_s (=900), and that preset is optional when only one exists. Conditional optionality and default semantics are genuinely value-adding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource framing ('Ship the game: manage export presets, check templates, build executables') and enumerates concrete output artifacts (Windows .exe, Web .html, Android .apk). An agent can immediately distinguish this from siblings like run, game, or exec.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Typical flow: templates -> add_preset {platform} -> build {preset}', which tells the agent the correct sequence and prerequisite relationship. It does not name when-not-to-use conditions or competing siblings, 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.

filesProject filesA

Read, write, search and manage files inside the Godot project (res://). Writes keep the editor in sync: scripts are reloaded and their compile errors returned, scenes/resources are refreshed, assets reimported. Reading an image returns it as a picture.

Actions:

  • list: {path='res://', recursive=true, pattern?='*.gd', include_addons?, limit?} list files with their resource type.

  • search: {query, regex?, case_sensitive?, glob?, path?, limit?} grep text files (gd, tscn, tres, gdshader, cfg, json, md...).

  • read: {path, offset?, limit?} read a text file (line range optional) or view an image.

  • write: {path, content, overwrite?=true} create/replace a file. .gd files come back with 'diagnostics'.

  • edit: {path, edits: [{old, new, replace_all?}]} exact string replacements (old must match exactly once, tabs matter). Prefer this over rewriting whole files.

  • move: {from, to, update_references?=true} move/rename, updating res:// references in scenes/scripts.

  • copy: {from, to}

  • delete: {path} move a file/folder to the OS trash.

  • mkdir: {path} create a folder (and parents).

  • exists: {path} does a file/folder exist, and its resource type.

  • dependencies: {path} what a resource depends on and what uses it.

  • rescan: {reimport?: [paths]} rescan the filesystem / force reimport (after changing files outside the editor).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoDestination path.
fromNoSource path.
pathNores:// path (bare relative paths are treated as res://).
editsNoExact replacements.
queryNoSearch text or regex.
actionYesWhat to do. See the tool description for each action's parameters.
contentNoFull file content.
patternNoFilename glob.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses real behavioral traits: writes keep the editor in sync (scripts reloaded, compile errors returned, scenes/resources refreshed, assets reimported), reads of images return pictures, and delete moves to OS trash rather than permanently removing. The trash behavior and editor-sync side effects are exactly the context an agent needs and are not derivable from destructiveHint=false alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, then a compact one-line-per-action list that is easy to scan. It is long, but the length is justified by 12 actions; only minor redundancy (parameters repeated in the prose) keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-action multiplexed tool with no output schema, the description covers every action, its parameters, defaults, and side effects, and even previews return values ('resource type', 'diagnostics'). Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only exposes 8 top-level properties and marks additionalProperties as unconstrained, so most action-specific parameters (recursive, pattern default '*.gd', include_addons, limit, regex, case_sensitive, glob, offset, overwrite default true, update_references, reimport) exist only in the description. The per-action parameter lists with defaults and the warning that edit's 'old must match exactly once, tabs matter' add substantial semantics over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb set (read, write, search, manage) and a precise resource (files inside the Godot project at res://), then enumerates all 12 actions with their key parameters. This clearly differentiates it from siblings like script, resource, scene, and assets, which cover narrower domains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is given for several actions: 'Prefer this over rewriting whole files' for edit, 'after changing files outside the editor' for rescan, and the note that .gd writes return diagnostics. There is no explicit routing guidance versus sibling tools (e.g. when to use files+read instead of the script tool), 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.

gameRunning gameA

Inspect and manipulate the RUNNING game (after run.play): live scene tree, node state, evaluate expressions, call methods, wait for conditions, record values over time, time control, performance. Paths are relative to the current scene root; use /root/Autoload for singletons.

Actions:

  • info: {} current scene, fps, frame, viewport size, paused, time_scale.

  • tree: {path?, depth?=6, props?, whole_tree?} live node tree (includes runtime-spawned nodes).

  • get: {path, props?: ['velocity', 'position:x']} node state; default = non-default props + global_position/velocity/is_on_floor + screen_position.

  • set: {path, props} change live values (for testing; not saved).

  • call: {path, method, args?}

  • eval: {expression, path?} Godot Expression with the node as self, e.g. "get_node('Player').health", "get_tree().get_nodes_in_group('enemies').size()". Or {expressions: [...]}

  • wait: {seconds} | {condition: expr, path?, timeout?} | {node: path, gone?, timeout?} | {signal, path, timeout?} wait inside the game.

  • sample: {path, props?=['global_position'], seconds?=1, interval?=0.1} time series of values (did it move/fall/animate?).

  • time: {time_scale?, paused?, step_frames?} slow-mo, pause, frame stepping.

  • perf: {sample_seconds?} fps, frame times, draw calls, node/object counts, memory.

  • raycast: {from, to, mask?, areas?} physics ray in the game world (2D or 3D by vector size).

  • change_scene: {scene} switch scenes in the running game.

  • quit: {code?} quit the game from inside (tests quit handling).

  • audio: {mute?, volume_db?} mute/unmute the running game's master bus; returns which players are currently playing (verify sounds without hearing them).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNo
argsNoArguments.
fromNo
nodeNoNode path to wait for.
pathNoNode path in the running game ('' = current scene root).
propsNoProperty names (get/sample) or {name: value} (set).
sceneNoScene path.
actionYesWhat to do. See the tool description for each action's parameters.
methodNoMethod name.
pausedNoPause/unpause the SceneTree.
signalNoSignal name to wait for.
secondsNoDuration.
timeoutNoSeconds before giving up (default 10).
intervalNoSampling interval in seconds.
conditionNoExpression that must become true.
expressionNoExpression to evaluate.
time_scaleNoEngine.time_scale.
expressionsNoSeveral expressions.
step_framesNoAdvance N physics frames.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false. The description adds important behavioral context: set changes live values but 'not saved', quit 'tests quit handling', audio returns currently playing players, and wait 'inside the game'. It stops short of covering rate limits or auth, but the operational details are rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the overall purpose then uses a compact, scannable action list. Despite covering 14 actions and 19 parameters, every line adds necessary detail; no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex multi-action tool with no output schema, the description adequately explains each action, its inputs, and often its return value (e.g., info lists fields, audio describes returns). Path conventions and usage prerequisites are included, leaving no critical gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (89%) so baseline is 3, but the description goes further by mapping every parameter to specific actions (e.g., {path?, depth?=6, props?, whole_tree?} for tree; {expression, path?} for eval) and notes defaults and examples. This adds substantial meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Inspect and manipulate the RUNNING game') and enumerates all capabilities. The qualifier 'after run.play' and 'live' distinguishes it from editor tools like scene or node without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context ('after run.play') and maps each action to its parameters, but does not explicitly name alternative sibling tools (e.g., node, scene) or state when not to use this tool. The context is strong but lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inputSimulate inputA

Play the running game: press input actions, keys, gamepad buttons, click/drag at viewport coordinates or directly on a node (UI buttons), type text. Steps run in order with real timing. Also record the user's play session and replay it.

Actions:

  • send: {steps: [...]} where each step is one of: {action:'jump', hold?:0.2} | {action, pressed:true/false} | {key:'Space'|'Ctrl+S', hold?} | {click:[x,y], button?, double?, space?:'viewport'|'screenshot'} | {click_node:'UI/StartButton'} | {mouse_move:[x,y]} | {drag:[[x1,y1],[x2,y2]], seconds?} | {joy:'a'} | {axis:'left_x', value:-1, hold?} | {text:'hello'} | {wait:0.5} | {release_all:true}

  • record: {mode: 'start'|'stop', include_mouse_motion?} capture real input; 'stop' returns events with timestamps.

  • replay: {events, speed?=1} replay recorded events.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo'start' or 'stop' for record.
speedNoReplay speed multiplier.
stepsNoInput steps, executed in order.
actionYesWhat to do. See the tool description for each action's parameters.
eventsNoEvents from record.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false. The description adds valuable behavioral context beyond annotations: steps run in order with real timing, record captures real input, and stop returns events with timestamps. It stops short of describing failure modes or game-state side effects, but is solid for this tool type.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose in one sentence, then uses a bulleted breakdown for actions and step formats. Despite its length, every sentence earns its place by documenting the complex input vocabulary required to invoke the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with five parameters, nested step objects, and no output schema, the description is complete: it defines all three actions, enumerates every step variant, and even notes that record returns timestamped events. Annotations cover safety, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, yet the description substantially enriches parameter meaning. It spells out every step type in the send action (jump, key, click, drag, joy, axis, text, wait, release_all), and explains record mode and replay speed, far exceeding the terse schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (play/simulate input) and resource (running game), and enumerates concrete capabilities (press keys, gamepad buttons, click/drag, type text) that distinguish it from all siblings. An agent can immediately tell this tool is for injecting input into a game session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes the context: use this to play or record/replay input in a running game. It does not explicitly name alternatives or when-not to use it, but the action breakdown (send/record/replay) effectively guides usage. Sibling 'ui' or 'game' might overlap, yet no exclusion is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

introspectEngine API (live)A
Read-only

Ask the running engine about its exact API (no guessing): class members with types/defaults/enums, where a member is declared, node types by domain. Unknown Godot 3 names come back with suggestions.

Actions:

  • class: {name, sections?: ['properties','methods','signals','constants'], filter?, inherited?} members of an engine or project class.

  • search: {query, base?} find class names.

  • member: {name, base?} which classes declare a method/property/signal.

  • node_types: {domain?: '2d'|'3d'|'ui', base?}

  • check_parent: {child, parent} warn about invalid parent/child type combos.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoRestrict to subclasses of this class.
nameNoClass or member name.
queryNoSearch text.
actionYesWhat to do. See the tool description for each action's parameters.
domainNo'2d', '3d' or 'ui'.
filterNoOnly members containing this text.
sectionsNoWhich member kinds.
inheritedNoInclude inherited members.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, non-destructive, non-open-world, so the safety profile is covered. The description adds real behavioral context beyond that: unknown Godot 3 names return suggestions rather than failing, and results reflect a currently running engine. It does not describe output shape or error behavior for invalid actions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, with the action list following as compact reference material. Each line earns its place; the only mild excess is the parenthetical 'no guessing', which is rhetorical rather than informational.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single dispatcher tool wrapping five distinct operations across eight parameters with no output schema, the per-action parameter documentation is largely complete and covers the fallback-suggestion behavior. The remaining gap is return-value shape, which with no output schema the agent must infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description goes further by mapping which parameters belong to which action (sections for class, query/base for search, domain for node_types, child/parent for check_parent) and by enumerating the valid sections and domain values. That mapping is genuine value the flat schema cannot express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — interrogating the running engine for its exact API — and the phrase 'no guessing' plus 'running engine' distinguishes it from the offline 'docs' sibling. An agent can tell this is live introspection rather than static documentation lookup 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action breakdown effectively explains which operation to pick for which question (class members, class search, member declaration lookup, node types, parent/child validation), which is strong routing guidance. It stops short of any when-not guidance or explicit differentiation from the 'docs' sibling for offline cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nodeNodesA

Add, edit and inspect nodes in the edited scene. Every change is undoable (Ctrl+Z) and saved. Build whole subtrees in one 'add' via children. Returned 'warnings' flag setup mistakes (missing collision shapes, textures...).

Actions:

  • add: {type, name?, parent?='.', props?, script?, groups?, index?, children?: [same spec...]} or {nodes: [specs], parent?}. type = class (CharacterBody2D), class_name, res://x.gd or res://x.tscn (instance).

  • set: {path | paths[], props: {name: value}} set properties (sub-properties like 'position:x' allowed).

  • get: {path, props?: [names], all?} type, inheritance, script, non-default props (or the requested ones), children, groups, signal connections, warnings.

  • delete: {path | paths[]}

  • duplicate: {path, name?, parent?, count?, offset?: [x,y]} copies (with offset per copy, great for rows of platforms/coins).

  • move: {path, new_parent?, index?, keep_global_transform?=true} reparent and/or reorder.

  • rename: {path, name}

  • find: {name?: glob, type?, group?, script?, under?} search nodes.

  • call: {path, method, args?, property?} call a method in the editor (e.g. curve.add_point via property='curve').

  • change_type: {path, type, keep_script?} swap a node's class keeping children/compatible props (works on the root too).

  • add_to_group: {path, group}

  • remove_from_group: {path, group}

  • select: {path | paths[]} select in the editor (shows it to the user).

  • selection: {} what the user has selected — use it to resolve 'this node'.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoMethod arguments.
nameNoNode name / name glob for find.
pathNoNode path relative to the scene root ('.' = root, 'Player/Sprite2D', '%Unique'), or a res:// file path, depending on the action.
typeNoNode class, class_name, res://script.gd or res://scene.tscn.
groupNoGroup name.
indexNoChild index.
nodesNoSeveral node specs to add under 'parent'.
pathsNoSeveral node paths.
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
actionYesWhat to do. See the tool description for each action's parameters.
methodNoMethod name.
parentNoParent node path (default '.').
childrenNoChild node specs: {type, name?, props?, script?, children?}.
new_parentNoNew parent path.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the annotations by disclosing that every change is undoable (Ctrl+Z) and saved, and that 'warnings' flag setup mistakes such as missing collision shapes or textures. This is meaningful context, though the presence of a 'delete' action alongside destructiveHint=false is worth scrutiny.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core statement, then uses a dense action list where each line earns its place given the flat-schema design. It is long but the length is proportionate to 14 distinct actions; a slightly less telegraphic style would read better.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the get action's description of returned data (type, inheritance, script, props, children, groups, signal connections, warnings) covers the return contract. Nested specs (children, nodes) are also explained, leaving only minor gaps for a tool this broad.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema is a flat union of 15 params shared across 14 actions, so the description's per-action parameter specifications (add's {type, name?, parent?, props?, children?}, set's sub-property syntax 'position:x', duplicate's offset-per-copy) are essential and not derivable from the schema alone. It also clarifies that type accepts a class, class_name, script, or scene instance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb set and resource ('Add, edit and inspect nodes in the edited scene') and scopes it to the edited scene, which separates it from siblings like scene, signal, and script. The 14 named actions make the exact capability surface unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action documents its own parameter shape, so an agent knows which action to reach for and what it needs (e.g. find for searching, selection to resolve 'this node'). It never states when NOT to use this tool versus siblings like scene or script, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

particlesParticlesA

Particle effects (GPU/CPU, 2D/3D) from tuned presets — fire, smoke, sparks, explosion, dust, rain, snow, magic, hit, trail, confetti, bubbles — with color gradients, size curves, velocities and emission shapes already set, plus friendly editing of the process material. Undoable.

Actions:

  • presets: {} list presets with descriptions.

  • create: {preset?, parent?='.', name?, type?: gpu_2d|cpu_2d|gpu_3d|cpu_3d (default gpu, 2D/3D from the parent), position?, color? (tint the preset), size? (2D px / 3D meters), amount?, lifetime?, one_shot?, emitting?, explosiveness?, preprocess?, local_coords?, additive?, texture? (res:// image or soft|spark|square|streak|ring), process?: {ParticleProcessMaterial props}, props?: {node props}} add a particles node. Presets are tuned in 2D pixels and converted to meters for 3D. One-shot presets (explosion, hit, confetti) fire when the scene starts; call restart() in code to fire again.

  • set: {path, process?: {...}, props?: {...}, preset? (re-apply a preset), color?, amount?, lifetime?, one_shot?, emitting?, explosiveness?, preprocess?, local_coords?, speed_scale?} edit a particles node. Works for GPU (edits the process material) and CPU particles (same names; scale -> scale_amount mapped). Visibility bounds grow to fit faster/longer-lived particles.

  • get: {path} node settings and process values (gradients/curves as point lists).

  • restart: {path} restart emission (previews one-shot effects in the editor).

  • convert: {path, to: cpu|gpu} convert between GPUParticles and CPUParticles keeping settings (CPU has no turbulence/collision).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoconvert: 'cpu' or 'gpu'.
nameNoNode name (default '<Preset>Particles').
pathNoParticles node path (a parent with exactly one particles child also works).
sizeNoParticle size of the preset: pixels in 2D (process.scale is relative to the texture size), meters in 3D.
typeNogpu_2d | cpu_2d | gpu_3d | cpu_3d (also 'gpu'/'cpu'/'2d'/'3d').
colorNoTint for the preset's color gradient, e.g. '#40ff80': every stop takes this hue, keeping its brightness, relative saturation and alpha.
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
actionYesWhat to do. See the tool description for each action's parameters.
amountNoNumber of particles.
parentNoParent node for create (default: scene root).
presetNofire | smoke | sparks | explosion | dust | rain | snow | magic | hit | trail | confetti | bubbles
processNoParticleProcessMaterial values: ranges as [min, max] (initial_velocity, scale, angle, angular_velocity, damping, hue_variation, orbit_velocity...), direction [x,y(,z)], gravity [x,y(,z)], spread, color '#hex', color_ramp: ['#fff', '#f000'] or [[offset, color], ...], scale_curve: [1, 0] or [[t, v], ...], emission: {shape: point|sphere|sphere_surface|box|ring, radius?, extents?, inner_radius?, height?}, turbulence_enabled...
textureNores:// texture, or a generated one: soft | spark | square | streak | ring.
additiveNoAdditive blending (glow). Presets like fire/sparks/magic default to true.
emittingNoWhether it is emitting.
lifetimeNoSeconds each particle lives.
one_shotNoEmit a single burst.
positionNo[x, y] or [x, y, z].
preprocessNoSeconds to pre-simulate (so rain/snow already fill the screen).
speed_scaleNoSimulation speed multiplier.
local_coordsNoParticles move with the node (true) or stay in world space (false, good for trails).
explosivenessNo0 = steady stream, 1 = all at once.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that changes are undoable, that CPU particles lack turbulence/collision, that visibility bounds grow with faster or longer-lived particles, that presets are tuned in 2D pixels and converted to meters for 3D, and that one-shot presets fire only when the scene starts unless restart is called. These are exactly the behavioral caveats an agent needs before invoking create, set, or convert.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but tightly structured: a front-loaded summary paragraph followed by a bulleted action list. Each action bullet carries only the parameters and caveats relevant to that action. For a tool with six actions and 23 parameters, the length is justified and there is little wasted prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, nested objects, and lack of an output schema, the description is complete enough to invoke correctly. It covers purpose, action routing, parameter defaults, mutation consequences, conversion limitations, and even return shape for get. No critical operational detail is missing for an agent to choose and call the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the schema documents the 23 parameters. The description adds action-specific meaning beyond the schema: it maps parameters to create/set/convert, explains preset tinting, notes that size is in pixels for 2D and meters for 3D, and describes restart behavior for one-shot effects. This raises it above the baseline of 3 for fully documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (particle effects) and enumerates all six supported actions, so the agent knows exactly what the tool does. It also distinguishes itself by listing supported presets and noting GPU/CPU and 2D/3D coverage, making it easy to separate from generic scene, node, or animation siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action is given a clear context: presets lists available presets, create adds a particle node, set edits one, get retrieves settings, restart previews one-shot effects, and convert switches between GPU and CPU. It also explains one-shot behavior and when to call restart. It stops short of naming alternative tools for adjacent use cases like keyframed animation, but the action-level guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

physicsPhysicsA

Physics bodies and collision: create a body/area with its collision shape (and optionally its sprite/mesh, auto-fitted) in one call, fit shapes to visuals, set collision layers/masks by name, add joints, raycast the edited scene, and change project physics settings (gravity, tick rate, engine).

Actions:

  • body: {type: static_2d|character_2d|rigid_2d|area_2d|animatable_2d|static_3d|character_3d|rigid_3d|area_3d|animatable_3d (or a class name), name?, parent?='.', position?, rotation? (degrees), shape?: {type: rect|circle|capsule|segment|world_boundary|convex|concave|polygon (2D) | box|sphere|capsule|cylinder|world_boundary|convex|concave|polygon (3D), size?, radius?, height?, points?, position?, rotation?, one_way?, disabled?} (default rect 32x32 / box 1m), shapes?: [several], sprite?: res://img.png (adds Sprite2D/Sprite3D) | mesh?: {type: 'BoxMesh', size: [1,1,1]} (adds MeshInstance3D) — the first shape is fitted to the visual (its opaque pixels) when it has no size/radius/points, layer?: [names|numbers], mask?: [names|numbers], script?, groups?, props?, visual_props?, children?: [node specs]} create a physics body + CollisionShape (+ visual) in one undoable step.

  • fit_shape: {path: body, its CollisionShape, or its Sprite2D/MeshInstance3D child, from?: visual node path (default: first Sprite2D/AnimatedSprite2D/MeshInstance3D/Sprite3D child), kind?: rect|circle|capsule|convex (2D, convex traces sprite alpha) | box|sphere|capsule|cylinder|convex|trimesh (3D), grow?: px/units (negative shrinks), trim?=true (2D: fit the opaque pixels of the current frame, not the padded frame rect)} size the collision shape to the visual (sprite frame incl. hframes/vframes/region/scale/flip; mesh AABB or hull). Creates the CollisionShape if missing.

  • layers: {path | paths, layer?: ['player'] | [2], mask?: ['world', 'enemies'] | [1, 3], mode?: set|add|remove} set collision_layer/mask using layer names from project settings (name them with project.set_layer_name) or layer numbers 1-32 (not bitmasks). Without layer/mask: shows current layers by name.

  • joint: {type: pin_2d|groove_2d|damped_spring_2d|pin_3d|hinge_3d|slider_3d|cone_3d|generic_6dof_3d, node_a, node_b, parent?=node_a's parent, name?, position? (parent space) | at?: mid|a|b (default mid), props?} connect two physics bodies. Groove/spring length defaults to the distance between the bodies.

  • raycast: {from: [x,y] | [x,y,z], to, mask?: names|numbers, areas?: bool, type?: 2d|3d} cast a ray in the edited scene (editor world, global coordinates): hit collider, position, normal. For the running game use game.raycast.

  • settings: {gravity?, gravity_direction?, linear_damp?, angular_damp?, engine_3d?: DEFAULT|GodotPhysics3D|Jolt Physics, gravity_2d?, gravity_direction_2d?, linear_damp_2d?, angular_damp_2d?, engine_2d?, ticks_per_second?, max_steps_per_frame?, jitter_fix?, interpolation?, settings?: {'physics/...': value}} read/change project physics settings (no args = read). 2D gravity is px/s² (default 980), 3D m/s² (9.8).

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoJoint anchor: mid | a | b.
toNo
fromNo
growNofit_shape: grow (or shrink if negative) the fitted shape.
kindNofit_shape: shape kind.
maskNo
meshNo
modeNolayers: set | add | remove.
nameNoNode name.
pathNoNode path relative to the scene root ('.' = root, 'Player/Sprite2D', '%Unique'), or a res:// file path, depending on the action.
trimNofit_shape: fit opaque sprite pixels (default true) instead of the whole frame.
typeNoBody type (body) or joint type (joint).
areasNoraycast: also hit Areas.
layerNo
pathsNoSeveral node paths (layers).
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
shapeNo
actionYesWhat to do. See the tool description for each action's parameters.
groupsNoGroups to add the body to.
node_aNoFirst body of the joint.
node_bNoSecond body of the joint.
parentNoParent node path.
scriptNores:// script to attach to the body.
shapesNoSeveral shape specs.
spriteNores:// texture: adds a Sprite2D (2D) / Sprite3D (3D) child.
gravityNo3D gravity m/s².
childrenNoExtra child node specs {type, name?, props?}.
positionNo[x, y] or [x, y, z].
rotationNo
settingsNoRaw physics settings {'physics/2d/default_gravity': 980}.
engine_2dNo2D physics engine.
engine_3dNo3D physics engine.
gravity_2dNo2D gravity px/s².
jitter_fixNoPhysics jitter fix.
linear_dampNo3D default linear damp.
angular_dampNo3D default angular damp.
visual_propsNoProperties for the created sprite/mesh node.
interpolationNoPhysics interpolation.
linear_damp_2dNo2D default linear damp.
angular_damp_2dNo2D default angular damp.
ticks_per_secondNoPhysics ticks per second (default 60).
gravity_directionNo3D gravity vector.
max_steps_per_frameNoMax physics steps per frame.
gravity_direction_2dNo2D gravity vector.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, but the description adds rich behavioral context: creation is undoable, fit_shape creates a missing CollisionShape, settings without arguments performs a read, and raycast operates in the editor world with global coordinates. It also discloses defaults for shapes, gravity units, and tick rate, giving the agent operational confidence beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is necessarily long for a 45-parameter, six-action tool and is front-loaded with a summary followed by structured action bullets. It is dense and some action bullets are run-on, but each sentence carries specific calling information. It is appropriately sized for the complexity, though not maximally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation-oriented tool with no output schema, the description covers inputs, defaults, alternatives, and editor-vs-runtime behavior thoroughly. It only briefly mentions return information for raycast and omits return details for other actions, which is a minor gap for an agent needing to chain calls. Overall, it is complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema description coverage is already high at 84%, the description adds substantial action-specific meaning: body shape types, default rect/box sizes, fit_shape visual-fitting rules, layer name/number semantics, joint types and anchor defaults, and settings units/defaults. This goes well beyond the schema's brief per-parameter notes and directly guides correct parameter construction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-and-resource statement: physics bodies, collision shapes, joints, raycasts, and project physics settings. It enumerates each action with domain-specific terminology, making it easy to distinguish from siblings like node, scene, or project. An agent can identify the tool's scope 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action list clearly implies when each sub-operation applies, and the raycast entry explicitly directs the agent to game.raycast for the running game. However, there is no broader guidance on when to use this tool versus node/scene for creating physics objects, and no explicit when-not conditions beyond the raycast distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

projectGodot projectA

Project-level info and settings of the connected Godot project: overview, project settings, autoloads (singletons), input map actions, physics/render layer names, plugins, UIDs. Also creates brand new projects.

Actions:

  • info: {} overview: name, Godot version, main scene, autoloads, input actions, file counts, open scenes, renderer.

  • get_setting: {name} read a project setting, e.g. 'display/window/size/viewport_width'.

  • list_settings: {prefix?, limit?} list settings under a prefix, e.g. 'physics/2d'.

  • set_setting: {name, value} or {settings: {name: value}} change project settings (saved to project.godot).

  • set_main_scene: {scene} set the scene that runs on Play.

  • autoloads: {} list autoload singletons.

  • add_autoload: {name, path} register a script/scene as a global singleton (e.g. an event bus or game state).

  • remove_autoload: {name} unregister an autoload singleton.

  • input_actions: {include_builtin?} list input actions and their bindings.

  • add_input_action: {name, events: ['key:W', 'key:Up', 'joy:a', 'joy_axis:left_x-', 'mouse:left'], deadzone?, append?} or {actions: {name: [events]}} create/replace input actions. Prefer actions over hardcoded keys in scripts.

  • remove_input_action: {name} delete an input action.

  • layers: {kind?} named layers (2d_physics, 3d_physics, 2d_render, ...).

  • set_layer_name: {kind, layer: 1-32, name} name a physics/render layer, returns its bit value for collision_layer/mask.

  • plugins: {} list add-ons in res://addons and whether they are enabled.

  • set_plugin_enabled: {name, enabled}

  • uid: {path} convert between res:// path and uid://.

  • create_project: {path, name, kind?: '2d'|'3d', renderer?: 'forward_plus'|'mobile'|'gl_compatibility', pixel_art?, width?, height?} create a new Godot project folder with Godot Forge installed, then connect to it (launches the editor).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoLayer kind, or '2d'/'3d' for create_project.
nameNoSetting/action/autoload/layer/plugin name, or project name for create_project.
pathNores:// path, or filesystem folder for create_project.
layerNoLayer number 1..32.
sceneNores:// scene path.
valueNo
actionYesWhat to do. See the tool description for each action's parameters.
eventsNoInput specs like 'key:Space', 'joy:a', 'mouse:left', 'joy_axis:left_y-'.
prefixNoSettings prefix.
actionsNo{action_name: [event specs]}.
enabledNoEnable/disable.
settingsNoSeveral settings at once.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and openWorldHint=false, so the agent knows this mutates local project state. The description adds real value beyond that: set_setting is 'saved to project.godot', create_project 'launches the editor', and set_layer_name 'returns its bit value'. It stops short of noting that remove_autoload/remove_input_action mutate the project file or that removal is not automatically reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is front-loaded with scope, and the action list is dense with no filler. It is long, but for a 17-action multiplexer nearly every line earns its place; only minor redundancy exists between the action lines and the generic parameter descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and 12 parameters spread across 17 actions, the description is the main contract, and it handles inputs well. Return values are only described incidentally (set_layer_name), so an agent gets no picture of what info, list_settings, or plugins return; for a tool this broad that is a real but modest gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92%, but the generic schema describes fields abstractly ('Setting/action/autoload/layer/plugin name'), so the description carries the crucial mapping of which parameters each action consumes, plus concrete syntax examples ('key:W', 'joy_axis:left_x-', 'physics/2d', layer 1-32). This adds substantial meaning the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (project-level info and settings of the connected Godot project) and enumerates the exact scope: settings, autoloads, input maps, layers, plugins, UIDs. This is clearly distinguishable from siblings like scene, node, script, or resource, which cover other Godot domains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each of the 17 actions is paired with its purpose and parameters, and there is explicit steering ('Prefer actions over hardcoded keys in scripts'), which tells the agent when to use add_input_action. However, there is no explicit when-not guidance or routing against sibling tools (e.g., when to use project vs editor or files for path handling).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resourceResourcesA

Resource files (.tres): materials, shapes, themes, curves, custom Resource classes (e.g. item data). Inline resources can also be set directly through node props with {"type": "ClassName", ...}.

Actions:

  • create: {path, type, props?, script?} e.g. type=StandardMaterial3D props={albedo_color:'#ff0000'}; type=Resource script=res://item_data.gd for custom data.

  • read: {path, all?}

  • edit: {path, props}

  • duplicate: {path, to, props?}

  • assign: {path: node, property, resource: 'res://..' | {type,...}, scene?}

  • extract: {path: node, property, save_path} save an embedded resource to its own file.

  • types: {base='Resource', filter?} instantiable resource classes.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoDestination path.
baseNoBase class.
pathNores:// resource path (node path for assign/extract).
typeNoResource class.
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
actionYesWhat to do. See the tool description for each action's parameters.
filterNoSubstring filter.
propertyNoNode property name.
resourceNo
save_pathNoWhere to save.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, correctly signaling a mostly-mutating but non-destructive, local-only tool; the description does not contradict this. It adds some behavior context (extract writes an embedded resource to its own file; create can take a custom script), but says nothing about disk writes, permission needs, or reversibility of edit/duplicate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one sentence, followed by a compact action list where each line carries payload shape plus a concrete example. Dense but every line earns its place; only mild verbosity in the example payloads.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, 7-action tool with no output schema, the description covers each action's required arguments, which is the main gap the schema leaves. It does not describe return values or failure modes, but with no output schema that omission is tolerable rather than disqualifying.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 90% schema coverage the baseline is 3, but the description goes further by binding parameters to actions (e.g. assign uses path=node, property, resource='res://..' or inline {type,...}; create accepts type=Resource with script=res://item_data.gd). This supplies per-action meaning the flat schema cannot express. Return/error semantics are still absent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific resource domain (Godot .tres resource files: materials, shapes, themes, curves, custom Resource classes) and enumerates the seven actions with their argument shapes. An agent can tell this apart from node/scene/script siblings by the resource-centric scope, though the definition never explicitly names a neighboring tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The per-action breakdown (create/read/edit/duplicate/assign/extract/types) with example payloads gives clear context for which action applies to which task. It also notes that inline resources can be set directly through node props, which implicitly flags an alternative path. No explicit when-not guidance or routing to siblings, 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.

runRun the gameA

Play the game from the editor and read its output. 'play' saves open scenes, launches, waits until the Godot Forge runtime inside the game connects, and returns startup errors. Then use game/input/view to interact.

Actions:

  • play: {scene?: 'main'|'current'|'res://x.tscn', restart?=true, timeout?=20, settle?=0.5, mute?} start the game. mute silences game audio (default: the godot_forge/mute_game_audio editor setting; always on in headless/test editors).

  • stop: {} stop the running game.

  • status: {} playing? connected? paused on an error? live fps/scene.

  • errors: {since?, level?='error'|'warning', source?} runtime + editor errors with script file:line and stack.

  • output: {since?, limit?} everything the game printed.

  • continue: {} resume after the debugger stopped on an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
muteNoMute game audio.
levelNo'error' (default) or 'warning'.
sceneNo'main' (default), 'current', or a res:// scene.
sinceNoOnly entries after this log sequence number.
actionYesWhat to do. See the tool description for each action's parameters.
restartNoRestart if already running (default true).
timeoutNoSeconds to wait for the game to connect.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, which says almost nothing about behavior. The description carries the load well: play SAVES open scenes (a real side effect not in annotations), waits until the in-game runtime connects, and returns startup errors; mute defaults to the editor setting and is forced on in headless editors; continue resumes after the debugger stopped on an error. That is meaningful disclosure beyond structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose and usage flow, followed by a compact per-action list with no filler sentences. Slightly dense with an undocumented 'settle' option, but every line earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, action-dispatch tool with no output schema and only safe-by-default annotations, the description covers launch, stop, status, error retrieval (script file:line and stack), streamed output, and debugger resume. Return-shape and failure-mode details are thin but adequate for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), but the description adds value the schema does not: it maps which parameters belong to which action and supplies defaults ('restart?=true, timeout?=20, mute?', 'level?=error'). One caveat: it references a 'settle?=0.5' parameter that does not appear in the input schema, a minor misalignment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Play the game from the editor and read its output') and immediately distinguishes the tool from the interaction siblings by deferring them ('Then use game/input/view to interact'). An agent can tell it apart from 'game', 'input', and 'view' 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing guidance ('Then use game/input/view to interact') and explains what each of the six actions is for, including easing back after a debugger stop via 'continue'. It stops short of stating when NOT to use it (e.g. vs. the 'game' sibling for non-editor launches), so there is no exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sceneScenesA

Create, open, save and inspect scene files (.tscn). The edited scene is the target of the node/signal tools. Edits are auto-saved after every call.

Actions:

  • create: {path, root_type='Node2D', root_name?, inherits?: 'res://base.tscn', props?, script?, open?=true, set_main?} new scene file (becomes main scene if none is set).

  • open: {path} open in the editor and make it the edited scene.

  • current: {} the edited scene and all open scenes.

  • tree: {scene?, path?, depth?, props?, expand_instances?} node tree of the edited (or any) scene. props=true adds non-default property values.

  • list: {path?} every scene in the project with its root type.

  • instance: {scene_path, parent?='.', name?, props?} add an instance of another scene (e.g. enemy.tscn) as a child.

  • pack_branch: {path, save_path} save a node subtree as its own reusable scene and replace it with an instance.

  • save: {path?} save (or 'save as' with path).

  • save_all: {} save every open scene.

  • close: {path?, save?=true}

  • reload: {path?} reload from disk.

  • source: {path?} raw .tscn text.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNode name.
pathNores:// scene path (or node path for pack_branch).
depthNoMax tree depth.
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
actionYesWhat to do. See the tool description for each action's parameters.
parentNoParent node path.
root_nameNoRoot node name (default: from file name).
root_typeNoRoot node class, global class_name, or res://script.gd.
save_pathNoWhere to save the packed branch.
scene_pathNoScene to instance.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the mutating nature is already known; the description adds genuinely new behavior: 'Edits are auto-saved after every call', the 'becomes main scene if none is set' side effect of create, the save?=true default on close (closing persists), and the subtree-replacement semantics of pack_branch. This is real disclosure beyond the structured fields, though it never states what happens on failed saves or whether reload discards unsaved work.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary is front-loaded and the per-action list is terse and scannable; every line adds information. The compressed pseudo-signature syntax ({path, root_type='Node2D', ...}) takes some parsing effort and slightly overloads the prose, keeping it off a perfect 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-action, 11-parameter tool with no output schema, the description covers invocation well and annotates the one return type that matters most (source returns raw .tscn text). It leaves the return shapes of tree/current/list unspecified, but with no output schema and full schema coverage elsewhere, the definition is close to sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a 3 would be the floor, but the description goes well past the schema by mapping which parameters apply to which of the 12 actions (e.g. create takes root_type/root_name/inherits/open/set_main; instance takes scene_path/parent/name/props). The schema itself provides no action-to-parameter mapping, so this is essential, non-redundant semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names the verb family (create/open/save/inspect) and the exact resource (.tscn scene files), and crucially states the relational scope: 'The edited scene is the target of the node/signal tools.' An agent can immediately distinguish this from the node, signal, and project 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action list implicitly routes between alternatives — 'list: every scene in the project' vs 'current: the edited scene and all open scenes' vs 'tree: node tree' are clearly differentiated. The note that other tools operate on the edited scene functions as cross-tool usage guidance. It stops short of explicit when-not-to-use or exclusion statements, so it lands just below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scriptScriptsA

GDScript (and C#) files. Creating/writing/editing a .gd reloads it in the editor and returns compile diagnostics immediately — fix errors before running. Use templates for common controllers.

Actions:

  • create: {path, content? | template?: 'default'|'empty'|'platformer_2d'|'topdown_2d'|'fps_3d'|'state_machine'|'autoload_events', extends?, class_name?, actions?: {jump,left,right,up,down}, attach_to?: node path, scene?} new script, optionally attached.

  • read: {path, outline?} script source (and its outline).

  • write: {path, content} replace the whole script; returns diagnostics (errors + warnings).

  • edit: {path, edits: [{old, new, replace_all?}]} exact replacements; returns diagnostics.

  • lint: {path | paths} full language-server diagnostics (all errors and warnings such as unused variables, shadowing, unsafe casts) for scripts on disk.

  • validate: {path? | paths? | content?} compile check. No args = every script in the project.

  • outline: {path} extends, class_name, signals, exported vars, functions with line numbers.

  • attach: {path: node, script, scene?}

  • detach: {path: node}

  • references: {symbol} find usages across the project.

  • classes: {} project class_name classes.

  • templates: {} available templates.

  • open: {path, line?} show the script to the user in the script editor.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNores:// script path (node path for attach/detach).
editsNoExact replacements.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
actionYesWhat to do. See the tool description for each action's parameters.
scriptNoScript path for attach.
symbolNoIdentifier to search for.
actionsNoInput action names for templates.
contentNoScript source.
extendsNoBase class for templates.
templateNoTemplate name.
attach_toNoNode path to attach the new script to.
class_nameNoGlobal class name to declare.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false), it discloses genuinely useful behavior: creating/writing/editing a .gd reloads it in the editor and returns compile diagnostics immediately, write replaces the entire script, edit does exact replacements, lint reports unused variables/shadowing/unsafe casts, and open surfaces the script to the user. This is rich context the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A tight two-sentence behavioral lead-in followed by a one-line-per-action list. For a 13-action tool this is dense but every line earns its place, and the most important behavioral note (diagnostics returned on edit) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so for most actions (diagnostics, outline contents, references). It is nearly complete for a 12-param multi-action tool, though it does not explicitly confirm persistence semantics of write/edit or spell out what `read` returns versus `outline`.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), but the schema is a flat union of 12 params with only a single enum, so the description's per-action parameter mapping ('create: {path, content? | template?: ...}', 'attach: {path: node, script, scene?}') is what actually tells the agent which parameters apply to which action. That is meaningful value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line names the concrete resource (GDScript/C# .gd files) and the verb set is enumerated per action, so an agent can tell this apart from the generic `files` sibling and from `scene`/`node`. Each action is stated as verb+resource (create a new script, read source, edit with exact replacements, lint diagnostics, etc.).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives real routing guidance: 'fix errors before running', 'Use templates for common controllers', and distinguishes lint ('full language-server diagnostics ... for scripts on disk') from validate ('compile check', no args = whole project). It stops short of explicitly contrasting edit vs write or read vs outline, so it falls short of the 5-level when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shaderShadersA

Godot shaders (.gdshader): create from ready-made templates (dissolve, outline, hit flash, water, toon, hologram, pixelate, wave, scroll, vignette...) and assign them in one call, compile-check code with the engine's shader compiler (with line numbers and Godot 3 -> 4 migration hints), read/edit, list uniforms, set shader parameters on nodes, and save ShaderMaterials. Godot 4 syntax: 'source_color' (not hint_color), 'uniform sampler2D screen_texture : hint_screen_texture' (not SCREEN_TEXTURE).

Actions:

  • templates: {} templates per shader type.

  • create: {path: 'res://shaders/x.gdshader', type?: canvas_item|spatial|particles|sky|fog (inferred from assign_to / template / scene), template?='blank' (canvas_item: blank|dissolve|outline|flash|water|toon|hologram|pixelate|wave|scroll|vignette; spatial: blank|dissolve|outline|flash|water|toon|hologram|wave|scroll; particles|sky|fog: blank), code? (instead of a template; its shader_type wins, 'shader_type ;' is added if missing), assign_to?: node path (creates a ShaderMaterial on material / material_override / process_material / environment sky; the spatial 'outline' template goes into material_overlay so the object's own materials stay), overlay? (spatial: use material_overlay), next_pass? (spatial: chain after the current material instead), surface?, params?: {uniform: value}, material_path?: also save the ShaderMaterial as .tres, overwrite?} write + compile-check. Returns ok, diagnostics and uniforms.

  • validate: {path | code, type?} compile with Godot's shader compiler (first error with line) + lint (missing shader_type, unbalanced braces, Godot 3 names like hint_color/SCREEN_TEXTURE/WORLD_MATRIX). type is prepended when code lacks shader_type.

  • read: {path: .gdshader | ShaderMaterial .tres | node path} code, shader type and parsed uniforms.

  • edit: {path, edits: [{old, new, replace_all?}] | code} exact replacements (or full replacement) then re-validate; returns diagnostics.

  • uniforms: {path: .gdshader | material .tres | node path} uniforms with type, hint, default, range, group and current value (for materials).

  • set_param: {path: node path | ShaderMaterial .tres, param + value | params: {name: value}, material_index?} set shader parameters (coerced: '#hex' colors, [x,y,z] vectors, 'res://tex.png', {type: 'NoiseTexture2D', noise: {type: 'FastNoiseLite'}}). Undoable on nodes with embedded materials; a node whose ShaderMaterial is a shared .tres file edits and saves that file.

  • material: {path: 'res://materials/x.tres', shader: 'res://x.gdshader', params?: {uniform: value}, props?: {render_priority, next_pass}, assign_to?: node path, surface?, overwrite?} create a ShaderMaterial file, or update an existing one in place (keeps its other params; overwrite=true starts fresh). Optionally assign it to a node.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoShader source code.
pathNores:// .gdshader / .tres path, or node path (read/uniforms/set_param).
typeNoShader type: canvas_item | spatial | particles | sky | fog.
editsNoExact replacements.
paramNoOne uniform name (set_param).
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
valueNo
actionYesWhat to do. See the tool description for each action's parameters.
paramsNoShader parameters {uniform: value}.
shaderNores:// .gdshader for a ShaderMaterial.
overlayNoshader.create: assign a spatial shader to the node's material_overlay.
surfaceNoMesh surface index (spatial).
templateNoTemplate name (see 'templates').
assign_toNoNode path to put the new ShaderMaterial on.
next_passNoshader.create: chain a spatial shader as next_pass of the node's current material.
overwriteNoReplace an existing file.
material_pathNoAlso save the created ShaderMaterial to this .tres.
material_indexNoWhich ShaderMaterial on the node when it has several (default: the one with those uniforms).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already disclose readOnlyHint=false, destructiveHint=false, and openWorldHint=false, but the description goes well beyond them: it notes that create writes and compile-checks, returns ok/diagnostics/uniforms, set_param is undoable on nodes with embedded materials, a shared .tres material edits and saves that file, and overwrite=true starts fresh. It also discloses validation behavior such as first-error line numbers, lint checks, and Godot 3-to-4 migration hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but it is structured around the eight actions and front-loads the overall purpose before listing action-specific parameters. Most sentences carry actionable detail, though the Godot 4 syntax note and some action descriptions are dense enough that the text could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given eight actions, nineteen parameters, no output schema, and only minimal annotations, the description is complete enough for an agent to invoke the tool correctly. It covers action selection, key parameter interactions, return values such as diagnostics and uniforms, side effects, and Godot-version syntax constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 95%, so the baseline would be 3, but the description adds substantial action-specific meaning beyond the schema: it documents template names per shader type, type inference from assign_to/template/scene, special handling for spatial outline via material_overlay, overlay and next_pass routing, params coercion examples, and material update semantics. These details help an agent choose and populate the correct parameters rather than relying on generic schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb set and resource: it creates/read/edit/validates Godot .gdshader files, assigns them to nodes, lists uniforms, and saves ShaderMaterials. The opening sentence enumerates the exact scope and includes recognizable Godot-specific artifacts, so an agent can distinguish this from general resource, script, or node tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for each action through the 'Actions:' section, including when to use templates, create, validate, read, edit, uniforms, set_param, and material. It does not explicitly name alternative tools or state when-not-to-use conditions, but the action-level guidance is strong enough to route most invocations correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

signalSignalsA

Inspect and wire signals in the edited scene. Connections made here are saved in the scene. 'connect' can generate the handler function in the target's script.

Actions:

  • list: {path, connected_only?} signals of a node with their arguments and connections.

  • connect: {from, signal, to, method?, create_method?=true, body?, binds?, deferred?, one_shot?} e.g. Area2D body_entered -> Player. Method defaults to on_.

  • disconnect: {from, signal, to, method}

  • graph: {scope?: 'scene'|'project'} connection graph (project scope parses all scenes and scripts incl. .connect()/.emit() calls).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoReceiving node path.
bodyNoBody for a generated handler (GDScript, no indentation needed).
fromNoEmitting node path.
pathNoNode path relative to the scene root ('.' = root, 'Player/Sprite2D', '%Unique'), or a res:// file path, depending on the action.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
scopeNo'scene' or 'project'.
actionYesWhat to do. See the tool description for each action's parameters.
methodNoHandler method name.
signalNoSignal name.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds important behavioral context beyond them: connections are persisted in the scene, 'connect' can generate a handler function in the target's script, and project-scope graph parsing reads all scenes and scripts. It doesn't describe failure modes or return payloads, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a compact action list; every sentence carries information (scope, persistence, defaults, example). No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with no output schema, the description covers action semantics, defaults, persistence, and cross-file parsing well. It omits what each action returns (e.g., list output shape, graph format) and any permission requirements, leaving a modest gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high, but the input schema only lists nine generic properties while the description documents action-specific parameters absent from the schema (connected_only, create_method, binds, deferred, one_shot) plus defaults like '_on_<from>_<signal>'. This goes meaningfully beyond the structured fields, though it doesn't explain each optional flag in depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Inspect and wire signals in the edited scene,' then enumerates four concrete actions (list, connect, disconnect, graph). It is clearly distinguishable from generic siblings like node or script, which don't deal with signal wiring.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It establishes clear operating context: signals in the edited scene, connections saved in the scene, and defaults for each action (method name pattern, create_method=true). It does not explicitly route the agent away from sibling tools or state when-not to use it, 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.

testTest & verifyA

Verify the game works. Scenarios are scripted playtests (play → input → wait → assert → screenshot) that you can save under res://tests/scenarios and re-run as regression tests. Also project lint (broken references, missing shapes/textures, script errors), GUT/gdUnit4 unit tests, and screenshot baselines.

Actions:

  • scenario: {scenario: {name?, scene?, steps: [...], keep_running?, stop_on_failure?=true, mute?=true}, save_as?: 'name'} run a playtest (audio muted unless mute=false). Steps: {wait_for: expr} {wait_node: path} {wait_signal: {path, signal}} {wait: s} {input: [input steps]} {assert: expr, message?} {expect_node: path} {expect_no_node: path} {eval: expr} {call: {path, method, args}} {set: {path, props}} {sample: {...}} {screenshot: label} {compare_baseline: 'res://tests/baselines/x.png'} {assert_no_errors: true} {time_scale: n}. Expressions run with the scene root as self.

  • run_all: {} run every saved scenario in res://tests/scenarios.

  • list: {} saved scenarios and detected unit test frameworks.

  • lint: {path?} check all scenes (missing dependencies, broken refs, missing collision shapes/textures) and all scripts (compile errors). Run before playing.

  • unit: {framework?: 'gut'|'gdunit4', dir?='res://test', filter?} run unit tests headless.

  • compare_image: {image_path | image_b64, baseline, threshold?=0.01, update?} compare against a baseline PNG (records it if missing).

ParametersJSON Schema
NameRequiredDescriptionDefault
dirNoTest directory.
nameNoSaved scenario name (res://tests/scenarios/<name>.json).
actionYesWhat to do. See the tool description for each action's parameters.
save_asNoAlso save the scenario under this name.
baselineNoBaseline PNG path.
scenarioNoScenario object {name?, scene?, steps: [...]}.
frameworkNo'gut' or 'gdunit4'.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-read-only, non-destructive, closed-world, so the safety profile is partly covered. The description still adds real behavioral context the annotations do not: audio is muted by default ('audio muted unless mute=false'), stop_on_failure defaults to true, scenarios can be persisted via save_as, and compare_image records a baseline if missing. These are meaningful side-effect disclosures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening summary is front-loaded, and the per-action bullet list with nested step types is dense but well organized. The exhaustive step enumeration is lengthy yet justified given the schema treats steps as free-form; only minor trimming is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a broad test/verify tool with no output schema, the description never explains what a run returns — pass/fail results, assertion output, error reporting, or how a failed scenario surfaces. The input side is thoroughly covered, but the result side is a notable gap for a verification tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 substantial meaning beyond the schema — notably the entire step sub-language (wait_for, wait_node, wait_signal, assert, expect_node, screenshot, etc.) and the note that expressions run with the scene root as self. This elaborates the opaque `scenario` object that the schema only marks as additionalProperties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete verb+resource ('Verify the game works') and then enumerates each of the six actions with what it does (scripted playtests, project lint, unit tests, baseline comparison). It is clearly distinguishable from siblings like `run`, `game`, and `input`. It falls short of 5 only because it is a kitchen-sink tool bundling several distinct capabilities rather than one focused function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is one sequencing hint ('Run before playing' for lint) and scenario explanation, but no explicit when-to-use/when-not guidance and no routing to alternatives among the many siblings. Usage is largely implied by the action names rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tilesTiles (TileMapLayer / TileSet)A

2D tile maps with TileMapLayer nodes (the deprecated TileMap node is never used). Build a TileSet from an atlas image in one call (tiles auto-detected from non-transparent cells, collision, terrains for autotiling, custom data), add layers, then paint: cells/rects/lines, terrain autotiling, or whole levels from ASCII art. All painting is undoable. Coordinates are map cells, tiles are atlas coords [x, y].

Actions:

  • create_tileset: {path: res://tiles/world.tres, texture: res://art/tiles.png, tile_size=[16,16], separation?=0|[x,y], margin?=0|[x,y], all_tiles?=false (else only non-transparent cells get tiles), overwrite? (layers of open scenes using the old TileSet are relinked), tile_shape?, physics_layers?: [{collision_layer: [1|'world'], collision_mask: [...]}], full_collision?: bool (full-square polygon on every tile) | collision_tiles?: [[x,y] | {tile:[x,y], points?:[[x,y]...] (tile-centered), one_way?}], terrains?: [{name, color?, mode?: match_corners_and_sides|match_sides|match_corners, block?: [x,y] (origin of a 3x3 autotile block: corners/edges/center; or {origin, size}), tiles?: [[x,y]...] (fully this terrain) | {"x,y": 'all' | ['top','right','bottom_right',...] | '010/111/010' 3x3 mask | {center:'grass', top:'dirt', ...}}}], custom_data?: [{name, type: int|float|bool|string|vector2|color..., values?: {"x,y": value}}]} create a TileSet from an atlas image. No art yet? assets.placeholder {kind: 'tileset'} makes one.

  • info: {path: res://x.tres | TileMapLayer node, tiles?=true} sources, atlas grid, tile coords (with collision/terrain/custom data per tile), physics layers, terrain sets, custom data; for a layer also used cells/rect.

  • create_layer: {tileset: res://x.tres, name?='TileMapLayer', parent?='.', position?, index?, props?: {z_index, y_sort_enabled, collision_enabled, ...}} add a TileMapLayer node. Use several layers for background/ground/decoration.

  • paint: {path: layer, cells: [[x,y],...] | rect: [x,y,w,h] | line: [[x1,y1],[x2,y2],...], tile: [ax,ay] (or [[ax,ay],[bx,by]] to pick randomly for variety), source?=first, alternative?=0} set cells to a tile.

  • fill_rect: {path, rect: [x,y,w,h], tile: [ax,ay], border?: [ax,ay] (different tile on the edge), hollow?: bool (only the edge; interior erased)} fill a rectangle, e.g. rooms with walls.

  • erase: {path, cells | rect | line} remove tiles.

  • terrain: {path, cells | rect | line, terrain: name|index, terrain_set?=0, mode?: connect|path, ignore_empty_terrains?=true} paint with terrain autotiling (the TileSet needs terrains, see create_tileset). Use -1 as terrain to erase terrain-aware.

  • from_ascii: {path, rows: ['##########', '#........#', '#..gggg..#', '##########'], legend: {'#': [3,0], '.': null (erase), 'g': {terrain: 'grass'} | 'grass', 'w': {tile: [1,0], source?, alternative?}}, origin?=[0,0], clear?=false} paint a whole level from ASCII art; spaces leave cells untouched. Best way to lay out levels.

  • read: {path, rect?: [x,y,w,h] (default: used rect), legend?: same legend as from_ascii ({char: [ax,ay] | null (empty char) | 'grass' | {terrain: 'grass'}}), cells?: bool} used cells plus an ASCII picture (terrain cells map to their terrain's char; other unknown tiles get auto characters, returned in auto_legend). Use it to check what's painted.

  • clear: {path} erase every cell of the layer (undoable).

ParametersJSON Schema
NameRequiredDescriptionDefault
cellNo[x, y] single cell.
lineNo[[x1, y1], [x2, y2], ...] polyline of cells.
modeNoterrain: connect (areas) or path (roads/rivers).
nameNoNode name.
pathNoTileMapLayer node path (scene-relative), or res:// TileSet path for create_tileset/info.
rectNo[x, y, width, height] in cells.
rowsNoASCII rows: list of strings (one per map row) or one string with line breaks.
tileNo
cellsNo[[x, y], ...] map cells.
clearNofrom_ascii: clear the layer first.
indexNoChild index.
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
tilesNoinfo: include per-tile listing (default true).
actionYesWhat to do. See the tool description for each action's parameters.
borderNo[ax, ay] border tile for fill_rect.
hollowNofill_rect: only the outline.
legendNo{char: [ax, ay] | null | {tile, source?, alternative?} | {terrain}}.
marginNo
originNo[x, y] map cell of the first ASCII character.
parentNoParent node path (default '.').
sourceNoTileSet source id (default: first source).
terrainNo
textureNores:// atlas image for create_tileset.
tilesetNores:// TileSet for create_layer.
positionNo[x, y] layer position.
terrainsNoTerrain definitions (see create_tileset).
all_tilesNocreate_tileset: create tiles for every cell, even fully transparent ones.
overwriteNoReplace an existing TileSet file.
tile_sizeNo[w, h] tile size in pixels (default [16, 16]).
separationNo
tile_shapeNosquare | isometric | half_offset_square | hexagon.
alternativeNoAlternative tile id (default 0).
custom_dataNoCustom data layers [{name, type, values?}].
terrain_setNoTerrain set index (default 0).
full_collisionNoFull-square collision on every tile.
physics_layersNo[{collision_layer, collision_mask}] layer numbers or names.
collision_tilesNoTiles that get collision: [[x,y]] or {tile, points?, one_way?}.
ignore_empty_terrainsNoterrain: ignore empty terrain bits when matching.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, and the description reinforces that mutations are safe by stating 'All painting is undoable' and calling out clear as undoable. It also discloses that overwrite relinks layers of open scenes using the old TileSet, which is genuinely useful behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded overview (what, coordinate conventions, undo guarantee) followed by a scannable per-action breakdown. It is long, but the 10-action, 39-parameter surface justifies the density and every action entry carries distinguishing detail rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description steps in to describe read's return (used cells plus an ASCII picture with auto_legend) and covers the parameter semantics for every action, including required TileSet prerequisites for terrain autotiling. Not every edge case (e.g., error behavior on a missing layer) is covered, keeping it at a strong 4.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 90%, so the baseline is 3. The description exceeds that by explaining non-obvious semantics: the '010/111/010' 3x3 terrain mask format, tile-centered collision points, tile-size/block origins for terrains, the alternative parameter for random variety, and how legends differ between from_ascii and read.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a concrete resource (2D tile maps, TileMapLayer/TileSet) and enumerates the specific verbs available (create_tileset, paint, terrain, from_ascii, read, clear). It explicitly distinguishes itself by stating the deprecated TileMap node is never used and by scoping to tilemap work that no sibling tool covers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides per-action guidance ('Use several layers for background/ground/decoration', 'Best way to lay out levels' for from_ascii, 'Use it to check what's painted' for read, and the assets.placeholder pointer when no art exists). It does not state explicit when-not conditions or name a concrete alternative tool, 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.

uiUser interfaceA

Build game UIs (HUDs, menus, dialogs, inventories) from Control nodes. 'build' creates a whole UI tree in one undoable call with anchor presets, size flags, text and theme overrides; 'menu_template' makes a ready main menu; 'theme' creates project-wide Theme resources with StyleBoxFlat styles; 'inspect' explains why a layout looks wrong. Put in-game HUDs under a CanvasLayer so they don't move with the camera.

Actions:

  • build: {spec: {type, name?, layout?, props?, text?, theme_overrides?, children: [...]} | [specs], parent?='.', scene?} build a UI subtree. layout = anchor preset: full_rect|center|top_left|top_right|bottom_left|bottom_right|top_wide|bottom_wide|left_wide|right_wide|center_top|center_bottom|center_left|center_right|hcenter_wide|vcenter_wide (+ layout_margin, resize: minsize|keep_size); only for nodes NOT inside a Container. Shortcuts per node: text, min_size [w,h], size_flags 'expand_fill'|'shrink_center' (one value = both axes)|{h,v}|[h,v], align/valign (left|center|right, begin|end for boxes), font_size, font_color, color (ColorRect color, Panel background, else text color), separation, margin (MarginContainer: n or [l,t,r,b]), panel/stylebox (StyleBox spec), texture, icon, placeholder, tooltip, unique (%Name access), groups, script, theme (res://theme.tres). Any other key is set as a property (value, max_value, columns, autowrap_mode: 'word_smart'... enum names are matched loosely) or a theme item. theme_overrides: {font_size, font_color, outline_size, separation, colors:{}, constants:{}, font_sizes:{}, fonts:{}, styles:{panel|normal|hover|pressed|fill|background: {bg_color, corner_radius, border_width, border_color, content_margin, shadow_size...}}}. Children given as plain strings become Labels. Returns every created node path (buttons flagged with their 'pressed' signal) and layout warnings. A zero-size Control scene root is stretched to full_rect automatically.

  • menu_template: {title?, subtitle?, buttons?=['Play','Options','Quit'], parent?='.', name?='MainMenu', background?: color | res://image, button_size?=[260,56], font_size?=24, title_size?=56, title_color?, spacing?=16, button_style?: {bg_color, corner_radius, ...} (hover/pressed derived) or {normal, hover, pressed}, theme?} centered main menu: full-rect Control > Background > CenterContainer > VBox(Title, Subtitle, Buttons); in an empty scene whose root is a plain Control (no name/theme given) it is built directly into the root. Buttons get unique names (%PlayButton), shared StyleBoxes and wrap-around focus neighbors. Returns {buttons: {label: path}} to connect 'pressed' signals.

  • layout: {path | paths, preset?, margin?=0, resize?: minsize|keep_width|keep_height|keep_size, size_flags?: 'expand_fill' (both axes) | {h, v} | [h, v], min_size?: [w,h]} apply an anchor preset like the editor's layout toolbar (undoable). Presets don't apply inside Containers: use size_flags/min_size there.

  • theme_override: {path | paths, overrides: {font_size: 32, font_color: '#ffd166', outline_size: 4, font_outline_color: 'black', separation: 8, styles: {panel: {bg_color: '#1d2330', corner_radius: 12}}, fonts: {font: 'res://f.ttf'}}} set per-node theme overrides; a null value removes one. Flat keys are matched to the node's theme items; unknown item names are rejected with the valid list.

  • theme: {path: res://ui/theme.tres, props: {default_font_size?, default_font?: res://font.ttf, colors?: {Button: {font_color: '#fff', font_hover_color: ...}}, constants?: {VBoxContainer: {separation: 12}}, font_sizes?: {Label: {font_size: 20}}, fonts?, icons?, styles?: {Button: {normal: {bg_color, corner_radius, content_margin: [16,8]}, hover: {bg_color}, pressed: {...}, focus: 'empty'}, Panel: {panel: {...}}}, type_variations?: {TitleLabel: 'Label'}}, replace?, assign_to?: node path | 'project'} create or extend a Theme. Type names must be Control classes or declared in type_variations first; item names are checked against what the class uses. Style states other than 'normal' inherit the normal dict, so hover only needs what changes. assign_to 'project' makes it the game-wide default (gui/theme/custom); a node path assigns it to that Control and its children. Use theme_type_variation on nodes to use a variation.

  • font: {path: res://fonts/x.ttf|.otf|.woff2, size?, assign_to?: node path | res://theme.tres | 'project', variation?: {embolden, slant, spacing, spacing_top, baseline_offset, opentype}, save_as?: res://fonts/bold.tres} load a font (imported as FontFile; a file just copied into the project is imported first), optionally as a FontVariation (saved with save_as), and assign it as a node override (+font_size), a theme's default_font or the project default font.

  • focus: {chain: [paths], axis?='vertical'|'horizontal', wrap?=true, mode?: all|click|none} link controls for keyboard/gamepad navigation in order; or {path, neighbors: {left, right, top, bottom, next, previous: path}, mode?} set individual neighbors. Call grab_focus() on the first one in _ready().

  • inspect: {path} layout debugging: rect, global rect, anchors/offsets, detected preset, size flags, min size, what positions it (container vs anchors), parent size, overrides, children rects and warnings (zero-size parents, overlays blocking clicks, collapsed wrapped labels...).

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNofocus chain direction: vertical (default) or horizontal.
modeNofocus mode: all, click or none.
nameNoRoot node name for menu_template.
pathNoControl node path (or res:// path for theme/font).
sizeNoFont size to apply with assign_to.
specNoUI tree spec {type, name?, layout?, text?, props?, theme_overrides?, children?} or an array of them.
wrapNofocus chain wraps from last to first (default true).
chainNoControl paths to link for focus navigation, in order.
pathsNoSeveral node paths.
propsNoTheme contents for 'theme' (default_font_size, colors, styles, ...).
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
themeNores:// Theme to apply to the built menu.
titleNomenu_template title (default: project name).
actionYesWhat to do. See the tool description for each action's parameters.
marginNoMargin in pixels for the anchor preset.
parentNoParent node path for build/menu_template (default '.').
presetNoAnchor preset name, e.g. full_rect, center, bottom_wide.
resizeNoPreset resize mode: minsize (default), keep_width, keep_height, keep_size.
buttonsNomenu_template button labels.
replaceNotheme: start from an empty Theme instead of editing the existing file.
save_asNores:// .tres path to save a FontVariation.
spacingNomenu_template space between buttons (default 16).
min_sizeNo[width, height] custom minimum size.
subtitleNomenu_template subtitle.
assign_toNoNode path, 'project', or res://theme.tres (font) to assign the theme/font to.
font_sizeNomenu_template button font size (default 24).
neighborsNo{left, right, top, bottom, next, previous}: node paths.
overridesNoTheme overrides {item: value} or grouped {colors, constants, font_sizes, fonts, styles, icons}.
title_gapNomenu_template space between title and buttons (default 24).
variationNoFontVariation settings: embolden, slant, spacing, ...
backgroundNomenu_template background color '#101522' or res:// image.
size_flagsNo'expand_fill', 'shrink_center', ['expand','fill'] or {h, v}.
title_sizeNomenu_template title font size (default 56).
button_sizeNomenu_template button [width, height] (default [260, 56]).
title_colorNomenu_template title color, e.g. '#ffd166'.
button_styleNomenu_template button StyleBox spec.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, but the description adds substantial behavioral detail beyond that: calls are 'undoable', returns include created node paths with 'pressed' signals and layout warnings, 'null value removes' a theme override, unknown theme item names are rejected with the valid list, and zero-size Control scene roots are auto-stretched. No annotation contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but appropriately structured for an 8-action, 36-parameter tool: a front-loaded summary paragraph followed by a detailed action list. Most sentences carry unique information, though some parameter-level detail overlaps with the 100% schema coverage, making it slightly less tight than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 actions, 36 params, nested objects, no output schema), the description is complete: it covers all actions, return formats, edge cases (Containers vs anchors, empty scene root behavior, theme variations, font import), and error handling. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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, but the description adds rich semantics far beyond the schema: it documents the nested spec object, lists all layout anchor presets, explains per-node shortcuts (text, min_size, size_flags, align/valign, font_size, etc.), details theme_overrides structure, and describes action-specific parameters like button_style inheritance and font import behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Build game UIs... from Control nodes') and then enumerates eight concrete actions (build, menu_template, theme, font, focus, inspect, etc.), each with a clear purpose. This distinguishes it from generic node/scene siblings by focusing on Control-node UI construction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear action-level usage (e.g., 'build creates a whole UI tree', 'inspect explains why a layout looks wrong') and a contextual tip ('Put in-game HUDs under a CanvasLayer so they don't move with the camera'). It does not, however, name alternative sibling tools (e.g., when to use this instead of node or scene) or explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

viewSee the gameA

Look at things. Screenshots of the running game (optionally annotated with node markers), offscreen renders of any scene from chosen angles with automatic framing (no editor camera fiddling), editor viewport screenshots, and previews of textures/meshes/materials/scenes. Requires a non-headless editor for rendering.

Actions:

  • game: {max_size?=1280, annotate?, annotate_groups?, format?} screenshot of the running game. Returns viewport_size + coord_scale (click coordinate = image px * coord_scale).

  • render: {scene?, focus?: node path, angles?: ['iso','front','top','left','right','back','low'] (3D), size?: [w,h], zoom? (2D), preview_light?=true} render a scene offscreen, auto-framed.

  • editor: {which?: 'auto'|'2d'|'3d'|'editor'} screenshot of the editor viewport or whole editor window (what the user sees).

  • preview: {path} picture of a texture, mesh, material or scene file.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNores:// resource to preview.
sizeNo[width, height] of the render.
zoomNo2D zoom multiplier.
focusNoNode to frame.
sceneNoScene to render (default: edited scene).
whichNoEditor viewport.
actionYesWhat to do. See the tool description for each action's parameters.
anglesNoCamera angles for 3D.
annotateNoDraw markers on nodes in the game screenshot.
max_sizeNoLongest image side in px.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds real behavioral context beyond that: rendering requires a non-headless editor, the `game` action returns viewport_size + coord_scale with the click-coordinate formula, and `render` auto-frames without editor camera fiddling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The one-line summary is front-loaded, followed by a scannable `Actions:` list that groups each mode's parameters inline. 'Look at things' is minor filler, but every subsequent line carries actionable detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so for the `game` action (viewport_size + coord_scale). For a 10-parameter, 4-action tool it is largely complete, though the return shape of `render`/`editor`/`preview` is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 giving defaults (max_size=1280, preview_light=true), enumerating the allowed angle values, and cross-referencing parameters per action. It also mentions parameters (annotate_groups, format, preview_light) not present in the schema, adding interpretation the schema alone lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates the four capture modes (game screenshot, offscreen render, editor viewport, resource preview) with concrete detail, so the tool's role as the visual-capture entry point is clear. It stops short of explicitly distinguishing itself from the sibling `editor` tool, which it partially overlaps with via its own `editor` action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Per-action notes imply when each mode applies (e.g. `render` for offscreen angles, `preview` for texture/mesh/material/scene files), and it flags the non-headless editor requirement. However there is no explicit when-to-use-this-vs-an-alternative routing to siblings like `editor` or `game`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

world3d3D worldA

Build 3D levels in few calls: primitive meshes with material + collision, CSG blockouts (nested boolean trees), materials (files or on nodes), lights, WorldEnvironment/sky presets with a sun, cameras aimed at targets, model import options + instancing, GridMap painting and MeshLibrary creation, and scattering props/vegetation over terrain. Every scene change is undoable. Positions are [x, y, z] in meters (Y up; a Node3D looks down its -Z axis). Colors are hex strings like '#aa8844' or names like 'orange'. Numbers and vectors are validated: a malformed value returns an error instead of a zero/NaN result.

Actions:

  • mesh: {shape: box|sphere|capsule|cylinder|cone|plane|prism|torus|quad|text (default box), parent?='.', name?, size? (box/prism [x,y,z] or one number; plane [w,d]; quad [w,h]; sphere/cylinder: diameter from size), radius?, height?, top_radius?, bottom_radius?, inner_radius?, outer_radius?, text?, font_size?, depth?, pixel_size?, font?, mesh_props?: {raw PrimitiveMesh props}, mesh?: 'res://x.tres' (a Mesh resource instead of shape), material?, position?, rotation_degrees?, scale?, look_at?: [x,y,z] | node path, cast_shadow?, props?: {raw MeshInstance3D props}, collision?: none|static|convex|trimesh} MeshInstance3D in one call. collision='static' adds StaticBody3D > CollisionShape3D with a best-fit shape (box/sphere/capsule/cylinder; plane/torus/text -> trimesh, cone/prism -> convex). Defaults: box 1m, sphere r=0.5, plane 2x2.

  • csg: {type: box|sphere|cylinder|cone|torus|polygon|mesh|combiner, parent?, name?, operation?: union|intersection|subtraction, size? (box [x,y,z]; sphere/cylinder diameter), radius?, height?, inner_radius?, outer_radius?, sides?, polygon?: [[x,y],...], depth?, mode?, mesh?: {shape, size...} | 'res://x.tres', material?, use_collision? (root only), position?, rotation_degrees?, scale?, props?, children?: [same spec...]} CSG blockout. Build a whole shape in one call, e.g. {type: 'combiner', name: 'House', use_collision: true, children: [{type: 'box', name: 'Walls', size: [4,3,4]}, {type: 'box', operation: 'subtraction', size: [1,2,1], position: [0,1,2]}]}. A material on a combiner becomes its material_override. Parent can be an existing CSG node.

  • material: {path: 'res://mat.tres' | node path, type?: standard|orm|shader (default: edit the existing material, else standard), props?: {albedo_color, albedo_texture, metallic, roughness, emission: '#hex', emission_energy, emission_texture, normal_texture, normal_scale, ao_texture, height_texture, unshaded, transparent, double_sided, uv_scale, triplanar, billboard, rim, clearcoat, filter: 'nearest', ...any BaseMaterial3D property; for shader: shader, params}, albedo_color?/color?/albedo_texture?/metallic?/roughness?/emission?/shader?/params? (shortcuts for props), material?: 'res://existing.tres' | '#hex' | {props} (node mode: what to assign), surface? (surface override index), save_as? (node mode: also save the material to this .tres and assign the file), assign_to? (file mode: also assign to this node), overwrite?} With a .tres path: create, or edit in place (every user of the file changes; a bad key changes nothing). With a node path: assign to material_override (meshes), material (CSG, CanvasItem, FogVolume) or a surface override; editing a node whose material is a shared file edits an embedded copy (reported in 'note').

  • light: {type: directional|omni|spot (default omni), parent?, name?, color?, energy?, range? (omni/spot), angle? (spot cone degrees 0-180), attenuation?, indirect_energy?, specular?, shadows?, position?, rotation_degrees?, look_at?: [x,y,z] | node path, props?: {raw Light3D props}} add a light. Directional defaults to rotation [-50,-30,0] with shadows.

  • environment: {preset?: default|sunny|night|foggy|studio|space, sky?: {type: procedural|panorama|physical|shader, top_color, horizon_color, ground_color, ground_horizon_color, energy, sun_size, panorama: 'res://sky.hdr', shader, params} | 'res://sky.hdr' | 'res://sky.gdshader' | false, ambient?: '#hex' | energy | {color, energy, source, sky_contribution}, fog?: bool | density | {density, color, height, height_density, sky_affect, ...fog_* without prefix}, volumetric_fog?, glow?: bool | intensity | {intensity, bloom, threshold, ...}, ssao?, ssil?, ssr?, sdfgi?, tonemap?: 'filmic'|'aces'|'agx'|'linear' | {mode, exposure, white}, adjustment?: {brightness, contrast, saturation}, background?: 'sky' | '#hex', props?: {raw Environment props}, sun?: bool | {color, energy, rotation_degrees, shadows, name, props}, update_sun?=true, save_path?, reset?, keep?, parent?, name?} Creates or updates the scene's single WorldEnvironment (+ Sky, + a DirectionalLight3D sun unless one exists, which is updated instead). A preset replaces the current look (keep=true layers it on top); other keys tweak the current one.

  • camera: {parent?, name?='Camera3D', position?=[0,2,5], look_at?: [x,y,z] | node path, rotation_degrees?, fov? (1-179), projection?: perspective|orthographic, size? (orthographic), near?, far?, current?=true, props?} add a Camera3D aimed at a point/node; becomes the current camera (others are un-set, undoably).

  • look_at: {path, target: [x,y,z] | node path, model_front?} rotate a Node3D so its -Z (or +Z with model_front=true, for imported models facing +Z) points at the target.

  • import: {path: 'res://model.glb', props?: {root_type: 'StaticBody3D', root_name, root_scale, root_script, generate_collisions: true, collision_shape: trimesh|convex|decompose_convex|box|sphere|cylinder|capsule|auto, body_type: static|rigid|area, fps, import_animation, generate_lods, light_baking: disabled|static|static_lightmaps|dynamic, or raw keys like 'meshes/ensure_tangents'} (the friendly keys also work at top level)} edit the asset's .import options and reimport. Without props: lists current options. Works for any importer (textures too, with raw keys like 'compress/mode').

  • instance: {model: 'res://x.glb' | 'res://x.tscn', parent?, name?, position?, positions?: [[x,y,z], ...] (several copies, max 500), rotation_degrees?, scale?, props?} instance an imported model or scene.

  • gridmap: {path? (existing GridMap) | parent?+name? (new), mesh_library: 'res://tiles.tres' (required for a new map), cell_size?=[2,2,2], cells?: [{pos: [x,y,z], item: 'Floor' | id, orientation?} or [x,y,z,item,orientation?]], fill?: [{from, to, item, orientation?}] (inclusive boxes, e.g. floors), erase?: [[x,y,z], ...], clear? (wipe first), position?, props?} create or paint a GridMap (undoable). Cells are integer grid coordinates. orientation: 0/90/180/270 (Y degrees), 'x90'/'z-90'/'y180', [rx,ry,rz] multiples of 90, or a raw index 0-23. item -1 erases.

  • mesh_library: {path: 'res://tiles.tres', from_scene?: 'res://tiles.tscn' (each MeshInstance3D becomes an item named after the node; StaticBody3D>CollisionShape3D children become its collision, NavigationRegion3D its navmesh; like Scene > Export As > MeshLibrary; CSG nodes are skipped), items?: [{name, shape|mesh, size?, radius?, height?, material?, collision?: true|false|convex|trimesh (default true), offset?}], replace?} create/merge a MeshLibrary for GridMap. Existing libraries are merged by item name unless replace=true; nothing changes if any item is invalid.

  • scatter: {source: 'res://tree.tscn' | 'res://rock.glb' | 'res://m.tres' (Mesh) | {shape, radius?, size?, material?}, parent?, name?='Scatter', count?=50, area?: {center: [x,y,z], size: [w,d] | [w,h,d] | w, radius?}, seed?, align_to_ground? (raycast down: lands on the LOWEST collider/visible mesh under each point, so props don't stack on roofs, trees or earlier props), ground?: node path | [paths] (only land on these; implies align_to_ground), align_to_normal?, y_offset?, random_rotation_y?=true, scale_range?=[1,1], min_distance?, mode?: multimesh (default for meshes; fast, visual only) | instances (default for scenes; real nodes with collision/scripts, max 2000), material?, item_name?, cast_shadow?} scatter props/vegetation.

ParametersJSON Schema
NameRequiredDescriptionDefault
farNoCamera far plane.
fogNotrue | density | {density, color, height, ...}.
fovNoCamera field of view (degrees).
skyNoSky spec: {type, top_color, horizon_color, ground_color, energy, panorama, shader, params} or res:// path, or false.
ssrNotrue | max_steps | {...}.
sunNotrue/false or {color, energy, rotation_degrees, shadows, name, props}.
areaNoScatter area: {center: [x,y,z], size: [w,d]} or {center, radius}.
fillNoGridMap boxes: {from: [x,y,z], to: [x,y,z], item, orientation?}.
fontNoTextMesh font (res:// path).
glowNotrue | intensity | {intensity, bloom, threshold, ...}.
keepNoenvironment: layer the preset on top of the current Environment.
meshNores:// Mesh resource (mesh), or CSGMesh3D mesh: {shape, size...} | res:// path (csg).
modeNoScatter mode: multimesh | instances.
nameNoNode name.
nearNoCamera near plane.
pathNoNode path, or res:// file path (material/import/mesh_library).
seedNoRandom seed (repeatable results).
sizeNoSize: number, [x,y,z] (box/prism/CSG box) or [w,d] (plane/quad); camera orthographic size; scatter area size.
ssaoNotrue | intensity | {radius, intensity, ...}.
ssilNotrue | intensity | {...}.
textNoText for shape='text'.
typeNoCSG type, material type (standard|orm|shader) or light type (directional|omni|spot).
angleNoSpot angle in degrees.
cellsNoGridMap cells: {pos: [x,y,z], item: name|id, orientation?} or [x,y,z,item,orientation?].
clearNoGridMap: clear all cells first.
colorNoLight color: hex, name or [r, g, b].
countNoNumber of scattered items.
depthNoTextMesh / CSG polygon extrusion depth.
eraseNoGridMap cells to clear: [[x,y,z], ...].
itemsNoMeshLibrary items: {name, shape|mesh, size?, material?, collision?, offset?}.
modelNores:// .glb/.gltf/.fbx/.blend/.tscn to instance.
propsNoProperty map. Values are coerced to the property type: numbers, [x,y], 'Vector2(1,2)', '#ff8800', 'res://file', {"type":"RectangleShape2D","size":[32,32]} for new resources, enum names as strings.
rangeNoOmni/spot range.
resetNoenvironment: start from a fresh Environment.
scaleNoUniform number or [x, y, z].
sceneNores:// scene to operate on; opened in the editor if needed. Defaults to the currently edited scene.
sdfgiNotrue | energy | {...}.
shapeNoPrimitive: box|sphere|capsule|cylinder|cone|plane|prism|torus|quad|text.
actionYesWhat to do. See the tool description for each action's parameters.
energyNoLight energy.
groundNoScatter: node path or [paths] to land on (default: lowest surface under each point).
heightNoHeight (meters).
paramsNoShader parameters {uniform: value} (material type 'shader').
parentNoParent node path (default: scene root).
presetNoEnvironment preset: default|sunny|night|foggy|studio|space.
radiusNoRadius (meters).
shaderNores:// .gdshader for a shader material / sky.
sourceNoScatter source: res:// scene/model/mesh or {shape, radius?, size?, material?}.
targetNo[x, y, z] point or node path (look_at).
ambientNoAmbient light: hex color, energy number or {color, energy, source, sky_contribution}.
currentNoMake this the current camera (default true).
look_atNo[x, y, z] point or node path to face.
polygonNoCSGPolygon3D points [[x,y], ...].
replaceNomesh_library: build a fresh library instead of merging.
save_asNomaterial (node mode): also save the material to this .tres.
shadowsNoEnable shadows.
surfaceNoMesh surface index for a surface material override.
tonemapNo'filmic' | 'aces' | 'agx' | 'linear' | {mode, exposure, white}.
childrenNoNested CSG specs.
emissionNoMaterial emission color (hex) or true/false.
materialNores:// material, hex color / color name, or {albedo_color, roughness, metallic, emission, albedo_texture, ...}.
metallicNoMaterial metallic 0-1.
positionNo[x, y, z] position.
specularNoLight specular amount.
y_offsetNoScatter: offset along the ground normal (meters).
assign_toNomaterial (file mode): node path to assign the material to.
cell_sizeNoGridMap cell size [x, y, z] or one number (default [2,2,2]).
collisionNomesh: none | static | convex | trimesh.
font_sizeNoTextMesh font size.
item_nameNoScatter (instances mode): base name of the placed nodes.
operationNoCSG operation: union | intersection | subtraction.
overwriteNoReplace an existing file.
positionsNoSeveral [x,y,z] positions (instance).
roughnessNoMaterial roughness 0-1.
save_pathNoAlso save the Environment to this .tres.
adjustmentNo{brightness, contrast, saturation} (enables adjustments).
backgroundNo'sky' | '#hex' (solid color) | 'clear'.
from_sceneNoScene whose MeshInstance3D nodes become MeshLibrary items.
mesh_propsNoRaw PrimitiveMesh properties (e.g. {subdivide_width: 32}).
pixel_sizeNoTextMesh pixel size (meters per font pixel).
projectionNoCamera projection: perspective | orthographic.
top_radiusNoCylinder/cone top radius (0 = cone).
update_sunNoenvironment: let a preset update an existing sun (default true).
attenuationNoOmni/spot attenuation.
cast_shadowNoGeometryInstance3D cast_shadow: on|off|double_sided|shadows_only.
model_frontNolook_at: point +Z (imported model front) at the target instead of -Z.
scale_rangeNo[min, max] random uniform scale.
albedo_colorNoMaterial albedo color: hex, name or [r, g, b] (shortcut for props.albedo_color).
inner_radiusNoTorus inner radius.
mesh_libraryNores:// MeshLibrary (.tres) for the GridMap.
min_distanceNoScatter: minimum distance between items.
outer_radiusNoTorus outer radius.
bottom_radiusNoCylinder/cone bottom radius.
use_collisionNoCSG root collision.
albedo_textureNoMaterial albedo texture res:// path.
volumetric_fogNotrue | density | {density, albedo, emission, ...}.
align_to_groundNoDrop scattered items onto the ground below (raycast).
align_to_normalNoTilt scattered items to the ground normal.
indirect_energyNoLight indirect (GI) energy.
rotation_degreesNo[x, y, z] rotation in degrees.
random_rotation_yNoScatter: random yaw (default true).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare mutation and non-destructive status, and the description adds substantial behavioral context beyond them: undoable scene changes, validation errors instead of NaN/zero, material file edit side effects, mesh library merge behavior, and scatter ground raycasting. No annotation contradiction is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loads the overall purpose before an action-by-action breakdown. Most sentences earn their place for a tool this complex, though there is some density and repetition with schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 101 parameters, 12 actions, nested objects, and absence of an output schema, the description is remarkably complete. It covers action semantics, defaults, validation, file side effects, and scene mutation behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, but the description adds crucial action-discriminated semantics for 101 flat parameters: per-action defaults, allowed shapes, nested CSG trees, collision mappings, material modes, import keys, and scatter modes. This is far beyond what the schema alone conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb and resource: 'Build 3D levels in few calls', then enumerates all 12 actions (mesh, csg, material, light, etc.). This makes the tool's scope immediately distinguishable from generic sibling tools like scene or node.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use it: building 3D levels and performing specific 3D operations. However, it never names sibling alternatives or states when not to use it versus tools like scene, node, or tiles.

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.

  1. 29 tool updatesv0.1.0
    • First observedanimation
    • First observedassets
    • First observedaudio
    • First observedbatch
    • First observedchanges
    • First observeddocs
    • First observededitor
    • First observedexec
    • First observedexport
    • First observedfiles
    • First observedgame
    • First observedinput
    • First observedintrospect
    • First observednavigation
    • First observednode
    • First observedparticles
    • First observedphysics
    • First observedproject
    • First observedresource
    • First observedrun
    • First observedscene
    • First observedscript
    • First observedshader
    • First observedsignal
    • First observedtest
    • First observedtiles
    • First observedui
    • First observedview
    • First observedworld3d

TDQS

A4.1/5.0

Scored across 29 tools

Disambiguation4/5

Most tools target clearly distinct Godot subsystems (files vs. script vs. resource, run vs. game vs. test, project vs. editor). A few boundaries are slightly soft — e.g. editing a .gd file can be done via files.edit or script.edit — but the descriptions consistently clarify which tool to prefer.

Naming Consistency4/5

Tool names are consistently lowercase single nouns (signal, scene, node, physics, navigation, etc.) with no camelCase/snake_case mixing. Minor deviations are the plural forms (files, changes, tiles, particles, assets) and the concatenated 'world3d' instead of 'world_3d'.

Tool Count3/5

29 tools is heavy for an MCP surface and risks selection paralysis. Each tool does cover a distinct subsystem and bundles many actions, so the count is borderline rather than purely excessive for an editor-automation server of this scope.

Completeness5/5

The surface covers project setup, file/scene/node/script/resource lifecycles, signals, animation, tiles, physics, navigation, 3D world building, shaders, UI, audio, particles, asset generation/import, testing, and export. Gaps such as dedicated multiplayer or localization tools are minor relative to the editor-automation domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Godot game projects through real-time error detection, automated testing, code analysis, and safe git-based patching. Provides comprehensive project context and development workflow automation for Godot developers.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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.
    11 npm
    26
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to build, run, and debug Godot projects by editing scenes and scripts, inspecting live game state, injecting input, capturing viewports, and examining native debugger state through 42 tools.
    European Union Public 1.2