aseprite-mcp
Provides 73 tools for driving the Aseprite pixel art and sprite animation editor, covering sprites, layers, frames, cels, drawing and pixel editing, selections and clipboard, palettes, tags, slices, tilemaps, filters, preferences and export (PNG previews, sprite sheets). Generic escape hatches allow running any of Aseprite's menu commands or arbitrary Lua against its scripting API. It can operate in batch mode, running a headless Aseprite process against files, or in live mode via a bridge extension connected to an open Aseprite window, where edits go through the undo history and the active sprite, layer, frame and selection persist between calls.
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-mcpcreate a 32x32 bouncing ball sprite with 8 frames and export it as PNG"
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
An MCP server for Aseprite, the pixel art and sprite animation editor. It exposes 73 tools that cover sprites, layers, frames, cels, drawing, selections, palettes, tags, slices, tilemaps, filters, preferences and export. Anything without a dedicated tool is still reachable through run_command, which runs any of Aseprite's 183 menu commands, and run_lua, which runs arbitrary Lua against the full scripting API.
The server can run Aseprite two ways. Batch mode starts a headless aseprite -b process for each call and works on files. Live mode talks to an Aseprite window you have open, so you watch the edits happen and can undo them.
The full parameter reference for every tool is in docs/tools.md.
Requirements
Node.js 20 or newer.
Aseprite 1.3. Development and testing used 1.3.18.6. A bought copy from Steam or the Aseprite website works, and so does a build from source.
The server looks for Aseprite in this order: the ASEPRITE_PATH environment variable, aseprite/build/bin/ inside the package folder, the default Steam and installer locations for Windows, macOS and Linux, and finally aseprite on PATH. If yours is somewhere else, set ASEPRITE_PATH to the executable. On macOS that is Aseprite.app/Contents/MacOS/aseprite, not the .app folder.
Related MCP server: aseprite-mcp
Install
There is nothing to install by hand. MCP clients start the server with npx.
For Claude Code:
claude mcp add aseprite -- npx -y aseprite-mcpWith a custom Aseprite location:
claude mcp add aseprite -e ASEPRITE_PATH="D:/Tools/Aseprite/Aseprite.exe" -- npx -y aseprite-mcpFor Claude Desktop, Cursor, VS Code and other clients that read a JSON config, add this to the mcpServers section:
{
"mcpServers": {
"aseprite": {
"command": "npx",
"args": ["-y", "aseprite-mcp"],
"env": {
"ASEPRITE_PATH": "C:/Program Files/Aseprite/Aseprite.exe"
}
}
}
}Leave out env if Aseprite is in one of the default locations. Ask the client to call the status tool to confirm the server found the executable.
To run from a clone instead:
git clone https://github.com/shin2344234/aseprite-mcp.gitcd aseprite-mcp && npm install && npm run buildThen point the client at node /path/to/aseprite-mcp/dist/index.js.
Batch and live mode
Every tool takes a backend parameter. The default, auto, uses live mode when an Aseprite window is connected and batch mode otherwise. Pass "live" or "batch" to force one.
In batch mode each call is a fresh Aseprite process. Tools that touch a sprite need sprite set to a file path, and tools that change it save the file when they finish. Pass save: false to leave the file alone, which is useful for a dry run. Selections, undo history and unsaved sprites do not carry over from one call to the next. Batch mode has no fonts beyond a built-in 5x7 pixel font, no event log and no dialogs.
Live mode needs the bridge extension inside Aseprite. Ask the client to call launch_aseprite, which copies the extension into Aseprite's extensions folder and opens the window. You can also call install_extension and start Aseprite yourself. The extension connects to the server over a WebSocket on 127.0.0.1:41234. Once it is connected, sprite is optional and defaults to the active sprite, and the active layer, frame and selection stay put between calls. Every change goes through Aseprite's undo history.
The first time the extension opens its socket, Aseprite's script security asks for permission. The same prompt can appear the first time a live call writes a file. Choosing "Give full trust to this script" stops it coming back. If a live call times out, an unanswered prompt like this is the usual cause.
The extension adds File > Scripts > MCP Bridge... to Aseprite, which shows the connection state and lets you change the port. It reconnects on its own when the server restarts.
Conventions
Coordinates are canvas pixels with (0, 0) at the top left. Frame numbers, layer indices, tag indices and slice indices start at 1. Palette indices start at 0, matching Aseprite.
A color can be "#rrggbb", "#rrggbbaa", a CSS-style name such as "red" or "transparent", a palette index as a number, or an object: {r,g,b,a}, {h,s,v,a}, {h,s,l,a} or {gray,a}.
A layer can be its name, a path through groups such as "Body/Arm", or the index that get_sprite_info reports.
Relative file paths resolve against ASEPRITE_MCP_WORKDIR, which defaults to the directory the client started the server in. export and save_sprite return the full list of files they wrote, because Aseprite writes numbered files for multi-frame PNG exports.
What the tools cover
The groups below match the sections of docs/tools.md.
Group | Tools |
Setup and status |
|
Generic access |
|
Application state |
|
Sprites |
|
Layers |
|
Frames |
|
Cels |
|
Drawing and pixels |
|
Selection and clipboard |
|
Palette |
|
Tags, slices and properties |
|
Tilesets and tilemaps |
|
Rendering and export |
|
Live session |
|
A few of these do more than the name suggests.
render_preview returns an upscaled PNG of the sprite that the model can look at. Transparent pixels sit on a checkerboard aligned to the sprite's pixels, frames are laid out side by side with gray gutters, and an optional grid marks each pixel.
get_pixels returns a region as character rows plus a legend that maps each character to a color. draw_pixels accepts the same format, so a model can read a sprite, change a few characters and write it back.
use_tool drives Aseprite's own tools along a list of points, the same as dragging the mouse: pencil, line, curve, rectangles, ellipses, paint bucket, spray, gradient, contour, polygon, blur, jumble, eraser and the marquee, lasso and magic wand selection tools. It takes ink, opacity, tolerance, pixel-perfect mode and custom image brushes.
draw_shapes draws rectangles, rounded rectangles, ovals, lines, polylines, polygons, cubic beziers and free paths through Aseprite's vector drawing context. Antialiasing is off unless you ask for it.
draw_text uses Aseprite's text renderer in live mode, with its bundled fonts or any installed system font. Aseprite loads fonts only when its window is open, so in batch mode the tool falls back to a built-in 5x7 font that scales by whole numbers.
palette_edit adds, inserts, removes, moves, sorts, reverses, dedupes and generates ramps. In indexed sprites it remaps every cel and tile so pixels keep their colors.
view_settings reads and changes the grid, pixel grid, symmetry, tiled mode, onion skin, overlays and checkerboard. In live mode it also covers zoom, scroll, playback, the timeline and the preview window.
recent_events reports what the person at the keyboard did since the last check: edits, undo and redo, switching sprite, layer or frame, commands run and color changes. Changes made by MCP calls are left out by default.
ask_user opens a dialog in Aseprite with text, inputs and buttons, waits for an answer and returns it. It gives up after timeoutSeconds, 300 by default, and returns timedOut: true.
list_commands lists every menu command with its parameter names and defaults, taken from Aseprite's C++ source. api_docs serves the Lua API reference from the bundled copy of aseprite/api. cli runs the Aseprite command line for things like --sheet, --split-layers and --list-tags.
Configuration
Variable | Default | Meaning |
| search, see Requirements | Full path to the Aseprite executable. |
|
| Port the server listens on for the bridge extension. Change it in the extension's MCP Bridge dialog too. |
| the server's working directory | Base directory for relative file paths. |
|
| How long a batch call may run before the process is killed. |
|
| How long a live call waits for Aseprite to answer. |
| the platform default | Aseprite's user folder, where |
Troubleshooting
If status reports that Aseprite was not found, set ASEPRITE_PATH. With Steam, the executable is in steamapps/common/Aseprite inside your Steam library folder.
If live calls time out, look at the Aseprite window for a script security prompt or another modal dialog. Aseprite runs scripts on its UI thread, so an open dialog blocks every call.
If status says the bridge is not connected while Aseprite is open, check that the extension is enabled under Edit > Preferences > Extensions and that its port matches ASEPRITE_MCP_PORT. Only one server process can own the port. A second server, for example from a second client window, keeps working in batch mode and retries the port every 15 seconds.
Commands that need a timeline range, such as ReverseFrames, return false in batch mode because a headless process has no timeline. link_cels needs live mode for the same reason. Unlinking works in both.
How it works
Each operation is a handler in lua/runtime.lua. The TypeScript server in src/ validates the tool arguments, resolves paths and sends the call to one of two runners.
For batch mode, src/batch.ts writes the request to a temp file and runs aseprite -b --script-param ... --script lua/runner.lua. The runner loads the runtime, dispatches the call, saves the sprites it changed and writes the response file. Calls run one at a time.
For live mode, extension/plugin.lua opens a WebSocket client inside Aseprite. On connect, the server sends the source of runtime.lua, so the extension never needs updating when handlers change. Tool calls and results travel as JSON frames over the same socket. The server pings every 5 seconds, and the extension reconnects after 15 seconds without a message.
During a live call the runtime turns off Aseprite's "format doesn't support layers", overwrite and per-format option alerts, then puts the user's settings back. It also commits any floating pixels left by a paste or a selection transform, before and after the call, so each call sees plain cel contents.
Aseprite bugs worked around
These are in Aseprite 1.3.18.6 itself.
The gradient tool crashes headless Aseprite with an access violation. It reads dithering settings from the context bar, which does not exist in batch mode. use_tool draws linear gradients in Lua in batch mode instead.
The SaveFileCopyAs command object is reused between calls in the GUI and appends fromFrame and toFrame to the previous call's frame list, so a range export writes extra frames. Those parameters are also 0-based. export takes 1-based ranges and exports a trimmed copy of the sprite.
When a WebSocket onreceive callback raises a Lua error, Aseprite stops the socket for good and never sends a close event. The bridge wraps every callback in pcall.
The app.range setters do nothing while the timeline is closed. link_cels and set_active open the timeline before setting a range.
ReselectMask refuses to run from a script, even right after a deselect. select keeps the last selection it cleared and restores that.
Development
npm installnpm run buildnpm run docs regenerates docs/tools.md from the schemas the built server registers. Run it after changing any tool.
npm test calls all 73 tools through a real MCP client over stdio in batch mode and fails if any tool goes uncalled. Most calls are followed by a check of the result: pixels read back with get_pixels, layer and frame structure, palette contents and files on disk. npm run test:live does the same against a GUI instance it starts itself, and adds selection editing, cel linking, undo, events, view controls and dialogs. The batch run makes 170 checks and the live run 197. The live run checks ask_user through its timeout. Set ASK_USER=1 and click OK in Aseprite to check the button path too.
node test/call.mjs <tool> '<json args>' makes a single call, which helps when debugging a handler.
The data files under data/ come from Aseprite's source tree. With the source checked out in aseprite/:
python scripts/extract_commands.py aseprite data/api data/commands.jsonpython scripts/extract_prefs.py aseprite data/preferences.jsonscripts/build-aseprite.bat builds Aseprite from source on Windows with the Visual Studio 2022 Build Tools, using a prebuilt Skia m124 from aseprite/skia unpacked to deps/skia. The server finds a build in aseprite/build/bin/ without any configuration.
License
The server, Lua runtime and extension are MIT licensed. See LICENSE.
The Lua API reference in data/api is a copy of aseprite/api, MIT licensed by Igara Studio and David Capello, with its license in data/api/LICENSE.txt.
Aseprite itself is not included. Its EULA does not allow redistributing the source or binaries, so you need your own copy, bought or built from source for personal use.
Available Tools
73 toolsadd_framesA
Adds frames. By default copies the previous frame's cels; empty=true adds blank frames.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | Frame number for the first new frame (default: end) | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| count | No | ||
| empty | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| copyFrom | No | Frame to copy (default: the frame before 'at') | |
| durationMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, correctly signaling a non-destructive mutation. The description adds genuinely useful context beyond that: the default of copying the previous frame's cels and the empty=true override. It omits save/backend behavior, but that is documented in the schema.
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, zero filler, with the primary action front-loaded and the key behavioral default immediately following.
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 mutation tool with annotations and no output schema, the description covers the core default behavior adequately but leaves the return value, batch-mode effects, and sibling routing unaddressed. It is minimally sufficient rather than 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 coverage is 63%, with 'empty', 'count', and 'durationMs' lacking descriptions. The description compensates for 'empty' (blank vs copied frames) and hints at copyFrom's default, but says nothing about count or durationMs, so it only partially bridges the 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?
'Adds frames' states a specific verb and resource, clearly distinguishing it from delete_frames and move_frame. The added clause about cel-copying behavior further sharpens what the operation does, though it never explicitly names a sibling to route against.
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 usage via the 'empty=true adds blank frames' distinction, which steers the agent toward the right option for blank vs cloned frames. However, it offers no explicit when-to-use guidance relative to copy_cel/link_cels or any prerequisites, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_layerB
Adds an image, group or tilemap layer, optionally inside a group or above/below another layer, with its properties set.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Position of 'image' | |
| y | No | ||
| data | No | User data text | |
| name | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| type | No | ||
| above | No | Place directly above this layer | |
| below | No | Place directly below this layer | |
| color | No | Timeline color | |
| frame | No | Frame for 'image' (default 1) | |
| image | No | Fill the new layer (image or reference) with this image | |
| parent | No | Group layer to move into; '' moves to the top level | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| opacity | No | ||
| visible | No | ||
| editable | No | false locks the layer | |
| tileSize | No | Tilemap layers: tile size | |
| blendMode | No | normal, multiply, screen, overlay, darken, lighten, color_dodge, color_burn, hard_light, soft_light, difference, exclusion, hue, saturation, color, luminosity, addition, subtract, divide | |
| collapsed | No | Group layers only | |
| continuous | No | ||
| properties | No | User-defined properties to set (object.properties) | |
| stackIndex | No | Position among siblings (1 = bottom) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, establishing a non-destructive write. The description adds that properties are set at creation time, which is useful, but omits significant behavior such as the save default (writes back to the sprite file) and backend selection between live and batch modes.
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, tightly packed sentence with the core action and its main modifiers front-loaded. No filler, though packing four clauses leaves some ambiguity about ordering semantics.
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 23-parameter creation tool with no output schema and nested objects, the one-sentence description is thin. The important file-write semantics of save/backend and the group-parenting behavior are left entirely to the 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 description coverage is 74% across 23 parameters, so the schema carries most documentation. The description adds only the layer-type and placement vocabulary already implied by the schema; it does not clarify ambiguous params like save, backend, or properties.
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 (adds) and resource (layer), enumerating the creatable layer types and placement options. This clearly separates it from siblings like update_layer, delete_layer, and duplicate_layer, though it never names them 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?
No guidance on when to use add_layer versus alternatives (convert_layer, duplicate_layer, add_slice), nor any prerequisites or exclusions. The placement options are described as capabilities, not as selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sliceB
Adds a slice (with optional 9-slice center and pivot), or duplicates one with copyFrom.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| name | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| pivot | No | Pivot relative to the slice; false removes it | |
| bounds | No | ||
| center | No | 9-slice center, relative to the slice; false removes it | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| copyFrom | No | Slice to duplicate | |
| properties | No | User-defined properties to set (object.properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a mutation (readOnlyHint=false) that is not destructive (destructiveHint=false), which matches an additive 'add' operation. The description adds the duplication path via copyFrom, but says nothing about persistence/save semantics, batch vs live backend implications, or what happens to existing slices - all relevant for an 11-parameter mutation 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 tight sentence with the primary action front-loaded and the alternate mode appended. No filler or restatement of the tool name beyond what is needed.
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?
Adequate but thin for an 11-parameter, nested-object, no-required-parameter mutation tool with no output schema. Important operational context - save/batch behavior and what a call with no arguments does - is left entirely to the schema rather than the description.
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 73%, so the schema already documents most parameters (save, color, pivot, center, sprite, backend, copyFrom). The description only gestures at three of them (center, pivot, copyFrom) without adding format or constraint detail beyond the schema, so it lands at the baseline rather than compensating for the uncovered 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 ('Adds a slice') and names the two operating modes: normal add versus duplication via copyFrom. It does not explicitly differentiate itself from the sibling update_slice/delete_slice, though the verb makes the distinction largely inferable.
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 choose this tool over update_slice or delete_slice, and no mention of prerequisites (e.g. that a slice generally needs bounds). The only routing hint is the copyFrom duplication mode, which is described as a capability rather than a when-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tagC
Adds an animation tag over a frame range.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| data | No | ||
| from | No | ||
| name | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| aniDir | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| repeats | No | 0 = infinite | |
| properties | No | User-defined properties to set (object.properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive write. The description adds the frame-range scope of a tag, which is useful, but it omits the live-vs-batch and save behaviors that the schema hints at. With annotations carrying the safety profile, a 3 is appropriate.
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 zero waste. It is appropriately sized for its content, though the brevity reflects under-specification rather than tight editing.
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 tool with 11 params, batch/live backends, a save toggle, and no output schema, one sentence is far too thin. Key behaviors like persistence and mode selection are left entirely to the 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?
11 parameters with only 55% schema description coverage, and the description mentions none of them. Undocumented params (from, to, name, data, aniDir) get no help from either source; only 'frame range' loosely implies from/to.
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 ('Adds an animation tag') plus scope ('over a frame range'). It clearly distinguishes from delete_tag and update_tag by virtue of 'adds', though it never names or contrasts those siblings 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?
There is no when-to-use guidance, no prerequisites, and no mention of the sibling tools (update_tag, delete_tag) that would help an agent choose. Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_docsARead-only
Reads the Aseprite Lua API reference (bundled from github.com/aseprite/api). Without a topic, lists topics. Topics include app, sprite, layer, cel, image, color, palette, tag, slice, tileset, selection, dialog, websocket, and command/.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | e.g. 'image', 'app', 'command/ExportSpriteSheet' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, a low bar for a doc reader. The description adds genuinely useful behavior beyond that: the content is bundled from github.com/aseprite/api, and omitting the topic switches the tool into a listing mode. It does not describe the shape of the returned reference text, but for a safe read-only lookup this is a solid disclosure.
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. The core action and the no-argument fallback are front-loaded, and the topic list is placed last where it is only needed after the agent has decided to call 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?
There is no output schema, so the description carries the burden of explaining the return. It says it 'reads the API reference' but never states the return format (prose, markdown, structured sections) or whether results are chunked. For a single-parameter, read-only doc tool the missing pieces are minor, but not fully covered.
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 100%, setting the baseline at 3, but the description goes beyond the schema by enumerating the full set of valid topic names and showing the command/<CommandName> pattern. That materially helps the agent construct a valid topic value rather than guessing from the schema's three examples.
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?
Specific verb+resource: 'Reads the Aseprite Lua API reference,' with the source repo named. The description also explains the no-argument behavior (lists topics), so an agent can distinguish this documentation-lookup tool from execution siblings like run_lua or run_command without opening the 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?
The description gives clear usage context: pass a topic to read a specific section, omit it to enumerate available topics. It enumerates the topic vocabulary (app, sprite, layer, cel, image, ...) so the agent knows what it can ask for, but it never states when to prefer this over alternatives such as list_commands or use_tool, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_filterA
Applies an image filter command to the active cel(s) or selection: BrightnessContrast, HueSaturation, ColorCurve, ConvolutionMatrix, Despeckle, InvertColor, Outline, ReplaceColor. Params follow list_commands (e.g. Outline {color:'#000000', place:'outside', matrix:'circle'}; HueSaturation {hue, saturation, lightness, alpha}; BrightnessContrast {brightness, contrast}).
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| filter | Yes | ||
| params | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| channels | No | e.g. 'rgba', 'rgb', 'a' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is largely covered and the description is consistent with it. The description adds the supported-filter enumeration, which is real behavioral content, but says nothing about live-vs-batch effects, the save-writeback behavior, or whether edits are undoable.
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 packed sentences with the core action and filter list front-loaded and the parameter examples second. Dense but no filler; a small readability cost from cramming all examples into one sentence.
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 an 8-parameter, nested-object mutation tool with no output schema, the description covers only the filter/params axis; the frame, layer, sprite, backend, and save parameters are left entirely to the schema. It is adequate to invoke the tool, but the batch-vs-live behavior and write-back semantics an agent needs for correct use go unmentioned.
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?
The 'params' property in the schema is an open object with no documented shape, so the description's concrete examples (Outline {color, place, matrix}; HueSaturation {hue, saturation, lightness, alpha}; BrightnessContrast {brightness, contrast}) carry information the schema cannot. It stops short of covering ColorCurve, ConvolutionMatrix, Despeckle, InvertColor, and ReplaceColor, so the gain 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 ('Applies') and resource ('image filter command') plus the exact scope ('active cel(s) or selection'), and enumerates the eight supported filters, which makes the tool easy to identify. It does not, however, contrast itself with neighboring mutators like replace_color or draw_pixels, so sibling differentiation is left to the reader.
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 agent infers this is the tool for the listed filters, and the pointer that 'Params follow list_commands' is a useful routing hint to a sibling. There is no explicit when-to-use/when-not guidance or description of prerequisites (active sprite, connected live session, etc.).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_stateBRead-only
Returns Aseprite's current state: open sprites, active sprite/layer/frame, foreground/background colors, tool, brush, timeline range and editor zoom (live).
| Name | Required | Description | Default |
|---|---|---|---|
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that the reported data is current/live ('editor zoom (live)'), hinting at the live-vs-batch distinction, but never states whether the headless batch fallback returns stale or partial state.
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 that enumerates the return fields with no filler; the tool's purpose is knowable from the first four words.
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 output schema, the field enumeration usefully carries the return contract, and the one optional parameter is covered by the schema. It stops short of explaining behavior differences between the live and batch backends.
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 100% and the single 'backend' enum is fully documented in the schema. The description's '(live)' mention gestures at the same live/batch choice but adds no syntax or default details beyond what the schema already gives.
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 ('Returns') and resource ('Aseprite's current state') and enumerates the exact fields returned, which effectively separates it from per-sprite readers like get_sprite_info. It does not name a sibling tool it is not, so it falls just 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?
The description says what is returned but never states when to reach for this tool versus status, get_sprite_info, or recent_events, nor any exclusions. Usage is only faintly implied by the read-state framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ask_userA
Live mode: shows a dialog in Aseprite and waits for the user to answer. Can show text plus input fields (entry, number, slider, check, combobox, color, label) and buttons. Returns the pressed button and field values.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| title | No | ||
| fields | No | ||
| buttons | No | Default ['OK', 'Cancel'] | |
| timeoutSeconds | No | Close the dialog and return timedOut=true after this many seconds (default 300) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false in annotations, the description carries most of the burden and delivers: it is blocking (waits for user), live-mode-only, and interactive. It does not explain the readOnlyHint=false side effect nor the timeout behavior, but the core behavioral traits are disclosed.
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, front-loaded with the live-mode constraint, with no filler. Slightly list-like in the field-type enumeration but each clause carries 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?
No output schema exists, and the description does explain the return ('returns the pressed button and field values'). For a 5-param interactive tool it covers the essentials, though it omits timeout semantics and nested field detail.
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 40%, below the 50% threshold, so the description must compensate. It lists the field types (entry, number, slider, check, combobox, color, label), mentions buttons, and states the return value, mapping meaning onto the fields/buttons params, though nested field attributes (min, max, value, decimals) remain undocumented anywhere.
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: it shows a dialog in Aseprite and waits for the user to answer. It also names the interaction surface (text, input fields, buttons) and the return. No sibling tool does anything similar, so it is inherently distinguishable.
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 leading 'Live mode:' clause implies a mode prerequisite, giving some usage context. However, it names no alternatives, no when-not conditions, and no guidance on when to prefer this over plain scripting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canvas_sizeB
Grows or shrinks the canvas without scaling pixels: either margins (left/top/right/bottom, negative values cut) or a new width/height with an anchor.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| left | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| right | No | ||
| width | No | ||
| anchor | No | ||
| bottom | No | ||
| height | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| trimOutside | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive mutation, and the description adds useful behavioral detail that negative margin values cut pixels. It does not cover persistence (save default true), backend auto/live/batch behavior, or reversibility — though save and backend are documented in the schema, so the gap is moderate rather than severe. No contradiction with destructiveHint=false.
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 dense sentence with zero filler, and the core behavior ('without scaling pixels') is front-loaded before the parameter modes. It could be marginally clearer about whether the two modes are mutually exclusive, but it earns its length.
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 an 11-parameter tool at 27% schema coverage with no output schema and no descriptive annotations, the description covers the core spatial parameters adequately but is silent on trimOutside, anchor value effects, and the live-vs-batch save implications. Adequate but with clear gaps for a tool this size.
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 only 27%, so the description carries real weight and it does explain left/top/right/bottom direction semantics and that negatives cut, plus the width/height+anchor mode. It leaves anchor selection meaning, trimOutside, and whether the two modes can be combined unexplained.
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 (grows/shrinks) and resource (canvas) plus the key differentiator 'without scaling pixels', which implicitly separates it from resize_sprite. It doesn't name the sibling explicitly, but an agent can distinguish it.
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 'either margins ... or width/height with an anchor' clause gives useful mode-selection context for the two ways to call it. However there is no explicit guidance on when to choose canvas_size over crop_sprite, resize_sprite, or trimOutside, 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.
change_color_modeC
Converts the sprite to RGB, grayscale or indexed, with optional dithering.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| rgbmap | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| toGray | No | ||
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| dithering | No | ||
| fitCriteria | No | ||
| ditheringFactor | No | ||
| ditheringMatrix | No | e.g. 'bayer2x2', 'bayer4x4', 'bayer8x8' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the safety profile (a non-destructive write) is already conveyed and the description does not contradict it. The description adds the optional-dithering trait but says nothing about persistence, batch vs live execution, or what happens to the sprite data.
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 well-structured. It is arguably too terse for a 10-parameter tool, but as conciseness it works.
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 mutation tool with 10 parameters, 40% schema coverage, and no output schema, the description leaves major gaps: how modes interact with dithering/rgbmap, whether changes are saved, and the batch-vs-live distinction. It is far from complete enough to guide 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 only 40%, so the description must compensate for the many undocumented parameters (mode, rgbmap, toGray, fitCriteria, ditheringFactor, ditheringMatrix), yet it only alludes to dithering. The mode enum values are restated but no format, defaults, or interactions are explained beyond 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 (converts) and resource (sprite) plus the three target color modes, so an agent can tell it apart from siblings like replace_color or palette_edit. It stops short of naming any sibling explicitly, so it earns a 4 rather than 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 when-to-use, when-not-to-use, or alternative-tool guidance at all. The agent must infer that this is for changing a sprite's color mode rather than for palette or per-pixel color edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clearBDestructive
Clears a layer's cel(s) to transparent (or fills with a color): whole cel, a rect, or the selected area.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last frame of a range | |
| tag | No | Use the frames of this tag | |
| from | No | First frame of a range | |
| rect | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| frames | No | 'all' or a list of frame numbers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| useSelection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description aligns with that by stating cels are cleared to transparent (or overwritten with a color), which is genuinely additive detail about what is lost. It does not disclose undo/reversibility, the live-vs-batch implications, or the default save-to-file behavior, so it only modestly exceeds what annotations provide.
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 dense sentence that front-loads the core action and appends the fill alternative and the three scope modes without wasted words. No filler, no redundancy.
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 12-parameter, destructive, no-output-schema tool, the description covers the operation and its target granularity but omits operational context such as batch-mode/save semantics, live-vs-batch behavior, and reversibility. The rich schema compensates for the parameter gaps, but behavioral context is thin.
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 83%, above the 80% threshold, so the schema already documents nearly all 12 parameters thoroughly (color formats, frame ranges, tags, sprite/layer targeting, save flag). The description restates the targeting modes but adds no syntax or format meaning beyond the schema, so the baseline 3 applies.
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 (clears) and resource (a layer's cel(s)) with the outcome spelled out: to transparent, or filled with a color. The three target scopes (whole cel, rect, selected area) further pin down what it does. It does not name or contrast with the obvious sibling delete_cel, so it stops short of full sibling differentiation.
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 enumerates the ways the region can be targeted but gives no when-to-use guidance, prerequisites, or exclusions relative to alternatives like delete_cel, draw_pixels, or replace_color. An agent must infer selection from the parameter schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cliA
Runs the Aseprite command line in batch mode (aseprite -b ) and returns its output. Useful for --sheet/--data exports, --split-layers, --list-tags, --save-as with {layer}/{frame} templates, --scale, --color-mode, etc. See https://www.aseprite.org/docs/cli/.
| Name | Required | Description | Default |
|---|---|---|---|
| args | Yes | Arguments after -b, e.g. ['in.aseprite', '--scale', '4', '--save-as', 'out.png'] | |
| timeoutSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false, so the description carries most of the burden. It discloses the batch-mode execution and that output is returned, but does not warn about the key behavioral traits of arbitrary CLI execution: arbitrary file writes from --save-as/--sheet, working-directory assumptions, or the timeoutSeconds budget. Useful context, but not the full safety picture.
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, front-loaded with the invocation form, followed by concrete flag examples and a canonical doc link. No sentence is padding, and the most important information comes first.
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 tool that shells out to an external binary with no output schema and an undocumented timeout parameter, the description is adequate but thin. It says output is returned but omits where files are written, what the effective working directory is, and how timeouts manifest, all of which matter 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 coverage is 50%: 'args' is documented in the schema with an example, while 'timeoutSeconds' is undocumented in both schema and description. The description's flag list helps an agent construct args, but adds no semantics for the timeout-bound parameter, so the baseline 3 fits.
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 ('Runs the Aseprite command line in batch mode (aseprite -b <args>) and returns its output'), which is concrete and distinguishable from wrappers like run_lua. It does not explicitly name sibling alternatives such as export_sprite_sheet or run_lua, so an agent must infer the boundary from the tool list.
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 list of example flags ('--sheet/--data exports, --split-layers, --list-tags, --save-as...') implies the cases where this raw-CLI escape hatch is useful. However, it never says when to prefer the dedicated siblings (export, export_sprite_sheet, run_lua) instead, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clipboardA
Reads or writes the system clipboard: info, get_text, set_text, clear, get_image (returned as a preview image, or saved to 'file'), set_image (from an image file, or a rendered sprite frame/layer/rect).
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | get_image: save here; set_image: load from here | |
| rect | No | ||
| text | No | ||
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| action | Yes | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false, which is coarse for a tool that contains both reads (info, get_text, get_image) and writes (set_text, clear, set_image); the description never separates the read actions from the mutating ones. It does add useful behavior beyond the annotation, e.g. get_image returning a preview versus writing to file, and how backend selection works, but it never says that 'clear' or 'set_text' overwrite/destroy existing clipboard content.
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 that leads with read/write scope and then tucks action details into parentheticals. It is long and dense but nearly every clause carries information; the only slight redundancy is restating 'file' semantics that the schema already documents.
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 six action modes, eight parameters, a nested rect object, and no output schema, the description covers mode selection and one return form (image preview) but is silent on what info/get_text return, what clear does to existing content, and failure behavior (e.g. no image on clipboard, headless backend limits). Adequate but with clear gaps for a tool this broad.
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 63%, with 'rect', 'text', and 'action' documented only by the enum, yet the description compensates by binding parameters to actions: 'file' for get_image save / set_image load, and 'sprite frame/layer/rect' as set_image sources. That action-to-parameter mapping is genuine added meaning beyond the schema, though the full action/parameter matrix (e.g. which actions accept 'text') is left implicit.
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 ('Reads or writes the system clipboard') and then enumerates all six action modes with their sub-behavior, so an agent knows exactly what the tool covers. It does not, however, differentiate from adjacent siblings such as 'clear', 'get_pixels', 'draw_image', or 'render_preview', which overlap conceptually with some of these actions.
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 action enumeration implicitly tells the agent which mode to pick for text vs. image vs. metadata, and the backend note ('auto (default): live Aseprite if connected, else headless batch') plus 'Batch mode needs a file path' give real operational context. There is no explicit when-to-use/when-not guidance and no routing to alternative tools for image transfer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_spriteCDestructive
Closes an open sprite (live mode).
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| discardChanges | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is partly covered. However, the description does not disclose the important behavioral facts: what happens to unsaved changes, how save/discardChanges interact, or how the batch backend differs from live. For a destructive close operation this is a meaningful gap.
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 a single short sentence with no padding, which is good for front-loading, but the parenthetical qualifier is arguably misleading rather than earning its place. Brevity here reflects under-specification more than disciplined conciseness.
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 zero-required, four-parameter destructive operation with no output schema, the description omits the data-loss semantics and backend-dependent behavior an agent needs to call it safely. It is not complete enough to invoke confidently without inspecting the 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 only 50%, with save and discardChanges undocumented in both schema and description, and the description adds no parameter meaning at all. It fails to compensate for the coverage gap on the two parameters that determine whether closing destroys work.
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 verb and resource ("Closes an open sprite") that an agent can readily distinguish from open_sprite and save_sprite. The "(live mode)" qualifier is ambiguous though, since the schema's backend enum supports auto/live/batch, implying the scope is narrower or different than the tool actually is.
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 indication of when to choose this tool versus save_sprite or open_sprite, nor any prerequisite or exclusion guidance. The only contextual hint is the trailing "(live mode)", which is not elaborated and is muddled by the backend enum.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_layerB
Converts a layer: to a Background layer, from Background to a normal layer, or between image and tilemap layers.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered; the description adds nothing further. It never states whether existing pixel data is preserved, whether converting to/from Background flattens anything, or whether the change is undoable, which matters for a layer-type mutation.
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 that packs the three supported conversions without filler. It is efficient, though the colon-list construction is slightly dense and could be split for faster scanning.
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 five parameters (one required), 80% schema coverage, and no output schema, the description need not explain return values, but it should say what happens to the layer's content after conversion. For a mutation tool with no output schema, the absence of any side-effect statement leaves 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 description coverage is 80% and the 'save', 'layer', 'sprite', and 'backend' parameters are documented in the schema, so the baseline of 3 applies. The description lists the conversion modes that correspond to the 'to' enum but adds no syntax or defaulting nuance beyond what the schema already provides.
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 a specific verb (converts) and resource (a layer) and enumerates the three conversion modes, which map cleanly onto the 'to' enum values. It is distinguishable from sibling mutators like update_layer or add_layer, 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?
The enumerated conversion directions imply when the tool is appropriate (changing layer type), but there is no explicit guidance on when to prefer it over update_layer or add_layer, and no mention of prerequisites such as needing an open sprite or a tilemap-capable document for the image/tilemap conversions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_celB
Copies a cel's image to another layer/frame (and optionally another open sprite).
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| sprite | No | Destination sprite | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| toFrame | No | ||
| toLayer | No | ||
| fromFrame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| fromLayer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| fromSprite | No | Source sprite (default: same) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a write operation (readOnlyHint=false) that is non-destructive, so safety is partly covered. The description adds that the copy can target a different sprite, but does not disclose whether an existing destination cel is overwritten (potential content loss), nor the live-vs-batch backend implications. Some added context, but a key mutation consequence is left implicit.
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 well-formed sentence with the operation front-loaded and the optional extension parenthetically scoped. No wasted words, though it is quite terse for a 10-parameter 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?
For a 10-parameter mutation with no output schema and minimal annotations, the description omits the meaning of the x/y parameters and the overwrite/return behavior. Annotations carry the safety profile, which lowers the bar, but the description leaves gaps an agent would need to close by opening the 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?
With 10 parameters and only 60% schema description coverage, the description's mention of 'another layer/frame' and 'another open sprite' loosely maps to toLayer/toFrame/sprite, but adds no syntax or format detail. The x, y coordinates go entirely unaddressed in both the description and (by coverage gap) parts of the schema, so it only marginally compensates.
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 (Copies) and resource (a cel's image) with the destination scope (another layer/frame, optionally another sprite). It distinguishes the operation from sibling tools like link_cels (which links rather than copies) and duplicate_layer (which duplicates whole layers). It stops short of explicitly naming a sibling, but the function 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?
The description implies when it applies (moving a cel's image to a target) but offers no explicit when-to-use vs alternatives, no prerequisites, and no note about how it differs from link_cels or get_cels/update_cel workflows. Nothing routes the agent among the copy-adjacent siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crop_spriteB
Crops the sprite to a rectangle, to the selection (mode='selection'), or trims empty borders (mode='auto').
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| rect | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| byGrid | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation profile is covered structurally. The description adds no behavioral context beyond the mode semantics — it never mentions the live-vs-batch backend distinction or that in batch mode changes are written back to the sprite file (default save=true) before and after a crop.
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 that names the operation first and then the three modes, with no filler. Slightly dense parenthetical structure, but every clause earns its place.
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 six-parameter, mutation-capable tool with no output schema and 50% schema coverage, the description is thin: it omits where changes land (live canvas vs file), the meaning of byGrid, and the rect parameter's semantics. It is adequate to call the tool in the simplest case but leaves real 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 50%: save, sprite, and backend are documented in the schema, while mode, rect, and byGrid are not. The description partially compensates by explaining what the 'selection' and 'auto' mode values mean (the enum names alone don't convey this), but it says nothing about rect's coordinate space or what byGrid does.
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 (crops) and resource (the sprite) and enumerates the three operating modes, so the agent knows exactly what the call does. It does not differentiate itself from nearby siblings such as resize_sprite, canvas_size, or selection_edit, which is the only missing piece for 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?
The mode-to-behavior mapping ('selection' crops to selection, 'auto' trims empty borders) implies when each mode applies, but there is no explicit when-to-use guidance, no exclusions, and no routing to alternatives like resize_sprite or selection_edit for related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_celCDestructive
Deletes the cel(s) of a layer in the given frames.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last frame of a range | |
| tag | No | Use the frames of this tag | |
| from | No | First frame of a range | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| frames | No | 'all' or a list of frame numbers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description's added clause ('of a layer in the given frames') merely restates scope already encoded in the layer/frames parameters, and it says nothing about reversibility, batch-vs-live side effects, or the save/batch write-back 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?
A single short sentence with the verb and scope front-loaded and no filler. It is efficient, though the brevity comes at the cost of the operational context this nine-parameter tool 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?
For a destructive tool with nine parameters, zero required fields, and a live/batch backend switch, a one-line description leaves meaningful gaps: default resolution across layer/frame/sprite, batch mode requiring a file path, and whether undo is available. With no output schema, the description also gives no sense of what the call returns.
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 100%, so all nine parameters are documented in the schema itself, including defaults for frame, layer, sprite, and backend. The description mentions layer and frames but adds no syntax, precedence, or default-resolution meaning beyond what the schema provides, making the baseline 3 correct.
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 and resource ('Deletes the cel(s) of a layer in the given frames'), so an agent immediately knows the operation. However, it offers no differentiation from near siblings like delete_frames, delete_layer, update_cel, or copy_cel, which share the same sprite-editing domain.
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 delete_frames (which removes frames entirely) or clear/replace_color alternatives. No prerequisites, no note on how layer/frame defaults are resolved at call time, and no mention that deletion is undoable via undo_redo.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_framesBDestructive
Deletes one frame, a range, a list, or a tag's frames.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last frame of a range | |
| tag | No | Use the frames of this tag | |
| from | No | First frame of a range | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| frames | No | 'all' or a list of frame numbers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description usefully widens the perceived blast radius by noting that a tag, list, or range can be deleted in one call, but it says nothing about reversibility/undo, the save-to-disk side effect, or per-backend 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?
A single front-loaded sentence with zero filler — the verb and the four modes come first. Given an 8-parameter destructive tool, it is arguably under-specified rather than over-long, but there is no wasted text.
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 zero-required-parameter destructive tool with no output schema, the description covers the core action but not the operational context: no mention of undo, of the save/batch side effect, or of mutual exclusivity among the targeting parameters. The schema carries most of the weight.
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 100%, so each of the 8 parameters is already documented in-schema; baseline is 3. The description's enumeration of delete modes loosely maps to frames/from/to/tag but adds no format or precedence detail (e.g. what happens if multiple selectors are supplied).
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?
Specific verb (deletes) plus resource (frames) with the four targeting modes enumerated — single frame, range, list, or tag — which tells the agent the tool's blast radius. It does not differentiate itself from adjacent destructive siblings like delete_cel, delete_layer, or delete_tag, so a 4 rather than 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?
No when-to-use guidance at all: it does not say which selector to prefer (e.g. use from/to for a contiguous range vs frames for an arbitrary list), nor does it mention the live-vs-batch distinction in the backend parameter. The agent must infer invocation strategy entirely from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_layerBDestructive
Deletes a layer (and its children if it is a group).
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the write/destructive nature is covered structurally. The description adds genuinely useful behavioral context — cascading deletion of children for group layers — but says nothing about undo/reversibility or the effect of the save/batch flag.
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 zero filler. The most consequential fact (cascading child deletion) is stated immediately and 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 destructive mutation with four parameters and no output schema, the definition covers the cascade behavior but omits whether the deletion is undoable and how save/backend interact with persistence. Annotations carry the safety signal, so this is adequate but not 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 100% and all four parameters (save, layer, sprite, backend) are thoroughly documented in the schema itself. The description adds no parameter-level detail, so the baseline of 3 for fully-covered schemas applies.
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 (deletes) and resource (layer), plus the important cascade scope — children are removed when the target is a group. That scope detail helps distinguish it from sibling mutations like delete_cel or delete_frames, but it does not explicitly name or contrast 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?
The description gives no when-to-use, prerequisites, or alternative guidance despite many nearby deletion siblings (delete_frames, delete_cel, delete_tag, delete_slice). The agent must infer the context of use entirely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_sliceCDestructive
Deletes a slice.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| slice | Yes | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds nothing beyond that — it says nothing about whether deletes are undoable, that the operation mutates a sprite file, or how batch/live mode affects persistence. No contradiction with annotations, but no value added either.
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 three-word sentence is not conciseness — it is under-specification. There is nothing front-loaded or structured, just a name restatement.
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 destructive mutation tool with four parameters, live/batch execution modes, and a save-to-file side effect, this description is far too thin. The absence of an output schema is fine, but the critical batch persistence behavior and slice-identifier semantics are left entirely 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 75%, but the one required parameter (slice) has no description in either the schema or the description, so the agent cannot tell whether it takes a name or an index. The description contributes zero parameter meaning and does not compensate for the 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?
"Deletes a slice." restates the tool name delete_slice with no additional specificity — it is essentially a tautology. It gives no hint of scope (which slice, how identified) or how it differs from sibling slice tools such as add_slice, update_slice, or delete_frames.
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 tool versus alternatives like update_slice or delete_frames, no prerequisites, and no mention of the live-vs-batch distinction. An agent must infer everything from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tagADestructive
Deletes a tag (frames are kept).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is covered. The description adds the one piece of context annotations cannot convey: the destruction is scoped to the tag metadata only and frames are retained. It says nothing about idempotency when the tag is absent or undo behavior, but the key "what gets destroyed" fact is stated.
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?
One short sentence with the critical scope qualifier front-loaded in parentheses. Every word earns its place.
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 destructive, no-output-schema tool, the description covers the essential scope of deletion but omits behavior on a missing tag, undo/rollback expectations, and any note that batch mode requires a file path (only in the sprite schema description). Adequate but 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 coverage is 75% and save/sprite/backend carry their own descriptions, so the schema does most of the work. However, the required 'tag' parameter has no description and accepts string or integer without the description clarifying whether it is a name or an id, leaving a real ambiguity unaddressed.
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 ("Deletes a tag") with an immediate scope clarification, which cleanly separates it from add_tag, update_tag, and the frame/layer deletion siblings. It does not name a sibling for disambiguation, but the resource 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 use this versus update_tag (e.g. renaming a tag) or whether prerequisites exist. The agent must infer the use case purely from the verb and noun.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draw_imageA
Draws an image file (PNG, etc.) into a layer/frame at (x,y). mode 'blend' composites over existing pixels, 'copy' overwrites the area, 'replace' swaps the whole cel image. Optional source crop, scale or target size.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| file | Yes | ||
| mode | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| scale | No | ||
| width | No | ||
| height | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| opacity | No | ||
| blendMode | No | ||
| sourceRect | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by defining each mode's effect: 'blend' composites, 'copy' overwrites the area, 'replace' swaps the whole cel image. That is real behavioral disclosure for a mutating tool whose annotations only say readOnly=false/destructive=false. It does not mention undo/reversibility or that batch mode writes to disk, which would complete the picture.
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 action and destination, then mode semantics, then the optional transforms. Every clause adds information with 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 15-parameter mutation tool with no output schema and minimal annotations, the description covers the destination and modes but omits return/error behavior, undo implications, and the live-vs-batch save semantics. It is enough to attempt a basic call but not enough to use the tool confidently across backends.
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 low (33%), so the description must carry weight, and it does explain mode semantics plus the existence of source crop, scale and target size. However, it says nothing about x/y placement origin, opacity, blendMode, frame/layer/sprite resolution, or the save/batch distinction, leaving many of the 15 parameters undocumented in both places.
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 ('Draws an image file (PNG, etc.) into a layer/frame at (x,y)'), which implicitly separates it from draw_pixels, draw_shapes and draw_text by input type. No sibling is named explicitly, so an agent must infer the boundary rather than being told it.
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: you use it when you have an image file to place. There is no explicit 'use this instead of draw_pixels/draw_shapes when...' guidance, and no note about when live vs batch backend is required (only the schema covers backend/save).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draw_pixelsA
Sets individual pixels on a layer/frame (one undo step). Either 'pixels' as [[x,y,color],...] / [{x,y,color}], or pixel art as 'rows' of characters with a 'legend' mapping each character to a color; rows start at (x,y). Unmapped ' ' and '.' are skipped; map '.' to 'transparent' to erase. The cel grows as needed; pixels outside the canvas are dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left of the rows grid (default 0) | |
| y | No | Top of the rows grid (default 0) | |
| rows | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| blend | No | Alpha-blend over existing pixels instead of replacing | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| legend | No | ||
| pixels | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds genuinely useful behavior: a single undo step, the cel auto-growing, out-of-canvas pixels being silently dropped, and the '.'-to-transparent erase convention. It does not disclose what the tool returns or how errors surface, but the added context is well beyond the annotations.
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 tightly packed sentences: purpose first, then the two input forms, then edge-case rules. No filler, no repetition of the name or schema, and the erase convention is grouped with the mapping rules it belongs to.
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 an 11-parameter mutation tool with no output schema, the description covers the tricky invocation semantics (dual input formats, coordinate origin, erasure, clipping) well. It could say more about blend/save/batch mode and return behavior, but the schema fills those and the critical pixel-writing semantics are 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 coverage is 73%, so most parameters carry their own descriptions. The description still adds real meaning by explaining the pixels vs rows/legend duality, that rows start at (x,y), and the skip/mapping rules for ' ' and '.'. It leaves blend, save/batch, and backend semantics to 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+resource ("Sets individual pixels on a layer/frame") and immediately characterizes the scope with "one undo step." It distinguishes itself from drawing-oriented siblings (draw_shapes, draw_image, draw_text) by describing per-pixel vs grid input, though it never names an alternative tool 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 description effectively explains the two mutually exclusive invocation modes (explicit pixels vs rows+legend) and their semantics, which is real usage guidance. However, it gives no when-to-use-this-vs-draw_image/draw_shapes guidance and no prerequisite context for choosing a backend or frame/layer target.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draw_shapesA
Draws vector shapes with optional antialiasing: rect, rounded_rect, oval/ellipse, line, polyline, polygon, bezier (cubic, points = start then control1, control2, end per segment), or path (ops: move/line/cubic/close). Each shape is stroked (width) or filled. Antialiasing is off by default to keep hard pixel edges. For pixel-exact aliased shapes use_tool is closer to Aseprite's own tools.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | Default color for shapes without one | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| width | No | Default stroke width | |
| shapes | Yes | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| opacity | No | Opacity of the whole drawing when composited | |
| antialias | No | Default antialiasing (false) | |
| blendMode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations marking it as a non-read-only, non-destructive write, the description adds behavioral detail: antialiasing is off by default to preserve hard pixel edges, and each shape is stroked or filled. It stops short of describing save/write-back defaults or permission needs, but adds useful context beyond the annotations.
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-loads the purpose and supported shapes, then covers stroke/fill, antialiasing default, and sibling routing in three compact sentences with 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 complex, 11-parameter drawing tool, the description covers shape semantics and antialiasing well, and the schema covers most remaining parameters. It could mention save/write-back behavior or target frame/layer defaults more directly, but output schema absence is acceptable.
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 82%, so parameters are already well documented; the description still adds value by explaining bezier point ordering ('start then control1, control2, end per segment') and path op semantics. It leaves many top-level parameters (frame, layer, save, opacity, blendMode) to 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 ('Draws vector shapes') and enumerates all supported shape primitives, and it names use_tool as the alternative for pixel-exact aliased work, so an agent can distinguish its role from sibling drawing tools.
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?
Provides a clear routing rule for one alternative: pixel-exact aliased shapes should use use_tool. It does not compare against draw_pixels or draw_image, but it gives enough antialiasing context to decide when vector drawing is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draw_textA
Draws text onto a layer. In live mode it uses Aseprite's text renderer with any font Aseprite knows (its built-in 'Aseprite' pixel font, or an installed system font by name such as 'Arial'). In batch mode, or with font='builtin', it uses a built-in 5x7 pixel font that can be scaled by whole numbers. Multi-line text with \n is supported.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| font | No | 'builtin', 'Aseprite', or a system font name (live mode) | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| size | No | Font size for Aseprite/system fonts (default 6) | |
| text | Yes | ||
| align | No | Horizontal alignment relative to x | |
| color | No | Default black | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| scale | No | Integer scale for the builtin font | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| opacity | No | ||
| lineHeight | No | Other fonts: pixels from one line to the next | |
| lineSpacing | No | Builtin font: pixels between lines (default 1) | |
| measureOnly | No | Only return the text size, draw nothing | |
| letterSpacing | No | Builtin font: pixels between letters (default 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish only that this is a non-read-only, non-destructive mutate, so the description is free to add the more interesting behavioral detail: that rendering differs fundamentally between live and headless batch mode, and that font availability depends on the backend. It does not spell out persistence semantics (only the save param description hints at that) or error behavior, which keeps it below 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?
Three sentences, front-loaded with the purpose before mode-specific detail, with no filler or repetition of the tool name. The middle sentence is dense but each clause carries distinct information about renderer selection. Slightly compressed prose keeps it from a 5.
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 an 18-parameter mutation tool with no output schema, the description covers the single most consequential complexity: the live/batch split and its effect on fonts, scaling, and persistence. The remaining parameters (align, opacity, letterspacing, measureOnly) are adequately covered by schema descriptions. It could say more about what happens to the target layer/cel, but the essentials are present.
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 78%, so the baseline is already a 3, and the description earns above that by clarifying what font accepts ('builtin', Aseprite's pixel font, or a named system font) and that its effect is mode-dependent. It also documents multi-line support via \n, a behavior absent from the schema. It doesn't touch the remaining ~22% of undocumented parameters, so it is not 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?
Opening sentence gives a specific verb+resource ("Draws text onto a layer"), which cleanly separates it from draw_shapes and draw_pixels. It then explains the two rendering paths, adding precision about what "draw text" actually means here. It stops short of naming the sibling tools it competes with, so it lands at 4 rather than 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?
The description explains which mode triggers which font renderer (live vs batch, or font='builtin'), which implicitly tells the agent when each behavior applies. However, it gives no explicit guidance on when to prefer draw_text over draw_pixels/draw_image, nor any prerequisites such as needing a connected Aseprite for live mode. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_layerB
Duplicates a layer with all its cels.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds one behavioral fact beyond annotations — that cels are carried along — but says nothing about whether the duplicated cels are linked or independent (relevant given the link_cels sibling), how the new layer is named, or how it interacts with the save/backend mode.
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 with no waste and the core action front-loaded. It is arguably under-specified rather than over-verbose, so it does not reach a 5.
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 mutation tool with five parameters, no output schema and no required fields, the description is too thin: it omits how the copy is named, whether it lands on the active layer context, and how save/backend defaults affect the write. The schema and annotations carry most of the load, leaving the description incomplete.
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 80%, so the schema already documents 'save', 'layer', 'sprite', and 'backend' thoroughly. The description adds no parameter-level detail beyond the implicit cels scope, so the baseline of 3 is appropriate.
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 ('Duplicates a layer') and adds scope ('with all its cels'), so the agent knows exactly what the operation produces. It does not, however, distinguish itself from neighboring tools such as duplicate_sprite, copy_cel, or add_layer.
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 copy_cel, link_cels, add_layer, or duplicate_sprite, and no mention of prerequisites or context. The agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_spriteB
Makes a copy of a whole sprite (all layers, frames, tags, slices). In batch mode 'file' is required.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so safety is covered; the description usefully adds that the copy spans all layers/frames/tags/slices. However, it says nothing about where the copy lands, how it is named, or what handle the agent gets back for the new 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 tight sentences with the purpose front-loaded and the batch constraint second. No filler, though the second sentence is somewhat redundant with the schema.
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 output schema, the description should explain what the caller receives (e.g. the new sprite's id/name) so the copy can be referenced; that is missing. For a 3-param duplication tool it is adequate but leaves this practical 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 67%, and the 'sprite' param description already states 'Batch mode needs a file path,' so the description's 'file is required in batch mode' largely restates schema content rather than adding new meaning. The undocumented 'file' parameter still lacks format details.
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 ('makes a copy') and resource ('a whole sprite') and enumerates scope (all layers, frames, tags, slices). The phrase 'whole sprite' implicitly distinguishes it from the sibling duplicate_layer, though it never names that sibling 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 only guidance is the conditional 'In batch mode file is required,' which is parameter usage rather than tool-selection guidance. It never says when to prefer duplicate_sprite over new_sprite, duplicate_layer, or open_sprite, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportA
Exports a copy of the sprite to any format (png, gif, webp, jpg, bmp, tga, pcx, ico, qoi, flc, svg, css, ...). Options: scale, a tag or a 1-based frame range, a slice, specific layers, or a filename template like 'out_{frame}.png' ({frame} counts from 0). Single-image formats with several frames get one file per frame (name1.png, name2.png..., or starting from a trailing number in the name); the result lists every file written.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| file | Yes | ||
| scale | No | ||
| slice | No | ||
| aniDir | No | ||
| bounds | No | ||
| layers | No | Export only these layers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| toFrame | No | ||
| fromFrame | No | ||
| ignoreEmpty | No | ||
| playSubtags | No | ||
| filenameFormat | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, but the description adds real behavioral context beyond them: single-image formats emit one file per frame, the trailing-number / templated naming scheme, and that the result lists every file written. It stops short of stating overwrite semantics or permission needs, but it is well above the annotation-only bar.
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 sentences, purpose front-loaded, with the options and the multi-file output behavior packed into the following sentences. Dense but every sentence carries information; 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 14-parameter tool with a nested bounds object, two enums, and no output schema, the description usefully explains the return ('lists every file written') but leaves multiple parameters unexplained. It is adequate but not complete enough to call all 14 params correctly.
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 only 21%, so the description must carry the load; it explains scale, tag, 1-based frame range, slice, layers, and the filename template ({frame} counting from 0), which maps to several parameters. It still leaves bounds, aniDir, ignoreEmpty, and playSubtags undocumented in both schema and description, so it only partially compensates for the coverage 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 gives a specific verb and resource ('Exports a copy of the sprite') plus the output surface ('any format' with a format list), so an agent immediately knows this writes image files. It does not, however, differentiate from the very close sibling export_sprite_sheet or save_sprite, leaving the agent to infer the boundary.
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 enumerates the options (scale, tag, frame range, slice, layers, filename template), which implies how to use the tool, but never states when to reach for it over export_sprite_sheet, render_preview, or save_sprite, and offers no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_sprite_sheetB
Exports a sprite sheet image plus optional JSON data (File > Export Sprite Sheet). Supports layouts, padding, trimming, extrusion, splitting by layers/tags, tilesets, and listing layers/tags/slices in the JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| rows | No | ||
| trim | No | ||
| type | No | ||
| layer | No | ||
| width | No | ||
| height | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| columns | No | ||
| extrude | No | ||
| listTags | No | ||
| splitGrid | No | ||
| splitTags | No | ||
| dataFormat | No | ||
| listLayers | No | ||
| listSlices | No | ||
| trimByGrid | No | ||
| trimSprite | No | ||
| ignoreEmpty | No | ||
| splitLayers | No | ||
| dataFilename | No | ||
| fromTilesets | No | ||
| innerPadding | No | ||
| shapePadding | No | ||
| borderPadding | No | ||
| tagnameFormat | No | ||
| filenameFormat | No | ||
| powerOfTwoSize | No | ||
| mergeDuplicates | No | ||
| textureFilename | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, which is consistent with a file-writing export. The description adds useful context by disclosing that output is an image plus optional JSON data with various feature toggles, but says nothing about where files land, whether existing files are overwritten, or the required textureFilename 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 tightly written sentences with the core purpose front-loaded and the menu path and capability list following. No filler, though the capability list is dense.
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 31-parameter, side-effectful export with no output schema and near-zero schema coverage, the description is too thin. It omits the required textureFilename role, output destination conventions, and interaction between the many layout/split/trim options.
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 only 6% across 31 parameters, so the description carries real weight. It usefully groups features (layouts, padding, trimming, extrusion, splitting by layers/tags, tilesets, listing layers/tags/slices) that map to parameters like type, innerPadding/shapePadding/borderPadding, trim, extrude, splitLayers/splitTags, fromTilesets, and listLayers/listTags/listSlices, but gives no per-parameter semantics or formats.
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 (Exports) and resource (sprite sheet image plus optional JSON data), and references the exact menu path File > Export Sprite Sheet. It clearly conveys the resource and output shape, though it never explicitly distinguishes itself from the sibling generic 'export' tool.
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 offers no when-to-use guidance, no exclusions, and no mention of the sibling 'export' or 'import_sprite_sheet' tools. An agent must infer that this is the sprite-sheet-specific path from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flip_rotateB
Flips and/or rotates the whole sprite, the active cel(s) of a layer/frame, or the selection.
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| rotate | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| target | No | ||
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is known. The description adds the operation's scope targets but is silent on whether edits are applied live vs. batched, whether they are undoable, and how flip and rotate combine in a single call. Some useful behavioral context, but notable gaps remain.
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 with the operation front-loaded and the affected targets enumerated. No filler, though the enumeration could be slightly better ordered by default scope.
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 an 8-parameter mutation tool with no output schema and 63% schema coverage, the description is barely adequate. It never addresses the live-vs-batch distinction, the save behavior, or how simultaneous flip+rotate are applied, leaving an agent to rely on parameter descriptions alone.
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 63% and the schema itself documents the key ambiguities (save defaults true, frame defaults, layer/sprite resolution, backend auto). The description's scope sentence loosely mirrors the target enum but adds no format, ordering, or default information beyond the schema. Baseline 3 is appropriate when the schema carries most of the burden.
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 pair (flips/rotates) and names the resources it affects (whole sprite, active cel(s) of a layer/frame, or the selection). An agent immediately understands the operation and its scope. It doesn't explicitly distinguish itself from siblings, but no sibling overlaps this transform operation.
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 lists the three operation scopes, which implies when to use the tool, but gives no explicit when-to-use guidance, prerequisites, or alternatives. The caller must infer how target selection interacts with the other parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_celsARead-only
Lists cels (layer/frame pairs with images) with bounds, opacity, z-index and data, filtered by layer and frames.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last frame of a range | |
| tag | No | Use the frames of this tag | |
| from | No | First frame of a range | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| frames | No | 'all' or a list of frame numbers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuine value beyond that by enumerating the returned fields (bounds, opacity, z-index, data), which matters because there is no output schema, and by stating that results are filtered by layer and frames.
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 that names the operation, defines the resource, lists the returned data, and states the filtering dimension 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?
For an 8-parameter read tool with no output schema, the description supplies the return shape and the filtering scope, while the schema carries all parameter defaults and constraints. It does not discuss batch-mode caveats or volume/pagination limits, so it is solid but not exhaustive.
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 100%, and the schema already documents defaults, allowed values, and formats for all 8 parameters. The description's 'filtered by layer and frames' merely restates a subset of those parameters without adding syntax or format detail, so baseline 3 is correct.
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 ('Lists') and resource ('cels'), and defines a cel as a layer/frame pair with images, which clearly separates it from the sibling mutators update_cel, delete_cel, copy_cel and link_cels. It does not name a sibling explicitly, 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?
The read-only listing intent is implied by 'Lists' and the annotations, but the description gives no explicit when-to-use guidance, no exclusions, and does not point to alternatives such as get_pixels or get_sprite_info. 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.
get_paletteBRead-only
Returns the sprite palette as '#rrggbbaa' colors (index 0 first).
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe read (readOnlyHint=true, destructiveHint=false), so the bar is lower. The description usefully contributes the output format '#rrggbbaa' and ordering ('index 0 first'), but says nothing about live-vs-batch behavior or failure modes beyond what the schema's backend description provides.
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 that delivers purpose and return format 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?
For a simple read-only getter with no output schema, stating the color format is the most important missing piece and it is present. However, the ambiguous index parameter and unstated relationship between returned indices and the index input leave 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 67%; the sprite and backend params are documented in the schema, but index has no description. The description's '(index 0 first)' refers to the returned color ordering, not the index parameter, and with index minimum=1 the 0-vs-1 indexing distinction is left ambiguous.
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 verb and resource ('Returns the sprite palette') and adds the return format, which cleanly separates it from set_palette, save_palette, and palette_edit. It does not explicitly name a sibling alternative, 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?
There is no when-to-use guidance and no reference to alternatives such as get_sprite_info or palette_edit. Usage is only implied by the verb 'Returns'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pixelsARead-only
Reads pixels of the rendered frame (all visible layers) or of one layer. Default format 'legend' returns rows of characters plus a legend of colors ('.' = transparent); 'hex' returns a grid of '#rrggbbaa' (null = transparent). Indexed sprites return palette indices.
| Name | Required | Description | Default |
|---|---|---|---|
| rect | No | ||
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Read only this layer (default: the composited frame) | |
| format | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| maxPixels | No | Safety limit on area (default 16384) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral detail about output shape (character rows + legend vs '#rrggbbaa' grid, transparency markers, indexed sprites returning palette indices), but says nothing about the maxPixels safety limit or failure conditions.
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?
Purpose is front-loaded in the first clause, and the format semantics follow in compact clauses. Every sentence carries information; the density is high with 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?
With no output schema, the description correctly takes on the burden of describing return values, which it does for both formats and for indexed sprites. For a 7-parameter, all-optional read tool this is close to complete, with only the maxPixels limit behavior left implicit.
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 71%, and the description meaningfully extends the 'format' enum by explaining what each mode returns (legend characters plus color legend with '.' = transparent; hex grid with null = transparent). It also clarifies composited-frame vs single-layer reading, though it leaves rect, frame, backend, and maxPixels to 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 ('Reads') and resource ('pixels'), and scopes it to the rendered frame across all visible layers or a single layer. The read counterpart to draw_pixels is distinguishable from the verb alone, though no sibling is named 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?
Implies the read use case and offers a scope choice (whole frame vs one layer), but gives no explicit when-to-use vs alternatives like draw_pixels, get_cels, or render_preview, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sprite_infoARead-only
Returns a sprite's full structure: size, color mode, frames and durations, layer tree (with opacity, blend mode, visibility...), tags, slices, tilesets, palette size, grid, selection and active layer/frame.
| Name | Required | Description | Default |
|---|---|---|---|
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| includeCels | No | Also list every cel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, read-only operation. The description goes beyond that by detailing the return structure (size, color mode, frames, layer tree, tags, slices, tilesets, palette size, grid, selection), which is valuable because there is no output schema. It does not discuss live-vs-batch output differences, but that is handled in the schema.
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 sentence with the main purpose front-loaded, followed by an efficient colon list. It is appropriately sized for a read tool and avoids 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?
With no output schema, the description compensates by enumerating the returned structure, and annotations cover safety. The schema handles parameters completely. Minor gaps remain around how live vs batch mode affects the returned structure, but the description is largely complete for this read 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 100%, so the schema fully documents sprite, backend, and includeCels. The description adds no parameter-level meaning beyond what the schema already provides, making the baseline 3 appropriate.
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 ('Returns a sprite's full structure') and enumerates the returned fields, making the tool's scope clear. It does not explicitly distinguish itself from overlapping siblings like list_sprites, get_cels, or get_palette, 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?
Offers no when-to-use guidance, no prerequisites, and no alternatives such as list_sprites or get_palette. The schema handles parameter defaults, but the description itself provides no routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_sprite_sheetB
Opens an image and slices it into frames (File > Import Sprite Sheet). Optionally saves the result.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| file | Yes | ||
| type | No | ||
| saveAs | No | Save the imported sprite here (needed in batch mode) | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| padding | No | ||
| frameWidth | Yes | ||
| frameHeight | Yes | ||
| partialTiles | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is partly covered. The description adds that saving the result is optional, which is useful beyond the annotations, but it says nothing about the live vs batch backend behavior, failure modes, or what the slicing produces.
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 short, front-loaded sentences with no filler; the operation is stated first and the save caveat second. It is efficient, though perhaps terse given the tool's complexity.
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 10 parameters at 20% schema coverage, no output schema, and a write-capable operation, the description is too thin. An agent lacks guidance on the frame-grid parameters, the meaning of type, and how the optional save interacts with batch mode.
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 only 20% across 10 parameters; saveAs and backend are the only documented ones, and the description touches saveAs only obliquely ('Optionally saves the result'). Critical params like frameWidth, frameHeight, type, x/y, padding, and partialTiles are unexplained in both schema and description, so the description does not compensate for the coverage 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?
States a concrete verb+resource: opens an image and slices it into frames, with the parenthetical menu path (File > Import Sprite Sheet) anchoring it. This distinguishes it from siblings like open_sprite and export_sprite_sheet, though it doesn't name those alternatives directly.
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 by the UI menu reference and the note that saving is optional, but there is no explicit when-to-use guidance, no statement of when to prefer this over open_sprite or export_sprite_sheet, and no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_extensionA
Copies the bridge extension into Aseprite's user extensions folder. A running Aseprite must be restarted to load it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false. The description adds genuine behavioral context: the copy destination (user extensions folder) and the non-obvious prerequisite that a running Aseprite must be restarted to load it. It does not state overwrite behavior or whether the extension source is bundled.
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, zero waste. The core action is front-loaded and the restart caveat follows immediately as the second sentence.
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 no-param, no-output mutation, the description covers what happens and the restart requirement. It stops short of noting whether an existing installed extension is overwritten, which would matter on re-runs.
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?
The tool takes zero parameters, so per the baseline there is nothing for the description to disambiguate. The description correctly implies no inputs are required.
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 ('Copies') and a precise resource ('the bridge extension into Aseprite's user extensions folder'). An agent can tell exactly what this does. No sibling is close enough to require explicit differentiation.
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 — install the extension when you need the bridge. There are no explicit when-to-use/when-not-to-use cues and no named alternatives (e.g., relaunching vs installing), leaving the agent to infer the trigger.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launch_asepriteA
Starts the Aseprite GUI with the bridge extension and waits for it to connect, enabling live mode. The first time, Aseprite asks to allow the script's network and file access; tick 'Give full trust' / 'Don't show again' in that dialog.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Optional sprite file to open | |
| waitSeconds | No | How long to wait for the bridge (default 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false, so the description carries the rest and does so well: it discloses that an external GUI process is spawned, that it blocks waiting for a connection, and that a trust dialog requires human interaction the first time. That interactive-friction detail is exactly the kind of context an agent needs and cannot get from structured fields.
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, front-loaded with the primary action and effect before the first-run caveat. Every clause earns its place.
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?
There is no output schema, and the description covers what the tool does, the blocking wait, and the first-run trust prompt. It stops short of saying what happens on connection timeout or what state the bridge is left in on failure, which would matter for a long-running launch step.
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 100%, so both parameters (file, waitSeconds with min/max and default) are already documented in the schema. The description adds nothing about either, which is acceptable given the coverage but earns only the baseline.
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 ('Starts the Aseprite GUI with the bridge extension') plus the outcome ('waits for it to connect, enabling live mode'). No sibling tool does this, and the description makes the launcher/setup role unmistakable versus tools like use_tool, cli, or status.
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 context is implied: this must be done to enter live mode, and the 'The first time...' clause signals a one-off setup step. However, it never says when to prefer this over adjacent tools such as install_extension or cli, nor what to do if launch/connect fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_celsA
Links cels so several frames share one image (edits to one show in all), or unlinks them. Linking needs live mode. Unlinking works in both modes.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last frame of a range | |
| tag | No | Use the frames of this tag | |
| from | No | First frame of a range | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| action | No | ||
| frames | No | 'all' or a list of frame numbers | |
| layers | No | Several layers at once | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds real behavioral context beyond that: the mode requirement for linking vs unlinking, and the side effect that edits to one frame propagate to all linked frames. It does not explain failure modes or reversibility, so not 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?
Three short sentences: purpose first, then the mode constraints. Every sentence earns its place and the most important information is front-loaded with 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?
With 11 parameters but 0 required and 91% schema coverage, the schema carries the parameter burden. The description covers purpose, side effects, and mode constraints, which is enough to call it correctly, though it could say more about how the many range/frame/layer parameters combine.
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 91%, so the schema already documents the parameters (from/to ranges, tag, frames, layers, save, etc.) in detail. The description adds no parameter-level meaning, so the baseline of 3 applies.
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 a specific verb+resource (link/unlink cels) and goes further by explaining the semantic effect: 'several frames share one image (edits to one show in all)'. That is clear and unambiguous. It does not explicitly differentiate itself from siblings like copy_cel or update_cel, 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?
It gives an operational constraint ('Linking needs live mode. Unlinking works in both modes') which implies when each action is available, but offers no routing guidance versus alternatives such as copy_cel or update_cel. Usage context 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.
list_commandsARead-only
Lists Aseprite commands usable with run_command, with their parameters (extracted from the Aseprite source).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Case-insensitive filter on name/description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this as a safe read, so the description need not restate safety. It does add one useful behavioral fact — the command data is extracted from Aseprite source, implying a static snapshot rather than live introspection — but says nothing about result size, pagination, or whether the list is version-specific.
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 that names the resource, the tool it pairs with, and the provenance of the data. No filler or redundant restatement of the name.
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 one-parameter read-only listing with a fully documented schema and no output schema, the description is nearly sufficient: it tells the agent results include command parameters and where that data comes from. Minor gaps remain around result volume and whether the snapshot can go stale, but nothing essential to correct invocation is missing.
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 100%, so the single optional query parameter (case-insensitive filter on name/description) is already fully documented. The description's mention of 'with their parameters' refers to returned data, not the input parameter, so it adds no meaning beyond the schema. Baseline 3 applies.
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 ('Lists Aseprite commands') and ties them to the consuming tool, run_command, which distinguishes it from nearby tools like run_lua or api_docs. The parenthetical about provenance adds a little scope detail, though it does not explicitly contrast with its closest 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?
Usage is implied: the description references run_command, so an agent can infer this is a discovery step before invoking a command. However, there is no explicit when-to-use statement, no mention of when api_docs or run_lua would be preferable, and no guidance on whether the listing is exhaustive or how to narrow results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_preferencesARead-only
Lists Aseprite preference sections and options (from pref.xml) for use with the preferences tool.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Only this section, e.g. 'grid' or 'tool_box' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds that data comes from pref.xml, a useful provenance detail, but does not cover return format or the discovery-then-set workflow. With annotations covering the safety profile, a 3 is appropriate.
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 with no filler, front-loading the verb and resource. Every clause earns its place.
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 simple read-only list with no output schema, the description is sufficient: it says what is listed and where it comes from, and annotations carry the safety profile. Only the lack of any note on result structure or the follow-up workflow 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 description coverage is 100%, so the single 'section' filter is fully documented in the schema. The description adds no additional parameter meaning, making the baseline 3 correct.
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: lists Aseprite preference sections and options, and names the source (pref.xml). It points to the companion 'preferences' tool, which differentiates it somewhat from that sibling, though it doesn't contrast against other list_* tools.
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 'for use with the preferences tool' implies this is a discovery step preceding the mutation tool, which is useful context. But it never states when to call it versus alternatives or when it is not needed, leaving usage largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spritesBRead-only
Lists sprites open in Aseprite.
| Name | Required | Description | Default |
|---|---|---|---|
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds only the 'open' scoping constraint; it says nothing about return format, ordering, or how the backend parameter changes 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?
A single front-loaded sentence with zero filler. It is appropriately sized for the scope, though it is arguably too bare rather than too verbose.
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 list tool with no output schema, the description never indicates what is returned (names, ids, count, active sprite). Combined with no usage guidance, the agent is left guessing about the result shape and when to reach for this versus get_sprite_info.
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 100%, so the 'backend' enum (auto/live/batch) is already documented in the schema, including the auto default. The description adds no extra meaning, which is the correct baseline when the schema does the heavy lifting.
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?
Clear verb+resource: 'Lists sprites open in Aseprite' tells an agent exactly what it returns at a high level. The scope word 'open' usefully narrows it from sprites-on-disk tools, but it does not distinguish itself from near-siblings like get_sprite_info or list_commands.
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 when-to-use guidance, no exclusions, and no mention of alternatives such as get_sprite_info or app_state. The agent must infer from the name alone that this is a discovery step rather than a detail-fetch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_layersADestructive
Merges a layer into the one below (mode='down'), flattens all layers ('flatten'), or flattens only visible layers ('visible').
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine context by specifying what destruction occurs — a layer is collapsed into the one below, or all/visible layers are flattened — which tells the agent the layer structure is lost. It stops short of mentioning undo-ability or irreversible side effects.
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 three parallel clauses, no filler, and the core verb stated first. Every clause earns its place by defining a mode.
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, but the description need not explain return values for a mutation. Combined with 80% schema coverage and destructive annotations, the definition gives enough to invoke correctly; only undo/reversibility context is absent.
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 80%, so most parameters are documented structurally, but the 'mode' enum is listed bare in the schema with no value descriptions. The description supplies the missing semantics for all three enum values, adding real meaning beyond 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?
The description states a specific verb (merges/flattens) and resource (layers), and enumerates the three mode behaviors, so an agent knows exactly what each invocation does. It does not explicitly differentiate itself from layer-manipulation siblings such as convert_layer or delete_layer, which keeps it 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?
The three modes are described, which implies the conditions for each, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g. when to flatten vs. use convert_layer). Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_frameC
Moves a frame (with its cels) to another position.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only and non-destructive, so safety is partly covered, and the description usefully discloses that cels move with the frame. It says nothing about undo behavior, whether the source position is closed up or left empty, or how the live/batch backends affect the operation, all of which matter for a reordering mutation.
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 short sentence with no filler, front-loading the verb and resource. It is efficient, though arguably terse to the point of underspecification for a 5-parameter 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?
For a mutation tool with five parameters, no output schema, and only safety-hint annotations, the description is far too thin. It omits sequencing effects, undo/rollback behavior, the significance of the save/backend parameters, and return/error expectations.
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 only 60%, and neither required parameter (from, to) has a schema description beyond minimum: 1. The description's phrase 'another position' hints these are positional indices but does not clarify whether they are frame numbers, ordering indices, or 1-based, so it fails to compensate for the 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?
States a specific verb (moves) and resource (a frame with its cels) and adds the meaningful detail that contained cels travel with the frame. It does not, however, distinguish itself from sibling frame tools such as add_frames, delete_frames, or set_frame_duration, leaving the agent to infer the distinction.
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 when-to-use guidance, no mention of prerequisites, and no comparison to alternative frame operations like delete_frames + add_frames or copy_cel. The agent must guess at the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_spriteB
Creates a new sprite. In batch mode 'file' is required (the sprite is saved there).
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Save to this path (.aseprite keeps layers/frames) | |
| width | Yes | ||
| frames | No | ||
| height | Yes | ||
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| palette | No | Colors, or {preset:'DB32'} / {file:'pal.gpl'} | |
| colorMode | No | ||
| layerName | No | ||
| background | No | Fill the first layer with this color | |
| backgroundLayer | No | Turn the first layer into a Background layer | |
| frameDurationMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is covered. The description adds a genuinely useful batch-mode constraint (file required, sprite saved there), but says nothing about the live-vs-batch execution difference, failure modes, or state side effects.
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 short sentences with zero filler, and the primary purpose is front-loaded before the conditional constraint. Nothing to trim.
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 an 11-parameter creation tool with 45% schema coverage and no output schema, the description is thin. It addresses only 'file' and leaves the agent to infer defaults, backend behavior, and the meaning of most creation options.
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 only 45%, so the description should compensate. It clarifies the batch-mode requirement for the 'file' parameter beyond the schema's 'Save to this path' note, but 9 other parameters (frames, colorMode, layerName, frameDurationMs, etc.) get no description-level help. Partial compensation only.
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 ('Creates a new sprite'), which is clearly distinct from sibling tools like open_sprite and duplicate_sprite. It does not explicitly name those alternatives, so it falls short of the top mark.
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 only contextual guidance is the batch-mode 'file' requirement. There is no indication of when to use this versus open_sprite (existing file) or duplicate_sprite, nor any prerequisites for the live backend.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_spriteARead-only
Opens a sprite file (any format Aseprite reads: .aseprite, .png, .gif, .jpg, .webp, .bmp, .tga, .pcx, .ico, .flc, .qoi, .psd...) and returns its structure. In live mode it opens a tab.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| oneFrame | No | Load only the first frame |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds two useful facts: it returns the sprite's structure, and in live mode it opens a tab (a visible side effect). It says nothing about failure modes, unsupported-format errors, or persistence, so it adds only modest value over the annotations.
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 compact sentences, front-loaded with the core action and supported formats, then the live-mode caveat. 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?
There is no output schema, yet 'returns its structure' leaves the return shape vague for a tool whose main purpose is inspection. Combined with partial parameter coverage, an agent knows how to call it but not fully what to expect back.
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 67% schema description coverage, the schema already explains backend (auto/live/batch) and oneFrame, and the required 'file' is self-evident. The description adds no syntax, path, or format constraints beyond what the schema provides, so baseline 3 applies.
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 ('Opens a sprite file') and enumerates accepted formats, which is genuinely informative. It implicitly distinguishes itself from new_sprite (create) and list_sprites (enumerate), but never names or contrasts those siblings 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 'live mode opens a tab' clause hints at when the live path applies, and the backend parameter's enum/description in the schema carries the auto/live/batch logic. There is no explicit guidance on when to choose this over new_sprite, list_sprites, or get_sprite_info, so usage remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_editA
Edits the palette structure: add or insert colors, remove entries, move entries, sort (by hue, saturation, value, lightness, luminance, red, green, blue, alpha), reverse a range, generate a ramp between two colors, or dedupe. In indexed sprites pixels are remapped so they keep their colors (set remapPixels=false to skip); pixels using removed colors move to the nearest remaining one.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | insert/ramp: target index (default end) | |
| by | No | ||
| to | No | Range end, or the destination index for move | |
| from | No | Range start for remove/move/sort/reverse | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| space | No | ramp interpolation (default rgb) | |
| steps | No | ||
| action | Yes | ||
| colors | No | add/insert | |
| insert | No | ramp: insert instead of overwriting entries | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| indices | No | remove/move: entries to act on | |
| toColor | No | ramp end | |
| fromColor | No | ramp start | |
| descending | No | ||
| remapPixels | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds genuinely useful behavior context beyond that — indexed-sprite pixels are remapped to preserve their colors, and pixels whose colors are removed fall back to the nearest remaining entry. It still omits whether the palette is persisted by default or how failures surface, but the remap semantics are substantial added value.
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, front-loaded with the core verb and the full action inventory, then the side-effect caveat. The long parenthetical sort-key list is bulky but each operation enumerated is load-bearing for action selection.
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 17-parameter mutation tool with no output schema, so the description carries more burden than it does. It covers the action space and the key side effect well, but says nothing about return shape, save/persistence defaults, or error behavior, which leaves gaps an agent must 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?
Schema description coverage is 71% and the schema already documents most parameters including per-action applicability. The description contributes the sort key list (matching the 'by' enum), the remapPixels side effect, and the action vocabulary, but leaves many of the 17 parameters (save, backend, steps, insert, sprite, descending) solely to schema text.
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 (Edits) and resource (palette structure) and enumerates the eight discrete operations, so an agent immediately knows the action space. It does not, however, distinguish itself from adjacent palette siblings like set_palette, get_palette, or save_palette, leaving that routing inference to the reader.
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 action list and one parameter-level hint ('set remapPixels=false to skip'). There is no explicit when-to-use guidance, no statement of when to prefer set_palette/replace_color instead, and no stated prerequisites for choosing between live and batch backends beyond what the schema says.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preferencesA
Gets or sets an Aseprite preference (app.preferences..), a tool preference (tool=) or a per-sprite document preference (document=true). Use list_preferences to discover names.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | Read tool preferences for this tool id | |
| value | No | ||
| action | Yes | ||
| option | Yes | Option name; nested options use dots, e.g. 'brush.size' with section from the tool prefs | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| section | Yes | ||
| document | No | Read the sprite's document preferences |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the agent knows the tool can mutate but is not flagged destructive; the description is consistent with this. The description adds useful context by disclosing the three modes of operation and the dotted addressing scheme, but says nothing about persistence, what a 'set' overwrites, or default behavior beyond what the schema's backend description already covers.
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 verb, then a compact parenthetical enumeration of the three modes, followed by a single routing sentence. Both sentences earn their place, though the dense parentheticals make it slightly terse.
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 8 parameters, no output schema, and moderate schema coverage, the description covers the addressing modes but does not describe what a 'get' returns or how values are interpreted on 'set'. It routes to list_preferences for names but leaves the return/behavior contract underspecified.
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 63%, a moderate baseline. The description clarifies how section and option combine (dotted nesting) and maps tool=<id> and document=true to their respective parameters, adding some meaning. However, the schema already documents tool, option, sprite, backend, and document, so the description largely restates the addressing modes rather than filling the uncovered params (section, value).
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 pair (gets or sets) and resource (Aseprite preference), and explicitly enumerates three addressing modes: app preference via app.preferences.<section>.<option>, tool preference via tool=<id>, and per-sprite document preference via document=true. It names the sibling list_preferences as the discovery counterpart, aiding differentiation, though it doesn't contrast against other 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?
Provides a clear routing instruction: 'Use list_preferences to discover names,' which points the agent to the alternative for enumeration. Usage is implied by the get/set duality, but no explicit when-not or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propertiesA
Gets, sets, deletes or replaces custom properties on a sprite, layer, cel, tag, slice, tileset or tile. With pluginKey ('publisher/extension') it reads/writes that extension's properties instead of the user properties.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| keys | No | delete: property names | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| index | No | Tile index for target=tile | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| slice | No | ||
| action | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| target | No | ||
| values | No | ||
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| tileset | No | ||
| pluginKey | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation profile is partly covered. The description adds real context beyond that: the resource scope and the pluginKey scoping semantics. It is silent on what actually happens in batch vs live mode, whether deletes are reversible, and the effect of the save flag, leaving meaningful behavior undisclosed for a delete-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?
Two tight sentences with no filler, and the core CRUD purpose plus the pluginKey caveat are both front-loaded. Every clause carries 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 14-parameter, zero-required CRUD tool with no output schema, the description covers the shape of the operation but not the matrix that matters: how action maps to keys/values/target, or how batch mode and save behave. It is adequate to recognize the tool but thin 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 50% across 14 parameters, so the schema documents roughly half. The description only adds meaning for pluginKey (the 'publisher/extension' string format), which the bare schema lacks. Nothing explains how action interacts with keys/values/target, which is the core parameter logic.
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 specific verbs (gets/sets/deletes/replaces) and a specific resource (custom properties), and enumerates the exact target set (sprite, layer, cel, tag, slice, tileset, tile). It is clear what the tool does, but it never distinguishes itself from the sibling set_sprite_properties, which overlaps on sprite-level property writes.
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 a concrete usage branch for pluginKey ('publisher/extension' reads/writes an extension's properties instead of user properties), which is genuinely helpful. However it offers no when-to-use/when-not guidance relative to siblings like set_sprite_properties, and no prerequisite or mode-selection advice for the action/target combination.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_eventsARead-only
Live mode: returns what happened in Aseprite since a sequence number: sprite changes (including undo/redo), switching sprite/layer/frame, commands run, and color changes. Events caused by MCP calls are hidden unless includeMcp is true. Pass the returned lastSeq as 'since' next time.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | ||
| types | No | ||
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| includeMcp | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds behavior the annotations cannot: MCP-caused events are suppressed unless includeMcp is set, and the tool is a sequence-number-based polling stream that echoes back a lastSeq cursor. That is meaningful operational context beyond structured fields.
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, front-loaded with the core purpose before the filtering caveat and the cursor instruction. No filler and nothing repeated from the schema or annotations.
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, but the description proactively discloses the return cursor (lastSeq) and the polling loop, which is the key thing an agent needs to consume this tool correctly. Remaining gaps – limit/pagination behavior and ordering guarantees – are minor for a read-only event feed backed by annotations.
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 only 20% (only 'backend' is documented in the schema), so the description must compensate and largely does: it explains the includeMcp toggle and the since cursor semantics, and its event list maps onto the types enum values (sprite_change, command, fg_color, bg_color). It leaves limit and the precise meaning of site_change unexplained, keeping it below 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 description names a specific verb and resource – it returns the event stream of what happened in Aseprite since a sequence number, and enumerates the event categories (sprite changes, undo/redo, layer/frame switches, commands, colors). That is far more than a restatement of the name. It does not, however, explicitly contrast itself with plausibly overlapping siblings like status, app_state, or get_sprite_info, 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?
Usage is implied rather than stated: 'Live mode' and the polling instruction ('Pass the returned lastSeq as since next time') tell the agent how to drive the tool iteratively, which is genuinely useful. But there is no explicit when-to-use versus when-not, and no sibling alternatives are named (e.g. app_state for a snapshot vs this for an incremental stream).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_previewARead-only
Renders frames as an image you can look at (nearest-neighbor upscaled, transparency shown as a checkerboard). Multiple frames are laid out in a grid in frame order. Use this after edits to check the result.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last frame of a range | |
| tag | No | Use the frames of this tag | |
| crop | No | Only this area of the rendered strip | |
| from | No | First frame of a range | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Render only this layer (default: all visible layers) | |
| frames | No | 'all' or a list of frame numbers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| columns | No | ||
| maxSize | No | Longest side of the preview (default 512) | |
| pixelGrid | No | Faint lines between pixels at high zoom (default true) | |
| checkerboard | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds genuinely useful behavior the annotation cannot: nearest-neighbor upscaling, checkerboard transparency, and grid layout in frame order. It still says nothing about size limits, backend fallback behavior, or cost of rendering many frames.
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 with no waste; the rendering behavior is front-loaded and the call-to-action follows. Every clause carries 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 13-parameter tool with no output schema, describing the returned image is valuable and mostly compensates for the missing output schema. However, the description never disambiguates the overlapping selection modes (frame vs frames vs from/to vs tag), which is the main usability gap given the parameter complexity.
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 85%, so the schema already documents nearly every parameter including the backend enum and crop object. The description only loosely connects to parameters via 'laid out in a grid in frame order' (columns/frames). Baseline 3 is appropriate when the schema does the heavy lifting.
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 ('renders frames as an image you can look at') and clarifies the render style, distinguishing it from file-producing siblings like export or export_sprite_sheet. It stops short of explicitly naming an alternative tool, so it lands at 4 rather than 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 this after edits to check the result' supplies clear situational context for when to reach for this tool. There are no exclusions or named alternatives (e.g., vs. export), so it clears the 'clear context, no exclusions' bar but not the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_colorB
Replaces one color with another on a layer (or all layers) across frames, with optional per-channel tolerance (RGB).
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| tag | No | Use the frames of this tag | |
| from | Yes | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| frames | No | 'all' or a list of frame numbers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| tolerance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only but not destructive. The description adds scope details (layer/all layers, across frames) and optional tolerance, but it does not disclose important behavioral context such as save-side effects, undo behavior, or batch/live mode differences. No annotation contradiction is present.
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 conveys the core operation without redundant or filler text. Every phrase contributes to understanding what the tool does.
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 tool with 10 parameters and no output schema, the description provides only a minimal operational summary. It is adequate because the schema covers most parameters, but it omits usage guidance and behavioral implications that would help an agent invoke the tool confidently.
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 80%, so most parameter meaning is already provided structurally. The description adds minimal parameter context by mentioning per-channel RGB tolerance and layer/frame scope, but it does not substantially extend 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?
The description states a specific verb (replaces), resource (color), and scope (on a layer or all layers across frames). It is clear what the tool does, but it does not explicitly distinguish itself from sibling tools such as palette_edit or draw_pixels.
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 gives no explicit guidance on when to use this tool instead of alternatives. It only describes the operation itself, leaving the agent to infer whether replace_color is preferable to palette_edit, draw_pixels, or other color-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resize_spriteB
Scales the whole sprite (all layers and frames). Give width and/or height, or scale.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| scale | No | ||
| width | No | ||
| height | No | ||
| method | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is partially covered. The description usefully adds that the operation hits every layer and frame, but it omits that pixel data is permanently resampled (nearest/bilinear/rotsprite), the live-vs-batch write behavior, and whether the original dimensions can be recovered.
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, zero filler, with the scope statement front-loaded before the parameter hint. Every clause earns its place.
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 mutation tool with no output schema, the description covers the core intent but leaves method selection, save/backend interaction, and return behavior to inference. It is minimally adequate rather than 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 coverage is only 43%, so the description must compensate; it does partially by clarifying that width/height and scale are alternative ways to specify the same resize ("Give width and/or height, or scale"). However it leaves the precedence when both are supplied, and the meaning of the method enum values (especially rotsprite), unexplained.
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?
"Scales the whole sprite (all layers and frames)" gives a specific verb plus the resource and its scope, which clearly separates it from related siblings like canvas_size or crop_sprite. It stops short of naming an alternative explicitly, so it earns a 4 rather than 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?
The only guidance is "Give width and/or height, or scale," which is parameter usage rather than when-to-use. Nothing tells the agent when to choose resize_sprite over canvas_size or crop_sprite, nor when to prefer one method or backend over another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_commandA
Executes any Aseprite menu command (app.command.) with parameters, e.g. Flip, Rotate, Outline, BrightnessContrast, ColorQuantization, LinkCels, ReverseFrames, AutocropSprite. See list_commands for names and parameters. Strings like '#ff0000' become Colors; {x,y,width,height} becomes a Rectangle. ui=false is added unless allowUi is true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Command name, e.g. 'Outline' | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | Frame to make active before running | |
| layer | No | Layer to make active before running | |
| params | No | Command parameters | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| allowUi | No | Let the command open its dialog (live mode only) | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| mutates | No | Batch mode: false skips saving (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint=false and destructiveHint=false. The description adds real behavioral detail beyond that: UI dialogs are suppressed via ui=false unless allowUi is true, and parameter coercion rules are disclosed. It still doesn't warn about mutating side effects or live-vs-batch persistence nuances.
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 dense sentences, front-loaded with the core action and followed by the lookup pointer and coercion rules. Every sentence contributes; 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 generic command runner with no output schema and full schema coverage, the description covers action, naming, coercion, and UI behavior adequately. Return format and error behavior are unaddressed but less critical here.
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 100%, so the schema already documents all nine parameters and the baseline would be 3. The description goes beyond it by explaining value coercion ('#ff0000' becomes a Color, {x,y,width,height} becomes a Rectangle) and the implicit ui=false injection, adding genuine semantic value.
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: executes Aseprite menu commands via app.command.<name>, with concrete examples (Flip, Rotate, Outline). It points to list_commands for names, which helps distinguish it, but does not explicitly separate itself from the similar escape-hatch siblings run_lua and use_tool.
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?
'See list_commands for names and parameters' implies the lookup workflow, and the examples suggest common use. However, it gives no explicit when-to-use/when-not guidance versus run_lua or use_tool, which are the obvious alternatives for arbitrary execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_luaA
Runs Lua code inside Aseprite with the full scripting API (app, Sprite, Image, Layer, Color, ...). Globals: args (your args object), sprite (resolved sprite or app.sprite), MCP (helper runtime: MCP.color(), MCP.layer(spr, ref), MCP.sprite_info(spr) ...). print output is captured. The return value is sent back as JSON. Use api_docs for the API reference.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Values available to the code as `args` | |
| code | Yes | Lua source. Use `return` to send a value back. | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| mutates | No | Batch mode: false skips saving the sprite afterwards (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are thin (readOnlyHint=false, destructiveHint=false), and the description adds real behavioral context beyond them: globals injected into the sandbox (`args`, `sprite`, `MCP`), that `print` is captured, and that the `return` value is serialized back as JSON. It does not warn about the safety profile of executing arbitrary code that can persist changes to sprite files, which is the one gap.
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 action leads, followed by a compact enumeration of injected globals and output behavior. Every sentence earns its place, though the parenthetical '(...) ' style elision slightly reduces precision.
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 output schema, the description correctly compensates by explaining that `print` output is captured and the `return` value is sent back as JSON. Given the tool's complexity and the schema's own coverage of backends and save semantics, this is close to complete, missing only guidance on live vs batch pitfalls.
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 100%, so the schema already explains code, args, save, sprite, backend, and mutates in detail; the description adds only the mapping between the `args` parameter and the `args` global. That is a marginal addition over structured data, which is the baseline for a fully documented 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+resource ('Runs Lua code inside Aseprite') and immediately scopes it by naming the scripting surface (app, Sprite, Image, Layer, Color) so an agent can distinguish it from dedicated siblings like draw_pixels or add_layer. It also names the companion tool api_docs, making its place in the toolset 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?
It explicitly routes the agent to api_docs for the API reference, which is a useful pointer, but it never says when to reach for run_lua versus run_command, use_tool, or cli, nor does it say to prefer dedicated tools where they exist. Usage is implied by the 'full scripting API' framing rather than stated as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_paletteB
Saves the sprite palette to a file (.gpl, .pal, .act, .png, .ase, .hex...).
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, which the description does not contradict. Beyond that it only adds the format list; it says nothing about whether an existing file is overwritten, what the return value is, or backend-mode caveats (again only in the schema).
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 verb and the destination are the first things read.
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, yet the description never says what is returned or that writing may overwrite a file. The schema carries the sprite/backend semantics, but overwrite behavior and return shape are missing for a file-writing 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 coverage is 67%, and the schema already explains 'sprite' (path/tab/id, default active) and 'backend' (auto/live/batch). The description contributes only the format enumeration, which implicitly constrains the required 'file' extension but adds no syntax or default detail beyond 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+resource ('Saves the sprite palette to a file') and enumerates supported formats, so the operation is unambiguous. It is distinguishable from siblings like get_palette/set_palette by the explicit 'to a file' phrasing, though it never 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?
No indication of when to use this versus get_palette, set_palette, palette_edit, or export/export_sprite_sheet. The only guidance (batch mode needs a file path) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_spriteA
Saves a sprite (Save / Save As), or with copy=true saves a copy without changing the sprite's file name. The extension picks the format. Single-image formats get one file per frame (name1.png, name2.png...); the result lists the files written.
| Name | Required | Description | Default |
|---|---|---|---|
| copy | No | ||
| file | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, non-destructive write; the description adds real behavior beyond that — copy preserves the file name, the extension determines format, single-image formats emit one file per frame, and the result enumerates written files. It does not say what happens on overwrite, which is the one notable gap.
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 compact sentences, all front-loaded with the primary action first and the copy exception immediately after. No filler, though the frame-naming example is slightly more detail than most callers need.
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 output schema, the description compensates by stating that the result lists the files written, and it covers the copy/format branching. It is nearly complete for a mutation tool, missing only overwrite/permission 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 50%, and the description usefully defines the undocumented copy parameter's semantics. However, file and backend behavior is left to the schema (backend has its own description) and the description adds no format/syntax detail for the file path beyond what is already structured.
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 ('Saves a sprite') and distinguishes the three modes (Save, Save As, copy=true). It does not differentiate itself from nearby siblings like export or export_sprite_sheet, so an agent still has to infer which write-path applies.
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 explains the copy=true condition, which is genuinely useful routing, but gives no guidance on when to save vs. use export/export_sprite_sheet, and no prerequisites such as whether a file must already exist for Save.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selectA
Creates or changes the selection: rect, ellipse, polygon, magic_wand (point), by_color, all, none, invert, reselect, content (layer pixels), modify (expand/contract/border), move (dx/dy), get, save or load (to/from a .msk or image file). The selection lives only in live mode or inside one run_lua call.
| Name | Required | Description | Default |
|---|---|---|---|
| dx | No | ||
| dy | No | ||
| file | No | save/load: .msk (Aseprite selection file) or an image (opaque pixels = selected) | |
| mode | No | ||
| rect | No | ||
| brush | No | ||
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| point | No | ||
| action | Yes | ||
| points | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| modifier | No | ||
| quantity | No | ||
| tolerance | No | ||
| contiguous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, and the description does not contradict this. It adds real behavioral context beyond the annotations: the key constraint that 'the selection lives only in live mode or inside one run_lua call' is a non-obvious, operation-critical trait that structured fields do not convey.
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, front-loaded with the core verb and action enumeration; the mode constraint is placed last as a caveat. The action list is long but every entry corresponds to a real enum value rather than generic filler, so it earns its space.
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, so return values need not be explained, but a 18-parameter tool at 33% coverage leaves several behaviorally significant params (mode, tolerance, contiguous, quantity, brush, frame, layer, sprite, backend) undefined in both schema and description. It is adequate given how well the action list is documented, but gaps remain for a tool of this complexity.
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 18 params and only 33% schema coverage, the description compensates by tying parameters to actions and clarifying semantics the schema cannot express: 'point' belongs to magic_wand, 'dx/dy' to move, 'file' accepts .msk or an image, and 'modifier' means expand/contract/border. Many params (mode, tolerance, contiguous, quantity, brush, frame, layer, sprite) remain undocumented, so it is not 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 description opens with a specific verb+resource ('Creates or changes the selection') and then enumerates all 15 supported actions, so an agent knows exactly what the tool covers. It does not differentiate from the sibling 'selection_edit', which appears to overlap in scope, 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 implied through the action list and the inline mapping of actions to parameters (e.g., 'magic_wand (point)', 'move (dx/dy)'), and the mode caveat scopes where it can run. But there is no explicit when-to-use vs. the similarly named 'selection_edit' sibling, leaving the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selection_editB
Acts on the selection: copy, copy_merged, cut, paste (optional x,y), delete, fill, stroke (with color), move_content / move_bounds (dx,dy, wrap), new_sprite, new_layer_via_copy, new_layer_via_cut, crop.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| dx | No | ||
| dy | No | ||
| wrap | No | ||
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| action | Yes | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, which is minimal for a tool whose enum includes delete, cut, and crop. The description adds useful per-action context (which parameters belong to which action). However, it says nothing about undoability, whether a selection is required, or how the clipboard is affected — important for this action set. Note a mild tension: 'delete'/'cut'/'crop' read as destructive while destructiveHint=false, though this is defensible if deletes are undoable.
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 that begins with the core purpose ('Acts on the selection') before the action list. It is dense and slightly cramped as a run-on enumeration, but every clause adds a distinct action or parameter mapping rather than repeating structured data.
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 13-action, 11-parameter mutating tool with no output schema and thin annotations, the description covers the action surface and inline parameter hints but omits prerequisites (selection state), return/status behavior, and undo semantics. Reasonable but noticeably short of fully equipping 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?
Schema coverage is only 45%, so the description has to carry weight — and it partially does by mapping parameters to actions (paste takes optional x/y, stroke takes color, move_* takes dx/dy/wrap). It does not explain frame, layer, sprite, or backend, though those do carry their own schema descriptions. Adequate compensation without being thorough.
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 resource ('the selection') and enumerates every action the tool performs (copy, copy_merged, cut, paste, delete, fill, stroke, move_content/move_bounds, new_sprite, new_layer_via_copy/cut, crop). This makes the tool's scope clear and distinguishable from siblings like select, draw_shapes, or clipboard. It stops short of naming an alternative tool, so it is not 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 when-to-use guidance, no prerequisites (e.g. that a selection must exist first, or how it relates to select/clipboard), and no exclusions. The overlapping siblings (clipboard, copy_cel, crop_sprite, new_sprite, select) are never referenced, leaving the agent to infer routing entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_activeB
Changes what is active in the UI: sprite/layer/frame, foreground/background color, tool, brush, editor zoom, and the timeline range (selected frames/layers/colors). Mostly useful in live mode.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | Tool id, e.g. pencil, eraser, paint_bucket, rectangular_marquee | |
| zoom | No | Editor zoom factor (1 = 100%) | |
| brush | No | Brush: built-in shape and size, or a custom image brush | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| range | No | Timeline/palette selection (live only) | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| bgColor | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| fgColor | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations state readOnlyHint=false and destructiveHint=false, so the agent knows this mutates state but non-destructively. The description adds that the change is UI-state-oriented and mostly relevant in live mode, but says nothing about reversibility, what happens when no live session exists, or how batch mode behaves.
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, front-loaded with the core action and scope, then the live-mode caveat. No filler, though the long enumeration makes the first sentence slightly dense.
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 ten-parameter catch-all mutator with full schema coverage and no output schema, the description is adequate but shallow: it does not clarify how simultaneously supplied fields interact, nor the live-vs-batch behavioral difference hinted at by the backend parameter. It covers the surface but omits the operational detail an agent would want.
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 100%, so the schema already documents all ten parameters including brush, range, colors, and backend defaults. The description only re-lists the categories of changeable state without adding format or interaction details beyond the schema, so the baseline of 3 applies.
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 verb ('Changes') and resource ('what is active in the UI') and enumerates the concrete targets: sprite/layer/frame, fg/bg color, tool, brush, zoom, and timeline range. This is far clearer than a tautology, though it does not explicitly distinguish itself from potential siblings like select or view_settings.
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?
'Mostly useful in live mode' gives a contextual hint about when the tool applies, and the schema notes 'range' is live-only. However, there is no explicit guidance on when to prefer this over alternatives such as select or view_settings, leaving usage largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_frame_durationA
Sets frame durations in milliseconds for one frame, a range, a list, a tag, or 'all'.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last frame of a range | |
| tag | No | Use the frames of this tag | |
| from | No | First frame of a range | |
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| frames | No | 'all' or a list of frame numbers | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| durationMs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive mutation. The description adds no behavioral context beyond that: it does not mention the live vs batch backend split, the save-back-to-file semantics, or whether durations on unselected frames are preserved. It adds the selector scope, which is modest value.
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 that states the verb, the unit (milliseconds), and the full set of target selectors with zero filler. Every clause earns its place.
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 mutation tool with no output schema, the description covers the 'what' and the target scope but omits the batch/live mode distinction and save behavior that materially affect invocation. Since the schema carries that detail at 89% coverage, the definition is minimally viable rather than 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 89%, so nearly every parameter is already documented in the schema (frame, from/to, frames, tag, save, sprite, backend). The description's selector list duplicates that information rather than adding units, constraints, or interaction rules, so the baseline 3 applies.
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 (sets) and resource (frame durations), and enumerates the five target selectors (one frame, range, list, tag, 'all'), which maps directly onto the schema's frame/from-to/frames/tag parameters. It does not distinguish itself from adjacent frame tools like add_frames, delete_frames, or move_frame, so sibling differentiation is absent.
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 list of selectable targets implies the tool's reach, but there is no explicit guidance on when to use it versus alternatives such as update_tag or set_sprite_properties, and no prerequisites or exclusions are stated. Usage is inferable only from the parameter enumeration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_paletteB
Changes the palette: set colors starting at 'start', replace it entirely, resize, load from a file (.gpl, .pal, .act, .ase, .png...) or a built-in preset (e.g. DB16, DB32, PICO-8...), or generate it from the sprite's colors (fromSprite).
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| size | No | ||
| start | No | ||
| colors | No | ||
| preset | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| replace | No | Palette becomes exactly 'colors' | |
| algorithm | No | ||
| maxColors | No | ||
| withAlpha | No | ||
| fromSprite | No | Build a palette from the sprite (ColorQuantization) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the write-but-not-destructive profile is already covered. The description adds useful behavioral context — notably that 'replace' makes the palette exactly the given colors and that fromSprite derives from the sprite's own colors. It does not clarify persistence (whether changes touch the sprite file), live-vs-batch side effects, or reversibility, so it adds moderate value on top of the annotations.
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 a single sentence with the verb and resource front-loaded and the modes packed in via parenthetical examples (.gpl/.pal/.act, DB16/DB32/PICO-8) that convey format hints economically. The density is high but almost every clause earns its place; minor strain comes from cramming so many modes into one sentence.
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 13-parameter mutation tool with low schema coverage and no output schema, the description covers the headline modes but omits persistence behavior, backend/live-vs-batch interaction, and several parameter meanings. It is adequate to pick the tool and choose a mode, but not complete for confident 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 only 38% across 13 params, so the description must carry weight and it partially does: it explains start, replace, file, preset, and fromSprite in narrative form. However, it leaves size, save, colors format, sprite, backend, algorithm, maxColors, and withAlpha entirely unaddressed, so a notable share of parameters remain undocumented in both places.
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 concrete verb and resource ('Changes the palette') and enumerates the distinct operating modes: set from a start index, replace entirely, resize, load from file, load a preset, or quantize from the sprite. This is far more specific than the bare name. It stops short of a full 5 because it never distinguishes itself from close siblings like palette_edit, save_palette, or get_palette.
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?
Enumerating the modes (replace, load file, preset, fromSprite) implicitly signals when each behavior applies, which is decent implied guidance. But there is no explicit when-to-use / when-not-to-use framing, no prerequisites, and no routing to the sibling tools (palette_edit, save_palette) that an agent could otherwise confuse this with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_sprite_propertiesB
Changes sprite metadata: filename, user data, tab color, transparent color index, pixel ratio, grid bounds, user properties, color space.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| filename | No | ||
| colorSpace | No | ||
| gridBounds | No | ||
| pixelRatio | No | ||
| properties | No | User-defined properties to set (object.properties) | |
| useLayerUuids | No | ||
| transparentColor | No | ||
| convertColorSpace | No | Convert pixels instead of only assigning the color space |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive write, and the description confirms mutation of metadata with a list of targets. However, it does not disclose persistence/save semantics, undo behavior, or batch vs live implications; those details appear only in some schema properties.
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 sentence, front-loaded with the verb, followed by a compact list. There is no filler or restatement of annotations.
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 13-parameter mutation tool with nested object parameters and no output schema, the description covers the metadata targets but leaves operational context thin: it does not explain save defaults, backend selection, or how to target a sprite. The schema fills some gaps, but several parameters (useLayerUuids, data, colorSpace) lack explanatory text in either place.
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 46%, so the description should compensate. It maps several parameters to human-readable concepts (filename, tab color, transparent color index, pixel ratio, grid bounds, user properties, color space), but omits save, sprite, backend, useLayerUuids, and convertColorSpace, and gives no format details beyond 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 'Changes' and resource 'sprite metadata', then enumerates eight metadata fields (filename, user data, tab color, transparent color index, pixel ratio, grid bounds, user properties, color space). This distinguishes it from layer/frame/cel tools, but it does not name a sibling alternative or clarify overlap with the generic 'properties' tool.
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 when-to-use, when-not-to-use, or alternative guidance is provided. It does not explain when to choose this over update_layer, properties, or change_color_mode, nor does it mention prerequisites like an open sprite or backend choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusARead-only
Shows the Aseprite executable in use, its version, and whether a live Aseprite is connected to the bridge.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe read, so the annotation carries the safety profile. With no output schema, the description usefully adds what the tool probes and reports back (executable, version, live connection state via the bridge), including the notion of a disconnected case.
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 sentence with no filler, front-loading the verb and the three reported facts. Every clause earns its place.
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 no-argument, read-only tool with no output schema, the description adequately explains the returned content. A minor gap is that it does not say what the agent should expect when no Aseprite instance is running beyond implying a negative connection status.
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?
The tool takes zero parameters, which is the baseline-4 case; there is no parameter surface for the description to clarify or compensate for. Nothing misleading is stated about inputs.
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 concrete verb ("Shows") plus three specific resources: the Aseprite executable path, its version, and live bridge connectivity. This is clearly distinguishable from action siblings like launch_aseprite or run_command. It does not, however, explicitly differentiate itself from the overlapping-sounding app_state 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?
There is no guidance on when to call this versus app_state, list_preferences, or the other diagnostic/state tools in the sibling list. The purpose implicitly suggests a diagnostic check, but nothing tells the agent which of several state-inspection tools to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tilemapA
Reads (action 'get') or writes (action 'set') the tile indices of a tilemap layer's cel. Set with 'cells' [{col,row,tile}] or 'rows' (2D array of tile indices, -1/null to skip) starting at col/row.
| Name | Required | Description | Default |
|---|---|---|---|
| col | No | ||
| row | No | ||
| rows | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| cells | No | ||
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| action | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, which the description is consistent with (it performs reads and writes). The description adds useful write semantics (-1/null to skip, starting at col/row) but omits persistence behavior (the save flag writing back to file) and what a 'get' returns, so it adds only moderate value over the annotations.
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 get/set distinction and the write formats. No padding or repetition.
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 tool with no output schema, the description covers get/set intent and the two write formats, but says nothing about the return value of a 'get' or how the frame/layer defaults interact. Adequate but 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 coverage is only 50%, and the description compensates well for the undocumented 'cells' and 'rows' parameters by giving their exact shapes and the -1/null skip convention. The remaining parameters (layer, sprite, frame, save, backend) are already described 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 specific verbs (reads/writes) and resource (tile indices of a tilemap layer's cel), and distinguishes the 'get' vs 'set' modes. It does not differentiate from similarly-named siblings like tileset, get_cels, or update_cel, so it stays at 4 rather than 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 implied by the action enum ('get'/'set'), and the description tells the agent how to supply writes via 'cells' or 'rows'. However, it never says when to prefer this over get_cels/update_cel/tileset, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tilesetB
Tileset operations: list, add (tileSize, count), update (name, baseIndex, data), delete, add_tile, delete_tile, get_tile (pixels as rows+legend), set_tile (rows+legend or an image file). Tile index 0 is the empty tile.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| file | No | ||
| name | No | ||
| rows | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| count | No | ||
| index | No | Tile index | |
| action | Yes | ||
| legend | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| tileset | No | Tileset index (1-based), name, or a tilemap layer | |
| tileSize | No | ||
| baseIndex | No | ||
| properties | No | User-defined properties to set (object.properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the safety profile is partly carried elsewhere. The description adds a genuinely useful domain fact ('Tile index 0 is the empty tile') and hints at return shape for get_tile, but never says what delete/delete_tile destroy, whether indices shift after deletion, or how batch mode differs — and with the schema covering 'save' and 'backend', a 3 is appropriate.
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 dense sentence, front-loaded with the action list, with no filler. It is compressed almost to telegraphic style, which costs some readability for a 15-parameter dispatcher but wastes no words.
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 an 8-action, 15-parameter tool with no output schema, the description covers action/parameter associations and get_tile's return shape, which is the minimum viable. It omits what 'list' returns, the effect of delete on tile indices, and per-action return values for the remaining actions.
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 only 40% schema description coverage across 15 params, the description does real work by binding parameters to actions — 'add (tileSize, count)', 'update (name, baseIndex, data)', 'set_tile (rows+legend or an image file)'. Undocumented params (index, properties, sprite, tileset, file) are never explained, but the action-to-parameter mapping is the critical missing piece and it is supplied.
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 resource (tileset) and enumerates all eight actions it dispatches, so an agent knows this is the tileset CRUD tile-manipulation surface. It is clear, but it never distinguishes itself from the sibling 'tilemap' tool, which plausibly overlaps in scope.
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 when-to-use guidance: no statement of when to pick this over the sibling 'tilemap' tool, no note that 'action' selects the operation, and no exclusions. The action list is a menu, not usage advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_redoB
Undoes or redoes steps on a sprite (live mode; batch processes have no history between calls).
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | ||
| action | Yes | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, and the description does not contradict that. It adds genuinely useful context (batch mode has no inter-call history), but omits reversibility semantics, what happens when there is no history left to undo, and any permission/auth requirements.
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 the core action first and the mode caveat in parentheses. No filler, though the parenthetical is slightly compressed at the cost of clarity.
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 mutation tool with no output schema and no annotations covering behavior, the description covers the core purpose and the live/batch distinction. It still leaves the 'steps' parameter behavior and no-history edge cases unaddressed, so it is adequate but not 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 50%: 'sprite' and 'backend' are documented in the schema while 'steps' and 'action' are not. The description alludes to steps being undoable/redoable but adds no detail on the steps count, defaults, or the undo/redo enum meaning, so it only partially compensates.
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 a specific verb pair (undoes/redoes) and a specific resource (steps on a sprite), which is unambiguous and matches the tool name. No sibling tool competes for this function, so differentiation is implicit 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 gives one useful usage constraint – that batch processes have no history between calls, so undo/redo is effectively live-only. However, it doesn't state prerequisites, ordering considerations, or what to do in batch mode instead, leaving the guidance partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_celB
Changes a cel: position (absolute x/y or relative dx/dy), opacity, z-index, color, data, properties, or moves it to another frame.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| dx | No | ||
| dy | No | ||
| data | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| zIndex | No | ||
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| opacity | No | ||
| toFrame | No | ||
| properties | No | User-defined properties to set (object.properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile (a non-destructive mutation) is established structurally. The description adds no behavioral context beyond that: nothing about batch-vs-live backend semantics, the save flag, permission requirements, or reversibility, despite 'save' and 'backend' being significant controls.
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 led by the verb, with the field list acting as an efficient index of capabilities. No filler or redundancy, though the run-on list format prioritizes brevity over scanability.
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 15-parameter mutation tool with no output schema and under-half schema coverage, the description covers the primary content fields but leaves the operational controls (save, backend, sprite, layer) unexplained. Adequate as a capability summary, incomplete as invocation guidance.
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 schema coverage at only 47% and 15 parameters, the description compensates well by clarifying the meaning of bare parameters the schema leaves undocumented — that x/y are absolute and dx/dy relative, and that it can set color, data, and properties. It omits save/backend/layer/sprite meaning, but it materially strengthens several otherwise opaque fields.
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 ('changes') plus the resource ('cel') and enumerates the mutable surface: position, opacity, z-index, color, data, properties, and frame relocation. An agent can tell this is the cel-mutation tool, though it never explicitly distinguishes itself from siblings like copy_cel, delete_cel, or link_cels.
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 when-to-use, when-not-to-use, or alternatives guidance is provided. The field enumeration implies context, but the agent gets no help deciding between update_cel, copy_cel, draw_pixels, or link_cels for a given mutation task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_layerC
Changes layer properties: name, visibility, lock, opacity, blend mode, color, data, parent group, stack position.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | User data text | |
| name | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | Timeline color | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| parent | No | Group layer to move into; '' moves to the top level | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| opacity | No | ||
| tileset | No | Tilemap layers: tileset to use | |
| visible | No | ||
| editable | No | false locks the layer | |
| blendMode | No | normal, multiply, screen, overlay, darken, lighten, color_dodge, color_burn, hard_light, soft_light, difference, exclusion, hue, saturation, color, luminosity, addition, subtract, divide | |
| collapsed | No | Group layers only | |
| continuous | No | ||
| properties | No | User-defined properties to set (object.properties) | |
| stackIndex | No | Position among siblings (1 = bottom) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is partly covered. However, the description adds no behavioral context beyond a field list — nothing about whether changes persist, the save/batch-mode implication, or reversibility of a move/parent change.
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 a colon-delimited field list — dense and efficient, no filler. The only minor issue is that it is a fragment with no leading purpose statement, but nothing 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 17-parameter mutation tool with no output schema, the description covers the mutable-property surface but omits targeting (layer/sprite/backend), batch vs live semantics, and the save behavior. The schema picks up most of that, so it is adequate but leaves real 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 76%, so the schema largely documents the parameters itself. The description's field list ('name, visibility, lock, opacity, blend mode, color, data, parent group, stack position') maps roughly to parameters like parent and stackIndex, adding only marginal meaning beyond 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?
The description gives a specific verb ('Changes') and resource ('layer properties') and enumerates exactly which fields are mutable, which separates it cleanly from siblings like add_layer, delete_layer, and convert_layer. It does not explicitly name an alternative tool, but the resource scope 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?
There is no when-to-use, when-not-to-use, or alternative mention. An agent gets no guidance on choosing this over convert_layer, set_sprite_properties, or the batch/live backend parameters that the schema exposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sliceD
Changes a slice.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| name | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| pivot | No | Pivot relative to the slice; false removes it | |
| slice | Yes | ||
| bounds | No | ||
| center | No | 9-slice center, relative to the slice; false removes it | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| properties | No | User-defined properties to set (object.properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so safety is partially covered. However, the description adds nothing about what gets modified, whether changes persist, or the live-vs-batch distinction. For a mutation tool with zero added context, this leaves important behavior undisclosed.
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 words is technically concise, but this is under-specification rather than economy. Nothing is front-loaded because there is essentially no content to structure.
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?
An 11-parameter mutation tool with nested objects, no output schema, and 64% schema coverage demands far more description than one sentence. The agent lacks the context needed to call this correctly.
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 only 64%, below the 80% threshold where a baseline of 3 would apply. The description mentions no parameters at all, so it fails to compensate for the undocumented parameters (slice, data, name, bounds are bare).
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?
"Changes a slice" is essentially a restatement of the tool name update_slice. It names the resource but gives no indication of what aspects are changed or how it differs from add_slice/delete_slice beyond the obvious. This is tautology territory per the rubric.
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 when-to-use guidance, no prerequisites, and no mention of alternatives such as add_slice or delete_slice. The agent must infer the tool's role purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tagC
Changes a tag's name, range, direction, repeats, color or data.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| tag | Yes | ||
| data | No | ||
| from | No | ||
| name | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| color | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| aniDir | No | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| repeats | No | 0 = infinite | |
| properties | No | User-defined properties to set (object.properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The write nature of the tool is conveyed and does not contradict the readOnlyHint=false / destructiveHint=false annotations, but the description adds nothing on top of them: no indication that unspecified fields are preserved, nothing about live vs batch execution, and nothing about whether changes are saved back to the 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?
A single front-loaded sentence naming verb then resource then mutable fields. Zero waste, though the extreme terseness is part of why behavior and parameters go under-explained.
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 12-parameter mutation tool with nested objects and no output schema, the description covers only a subset of the surface. Batch/live behavior, the save flag, sprite targeting, and the required tag argument are all left to the 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 description coverage is only 50%, but the description compensates by mapping natural-language concepts to parameters ('range' to from/to, 'direction' to aniDir, plus repeats, color, data, name). It still omits sprite, backend, save, properties, and the required tag identifier, so the gap is only partially closed.
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 ('Changes a tag's name, range, direction, repeats, color or data') and the field list distinguishes it from add_tag/delete_tag. It stops short of naming those siblings explicitly, so the differentiation is inferred 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?
There is no when-to-use guidance, no mention of prerequisites (the tag must already exist), and no reference to the sibling alternatives add_tag or delete_tag for the create/remove cases. Usage is only implied by the verb 'changes'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_toolA
Draws with an Aseprite tool as if the user dragged through 'points' (app.useTool). Tools: pencil, brush-like strokes with eraser/spray/blur/jumble, line, curve (4 points), rectangle, filled_rectangle, ellipse, filled_ellipse, paint_bucket (1 point), gradient, contour, polygon, and selection tools (rectangular_marquee, elliptical_marquee, lasso, polygonal_lasso, magic_wand).
| Name | Required | Description | Default |
|---|---|---|---|
| ink | No | ||
| save | No | Batch mode: write changes back to the sprite file (default true) | |
| tool | Yes | ||
| brush | No | Brush: built-in shape and size, or a custom image brush | |
| color | No | Default: foreground color | |
| frame | No | 1-based frame number. Defaults to the active frame (or 1). | |
| layer | No | Layer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer. | |
| button | No | right uses the background color | |
| points | Yes | ||
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| bgColor | No | '#rrggbb', '#rrggbbaa', a name, a palette index, or {r,g,b,a} / {h,s,v,a} / {h,s,l,a} / {gray,a} | |
| opacity | No | ||
| brushSize | No | ||
| tolerance | No | ||
| contiguous | No | ||
| tilemapMode | No | ||
| tilesetMode | No | ||
| pixelPerfect | No | ||
| selectionMode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real behavioral context beyond that – it discloses drag-like point semantics and per-tool point cardinality (curve = 4 points, paint_bucket = 1 point), which prevents malformed calls. It still omits mutation/save side effects, though the save parameter schema partly covers that.
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 dense sentence, front-loaded with the core semantics (how drawing is performed) followed by the tool enumeration. No filler, though the tool list is long and packed into one clause.
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 20-parameter tool with nested objects and no output schema, the description covers the drawing model and valid tool names but says nothing about coordinate space, color/brush interplay, layer/frame targeting, or live-vs-batch behavior. Adequate for the required call shape, thin for full correct usage.
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 only 45% across 20 parameters, so the description must compensate, and it does so for the two required ones – crucially 'tool', which is an untyped string in the schema and only gains valid values from the description. The other 18 parameters (brush, ink, tolerance, tilemapMode, selectionMode, etc.) get no description-level semantics, so it is only partially compensating.
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: drawing with an Aseprite tool by simulating a drag through 'points', and even names the underlying API (app.useTool). It also enumerates the full accepted tool-name space, which lets an agent distinguish this from siblings like draw_shapes, draw_pixels and draw_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 rather than stated: the list of supported tools (including selection tools, gradients, contours) signals broad coverage, but there is no explicit when-to-use vs draw_shapes/draw_pixels/draw_text, and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_settingsA
Reads or changes per-sprite view settings: grid (show, snap, bounds, color, opacity), pixel grid, symmetry mode and axes, tiled mode, onion skin, overlays (layer edges, selection edges, slices, auto guides, tile numbers, brush preview), checkerboard colors; and in live mode zoom, scroll, fit to screen, playback, timeline and preview window. Call with no options to read them.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | ||
| show | No | ||
| zoom | No | Live: editor zoom (1 = 100%) | |
| scroll | No | Live: sprite pixel to center the editor on | |
| sprite | No | File path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path. | |
| backend | No | auto (default): live Aseprite if connected, else headless batch | |
| playback | No | Live: start/stop animation playback (toggles) | |
| symmetry | No | ||
| timeline | No | Live: open (true) or close (false) the timeline | |
| fitScreen | No | Live: zoom to fit | |
| onionSkin | No | ||
| pixelGrid | No | ||
| tiledMode | No | ||
| background | No | Checkerboard behind transparent pixels | |
| togglePreview | No | Live: show/hide the preview window |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare that this is a non-destructive, non-read-only tool. The description adds real behavioral context the annotations lack: which options are live-mode only (zoom, scroll, playback, timeline, preview), that batch mode requires a file path for `sprite`, and that backend defaults to live if connected. It does not describe what a read call returns, but it goes well beyond the annotations.
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?
One long sentence, but it is front-loaded with the core verb/resource before the parenthetical enumeration, and the read-usage sentence is placed last where it reads naturally. Dense but nearly all of it earns its place given 15 parameters.
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 no-required-param, nested, no-output-schema tool, the description covers the setting surface well and explains the live/batch distinction. Remaining gaps (return shape on read, individual nested field meaning) are modest given the schema carries those definitions.
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 15 params and only 60% schema description coverage, the description does meaningful work: it groups the nested objects (grid, pixel grid, symmetry, tiled mode, onion skin, overlays, checkerboard) and flags which parameters apply only in live mode. It stops short of explaining individual nested toggles like `grid.snap` or `background.size`, which the schema also leaves undescribed.
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 pair and resource ('Reads or changes per-sprite view settings') and then enumerates the exact setting groups covered. 'Per-sprite' implicitly separates it from the global `preferences` sibling, though no sibling is named outright.
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 line 'Call with no options to read them' clearly distinguishes the read path from the write path, which is genuinely useful. However, there is no guidance on when to use this versus `preferences` (global settings) or other view-affecting tools, so usage is only partially implied.
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.
73 tool updates
v0.1.1- First observed
add_frames - First observed
add_layer - First observed
add_slice - First observed
add_tag - First observed
api_docs - First observed
app_state - First observed
apply_filter - First observed
ask_user - First observed
canvas_size - First observed
change_color_mode - First observed
clear - First observed
cli - First observed
clipboard - First observed
close_sprite - First observed
convert_layer - First observed
copy_cel - First observed
crop_sprite - First observed
delete_cel - First observed
delete_frames - First observed
delete_layer - First observed
delete_slice - First observed
delete_tag - First observed
draw_image - First observed
draw_pixels - First observed
draw_shapes - First observed
draw_text - First observed
duplicate_layer - First observed
duplicate_sprite - First observed
export - First observed
export_sprite_sheet - First observed
flip_rotate - First observed
get_cels - First observed
get_palette - First observed
get_pixels - First observed
get_sprite_info - First observed
import_sprite_sheet - First observed
install_extension - First observed
launch_aseprite - First observed
link_cels - First observed
list_commands - First observed
list_preferences - First observed
list_sprites - First observed
merge_layers - First observed
move_frame - First observed
new_sprite - First observed
open_sprite - First observed
palette_edit - First observed
preferences - First observed
properties - First observed
recent_events - First observed
render_preview - First observed
replace_color - First observed
resize_sprite - First observed
run_command - First observed
run_lua - First observed
save_palette - First observed
save_sprite - First observed
select - First observed
selection_edit - First observed
set_active - First observed
set_frame_duration - First observed
set_palette - First observed
set_sprite_properties - First observed
status - First observed
tilemap - First observed
tileset - First observed
undo_redo - First observed
update_cel - First observed
update_layer - First observed
update_slice - First observed
update_tag - First observed
use_tool - First observed
view_settings
TDQS
Scored across 73 tools
Many tools target distinct resources and actions, but there is meaningful overlap among drawing tools (use_tool, draw_shapes, draw_pixels, draw_image, draw_text) and execution tools (run_command, run_lua, cli). Generic names like preferences, properties, status, and app_state also require careful reading to avoid misselection. Descriptions help, but boundaries are not always obvious.
All names use snake_case, which keeps them readable, but the conventions are mixed: verb_noun (list_sprites, add_layer), noun-only (tileset, clipboard, preferences), and noun_verb (selection_edit, palette_edit). There is no single predictable pattern across the set.
With 73 tools, this is far beyond the well-scoped 3-15 range and qualifies as an extreme mismatch by the rubric's 50+ threshold. Even for a broad application like Aseprite, the volume is likely to overwhelm an agent selecting the right tool.
The surface covers sprites, layers, frames, cels, tags, slices, tilesets, tilemaps, palettes, selections, drawing, filters, import/export, preferences, clipboard, events, and dialogs. It provides full CRUD and lifecycle operations across the Aseprite domain with no obvious gaps.
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.
Create AI animations and export transparent sprite sheets, alpha video, frames, and game assets.
AI game assets for agents: consistent sprites, 2D animations, tiles, maps, music and engine exports.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables AI assistants to control Aseprite for creating pixel art and animated sprites, with 104 tools covering canvas, drawing, animation, palettes, effects, and more.100MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to drive Aseprite for pixel-art creation, including sprite setup, grid-based drawing, layer/frame/tag management, reference image import, and export, with rendered previews after every mutation.MIT
- 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
- 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