Skip to main content
Glama

aseprite-mcp

A fast, token-efficient MCP server that lets AI assistants (Claude Code, Claude Desktop, Cursor, …) make pixel art, animate it, and export game-ready sprite sheets with your local Aseprite.

It also includes a CLI (aseprite-mcp build recipe.json), so the same animation recipes can run in your game's asset pipeline without an AI involved.

Highlights

  • Built for how a model draws. draw takes ASCII rows plus a color legend, shape tuples and dithered gradients. read_pixels returns the same grid format. preview returns a zoomed image with a pixel grid that the model can actually look at.

  • Fast. One persistent Aseprite worker process handles every call, so typical calls take 0.5–2 ms (a cold aseprite -b start is ~70 ms per call). batch runs many steps with one open and one save.

  • Cheap on context. 16 tools totalling ~4k tokens of schema. Inputs and outputs are terse.

  • Art helpers. Selective auto-outline, light-direction shading with hue-shifted shadows and highlights, palette ramps, palette extraction, quantize-to-palette with Bayer or Floyd–Steinberg dithering, mirroring, region copy, seamless tile shifting.

  • Importing existing art. Upscaled pixel art is detected and reduced to its native resolution. Hi-res art can be pixelated to a target size by majority color per block. separate splits the background from the subject (and fills the hole behind it) so only the subject animates.

  • Animation framework. 22 presets (breathe, hop, hit, death, spin, sway, wave, cycle, …), composable per-layer tracks with keyframes, waves and easing, secondary motion via per-layer lag, and RotSprite-smoothed rotation.

  • Game export. Sprite sheet + Aseprite JSON (frame tags), plus a Godot 4 SpriteFrames .tres and a Bevy-friendly atlas JSON.

  • Safe with your assets. It refuses to overwrite existing non-.aseprite images. You import them, edit the import, then export.

Related MCP server: aseprite_mcp

Tools

Tool

What it does

create_sprite

New sprite, or import an image (from) with auto native-resolution detection or pixelation to width/height

sprite_info

Size, mode, layers, frame durations, tags (palette on request)

draw

shapes (line/rect/ellipse with fill, dithered gradient), rows + legend, pixels

edit

fill, replace, mirror, outline, shade, copy, shift, quantize, separate, split

palette

Extract dominant colors (from a sprite or any image), generate hue-shifted ramps, set the palette

read_pixels

Pixels → character grid + legend

preview

Rendered PNG the model can see; frames, contact sheet, or one row per animation tag

layer

add / update / delete / clear / merge_down

frames

add (copy) / duration / delete / tag

resize

Nearest-neighbor scale or canvas resize with anchor

export

PNG/GIF/sequence, or sprite sheet + JSON (+ Godot / Bevy files)

animate

Static art → tagged animations → sprite sheet, from inline args or a recipe file

ingest

AI/video/hand-made frames → background removed, palette-locked, grid-snapped, aligned, tagged animation

generate

Run any Replicate model (diffusion, pixel-art animation, video) with your sprite as input, then ingest the results

character

A chibi person from organic parts (hair styles, witch/wizard/top hats, hoods, robes/dresses/coats/armor with hem styles, sleeves, capes, boots, extras like halo, ears, tail, aura) on its own layer, outlined, with proper eyes

batch

Many steps in one call

run_lua

Escape hatch: Aseprite Lua with sprite and params

Conventions: coordinates are 0-based from the top-left. Frames are 1-based (as in Aseprite). Colors are #rgb, #rrggbb, #rrggbbaa or transparent. Drawing replaces pixels.

Animation recipes

A recipe describes how static art becomes a set of animations and a sprite sheet. Keep it next to your art and rebuild whenever the art changes:

{
  "source": "art/slime.aseprite",
  "output": "build/slime_anim.aseprite",
  "padding": [0, 6, 0, 0],
  "animations": [
    { "name": "idle",  "preset": { "name": "breathe", "lag": { "eyes": 0.1 } } },
    { "name": "jump",  "preset": "hop" },
    { "name": "hit",   "preset": { "name": "hit", "layers": "body" } },
    { "name": "die",   "preset": "death" },
    { "name": "blink", "frames": 6, "durationMs": 120,
      "tracks": [{ "layer": "eyes", "visible": { "seq": [1, 1, 1, 1, 1, 0] } }] }
  ],
  "export": { "sheet": "game/sprites/slime.png", "engines": ["godot", "bevy"] }
}
npx aseprite-mcp build art/slime.anim.json          # once
npx aseprite-mcp build art/slime.anim.json --watch  # rebuild on save

From the MCP side, animate with saveRecipe writes this file for you, with paths relative to the recipe.

Presets: bob, breathe, float, hop, walk, hit, flash, blink, shake, sway, wobble, pulse, spin, swing, spawn, death, fade_out, fade_in, wave, cycle. Each takes amount, layers (which layers move) and lag ({layer: delay} for secondary motion). Combine several by passing a list.

Tracks (per layer, composable): x, y, sx, sy, sxPx, syPx (scale by pixels), rot (degrees, RotSprite-smoothed), shear, waveAmp, alpha, flash + flashColor, dissolve (ordered dither), visible, cycle (palette cycling). Each value is a curve:

  • a number,

  • { "seq": [...] } with one value per frame,

  • { "keys": [[t, v, ease?], ...] } with t from 0 to 1 and eases in, out, inout, step or back,

  • { "wave": "sine" | "triangle" | "square" | "saw", "amp", "base", "phase", "cycles" }.

Tip: draw parts (body, head, eyes, cape) on separate layers. Then lag and per-layer tracks give much livelier motion than moving the whole sprite.

Rigging existing art (idle and walk from one static image)

Existing single-layer art can be cut into parts and walked:

  1. create_sprite with from imports the art at native resolution.

  2. edit separate takes off the background.

  3. edit split cuts the parts onto layers named head, torso, arm_l, arm_r, leg_l and leg_r. Put legs below the torso.

  4. Animate with the rig presets:

[{ "op": "edit", "action": "split", "layer": "art", "toLayer": "leg_l", "below": true, "rects": [[0, 51, 30, 63]] },
 { "op": "edit", "action": "split", "layer": "art", "toLayer": "leg_r", "below": true, "rects": [[31, 51, 63, 63]] },
 { "op": "edit", "action": "split", "layer": "art", "toLayer": "arm_l", "rects": [[14, 36, 23, 43], [14, 44, 22, 49]] },
 { "op": "edit", "action": "split", "layer": "art", "toLayer": "head", "rects": [[0, 0, 63, 31]], "backfill": 0 }]
  • Rig presets: idle_rig (staggered breathing) and walk_front (alternating leg lifts, body bob and weight shift, opposite arm swing).

  • Remapping: use parts for other layer names, e.g. {"name": "walk_front", "parts": {"head": "skull"}}.

  • Backfill: split grows the remaining layer into the cut by backfill px (default 1), so a moving arm reveals torso, not a hole.

Redrawn poses (cutout-style animation)

Moving the same pixels only goes so far. For real poses, draw alternate versions of a part on extra source frames of the rig, and pick them per frame with a pose track:

  • Frame 1 holds the rest drawing. Frames 2, 3, … are a pose sheet that only needs the parts that change.

  • {"layer": "arm_r", "pose": {"seq": [1, 2, 2, 3, 3, 1, 1]}} shows rest → raised → strike. Layers without a drawing on that pose frame keep their rest drawing.

  • Underpaint what a part hides. Painting the torso edge behind an arm, or a dark mouth interior behind a split-off jaw, means raising the arm or dropping the jaw reveals something sensible.

  • Effects such as slash streaks can live on their own layer, drawn only on a pose frame, so they appear exactly when the pose track selects them.

  • The rig presets also move an optional jaw part together with head.

AI-generated frames → clean pixel art (ingest)

Diffusion models, image editors and video models can produce new poses that procedural animation can't. Their output isn't pixel art yet: soft edges, noise, off-palette colors, backgrounds, drifting scale and position. ingest cleans it up:

  1. Background removal. Uses existing alpha, a given color, or auto-detected border colors, flood-filled with a Lab tolerance that also follows smooth gradients.

  2. Palette. Colors are pulled to the reference sprite's palette, a preset, or one extracted from the frames, at full resolution.

  3. Pixel grid. The image is reduced by majority color per block, which keeps edges crisp and introduces no blended colors.

  4. Specks. Orphan pixels are removed.

  5. Alignment.

    • sequence uses one shared transform and keeps the source's own motion; use it for video.

    • feet puts each frame's feet on the ground line and its center of mass on the reference anchor; use it for separately generated poses.

Inputs: image files, a sprite sheet grid, or a video (ffmpeg required). Each call appends one tagged animation, so a character's idle, walk and attack all end up in one file:

{ "path": "build/hero.aseprite", "frames": ["gen/walk_1.png", "gen/walk_2.png", "..."],
  "reference": "art/hero.aseprite", "align": "feet", "tag": "walk", "durationMs": 100 }

Measured on synthetic diffusion-style frames (8× upscale, blurred edges, color noise and tint, gradient background), ingest recovers the original 64×64 frames at ~99% per-pixel accuracy in about 0.5 s per 512px frame.

Generating frames with Replicate (generate)

generate runs any Replicate model and pipes the output straight into ingest:

  • describe: true lists the model's inputs, since every model names them differently.

  • image renders your sprite upscaled on a solid background and sends it to the model's image input (auto-detected).

  • prompts runs one prediction per prompt, for example one per pose, 4 at a time.

  • Raw outputs are kept in <ingest path>.gen/, so you can re-run cleanup with other settings without paying again.

  • Video outputs are split into frames with ffmpeg (brew install ffmpeg).

{ "model": "black-forest-labs/flux-kontext-pro",
  "image": { "path": "art/hero.aseprite", "hide": ["background"] },
  "prompts": ["same character, left foot forward mid-stride, side view, plain white background",
              "same character, legs passing, side view, plain white background", "..."],
  "ingest": { "path": "build/hero.aseprite", "reference": "art/hero.aseprite", "tag": "walk", "align": "feet" } }

Setup: create a token at replicate.com/account/api-tokens and put it in the MCP server's env as REPLICATE_API_TOKEN. In Claude Code's ~/.claude.json that's "mcpServers": { "aseprite": { ..., "env": { "REPLICATE_API_TOKEN": "r8_..." } } }. Restart the session afterwards.

Game engines

Each sheet export writes sheet.png + sheet.json (Aseprite json-array with frameTags). With engines:

  • Godot 4: sheet.tres, a SpriteFrames resource with one animation per tag, correct per-frame timing, and loop off for one-shot animations (hit, death, …). The res:// path is detected from the nearest project.godot. Drop it on an AnimatedSprite2D.

  • Bevy: sheet.atlas.json:

    { "image": "slime.png", "size": [w, h], "frame_size": [fw, fh],
      "frames": [{ "rect": [x, y, w, h], "offset": [ox, oy], "duration_ms": 100 }],
      "animations": { "idle": { "frames": [0, 1, 2], "looping": true } } }

    Load it with serde_json and build a TextureAtlasLayout from frames[].rect.

Install

Requires Node ≥ 20 and Aseprite (Steam or standalone).

git clone https://github.com/MJSchut/aseprite-mcp.git
cd aseprite-mcp
npm install   # also builds dist/

Claude Code

claude mcp add aseprite -s user -- node /absolute/path/to/aseprite-mcp/dist/index.js

Claude Desktop / Cursor / others

{ "mcpServers": { "aseprite": { "command": "node", "args": ["/absolute/path/to/aseprite-mcp/dist/index.js"] } } }

Environment variables (all optional)

Variable

Purpose

ASEPRITE_PATH

Aseprite executable. Otherwise found on PATH or in common install/Steam locations (macOS, Windows, Linux).

ASEPRITE_MCP_DIR

Base directory for relative paths (default: the server's working directory).

ASEPRITE_TIMEOUT_MS

Per-call timeout, default 60000.

ASEPRITE_MCP_WORKER

0 to disable the persistent worker (one Aseprite process per call).

ASEPRITE_MCP_ALLOW_IMAGE_WRITES

1 to allow saving edits over existing PNG/GIF/... files.

Notes

  • Edits operate on files. If a file is open in the Aseprite GUI, use File → Revert to see changes.

  • Tilemap layers are not supported by the drawing tools (use run_lua).

Development

npm run build   # tsc → dist/
npm test        # end-to-end tests against your real Aseprite (skipped if not installed)

Layout:

  • src/index.ts: tools and the CLI.

  • src/aseprite.ts: binary discovery, the persistent worker, the runner.

  • src/animate.ts: presets and recipes.

  • src/export.ts: sheet export, Godot and Bevy writers.

  • src/palettes.ts: palette presets.

  • lua/ops.lua: every sprite operation, run inside Aseprite.

License

MIT

Available Tools

17 tools
animateA

Static art -> animations. Reads source (never modified), writes output .aseprite with one tag per animation, optionally exports a sheet. Each animation: {name, preset?, frames?, durationMs?, loop?, pivot?:bottom|center|top|[x,y], sourceFrames?|sourceTag?, tracks?}. preset: name | {name, amount?, layers?, lag?:{layer:0.1}, color?, colors?, parts?:{head:"skull"}} | list (combined). Presets: bob: idle up/down bob (amount px, 1); breathe: squash/stretch breathing, feet planted (amount px, 1); float: smooth hover (amount px, 2); hop: squash, jump, land (amount = height px, 6); walk: two-step bounce + tilt for walking without leg frames (amount px, 1); hit: knockback shake + white flash, one-shot (amount px, 2); flash: alternate flash color (color, #fff); blink: invincibility blink; shake: fast horizontal jitter (amount px, 1); sway: plants/hair/flames bend, base fixed (amount = shear, 0.15); wobble: jelly wobble (amount px, 1); pulse: grow/shrink from center (amount px, 1); spin: full rotation, RotSprite-smoothed; swing: pendulum from the top (amount degrees, 15); spawn: pop in with overshoot, one-shot; death: flash, sink and dither-dissolve, one-shot (amount = sink px, 2); fade_out: fade (alpha in RGB, dither otherwise), one-shot; fade_in: reverse of fade_out, one-shot; wave: horizontal ripple: flags, water, heat (amount px, 1); cycle: palette cycling: colors rotate each frame (colors, required); idle_rig: rigged idle: torso breathes, head and arms follow 1-2 frames later (amount px, 1); walk_front: rigged front-facing walk: alternating leg lifts, body bob + weight shift, opposite arm swing (amount = lift px, 2). tracks: [{layer?:"*"|name, x,y,sxPx,syPx,sx,sy,rot,shear,waveAmp,alpha,flash,dissolve,visible,pose: curve}] (pose = source frame whose drawing the layer shows: draw alternate part poses on extra source frames, swap them per frame). curve = number | {seq:[per frame]} | {keys:[[t,v,ease?]]} (ease in|out|inout|step|back) | {wave:sine|triangle|square|saw,amp,base?,phase?,cycles?}. Use padding when motion leaves the canvas. saveRecipe writes a re-runnable recipe (CLI: aseprite-mcp build recipe.json).

NameRequiredDescriptionDefault
exportNo{sheet, ...export sheet options, scale?}
outputNo
recipeNoload recipe JSON file instead of inline fields
sourceNo
paddingNopx or [left,top,right,bottom]
previewNodefault true
animationsNo
saveRecipeNo

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it states that source is never modified, output is written as .aseprite with one tag per animation, and sheet export is optional. It leaves some gaps around overwrite behavior and error conditions, preventing a 5.

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?

The description is long but justified by a complex animation API, and it is front-loaded with the core read/write behavior before detailing presets and tracks. The dense semicolon-separated reference lists are useful but make it harder to scan than an ideal description.

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

Completeness4/5

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

For a complex tool with eight parameters, nested objects, no annotations, and no output schema, the description supplies enough behavioral and structural context to call it correctly. It still omits return value details and some top-level parameter semantics, which keeps it from being fully complete.

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

Parameters4/5

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

The description compensates substantially for 50% schema coverage by explaining source, output, padding, export, saveRecipe, and especially the nested animation structure, presets, tracks, and curves. It does not explain the top-level recipe or preview parameters, so it is strong but not complete.

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?

The opening 'Static art -> animations' states a specific transformation verb/resource, and the description immediately names source, output .aseprite, tags, and optional sheet export. It is clearly distinguishable from sibling drawing, editing, or generation tools.

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

Usage Guidelines4/5

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

The description gives clear context for use: it reads an existing source and produces animations, and it notes 'Use padding when motion leaves the canvas.' It does not explicitly name when to choose it over siblings like generate or character, but the operating context is clear.

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

batchA

Many steps on one sprite in one call (one open, one save, all-or-nothing). Step = {op, ...that tool's args minus path/preview}. e.g. [{"op":"create_sprite","width":16,"height":16,"palette":"pico8"},{"op":"draw","rows":["kk"],"legend":{"k":"#000"}},{"op":"edit","action":"outline"}]

NameRequiredDescriptionDefault
pathYes
stepsYes
previewNotrue or preview options

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description does real work: it discloses atomicity ("all-or-nothing"), a single open and single save around the batch, and that per-step path/preview args are stripped. It does not say what happens on a mid-batch failure (file untouched? error shape?), whether steps execute in order, or whether read-only ops like sprite_info/read_pixels are permitted mid-batch.

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

Conciseness5/5

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

Three dense fragments: the contract, the step shape, then a runnable example. Scope and atomicity are front-loaded, and the example justifies its length by showing how cross-tool args compose.

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

Completeness3/5

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

For a batch executor with no annotations and no output schema, the return value is entirely unspecified — does it return per-step results, a preview, or just success? That gap matters because the enum mixes mutations with reads (sprite_info, read_pixels, run_lua).

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

Parameters4/5

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

Schema coverage is only 33% and the steps schema is a bare enum with additionalProperties, so the description carries the semantics: step = {op, ...that tool's args minus path/preview}, illustrated with a full example. It adds little for `path` and leaves `preview` to the schema's short note, keeping it short of a 5.

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?

States a specific verb and scope: apply many steps to one sprite in a single call. The phrase "...that tool's args" explicitly ties it to the sibling tools whose operations it bundles, so an agent can tell it apart from calling draw/edit/palette individually.

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

Usage Guidelines4/5

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

Implies the use case clearly (multiple steps on one sprite, one open/one save) and shows a concrete three-step example of a typical composition. It never states exclusions such as when to prefer individual tool calls, or that steps cannot span multiple sprites/files beyond the "one sprite" phrasing.

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

characterB

Build a chibi character (~44px at scale 1, feet at x,y) from organic parts on its own layer: body, simplify, outline, then eyes. spec: {skin, eyes, glowEyes, hair:{style:long|bob|spiky|bun|ponytail|none,color}, hat:{type:witch|wizard|top|hood|beret|crown,color,band,height,bend,droop,brim}, top:{type:robe|dress|tunic|coat|armor,color,inner,trim,hem:straight|zigzag|ragged|flared}, sleeves:{type:fitted|puffed|bell,color}, cape:{type:flowing|ragged|tendrils,color}, legs, boots:{type:short|tall|pointy,color}, belt, extras:[halo,catEars,elfEars,foxTail,goggles,horns,aura,spikes,staff], extraColor}. Colors: ramp names (red crimson orange gold green emerald teal blue navy purple violet pink magenta brown tan gray steel black white cream pale light skinTan dark skinGreen skinBlue) or [shadow,base,light] hex. Batch op: person.

NameRequiredDescriptionDefault
xYes
yYes
pathYes
specYes
frameNodefault 1
layerNo
scaleNo
previewNoreturn preview image

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description must carry the full behavioral burden. It discloses that the character is built on its own layer in a specific pass order and that x,y anchor the feet, but it does not state whether existing layer content is overwritten, whether path refers to a project or destination file, or what the call returns.

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?

The description is dense but front-loaded: the purpose and process come first, then the spec grammar, then color formats. The long enumerated spec and color lists are compact and earn their place, though the prose is somewhat terse and telegraphic.

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

Completeness3/5

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

Given a complex nested spec, no output schema, and no annotations, the description covers the creative payload well but omits critical operational semantics for path, layer, frame, and return behavior. It is adequate to start building a character but not complete enough to predict side effects or result shape.

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

Parameters3/5

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

Schema coverage is only 25%, so the description must compensate. It does an excellent job documenting the complex nested 'spec' object and the x/y/scale anchoring, but leaves 'path', 'layer', and 'frame' unexplained beyond minimal schema text, leaving material gaps for a low-coverage schema.

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

Purpose4/5

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

The description states a specific verb and resource ('Build a chibi character') and gives concrete scope details (~44px at scale 1, feet at x,y, on its own layer, ordered part passes). It distinguishes itself somewhat from generic draw/create tools by describing a procedural character builder, though it doesn't name a sibling alternative.

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

Usage Guidelines3/5

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

Usage is implied by the description of building a chibi character from a detailed spec, and 'Batch op: person' hints at a batch path. However, there is no explicit guidance on when to choose this tool versus create_sprite, generate, or batch, nor any exclusions or prerequisites.

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

create_spriteC

New sprite file. Or import an image with from (png/gif/...): upscaled pixel art is auto-downscaled to native size; width/height with from pixelates to that size (majority color per block). Edit the import, not the original image.

NameRequiredDescriptionDefault
fromNo
pathYes
widthNo
heightNo
paletteNohex list or preset (pico8|db16|sweetie16|gameboy)
colorModeNo
downscaleNoimport scale factor, default auto
overwriteNo
backgroundNoadds a filled background layer

TDQS

C2.6/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses import-specific behavior such as auto-downscaling pixel art, pixelating when `width`/`height` are combined with `from`, and editing the imported file rather than the original. However, it omits key mutation behavior such as what `overwrite` does when the path already exists and how `palette`/`colorMode` affect the created sprite.

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

Conciseness3/5

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

The description is short and front-loaded, with no wasted filler. However, the brevity comes at the cost of clarity: "New sprite file" is a fragment, and important behaviors are compressed into a dense semicolon-separated sentence.

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

Completeness2/5

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

For a 9-parameter mutation tool with no annotations and no output schema, the description is incomplete. It covers import-specific behavior but does not explain path semantics, overwrite behavior, palette/colorMode effects, failure cases, or what the agent should expect after creation.

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

Parameters2/5

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

Schema description coverage is only 33%, so the description needs to compensate. It explains some semantics for `from`, `width`, `height`, and auto-downscaling, but leaves `path`, `colorMode`, `overwrite`, and most of `palette` and `background` without added meaning beyond the sparse schema.

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

Purpose3/5

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

The first sentence, "New sprite file," only restates the tool name rather than stating a clear verb and resource. The follow-up adds that it can import an image via `from`, so the purpose is inferable, but it doesn't explicitly distinguish this from siblings like `ingest`, `generate`, or `draw`.

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

Usage Guidelines2/5

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

The description says "Or import an image with `from`," which implies one usage mode, but it gives no guidance on when to create a blank sprite versus importing versus using `ingest` or `generate`. No prerequisites, exclusions, or alternative tools are named.

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

drawB

Draw on a layer, in order: shapes, rows, pixels. shapes: [kind,x1,y1,x2,y2,color,fill?] kind line|rect|ellipse (fill = interior color); ["curve",[[x,y],...],color,w0?,w1?] smooth spline through points, tapering width (1 = crisp pixel-perfect line); ["blob",[[x,y],...],fill,outline?] smooth closed silhouette through points (heads, bodies, snouts); a point [x,y,1] is a sharp corner (brims, hems, ears); ["tube",[[x,y],...],[dark..light],w0,w1?,{light?,contrast?,bias?}] shaded tapered cylinder (limbs, hair locks, horns, necks, tails; w1=0 for a point); ["form",[[x,y(,1)],...],[dark..light],{light?,shrink?=0.18,shift?=0.5}] blob silhouette shaded with clean crescents (heads, snouts, bodies, rocks); ["eye",cx,cy,w,h,{fill,lid,lower?,pupil?,glint?},{nose:"right"|"left",arch?=0.4,flat?=0.7,tilt?,lidWidth?,pupil:{w,h,dx,dy},light?}] an eye with anatomy: flat lower lid, angular inner corner toward the nose, upper lid arching to a round outer corner, pupil under the lid (mirror nose for the pair); w,h <= 3 draws a tiny eye (dark block, glint on the light side, same for both eyes). Use eye for every eye so glints agree; ["lobe",cx,cy,rx,ry,[dark..light colors],{light?,shift?=0.45,shrink?=0.2,bumps?=7,bumpiness?=0.12,seed?}] shaded form: each lighter tone a smaller copy shifted toward the light, scalloped clump edges (tree = ~3 lobes, back first; bushes, clouds, round bodies); or ["gradient",x1,y1,x2,y2,[colors...],"v"|"h"|"r"] (Bayer-dithered). rows: char grid, legend maps char->color, '.'/space skipped; x,y offset rows. pixels: [[x,y,color]...].

NameRequiredDescriptionDefault
xNo
yNo
pathYes
rowsNo
frameNodefault 1
layerNodefault top layer
legendNo
pixelsNo
shapesNo
previewNoreturn preview image

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full behavioral burden. It says 'Draw on a layer' but does not state whether existing layer content is preserved or overwritten, what permissions/path prerequisites apply, whether the operation is reversible, or what is returned.

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

Conciseness3/5

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

The purpose is front-loaded, and most of the dense syntax detail is necessary for the complex shapes DSL. However, the description is a single wall of text with poor structure, making the extensive shape mini-language harder to scan than it needs to be.

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

Completeness3/5

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

For a complex, unannotated mutation tool with no output schema and low schema coverage, the description explains the drawing DSL well but omits core context: required path meaning, coordinate origin, color format, layer/frame behavior, and return/side effects. It is helpful but not complete enough for confident invocation.

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

Parameters4/5

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

Schema coverage is only 30%, so the description must compensate and it does so extensively for shapes, rows, pixels, legend, and offsets. It leaves path, frame, preview, and the exact coordinate/color conventions unaddressed, but the complex DSL parameters are well explained.

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

Purpose4/5

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

The description states a specific verb and resource: 'Draw on a layer', and names the three input modes (shapes, rows, pixels). It is clear what the tool does, but it does not differentiate itself from siblings such as edit or create_sprite.

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

Usage Guidelines2/5

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

It explains the order of shapes/rows/pixels and gives subtype-specific advice like 'Use eye for every eye so glints agree', but it gives no guidance on when to choose draw over edit, create_sprite, generate, or other sibling tools. There are no exclusions or explicit selection criteria.

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

editB

fill{x,y,color,contiguous?} | replace{from,to} (all cels unless layer/frame) | mirror{mode:left_to_right|right_to_left|top_to_bottom|bottom_to_top|flip_h|flip_v} | outline{color?="auto" (darker hue-shifted neighbor), mode?:outside|inside, corners?} | shade{light?:top_left|top|...|bottom_right, depth?, highlightDepth?, shadow?/highlight?: color|"auto"|false, ignore?: colors (e.g. outline), strength?} | copy{x,y,width,height,toX,toY,fromLayer?,fromFrame?,flip?:h|v} | shift{dx,dy,wrap?} | split{toLayer, rects?:[[x1,y1,x2,y2]], rows?(mask, x,y), below?, backfill?=1} (cut a part onto its own layer for rigging: head, torso, arm_l, arm_r, leg_l, leg_r) | separate{colors?(default: border colors), seeds?:[[x,y]], toLayer?="background"|false, islands?=6, fillHole?=true} (split background from subject) | quantize{palette?: hex list|preset|"sprite", dither?:none|bayer|fs, strength? 0-1, setPalette?} (pull colors to a palette) | finishing: round{colors?,passes?} (cut box corners) | selout{outline?,light?,strength?} (outline tinted from what it borders) | aa{outline?,amount?=0.5} (soften stair-steps) | pixel_perfect{colors?} (remove doubled line corners); outline defaults to darkest color | simplify{minSize?=2,passes?=2,keep?:colors} (merge orphan pixels/tiny clusters: removes shading noise; run before 1px details) | volume{colors?,ramp?(dark->light)|bands?=4,light?,elevation?=1.2,ambient?=0.15,dither?=0..1,roundness?} (shade each region as a lit rounded form) | scatter{pattern?:clumps|leaves|grass|bark|scales|stone|speck | rows (h lighter,m base,s darker,d dark), tones?:{h,m,s,d: color} (fixed colors), maskLayer? (place only over that layer), lightBias?=0..1 (denser on the lit side), density?=0.6, spacing?=3, strength?=0.4, colors?, rect?, seed?, breakEdge?=true} (detail clusters following the light)

NameRequiredDescriptionDefault
pathYes
frameNodefault 1
layerNodefault top layer
actionYes
previewNoreturn preview image

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose meaningful action behavior such as 'all cels unless layer/frame' for replace, outline defaulting to darkest color, and split cutting parts onto their own layer, but it does not state that the tool mutates the file at path, whether changes are reversible, or how preview/return behavior works.

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

Conciseness3/5

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

The pipe-delimited reference is information-dense with little wasted prose, but it is an unstructured wall of text that is not front-loaded with purpose. Grouping exists for 'finishing' actions, yet overall readability is poor for a 17-action tool.

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

Completeness3/5

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

For a complex 17-action mutation tool with no annotations and no output schema, the description covers many action-specific details and defaults. It still omits top-level semantics such as what path points to, what preview does, and safety/return context, leaving important gaps.

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

Parameters4/5

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

Schema coverage is only 60% and the action enum values have no schema descriptions, but the description supplies detailed per-action sub-parameters and defaults, e.g. fill{x,y,color,contiguous?}, mirror{mode:...}, and scatter{...}. It adds substantial meaning beyond the top-level schema, though path, preview, and top-level layer/frame semantics remain lightly covered.

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

Purpose3/5

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

The description enumerates many pixel-editing actions such as fill, replace, mirror, outline, shade, and quantize, so the broad purpose is inferable. However, it never states a clear high-level sentence like 'edit the sprite at path' or explicitly distinguishes this tool from siblings like draw or layer.

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

Usage Guidelines2/5

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

It provides action-specific hints, such as running simplify before adding 1px details and using split for rigging, but it gives no guidance on when to choose edit over sibling tools like draw, layer, or preview. There are no explicit when-not-to-use conditions or alternative-tool routing.

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

exportC

Export png/gif/sequence, or a spritesheet + Aseprite JSON (tags) when sheet is set. Frames 1-based.

NameRequiredDescriptionDefault
tagNo
pathYes
layerNo
scaleNo
sheetNo
framesNo[from, to]
outputYes
splitLayersNo

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses output formats and the spritesheet condition, but omits important export behavior such as file overwrite semantics, destination requirements, permissions, and failure modes.

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

Conciseness5/5

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

The description is two tightly written sentences with no wasted text. The main export formats are front-loaded, followed by the spritesheet condition and frame indexing note.

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

Completeness2/5

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

Given 8 parameters, a nested `sheet` object, no annotations, and no output schema, the description is too sparse to fully prepare an agent. It covers output formats and one indexing rule but leaves most parameter semantics and file-writing behavior unexplained.

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

Parameters2/5

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

Schema description coverage is only 13% across 8 parameters. The description adds useful meaning for `sheet` and notes that frames are 1-based, but it does not clarify required `path` vs `output`, `tag`, `layer`, `scale`, or `splitLayers`, leaving most parameters under-specified.

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

Purpose4/5

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

The description states a specific verb and resource: export image formats (png/gif/sequence) or a spritesheet with JSON when `sheet` is set. It is clear what the tool does, but it does not explicitly distinguish itself from siblings such as `preview` or `batch`.

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

Usage Guidelines2/5

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

The only conditional guidance is 'when sheet is set,' which explains spritesheet mode but not when to use this tool versus alternatives like `preview` or `batch`. There is no explicit when-to-use, when-not-to-use, or prerequisite information.

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

framesD

add{count?,after?,copyFrom?,durationMs?} | duration{durationMs,frames?} | delete{frames} | tag{name,from,to,direction?}

NameRequiredDescriptionDefault
pathYes
actionYes

TDQS

D1.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden, yet it discloses no behavior beyond action signatures. It never says that 'delete' irreversibly removes frames, whether 'add' inserts relative to an existing frame, whether operations mutate the file on disk, or what the response contains. The only behavioral hint is the presence of a 'copyFrom' argument on add.

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

Conciseness3/5

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

It is a single line with zero filler and the action signatures are grouped coherently with pipe separators. However, the terseness crosses into under-specification — braces, '?' markers and bare key names are unexplained notation that costs the reader more effort than the bytes it saves.

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

Completeness2/5

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

For a mutation-capable tool with no annotations, no output schema, and zero schema descriptions, the description leaves out effects, return values, and error conditions. The action-to-parameter mapping is the only thing filled in, which is not enough for an agent to invoke it confidently.

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

Parameters2/5

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

Schema description coverage is 0%, and even 'path' and 'action' — the two declared properties — are unexplained. The description does add real value by mapping which extra keys belong to which action (count, after, copyFrom, durationMs, frames, name/from/to/direction), but it gives no meaning, types, units, or defaults for any of them (e.g. is durationMs per frame or total?).

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

Purpose2/5

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

The description is a machine-style list of action signatures (add/duration/delete/tag) rather than a statement of what the tool does. There is no verb+resource phrase such as 'manage animation frames of a sprite', so the agent must infer the domain from the tool name and sibling set. It is not a tautology, but it never explicitly states the resource being manipulated.

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

Usage Guidelines1/5

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

No when-to-use guidance, no prerequisites (e.g. does the sprite/tag need to exist?), and no mention of alternatives. The sibling 'animate' plausibly overlaps with frame manipulation and the description does nothing to disambiguate.

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

generateA

Generate frames with any Replicate model (env REPLICATE_API_TOKEN), then clean them into pixel art with ingest. describe=true: list the model's inputs first. image: your sprite rendered upscaled on a solid background, sent as the model's image input (auto-detected field). prompts: one prediction per prompt (e.g. per pose), run in parallel. Raw outputs are kept in outDir so you can re-ingest without paying again. Videos need ffmpeg. Ideas: retro-diffusion/rd-animation (pixel animation), black-forest-labs/flux-kontext-pro (pose edit per prompt), image-to-video models.

NameRequiredDescriptionDefault
imageNo
inputNomodel inputs
modelYesowner/name or owner/name:version
ingestNoingest args: path, reference, tag, align, height, palette, sheet...
outDirNo
previewNoreturn preview image
promptsNo
describeNo
imageFieldNo

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses the required env token, that prompts run in parallel (cost/time implication), that raw outputs are retained in outDir so re-ingest avoids paying again, that image is upscaled onto a solid background before sending, and that imageField is auto-detected. It does not cover failure modes, rate limits, or what happens on partial batch failure.

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 the core action and credential requirement, then parameter-specific notes in short clauses. Dense but telegraphic fragments ('Videos need ffmpeg. Ideas: ...') cost some readability, though almost every clause carries information.

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?

For a 9-param, nested-object tool with no output schema and no annotations, the description covers the external dependency, cost model, output retention, the ingest handoff, and model selection. An agent has enough to invoke it correctly on the first attempt.

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

Parameters4/5

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

Schema coverage is 44% across 9 params, so the description must compensate, and it largely does: describe, image, prompts, outDir, imageField (auto-detected field), input (model inputs) and ingest are all explained, including the nested image rendering behavior. Only preview is left unexplained, keeping it below 5.

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

Purpose4/5

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

States a specific verb and resource: generate frames with any Replicate model, then clean them into pixel art via ingest. It names a sibling (ingest) as the downstream step and implicitly separates itself from create_sprite/draw by being model-driven. The generic name 'generate' is only disambiguated by the description body, not the first clause.

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

Usage Guidelines4/5

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

Gives concrete operational guidance: set REPLICATE_API_TOKEN, use describe=true to list a model's inputs first, one prediction per prompt for per-pose batches, and ffmpeg for video. It offers example model IDs matched to use cases (pixel animation vs pose edit). No explicit when-not-to-use or comparison against create_sprite/animate, so it falls short of 5.

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

ingestA

Turn frames from anything (diffusion/image models, video, hand-drawn) into clean pixel-art animation: removes background, pulls colors to a palette, snaps to the pixel grid (block majority), drops specks, aligns frames, adds a tag. Appends to path if it exists (one tag per call). Source: frames (image paths, gif ok) | sheet{path,cols,rows,count?} | video{path,fps?,start?,duration?} (needs ffmpeg). Size: height (art px) | scale (source px per art px) | reference sprite (matches its height, palette, canvas, feet). align: sequence (shared transform, keeps source motion; video) | feet (per frame: independent poses) | center.

NameRequiredDescriptionDefault
tagNo
pathYes
alignNo
layerNo
scaleNo
sheetNo
videoNo
canvasNo[w,h]
framesNo
heightNo
paletteNohex list | preset | "reference" | {extract:n}
previewNoreturn preview image
referenceNo
toleranceNobackground Lab tolerance, default 12
backgroundNo"auto" (default) | "none" | color
durationMsNo

TDQS

A3.7/5.0
Behavior4/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 disclose key traits: the run appends to path if it already exists (an additive write, one tag per call), background removal is applied, and video input requires ffmpeg. What it omits is return behavior (no output schema exists) and any failure/overwrite semantics when path conditions differ.

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?

The purpose is front-loaded in the first clause and the pipe-delimited shorthand for source/size/align variants is an efficient compression of what would otherwise be verbose prose. The telegraphic style ('| sheet{path,cols,rows,count?}') is borderline cryptic and slightly hurts first-pass comprehension, but nothing is wasted.

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

Completeness3/5

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

For a 16-parameter tool with nested objects, no annotations and no output schema, the description covers sources, sizing, alignment, and append behavior, but it never states what the call returns (a tag, a path, a preview?) and leaves layer, durationMs, and preview undocumented. An agent could likely invoke it, but not predict its result confidently.

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

Parameters4/5

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

At 31% schema coverage across 16 parameters, compensation is required and the description largely delivers: it gives the shape of the three source variants (frames | sheet{path,cols,rows,count?} | video{path,fps?,start?,duration?}), explains the three sizing strategies (height | scale | reference sprite, with how reference matches height/palette/canvas/feet), and defines each align enum value. Remaining gaps (layer, tag beyond 'one per call', durationMs, preview) keep it off a 5.

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

Purpose4/5

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

States a specific verb and resource: turning frames from images/video/sheets into a cleaned pixel-art animation, enumerating the pipeline steps (background removal, palette pull, grid snap, speck drop, alignment, tagging). This clearly separates it from siblings like create_sprite, generate, and animate, which start from other inputs. It stops short of 5 because the name 'ingest' itself carries no meaning and the sentence is dense enough to require a second read.

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

Usage Guidelines3/5

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

Source options (frames vs sheet vs video) and the ffmpeg requirement imply when the tool applies, but there is no explicit 'use this instead of X' routing against siblings such as create_sprite, generate, or frames. The align modes are named but the conditions under which an agent should prefer one are only suggestively described ('keeps source motion; video').

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

layerC

add{name,group?,parent?,below?,opacity?} | update{layer,rename?,visible?,opacity?} | delete{layer} | clear{layer,frame?} | merge_down{layer}

NameRequiredDescriptionDefault
nameNo
pathYes
layerNodefault top layer
actionYes

TDQS

C2.5/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, and it discloses almost nothing: delete, clear, and merge_down are plainly destructive operations yet irreversibility, undo availability, and effect on existing layer content are unstated. Names imply mutation but no behavioral context is added.

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

Conciseness3/5

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

It is extremely short with no filler, which is good, but the signature-style notation is under-specified rather than concise — a reader must already know the semantics to parse it. Front-loading is fine but readability suffers.

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

Completeness2/5

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

A five-action mutation tool with no annotations, no output schema, and low schema coverage gets only a one-line signature string. Nothing covers return values, error behavior for a missing layer, or how path scopes the operation, so an agent cannot reliably call it.

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

Parameters3/5

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

Schema coverage is only 25%, so the description must compensate, and it does partially by mapping per-action parameters (name/group?/parent?/below?/opacity? for add, rename?/visible?/opacity? for update, frame? for clear). However the required 'path' parameter is never explained, and the meaning of 'below' or 'frame' stays undefined.

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

Purpose3/5

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

The notation lists specific verbs (add, update, delete, clear, merge_down) against the layer resource, so the domain is inferable. But it never plainly states that this tool manages layers within a sprite, and 'clear{layer,frame?}' or 'below?' are cryptic without prose. It distinguishes itself from draw/edit/frames only by the resource name.

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

Usage Guidelines2/5

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

No guidance on when to choose add vs update vs merge_down, no prerequisites, and no mention of alternatives among the many siblings (draw, edit, frames). The action list implies the options exist but says nothing about selecting between them.

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

paletteA

Read/extract/generate/set palettes. extract{max}: dominant colors of the sprite or any image path. ramps:[{base,steps?=5,hueShift?=20,contrast?=1}]: hue-shifted shading ramps. colors: hex list/preset. set=true writes colors+extracted+ramps to the sprite palette. No args: current palette.

NameRequiredDescriptionDefault
setNo
pathNo
rampsNo
colorsNohex list or preset (pico8|db16|sweetie16|gameboy)
extractNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose the one mutating path (set=true writes colors, extracted, and ramps into the sprite palette), which is the key risk signal. It stops short of saying whether the existing palette is replaced or merged, and gives no information about side effects or return shape.

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?

Mode information is front-loaded and each clause carries a distinct fact, with no filler. The pseudo-BNF shorthand (extract{max}, ramps:[{...}]) is dense to the point of being cryptic, which costs a point on clarity but not on efficiency.

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

Completeness3/5

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

This is a five-parameter, nested-object tool with no annotations, no output schema, and low schema description coverage, so the description has to do a lot. It covers most modes but leaves extract.frame undocumented, does not explain what a non-set call returns, and does not clarify combination semantics when multiple mode parameters are passed together.

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

Parameters4/5

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

Schema coverage is only 20%, so the description must compensate, and it largely does: it documents ramps defaults (steps=5, hueShift=20, contrast=1), the meaning of extract.max, the colors preset/hex form, and the set flag. It omits the nested extract.frame parameter and does not describe the top-level path or how path relates to extract for non-sprite images.

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

Purpose4/5

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

Names a specific resource (palettes) and enumerates the concrete modes: read current, extract dominant colors, generate ramps, and set. It is telegraphic rather than prose, but an agent can determine what the tool does and that it is not a sibling tool like draw or preview.

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

Usage Guidelines3/5

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

'No args: current palette' establishes the default call, and 'set=true writes colors+extracted+ramps' implies the modes can be combined. However, there is no explicit statement about when to use extract versus colors versus ramps, whether the modes conflict, or when to pick this over a sibling.

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

previewB

See the sprite: zoomed, checkerboard transparency, pixel grid. frames="all" contact sheet; tags=true one row per animation; tag=name. reference=image path (+referenceRect [x,y,w,h]) shows a target image beside it at the same height: check every pass against it.

NameRequiredDescriptionDefault
tagNo
gridNo
pathYes
tagsNo
frameNodefault 1
layerNo
scaleNodefault fits maxSize
framesNo
maxSizeNopx, default 320
referenceNo
referenceRectNo

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It discloses rendering behavior (zoom, checkerboard transparency, pixel grid, default scale fitting maxSize) but never states the return form (presumably an image), whether the tool is read-only, or what happens with invalid paths, leaving real gaps for an 11-parameter tool.

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

Conciseness3/5

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

It is short and front-loads the core behavior, but the telegraphic fragment style ("frames="all" contact sheet; tags=true one row per animation") compresses to the point of ambiguity and forces re-reading.

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

Completeness2/5

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

With 11 parameters, no annotations, no output schema, and 27% schema coverage, the description should carry more. It omits the return type entirely and says nothing about five parameters, leaving too much for the agent to infer before calling.

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

Parameters3/5

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

Schema description coverage is only 27%, and the description adds meaning for about five of eleven parameters (frames, tags, tag, reference, referenceRect). It leaves path, grid, frame, layer, and scale unexplained beyond the bare schema types, so it compensates only partially for the coverage gap.

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

Purpose4/5

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

"See the sprite: zoomed, checkerboard transparency, pixel grid" names a concrete resource and the rendering features, so an agent knows this produces a visual preview rather than data. It never differentiates itself from siblings like read_pixels, export, or sprite_info, which prevents a 5.

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

Usage Guidelines3/5

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

The description covers option-level usage (frames="all" for a contact sheet, tags=true for one row per animation, tag=name) and a specific workflow for reference images ("check every pass against it"), but says nothing about when to call preview instead of read_pixels, sprite_info, or export.

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

read_pixelsB

Pixels as char grid + legend (draw rows format, '.'=transparent). Flattened unless layer. Optional region.

NameRequiredDescriptionDefault
xNo
yNo
pathYes
frameNodefault 1
layerNodefault top layer
widthNo
heightNo

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose meaningful behavior — output is a character grid with a legend, transparency renders as '.', output is flattened unless a layer is named, and a region can be cropped. It says nothing about failure modes, permissions, or how large a grid can get, which matters for a pixel dump.

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

Conciseness3/5

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

It is short and front-loads the return format, but the phrasing is telegraphic fragments ('Flattened unless layer. Optional region.') that force the reader to reconstruct the meaning. Nothing is wasted, yet the compression costs parseability.

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

Completeness2/5

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

For a 7-parameter tool with no annotations, no output schema, and only 29% schema coverage, the description is too thin: path and frame are unexplained and the region parameters are only hinted at. It covers the return shape but not enough of the call contract.

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

Parameters3/5

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

Schema coverage is only 29%, so the description must compensate; it does explain layer (default flattening) and gestures at x/y/width/height via 'region'. Path, frame, and the exact region semantics remain undocumented in both the schema and the description, so the compensation is partial.

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

Purpose4/5

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

States a concrete verb+resource: it reads pixels and returns them as a char grid plus legend, and it specifies the encoding (draw rows format, '.'=transparent). It does not distinguish itself from adjacent siblings like preview or export, which likely also produce a view of the sprite, so an agent can't fully rule out alternatives from the description alone.

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

Usage Guidelines3/5

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

'Flattened unless layer' and 'Optional region' implicitly tell the agent when to pass layer or a region, but there is no explicit when-to-use/when-not framing and no named alternative (preview, export) is offered. Usage must be inferred.

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

resizeC

scale{factor|width,height} nearest-neighbor | canvas{width,height,anchor?:center|top_left|top|...}

NameRequiredDescriptionDefault
modeYes
pathYes

TDQS

C2.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the nearest-neighbor resampling for scale mode and anchor options for canvas mode, but it omits whether the operation mutates or overwrites a file, permission needs, and any return behavior.

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

Conciseness3/5

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

The description is extremely compact and packs useful syntax into one line, but the pseudo-BNF format is cryptic and lacks a plain-language lead. It is concise but not well structured for quick agent comprehension.

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

Completeness2/5

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

Given no annotations, no output schema, and 0% schema description coverage, the description should explain path semantics and mutation behavior. It only partially covers mode-specific parameters and leaves essential context missing for safe invocation.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains the mode enum and mode-specific options (factor, width/height, anchor), which is valuable, but it never explains the required 'path' parameter or its relation to input/output.

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

Purpose3/5

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

The tool name 'resize' plus the scale/canvas syntax implies an image/canvas resize operation, but the description never states a clear verb and resource. It does not differentiate from sibling tools or explicitly identify what is being resized (sprite, canvas, file).

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

Usage Guidelines2/5

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

The description lists mode-specific options but gives no guidance on when to choose 'scale' versus 'canvas'. There are no prerequisites, exclusions, or alternatives mentioned.

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

run_luaB

Run Aseprite Lua (API 1.3). Globals: sprite (from path), params. Returns the script's return value. Saves unless save=false.

NameRequiredDescriptionDefault
codeYes
pathNo
saveNo
paramsNo

TDQS

B3.3/5.0
Behavior3/5

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

Without annotations, the description carries the full burden. It discloses important behaviors like the default saving side effect ('Saves unless save=false'), the return value, and available globals, but omits critical context for a code-execution tool: sandboxing, permissions, error handling, and timeouts.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and then adds only useful details. Every sentence—covering API version, globals, return value, and save behavior—earns its place.

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

Completeness3/5

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

For a code-execution tool with four parameters, a nested object, no output schema, and no annotations, the description covers the basics (what it runs, what globals are available, what it returns, and the save default) but leaves significant gaps around error behavior, execution environment, and parameter details.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It partially does by mapping the path parameter to the sprite global and the params parameter to the params global, and by explaining the save flag's effect. However, it does not clarify the format of path or the allowed contents of the params object, leaving gaps for a 4-parameter tool with a nested object.

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

Purpose4/5

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

States a specific verb and resource: 'Run Aseprite Lua (API 1.3)'. The purpose is clear, but it does not differentiate itself from sibling tools like generate or batch, leaving the agent to infer that this is a generic escape hatch.

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

Usage Guidelines2/5

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

Provides no guidance on when to use this tool versus the many domain-specific siblings. It does not say whether this is for custom operations not covered elsewhere, nor does it mention any prerequisites or exclusions.

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

sprite_infoB

Size, mode, layers, frame durations, tags. palette=true adds palette colors.

NameRequiredDescriptionDefault
pathYes
paletteNo

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses the returned fields and the effect of palette=true, but omits whether the tool is read-only, requires an existing file, or can fail.

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?

The description is compact and front-loads the returned fields. It is terse but not padded, though the fragmentary structure leaves it slightly under-specified.

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

Completeness3/5

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

For a simple two-parameter info tool with no output schema, it lists the main return fields and explains the palette flag. However, it leaves the required path parameter and usage context unaddressed.

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

Parameters2/5

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

Schema coverage is 0%, so the description must compensate. It explains palette=true adds palette colors, but does not describe the required path parameter or what path refers to.

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

Purpose4/5

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

The description specifies the sprite metadata returned: size, mode, layers, frame durations, and tags, with an optional palette addition. This makes the tool’s purpose clear, though it does not explicitly differentiate it from siblings like palette or read_pixels.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as palette or read_pixels. The only usage-like detail is the local effect of palette=true, not tool selection guidance.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 17 tool updatesv2.3.0
    • First observedanimate
    • First observedbatch
    • First observedcharacter
    • First observedcreate_sprite
    • First observeddraw
    • First observededit
    • First observedexport
    • First observedframes
    • First observedgenerate
    • First observedingest
    • First observedlayer
    • First observedpalette
    • First observedpreview
    • First observedread_pixels
    • First observedresize
    • First observedrun_lua
    • First observedsprite_info

TDQS

B3/5.0

Scored across 17 tools

Disambiguation4/5

Most tools target clearly distinct operations (draw vs edit vs animate vs generate vs character), with detailed descriptions that help separate them. Minor overlap exists between create_sprite's image import and ingest's frame import, and palette colors can also be read via sprite_info, but these are edge confusions rather than core ambiguity.

Naming Consistency3/5

Mixed conventions: some tools use verb_noun (create_sprite, read_pixels, run_lua), many are bare verbs (draw, edit, resize, export, animate), and others are nouns (palette, layer, frames, character, batch). It's readable and each name hints at its domain, but there's no single predictable pattern.

Tool Count4/5

17 tools is slightly above the ideal 3-15 range, but each tool bundles a coherent family of operations (edit, animate, character) rather than being a redundant one-off. The breadth of the pixel-art workflow (create, edit, animate, AI-generate, export) justifies the count.

Completeness4/5

The surface covers creation, editing, animation, AI ingestion/generation, and export with good lifecycle depth. Some gaps remain (no dedicated text, selection/tilemap, or undo/redo tooling), but run_lua serves as an escape hatch for arbitrary Aseprite Lua operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables AI assistants to automate Aseprite tasks such as sprite sheet export, frame extraction, and Lua scripting for sprite manipulation.
    21
    26 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to drive Aseprite for pixel-art creation, including sprite setup, grid-based drawing, layer/frame/tag management, reference image import, and export, with rendered previews after every mutation.
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI assistants to create and edit pixel art and animated sprites in Aseprite through 104 tools covering drawing, layers, animation, palettes, tilemaps, exports, visual analysis, and raw Lua scripting.
    116
    MIT