MCP server for automating Godot game engine testing and interaction via WebSocket protocol
Strong tool definitions with comprehensive schemas and descriptions. All 22 tools have explicit names, descriptions (50-300+ chars), and detailed input schemas with types and constraints. Tool annotations (readOnlyHint) are present. However, output schemas are not documented in the source code, responses are returned as text without structured schema declarations. Error handling guidance is minimal. Parameter descriptions are generally good but some lack constraint details (e.g., selector syntax is documented in descriptions but not as formal patterns). Naming is consistent (godot_* prefix) and action-oriented. Composition is sound: tools are single-responsibility and chain well via instance_id.
Sample a Godot performance monitor and assert a chosen statistic against a threshold. Returns pass/fail plus the sample count, min, max, mean, median, p95, and engine/render environment metadata. Defaults to a single sample (the old instantaneous behavior); set sample_count, duration_ms, or warmup_ms to sample over time.
Call a method on a Godot node. Some destructive and private methods are blocked for safety.
Change to a different scene in the running Godot game
Click on a node or at screen coordinates in the Godot game
Connect to a Godot game that is ALREADY running with the stagehand addon enabled. The default port 26700 is shared: the addon accepts many clients into one SceneTree, so connecting with defaults may attach you to a game another agent started, and both of you then mutate the same tree (cross-talk, nondeterministic tests). Prefer godot_launch, which starts your own private instance on an auto-assigned port; use godot_connect only for a game you know is yours, and pass its explicit port when one is running per agent.
Output schemas not documented. Tools return text responses without structured schema declarations. LLMs cannot infer response field names, types, or structure for downstream tool chaining.
Error handling lacks recovery guidance. No evidence of actionable error messages that tell LLMs what to do next (retry, lookup, ask user). Errors are likely raw or generic.
Selector parameter syntax is documented in descriptions but not formalized as regex patterns or enums. LLMs may generate invalid selectors (e.g., malformed >> chains).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Disconnect and remove a named Godot instance
Evaluate a GDScript expression in the running Godot game. Engine singletons (Engine, OS, Time, Input, DisplayServer, ProjectSettings, …) are available. NOTE: conditional/ternary expressions ('a if c else b') are NOT supported by Godot's Expression parser — split them into separate calls. DANGEROUS — only works when Stagehand is enabled.
Find nodes matching a selector expression (path, name:, class:, group:, text:, meta:, unique:, with >> chaining)
Give window focus to a Window (e.g. a modal dialog) so godot_press_key reaches it. With no selector, targets the visible modal subwindow that has lost focus.
Get a semantic accessibility view of the UI: roles (button, check_box, text_field, ...), accessible names, values, and states. Roles use Godot's canonical AccessibilityRole vocabulary and are derived from the Control hierarchy plus author-set accessibility properties (responses are tagged source="derived"), because Godot's AccessKit tree is write-only and not readable from GDScript. Requires Godot 4.5+.
Get the current game state: scene, FPS, physics state, window size
Get performance metrics from the Godot Performance singleton
Read a property from a Godot node (supports dot notation like "position.x")
Get a snapshot of the Godot scene tree
Launch a Godot game with the stagehand addon enabled and connect to it. This is the paved road: the default port 0 auto-assigns a free port, so you get a private instance that no other agent is driving. Use this instead of godot_connect unless you must attach to a game someone else already started — godot_connect's default port 26700 is shared and can land you in another agent's SceneTree.
List all active Godot connections managed by this server
Move mouse cursor to a specific position without clicking
Simulate a Godot input action (e.g. "ui_accept", "move_left")
Simulate a keyboard key press in the Godot game
Set a property on a Godot node
Simulate a touch screen event in the Godot game
Send text input to the focused control in the Godot game
Destructive/irreversible tools (godot_launch, godot_disconnect, godot_change_scene, godot_evaluate) lack confirmation or dry-run support. Agents cannot preview consequences before committing.
godot_launch and godot_connect accept auth_token as a parameter. Tokens should never appear in tool parameters, use server-side secret injection via environment variables.