MCP server bridging an AI agent (Claude Code, in a VM or not) to a LIVE Aseprite session on the host.
ase-mcp defines 12 tools with clear action verbs and reasonable descriptions (avg ~120 chars). All tools have input schemas with type definitions. However, parameter descriptions are sparse or missing entirely, most params lack guidance on format, constraints, or valid ranges. Error handling is minimal; no recovery guidance or actionable error messages. Output schemas are undocumented. The run_lua tool is particularly risky: it accepts arbitrary code with no validation, confirmation, or dry-run capability. Tool composition is sound (each does one thing), but descriptions could be more LLM-optimized per the 50-200 char baseline.
Report whether the Aseprite bridge is connected and describe the active sprite.
Close the active sprite without saving.
Disable debug logging.
Enable debug logging: every bridge action, its params, and the Aseprite reply are printed to the ase-mcp server console on the host.
Create a new sprite in the live Aseprite session and make it active. mode: "rgb", "indexed", or "gray".
Open an image or Aseprite file in the live session.
Redo the last undone action in Aseprite.
run_lua accepts arbitrary code with no validation, confirmation, or dry-run. Agents can execute destructive Lua without safeguards. Missing confirmation-request pattern for irreversible operations.
Parameter descriptions are missing or minimal. 'path' params lack format guidance (absolute vs relative, file extensions). 'mode' in new_sprite has no enum constraint. LLMs cannot infer valid values.
No output schemas documented. Callers cannot know what fields to expect from aseprite_status or run_lua responses. Breaks tool chaining and forces LLM guessing.
Error handling is absent. No recovery guidance, categorization, or actionable messages. If Aseprite disconnects, the error 'Aseprite bridge not connected' offers no next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Execute arbitrary Aseprite Lua in the LIVE session and return its result. This is the power tool: the full Aseprite Lua API is available (Sprite, Image, Cel, Layer, Palette, app.command, ...). Return a value from your snippet to get it back as text, e.g. `return app.activeSprite.width`.
Save the active sprite as an Aseprite .ase file.
Save the active sprite as an animated GIF file.
Save the active sprite as a PNG file.
Undo the last action in Aseprite.
save_* tools lack idempotency guidance. If save_png fails mid-write, retrying may overwrite a partial file. No mention of atomicity or rollback.