Skip to main content
Glama
with-pebbly

aseprite-ai-artist

by with-pebbly

Aseprite AI Artist

Let a coding agent draw pixel art in your open Aseprite window — not in a copy, not on disk, in the document you are looking at.

One MCP server, one Aseprite extension, and a pixel-art rulebook the agent actually has to follow. Works with Claude Code, Codex CLI, Gemini CLI, Cursor, VS Code and Windsurf from the same one-line config.

npx @with-pebbly/aseprite-ai-artist install --all --agents
npx @with-pebbly/aseprite-ai-artist install-extension
# restart Aseprite, restart your agent

Requires Aseprite 1.3+ and Node 20.10+.


What it does

"Draw me a 32×32 knight in the PICO-8 palette, then a 4-frame idle."

The agent inspects the document, picks a palette, blocks in a silhouette, looks at what it drew, shades with proper hue shifting, rigs the character onto layers, animates, tags the cycle, validates, and tells you what it compromised on. In your window, undoable, one Ctrl+Z per edit.

Related MCP server: aseprite_mcp

What makes it different

It works everywhere, not just in Claude Code. Most Aseprite MCP projects put their craft knowledge in a Claude Code plugin. Codex, Gemini and Cursor then get raw tools and none of the discipline — which is most of what separates a sprite from coloured noise. Here the rules and workflows are served over MCP as rules:// and skill:// resources and as MCP prompts, so every client gets them from one source of truth.

Eighteen tools, not ninety. Every tool schema sits in the model's context on every turn, whether or not you are drawing. Grouping by noun with an op enum, plus batch arrays, covers the same ground at roughly a sixth of the cost — and makes batching the default, so one draw call is one undo step for you.

One config line on every OS. No compiled binary, no per-platform path, no native dependencies. npx and go.

It has to look at its own work. look gives the agent an upscaled preview, an exact one-glyph-per-pixel text grid, a filmstrip of every animation frame, and a pixel-level diff between frames. validate then checks the sprite mechanically before anything gets called finished.

It cannot quietly wreck your file. When Aseprite is not attached, every tool refuses immediately with doNotFallBackToDisk rather than timing out — because an agent that "recovers" by editing the .aseprite file makes changes you never see and your next save overwrites.

There is a whole page on the other projects in this space, what was taken from them, and where they are still better.

Install

See docs/INSTALL.md for per-client detail and troubleshooting.

Claude Code

The plugin brings the /pixel-* skills, the specialist subagents and the hooks, not just the tools:

/plugin marketplace add with-pebbly/aseprite-ai-artist
/plugin install aseprite-ai-artist

Everything else

npx @with-pebbly/aseprite-ai-artist install codex      # ~/.codex/config.toml
npx @with-pebbly/aseprite-ai-artist install gemini     # ~/.gemini/settings.json
npx @with-pebbly/aseprite-ai-artist install cursor     # ~/.cursor/mcp.json
npx @with-pebbly/aseprite-ai-artist install --all      # all of the above

Existing config is backed up first. --dry-run shows the change without making it. --project writes into the repository instead of your home directory.

Check it

npx @with-pebbly/aseprite-ai-artist doctor

The tools

Eighteen, grouped by noun. Full reference in docs/TOOLS.md.

Session

preflight · sprite_info · sprite_manage

Looking

look · read_pixels

Drawing

draw · select · transform · recolor

Structure

layer · frame · tag · cel

Colour & quality

palette · validate

Assets

reference · export · tileset

Plus run_lua as an escape hatch, off by default.

The skills

Workflows the agent follows, served to every client:

pixel-brief · pixel-new · pixel-palette · pixel-draw · pixel-shade · pixel-rig · pixel-animate · pixel-tileset · pixel-review · pixel-fix · pixel-export

And in Claude Code, four specialist subagents: pixel-critic (visual QA), palette-smith (colour), rig-builder (layer rigs), animation-director (cycle planning).

The rules

The craft is encoded in rules/ and served as rules:// resources — palette discipline, hue-shifted shading, silhouette and proportion, outlines and edges, animation timing, layer rigging, and a review checklist. Skills reference rules rather than restating them, so a rule has exactly one place to be wrong.

The mechanical parts are enforced by the tools themselves: draw and recolor snap to the palette by perceptual distance and report every colour they moved, so an agent that never reads a word of the rulebook still cannot casually widen your palette.

How it works

your agent  ──stdio/MCP──▶  server  ──ws:9932──▶  bridge  ──ws:9931──▶  Aseprite

Aseprite's Lua WebSocket is a client only, so the bridge holds the listening socket. It runs as its own singleton process so that restarting the MCP server — which agent hosts do freely — does not drop your Aseprite connection, and so a second agent window can attach without stealing the first one's replies.

Details in docs/ARCHITECTURE.md and the ADRs.

Development

npm install
npm run build
npm test                                        # TypeScript: colour, render, bridge, MCP surface
npm run test:extension                          # Lua handlers, headless, against a real sprite

The Lua tests run the real command handlers inside aseprite -b against a real sprite — the only way to prove that side works without a human clicking.

Security

The bridge binds 127.0.0.1 only, on both ports. There is no remote surface and no authentication because there is nothing remote to authenticate. run_lua is arbitrary code execution inside the app holding your unsaved work, and is off unless you turn it on.

Licence

MIT. See LICENSE.

Aseprite is a trademark of Igara Studio S.A. This project is not affiliated with or endorsed by them.

Available Tools

18 tools
celCelsA
Destructive

Manage cels — one layer's image on one frame. Ops: 'list', 'create', 'clear', 'delete', 'move', 'copy', 'link', 'unlink', 'set' (position/opacity). 'move' is how you shift a whole limb between frames without redrawing it; 'link' shares one image across frames so a static part of a cycle stays in sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoCel origin, for 'set' and 'move'.
yNo
dxNoRelative move.
dyNo
opYes
frameNo1-based frame number. Omit to use the active frame.
layerNoLayer name. Omit to use the active layer.
framesNoFor 'link' across a range.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
opacityNo
toFrameNo
toLayerNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
celsNo
spriteYes
appliedNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false; the description builds on that by explaining the state effects of 'move' and 'link' and clarifying that 'set' modifies position/opacity. No contradiction with the annotations; the added semantics go beyond the structured hints.

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

Conciseness5/5

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

Two tight sentences: the definition and op list come first, then focused detail on the non-obvious move and link operations. No filler, no repetition of schema content.

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

Completeness4/5

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

For a 9-op, 12-parameter tool, the description covers the core concept and the most confusing workflows, while an output schema exists so return values need no explanation. Minor ambiguity remains around 'clear' vs 'delete' and 'copy', but the essential guidance is present.

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

Parameters3/5

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

Schema description coverage is approximately 50%, so the description is expected to help clarify undocumented parameters. It adds op-level context (position/opacity for 'set', frames for 'link', between-frames movement for 'move'), but leaves dx/dy, toFrame/toLayer, and the parameter implications of 'clear'/'delete'/'copy' implied rather than stated. Adequate, not thorough.

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

Purpose5/5

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

States a specific verb and a defined resource ('Manage cels — one layer's image on one frame') and enumerates the full operation set. The definition clearly distinguishes cels from sibling tools like layer or frame, and the move/ink examples clarify what the resource represents.

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

Usage Guidelines4/5

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

Provides concrete when-to-use guidance for the two least obvious operations: 'move' for shifting a limb between frames without redrawing, and 'link' for sharing an image across frames to keep a static part in sync. It doesn't name excluded sibling tools explicitly, but the scenarios give an agent enough context to select the right cel operation.

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

drawDrawA

Apply a batch of drawing operations to one cel, as a single undoable action. Ops: pixels, line, polyline, rect, ellipse, fill, replace, dither, gradient, clear, blit. Batch aggressively — a whole sprite in one call is normal and correct, and it means the user can undo your work with one Ctrl+Z. Set paletteLock (default true) to snap every colour to the sprite's palette by perceptual distance before anything is written, so you cannot silently widen a curated palette. Ops run in array order, so paint fills before outlines and outlines before highlights.

ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesApplied in order, in one transaction.
frameNo1-based frame number. Omit to use the active frame.
labelNoName shown in Aseprite's undo history. Describe the intent, e.g. 'shade helmet'.
layerNoLayer name. Omit to use the active layer.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
createCelNoCreate the cel if the target layer/frame has none.
paletteLockNoSnap every colour to the nearest palette entry (CIELAB ΔE). Set false only when the user asked to introduce new colours.
selectionOnlyNoClip every op to the current selection.

Output Schema

ParametersJSON Schema
NameRequiredDescription
frameYes
layerYes
boundsNoBounding box actually touched.
spriteYes
opsAppliedYes
colorsSnappedYesColours palette-lock moved, and how far. A large ΔE means the palette lacks that colour.
pixelsChangedYes

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses behavior beyond the annotations: operations are applied as a single undoable action, paletteLock snaps colors perceptually before writes, ops run in array order, and the tool cannot silently widen the palette. This gives an agent a clear model of side effects and sequencing, especially useful since the annotations are all false and uninformative.

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

Conciseness5/5

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

Three focused sentences: first states what it does, second gives the critical batching/undo guidance, third covers ordering and palette safety. Every sentence earns its place with no filler.

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

Completeness4/5

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

For a complex tool with 11 op types and 8 parameters, the description covers the essential behavioral model: batching, undo, paletteLock, and execution order. The rich input schema and output schema cover parameter details and return values, so the remaining gaps (e.g., selection-only clipping, createCel behavior) are adequately handled by schema descriptions rather than requiring narrative.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline applies. The description reinforces paletteLock semantics and op ordering, but these are also present in the schema ('Applied in order, in one transaction', 'Snap every colour to the nearest palette entry'). It adds little genuinely new meaning beyond the structured schema.

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

Purpose5/5

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

States a specific verb and resource: 'Apply a batch of drawing operations to one cel'. The list of supported ops (pixels, line, rect, fill, etc.) makes the tool's scope unmistakable and clearly distinguishes it from sibling tools like frame, layer, or transform.

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

Usage Guidelines4/5

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

Provides clear usage direction: batch aggressively, treat one whole sprite as a normal call, and rely on the single-undo behavior. It also explains when paletteLock should be kept at its default. It does not explicitly name alternative tools for non-drawing actions, but the operational guidance for how to use the tool is strong.

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

exportExportA
Destructive

Write game-ready files. Ops: 'png' (single frame), 'gif' (animation), 'spritesheet' (packed sheet plus a JSON atlas with per-frame and per-tag data), 'frames' (numbered PNGs), 'aseprite' (save a copy of the source). Spritesheet is what an engine actually consumes: pass sheetType and byTag to control layout. Exporting does not save the working document — use sprite_manage op 'save' for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
pathYesOutput file path. For 'frames', a pattern like 'walk_{frame}.png'.
tagsNoExport only these tags.
trimNoTrim transparent margins; the atlas keeps the original offsets.
byTagNoSplit the sheet by animation tag.
frameNo1-based frame number. Omit to use the active frame.
scaleNoInteger upscale, nearest-neighbour.
layersNoExport only these layers.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
paddingNoPixels between frames; prevents bleed at non-integer zoom.
sheetTypeNoSpritesheet layout.horizontal
includeJsonNoWrite a sibling JSON atlas for 'spritesheet'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
atlasNo
filesYes
frameNoWhich frame a single-frame export wrote. Defaults to the active frame, which is not always the one you drew on.
widthNo
heightNo
spriteYes
frameCountNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark destructive/read/write, so description doesn't need to repeat safety; it adds the critical side-effect boundary: exporting writes files but does not save the working document, and aseprite saves a copy. It also reveals atlas output content (per-frame and per-tag data), which annotations 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.

Conciseness5/5

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

Two sentences, no filler; first sentence carries the core action and op menu, second covers the key layout guidance and the save distinction. Front-loaded and every phrase earns its place.

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

Completeness4/5

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

Given 12 parameters and a schema with 92% coverage plus an output schema, the description need only supply orientation and decision criteria, which it does. The only omitted details (paraminterplay around layers/tags/trim) are already in the property descriptions.

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

Parameters4/5

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

With 92% schema description coverage, baseline iss met; description adds a layer beyond schema by explaining what each op produces and directing the agent to sheetType and byTag for layout control. This helps select among enum values without reopening the schema.

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

Purpose5/5

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

Description opens with a specific verb+resource ('Write game-ready files') and enumerates each op with its output type, distinguishing export from document-saving. It also identifies spritesheet as the engine-consumable format, making the tool's purpose concrete.

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

Usage Guidelines5/5

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

States a clear use case for spritesheet ('what an engine actually consumes') and explicitly names the alternative for a different need ('use sprite_manage op save for that'). The when-not boundary (exporting does not save) is explicit, so an agent can route correctly.

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

frameFramesB
Destructive

Manage animation frames. Ops: 'list', 'add', 'duplicate', 'delete', 'set_duration', 'activate', 'reorder'. Durations are milliseconds per frame and carry most of the life in a cycle — hold a contact pose longer than a pass pose. Use count to add several at once and durations to set a whole cycle's timing in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
countNo
frameNo1-based frame number. Omit to use the active frame.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
toIndexNoFor 'reorder'.
linkCelsNoFor 'duplicate': share the cel image instead of copying it, so edits apply to both.
durationsNoPer-frame durations from frame 1, for 'set_duration'.
afterFrameNoInsert position. Default: at the end.
durationMsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
framesNo
spriteYes
frameCountYes
activeFrameNo
totalDurationMsNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate destructive behavior, and the description adds useful context about durations being milliseconds and about using count for bulk addition. However, it does not disclose side effects such as index shifting after deletion or reorder behavior, relying partially on the destructive hint.

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

Conciseness4/5

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

The description is compact and front-loaded with the main purpose. The extra guidance on durations and count is useful and earns its place, though the contact-pose analogy is slightly stylistic rather than essential.

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

Completeness3/5

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

For a multi-operation tool with nine parameters, the description gives useful tips but does not map operations to their relevant parameters. An agent may still need to infer which parameters apply to each op, though the schema and output schema help fill some gaps.

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

Parameters3/5

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

With 67% schema coverage, the description adds meaning for count and durations, which are otherwise under-documented. It does not fully compensate for all undocumented parameters like durationMs, but it provides valuable context for the most nuanced timing-related parameters.

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

Purpose4/5

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

The description clearly identifies the tool as managing animation frames and lists the supported operations. It is specific enough to distinguish from siblings like layer or cel, but it does not explicitly differentiate itself from those sibling tools.

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

Usage Guidelines3/5

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

The description implies usage for frame-related operations and offers practical tips for count and durations. However, it does not explicitly state when to prefer this tool over siblings, nor does it provide exclusions or conditions for 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.

layerLayersA
Destructive

Manage layers. Ops: 'list', 'create', 'rename', 'delete', 'reorder', 'set' (visibility/opacity/blend/lock), 'group', 'ungroup', 'merge', 'duplicate', 'activate'. Pass batch to run several in one undoable action — building a rig in one call is the normal use. A character that will be animated wants its parts on separate layers (head, torso, arm-far, arm-near, leg-far, leg-near) before any frames exist; splitting baked pixels apart later is far more work.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNoSingle operation. Use `batch` instead for several.
nameNo
batchNoArray of operation objects, each shaped like the single-op arguments. Applied in order.
indexNoTarget stack position for 'reorder'; 0 is bottom.
namesNoFor 'merge' and bulk 'group'.
parentNoGroup layer to nest under.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
newNameNo
opacityNo
visibleNo
editableNo
blendModeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
layersNo
spriteYes
appliedNo
activeLayerNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already supply destructiveHint=true, so the description does not need to restate destructiveness. It adds valuable context that batch is undoable and that layer management must happen before animation frames, but it does not disclose what delete/merge actually destroy or how irreversible operations behave outside batch. No contradiction with annotations.

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

Conciseness4/5

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

Three dense sentences: an operation list, a batch directive, and an animation best-practice warning. Each sentence earns its place and the most actionable guidance is front-loaded. The operation enumeration is long but necessary for a multi-op tool.

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

Completeness2/5

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

For an 11-op, 12-param tool with zero required parameters, this description is incomplete. It never states which parameters each operation needs, how a target layer is identified for rename/delete/set/activate, or how reorder/group/merge combine with index, names, and parent. An agent would still have to guess the op-parameter contract, so the tool is not fully callable from this description alone.

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

Parameters3/5

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

The description adds meaning to the batch parameter and clarifies 'set' as visibility/opacity/blend/lock, plus gives a concrete layer-naming pattern. However, with schema description coverage at 50%, it fails to map operations to parameters such as name vs newName, index for reorder, or names for merge/group. The schema partially compensates, but the description does not close the gap.

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

Purpose4/5

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

The first sentence clearly identifies the resource ('Manage layers') and the explicit operation list ('list', 'create', 'rename', 'delete', etc.) gives a concrete boundary. It does not explicitly contrast with sibling tools such as frame or cel, so it misses the top score, but the purpose is unmistakable.

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

Usage Guidelines4/5

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

The description gives strong usage context: use batch to run several operations in one undoable action, building a rig in one call is normal, and layer parts should exist before frames to avoid costly pixel splitting. It does not list exclusions or when to prefer sibling tools, but the practical guidance is clear.

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

lookLook at the spriteA
Read-only

See what is actually on the canvas. Ops: • 'preview' — a nearest-neighbour upscaled PNG of the active frame (~1024px long edge). Use for overall read: silhouette, colour, whether it looks like the thing. • 'ascii' — an exact text grid, one glyph per pixel with a colour legend and coordinate rulers. Use to verify precise pixel positions and values, to count cells, or on any client without vision. Capped at 64×64; pass a region to crop. • 'filmstrip' — every frame composited into one image. The only reliable way to review an animation, since a vision model reads just the first frame of a GIF. • 'diff' — a pixel-level text diff between two frames: '.' unchanged, '-' erased, glyph = the new colour. Use it to confirm exactly what an edit touched. Draw, then look, then fix. Do not report a sprite finished without looking at it.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNopreview
frameNo1-based frame number. Omit to use the active frame.
layerNoRead a single layer instead of the composited image.
scaleNoInteger upscale for image ops. Omitted means auto.
regionNoCrop. Required for 'ascii' on sprites larger than 64×64.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
toFrameNoDiff: the later frame.
fromFrameNoDiff: the earlier frame.

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
rowsNo
textNoThe grid, for 'ascii' and 'diff'.
scaleNo
widthYes
framesNo
heightYes
legendNoglyph → #rrggbb.
spriteYes
columnsNo
totalPixelsNo
changedPixelsNo

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses substantial behavioral details absent from the annotations: preview is a nearest-neighbour upscaled PNG around 1024px, ascii is capped at 64×64 and includes a colour legend and rulers, filmstrip composites every frame because vision models only read the first frame of a GIF, and diff uses specific glyphs for unchanged/erased/changed pixels. These details go far beyond the readOnlyHint and openWorldHint annotations and help the agent predict exact tool behavior.

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

Conciseness5/5

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

The description is long but tightly organized as a bullet list where each operation is a single line with purpose and output. The opening one-liner sets scope, the ops cover the full tool vocabulary, and the closing workflow sentence ('Draw, then look, then fix') earns its place by reinforcing when to invoke the tool. No filler is present.

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

Completeness5/5

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

Given the tool has 8 parameters, an output schema, and read-only annotations, the description covers the essential operational context: what each op returns, when to use each, size limits, and a recommended loop. The description is complete enough for an agent to select and invoke the tool correctly without needing supplementary documentation.

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

Parameters4/5

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

Schema coverage is high at 88%, so the schema already documents most parameters. The description adds significant semantic value by explaining what each op value means and how parameters like region interact with ascii's size cap. It stops short of explaining every parameter's edge case, but the combination of schema and description is strong.

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

Purpose5/5

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

The description opens with a clear verb and resource ('See what is actually on the canvas') and then enumerates four concrete operations with distinct outputs: preview, ascii, filmstrip, and diff. This clearly distinguishes the tool from siblings like read_pixels and validate by scoping it to visual inspection of the sprite/canvas.

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

Usage Guidelines5/5

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

Every operation is paired with an explicit use case ('Use for overall read', 'Use to verify precise pixel positions', 'The only reliable way to review an animation', 'Use it to confirm exactly what an edit touched'). The description also gives a workflow directive ('Draw, then look, then fix') and warns against reporting a sprite finished without looking, making selection criteria explicit.

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

palettePaletteA

Read and shape the sprite's palette. Ops: • 'get' — current palette with per-colour usage counts. • 'set' — write specific indices, or replace the palette wholesale. • 'preset' — load a bundled palette (pico8, gameboy, gameboy-pocket, cga, 1bit, grayscale-8). • 'load' — read a .gpl/.hex/.pal/.png palette file from disk. • 'ramp' — generate a hue-shifted ramp from a base colour and append it. Shadows rotate toward blue, highlights toward orange; a ramp that only changes brightness is the clearest tell of machine-made pixel art. • 'analyze' — report ramp structure, contrast, near-duplicate entries and colours used in the art that are not in the palette. Decide the palette before drawing. Retro-fitting one onto finished art means repainting.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
baseNoBase colour for op 'ramp'.
pathNoPalette file for op 'load'.
stepsNoRamp length.
colorsNoFor op 'set': the colours to write.
presetNoPreset key for op 'preset'.
spreadNoHow far the ramp reaches into shadow and light.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
replaceNoFor op 'set'/'preset': replace the whole palette instead of merging.
remapArtNoWhen replacing a palette, repaint existing pixels to the nearest new colour instead of leaving them off-palette.
startIndexNoFor op 'set': where `colors` starts. Ignored when `replace` is true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
rampNo
sizeNo
usageNo
colorsNo
spriteNo
analysisNo
availablePresetsNo

TDQS

A3.9/5.0
Behavior3/5

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

The description goes beyond the bare annotations by describing operation effects: 'set' writes or replaces, 'ramp' appends a hue-shifted ramp, and 'analyze' reports palette issues. However, it does not disclose which operations are destructive or how replacing/remapping affects existing pixels, leaving meaningful behavioral gaps for a mutation-capable tool.

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

Conciseness4/5

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

The bulleted operation list is well organized and front-loaded, making the tool's capabilities scannable. The closing 'Decide the palette before drawing' advice is useful, though the artistic commentary about machine-made pixel art is slightly extraneous and could be trimmed without losing operational clarity.

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

Completeness5/5

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

For a tool with 11 parameters, six operations, and an output schema, the description plus schema provide a complete picture. The description covers each operation's purpose, key inputs, and output highlights, while parameter details are handled by the high-coverage schema. The workflow warning also helps the agent apply the tool correctly.

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

Parameters4/5

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

With 91% schema coverage, the schema already documents most parameters, so the baseline is 3. The description adds value by mapping operations to their relevant inputs, e.g. 'load' reads .gpl/.hex/.pal/.png files, 'preset' lists bundled palettes, and 'ramp' describes base-colour behavior. This enriches parameter understanding beyond the raw schema.

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

Purpose4/5

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

The description clearly states the tool's resource and action: 'Read and shape the sprite's palette,' and enumerates six distinct operations with concrete outcomes. It does not explicitly contrast itself with nearby siblings like 'recolor', but the operation list makes the scope understandable.

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

Usage Guidelines4/5

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

The description gives practical workflow guidance: 'Decide the palette before drawing. Retro-fitting one onto finished art means repainting,' which tells the agent when in a workflow this tool belongs. It does not name alternative tools or explicitly say when not to use it, so it falls short of full routing guidance.

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

preflightPreflightA
Read-only

Check that Aseprite is connected and report what this session can do. Call this FIRST in any pixel-art task and stop if ready is false — every editing tool writes into the user's open Aseprite window, and there is no useful fallback when that window is not there.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
readyYesTrue only when Aseprite is attached and accepting commands.
featuresYesOptional capabilities this extension build supports.
directiveYesWhat to do next, in one sentence.
activeSpriteNo
asepriteVersionNo
bridgeConnectedYes
pluginConnectedYes
extensionVersionNo

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond annotations: the tool returns a readiness condition (`ready`), instructs halting when false, and reveals that all editing tools depend on the open window. The readOnlyHint annotation is consistent with the check/report behavior, and no contradiction exists.

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

Conciseness5/5

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

The description is two sentences with no filler. The core purpose is front-loaded, followed immediately by the critical usage directive and consequence. Every clause contributes actionable information.

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

Completeness5/5

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

For a zero-parameter preflight tool, the description is complete: it names the operation, gives the call order, provides the failure condition, and explains the underlying dependency. An output schema exists to describe the return values, so no additional return-format detail is needed.

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

Parameters4/5

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

With zero parameters and 100% schema description coverage, the baseline is 4. The description does not need to explain parameters, and it fulfills the requirement by adding no irrelevant parameter detail.

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

Purpose5/5

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

The description states a specific verb ('Check') and resource ('Aseprite is connected') and adds the reporting function ('report what this session can do'). This clearly distinguishes preflight as a connectivity/session-check tool from sibling editing tools like layer, draw, and transform.

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

Usage Guidelines5/5

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

Explicitly instructs 'Call this FIRST in any pixel-art task' and provides the stop condition ('stop if ready is false'). It also explains why this matters, that every editing tool writes into the user's open Aseprite window with no useful fallback, giving the agent a clear decision rule and rationale.

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

read_pixelsRead pixelsA
Read-only

Read a rectangular region as structured data: a list of distinct colours plus a row-major index grid. Use this when you need to compute over pixels (sample a palette from art, find a silhouette edge, copy a region) rather than just look at them. For eyeballing, 'look' is cheaper.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameNo1-based frame number. Omit to use the active frame.
layerNoLayer name. Omit to use the active layer.
regionNoOmit to read the whole canvas.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
compositeNoRead the flattened image. False reads only the target layer's cel.

Output Schema

ParametersJSON Schema
NameRequiredDescription
xYes
yYes
gridYesRow-major indices into `colors`.
widthYes
colorsYesDistinct colours; index 0 is fully transparent.
heightYes
spriteYes
uniqueColorsYes

TDQS

A4.5/5.0
Behavior4/5

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

With annotations already declaring readOnlyHint=true and openWorldHint=false, the safety profile is covered. The description adds meaningful behavior beyond annotations by specifying the exact return structure ('list of distinct colours plus a row-major index grid') and a performance/cost hint ('look is cheaper'). This gives an agent useful expectations about result shape and relative cost, going beyond the safety annotations.

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

Conciseness5/5

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

Three sentences with zero filler: the first defines the operation and output, the second gives concrete use cases, the third names the cheaper alternative for visual inspection. Information is front-loaded and every sentence earns its place, making the description efficient and scannable.

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

Completeness5/5

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

For a read-only tool with five optional parameters, a nested region object, and an output schema, the description is fully sufficient. It covers the result format, when to use the tool, and when to prefer a sibling. The schema handles parameter details and an output schema exists, so nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema fully documents all five parameters, including defaults and fallback behavior (e.g., 'Omit to use the active frame'). The description does not add parameter-specific details, but its mention of 'row-major index grid' and 'rectangular region' clarifies the semantics of the region and output. Baseline 3 is appropriate because the schema carries the parameter-documentation burden.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read a rectangular region as structured data: a list of distinct colours plus a row-major index grid.' This precisely states both the operation and the output format, leaving no ambiguity about what the tool does. It also differentiates from siblings by contrasting with 'look' ('For eyeballing, look is cheaper'), making the tool's niche clear.

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

Usage Guidelines5/5

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

The description explicitly tells an agent when to use this tool: 'Use this when you need to compute over pixels (sample a palette from art, find a silhouette edge, copy a region) rather than just look at them.' It then names the alternative ('look') and the condition for choosing it ('For eyeballing'), giving direct routing guidance instead of leaving it to inference.

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

recolorRecolorA

Change colours in a region by intent, staying palette-legal. Ops: • 'shade' — darken or lighten with proper hue shifting (shadows cool, highlights warm). Use this instead of picking a darker hex by hand. • 'snap' — pull off-palette pixels onto the nearest palette colour by perceptual (CIELAB) distance. • 'replace' — swap one exact colour for another. • 'hue_shift' — rotate hue, e.g. to make a colour variant of a finished sprite. • 'desaturate' — drop toward grey, useful for a value check. Operates on a region's distinct colours in one pass, so a 64×64 recolour is one undo step, not four thousand.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
toNoFor 'replace'.
fromNoFor 'replace'.
frameNo1-based frame number. Omit to use the active frame.
layerNoLayer name. Omit to use the active layer.
amountNoFor 'shade': negative darkens, positive lightens. One ramp step is roughly 0.15.
regionNoOmit to affect the whole cel.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
degreesNoFor 'hue_shift'.
strengthNoFor 'desaturate'.
selectionOnlyNo
clampToPaletteNoSnap the result back onto the palette. Turn off only when growing the palette deliberately.

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
spriteYes
mappingYesExactly which colour became which, and how many pixels each move touched.
pixelsChangedYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already signal readOnly=false and destructiveHint=false; the description adds meaningful behavioral nuance beyond that: it operates on distinct colours in one pass, produces a single undo step, and enforces palette legality by intent. This helps set expectations about scope and 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.

Conciseness5/5

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

The description is well-structured with a front-loaded summary, a compact bulleted list of operations, and a closing note on the undo-step behavior. Every sentence earns its place, and the format is easy for an agent to scan.

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

Completeness5/5

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

For a 12-parameter tool with an output schema and 83% schema coverage, the description covers the behavioral essentials: the five modes, when to use them, palette constraints, region scope, and single-undo-step behavior. The schema handles parameter defaults and valid ranges, so nothing critical is missing.

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

Parameters4/5

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

Schema coverage is high (83%), but the description adds semantic value beyond the schema by explaining perceptual concepts such as 'shadows cool, highlights warm', 'CIELAB distance', and 'value check'. It also clarifies that amount is a ramp step and how each op relates to the relevant parameters.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Change colours in a region by intent, staying palette-legal.' It then enumerates five concrete operations (shade, snap, replace, hue_shift, desaturate), which clearly distinguishes this tool from siblings like draw or palette.

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

Usage Guidelines4/5

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

Each operation is paired with a use case, e.g., 'shade' is recommended instead of picking a darker hex by hand, and 'desaturate' is useful for a value check. It does not explicitly name sibling tools as alternatives, but the intent-based guidance is strong enough for an agent to decide when to invoke it.

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

referenceReference imageA

Bring an external image into the sprite as a reference layer, so you can trace proportions or sample colours from it. Ops: 'import' (place an image on a locked, semi-transparent layer above the art), 'sample_palette' (read its dominant colours without importing), 'list', 'remove'. Importing at a different size uses nearest-neighbour; a photo scaled down to 32×32 is a starting point for a silhouette, never a finished sprite.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
opYes
fitNoHow to size the image against the canvas.contain
nameNoLayer name. Default: 'reference'.
pathNoImage file to read.
colorsNoFor 'sample_palette'.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
opacityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
layerNo
widthNo
heightNo
spriteYes
paletteNoDominant colours with their share of the image.
referencesNo

TDQS

A4.6/5.0
Behavior5/5

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

With only readOnlyHint:false and openWorldHint:false in annotations, the description carries the behavioral burden and delivers: importing places the image on a locked, semi-transparent layer above the art, size changes use nearest-neighbour resampling, and a photo scaled to 32×32 is explicitly characterized as a silhouette starting point. This discloses mutation, layer placement, transparency, and resampling behavior that annotations alone cannot convey. No contradiction with 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.

Conciseness5/5

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

Roughly 4 sentences, purpose-first: main goal, compact op list with embedded semantics, and a single closing caveat that earns its place by preventing misuse. No fluff or repetition of the schema. The op list is dense yet scannable.

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

Completeness4/5

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

For a tool with 9 parameters, 4 ops, and an output schema (so return values need not be described), the description covers the ope semantics, the laryal behavior, opacity context, and a size-related quality warning. Minor gaps remain: 'remove' and 'list' behaviors are left to the reader's inference, and the relationship between opacity and the import op is only implicit. This is solid but not exhaustive.

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

Parameters4/5

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

Schema coverage is 56%, so the schema partially documents parameters (size, sprite have descriptions), and the description adds genuine meaning to the critical required parameter `op` by explaining what each enum value does behaviorally. It also aligns 'semi-transparent' with the opacity parameter. Other parameters like x/y are positional and self-evident with defaults, so the lack of dedicated parameter prose is acceptable, though a 5 would require systematically richer guidance for opacity and size.

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

Purpose5/5

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

The description opens with a specific verb+resource pair ('Bring an external image into the sprite as a reference layer') and gives the concrete use cases (tracing proportions, sampling colours). The four ops are each given a one-line semantic ('import' places a locked, semi-transparent layer; 'sample_palette' reads colours without importing), which clearly delineates the tool's scope from siblings like palette, layer, and read_pixels.

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

Usage Guidelines4/5

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

The description conveys clear context for each op: import is for placing a reference layer, sample_palette is for reading dominant colours 'without importing', list and remove round out lifecycle management. It also gives a practical caveat about when an import result is acceptable (a starting point, 'never a finished sprite'). It does not explicitly name sibling alternatives or state when-not-to-use, so it stops short of a 5.

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

selectSelectionA
Idempotent

Read or change the active selection. Ops: 'get', 'none', 'all', 'rect', 'ellipse', 'color' (select every pixel matching a colour), 'invert', 'grow', 'shrink'. A selection scopes draw, transform and recolor, which is usually cheaper and safer than masking by hand.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
modeNoHow this selection combines with the existing one.replace
rectNo
colorNoFor op 'color'.
frameNo1-based frame number. Omit to use the active frame.
layerNoLayer name. Omit to use the active layer.
amountNoPixels, for grow/shrink.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
toleranceNo
contiguousNoFor op 'color'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
emptyYes
boundsNo
spriteYes
pixelCountYes

TDQS

A4.2/5.0
Behavior4/5

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

Discloses that the tool reads or changes the active selection and that the selection subsequently scopes drawing, transforms, and recoloring. This adds behavioral context beyond the annotations, which already flag readOnlyHint=false and idempotentHint=true. No contradiction with annotations.

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

Conciseness5/5

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

Two tight sentences front-load the purpose, list all operations, and provide a cost/benefit rationale. Every phrase earns its place with no filler or redundancy.

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

Completeness4/5

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

Given the output schema and annotations, the description sufficiently covers the conceptual model and op variety. Minor details like how mode combines with the existing selection or how rect coordinates are specified are left to the schema, which is acceptable for a tool with rich structured metadata.

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

Parameters3/5

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

Schema descriptions already cover frame, layer, amount, sprite, color, and contiguous, and the enum values are self-explanatory. The description adds meaning only for the 'color' operation ('select every pixel matching a colour'). With schema coverage at 70%, the description provides modest additional value but does not compensate for undocumented params like rect and mode.

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

Purpose5/5

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

States a specific verb and resource ('Read or change the active selection') and enumerates all nine operations. The selection resource is clearly distinct from sibling tools like layer, draw, transform, and recolor, so an agent can tell them apart 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.

Usage Guidelines4/5

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

Explains that a selection scopes draw, transform, and recolor, and that it is usually cheaper and safer than masking by hand. This gives clear contextual guidance for when to use the tool, though it does not explicitly name sibling alternatives or state 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.

sprite_infoSprite infoA
Read-only

Full structured state of a sprite: dimensions, colour mode, palette, every layer (with opacity, blend mode, visibility, group nesting), every frame with its duration, animation tags, slices and the current selection. Read this before editing — guessing at layer names or frame counts is the most common way an agent corrupts someone's file.

ParametersJSON Schema
NameRequiredDescriptionDefault
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
includeSlicesNo
includePaletteNoInclude the full palette as hex.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
tagsYes
widthYes
framesYes
heightYes
layersYes
slicesNo
paletteNo
filenameNo
colorModeYes
selectionNo
frameCountYes
activeFrameNo
activeLayerNo
transparentIndexNo

TDQS

A4.1/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation, and the description adds useful behavioral context: reading full state before editing prevents file corruption from guesswork. No contradictions with annotations exist.

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

Conciseness5/5

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

Two sentences carry the essential information with no filler. The core purpose is front-loaded in the first sentence, and the second sentence provides a high-value usage warning that earns its place.

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

Completeness5/5

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

For a read-only inspection tool with an output schema, the description is complete: it enumerates what state is available, signals when to call it, and explains why it matters. Missing details like optional parameter behavior are already covered by the input schema.

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

Parameters3/5

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

Schema description coverage is 67%, with 'sprite' and 'includePalette' already documented in the schema. The description itself adds no additional parameter-level guidance, and 'includeSlices' lacks schema documentation, but its meaning is reasonably inferable from the name and the return-state list.

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

Purpose4/5

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

The description clearly identifies the tool as returning the full structured state of a sprite, enumerating dimensions, color mode, palette, layers, frames, tags, slices, and selection. It is specific about the resource and content, but it does not explicitly distinguish itself from sibling tools like 'look' or 'read_pixels'.

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

Usage Guidelines4/5

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

The description gives a clear when-to-use instruction: 'Read this before editing.' It also explains why using it beforehand matters by warning against guessing layer names or frame counts. It does not mention alternatives or when not to use it, so it stops short of a 5.

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

sprite_manageManage spritesA
Destructive

Open, create, focus, resize, save and close sprites in the running Aseprite session. Ops: 'list' (open documents), 'new', 'open', 'activate', 'save', 'save_as', 'close', 'resize_canvas', 'set_properties'. Canvas resize keeps existing pixels — pass an anchor to say where they land.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
pathNoFile path for 'open' and 'save_as'.
forceNoAllow 'close' to discard unsaved changes. Ask the user before setting this.
widthNo
anchorNoWhere existing pixels sit after 'resize_canvas'.center
heightNo
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
colorModeNoFor 'new'. Indexed keeps a sprite honest about its palette.
pixelAspectNoe.g. '1:1' or '1:2'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
pathNo
widthNo
heightNo
spriteNo
spritesNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this tool can mutate state. The description adds one meaningful behavioral detail: canvas resize preserves existing pixels and uses an anchor to position them. It does not go further to explain what 'close' does to unsaved changes or that 'save' overwrites files, but the destructive annotation covers the general risk and the schema's 'force' parameter says to ask the user before discarding changes.

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

Conciseness5/5

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

The description is compact—two sentences—and front-loads the action verb set before listing operations. The operation list is organized and scannable, and the resize note earns its place by adding targeted behavior not obvious from op names alone. There is no fluff or repetition.

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

Completeness3/5

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

For a tool with nine operations and nine parameters, the description gives a solid overview but leaves meaningful gaps: it never explains what 'set_properties' changes, nor does it map which parameters belong to which operation (e.g., 'new' likely needs width/height/colorMode, while 'open' needs path). The schema's per-parameter descriptions partly fill this, and an output schema exists, but the description itself still requires the agent to infer operation-parameter pairings. 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.

Parameters3/5

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

Schema coverage is 67%, and the description does add value by defining what 'list' returns (open documents) and by explaining the anchor's role in canvas resize. The schema already documents path, force, sprite, colorMode, pixelAspect, and anchor, leaving op, width, and height unduscussed in both schema and description; however, op is self-describing via its enum and width/height are intuitive integers. Overall the description complements the schema but does not fully compensate for the minimal param guidance on op-specific required inputs.

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

Purpose5/5

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

The description uses specific verbs ('Open, create, focus, resize, save and close sprites') and names the resource (sprites in the running Aseprite session), which gives an agent a clear subject and action set. It also enumerates all supported operations, making the tool's scope explicit and distinguishing it from sibling tools that operate on layers, frames, or cels. The title alone is generic, but the description fully specifies what the tool does.

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

Usage Guidelines3/5

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

The description sets a clear context—operations inside the running Aseprite session—and gives a list of operations, which implicitly tells an agent this is the sprite-management entry point. However, it does not explicitly state when to prefer this over siblings like sprite_info or layer, nor does it call out exclusions such as 'for layer-only changes use the layer tool.' The resize guidance ('keeps existing pixels — pass an anchor') is useful but is op-level instruction, not tool-selection guidance.

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

tagAnimation tagsB
Destructive

Manage animation tags — the named frame ranges a game engine imports as 'idle', 'walk', 'attack'. Ops: 'list', 'create', 'update', 'delete'. Tag every cycle before export; an untagged spritesheet is a pile of frames the engine cannot address.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
toNoLast frame, 1-based, inclusive.
fromNoFirst frame, 1-based, inclusive.
nameNo
colorNoTag colour in the timeline, #rrggbb.
repeatNo0 means loop forever.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
newNameNo
directionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsYes
spriteYes

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already signal readOnlyHint=false and destructiveHint=true, so the mutation profile is known. The description adds no further operational behavior such as whether update/overwrite existing tags, what delete removes, or lifecycle consequences beyond saying untagged spritesheets are unusable — which is workflow context, not tool behavior.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core definition, then ops, then workflow guidance. The 'pile of frames' phrase is evocative but slightly ornamental; otherwise every part earns its place.

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

Completeness2/5

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

This is a high-complexity multi-op tool (9 params, 4 operations, an output schema) and the description does not specify op-parameter contracts, e.g. what create requires vs update vs delete. The 'tag before export' guidance and annotations help, but an agent still cannot reliably decide the correct param set for each op from this definition.

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

Parameters3/5

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

The description contributes the key model that tags are named frame ranges, giving meaning to name/from/to, and it restates the op enum. However, it does not map which parameters are valid for each operation, nor explain newName or direction; with only 56% schema coverage, that leaves meaningful gaps.

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

Purpose4/5

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

The description identifies the resource ('animation tags') and explains what tags are (named frame ranges imported as 'idle', 'walk', 'attack'), and it enumerates the supported operations. It is clear enough to distinguish from sibling frame/cel tools, though 'Manage' is somewhat generic and the target sprite is implied 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.

Usage Guidelines4/5

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

It gives clear operational context: 'Tag every cycle before export', telling the agent when tags must be maintained. It does not explicitly name alternatives or say when not to use this tool, so it falls short of fully explicit routing.

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

tilesetTilesetsA

Work with Aseprite tilemap layers. Ops: 'list', 'create_layer', 'get' (tiles as a packed image plus indices), 'stamp' (place tiles by grid coordinate), 'pack' (deduplicate a hand-painted mockup into a tileset plus a reconstructing tilemap), 'export' (Tiled .tsj, Godot .tres or JSON, with the packed PNG beside it). Requires an extension build advertising the 'tileset' feature — check preflight first.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
nameNo
pathNoOutput path for 'export' and 'get'.
frameNo1-based frame number. Omit to use the active frame.
layerNoLayer name. Omit to use the active layer.
tilesNoFor 'stamp'. x/y are tile-grid cells, not pixels.
formatNotiled
layoutNoAutotile layout for 'export'.grid
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
tileWidthNo
toleranceNoFor 'pack': treat near-identical tiles as one.
tileHeightNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
filesNo
layerNo
spriteYes
tilesetsNo
tileCountNo

TDQS

A4.1/5.0
Behavior4/5

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

With minimal annotations (readOnlyHint false, openWorldHint false), the description carries the burden and largely meets it: it discloses mutating operations (create_layer, stamp, pack, export) and reveals output side effects such as produced files (Tiled .tsj, Godot .tres, JSON, packed PNG). It does not explicitly mention file overwriting or undo implications, but the operational effects are clear enough for an agent.

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

Conciseness4/5

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

The description is two dense sentences, front-loaded with the tilemap-layer scope and then enumerating operations efficiently. There is no fluff, though the packed operation list would benefit from slight structural separation for readability. Every sentence earns its place.

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

Completeness4/5

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

For a 12-parameter, 6-operation tool, the description gives a solid overview of available operations, outputs, and the preflight prerequisite. The presence of an output schema covers return-value expectations. It lacks a per-op parameter matrix, but the combination of op parentheticals, schema field descriptions, and preflight guidance is sufficient for initial correct usage.

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

Parameters3/5

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

Schema description coverage is moderate at 58%, and the description adds operation-level meaning (e.g., what each op achieves) rather than parameter-level syntax. It does not elaborate on undocumented parameters such as 'name', 'tileWidth', or 'tileHeight', and per-op required-parameter combinations are left implicit. This aligns with a baseline score of 3: helpful but not comprehensive.

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

Purpose5/5

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

The description explicitly identifies the resource (Aseprite tilemap layers) and lists six specific operations with clarifying parentheticals: 'get' returns a packed image plus indices, 'stamp' places tiles by grid coordinate, 'pack' deduplicates a mockup, and 'export' writes Tiled/Godot/JSON formats. This scope clearly distinguishes the tool from sibling tools like 'layer' or 'export' by focusing on tilemap-specific workflows.

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

Usage Guidelines4/5

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

The description states the tool is for tilemap layers and adds a concrete prerequisite: it requires an extension build advertising the 'tileset' feature and advises checking preflight first. It does not explicitly name sibling alternatives or when-not-to-use cases, but the tilemap-layer scope provides clear contextual boundaries.

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

transformTransformA

Move, flip, rotate or scale pixels. Ops: 'translate', 'flip', 'rotate', 'scale', 'outline', 'crop_to_content'. Rotation is only clean at 90° multiples — arbitrary angles destroy pixel art, so anything else needs allowLossy. Scaling is nearest-neighbour and integer-only for the same reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
dxNo
dyNo
opYes
axisNoFor 'flip'.
angleNoDegrees, clockwise. For 'rotate'.
colorNoOutline colour, for 'outline'.
frameNo1-based frame number. Omit to use the active frame.
layerNoLayer name. Omit to use the active layer.
scopeNoWhat the transform applies to. 'selection' falls back to the cel when nothing is selected.selection
factorNoFor 'scale'.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
thicknessNo
allowLossyNoPermit a non-90° rotation or non-integer scale. Ask the user first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYes
scopeYes
boundsNo
spriteYes
pixelsChangedYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate the tool is not read-only and not destructive, so the description does not need to restate that. It adds useful behavioral context: arbitrary rotations can visually ruin pixel art, non-90° angles need allowLossy, and scaling is nearest-neighbour/integer-only. This goes beyond the structured annotations and helps the agent choose safe settings.

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

Conciseness5/5

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

Two sentences carry the behavior, the op list, and the key constraints without wasted words. The core action is front-loaded, and the caveats follow naturally. The em-dash and short clauses keep it scannable.

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

Completeness4/5

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

For a 13-parameter tool with six ops, the definition could explain outline and crop_to_content more explicitly, but the schema covers most parameter meanings and an output schema exists. The description properly highlights the only genuinely dangerous behaviors (lossy rotation and scaling). The remaining gaps like thickness are minor and inferable from op name plus schema bounds.

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

Parameters3/5

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

The schema already describes most parameters, including axis, angle, color, scope, factor, and allowLossy. The description adds conceptual rationale for rotation and scale constraints, but does not explain dx/dy semantics, thickness, frame, layer, or sprite. With 69% schema coverage, the description only partially compensates for the undocumented parameters.

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

Purpose5/5

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

The description opens with a specific verb phrase ('Move, flip, rotate or scale pixels') and enumerates all six operations by name. It names the resource ('pixels') and the operation set precisely, which clearly separates it from siblings like draw or recolor. Even without mentioning sibling tools, an agent can identify this as the geometric-transform tool.

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

Usage Guidelines3/5

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

It gives implicit usage guidance by listing operations and warning that non-90 rotation and non-integer scale require allowLossy. However, it never says when to prefer an alternative tool or when not to use this one. The limits it mentions are parameter-level constraints, not cross-tool routing guidance.

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

validateValidateA
Read-only

Lint a sprite against pixel-art rules and report concrete, located problems. Checks: off-palette colours, orphan/stray pixels, broken or doubled outlines, banding, unintentional anti-aliasing on a hard-edged sprite, odd-pixel asymmetry, empty layers, untagged frames, inconsistent frame timing, and cross-frame volume drift in an animation. Run this before telling the user a sprite is finished. It answers 'is this actually done' with evidence rather than optimism.

ParametersJSON Schema
NameRequiredDescriptionDefault
checksNoOmit to run everything.
spriteNoSprite filename or id. Omit to use the sprite Aseprite has focused.
strictNoTreat style warnings as failures. Use when the user asked for a specific discipline.

Output Schema

ParametersJSON Schema
NameRequiredDescription
scoreYes
passedYes
spriteYes
summaryYes
findingsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, and the description consistently describes a non-mutating lint operation. It adds meaningful behavioral detail by stating the tool reports 'concrete, located problems' and evaluates an entire checklist, including animation-level concerns, so the agent knows it will get diagnostic evidence rather than a binary pass/fail.

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

Conciseness5/5

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

The core behavior is stated in the first sentence, and the long checklist sentence is dense but every item maps to a real check an agent can act on. The closing guidance is memorable and earns its place by defining the tool's purpose as evidence over optimism.

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

Completeness5/5

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

For a read-only diagnostic tool with three optional parameters, the description plus a fully-covered schema and an output schema leave no major gaps: the agent knows what the tool checks, when to call it, that it is non-destructive, and that results are located reports rather than opinions.

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

Parameters4/5

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

The schema has 100% description coverage, so the baseline is 3, but the description earns an extra point by expanding the meaning of the check names into concrete concepts (off-palette colours, stray pixels, broken outlines, banding, volume drift). This helps an agent decide which subset of checks to request, even though it does not name the parameters explicitly.

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

Purpose5/5

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

Description opens with a precise verb and object: 'Lint a sprite against pixel-art rules', then enumerates the specific rule categories it checks. It clearly distinguishes itself from related siblings like preflight by framing the output as evidence-based completion assessment rather than a generic validation step.

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

Usage Guidelines4/5

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

Explicitly instructs when to run: 'Run this before telling the user a sprite is finished,' giving an unambiguous trigger. It does not name an alternative tool to use instead in other situations, so it stops short of full when/when-not guidance.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 18 tool updatesv0.1.0
    • First observedcel
    • First observeddraw
    • First observedexport
    • First observedframe
    • First observedlayer
    • First observedlook
    • First observedpalette
    • First observedpreflight
    • First observedread_pixels
    • First observedrecolor
    • First observedreference
    • First observedselect
    • First observedsprite_info
    • First observedsprite_manage
    • First observedtag
    • First observedtileset
    • First observedtransform
    • First observedvalidate

TDQS

A3.9/5.0
Disambiguation4/5

Each tool targets a distinct Aseprite domain (layers, frames, cels, tags, palette, drawing, inspection, export) and the op lists are detailed enough for an agent to choose correctly. Minor overlap exists — 'draw' and 'recolor' both replace colors, and 'look'/'read_pixels' are alternative inspection paths — but the descriptions disambiguate them.

Naming Consistency3/5

Tool names are consistently lowercase and readable but follow mixed conventions: resource nouns ('ayer', 'frame', 'cel'), bare verbs ('look', 'draw', 'validate'), and snake_case compounds ('sprite_info', 'read_pixels', 'sprite_manage'). There is no single verb_noun pattern, though the module-per-domain naming is still navigable.

Tool Count4/5

18 tools is a bit above the ideal 3-15 range, but each tool maps to a major Aseprite feature (sprite lifecycle, layers, frames, cels, tags, palette, export, validation, tilesets) and carries a rich set of ops. The count feels justified for the breadth rather than padded.

Completeness5/5

The surface covers the full pixel-art workflow: create/open/save files, read and modify sprite state, draw and edit pixels, manage layers/frames/cels/tags, palette work, recoloring, reference import, validation, and game-ready export. No dead-end operation remains — every edit path has a corresponding inspect or export path.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/with-pebbly/aseprite-ai-artist'

If you have feedback or need assistance with the MCP directory API, please join our Discord server