hx-multianim-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HX_DEV_HOST | No | DevBridge host | localhost |
| HX_DEV_PORT | No | DevBridge port | 9001 |
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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:
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:
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.
|
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 38 tools
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.
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.
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.
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.