Godotwright
Godotwright is an MCP server/CLI that helps coding agents work on Godot 4 projects with offline API knowledge, safe edits, headless runs, and 3D model tooling.
Map a Godot project: scenes, scripts, signals, exports, autoloads, input actions, and broken references.
Look up and search the offline Godot 4.7 API, including Godot 3 name translations.
Run static AAA reviews with per-category scores, review unsaved code, or show only new findings.
Find usages and rename symbols/files safely, with dry-run and before/after review errors.
Edit project settings, input actions, autoloads, and scenes: add/remove nodes, set properties, connect signals, attach scripts.
Migrate mechanical Godot 3 GDScript to Godot 4.
Run headless Godot checks, GUT/GdUnit4 tests, scripted play-testing with watched values, and screenshots.
Build, identify, brief, lint, view as text, and inspect 3D .glb/.gltf models, including archetype/contract checks and collision-ready output.
Record feedback on review findings and show the AAA checklist.
Supports GitHub code scanning by emitting SARIF from godotwright review --sarif, allowing findings to appear inline on pull requests.
Provides a GitHub Actions workflow/action that runs godotwright ci on pull requests, downloads a checksum-verified Godot, runs review, checks, tests, and scenarios, posts results to the job summary and PR comment, and fails the job when a step fails.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GodotwrightReview my Godot project for Godot 3 mistakes and invented APIs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Coding agents learned Godot from years of Godot 3 tutorials. They write yield,
export var and KinematicBody2D, invent methods, and wire signals to nodes that
are not in the scene. Godotwright gives the agent the real Godot 4.7 API, a compact
map of your project, real Godot checks and a fixed AAA review, as MCP tools and as a CLI.
Status: layer 1 (toolkit and MCP server) is done; see ROADMAP.md.
Quickstart
Try it on your game, nothing to install:
npx -y godotwright review ~/games/my-gameYou get a score from 0 to 100 for api, performance, quality and structure, and each
finding as res://file.gd:12: error [rule] message with the Godot 4 fix.
Then give it to your agent. In Claude Code:
/plugin install godotwright --marketplace laaielichter/GodotwrightClaude Desktop, Cursor, VS Code, Codex, Gemini CLI, Windsurf and Zed: one step each, see install in your coding agent or the install page.
Related MCP server: godot-mcp-server
What it does
A receipt on every pull request
# .github/workflows/godotwright.yml
on: pull_request
permissions: { contents: read, pull-requests: write }
jobs:
receipt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: laaielichter/godotwright@v0.2.0
with: { comment: "true" }It downloads a checksum-verified Godot, runs godotwright ci (review, check, GUT or GdUnit4 tests, and your
scenarios), puts the table in the job summary and in a pull request comment, and fails the job when a
step fails. No editor, no GPU. review-only: "true" skips Godot.
It changes, runs and shows your project too
Reading is not enough for an agent that has to get work done, so Godotwright also does the work that usually needs the editor, checked against Godot 4.7 and with a dry run first:
Change it:
renamea function, signal, node or file everywhere (code, scenes, connections,.uidfiles);projectedits settings, input actions and autoloads;sceneadds and removes nodes, sets properties, connects signals and attaches scripts. Only the lines of the change are touched.usagessays where something is used.Run it:
testruns your GUT or GdUnit4 tests and prints only what failed, withfile:line;playruns a scene, presses the keys you give on the frames you give, and prints the values you watch;checkruns Godot headless.See it:
screenshotrenders a scene or a model to a PNG, and says how much of the picture is drawn.Port it:
migraterewrites Godot 3 scripts to Godot 4 where that is mechanical.
Twelve small-model agents did six everyday tasks like this: what we measured.
And it builds 3D models
A coding agent can also make, look at and check 3D models for Godot with no Blender: model identify says what a
thing is (parts, sizes, pivots), model build makes a clean .glb from one of
53 ready-made kinds (vehicles, aircraft, ships, buildings, plants,
terrain with lakes and rivers) or from your own JSON spec, model view shows it as text, and model lint scores it.
It is set up to work with small, cheap models too: what we tested and learned with 3D models and with everyday Godot tasks.
Why Godotwright?
No more Godot 3 code. The review flags Godot 3 syntax and names and gives the Godot 4 replacement.
No invented API. Every class, method, property and signal is checked against the official Godot 4.7 class reference, bundled offline (1078 classes).
Mistakes found before you press F5. Missing
$Nodepaths, scene connections to methods that do not exist, unknown input actions and brokenpreload()paths.Safe edits. Renames, settings, input actions and scene changes are checked against the Godot 4.7 reference, show a dry run first, change only their own lines, and report the review errors before and after.
It can see the game run. Press keys on exact frames and read values back, run the tests, take a screenshot: all headless, nothing to click.
Cheap for the model. Compact, stable output, and a
cheapprofile that walks small models through small checked steps.Local and private.
scan,apiandreviewneed no Godot install and no network.
Commands
godotwright scan [path] # compact project map, cheap to read
godotwright scan [path] --detail full # node trees, signatures, line numbers
godotwright scan [path] --json # the full map as JSON
godotwright check [path] # run Godot headless, report errors as file:line
godotwright check [path] --run # also run the main scene for 120 frames and show what it printed
godotwright check --scene res://scenes/Test.tscn # run one scene instead: put print() in the code and read it back here
godotwright test [path] # run the GUT or GdUnit4 tests headless; prints only what failed, with file:line
godotwright play --input "10 tap jump; 20 hold right 30" --watch Player.position # play input into a scene, see the values per frame
godotwright ci # one receipt: review, check, tests and scenarios (markdown, exit 1 on a failure)
godotwright screenshot --model car.glb --view front,side,top,iso # a PNG of a model from four sides (or of a scene); says how much is drawn
godotwright api Node2D.look_at # offline Godot 4.7 API: classes, methods, signals
godotwright api --search "is on floor"
godotwright review [path] # AAA review with a score per category
godotwright usages take_damage # every place a name or res:// path is used: code, scenes, connections, groups, settings
godotwright rename take_damage apply_damage --write # rename everywhere (code, scenes, connections, node paths); dry run without --write
godotwright rename res://a.tscn res://scenes/a.tscn --write # move a file with its .uid and .import, and every reference
godotwright project set display/window/size/viewport_width 1920 --write # change a setting; name and type checked against Godot 4.7
godotwright project input add jump --key Space --joy-button A --write # input map without hand-editing Object(InputEventKey,...)
godotwright project autoload add Game res://game.gd --write # checks the file is a Node and the name is free
godotwright scene add main.tscn . Music AudioStreamPlayer --write # add a node (or an instance: res://enemy.tscn); only that line changes
godotwright scene set main.tscn Timer wait_time 0.5 --write # property name and type checked; enums by name, resources as res:// files
godotwright scene connect main.tscn Timer timeout . _on_timer_timeout # warns when the method is missing or takes other arguments
godotwright migrate --write # port Godot 3 scripts to Godot 4 where that is mechanical; lists what is left
godotwright review --sarif > review.sarif # for GitHub code scanning: findings inline on pull requests
godotwright review --only-new # in a fix loop: only what changed since the last review, the rest as one line each
godotwright review [path] --detail full --min-score 90
godotwright model car.glb # what is in a 3D model: nodes, triangles, textures, size
godotwright model lint car.glb # model review with a score per category
godotwright model contract car.glb # write a model.contract.json: node names, size, budget
godotwright model contract --archetype car # the same, from what a car usually is (no model yet)
godotwright model lint car.glb --archetype car # also check it is what it should be
godotwright model lint car.glb --contract model.contract.json
godotwright model brief "a tractor" # one page before you build: kind to start from, parts, size, rules, order of work (for small models)
godotwright model identify "a tractor" # what it is: parts, size, variants, what to anticipate
godotwright model archetypes # the family tree of things Godotwright knows
godotwright model kinds # what `model build` can make, with parameters
godotwright model view car.glb # see a model as text: front, side and top views, the parts, what does not touch
godotwright model recipes # the ready-made recipes and the archetype each one is checked against
godotwright model recipes tractor # print one recipe as a spec to edit
godotwright model build house -o house.glb --set floors=3 --set roof=hip
godotwright model build house -o house.glb --collision trimesh # Godot adds collision shapes on import (-col / -convcol names)
godotwright model build terrain -o world/tile.glb --collision heightmap # terrain: a HeightMapShape3D and a ready tile scene
godotwright learn # what Godotwright learned on this machinescan reads project.godot, scenes, resources and scripts without starting Godot.
It lists scenes with their node trees, scripts with signals, functions and exports,
autoloads, input actions and key settings, and warns about broken references
(missing files, a missing main scene or autoload, bad preload() paths).
check needs Godot 4.7: --godot <path>, $GODOT, godot on your PATH, or a Godot 4 download
it finds by itself (Program Files, Steam, Scoop, Downloads, Desktop). It imports
the project, loads and instantiates every script and scene, and can run the main scene.
Each problem comes back once, as res://path/file.gd:12: error: ....
The exit code is 1 when there are errors.
api answers from the official Godot 4.7 class reference, bundled offline
(1078 classes). It accepts Class, Class.member, Class.Enum.VALUE, @annotation
or a global function, follows inheritance, and explains Godot 3 names
(KinematicBody2D is CharacterBody2D in Godot 4). See data/README.md.
review needs no Godot install. It scores four categories from 0 to 100 and lists
each finding as res://file.gd:12: error [rule] message:
Category | What it checks |
api | Godot 3 code, unknown classes, functions, members and signals, wrong argument counts, input actions missing from the Input Map |
performance | node lookups, |
quality | static typing coverage, long or deeply nested functions, signals never emitted, string-based signals, naming, TODOs |
structure | broken references, scene connections to missing methods or signals, |
The checks follow Godot's own rules (inheritance, scripts on more specific nodes,
inherited scenes, built-in scripts, duck typing with has_method()), and are tuned
on the official demo projects so they report real problems, not noise.
The exit code is 1 when there are errors, or when the score is below --min-score.
model reads a .glb or .gltf file without Godot. model alone shows the node tree,
triangle count, materials, textures (with an estimate of texture memory), size and lowest
point. model lint scores four categories from 0 to 100:
Category | What it checks |
geometry | triangles facing against their own normals (pink backfaces, wrong light), open edges on single-sided surfaces, edges shared by more than two triangles, triangles without area, negative scale, models that are almost but not quite left-right symmetric |
materials | missing normals, UVs or tangents, UVs outside 0..1, very large or non-power-of-two textures |
performance | triangle budget ( |
rig | sibling nodes with the same name, unnamed nodes, a model that does not sit on y = 0, an empty file |
Findings are grouped per node, and their severity follows how much of the surface is
affected, so one stray triangle is an info and a flipped panel is an error.
A model contract (model.contract.json) pins what a model must keep, so a renamed node or a
hull that grows 3 cm wider is caught. model contract writes one from the model as it is now;
review it, add a source to each size, and keep it next to the model. model contract --archetype car
starts instead from what a thing usually is (its single parts by name, the middle of the typical size, a triangle
budget), for a model that does not exist yet. With --contract, model lint
reports contract-missing-node, contract-order, contract-extra-node, contract-size,
contract-ground and contract-triangles. Sizes default to a 1% tolerance, or set tolerance in metres.
The exit code is 1 when there are errors, or when the score is below --min-score.
model build makes a model from code, with no Blender or other tool: a clean .glb with UVs and
tangents, named parts with sensible pivots, standing on y = 0, and the same bytes every time for the
same parameters. The result goes straight through model lint, and --contract-out writes a
model.contract.json for it. model kinds lists the kinds with their parameters, ranges and defaults;
set them with --set name=value or --spec file.json. These are clean, parametric base models, built
to be refined, not hand-sculpted art. Kinds today: house, the open-world kinds terrain (a heightmap tile from seeded
noise whose neighbours continue it exactly, with an optional lake and an optional river carved into it) and sea (a subdivided water plane at y = 0 with a floor), plus recipes, which are ready-made specs in
data/recipes/: car, tractor, helicopter, airliner, ship, tree, conifer,
wind-turbine, shipping-container, truck, bus, motorcycle, bicycle, train, tank, light-aircraft, fighter, drone, boat, sailboat, piston-engine, jet-engine, barn, tower, church, windmill, apartment, bridge, road, railway-track, street-lamp, fence, power-pylon, palm, bush, grass, flower, crate, barrel, chair and table. Every recipe names its archetype, so model build checks
it as it builds, and every recipe is tested to stay clean at the lowest and highest value of each parameter.
Small, cheap models can work blind: see docs/cheap-models.md for a test and what model view and the
floating-part check do about it.
model identify says what a thing is before you build it, from its name in English or Dutch (typos,
plurals and Dutch compounds like "vrachtauto" included) or from a description ("something with wheels and
an engine"). It answers with the family it belongs to, the parts a model of it needs (and which move, about
which axis, with the pivot where), a typical size range with its source and a confidence class, the variants
(a car can be a sedan, a hatchback, a pickup), the Godot conventions (+Y up, the front faces +Z), what to
anticipate (collision, LODs, lights) and the usual mistakes. A word that means two things (the Dutch
"windmolen") is reported as ambiguous, and something it does not know gets the nearest family, marked
generic, instead of a made-up answer. The library is data in data/archetypes/ and grows with pull requests.
It also knows the pieces an open world is made of: terrain tiles, mountains, islands, coasts, seas, lakes, rivers,
biomes and settlements, with their own rules (tiles that share border heights, y = 0 as sea level, collision from
the same heights, levels of detail, instanced scatter, a floating origin for very large worlds).
model lint --archetype <what> (or "archetype": "vehicle.wheeled.car" in a spec, or any built-in kind)
holds a model against what identify says that thing is, as a fifth category, archetype, worth a fifth
of the score:
Rule | What it catches |
| a car without wheels, a helicopter without a rotor (parts are recognised by node name in English or Dutch) |
| two wheels on a car, five on a bicycle |
| a wheel not turning about its hub, a door not pivoting on its hinge line, a turret not on its base |
| a wheel lying the wrong way |
| a model about 10 times too big or small, which is nearly always a unit mistake (it only flags a difference of more than 3 times, since the ranges are typical, not exact) |
| a car that points sideways instead of along z |
| the usual parts that are not there (info) |
Anything else is built from a model spec: a JSON tree of named parts (box, cylinder, ellipsoid,
lathe, loft, extrude, roof) with at, rotate, mirror, repeat, variables and arithmetic
expressions ("$width / 2 - 0.1", never executed as code). model spec explains the format and prints a
small car as an example; model build --spec car.json --set width=1.9 builds it. Every moving part is
its own node with its pivot at its origin (a wheel at its hub), and a spec that goes wrong gets a message
with its path (nodes[0].children[2].size[1]: unknown variable $x).
Port Godot 3 scripts to Godot 4
godotwright migrate # shows every change it would make, and what still needs a hand
godotwright migrate --write # applies them
godotwright review # what is still wrong, with line numbersmigrate rewrites the mechanical part of a port: export, onready and tool become annotations (with @export_range,
@export_enum, @export_file and typed arrays where the hint is clear), renamed classes, functions, properties and
constants get their Godot 4 names (only when the old name no longer exists in Godot 4 and is not defined in the script),
yield(x, "sig") becomes await x.sig, connect("sig", target, "method", [binds]) becomes
sig.connect(target.method.bind(...)), emit_signal and funcref become signals and callables, and members that moved
(OS.get_ticks_msec()) move to their new class. Strings, comments and node paths are left alone. What it cannot do safely
it lists with the line: setget, move_and_slide(velocity), remote func, export hints it does not know. Scenes and
project settings are not touched; Godot's own --convert-3to4 does those. Commit first; a second run makes no further
changes.
Cheaper fix loops: only what changed
godotwright review --only-newEvery review remembers its findings in .godot/godotwright/review-last.json (Godot projects ignore .godot/ in git). With
--only-new (MCP: only_new: true) the next review prints the findings that are new since then in full, the ones you
already saw as one short line each (file:line [rule]), and how many are fixed. A finding keeps its identity when its
line moves. An agent fixing a long list reads the list once instead of after every edit.
Review in GitHub Actions
Save this as .github/workflows/godot-review.yml in your game repository. It
reviews the project on every push and pull request, failing if there are errors
or the overall score is below 80. The static review needs only Node.js 22.12+
(Node 24 below), not a Godot install, model or API key.
name: Review Godot project
on: [push, pull_request]
permissions:
contents: read
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 24
- run: npx --yes github:laaielichter/godotwright#0dd9ce885df21fafefc09f8ddd6e92745d5ae303 review . --min-score 80The toolkit is pinned to a revision; update that revision deliberately when you
want a newer version. For a game in a subdirectory, set working-directory on
the review step to the folder containing project.godot.
To see the findings inline on pull requests, upload the review as SARIF to GitHub
code scanning (this needs security-events: write and the repository's code
scanning enabled):
permissions:
contents: read
security-events: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 24
- run: npx --yes godotwright review . --sarif > godotwright.sarif || true
- uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: godotwright.sarifMods and patches over a game
A mod or patch often uses scripts, scenes and models that live in the game, not in the mod's folder. Point Godotwright at the game so they count as present:
godotwright review mod/ --base game/ # the game's source folder
godotwright review mod/ --base-files game/pck-manifest.json # files the shipped .pck holdsor put it in godotwright.json in the mod's root (paths relative to that root):
{ "base": ["../game"], "baseFiles": ["../manifests/pck-files.json"] }The game's classes, autoloads, input map and scenes are then known, the mod's own
files win where both have the same path, and only the mod's files are reviewed.
A file list is text with one path per line, or JSON (strings, or objects with a
path, resource or file key); exported names such as x.glb.import and
x.gdc map back to their source.
Install in your coding agent (MCP)
One step for each client. Every setup and one-click button is on the install page.
Client | How |
Claude Code | Plugin with the MCP server and three skills: |
Claude Desktop | Download |
Cursor | Add to Cursor (one click) |
VS Code (Copilot) | Install in VS Code (one click) |
Codex |
|
Gemini CLI |
|
Windsurf, Zed, others |
The Claude Code plugin adds /godotwright:review (review the project and fix what it finds),
/godotwright:port (port Godot 3 code to Godot 4) and a Godot workflow Claude follows on its own.
On Claude Code older than 2.1.275, run /plugin marketplace add laaielichter/Godotwright and then
/plugin install godotwright@godotwright. Only the MCP server, without the skills:
claude mcp add godotwright -- npx -y godotwright mcp --tier premiumCodex can also read it from ~/.codex/config.toml:
[mcp_servers.godotwright]
command = "npx"
args = ["-y", "godotwright", "mcp", "--tier", "premium"]
startup_timeout_sec = 30 # the first npx run downloads the packageRun the agent from the Godot project folder, or pass --project <path> (or set GODOTWRIGHT_PROJECT).
Pick a profile with --tier:
premium: full detail, all findings with fixes. Use it with large models.cheap(the default): short output, and server instructions that walk a small model through checked steps (scan, look up, review before saving, review after each edit).
CI connects both Claude Code and Codex to the server on every push.
The 22 tools
Tool | What it does |
| Map the project: scenes and node trees, scripts, signals, autoloads, input map |
| Exact Godot 4.7 lookup: signatures, inheritance, Godot 3 names |
| Search the Godot 4.7 class reference |
| AAA review with scores; also reviews unsaved code ( |
| Every AAA rule with its fix |
| Mark a review finding as wrong or right, so later reviews learn from it |
| Every place a name or |
| Rename a name or move a file everywhere at once, keeping connections, node paths and |
| Change settings, input actions and autoloads in |
| Add or remove nodes, set properties, connect signals and attach scripts in a |
| Rewrite Godot 3 GDScript to Godot 4 where that is mechanical, and list what is left |
| Run Godot headless and report errors as |
| Run GUT or GdUnit4 tests headless; only what failed, with |
| Run a scene with an input timeline and return the values you watch per frame |
| Render a scene or a |
| One page before you build, for small models: the kind to start from, parts, size, rules and the order of tools |
| What a thing is: parts, pivots, typical size with its source, variants (English or Dutch) |
| The model spec format, an example and the ready-made kinds |
| Build a clean |
| Score a |
| See a |
| What is in a |
Learning
Godotwright learns from every use, on your machine:
Rules Godot keeps contradicting. After each
check, it compares the review with what real Godot reported. When an error rule is contradicted 3 times here and never confirmed, its findings become warnings, marked as hints.False alarms.
godotwright learn feedback wrong "<finding line>"(or thegodot_feedbackMCP tool) hides that finding in later reviews.API lookups. When a lookup finds nothing and the next one does, the next failed lookup of the same name says what it usually means.
Nothing leaves your machine unless you say yes. The learning file (godotwright learn shows where) holds
counters, rule names, API names and message templates without names or paths; findings
marked as wrong are stored as hashes.
godotwright learn # status: what was learned, where the file is
godotwright learn off # stop learning (or set GODOTWRIGHT_LEARN=0)
godotwright learn on
godotwright learn reset # forget everything
godotwright learn preview # the exact report sharing would send
godotwright learn share on # opt in: send anonymous counts once a daySharing helps every user: what many installs learn ships with later releases.
It is off by default, sends no code, file names, paths or project names, and
respects DO_NOT_TRACK. See PRIVACY.md.
Set GODOTWRIGHT_HOME to keep the file somewhere else.
Godotwright also learns for free from public projects: every week the Learn
workflow reviews the official Godot demos, and the same demos written for Godot 3,
checks them with real Godot, and records which rules Godot confirmed or
contradicted. That, plus what opted-in installs share, ships in data/learned.json:
API hints for common typos, and rules Godot keeps contradicting.
What your own machine saw wins: one confirmation by Godot keeps a rule an error.
Lessons from real builds also become rules. LESSONS.md is an anonymised reflection on one large build (no code, no project names); each lesson says whether Godotwright checks it, and the ones that can be checked, like slow motion that is never undone, are review rules.
For maintainers, godotwright collector serve accepts reports (checked again,
stored without IP addresses), and godotwright collector aggregate <dir> --out data/learned.json sums them, keeping only what at least 3 installs reported.
godotwright collector projects <dirs...> learns from public projects.
Benchmark
bench/ runs coding agents on fixed Godot tasks with and without Godotwright, and lets
real Godot 4.7.2 judge the result with a behavior test per task.
First round (168 runs, Claude Haiku, Sonnet and Opus 5.5, 12 tasks): every run passed,
with and without Godotwright, so these tasks do not separate the setups on correctness.
With Godotwright, all code came out fully statically typed (84 of 84 runs, against
71 of 84 without). Details and limits: bench/RESULTS.md.
How it compares
Godotwright | Agent on its own | Godot editor | |
Godot 4.7 API | bundled class reference, offline | from training data | built in |
Flags Godot 3 code with the fix | yes | sometimes | parse errors only |
Usable by the agent itself | MCP + CLI | n/a | needs a human |
Performance and structure review | scored per category | no | warnings only |
Needs Godot installed | only for | no | yes |
Does not | write your game, replace playtesting, review C# | run Godot | talk to agents |
FAQ
Does it need Godot installed? No for scan, api and review. Only check runs Godot 4.7 headless.
Which agents does it work with? Any agent that speaks MCP over stdio. CI connects Claude Code and Codex on every push. The CLI works from any shell.
Does it send my code anywhere? No. See Learning and PRIVACY.md.
Older Godot 4 versions? Most findings apply to every Godot 4 version, but API lookups answer for 4.7.
Contributing
Wrong review findings and ideas for new rules are the most useful reports. See CONTRIBUTING.md.
Requirements
Node.js 22.12 or newer
Target engine: Godot 4.7.x
Development
npm ci
npm run check
node dist/cli.js --helpSee AGENTS.md for project conventions.
Support
Godotwright is free and open source. If it saves you or your agent time, a gift is welcome but never expected. SOL and any token on Solana (such as USDC) can be sent to:
Solana:
BDRA7dHGBYtPsZPNzVQccDYZ8BqstJGCsWx3kopPSCDK
Gifts go to new model credits to keep building and improving Godotwright, and to work on better working conditions and wellbeing for large language models, neural networks and agents. In the future they will also go to a better environment for AI.
License
Available Tools
22 toolsgodot_apiLook up the Godot 4.7 APIA
Exact lookup in the official Godot 4.7 class reference, offline: Class, Class.member, Class.Enum.VALUE, @annotation or a global function. A class gives its parents, properties with defaults, methods, signals and enums; a member gives its exact signature and description, found through inheritance. Use it before calling any engine API you are not sure about; when you do not know the exact name, use godot_api_search first. detail brief gives the signature and the first paragraph; full gives the whole entry. An unknown name returns an error with close matches, and a Godot 3 name with its Godot 4 name. It changes no project files; when learning is on, it counts the lookup in Godotwright's local learning file so later misses get better hints (GODOTWRIGHT_LEARN=0 turns that off).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | e.g. CharacterBody2D.move_and_slide, Node.ready, @export_range, lerp, Tween | |
| detail | No | brief: short output with capped lists; full: everything (default for this premium profile: full). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses offline behavior, per-query-type return shapes, that member lookup resolves through inheritance, that unknown names return an error with close matches, and that Godot 3 names are mapped to their Godot 4 equivalents. It also honestly discloses the side effect — a lookup is written to a local learning file unless GODOTWRIGHT_LEARN=0 — which reconciles the 'changes no project files' claim with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lookup target and the sibling routing are front-loaded, and the paragraph moves logically from input forms to output shapes to error behavior to side effects. It is dense but every sentence carries information; the learning-file clause is the one piece that could be relegated to a shorter parenthetical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully covers return values for each query type, error behavior, and the only meaningful side effect. Nothing an agent needs in order to call this correctly and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes slightly beyond by explaining what the two `detail` levels actually contain ('brief gives the signature and the first paragraph; full gives the whole entry'), clarifying the enum's practical effect. It adds modest value but does not elaborate on formatting or escaping of the `query` string, which the schema examples already cover.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Exact lookup in the official Godot 4.7 class reference, offline' — and enumerates the accepted query forms (Class, Class.member, Class.Enum.VALUE, @annotation, global function). It explicitly contrasts with the sibling godot_api_search, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('Use it before calling any engine API you are not sure about') and routes the agent to the alternative when the exact name is unknown ('use godot_api_search first'). Both the trigger and the fallback condition are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_api_searchSearch the Godot 4.7 APIARead-onlyIdempotent
Search the Godot 4.7 class reference offline by words: class, method, property and signal names, keywords and descriptions, best matches first. Use it when you know what you need but not its name ('raycast 3d', 'change scene'), then call godot_api on the best match for its full entry. For where your own project uses a name, use godot_usages. Returns one line per match with its kind and signature, e.g. method CharacterBody2D.is_on_floor() -> bool const, or 'no matches'. limit caps the list (default 10, at most 50). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | max results (default 10) | |
| query | Yes | words, e.g. 'raycast 3d', 'change scene', 'is on floor' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description reinforces 'Read-only' while adding real behavioral context: results are ranked best-first, the return is one line per match with kind and signature (with a sample), and the 'no matches' case is disclosed. It stops short of describing ranking/collation details or performance constraints, so not a top score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the capability, then usage, then return shape, then parameter note. Every sentence carries distinct information; no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two params, no output schema, and full schema coverage, the description supplies everything an agent needs: what is searched, how to phrase queries, routing to siblings for follow-up, result format, and match-count behavior including the empty case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already documented there, including the same example strings and the default/max for limit. The description restates the limit cap (default 10, at most 50) and query semantics but adds no format or syntax detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the Godot 4.7 class reference offline') plus exactly what fields are searched (class, method, property, signal names, keywords, descriptions). It differentiates itself from the named siblings godot_api (full entry) and godot_usages (project-local lookups).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use with concrete example queries ('raycast 3d', 'change scene'), plus a clear next step ('call godot_api on the best match') and an explicit exclusion routing to godot_usages for project-local name usage. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_checkCheck with real GodotAIdempotent
Run Godot 4.7 headless on the project: import, load and instantiate every script and scene, and optionally run the main scene (or the scene you name) for run_frames frames and return what it printed. Reports engine errors as res://file:line. Put print() calls in the code you are testing and read them back here. run_frames defaults to 0 (load only), or 120 when you pass scene; timeout_seconds caps each Godot run. Returns the errors and warnings with file:line, the totals and the printed output; an error result when Godot reports an error or is not installed. Your scenes and scripts are not changed: Godot updates its import cache in .godot/, where Godotwright also puts its checker script. Needs Godot on this machine and is slower than godot_review, so review first. To drive input and watch values use godot_play; for unit tests use godot_test.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| scene | No | run this scene (a res:// path) instead of the main scene | |
| run_frames | No | also run the main scene for this many frames and return its output (default 0; 120 when scene is given) | |
| timeout_seconds | No | timeout per Godot run (default 600) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: discloses side effects ('Godot updates its import cache in .godot/, where Godotwright also puts its checker script'), reassures 'your scenes and scripts are not changed', states timeouts cap each run, and describes the error result when Godot errors or is missing. This is consistent with readOnlyHint=false and rich enough that the agent knows what it will leave behind.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded with the core action, then defaults, then return values, then prerequisites and alternatives. Every sentence earns its place; it is a touch long and packs a lot of clauses into single sentences, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers return values (errors/warnings with file:line, totals, printed output, error result), side effects on .godot/, prerequisites, cost relative to siblings, and alternative tools. With no output schema, the description fully carries the burden for a tool that shells out to an external engine.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: the conditional default ('run_frames defaults to 0, or 120 when you pass scene') and how timeout_seconds applies ('caps each Godot run'). Minor gap: it doesn't explain res:// path semantics for scene, but the schema covers that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run Godot 4.7 headless on the project') and enumerates exactly what that entails: import, load/instantiate every script and scene, optionally run a scene for N frames, return printed output. An agent can distinguish it from godot_review, godot_play and godot_test purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not: 'review first' with godot_review, use godot_play to drive input and watch values, use godot_test for unit tests. Also flags the prerequisite ('needs Godot on this machine') and relative cost ('slower than godot_review'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_checklistAAA checklistARead-onlyIdempotent
List the fixed AAA checklist that godot_review applies: plain text grouped by category (api, performance, quality, structure), one line per rule with its fix (on the premium profile also its id and severity). Read it before writing code to know the rules, or to look up a rule id from a finding. It does not look at the project; to check the project against these rules, use godot_review. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description reinforces this with 'Read-only'. It adds genuinely new context the annotations cannot carry: the output format, the category grouping, the per-line rule+fix shape, and the premium-profile variation that adds id and severity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight paragraph that front-loads what is returned, then when to read it, then the sibling redirect, then the read-only note. Every sentence adds distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and simple annotations, the description fills exactly the gaps that matter: the return format, the category grouping, the premium-profile difference, and the boundary against godot_review. An agent can select and call it correctly from this text alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly describes no inputs and instead spends its words on output shape, which is the only semantic a caller needs here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the fixed AAA checklist that godot_review applies') and immediately characterizes the payload (plain text grouped by category, one line per rule with its fix). It is unambiguous against the sibling godot_review, which it explicitly names as the tool that checks a project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases ('before writing code to know the rules', 'look up a rule id from a finding') and an explicit exclusion plus redirect ('It does not look at the project; to check the project against these rules, use godot_review'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_feedbackFeedback on a review findingA
Tell Godotwright that a godot_review finding was wrong (a false alarm you verified) or right. finding is the line exactly as godot_review printed it; verdict wrong hides that finding in later reviews on this machine, right counts it as confirmed. Both teach Godotwright which rules to trust. Only use it after checking the code (godot_api, godot_check); fix real findings instead of marking them. It writes to the local learning file only (godotwright learn reset forgets everything). Returns a one-line confirmation; an error when the line is not a finding or learning is off.
| Name | Required | Description | Default |
|---|---|---|---|
| finding | Yes | the finding line, e.g. res://player.gd:12: error [api/unknown-member] ... | |
| verdict | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: wrong hides the finding in later reviews on this machine, right counts it as confirmed, and both teach the local learning system. It also discloses the local-file write scope, reset behavior, return format, and error conditions, which is strong transparency for a non-read-only mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded and free of filler. Each sentence carries useful information: purpose, parameter meaning, side effects, usage conditions, reset behavior, and return/error behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema, the description covers everything an agent needs: what it does, when to use it, what each verdict changes, where data is written, how to undo it, and what the response or error looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is only 50%, the description fully explains both parameters. It clarifies that `finding` is the exact line as godot_review printed it, and it explains what each `verdict` value does, adding meaning well beyond the enum and schema example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action, resource, and effect: tell Godotwright that a godot_review finding was wrong or right. It explicitly names the related sibling godot_review and distinguishes the feedback role from code-checking siblings like godot_api and godot_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: only after checking the code with godot_api or godot_check, and fix real findings instead of marking them. It also explains the consequences of each verdict, which routes the agent correctly between marking wrong versus right.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_migratePort Godot 3 scripts to Godot 4ADestructiveIdempotent
Rewrite Godot 3 GDScript to Godot 4 where that is mechanical: @export/@onready/@tool, renamed classes, functions, properties and constants, yield() to await, connect()/emit_signal() to signals, funcref() to callables, members that moved (OS.get_ticks_msec() to Time). Strings, comments and node paths are left alone. Without write it only reports the changes; with write: true it rewrites the scripts. It also lists what still needs a hand (setget, move_and_slide arguments, rpc keywords, export hints it does not know). Scenes and project settings are not migrated; Godot's --convert-3to4 does those. files limits it to some res:// scripts; detail brief shows up to 12 changes per file, full shows every change. Running it twice changes nothing more. Use it before fixing Godot 3 findings from godot_review one by one, and run godot_review afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| files | No | only these res:// scripts | |
| write | No | rewrite the scripts on disk (default false: report only) | |
| detail | No | brief: short output with capped lists; full: everything (default for this premium profile: full). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is largely carried by structured data. The description still adds real value on top: the no-write report-only default, the idempotency guarantee ('running it twice changes nothing more'), and the explicit list of what it deliberately leaves for manual fixes. It stops short of describing output shape or failure behavior, so this is solid but not exceptional given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the mechanical-rewrite scope comes first, then behavior, then scope limits, then usage ordering. Every sentence carries information, though the run is long and several clauses could be tightened into a list without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates fully: it says the tool reports changes, lists what still needs a hand (setget, move_and_slide arguments, rpc keywords, unknown export hints), and explains how `detail` shapes the report. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds genuine meaning beyond the schema: 'write: true' rewrites scripts while omission only reports, `files` narrows to res:// scripts, and `detail` brief caps at 12 changes per file versus full showing everything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (rewrite/migrate) and resource (Godot 3 GDScript to Godot 4), then enumerates the exact constructs handled and explicitly excludes strings, comments, node paths, scenes and project settings. An agent can tell it apart from godot_review, godot_rename, or Godot's own --convert-3to4 without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit ordering guidance: use it before fixing Godot 3 findings from godot_review one by one, and run godot_review afterwards. It also names the alternative for out-of-scope work (--convert-3to4 handles scenes and project settings) and states the dry-run default versus write:true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_model_briefBriefing before you build a modelARead-onlyIdempotent
One page to read before building a 3D model, made for small models: what the thing is, the ready-made kind to start from (with its build command), the parts to name your nodes after, typical size, rules, the usual mistakes, the order of tools to call, and a short spec cheat sheet. text is a name or a short description in English or Dutch; typos and plurals work. Replaces calling godot_model_identify and godot_model_spec separately when you just want to start; call those instead when you need every detail (all variants and sizes, or the full spec). Returns plain text. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | what you want to make, e.g. 'a rowing boat', 'dragon', 'castle wall' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely new behavior: it returns plain text, targets small models, is fuzzy-tolerant ('typos and plurals work', English or Dutch), and covers both identify and spec in one call. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content inventory is front-loaded and the fallback routing comes after, which is the right order. The enumeration of eight briefing sections is dense but each item tells the agent what to expect; it is one long sentence-heavy block but with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains that the return is plain text and inventories what that text contains, so an agent knows what to do with the result. Input tolerance and sibling routing are also covered; nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema example already illustrates the single `text` parameter, so the baseline is 3. The description goes beyond it by stating the parameter accepts a name or short description, that typos and plurals still resolve, and that Dutch is accepted — information absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns — a one-page pre-build briefing — and enumerates its contents (what the thing is, ready-made starting kind with build command, node names, typical size, rules, common mistakes, tool order, spec cheat sheet). It explicitly distinguishes itself from godot_model_identify and godot_model_spec, so an agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives both sides of the decision: use this when you just want to start, and call godot_model_identify / godot_model_spec instead when you need every detail (all variants and sizes, or the full spec). The alternative and the condition that selects it are named explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_model_buildBuild a 3D model from codeADestructiveIdempotent
Build a clean .glb (UVs, tangents, one node per part, same bytes every time) from a ready-made kind or a model spec, write it to out, and lint it. Pass collision so Godot adds collision shapes when it imports the file (most models need one; nobody remembers to add it by hand). If the spec has an "archetype" (or the kind has one), the result is also checked against what that thing should be. Give kind (with optional params), spec or spec_file; contract_out also writes a model.contract.json that godot_model_lint can hold later versions to. out is replaced if it exists. Returns the size, triangle and node count, then the lint report (detail full lists every finding with its fix); an error result when the lint finds errors, though the file is still written. Call godot_model_identify first and godot_model_spec for the format. To check a .glb you did not build here, use godot_model_lint.
| Name | Required | Description | Default |
|---|---|---|---|
| out | Yes | where to write the .glb, inside the project, e.g. models/car.glb | |
| kind | No | a ready-made kind: house, terrain, sea, airliner, apartment, barn, barrel, bicycle, boat, bridge, bus, bush, campfire, car, castle, chair, church, conifer, crate, dragon, drone, fence, fighter, flower, grass, helicopter, horse, humanoid, jet-engine, light-aircraft, motorcycle, palm, piston-engine, power-pylon, railway-track, road, rocket, rowing-boat, sailboat, satellite, ship, shipping-container, spaceship, street-lamp, table, tank, tower, tractor, train, tree, truck, wind-turbine, windmill | |
| spec | No | a full model spec as a JSON object | |
| detail | No | brief: short output with capped lists; full: everything (default for this premium profile: full). | |
| params | No | parameter values, e.g. { width: 9, roof: 'hip' } | |
| collision | No | collision for Godot: convex (a hull per mesh on import, for props and vehicles), trimesh (exact triangles on import, for buildings), or heightmap (terrain tiles: writes <name>.heightmap.tres and <name>.tscn with a StaticBody3D, faster than trimesh) | |
| spec_file | No | or a path to a spec JSON file inside the project | |
| contract_out | No | also write a model.contract.json here (inside the project) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely non-obvious behavior beyond the destructive/idempotent annotations: `out` is replaced if it exists, builds are byte-stable, heightmap collision writes extra .tres/.tscn files, and an error result still leaves the file on disk. The one gap is that it doesn't say what specifically the lint errors imply for downstream use, but the critical surprise (file written on error) is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and tightly packed with useful constraints. Some parenthetical asides ('nobody remembers to add it by hand') and the run-on sentence about returns and error results add length without adding information, but nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe return values — it does (size, triangle and node count, then the lint report, with `detail` controlling verbosity). For a destructive, multi-input build tool, the description covers inputs, outputs, side effects, and escalation paths.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns extra by explaining the mutual-exclusivity of `kind`/`spec`/`spec_file` (not expressed in the schema, which only requires `out`) and by giving the purpose of `collision` and `contract_out` rather than restating their descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource (build a .glb from a kind or spec) plus the three side effects: write to `out`, lint it, optionally write a contract. It also explicitly carves out its boundaries against siblings, pointing to godot_model_lint for .glb files built elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing rules: call godot_model_identify first, godot_model_spec for the format, godot_model_lint for files not built here. It also states the input alternatives (kind + optional params, or spec, or spec_file) so the agent knows which path to take.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_model_identifyWhat is this thing?ARead-onlyIdempotent
Say what a thing is before you build or check a 3D model of it: its family, the parts a model needs (and which move, about which axis, with the pivot where), a typical size range with its source and a confidence class, variants, Godot conventions (+Y up, front faces +Z), what to anticipate and the usual mistakes. Works from a name in English or Dutch (plurals, typos, compounds like 'vrachtauto') or a description ('something with wheels and an engine'). A word that means two things is reported as ambiguous; something unknown gets the nearest family, marked generic. Use it for the full facts about a thing, and its archetype name for godot_model_lint; for one short page that also names the ready-made kind and the spec format, use godot_model_brief instead. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | what you want to make or check, e.g. 'a tractor', 'helikopter', 'wind turbine' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered; the description redundantly says 'Read-only' but adds genuine behavior: ambiguous words are reported as ambiguous, unknown things return the nearest family marked generic, and input tolerates English/Dutch plurals, typos and compounds. It does not describe output shape or latency, keeping it 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the returned content, then the alternative routing, then input flexibility. It is a long dense sentence-chain, but nearly every clause carries routing or behavioral information; only the trailing 'Read-only' is wasted given annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden, and it does: family, required parts with movement/axis/pivot, size range with source and confidence class, variants, conventions, pitfalls. With one fully documented parameter and clear sibling routing, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single schema description already gives examples ('a tractor', 'helikopter'), so the baseline is met by the schema. The description adds value by clarifying accepted input forms (English or Dutch, plurals, typos, compound words, or a freeform description like 'something with wheels and an engine'), which the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('say what a thing is') and enumerates exactly what it returns: family, parts, movement axes, pivots, size range with source and confidence, variants, Godot conventions. It explicitly distinguishes itself from godot_model_lint and godot_model_brief, so the agent can route without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('before you build or check a 3D model', for full facts) and names alternatives with the condition that selects them: godot_model_lint for the archetype name, godot_model_brief for a short page naming the ready-made kind and spec format. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_model_inspectInspect a 3D modelARead-onlyIdempotent
Show what is in a .glb or .gltf, without Godot: file size, triangles, nodes, materials, textures with a memory estimate, the size in metres and the lowest point, then the node tree with triangles per mesh. detail brief lists the first 40 nodes; full lists every node, the materials and the textures. Use it for the numbers, for example to check a triangle budget or why a model floats. Read-only. To see the shape use godot_model_view; to find problems use godot_model_lint.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to a .glb or .gltf file, inside the project. | |
| detail | No | brief: short output with capped lists; full: everything (default for this premium profile: full). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/destructive=false, so the 'Read-only' line is redundant, but the description adds real behavioral detail: what `detail` changes at output level (first 40 nodes vs every node, plus materials and textures) and what estimates are produced. It doesn't describe pagination or output shape, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: what it returns, then the detail modes, then use cases, then alternatives. Slight redundancy with 'Read-only' repeating the annotation and a run-on inventory sentence, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming every reported field and how detail level affects them. For a 2-parameter read-only inspection tool, an agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the enum is already documented, but the description adds concrete meaning beyond it — the 40-node cap for `brief` and the fact that `full` also emits materials and textures. The default (full) is only in the schema, so it's slightly short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show what is in a .glb or .gltf') and enumerates the exact outputs: file size, triangles, nodes, materials, textures with memory estimate, bounds in metres, lowest point, and per-mesh node tree. It is unmistakably distinct from siblings like godot_model_view or godot_model_lint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering scenarios ('check a triangle budget or why a model floats') and explicitly routes to alternatives: godot_model_view for shape, godot_model_lint for problems. The when-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_model_lintReview a 3D modelARead-onlyIdempotent
Score a .glb or .gltf without Godot: flipped faces, open edges, missing normals, UVs or tangents, textures, node names, budgets. Pass archetype (a name such as 'car' or 'helikopter', or an id) to also check it is what it should be: required parts, pivots, wheel axes, size (unit mistakes), direction. Pass contract to hold it to a model.contract.json, and max_triangles to flag a heavy model. Returns an overall score, a score per category (geometry, materials, performance, rig, and archetype when given) and the findings: detail brief shows up to 25 errors and warnings, full shows every finding with its fix. An error result when there are errors. Read-only. godot_model_build already lints what it builds; to see the shape use godot_model_view, for the raw contents godot_model_inspect.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to a .glb or .gltf file, inside the project. | |
| detail | No | brief: short output with capped lists; full: everything (default for this premium profile: full). | |
| contract | No | a model.contract.json inside the project | |
| archetype | No | what the model should be, e.g. car, helikopter, vehicle.wheeled.car | |
| max_triangles | No | flag a model with more triangles than this |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds real value: it describes the return shape (overall score, per-category scores, findings), the brief vs full detail behavior, and the fact that an error result is returned when errors exist. The only redundancy is restating 'Read-only', which duplicates readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, and every clause carries information. It is dense — long comma-separated enumerations and a packed final routing sentence — but nothing is genuinely wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter read-only lint tool with no output schema, the description supplies the missing pieces: what is checked, what the optional parameters unlock, what is returned, how detail affects output volume, and when errors surface. An agent can call this correctly without opening any other tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by explaining what archetype actually checks (required parts, pivots, wheel axes, size/unit mistakes, direction) and that archetype accepts a name or an id. That is meaning beyond the schema's bare 'what the model should be, e.g. car, helikopter'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Score a .glb or .gltf') and immediately enumerates what is inspected: flipped faces, open edges, normals, UVs, tangents, textures, node names, budgets. It also differentiates itself from siblings by naming godot_model_build, godot_model_view and godot_model_inspect in the same breath.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: build already lints what it builds, use godot_model_view for shape and godot_model_inspect for raw contents. It also states the conditions for the optional parameters (archetype to check it is what it should be, contract to hold it to model.contract.json, max_triangles to flag a heavy model).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_model_specModel spec formatARead-onlyIdempotent
Explain the model spec: a JSON tree of named parts that godot_model_build turns into a .glb. Returns plain text: the spec rules, a JSON example (a small car), then one line per ready-made kind with its parameters and their defaults. Read it before you write a spec or pass params to godot_model_build; skip it when a ready-made kind with its defaults is enough. godot_model_brief has a shorter cheat sheet. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, closed-world behavior, so the safety profile is covered. The description adds substantive context beyond that: it discloses the exact return format (rules, a small-car JSON example, one line per kind with defaults), which is valuable since there is no output schema. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core purpose, then return shape, then usage routing and alternatives. Every sentence carries distinct value with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only educational tool with no output schema, the description covers purpose, output content, when to call it, when to skip it, and the lighter sibling alternative. Nothing an agent needs to select or use it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description does clarify that the output documents each ready-made kind's parameters and defaults, which helps an agent understand what spec/param information it will get, though there are no tool arguments to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Explain the model spec' — and defines what the spec is: 'a JSON tree of named parts that godot_model_build turns into a .glb.' This distinguishes it from godot_model_build (the consumer) and godot_model_brief (the shorter cheat sheet) without requiring the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Read it before you write a `spec` or pass `params` to godot_model_build') and when-to-skip ('skip it when a ready-made `kind` with its defaults is enough'). It also names the lighter alternative sibling, godot_model_brief, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_model_viewSee a 3D model as textARead-onlyIdempotent
Look at a .glb or .gltf without Godot or a picture: three views (front, side, top) drawn with letters, one letter per part, then a list of the parts with their sizes and heights, and which parts do not touch the rest of the model (a ladder away from its tree, a wheel without an axle, something floating). only shows one of the views; width sets the characters per view (default 48). Use it after building to check the shape, proportions and that everything is attached. Read-only. For a rendered picture use godot_screenshot (needs Godot); for triangles, materials and textures use godot_model_inspect; for problems use godot_model_lint.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to a .glb or .gltf file, inside the project. | |
| only | No | show one view only | |
| width | No | width of the views in characters (default 48) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: it discloses that no Godot install or image is needed, what the output contains (per-part letters, sizes, heights, floating/detached-part detection), and restates "Read-only" consistently with readOnlyHint=true. It slightly repeats what the annotations already declare rather than adding new safety/permission context, which keeps it off 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first clause front-loads the core purpose and the output description follows; nearly every sentence earns its place, including the routing sentence. It is dense and slightly run-on with the parenthetical examples ("a ladder away from its tree"), which costs a point but not readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the returned content in detail (three views, parts list with sizes and heights, detached-part detection). For a read-only, 3-parameter inspection tool it gives an agent everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so file, only, and width are already documented with types, enum, bounds and default. The description's "`only` shows one of the views; `width` sets the characters per view (default 48)" essentially mirrors the schema wording, so baseline 3 applies — it does not add format or edge-case semantics the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: viewing a .glb/.gltf file without Godot or an image, rendered as three letter-drawn views plus a parts list. It fully describes the output shape and explicitly distinguishes itself from godot_screenshot, godot_model_inspect and godot_model_lint by naming what each of those does instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit triggering condition ("Use it after building to check the shape, proportions and that everything is attached") and routes three alternatives with their distinguishing conditions — rendered picture vs. triangles/materials/textures vs. problem reporting. Nothing about when to pick this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_playPlay a scene with inputAIdempotent
Run a scene in Godot 4.7 headless for a number of physics frames, press and release input actions (or keys, mouse and joypad buttons) on the frames you give, and return a table of the values you watch per frame, plus errors and prints. The game sees each input on exactly that physics frame, and runs are deterministic. input steps are a frame, a verb (press, release, tap, or hold with a frame count) and an action or an event such as Key:Space; watch entries are a node path from the scene root, a dot, then a property or a method call; every sets how often values are sampled. Use it to check that the player jumps, moves, takes damage or that a timer fires, without a screen. An error result when the run does not finish or Godot reports an error; an unknown input action gives a warning. Your scenes and scripts are not changed: Godotwright runs it through a temporary script in .godot/godotwright/ and removes it afterwards. For assertions kept in the project use godot_test; for load errors use godot_check.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| every | No | sample every n frames (default 10); frames with input and the last frame are always sampled | |
| input | No | timeline: "10 press jump; 30 release jump; 40 hold right 20; 50 tap Key:Space" | |
| scene | No | the res:// scene to run (default: the main scene) | |
| watch | No | values to sample: Player.position, Player.velocity.y, Player.is_on_floor() | |
| frames | No | physics frames to run (default 120) | |
| timeout_seconds | No | timeout of the run (default 300) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: input is seen on exactly the given physics frame, runs are deterministic, an error result means the run did not finish or Godot reported an error, while an unknown action only warns. It also explains why readOnlyHint=false is safe here — the project is unmodified and the temporary script in .godot/godotwright/ is removed afterwards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return value, then parameters, then use cases, then sibling routing — a sensible progression. It is dense but nearly every sentence carries information; a slightly tighter split into shorter sentences would help scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-parameter simulation tool with no output schema, the description covers the return value (per-frame table plus errors and prints), failure semantics, determinism, and side effects on disk. An agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description still adds meaning: the `input` timeline grammars are (frame, verb press/release/tap/hold with count, action or event like Key:Space), `watch` entries are node path + dot + property or method call, and `every` controls sampling cadence. Useful reinforcement rather than pure repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb-resource pair: run a res:// scene headless in Godot 4.7 for N physics frames, inject input on specific frames, and sample watched values per frame. It is clearly distinguishable from godot_test (in-project assertions) and godot_check (load errors), which it names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use cases (verify the player jumps, moves, takes damage, a timer fires — without a screen) and explicit alternatives with the selection condition: godot_test for assertions kept in the project, godot_check for load errors. Nothing is left to inference about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_project_editChange project settings, input map or autoloadsADestructive
Change project.godot safely, without the editor: set or unset a setting (name and type checked against the Godot 4.7 reference), add events to an input action or remove it, add or remove an autoload (the file must exist and be a Node script or a scene; the name must not clash with a class). Only the lines of that entry change. Events: Key:Space, Key:Ctrl+S, Mouse:Left, JoyButton:A, JoyAxis:left_y-. op picks the change and which fields it needs: set (key, value), unset (key), input_add (action, events, deadzone), input_remove (action), autoload_add (name, file, global), autoload_remove (name). Without write it changes nothing and returns the diff and warnings; with write: true it writes and reports the review errors before and after (an error result when there are more after). A missing field or a change it refuses (bad event, unknown action, name clash) returns an error and writes nothing. Use it instead of editing project.godot by hand: the input map format is easy to break. For .tscn files use godot_scene_edit; to rename an action or autoload everywhere, use godot_rename.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | what to change | |
| key | No | set/unset: the setting path, e.g. display/window/size/viewport_width | |
| file | No | autoload_add: res:// path of the script or scene | |
| name | No | autoload_add/autoload_remove: the autoload name, e.g. Game | |
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| value | No | set: the value, e.g. 1920, true, 1.5, a text, res://main.tscn or Vector2i(1920, 1080) | |
| write | No | write the change (default false: show the diff only) | |
| action | No | input_add/input_remove: the action name, e.g. jump | |
| events | No | input_add: events such as Key:Space, Mouse:Left, JoyButton:0, JoyAxis:1- | |
| global | No | autoload_add: make a global variable (default true) | |
| deadzone | No | input_add: deadzone of a new action (default 0.2) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=false): it discloses the dry-run default, that only the lines of that entry change, that refusals and missing fields return an error and write nothing, and that with write it reports review errors before and after with an error result if errors increase. This is exactly the mutation-safety context annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the safety model and the tool's scope before the dense op/field enumeration. Every sentence carries information, though the middle section is a long run-on that would read better as a list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter destructive mutation with no output schema, the description covers what is returned in both modes (diff, warnings, before/after review errors), what happens on failure, and the validation rules for every op. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds the op-to-field dependency mapping (set/key+value, input_add/action+events+deadzone, autoload_add/name+file+global) that the schema only implies, plus event string syntax with concrete examples. It does not restate path/write defaults, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (edit project.godot: settings, input map, autoloads) and immediately names the boundaries against siblings godot_scene_edit and godot_rename. An agent can distinguish this from every other godot_* tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it instead of hand-editing project.godot because the input map format is easy to break, and routes .tscn work to godot_scene_edit and renaming to godot_rename. The dry-run-first workflow ('without write it changes nothing and returns the diff') is also spelled out as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_renameRename everywhereADestructive
Rename a function, signal, variable, class_name, autoload, input action, group or node name everywhere it is used (GDScript, scene connections, node paths, groups, project settings), or move a res:// file together with its .uid and .import files and every reference to it. from and to are both names or both res:// paths. Without write it changes nothing and returns the exact lines it would change and what it could not change; with write: true it applies them and reports the review errors before and after (an error result when there are more after). Refuses, with an error, when the new name is already taken. Call godot_usages first to see what it will touch. For a setting value, an input event or a node property, use godot_project_edit or godot_scene_edit instead.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | the new name, or the new res:// path | |
| from | Yes | the current name, or a res:// path | |
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| write | No | apply the rename (default false: show the plan only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: default is a no-op dry run returning the exact lines that would change and what could not change; write:true applies and reports review errors before and after, erroring when post-count exceeds pre-count; it refuses when the new name is taken. This is consistent with destructiveHint=true and readOnlyHint=false (the danger only materializes under write:true).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the rename surface comes first, then the file-move mode, then dry-run/write behavior, then the safety refusal and sibling routing. Individual sentences are long and clause-heavy, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so fully: exact changed lines, unchangeable locations, and before/after review errors. For a destructive, non-idempotent rewrite tool, an agent has everything needed to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a real constraint the schema does not express: 'from and to are both names or both res:// paths,' and it clarifies write's semantics (default false = plan only). Path's project-root resolution is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (rename) plus the full resource surface (functions, signals, variables, class_name, autoloads, input actions, groups, node names) and a second mode (moving a res:// file with .uid/.import and references). This is enough for an agent to distinguish it from godot_project_edit and godot_scene_edit without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Call godot_usages first to see what it will touch' and 'For a setting value, an input event or a node property, use godot_project_edit or godot_scene_edit instead.' Both the when and the when-not-with-alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_reviewAAA reviewA
Static AAA review of the project, no Godot needed: API correctness (Godot 3 code, unknown classes, functions, members, signals, wrong argument counts, missing input actions), performance, code quality and structure. Returns a 0-100 score per category, then one line per finding: res://file.gd:12: error [rule] message; detail full adds the fix under each finding. Pass files to list only findings in files you changed. Pass code and file to review GDScript before writing it to disk. Pass only_new: true while you are fixing: new findings in full, the ones you already saw as one short line each, and how many are fixed. It never changes your code; it keeps the last review in .godot/godotwright/ for only_new and counts rule hits in the local learning file. For errors only the engine finds, run godot_check after it; godot_checklist lists every rule.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | unsaved GDScript to review in place of the file on disk | |
| file | No | res:// path the code belongs to (required with code) | |
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| files | No | only show findings in these res:// files | |
| detail | No | brief: short output with capped lists; full: everything (default for this premium profile: full). | |
| only_new | No | show only what changed since the last review of this project (saves tokens in a fix loop) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false/destructiveHint=false; the description goes further, disclosing that it never mutates code but does persist side effects — the last review in .godot/godotwright/ and rule-hit counts in a local learning file. That is exactly the kind of state-change detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and output shape are front-loaded and nearly every clause carries information (side effects, output format, sibling routing). It is dense to the point of being run-on and slightly harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the return-format burden and delivers: a 0-100 score per category plus the exact `res://file.gd:12: error [rule] message` line format. For a six-parameter, stateful review tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds usage-level meaning the schema lacks: `files` targets changed files, `code`+`file` reviews unsaved GDScript, `only_new` collapses already-seen findings and reports a fixed count, and `detail: full` inlines fixes. Only `path` is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Static AAA review of the project, no Godot needed' — and enumerates exactly what it checks (API correctness, performance, quality, structure). It explicitly distinguishes itself from siblings: godot_check handles 'errors only the engine finds' and godot_checklist 'lists every rule.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use modes: pass `files` for changed files, `code` + `file` to review GDScript before writing to disk, `only_new: true` during a fix loop. It also names the complementary alternative (godot_check) and when to escalate to it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_scanMap the Godot projectARead-onlyIdempotent
Map a Godot 4 project from its files, without running Godot: scenes with node trees, scripts with class_name, signals, functions and exports, autoloads, input actions, key settings, and broken references. Call this first in a project, and again after large changes. For one name use godot_usages; for engine classes use godot_api. detail brief gives one line per scene and script; full adds node trees with line numbers, signal connections, input events and settings. Read-only. Returns an error when there is no project.godot at or above path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| detail | No | brief: short output with capped lists; full: everything (default for this premium profile: full). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces that with the higher-value fact that no Godot process is required ('without running Godot') and that it errors when no project.godot exists at or above `path` — a failure mode the annotations cannot express. It stops short of describing output shape or cost/scale for large projects, which is the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then when-to-use, then sibling routing, then the `detail` tradeoff, then safety and the error case. Four dense sentences with no filler — every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden itself — and it does, enumerating the mapped artifacts and what each detail level emits. Combined with the error condition and read-only guarantee, an agent has everything needed to call it correctly on a two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns extra by spelling out what `detail` actually changes ('brief gives one line per scene and script; full adds node trees with line numbers, signal connections, input events and settings'), which is more concrete than the schema's 'short output with capped lists'. It also implicitly clarifies `path` behavior via the 'at or above `path`' walk-up reference, though that detail is mostly carried by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Map a Godot 4 project from its files') and enumerates exactly what is extracted: scenes with node trees, scripts with class_name/signals/functions/exports, autoloads, input actions, settings, broken references. It also carves out the sibling territory explicitly ('For one name use godot_usages; for engine classes use godot_api'), so an agent can distinguish it from godot_usages and godot_api without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing ('Call this first in a project, and again after large changes') plus named alternatives and the condition that selects each. Nothing about when to prefer a sibling is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_scene_editChange a sceneADestructive
Change a .tscn safely, without the editor: add a node (a Godot class or an instanced scene), remove a node (with its children, connections and the resources only it used), set a property (name and type checked against Godot 4.7; enums by name, resources as res:// files), connect or disconnect a signal (checks the signal exists, and warns when the method is missing or takes the wrong number of arguments, with the func line to add), or attach a script (refuses one that extends another node type). Node paths are relative to the scene root, which is ".". op picks the change and which fields it needs: add_node (parent, name, and type or instance), remove_node (node), set (node, property, value), connect and disconnect (from, signal, to, method), attach_script (node, script). Only the lines of that change are touched. Without write it changes nothing and returns the diff and warnings; with write: true it writes and reports the review errors before and after (an error result when there are more after). A missing field or a change it refuses returns an error and writes nothing. Use it instead of editing .tscn files by hand. For project.godot use godot_project_edit; to rename a node everywhere, use godot_rename.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | what to change | |
| to | No | connect/disconnect: path of the node that receives | |
| from | No | connect/disconnect: path of the node that emits | |
| name | No | add_node: name of the new node | |
| node | No | remove_node/set/attach_script: path of the node ("." is the root) | |
| type | No | add_node: a Godot node class, e.g. Sprite2D | |
| scene | Yes | the scene: res://main.tscn, or a path | |
| value | No | set: the value, e.g. Vector2(10, 20), 3, true, ALWAYS, res://icon.svg, null | |
| write | No | write the change (default false: show the diff only) | |
| method | No | connect/disconnect: method name | |
| parent | No | add_node: path of the parent ("." is the root) | |
| script | No | attach_script: res:// path of the script | |
| signal | No | connect/disconnect: signal name | |
| instance | No | add_node: a res:// scene to instance instead of a type | |
| property | No | set: property name, e.g. position |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint/readOnlyHint annotations, the description discloses that writes are opt-in via `write`, that dry-run returns diff plus warnings, that validation occurs against Godot 4.7 (signal existence, method arity, script base-type refusal), that only the lines of the change are touched, and that refused/incomplete changes write nothing. This is exactly the mutation context an agent needs and it is consistent with destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the destructive/alternative routing, and every clause carries information (validation rules, write semantics, op-field mapping). It is a dense single paragraph, though quite long for one breath; a small structural break would aid scanning without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutating tool with no output schema, it covers the essentials: dry-run vs write, return of diff and warnings, before/after review errors, and no-write-on-error behavior. Minor gaps remain, such as whether a preview diff is stable enough to approve blindly or how concurrent edits are handled, but nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds cross-field semantics the schema cannot express per-property: which fields each `op` requires (add_node needs parent/name plus type or instance, etc.) and the node-path convention ('relative to the scene root, which is "."'). Value formats (enums by name, res:// resources) partially duplicate the schema's `value` description, keeping it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Change a .tscn safely, without the editor') and then enumerates the six concrete mutations supported. It explicitly names the sibling tools it is not (godot_project_edit, godot_rename), so an agent can route correctly without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States explicit when-to-use ('Use it instead of editing .tscn files by hand'), when-not ('For project.godot use godot_project_edit; to rename a node everywhere, use godot_rename'), and the dry-run vs write decision rule ('Without `write` it changes nothing... with `write: true` it writes'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_screenshotScreenshot a scene or modelAIdempotent
Render a scene, or a .glb/.gltf model framed by a camera and lit, to a PNG with Godot 4.7 (Compatibility renderer, works on software OpenGL; on Linux without a display it uses xvfb-run). Returns the picture and a short text: how much of each view is drawn and where, so you can tell an empty or off-screen picture even without reading the image. For a model, views front (from +Z, where models face), back, side, top and iso; several make a grid. width and height are per view; frames lets the scene settle before the picture. The PNG is written next to the model (car.glb gives car.png) or, for a scene, to .godot/godotwright/screenshot.png. An error result when Godot is missing or the scene cannot run. Use it to look at what you built. Without Godot, godot_model_view shows a model as text; to check behaviour rather than looks, use godot_play.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| model | No | a .glb or .gltf file to look at instead of a scene | |
| scene | No | the res:// scene to render (default: the main scene) | |
| views | No | camera views for a model or a 3D scene without a camera (default [iso]) | |
| width | No | width of one view (default 640) | |
| frames | No | frames to run before the picture (default 10) | |
| height | No | height of one view (default 360) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing the renderer (Godot 4.7 Compatibility, software OpenGL), the xvfb-run fallback on headless Linux, the exact output paths written (.godot/godotwright/screenshot.png, or car.png beside car.glb), and the fact that a coverage-metadata text accompanies the image so empty or off-screen renders are detectable. The filesystem write is consistent with readOnlyHint=false, and the idempotent/non-destructive profile is implicitly supported by the deterministic per-view semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded — capability, then inputs, then output behaviour, then alternatives. A few sentences are fragments ("An error result when Godot is missing or the scene cannot run.") and the output-path sentence is slightly buried, but essentially no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains both return components (the PNG and the coverage text) and where the file lands, plus failure mode. For a 7-parameter tool with zero required params, that is enough for an agent to call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: width/height are per-view (matters when several views grid up), frames is for letting the scene settle, and multiple views compose a grid. It doesn't define the view directions in param terms beyond 'front (from +Z, where models face)', which is still useful orientation context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource — render a scene or .glb/.gltf model to a PNG — plus the engine and renderer used. It clearly separates the two input modes (scene vs. model) and is distinguishable from siblings like godot_model_view and godot_play.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the primary use ("Use it to look at what you built") and names two alternatives with the conditions that select them: godot_model_view when Godot is unavailable, godot_play when behaviour rather than looks matters. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_testRun the unit testsAIdempotent
Run the project's GUT or GdUnit4 tests in Godot 4.7 headless and return only the totals and the failing tests, each with res://file:line and the failure message, plus script errors from the run. Use it after a change to see whether the tests still pass. Needs Godot on this machine and GUT (res://addons/gut) or GdUnit4 (res://addons/gdUnit4) in the project. framework picks one when both are installed; dirs chooses the test folders or scripts (default: the framework's config, else res://test and res://tests); filter runs only matching GUT tests. An error result when a test fails, or when Godot or a framework is missing. Test files are not changed; reports go to a temporary folder or .godot/godotwright/. To try input without writing tests use godot_play; for load errors only use godot_check.
| Name | Required | Description | Default |
|---|---|---|---|
| dirs | No | test folders or scripts as res:// paths (default: the framework's config, else res://test and res://tests) | |
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. | |
| filter | No | GUT only: run only tests whose name contains this text | |
| framework | No | which framework (default: whichever is installed) | |
| timeout_seconds | No | timeout of the run (default 600) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses prerequisites (Godot installed, addons/gut or addons/gdUnit4 present), the error-result contract (error when a test fails or a dependency is missing), and the on-disk side effects (test files untouched, reports written to a temp folder or .godot/godotwright/). That last point usefully explains why readOnlyHint is false despite the tool being non-destructive and idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then prerequisites, then parameters, then alternatives — a sensible ordering with no filler sentences. It is a dense single paragraph with heavy backtick usage, which makes it slightly harder to skim than a short bulleted split would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden, and it does: totals, failing tests with locations and messages, plus script errors from the run. Combined with prerequisites, failure semantics, and side effects, an agent has everything needed to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description adds real meaning on top by explaining resolution order for `framework` (picked explicitly when both are installed), the defaulting cascade for `dirs` (framework config, else res://test and res://tests), and that `filter` is GUT-only. It does not touch `path` or `timeout_seconds`, but the schema handles those adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (run the project's GUT/GdUnit4 tests in Godot headless) and pins down return content (totals plus failing tests with res://file:line and messages). It also explicitly distinguishes itself from godot_play and godot_check by naming when each of those is the right tool instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use it after a change to see whether the tests still pass" gives the trigger, and the final sentence names two alternatives with their selecting conditions (godot_play for trying input without writing tests, godot_check for load errors only). "Use when both frameworks are installed" for `framework` resolves the one common ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
godot_usagesFind usagesARead-onlyIdempotent
Find every place a name is used in the project, offline and without the editor: a function, signal, variable, constant, class_name, autoload, input action, group or node name, or a res:// path / uid:// (which files refer to it, and whether it exists). Looks in GDScript code (not comments), in strings where Godot looks names up (connect, emit_signal, is_action_pressed, add_to_group, get_node, load), in scene connections, node names and groups, and in project settings. Call it before you rename, move or delete anything; to make the change everywhere, use godot_rename. For engine API names use godot_api. Returns where the name is defined, then each file with the line number, the kind of use and the line itself (very common names are capped). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | what to look for, e.g. take_damage, health_changed, Player, jump, res://scenes/enemy.tscn | |
| path | No | The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, but the description adds substantial context beyond them: works offline without the editor, skips comments, searches specific lookup contexts (connect, emit_signal, get_node, load), and warns that very common names are capped. It even describes the return layout, which is valuable since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then the routing guidance, then the return format. It is a dense paragraph with multiple clauses, but each sentence carries actionable information; only the trailing 'Read-only.' is redundant with the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape (definition location, then per-file line number, use kind, line text) and the capping caveat. Combined with the scope and alternative routing, an agent has everything needed to invoke and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented and the baseline is 3. The description nonetheless adds semantic breadth by clarifying what 'name' can be (class_name, autoload, uid://, input action), helping an agent choose the right query form beyond the schema's examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('find every place a name is used') and enumerates the exact resource domains covered (function, signal, class_name, autoload, input action, res:// path, uid://). It also explicitly distinguishes itself from godot_rename and godot_api, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use trigger ('Call it before you rename, move or delete anything') and names the alternatives with their selecting conditions: godot_rename for making the change, godot_api for engine API names. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.1- Changed
godot_api1 field changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail (default for this premium profile: full)."New value: +"brief: short output with capped lists; full: everything (default for this premium profile: full)."
- Changed
godot_check1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_migrate2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail (default for this premium profile: full)."New value: +"brief: short output with capped lists; full: everything (default for this premium profile: full)." - changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_model_build3 fields changed- changed
Input schema / properties / collision / descriptionPrevious value: -"name the meshes so Godot makes collision shapes on import: convex (a hull per mesh, for props and vehicles) or trimesh (exact triangles, for buildings and terrain)"New value: +"collision for Godot: convex (a hull per mesh on import, for props and vehicles), trimesh (exact triangles on import, for buildings), or heightmap (terrain tiles: writes <name>.heightmap.tres and <name>.tscn with a StaticBody3D, faster than trimesh)" - changed
Input schema / properties / collision / enumPrevious value: -[ - "convex", - "trimesh" -]New value: +[ + "convex", + "trimesh", + "heightmap" +] - changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail (default for this premium profile: full)."New value: +"brief: short output with capped lists; full: everything (default for this premium profile: full)."
- Changed
godot_model_inspect1 field changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail (default for this premium profile: full)."New value: +"brief: short output with capped lists; full: everything (default for this premium profile: full)."
- Changed
godot_model_lint1 field changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail (default for this premium profile: full)."New value: +"brief: short output with capped lists; full: everything (default for this premium profile: full)."
- Changed
godot_play1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_project_edit1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_rename1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_review2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail (default for this premium profile: full)."New value: +"brief: short output with capped lists; full: everything (default for this premium profile: full)." - changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_scan2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail (default for this premium profile: full)."New value: +"brief: short output with capped lists; full: everything (default for this premium profile: full)." - changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_screenshot1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_test1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
- Changed
godot_usages1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Project directory or a path inside it (default: the current project)."New value: +"The project folder, or any file or folder inside it (Godotwright walks up to project.godot). Relative paths start at the server's folder. Default: the current project."
22 tool updates
v0.1.0- First observed
godot_api - First observed
godot_api_search - First observed
godot_check - First observed
godot_checklist - First observed
godot_feedback - First observed
godot_migrate - First observed
godot_model_brief - First observed
godot_model_build - First observed
godot_model_identify - First observed
godot_model_inspect - First observed
godot_model_lint - First observed
godot_model_spec - First observed
godot_model_view - First observed
godot_play - First observed
godot_project_edit - First observed
godot_rename - First observed
godot_review - First observed
godot_scan - First observed
godot_scene_edit - First observed
godot_screenshot - First observed
godot_test - First observed
godot_usages
TDQS
Scored across 22 tools
Most tools occupy distinct niches (scan, usages, rename, review, check, play, test), and descriptions actively route the agent between them ('for engine classes use godot_api', 'for a picture use godot_screenshot'). A few clusters blur at the edges: godot_api vs godot_api_search (search vs exact lookup), godot_review vs godot_check vs godot_checklist, and especially godot_model_brief vs godot_model_identify vs godot_model_spec, plus godot_model_view vs godot_model_inspect vs godot_screenshot. These are separable but require reading long descriptions to choose correctly.
Every tool is prefixed godot_ with snake_case, and the 3D model family (godot_model_*) is grouped predictably. Deviations are minor: several names are bare nouns or verbs without an object (godot_scan, godot_review, godot_check, godot_api) rather than a uniform verb_noun pattern, and godot_check/godot_checklist sit close enough to invite confusion.
22 tools is at the heavy end of the range and effectively covers two surfaces: project/code work (scan, review, edit, run, test, rename, migrate) and 3D model authoring (identify, brief, spec, build, lint, view, inspect, screenshot). Each tool does have a job, but the model subfamily alone is eight tools, several of which are thin conveniences (brief, spec, identify) an agent could absorb.
Lifecycle coverage is strong: discovery (scan, usages, api, api_search, checklist), analysis (review, check, play, test), mutation (rename, project_edit, scene_edit, migrate) and a full model pipeline from identification through build, lint, view, inspect and screenshot. Gaps are mostly around asset/script file authoring — no tool to create or delete a .gd/.tres, and scene_edit covers node add/remove/set/connect but not duplication, reorder or scene creation.
Maintenance
Related MCP Connectors
Lints + auto-fixes how AI coding agents discover any new product. 24 rules, 6 tools, score 0-100.
Scores your code across 12 areas, with findings, fix prompts, and re-assessment in your AI agent
Scan AI agent skills, MCP server packages and MCP configs before you install them. Static analysis.
GodPrompt MCP + Agent Skill for coding agents with TDD, debugging, verification, and task routing.
Related MCP Servers
- AlicenseBqualityDmaintenanceAdvanced MCP server for Godot 4.6+ with 63 professional tools, enabling AI-assisted game development with backup/rollback, deep script validation, and project health diagnostics.63194 npm5MIT
- AlicenseCqualityCmaintenanceEnables AI agents to interact with the Godot game engine, including project inspection, scene/script parsing, headless exports, runtime control with live scene-tree inspection and evaluation, and API documentation search.100980 npm4MIT
- AlicenseBqualityBmaintenanceEnables AI agents to inspect, modify, run, and debug Godot projects, including scene and script analysis, editor and project management, and visual verification through screenshots.2215 npm14MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect, author, debug, simulate, and visually verify Godot 4.x projects through standard MCP tools, including scene editing, runtime control, and viewport capture.194 npm3MIT