Skip to main content
Glama

Game Manage

game_manage

Inspect a running Godot game, control pause and frame stepping, and simulate keyboard, mouse, gamepad, and action input for testing and debugging.

Instructions

Runtime game inspection and input simulation.

These ops target the running game process through Godot's EngineDebugger bridge. Start the project first with project_run and poll editor_state until game_capture_ready=true.

Ops:

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

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

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

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

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

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

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

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

  • input_mouse(event, position=None, button="left", pressed=True, buttons=None) Send a mouse motion or button event. event: "motion" | "button". position is a {x, y} object or [x, y] array; omit it to use the game's current cursor position. A present but malformed position is rejected rather than silently falling back to the cursor. Buttons pressed through input_mouse stay held until released, and motion carries them as its button_mask with relative set from the previous mouse event, so press, motion..., release performs a GUI drag-and-drop. buttons (motion only) overrides the held set for that event, e.g. ["left"]; names: left, right, middle. Wheel steps are one-shot and never held. Button replies list the buttons held after the event; motion replies list the buttons that motion carried.

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

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

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

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

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

Input Schema

NameRequiredDescriptionDefault
opYes
paramsNo
session_idNo

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv4.0.3
    • changedInput schema / properties / op / enum
      Previous value: -[
      -  "get_node_info",
      -  "get_scene_tree",
      -  "get_ui_elements",
      -  "input_action",
      -  "input_gamepad",
      -  "input_key",
      -  "input_mouse",
      -  "input_sequence",
      -  "input_state"
      -]New value: +[
      +  "debug_status",
      +  "get_node_info",
      +  "get_scene_tree",
      +  "get_ui_elements",
      +  "input_action",
      +  "input_gamepad",
      +  "input_key",
      +  "input_mouse",
      +  "input_sequence",
      +  "input_state",
      +  "next_frame",
      +  "resume",
      +  "suspend"
      +]
  2. Changed1 schema field changedv3.1.4
    • changedInput schema / properties / op / enum
      Previous value: -[
      -  "get_node_info",
      -  "get_scene_tree",
      -  "get_ui_elements",
      -  "input_action",
      -  "input_gamepad",
      -  "input_key",
      -  "input_mouse",
      -  "input_state"
      -]New value: +[
      +  "get_node_info",
      +  "get_scene_tree",
      +  "get_ui_elements",
      +  "input_action",
      +  "input_gamepad",
      +  "input_key",
      +  "input_mouse",
      +  "input_sequence",
      +  "input_state"
      +]
  3. First observedv2.9.1

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses idempotency of resume, that next_frame reports verification and a focus handoff, the embed_signal vs direct_session split and the direct fallback's inability to sync the Game View suspend button, that mouse buttons stay held until released with motion carrying button_mask, that wheel steps are one-shot, and that action input is focus-independent.

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

Conciseness4/5

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

Front-loaded with purpose and prerequisite, then a scannable bullet-per-op list, with the canonical call shape at the end — good structure for a 13-op tool. A few passages, notably the Embedded Game View focus-handoff and embed_signal fallback details under next_frame, are implementation trivia that slow scanning without changing how most agents would call it.

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

Completeness5/5

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

Given high complexity (13 ops), zero annotation coverage, and 0% schema description coverage, the description supplies prerequisites, per-op parameters, response hints for the trickiest op, and the invocation envelope. An output schema exists, so return-value explanation is correctly omitted rather than duplicated.

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

Parameters5/5

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

Schema coverage is 0% (only op/params/session_id with no property descriptions), so the description must compensate entirely and does — it documents per-op parameters inline (depth, root_path, include_properties, include_hidden/include_disabled/max_depth, device/control/index/value, strength, settle_frames) plus accepted formats for position ({x,y} or [x,y]) and button names. It also flags a rejection behavior ('malformed position is rejected rather than silently falling back') that the schema cannot express.

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

Purpose5/5

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

First sentence gives a specific verb+resource ('Runtime game inspection and input simulation') and immediately scopes it to the running game process via Godot's EngineDebugger, which distinguishes it from editor-side siblings like scene_get_hierarchy or node_get_properties. The 13 enumerated ops make the tool's surface fully legible without opening the schema.

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

Usage Guidelines5/5

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

States the prerequisite workflow explicitly ('Start the project first with project_run and poll editor_state until game_capture_ready=true'), names alternatives in two places ('Use this instead of separate input_action calls whenever timing matters'), and gives an exclusion ('Cannot run inside batch_execute'). An agent knows both when to use it and what would invalidate the call.

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