Skip to main content
Glama
bh213

hx-multianim-mcp

by bh213

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
HX_DEV_HOSTNoDevBridge hostlocalhost
HX_DEV_PORTNoDevBridge port9001

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
connectA

Connect to a game instance on a specific port (and optionally host). Sets up both DevBridge and SSE connections. Must be called before using any other tools. Default port is 9001, but the actual port should be obtained from the game's stdout output, e.g.: [DevBridge] Listening on port 9002

performanceB

Get FPS, draw calls, triangle count, object count, and scene dimensions

list_screensB

List all registered screens with their active/failed status

list_buildersA

List all loaded .manim builders with their programmable names and parameter definitions

scene_graphB

Dump the scene graph tree showing object types, positions, visibility, and names

inspect_elementA

Get detailed info about a named element on a screen (position, size, visibility, text content)

screenshotB

Capture the current frame as a PNG image. Provide width and/or height to scale down (aspect ratio is preserved when only one is given; error if both are given with wrong aspect ratio).

set_parameterC

Set a parameter on a live programmable BuilderResult (uses incremental mode)

set_visibilityC

Toggle visibility of a named element on a screen

reloadB

Hot-reload a .manim file (or all files if no file specified). On failure, errors[] entries include 'message', 'file', 'line', 'col', 'errorType' ('parse' | 'build' | 'signatureIncompatible'), and 'context' — builder errors now carry accurate file/line/col instead of 0 placeholders.

eval_manimA

Parse and validate a .manim source snippet. Returns parsed node names and per-node buildErrors[]. Each build error has 'node' (programmable name or '') and 'error' (message); runtime builder failures additionally include 'file', 'line', 'col', and optional 'code' ('not_a_number', 'missing_ref', etc.) for clickable diagnostics.

list_resourcesA

List all loaded resources: sprite sheets, fonts, .manim files, .anim files

send_eventB

Inject an input event into the running application. Event types:

  • click: mouse click (push + release) at x,y with button (0=left, 1=middle, 2=right)

  • mouse_down / mouse_up: separate push/release at x,y

  • move: mouse move to x,y

  • key_down / key_up: keyboard key press/release with keyCode (hxd.Key constants)

  • key_press: key_down + key_up combined

  • text: text input with charCode

  • wheel: mouse wheel with delta at x,y

Common key codes: SPACE=32, ENTER=13, ESCAPE=27, TAB=9, A=65, 0=48, UP=38, DOWN=40, LEFT=37, RIGHT=39, F1=112

pauseA

Pause or resume the game loop. When paused, all game logic, animations, and rendering stop but the DevBridge remains responsive for inspection. Use step() to advance frame-by-frame while paused.

stepA

Advance the game by N frames while paused, then re-pause. Game must be paused first.

quitB

Cleanly shut down the running game application

get_tracesA

Get recent trace() output from the running application (ring buffer of last 200 lines)

get_errorsA

Get accumulated runtime errors/exceptions since last query

get_debugger_hitsA

Poll recent hits from DevBridge.debugger(data, pause?) calls placed in the game (JS-debugger-style breakpoint). Each hit has {id, data, paused, file, line, method, timestamp}. Use since_id from a previous call as a cursor to get only new hits. Hits also arrive in real time as SSE 'debugger' events (shown as warning-level log notifications). If paused=true, the game is paused at the hit — resume with pause({paused:false}).

get_parametersC

Get current parameter values and definitions for a live programmable instance

list_interactivesB

List all registered interactive hit-test regions on a screen with their IDs, positions, and metadata

list_slotsB

List all slots (swappable containers) on a programmable with their occupied/empty status

get_tween_stateA

Get all active tweens/animations with their targets, duration, elapsed time, and progress

get_screen_stateA

Get detailed screen manager state: mode, active screens, transition status, pause state, element/interactive counts

find_element_atA

Hit-test a screen position to find all scene graph objects at the given coordinates, sorted front-to-back by depth

inspect_programmableA

Deep inspection of a live programmable: current parameter values, slots, dynamic refs, named elements, interactives, and settings

pingA

Health check - returns uptime and port. Lightweight alternative to performance for connection testing.

list_fontsA

List all registered font names available for use in .manim files

list_atlasesA

List all loaded sprite atlases with their tile/sprite names

coordinate_transformA

Transform coordinates between local and global space relative to a named element. Use to_local to convert scene coords to element-local, to_global to convert element-local to scene coords.

wait_for_idleA

Check if the system is idle (no active tweens, no screen transitions). Returns current state without blocking.

click_buttonA

Directly click an interactive button by its ID, bypassing coordinate-based hit testing. Works even if the button is scrolled off-screen or obscured by other elements. Use list_interactives to discover available button IDs.

send_eventsA

Send a sequence of input events with game frame steps between them. Enables multi-step interactions (drag-and-drop, slider scrub, card hand drag) in a single call.

Each entry in the events array is either:

  • An event: {type, x, y, button, ...} (same params as send_event)

  • A frame step: {step: N} — advance N game frames (processes animations, state machines, zone detection)

The game must be paused for frame steps to work. Use auto_pause:true to auto-pause before and resume after.

Example drag: [ {type:"mouse_down", x:100, y:200}, {step:2}, {type:"move", x:200, y:150}, {step:1}, {type:"move", x:300, y:100}, {step:1}, {type:"mouse_up", x:300, y:100} ]

list_active_programmablesA

List all live incremental-mode programmables currently in the scene. Returns current parameter values, parameter definitions (types), named elements, slots, interactive counts, position, and visibility for each. Only programmables built with incremental:true are tracked.

check_overlapsA

Detect overlapping elements to find layout bugs and broken click targets.

  • Interactive overlaps (severity: high): two clickable regions overlap, causing unreliable clicks

  • Visual overlaps (severity: low): sibling elements with overlapping bounds (parent-child overlap is normal and ignored) Returns overlap pairs with their bounds, overlap rectangle, and overlap area in pixels.

list_game_opsA

List game-specific custom operations registered by the running game. Returns {queries, commands, events}, each entry has {op|name, description, params|payload} where params/payload is a schema-lite hint (e.g. {lane: "int", count: "int?"}). Call this first to discover what the current game exposes, then use game_op to invoke a query/command, or get_game_events to poll events.

game_opA

Invoke a game-specific custom query or command registered by the running game. Use list_game_ops to discover available ops and their param shapes. Returns {kind: "query"|"command", op, result}. Errors with code "not_found" for unknown ops, "internal" if the handler throws.

get_game_eventsA

Poll custom game events emitted via DevBridge.emitEvent(name, data) on the Haxe side. Events also arrive in real time as SSE "game_event" notifications. Mirrors the get_debugger_hits cursor pattern: use since_id from the previous response to fetch only new events.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.6/5.0

Scored across 38 tools

Disambiguation4/5

Most tools target a clearly distinct subsystem (scene graph, interactives, traces, events, tweens), but a few clusters overlap: get_parameters vs inspect_programmable vs list_active_programmables all surface parameter values, and list_resources vs list_fonts vs list_atlases are superset/subset. send_event vs send_events vs click_button also need the descriptions to disambiguate. Boundaries are mostly clear thanks to detailed descriptions.

Naming Consistency4/5

Names overwhelmingly follow snake_case verb_noun or verb patterns (list_*, get_*, set_*, inspect_*, send_event(s)), with no camelCase mixing. Minor deviations like single-word verbs (connect, ping, quit, pause, step, reload, screenshot) and coordinate_transform are still readable and consistent in spirit.

Tool Count3/5

38 tools is heavy, well past the 3-15 sweet spot. The domain is genuinely broad (input, inspection, resources, screens, programmables, diagnostics, events), so most tools map to a distinct subsystem rather than being redundant, but the surface is still on the bulky side.

Completeness5/5

Covers the full debug-bridge lifecycle: connect/quit, pause/step, input injection, hot-reload, eval, screenshot, scene/element/programmable inspection, resource and screen listing, plus diagnostics (traces, errors, debugger hits, performance) and game-specific ops/events. No obvious dead ends for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues