Live-first MCP server for the Aseprite pixel-art editor — drive an open Aseprite session from an AI agent (perception, constrained colour, tilemap tooling).
15 tools with strong naming (verb_noun pattern: live_*, all action-oriented) and comprehensive descriptions (avg 280 chars, well above 194-char baseline). However, critical gaps: NO visible input parameter schemas in source code, all tools show only `{"params":{"type":"object","description":"TypeName"}}` with no field-level definitions. Parameter descriptions are absent from the code. Output schemas undocumented. Error handling present but generic (Result<String, String>). Composition is excellent (single responsibility, clear tool chains). Security: no secrets in params, but no explicit permission gates or audit logging visible.
Activate an already-open sprite by filename or 1-based index in the running Aseprite UI session.
Read the active live sprite's frame back as a TEXT grid: one glyph per pixel ('.' = transparent), with row/column rulers and a colour legend mapping each glyph to its hex colour. An LLM reads this token-space grid far more reliably than it reads a small sprite image, so use it to VERIFY exact pixel values/positions, count cells, or check work on non-vision clients — complementary to live_save_preview (which is for the human/vision view). Active frame, all visible layers; refuses sprites larger than 64x64 (crop first).
Legacy live helper: create or reuse a layer in the active Aseprite sprite. Prefer live_ensure_layer for new workflows.
Get active sprite/layer/frame/cel site information from the running Aseprite UI session.
Return live protocol/plugin capabilities reported by the connected Aseprite plugin.
NO visible input parameter schemas in source code. All 15 tools declare params as `{"type":"object","description":"TypeName"}` with zero field-level definitions, types, or constraints. LLMs cannot infer what fields to pass or their types.
Parameter descriptions completely absent from source code. Tools with params (live_open_sprite, live_save_preview, etc.) show no documentation of what each field means, valid values, ranges, or formats. Violates pattern:tool-description baseline (100% of A+ tools have param descriptions).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | <=2025-11-25 | v2 |
Get information about the currently active sprite in a running Aseprite instance via the live plugin.
List sprites currently open in the running Aseprite UI session.
Open a sprite file in the running Aseprite UI session via the live plugin.
PREFLIGHT GUARD — call this BEFORE any drawing or sprite-editing workflow. Returns ready=true only when the live Aseprite plugin is connected. If ready=false, STOP and report to the user: do NOT fall back to batch/file drawing tools (they edit files on disk and will not appear in the open Aseprite window). The response includes a directive and remediation steps.
Save a copy of the active live sprite to a filename without changing the active file.
Save an upscaled, vision-legible PNG preview of the active sprite (nearest-neighbor, auto-scaled so the long edge nears ~1024px; raw 1x of small sprites is unreadable to vision models). Use this whenever the agent needs to SEE its work. Options: `scale` (int, override the auto factor, <=16x); `gutter` (labelled coordinate ticks, default on -- to map a preview pixel back to source: source = (preview - gutter_band) / scale, or preview/scale when off; see `gutter_applied`/`gutter_skipped`); `crop` ("sprite" default / "cel" / {x,y,width,height}; crop origin is reported and baked into the gutter labels); `inline:true` (also return the PNG as a base64 image block; oversized degrades to path + note); `marks_from` ("slices"/"layers"/"components" -> numbered Set-of-Mark badges + a `marks` [{n,region,bbox}] map). Returns source/preview size, scale, crop origin, gutter extents.
Save the active sprite in the running Aseprite UI session.
Save the active live sprite to a new filename and keep editing that file.
Set metadata/properties on the active live sprite: data, tab color, grid bounds, pixel ratio, or transparent palette index.
Return the connection status for the live Aseprite WebSocket plugin.
Output schemas undocumented. All tools return Result<String, String> (JSON text) with no schema definition visible. LLMs cannot plan downstream calls or extract structured data without knowing response field names and types.
Error handling is generic (Result<String, String>). No visible error categorization (retryable vs user-fixable vs fatal), no recovery guidance, no invalid-value echoing. Agents cannot self-correct on failures.
No visible permission gates or audit logging. Destructive tools (live_save_sprite, live_save_sprite_as, live_set_sprite_properties) lack explicit permission checks or call-site logging for compliance/debugging.