Aseprite Studio
Reads and writes the native .aseprite file format directly, enabling pixel-art and sprite-animation work without a headless Aseprite launch (Aseprite is optional and only used to verify renders). Provides tools for creating and editing sprites, layers, frames, tags and cels; drawing primitives, palette reduction, pixelizing images into true-resolution pixel art, building and posing cut-out rigs with RotSprite rotation and tweening between key poses, adding bitmap text and motion effects, and reviewing output with frame viewers, linting, animation/identity checks and glitch detection. Supports exporting to GIF, PNG, per-frame PNG and sprite sheets with JSON metadata, and can render a file in the real Aseprite for pixel-for-pixel verification.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Aseprite Studiopixelize hero.png, rig it, and export a walk cycle GIF"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
aseprite-mcp-studio
A fast, pure-Python MCP server for pixel art and sprite
animation in .aseprite files. It reads and writes the Aseprite format itself, so an edit takes
milliseconds instead of the seconds a headless Aseprite launch costs, and Aseprite does not
even need to be installed (it is only used, if present, to double-check files).
What it is for:
Turning any character image into real pixel art. It finds the fake pixel grid that image models produce (blocks of ~4–14 px, drifting grid lines, thousands of colours) and rebuilds the sprite at its true resolution with a small perceptual palette.
Animating that character correctly. It cuts the character into a rig of parts with pivots, then poses them with RotSprite rotation, keyframes and motion presets (idle, walk_side, attack, hurt, death). Joint gaps are filled automatically. It can also import a reference strip of poses at the master's scale and palette, standing on its ground line.
Drawing and editing with a transactional batch of operations, plus review tools that report problems with exact coordinates.
Highlights
Speed | Native |
Transactions |
|
Exact | The compositor matches Aseprite's own render pixel for pixel (verified in the tests against the real Aseprite). Pixels drawn past the canvas stay in the cel instead of being clipped. |
Pixelize | FFT autocorrelation for the cell size, dynamic-programming grid fitting that follows drift, perceptual-mode cell sampling (no muddy averages), agglomerative OKLab palette reduction that keeps small deliberate accents, background removal, speck and orphan cleanup that never eats eyes or highlights. |
Animation | Cut-out rigs (rect / polygon / character-map / colour masks), parent chains, RotSprite rotation (colour-safe, line-safe), joint overlap fill, keyframe interpolation, presets, hit flash. |
Text | Built-in bitmap fonts ( |
Review |
|
Safe | Paths are confined to allowed roots. Writes are atomic (temp file + rename), so a crash never leaves half a file. |
Related MCP server: Pixel Art AI
Install
uv tool install git+https://github.com/mhpm/aseprite-mcp-studioor from a clone:
uv syncAdd it to your MCP client (Claude Code .mcp.json, Claude Desktop config, ...):
{
"mcpServers": {
"aseprite-studio": {
"command": "uv",
"args": ["--directory", "/path/to/aseprite-mcp-studio", "run", "aseprite-mcp-studio"],
"env": { "ASE_STUDIO_ROOTS": "/path/to/your/game/assets" }
}
}
}Environment:
ASE_STUDIO_ROOTS: folders the server may read and write, separated by;on Windows and:elsewhere. Default: the working directory.ASEPRITE_PATH: optional, only forverify_with_aseprite.
Tools
Tool | Does |
| New RGBA sprite with layers and frames. |
| Layers (and linked cels), frames and durations, tags, slices. |
| Batch of edit ops as one transaction (see below). |
| Per-file history. |
| Look at frames: grid, rulers, onion skin, colour / value / silhouette. |
| Pixels as a character map, ready to edit and send back with |
| Orphan, lone and detached pixels with coordinates; colour stats. |
| Bounds, ground row, holds, drift, spacing; |
| Each frame against a master: palette conformance and size drift. |
| What animating broke, per frame: cuts, flat blocks, one-frame flicker (against the previous and next frame, motion compensated), strays, spurs, holes, orphans; the design's own details (judged against the master) are not reported. Returns an onion-skin view with each problem boxed. |
| Pixel diff between frames or files. |
| Image to native pixel art, with a side-by-side preview. |
| A strip of poses brought in at the master's scale, palette and ground. |
| Shows which pixels each rig part takes, and where each pivot is. |
| Poses a rig over frames from a preset or from keyframes. |
| In-betweens between two drawn key poses: fits each part's turn (bones for parts that carry others, pixels for the rest) and draws each in-between from the nearest real drawing; anticipation and overshoot via |
| GIF, PNG, one PNG per frame, or a sprite sheet with JSON metadata. |
| Hue-shifted shading ramp in OKLCh. |
| Renders the file in the real Aseprite and compares. |
| Opens Studio Live, the built-in viewer (see below), and returns its URL. |
| What the user marked in Studio Live: frames, painted pixels, tags, text, with a picture of the previous / marked / next frame. |
| Answers a note (the user sees the reply) and marks it resolved or reopens it. |
apply ops
Layers: add_layer, add_group, remove_layer, set_layer, move_layer, duplicate_layer.
Frames: add_frames, remove_frames, duplicate_frame, move_frame, set_duration, set_durations, reverse_frames.
Tags and slices: add_tag, remove_tag, add_slice, remove_slice.
Cels: copy_cel, move_cel, set_cel, clear, link_cels, unlink_cels.
Drawing: pixels, map, line, polyline, curve, rect, ellipse, fill, text, stamp, erase, outline.
Colour: replace_color, remap, flash, palette_lock, set_palette, clean.
Repair: fix_glitches (erases strays and spurs, fills holes, outlines cuts, until find_glitches finds none), seal_cuts.
Transform: flip, rotate (RotSprite), scale, squash_stretch.
Motion and FX: tween_move, shake, fade, damage_number, blink_flash.
Drawing ops take frame or frames ([1,3], "all", "2-6", "1,3,5-8"), so one op can draw
on many frames at once. Add lock_alpha: true to paint only over existing pixels.
[
{"op": "add_layer", "name": "fx"},
{"op": "map", "layer": "fx", "frame": 4, "x": 23, "y": 20,
"legend": {"w": "#ffffff", "q": "#bfe0ff"}, "rows": ["..www.", ".wwqq.", "wwq..."]},
{"op": "flash", "layer": "slime", "frames": "5-6", "color": "#e04040", "amount": 0.8},
{"op": "damage_number", "text": "-12", "x": 58, "y": 32, "frames": "6-14", "rise": 10}
]From an image to an animated character
pixelize(image, "hero.aseprite"): check the preview. If the grid guess is off, passcell. For a painted image with no grid, passtarget_height.rig_preview("hero.aseprite", rig): adjust the masks and pivots until each part is clean.animate_rig("hero.aseprite", rig, out_layer="idle", preset="idle", source_layer="sprite").find_glitches("hero.aseprite", layer="idle", loop=true), thenapplyopfix_glitchesand check again.check_animation(..., kind="loop"),check_identity(..., master="hero.aseprite"), thenview(..., onion=true).export("hero.aseprite", "hero_idle.gif", scale=4).
Between two key poses
Put both drawings on one canvas, on two layers (
start,end), where they should be in the scene (the end of a jump higher up).Write a rig for each with the same part names and pivots on the same joints (neck, shoulder, hip, grip). Children hang from their parent (
"parent"); use"overlap_from": "parent"so a limb that swings far does not drag pixels it only touched.tween_poses(path, rig_start, rig_end, "start", "end", "jump", inbetweens=4, extra=[{"torso": {"dy": 3}}, {"torso": {"dy": -1}}, {}, {}]): here a crouch before the take-off. The report gives each part's turn and how well it matched; under 0.4 the part changes shape a lot (foreshortening), so look at it closely.find_glitches(path, layer="jump", master_frames=[1, 6])(both drawings are references), thenfix_glitches, and fix by hand what is left.
Studio Live (built-in viewer)
The server starts a local web viewer with it (127.0.0.1, port 7790 or ASE_STUDIO_LIVE_PORT;
ASE_STUDIO_LIVE=0 turns it off; two sessions share one viewer). live_open returns the URL;
python -m aseprite_mcp_studio.live [--port N] [folder ...] runs it on its own. It draws with the
same renderer as the tools, so it shows exactly what gets exported.
Plays frames at their real durations, by tag (forward, reverse, ping-pong), at 0.25x to 2x.
Onion skin (previous red, next blue), pixel grid, checker / green / dark / light backgrounds, integer zoom with the wheel (anchored on the cursor), drag the view holding Space, with the middle button or the Move tool.
Compare two frames side by side, as a difference (changed pixels in magenta) or blinking.
Versions: every save is kept (last 30 per file in memory); pick an older one and see what a fix changed against the current file.
find_glitchesboxes over the frames and serious-problem counts on the timeline; the "keys" field takes the key drawings of a transition (e.g.1,6).Review: select wrong frames (Ctrl/Shift-click or the check box), paint the exact pixels with the brush or a box, add quick tags (hole, stray pixel, cut, limb wrong, flicker, stiff, pose, colour, shape, timing) and a note. Notes are saved next to the sprite as
<name>.aseprite.review.json; the agent reads them withreview_notes, fixes, and answers withresolve_note, and the page shows the answer live.Updates live (server-sent events) when a tool edits a file or it is saved in Aseprite; each version of a sprite renders once, as one strip the page slices.
Keys: V move, B brush, R box, E eraser, Space play (hold it to drag the view), wheel zoom, arrows step, S select frame, O onion, G grid, X glitches, M notes, D compare, 1-9 zoom, N save note, Esc clear, Ctrl+Z undo and Ctrl+Y / Ctrl+Shift+Z redo (strokes, boxes, erasing, frame selection, clearing).
Development
uv sync --extra dev
uv run pytest
uv run ruff check src testsThe tests rebuild a 15-frame reference scene exactly and, when Aseprite is installed, open the written files in Aseprite and compare its renders with this server's.
Acknowledgements
The ideas behind several tools were inspired by two other open Aseprite MCP servers,
MalloyTheDev/aseprite-mcp and
diivi/aseprite-mcp. This is an independent
implementation; no code was taken from either. RotSprite is Xenowhirl's algorithm. OKLab is
Björn Ottosson's colour space. The .aseprite format follows Aseprite's published specification.
License
MIT
Available Tools
23 toolsanimate_rigA
Pose a rigged character over several frames and write them to out_layer.
Motion comes from a preset (idle, walk_side, attack, hurt, death; strength scales it) or
from keys: [{"frame": 1, "pose": {"arm_front": {"rotate": -30}, "torso": {"dy": 1},
"root": {"dx": 2, "rotate": 5, "pivot": [x,y]}}}, ...] interpolated over frames
(ease: ease_in_out | linear | hold). Parts turn with RotSprite about their pivots, children
follow parents, and joint gaps are filled from the source (rig "overlap"). feet [x,y] is
the pivot for whole-body rotations (default bottom centre). clean removes specks and orphan
pixels the rotation left. Frames are added if needed; the source layer is hidden.
Returns a summary and a view with onion skin.
| Name | Required | Description | Default |
|---|---|---|---|
| rig | Yes | ||
| ease | No | ||
| feet | No | ||
| keys | No | ||
| path | Yes | ||
| clean | No | ||
| frames | No | ||
| preset | No | ||
| strength | No | ||
| durations | No | ||
| out_layer | Yes | ||
| flash_color | No | #ffffff | |
| hide_source | No | ||
| start_frame | No | ||
| source_frame | No | ||
| source_layer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full behavioral burden, and it does disclose important traits: frames are added if needed, the source layer is hidden, clean removes specks and orphan pixels, and it returns a summary plus an onion-skin view. It stops short of stating overwrite/error behavior or permission requirements, but it is substantially more transparent than typical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loads the core operation before moving into motion sources and mechanics. It is long but largely justified by the 16-parameter tool, with little obvious filler, though the single-paragraph structure could be easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 16-parameter mutation tool with no annotations and no output schema, the description gives useful behavioral and return-value context. Still, the missing semantics for required parameters path and rig, plus several optional parameters, leave it only partially complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all 16 parameters. It meaningfully covers preset values, strength, the keys structure, frames, ease options, feet pivot, clean, and out_layer, but it omits required path and rig structure as well as durations, flash_color, hide_source, start_frame, source_frame, and only alludes to source_layer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource ('Pose a rigged character over several frames') and names the output target ('write them to out_layer'). That makes the operation clear, but it never explicitly distinguishes itself from likely siblings such as tween_poses or rig_preview, so it falls short of the strongest clarity level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two motion sources (preset vs. keys) and the available easing modes, which implies usage. However, it does not say when to choose animate_rig over siblings like tween_poses, rig_preview, or check_animation, and it gives no explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
applyA
Run edit operations on a sprite as ONE transaction: if any op fails nothing is saved and the error names the op. ops_list items are {"op": name, ...arguments}. Frames are 1-based; drawing ops take frame (one) or frames (list, "all", "2-6", "1,3,5-8"); layer defaults to the top image layer. Pixels drawn past the canvas edge are kept in the cel, never clipped. dry_run=true runs everything and reports, but saves nothing.
Ops (name(arguments), ? = optional): add_frames(count?=1, at? (1-based position to insert before; default: append), duration?=100, copy_from?) add_group(name, group?) add_layer(name, group?, opacity?=255, blend?=normal, visible?=true, reference?=false) add_slice(name, x, y, w, h, frame?=1, pivot? [x,y], center? [x,y,w,h], data?) add_tag(name, from, to, direction?=forward, repeat?=0 (0 = loop forever), color?) blink_flash(layer?, frames, color?=#ffffff (white flash) — alternates flash on/off across the frames) clean(specks?=2 (max size of detached islands to delete), orphans?=true, protect? [colors], layer?, frames?) clear(layer?, frames?, region? [x,y,w,h]) copy_cel(layer, from, to (frames), to_layer?, linked?=false, dx?=0, dy?=0) curve(points (3 = quadratic, 4 = cubic Bezier control points), color, layer?, frames?) damage_number(text, x, y (where it pops: its bottom centre), frames, rise?=10, layer?=damage, color?=#fff1a8, bottom_color?=#ff5a3c, outline?=#3a0c14, font?=bold, pop?=true, fade_frames?=2) duplicate_frame(frame, linked?=false) duplicate_layer(layer, name) ellipse(x, y, w, h (bounding box, even sizes fine), color, fill?=true, layer?, frames?, lock_alpha?) erase(x, y, w, h, layer?, frames?) fade(layer, frames, from?=255, to?=0, ease?=linear) fill(x, y, color, tolerance?=0, diagonal?=false, layer?, frames?) fix_glitches(kinds?=[stray, spur, hole, cut, block], master_frame?=1, master_frames? (key drawings), layer?, frames?) flash(color?=#ffffff, amount?=1.0 (1 = solid silhouette), layer?, frames? (hit flash)) flip(axis?=h|v, center? (canvas x for h, y for v; default canvas middle), layer?, frames?) line(x0, y0, x1, y1, color, perfect?=true, layer?, frames?, lock_alpha?) link_cels(layer, source (frame), frames) map(rows (one string per row), legend {char: color}, x?=0, y?=0, layer?, frames?, lock_alpha? ('.' = leave)) move_cel(layer, dx, dy, frames?) move_frame(frame, to) move_layer(layer, to (1 = bottom among its siblings)) outline(color, where?=outside|inside, diagonal?=false, layer?, frames?) palette_lock(palette? [colors] or source? (.aseprite/.png whose colours to use), layer?, frames?) pixels(points [[x,y],...] or [[x,y,color],...], color?, layer?, frames?, lock_alpha?) polyline(points [[x,y],...], color, closed?=false, perfect?=true, layer?, frames?) rect(x, y, w, h, color, fill?=false, layer?, frames?, lock_alpha?) remap(mapping {from_color: to_color}, tolerance?=0, layer?, frames?) remove_frames(frames) remove_layer(layer) remove_slice(name) remove_tag(name) replace_color(from, to, tolerance?=0, layer?, frames?) reverse_frames(frames (an unbroken range)) rotate(degrees (clockwise), pivot [x,y] (canvas), method?=rotsprite|nearest, layer?, frames?) scale(factor (or sx, sy), anchor?=topleft|center|bottom, layer?, frames? (nearest neighbour)) seal_cuts(master_frame?=1, color? (default: the master's darkest colour), layer?, frames? (outline what animating cut open)) set_cel(layer, frames?, opacity?, z?) set_duration(ms, frames?=all) set_durations(durations (list of ms, one per frame from frame 1)) set_layer(layer, name?, opacity?, blend?, visible?, editable?) set_palette(colors [list], replace?=true) shake(layer, frames, amplitude?=1, axis?=x|y|both) squash_stretch(amount (0.2 = squash 20%, -0.2 = stretch), anchor?=bottom|top|left|right, layer?, frames?) stamp(source (png/aseprite path), x?=0, y?=0, source_frame?=1, source_layer?, blend?=true, layer?, frames?) text(text, x, y, color, font?=tiny|bold, bottom_color?, outline?, shadow?, scale?=1, anchor?=topleft|center|bottom|topright, layer?, frames?) tween_move(layer, frames (in order), dx?, dy?, ease?=linear|ease_in|ease_out|ease_in_out|back_out, arc?=0) unlink_cels(layer, frames)
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| dry_run | No | ||
| ops_list | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: atomic all-or-nothing save semantics, error messages that name the failing op, 1-based frame indexing, default layer targeting, and the notable 'pixels drawn past the canvas edge are kept in the cel, never clipped' trait. It does not state what path expects (file type, is the original overwritten, are backups made), which is a meaningful gap for a mutating tool on a file.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long, but the length is earned by a 50+ op catalog, and the critical semantics (transactionality, frame indexing, dry_run) are front-loaded before the catalog. Minor waste exists in self-evident op names and stray formatting artifacts (e.g. the double space in 'frames? (hit flash)'), but nothing structurally misplaced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-op mutation tool with no annotations and no output schema, the description supplies nearly everything an agent needs: op syntax, argument defaults, indexing conventions, and failure behavior. The remaining gaps — what path refers to and what a successful call returns — are small but real given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet the description fully specifies ops_list's item contract ({"op": name, ...arguments}) and documents dozens of per-op arguments with defaults and formats, plus dry_run's exact behavior. The one missing piece is 'path', which is never explained in text and is completely undocumented in the schema — the only thing keeping this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Run edit operations on a sprite') plus a scope qualifier ('as ONE transaction'), and the op catalog makes the boundary with read-only siblings like view/check_animation/lint obvious. It stops short of naming a sibling directly, so it is clear but not fully differentiated in-text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the transaction contract and the 'dry_run=true runs everything and reports, but saves nothing' hint, which is a real decision rule. However, there is no explicit when-not guidance and no named alternative (e.g. use sprite_new to create, export to write out), so an agent must infer when this is the right entry point versus sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_animationB
Measure an animation without playing it: per-frame bounds, ground row, centroid, height, repeated frames, colour drift and spacing. kind: "loop" (walk, idle: must close), "oneshot" (attack, hurt, death: may hold poses) or "scene" (several actors: report only).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| kind | No | loop | |
| path | Yes | ||
| layer | No | ||
| frames | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'Without playing it' implies a non-destructive read and it discloses the report contents, which is useful. However, it never explicitly confirms read-only behavior, does not say whether it mutates state, and says nothing about failure modes (missing path, malformed animation).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the core measurement list comes first, then the mode semantics. Every clause carries information, though the run-on enumeration of measurements sacrifices some scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The measured output fields are well described, which compensates for the missing output schema. But with 0% schema coverage and no annotations, four of five parameters remain undocumented, and nothing is said about error behavior or what `path`/`layer`/`frames` should contain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters. The description thoroughly explains `kind` and its three modes, but leaves `tag`, `path`, `layer`, and `frames` entirely undefined in both schema and description. Only one of five parameters is given meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Measure an animation without playing it') and enumerates the exact measurements produced (bounds, ground row, centroid, height, repeated frames, colour drift, spacing). It is clearly distinguishable from siblings like lint, compare, or find_glitches, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The kind values carry real usage context: 'loop' for walk/idle that must close, 'oneshot' for attack/hurt/death that may hold poses, 'scene' for multiple actors where it only reports. That tells the agent which mode to pick, but there is no guidance on when to reach for check_animation versus lint, find_glitches, or compare.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_identityB
Compare every frame with a master image (png or .aseprite): share of pixels that are master colours (within a just-noticeable difference), colours the master lacks, and height/width drift. The check that a character is still itself after animating.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| layer | No | ||
| frames | No | ||
| master | Yes | ||
| master_frame | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does usefully disclose the computed outputs (master-colour share within a just-noticeable difference, missing colours, height/width drift). It omits whether the tool is read-only, how frames/layers are selected by default, and what form the results take.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the core action and metric list front-loaded; nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema and zero schema descriptions, the definition explains what is measured but leaves frame/layer selection, the master_frame default of 1, and result formatting unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 5 parameters, so the description must compensate, and it only clarifies 'master' (accepting png or .aseprite). path, layer, frames, and especially master_frame receive no meaning beyond their bare titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (every frame vs a master image) plus the exact metrics produced, so the intent is unmistakable. It does not, however, distinguish itself from the sibling tool 'compare', leaving the agent to infer the difference between a generic comparison and this identity check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line 'The check that a character is still itself after animating' implies the use case well, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g. 'compare' or 'check_animation') to route between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareA
Pixel difference between two frames (of one sprite, or of two files): changed pixel count and the box that changed. 0 changed pixels proves a part did not move.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| layer | No | ||
| region | No | ||
| frame_a | Yes | ||
| frame_b | Yes | ||
| other_path | No |
TDQS
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 return semantics (changed pixel count and the changed-box) and the interpretation of a zero result, but says nothing about read-only nature, permissions, or cost/limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core operation and return values, with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does cover the return shape (count plus box), which is helpful. But for a 6-parameter tool with no annotation or schema documentation, leaving layer and region undefined is a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. The parenthetical '(of one sprite, or of two files)' implicitly explains other_path versus a single path, but layer and region — two of the six parameters — get no mention at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (pixel difference) and resource (two frames) plus the two supported modes (one sprite's frames vs. two files) and what it returns. An agent can distinguish it from siblings like check_identity or find_glitches, though it never explicitly names those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: '0 changed pixels proves a part did not move' hints at a verification use case, but there is no explicit when-to-use/when-not guidance and no routing to alternatives such as read_pixels or check_identity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportB
Export without Aseprite. kind (default from the extension): "gif" (real transparency or a
background, global palette, per-frame durations, loop or play once), "png" (one frame),
"frames" (output must contain {frame}: one png per frame), "sheet" (layout horizontal |
vertical | grid with columns, padding, optional JSON frame data). Reference layers and
hidden layers are left out; layers restricts to some layers.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| kind | No | ||
| loop | No | ||
| path | Yes | ||
| scale | No | ||
| frames | No | ||
| layers | No | ||
| layout | No | horizontal | |
| output | Yes | ||
| columns | No | ||
| padding | No | ||
| overwrite | No | ||
| background | No | ||
| data_output | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses real behavior: hidden and reference layers are omitted, the 'frames' kind requires {frame} in the output path, and gif supports transparency vs background, palettes, per-frame durations and looping. However it never mentions that overwriting existing files is off by default or what the tool returns, which matters for a file-writing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the format enumeration comes first and each clause adds a distinct constraint. The 'Export without Aseprite.' opener is slightly confusing on its own, and the single-run-on paragraph makes scanning harder than a short list would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, mutation-style tool with no annotations and no output schema, the description covers the highest-complexity options well but leaves several parameters (path, output, tag, scale, frames, overwrite) entirely implicit, so an agent still needs to guess at required-vs-optional semantics and file-clobbering behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 14 parameters, so the description must compensate. It does add meaning for kind, layers, layout/columns/padding, background, loop and hints at data_output via 'optional JSON frame data', but path, output, tag, scale, frames, and overwrite receive no explanation at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (export) and enumerates the output formats (gif, png, frames, sheet) with their distinguishing traits, so an agent can tell it apart from sibling tools like verify_with_aseprite or import_strip. It does not explicitly name a sibling alternative, keeping it out of the 5 tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opener 'Export without Aseprite' hints that it is the non-Aseprite export path, but there is no explicit statement of when to choose this tool over verify_with_aseprite, live_open, or the other siblings, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_glitchesA
Find what animating broke, frame by frame, with an onion-skin view of every frame that has a problem (previous frame red, next blue, each problem boxed and labelled). Each frame is compared with its previous and next frame (loop=true wraps round) and with the master (default: the first frame), so the design's own details are not reported. Kinds: cut (a part sliced open: interior colours on the outer edge), block (a flat fill larger than the master has), blip (a small patch unlike both neighbour frames), stray (a detached speck), spur (a single pixel sticking out), hole (an enclosed gap), orphan (a pixel unlike all its neighbours). Run it after every animate/edit pass; fix until ok. master_frames: several frames of this sprite that are real drawings (a transition's start and end keys); what any of them contains is design.
| Name | Required | Description | Default |
|---|---|---|---|
| loop | No | ||
| path | Yes | ||
| layer | No | ||
| frames | No | ||
| master | No | ||
| master_frame | No | ||
| master_frames | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the output form (onion-skin, previous red / next blue, boxed and labelled), the comparison rules (neighbour frames, loop wrapping, master reference), and the defect taxonomy. It omits whether the tool writes files or is read-only, which is a real gap for side-effect awareness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and output form, then progressively more detail. The defect-kind enumeration is long but each term earns its place by defining a distinct class the agent will see in results.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter analysis tool with no output schema, it explains the comparison model, master semantics, and the full glitch taxonomy so an agent can interpret results. Missing documentation of path/layer/frames and of read-vs-write behaviour keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds real meaning for loop (wraps round), master (default is the first frame), and master_frames (transition start/end keys whose content is design), but leaves path, layer, and frames entirely unexplained despite being callable parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('find what animating broke, frame by frame') with a clear notion of the artifact produced (an onion-skin problem view). It is easy to tell apart from abstract siblings like 'lint' or 'compare' from the description alone, though it never names those siblings to make the distinction explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Run it after every animate/edit pass; fix until ok' gives a clear trigger and lifecycle. It does not, however, contrast itself with apparent neighbours such as check_animation or lint, so the agent must infer when this is preferred over them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_stripA
Bring a strip of poses (drawn by hand or generated) into a sprite as frames, at the
master's scale: every frame is pixelized on one shared cell size (taken from the master's
height unless cell is given), locked to the master's colours, and stood on the master's
ground line with its feet (or centre) on the master's axis. Frames are added as needed.
count: frames in the strip (default: split at transparent gaps). Returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | No | ||
| path | Yes | ||
| align | No | feet | |
| count | No | ||
| image | Yes | ||
| layer | No | reference | |
| master | No | ||
| duration_ms | No | ||
| start_frame | No | ||
| palette_lock | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the applied transformations (shared cell size, palette lock, ground-line/axis alignment) and that it returns a preview rather than nothing. It does not say whether existing frames at those indices are overwritten, whether the import is undoable, or what happens if `master` is null and no reference sprite exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and core behavior in one long sentence, followed by the one parameter default that most changes behavior. The `count:` fragment is terse but unambiguous, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation-ish tool with no annotations and no output schema, the description is unusually complete on the mechanics (scaling, palette, alignment, frame count, preview return). The remaining gap is operational: layer targeting, frame duration/start index, and overwrite/undo semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 10 parameters, so the description must compensate — and it does for roughly half: `cell` (defaults to master's height), `count` (defaults to splitting at transparent gaps), `align` (feet or centre), `master`, and `palette_lock` (locked to master's colours). Nothing is said about `path`, `image`, `layer` (default 'reference'), `duration_ms`, or `start_frame`, which materially affect the import but are invisible to the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: bringing a strip of poses into a sprite as frames, with the key transformation (pixelized, palette-locked, aligned to master) named inline. It is clearly distinct from siblings like pixelize or animate_rig, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the repeated reference to 'the master's scale/colours/ground line' tells the agent this belongs downstream of a master sprite, and 'drawn by hand or generated' hints at acceptable sources. There is no explicit when-to-use, when-not-to-use, or named alternative among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lintB
Find what is easy to miss, with coordinates: orphan pixels (unlike all 8 neighbours), lone pixels, detached parts, colour count, darkest colour share and pixels past the canvas. Use a layer for one object; the flattened frame touches everything else.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| frame | No | ||
| layer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden. It discloses the diagnostic categories and that results carry coordinates, which is useful, but never states that it is a read-only/no-mutation operation, what the return payload looks like, or how it behaves on a path that doesn't resolve to a sprite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler; the output (coordinates plus findings) is front-loaded ahead of the scoping advice. The opening clause "Find what is easy to miss" is slightly rhetorical, but it earns its place by framing the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a three-parameter tool with no annotations and no output schema, the description covers the detection categories and the layer/frame choice but leaves the return shape, the meaning of `path`, and the read-only nature unspecified. Adequate to invoke, incomplete for confident use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it only partly does: the layer-versus-frame relationship is explained in real terms (a layer lints one object, the flattened frame lints everything composited). The required `path` parameter and the numeric frame index (default 1) are left entirely unexplained by both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb-and-resource: it finds pixel-art anomalies and reports them with coordinates, then enumerates the specific checks (orphan pixels, lone pixels, detached parts, colour count, darkest colour share, out-of-canvas pixels). An agent knows exactly what it gets back conceptually. It does not differentiate itself from close siblings such as find_glitches or check_identity, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use a layer for one object; the flattened frame touches everything else" tells the agent how to scope the call, which is genuine guidance. But there is no when-to-use-versus-siblings statement, no exclusion, and no prerequisites, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_openA
Studio Live: the built-in web viewer (local only). Plays frames at their real durations,
onion skin, compare two frames (side by side / difference / blink), versions of every save
with a before/after difference, and find_glitches boxes over the frames. The user selects
wrong frames and paints the exact wrong pixels with a brush, adds quick tags and a note; read
those with review_notes. Returns the URL (open it in the browser pane); with path it opens
that file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses that the viewer is local-only, that it returns a URL to open in the browser pane, that a `path` argument will open that specific file, and that user actions in the viewer produce review notes as a side effect. It stops short of stating whether the call blocks on user interaction, how to stop the viewer, or what happens on an invalid path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The identity and return behavior are front-loaded, which is good, but the middle passage is a laundry list of viewer features (onion skin, side-by-side/difference/blink compare, version diffs) that mostly describes the UI rather than how to invoke the tool. Several of those clauses could be trimmed without losing invocation-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with no output schema, the description covers the essential contract: what it launches, that it is local, and that it returns a URL. Remaining gaps (URL form, failure modes, whether it blocks) are minor given the tool's narrow scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must supply the meaning of `path`, and it does at a basic level ('with `path` it opens that file'). It adds nothing about expected file type, relative vs. absolute paths, or behavior when omitted (the null default implies the default project), so it only partially compensates for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the tool as the built-in Studio Live web viewer and states that it returns a URL to open in the browser pane, which is a concrete resource and effect. It implicitly contrasts with siblings like view/compare by describing the viewer's interactive review features, though the opening sentence never uses an explicit verb like "opens" or "launches."
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete downstream workflow ('read those with review_notes') that routes the agent to a sibling, which is genuinely useful. However, it never explains when to choose live_open instead of the sibling `view`, `compare`, or `rig_preview`, nor any when-not conditions, so the selection logic against the closest alternatives is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_rampC
A shading ramp around one colour, darkest first, built in OKLCh: even lightness steps, hue leaning warm in the lights and cool in the shadows, chroma tapering at both ends.
| Name | Required | Description | Default |
|---|---|---|---|
| base | Yes | ||
| steps | No | ||
| contrast | No | ||
| hue_shift | No |
TDQS
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 generative behavior in useful detail (even lightness steps, warm-leaning lights, cool shadows, chroma tapering at both ends). However, it says nothing about whether a ramp is persisted as an asset, whether it mutates existing material, determinism, or what gets returned, which are the questions an agent needs answered for a mutation-capable tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler, and the most distinctive fact (the output type) comes first. The terseness is a mild liability rather than verbosity, since the poetic phrasing crowds out the missing verb and parameter guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Four parameters at 0% schema documentation, no annotations, and no output schema: the description should carry the load and instead covers only aesthetic intent. An agent still cannot determine parameter meanings, defaults behavior, or the return shape before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 parameters, so the description must compensate and largely does not: no parameter name (base, steps, contrast, hue_shift) is mentioned or explained. At best, 'even lightness steps', 'hue leaning warm… cool' and 'chroma tapering' hint at what steps, hue_shift and contrast conceptually control, but the mapping and valid ranges are left entirely to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete output ('a shading ramp around one colour') and its defining properties (OKLCh, darkest first, even lightness steps), so an agent can tell what it produces. It never states an explicit verb ('generates'/'returns') and gives no differentiation from siblings such as pixelize or apply, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to reach for this tool versus alternatives like pixelize or apply, and no prerequisites or exclusions are stated. The only implicit signal is that it operates on 'one colour', which an agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pixelizeA
Convert an image into real pixel art and save it as a native-resolution .aseprite.
Finds the fake pixel grid of image-model "pixel art" (cell size, drifting grid lines) and turns each cell into one pixel by perceptual majority; a real illustration (no grid) or an explicit target_height is downscaled by majority vote instead. Palette reduced in OKLab (small distinct accents kept), specks and orphan pixels cleaned. cell: force the cell size in source px. target_height: the native height wanted. background: auto (remove a flat background if there is no transparency) | remove | keep. outline: none, "auto" (darkest palette colour) or a colour, adds a 1 px keyline. palette_from: lock to another image's colours (e.g. the character's master). Returns the report and a preview: source | result enlarged.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | No | ||
| image | Yes | ||
| layer | No | sprite | |
| output | Yes | ||
| outline | No | ||
| overwrite | No | ||
| background | No | auto | |
| max_colors | No | ||
| png_output | No | ||
| merge_delta | No | ||
| palette_from | No | ||
| target_height | No |
TDQS
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 a lot of algorithmic behavior (OKLab palette reduction, specks/orphan cleaning, grid-line drift handling, background auto-removal only when there is no transparency), which is genuinely useful. It is silent on overwrite semantics, what happens on failure, whether the source image is modified, and where output paths resolve, though, so gaps remain for a file-mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then a compact block of behavioral context, then terse per-parameter glosses with no wasted words. Dense but every line carries signal. The parameter list format is scannable, though the paragraph on grid detection is slightly heavy for what it adds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description handles that by stating the return value (a report plus a source|result preview). Combined with mode-selection and parameter glosses, an agent has enough to invoke it correctly. Missing overwrite/failure semantics keep it from being complete for a mutating tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 12 parameters, so the description must compensate, and it does for the five non-obvious ones: cell, target_height, background, outline, palette_from. image, output, layer, and overwrite are self-evident from their names. max_colors, merge_delta, and png_output are undocumented in both schema and description, which keeps it below 4.5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource chain: convert an image into pixel art and save it as a native-resolution .aseprite. No sibling tool (export, import_strip, apply) does this, so the agent can distinguish it from every other tool in the set without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains the three modes: fake-grid detection, real illustration downscale, or explicit target_height. That tells the agent which path fires for which input. It stops short of naming sibling alternatives (e.g. when to use export + import_strip instead), so it is 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pixelsA
Pixels as a character map: {"legend": {char: colour}, "rows": [...]} ('.' = transparent).
Edit the rows and send them back with the map op: a read-edit-write round trip. Without
layer it reads the flattened frame. Region capped at 128x128.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| frame | No | ||
| layer | No | ||
| region | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return shape, the '.' = transparent convention, that omitting `layer` yields the flattened frame, and that the region is capped at 128x128. It does not state whether the call itself is side-effect free or what happens if the region exceeds the cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler, and the size cap is stated compactly. The opening fragment ('Pixels as a character map: {...}') prioritizes return format over purpose, which is mildly awkward as a lead but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter read tool with no output schema, the description compensates by inlining the exact return structure and the transparency convention, which is the key missing piece. The remaining gap is `frame` semantics for multi-frame sprites, which matters given siblings like `check_animation` and `tween_poses`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and only partly does: it explains `layer` (flattened frame when absent) and `region` (128x128 cap), but `frame` (default 1) and `path` are never given meaning, format, or numbering conventions. Two of four parameters remain purely schema-derived.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys a specific operation on a specific resource: reading pixels and returning them as a character map, with the flattened-frame behavior when `layer` is omitted. It is distinguishable from write-oriented siblings (`apply`, `pixelize`) and from `map`-op writes, though the verb 'read' only appears mid-sentence rather than being front-loaded.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It sketches a concrete workflow ('edit the rows and send them back with the map op: a read-edit-write round trip'), which tells the agent how the output is meant to be consumed. However, it never compares against the many sibling inspection tools (`view`, `sprite_info`, `compare`, `export`) or states when not to use this instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redoC
Redo edits that were undone.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| steps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does not meet it. It doesn't disclose failure behavior when there is nothing to redo, whether new edits invalidate the redo history, or whether this requires an open editor/session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is structurally fine, but the brevity is under-specification rather than economy — the size is mismatched to a two-parameter, annotation-free mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and zero parameter documentation, the description should explain target selection and the multi-step behavior. It leaves both gaps and gives an agent only a bare conceptual gloss.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both 'path' and 'steps', and the description never mentions either. Critically, an agent would not learn from the description that multiple steps can be redone in one call — that only shows up as an undocumented integer defaulting to 1 in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Redo') and target ('edits that were undone'), which is enough to place it as the inverse of the sibling 'undo'. It doesn't say anything about scope (which editor/document the history belongs to), but the core operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus 'undo', no prerequisite stated (e.g. that a prior undo must exist), and no note on what happens if the redo stack is empty. The agent must infer all routing from the one-line description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_noteA
Answer a Studio Live note: say what was fixed (the user sees it under the note) and mark it resolved, or reopen it with status="open".
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| reply | No | ||
| status | No | resolved | |
| note_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose genuinely useful behavior: the reply text is shown to the user beneath the note, and status="open" reopens rather than resolves. It omits permissions/auth requirements, whether replying to an already-resolved note is allowed, and what happens on failure — significant gaps for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence front-loads the action, then nests the mechanism and the alternate mode parenthetically. No filler, every clause adds information the schema lacks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation tool with no annotations and no output schema, the description does well to explain the two modes and the user-visible effect of the reply. The unexplained path parameter and the absence of any error or idempotency note keep it from fully covering the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must supply all parameter meaning. It explains reply ('say what was fixed', visibly shown to the user) and status ("open" reopens), but says nothing about path — an unlabeled string the agent must guess at — and does not state whether reply is optional or required per mode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: answering a 'Studio Live note', with the two possible outcomes (mark resolved vs. reopen). An agent can tell this apart from review_notes, which presumably lists notes rather than answering them. It stops short of naming that sibling explicitly, so the differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly conveys the situation the tool is for (responding to a note already in hand) and describes the two modes: resolve, or reopen with status="open". It does not say where note_id comes from, whether review_notes must be called first, or when this should not be used, so usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_notesA
What the user marked in Studio Live: wrong frames, painted pixels, tags and text.
Without path, every sprite with notes under the allowed folders. status: open | resolved | all.
Each note gives its frames (1-based), tags (hole, stray, cut, limb, flicker, stiff, pose,
color, shape, timing), the user's text and per marked frame the pixel bbox and the pixels
themselves (sprite coordinates). The picture of each note shows the previous frame, the
marked frame with the user's marks in pink, and the next frame. Fix, then resolve_note.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| status | No | open | |
| pictures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description has to carry behavior, and it does most of the work: it discloses the default status filter (open), what each note contains (1-based frames, the fixed tag vocabulary, user text, per-frame pixel bbox and pixel data in sprite coordinates), and the composition of the returned image (previous / marked / next frame). It never explicitly states the operation is read-only or describes volume/pagination limits for large projects, which keeps it below 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line and the enumeration of note contents is dense but purposeful, with no filler sentences. The text is a single long run-on block that would read better split by parameter or return value, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with no output schema, the description supplies the return shape (frames, tags, text, bboxes, pixels, composed images) and the default filtering, which is close to complete. The gaps are the undocumented `pictures` flag and no statement that the call is non-mutating or that fixing requires the separate resolve_note/resolve flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must document all three parameters, and it only covers two: `path` (omitted → all sprites under allowed folders) and `status` (open | resolved | all, default open). The `pictures` boolean is never explained — the sentence about what a note's picture contains hints at image output but doesn't tell an agent what setting `pictures: false` suppresses.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete statement of the resource: user-marked issues in Studio Live (wrong frames, painted pixels, tags, text). That is enough for an agent to tell it apart from pixel-inspection siblings like read_pixels or find_glitches. The phrasing is slightly indirect — it describes what the notes contain rather than saying plainly 'returns review notes' — so it falls short of a clean verb+resource statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'Without `path`, every sprite with notes under the allowed folders' conveys the broad-vs-targeted selection, and 'Fix, then resolve_note' points at the natural follow-up. There is no explicit when-to-use/when-not-to-use framing against siblings such as find_glitches or lint, which also surface animation problems.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rig_previewA
Check a rig before animating: which pixels each part got (tinted), each pivot (white dot), pixel counts and bounding boxes. Parts claim pixels in list order; leftovers form "rest". rig = {"parts": [{"name", "mask": {"rect"|"polygon"|"rows"|"colors"|"union"|"minus"}, "pivot": [x,y], "parent"?, "z"?}], "overlap"?: 1}. Name parts head, torso, arm_front, arm_back, leg_front, leg_back, weapon, tail, hair to use the motion presets.
| Name | Required | Description | Default |
|---|---|---|---|
| rig | Yes | ||
| path | Yes | ||
| frame | No | ||
| layer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description must carry the load, and it does disclose non-obvious behavior: parts claim pixels in list order, leftovers form an implicit 'rest' part, and the preview is rendered with tints plus white pivot dots. It omits whether the tool mutates document state or errors on an invalid rig, which is a meaningful gap for a nested-object tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the purpose and observable outputs come first, then the rig grammar. The inline pseudo-schema is terse and earns its space, though the run-on structure makes it slower to scan than a bulleted shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with a deeply nested object, no annotations, and no output schema, the rig grammar is well covered but the frame/layer targeting and the mutation-vs-read nature are left undefined. An agent could construct a rig but not confidently pick frame or layer values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must document everything, and it does an above-average job on the complex `rig` parameter — mask variants (rect/polygon/rows/colors/union/minus), pivot, parent, z, and the overlap flag are all explained. However `path`, `frame`, and `layer` (half the parameters) are never mentioned, so compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Check a rig before animating', and enumerates what the preview reveals (tinted pixel assignment, white pivot dots, pixel counts, bounding boxes). It is distinguishable from animate_rig and check_animation by being a static diagnostic rather than a motion evaluation, though it never names those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Check a rig before animating' gives clear situational context — this is a pre-flight validation step. There are no explicit exclusions or named alternatives (e.g. lint, check_animation) telling the agent when to pick a different diagnostic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sprite_infoB
Structure of a sprite: size, frame durations, layer tree (with which frames have cels and which are linked), tags, slices, palette size and warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses the returned information including layer/cel/link details and warnings, which implies a read-only inspection operation, but it does not explicitly state that the tool is non-mutating, what permissions or file-access assumptions apply, or what the response format looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that efficiently enumerates the important return categories. Every clause contributes useful information, and there is no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description must explain what comes back, and it does so with a strong list of structural fields and warnings. The main remaining gap is that the input path parameter is undocumented and no annotations are available, but for a simple one-parameter inspection tool the definition is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention the single path parameter at all. While 'path' is intuitive for a sprite-information tool, the description adds no semantics about what kind of path is expected or how it is interpreted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as a sprite and enumerates the structural information returned: size, frame durations, layer tree, tags, slices, palette size, and warnings. It lacks an explicit verb like 'inspect' or 'retrieve', and it does not name a sibling alternative, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is used to inspect a sprite's structure, but it gives no explicit when-to-use guidance, no prerequisites, and no comparison to siblings such as view, lint, or check_animation. An agent must infer the appropriate context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sprite_newC
Create a new transparent RGBA .aseprite sprite. layers are created bottom to top
(default one layer named "Layer 1").
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| width | Yes | ||
| frames | No | ||
| height | Yes | ||
| layers | No | ||
| overwrite | No | ||
| duration_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add real value by disclosing that the canvas starts transparent RGBA, that one layer named "Layer 1" exists by default, and that `layers` are ordered bottom to top. It omits what happens on collision when overwrite=false, whether directories are created, and any permission or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core operation front-loaded and the layer caveat attached directly after. Sizing is appropriate for the tool's simplicity, though the brevity contributes to the parameter gaps noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter file-creating mutation with no annotations and no output schema, the description is thin. An agent still cannot tell what overwrite does, what frames/duration_ms control, or what the tool returns on success versus file-exists failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, so the description must compensate and largely does not. Only `layers` (ordering and default) is explained, plus the implied meaning of path/width/height from the first sentence; `frames`, `duration_ms`, and `overwrite` get no semantics at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with distinguishing detail: creating a new transparent RGBA .aseprite file. That clearly separates it from siblings like import_strip, sprite_info, or open. No sibling is named, so it misses the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 versus import_strip or other creation paths, and no prerequisites stated (whether the parent directory must exist, what happens when the target file already exists). The only contextual note is the default layer naming, which is behavioral rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tween_posesA
In-betweens between two drawn key poses of one character (pose-to-pose).
rig_start / rig_end cut each drawing into parts with the SAME names (same masks syntax as
rig_preview); put each pivot on the same joint in both drawings (neck, shoulder, hip, grip).
For every part the rotation and position that carry it from one drawing to the other are
fitted; in-betweens in the first half move the start drawing's parts, those in the second half
move the end drawing's parts back, so every frame is made of real drawn pixels.
Writes out_layer from first_frame: the start drawing, inbetweens frames, the end drawing.
ease: ease_in_out | ease_in | ease_out | linear. extra: one pose per in-between added on top
(e.g. anticipation [{"torso": {"dy": 3}}, {}, ...]); parts of both rigs, plus "root".
Returns the fit per part (angle, match 0..1; under 0.4 = shape changes too much: split it at
its joint, e.g. a leg into thigh + shin, or redraw it), bone_stretch (joints whose limb is
over 2 px longer or shorter in one drawing: joints stay closed in every in-between, and the
length changes where the frames switch drawings), and an onion-skin view.
Parts that carry others turn by their bones (pivot -> children's pivots).
| Name | Required | Description | Default |
|---|---|---|---|
| ease | No | ease_in_out | |
| path | Yes | ||
| clean | No | ||
| extra | No | ||
| rig_end | Yes | ||
| durations | No | ||
| end_frame | No | ||
| end_layer | Yes | ||
| out_layer | Yes | ||
| rig_start | Yes | ||
| inbetweens | No | ||
| angle_range | No | ||
| first_frame | No | ||
| start_frame | No | ||
| start_layer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does disclose real behavior: out_layer is written from first_frame as start drawing + inbetweens + end drawing, deformation is fitted per part, and the return includes per-part fit, bone_stretch, and an onion-skin view. Gaps remain — the `clean` flag (default true) and what happens to pre-existing out_layer content are never explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then organized by topic: rig setup, output framing/ease/extra, then return values. It is dense with long parenthetical asides but nearly every sentence carries technical information an animator needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A complex 15-parameter geometry tool with no annotations and no output schema gets a solid explanation of the core rig and output mechanics. However, with 0% schema coverage and roughly half the parameters unexplained, an agent still cannot confidently supply durations, angle_range, clean, or the frame bounds.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 15 parameters, so the description must compensate, and it only explains some: rig_start/rig_end, ease, extra, inbetweens and first_frame get real meaning. durations, angle_range, clean, path, start_frame/end_frame, and start_layer/end_layer are left entirely undocumented by both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: generates in-betweens between two drawn key poses for one character (pose-to-pose). It is clearly distinguishable from rig_preview (it only references its mask syntax) though it never explicitly contrasts itself with animate_rig, another animation-producing sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operating context: rig_start/rig_end must share part names and pivots must sit on the same joint in both drawings. It also provides actionable remediation (under 0.4 match = split at the joint or redraw). It stops short of saying when to pick this over animate_rig or other animation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undoB
Undo the last edits made through this server to a file (up to 50 per file).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| steps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose two real behavioral facts: the undo history is server-scoped and capped at 50 per file. It does not say whether the file on disk is rewritten, whether undo is itself reversible via redo, or what error/behavior occurs when the cap is hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the parenthetical cap is the only extra clause and it does add information. Slightly tighter phrasing could clarify that the cap is on undo depth rather than edits per call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-annotation tool with no output schema, the description gives the essential capability and scope but omits post-undo state (is the file saved? is redo now available?) and any explanation of the 'steps' argument. Adequate minimum, with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and neither parameter is documented. The description implies a history limit of 50 that relates to the 'steps' parameter, but it never explains that 'steps' selects how many edits to roll back or what 'path' should point to, so an agent must guess at the multi-step behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (undo) and resource (the last edits made through this server to a file), plus a concrete scope bound of 50 undo levels per file. It is clearly distinguishable from siblings like redo or view by the plain meaning of 'undo', though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'edits made through this server' is an implicit precondition (only server-tracked edits can be undone), which is useful guidance. However, there is no explicit statement of when to prefer this over redo, or what happens once the 50-step history is exhausted — 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.
verify_with_asepriteA
Open the file with the real Aseprite (if installed: ASEPRITE_PATH or the usual install folder), render every frame there and compare with this server's renderer. Proves the file is valid and that previews here match what Aseprite shows.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
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 external dependency and the core process (open, render, compare), but it does not clarify side effects, failure modes when Aseprite is unavailable, permissions required, or the nature of the comparison result. Some transparency is present but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences. The first sentence front-loads the process, and the second states the value proposition. No wasteful language, though it could more explicitly link the process to the required path argument.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core behavior and external dependency, which is the main complexity. However, given no output schema, it should explain what 'compare' returns (e.g., boolean, report details) and describe the path parameter. These gaps leave the tool partially specified for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter ('path') with 0% schema description coverage. The description refers to 'the file' but never explains what the path parameter expects (e.g., absolute vs relative path, supported file types). It adds no meaning beyond the schema's bare title.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific sequence of actions (open with real Aseprite, render every frame, compare with server's renderer) and clarifies the outcome (proves file validity and preview match). This clearly distinguishes it from siblings like lint or check_animation, which do not involve external Aseprite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage by mentioning the dependency on Aseprite installation (ASEPRITE_PATH or usual folder), but it does not explicitly say when to choose this tool over alternatives such as lint, check_animation, or compare. No exclusions or direct sibling comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viewB
Look at frames: one image with up to 16 frames side by side, each on a checkerboard with a pixel grid (darker every 8 px), rulers in sprite coordinates and its number and duration. frames: 1-based list, "all" or "2-6". region [x,y,w,h] zooms into a detail. mode: color, value (lightness only: do the forms read without hue?) or silhouette. onion=true shows the previous frame in red and the next in blue under each frame.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | ||
| mode | No | color | |
| path | Yes | ||
| onion | No | ||
| scale | No | ||
| frames | No | 1 | |
| layers | No | ||
| region | No | ||
| rulers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose return-shape behavior well (composited image, checkerboard, 8px grid, rulers, onion skin in red/blue) and implies a 16-frame cap, but says nothing about whether it is read-only, whether it writes files, or what happens with large scale/frame counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every clause carries information, and the rendering description is front-loaded before parameter details. The line breaks inside sentences make it slightly harder to scan than necessary, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no annotations and no output schema, the description covers the visual result and four key parameters adequately. The required path, scale, and layers remain unexplained, and side-effect/read-only behavior is unstated, leaving meaningful gaps for an agent to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage across 9 parameters, the description has to do all the work. It explains the non-obvious ones well — frames accepts 1-based lists, "all", or ranges like "2-6"; region is [x,y,w,h]; mode is color/value/silhouette; onion=true. But the required `path` parameter, plus grid, scale, layers, and rulers, are left undocumented, so half the surface is still opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb+resource ("Look at frames") and immediately specifies the rendered output: one image, up to 16 frames side by side, with checkerboard, grid, rulers, and per-frame labels. It never names the artifact type (sprite/animation file) or explains what `path` points to, and it doesn't distinguish itself from siblings like read_pixels or sprite_info, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the mode definitions (e.g. value mode framed as "do the forms read without hue?"), which hints at intent but gives no explicit when-to-use vs. read_pixels, compare, or sprite_info. There are no stated exclusions or prerequisites, so the agent must infer when this visual-check tool is the right choice.
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.
23 tool updates
v0.1.0- First observed
animate_rig - First observed
apply - First observed
check_animation - First observed
check_identity - First observed
compare - First observed
export - First observed
find_glitches - First observed
import_strip - First observed
lint - First observed
live_open - First observed
make_ramp - First observed
pixelize - First observed
read_pixels - First observed
redo - First observed
resolve_note - First observed
review_notes - First observed
rig_preview - First observed
sprite_info - First observed
sprite_new - First observed
tween_poses - First observed
undo - First observed
verify_with_aseprite - First observed
view
TDQS
Scored across 23 tools
Most tools have clearly distinct purposes across creation, editing, rigging, verification, and review. The main overlap is the diagnostic cluster (lint, check_animation, find_glitches, check_identity, compare), but their descriptions define separate scopes well enough for an agent to choose correctly.
All names use snake_case, which keeps them readable. However, the word order is mixed: many are verb_noun (check_animation, find_glitches, animate_rig) while several are noun_verb or adjective_verb (sprite_new, sprite_info, rig_preview, live_open), so the pattern is not fully predictable.
The 23-tool surface is heavy, though the broad studio scope justifies many capabilities. Still, the set sits in the borderline-heavy range, and some diagnostic or review tools could feel like extra surface area for an agent to manage.
The server covers the full lifecycle: sprite creation and inspection, extensive transactional editing via apply, rigging and animation, import/pixelization, linting and glitch checks, export, real-Aseprite verification, and user review notes. No obvious CRUD or workflow dead ends are apparent for the stated pixel-art studio purpose.
Maintenance
Related MCP Connectors
Generate, edit, style-match, turn, and animate game-ready pixel art at exact sizes.
Generate pixel art sprites, animations, 8-direction rotations and palettes for games.
Generate authentic pixel art - sprites, animations, and tilesets - from any MCP client
Create AI animations and export transparent sprite sheets, alpha video, frames, and game assets.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to create, inspect, edit, and export pixel art, sprites, animations, and spritesheets using headless Aseprite, and to convert arbitrary images into indexed pixel art.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to create, draw, and refine Aseprite documents through deterministic canvas, layer, frame, tag, and palette tools, with pixel analyzers, style validation, and preview/diff visual feedback. It also supports spritesheet and animated GIF export, producing multi-layer game-ready assets.1MIT
- AlicenseBqualityCmaintenanceEnables 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.116MIT
- AlicenseNot gradedqualityCmaintenanceGives AI assistants headless control of the pixel-art editor by wrapping its command line and complete Lua scripting API. It enables inspecting sprite metadata, creating new sprites, exporting frames and packed spritesheets, and editing pixels, layers, frames, tags and palettes.MIT