aseprite-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ASEPRITE_MCP_PORT | No | WebSocket port (default 9123) | 9123 |
| ASEPRITE_MCP_TOKEN | No | Authentication token to use instead of the token file. Must match the token configured in the Aseprite MCP Bridge extension. | |
| ASEPRITE_MCP_TIMEOUT | No | Per-command timeout in milliseconds (default 15000) | 15000 |
| ASEPRITE_MCP_ALLOW_LUA | No | Set to '1' to enable the aseprite_run_lua tool. This is an additional opt-in; the MCP Bridge window must also allow arbitrary Lua code. | |
| ASEPRITE_MCP_TOKEN_FILE | No | Location of the token file. Default is ~/.config/aseprite-mcp/token (or $XDG_CONFIG_HOME). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| aseprite_statusA | Checks the connection and returns info about the active sprite: size, color mode, layers, frames, active layer/frame. Coordinates start at (0,0) in the top-left corner. The active sprite becomes the one all following tools work on. |
| aseprite_helpA | Returns the short usage guide (efficient workflow, pixel_map format, stamps, pixel-art tips). Read it once before drawing if your client did not show the server instructions. |
| aseprite_openA | Opens a file (.aseprite, .png, .gif, ...) as the active sprite. |
| aseprite_new_spriteB | Creates a new sprite and makes it active. Returns the sprite status. |
| aseprite_pixel_mapA | Most token-efficient way to draw many exact pixels: a palette of single-character keys and one text row per pixel row. '.' and space leave the pixel unchanged; map a key to '#00000000' to erase. One undo step. Example: palette {"k":"#222034","y":"#fbf236"}, rows ["..kk..", ".kyyk.", "kyyyyk"]. Repeated parts: define stamps once and draw them with place. Generated art: write the data to a .json file and pass file. |
| aseprite_set_pixelsA | Sets individual pixels exactly, as a single undo step. The color '#00000000' erases a pixel. For more than a few pixels prefer aseprite_pixel_map (far fewer tokens). |
| aseprite_drawA | Uses an Aseprite tool like a mouse stroke. line/rectangle/filled_rectangle/ellipse/filled_ellipse take 2 points (start, end; inclusive). pencil/eraser/spray take any number of points (freehand path). paint_bucket takes 1 point. curve takes 4 points. polygon/contour take the corner points. |
| aseprite_clearB | Clears the whole layer in the frame, or only a rectangle. |
| aseprite_layerB | Create (new, becomes active), activate (select), delete, rename, or show/hide (visible) a layer. Returns the sprite status. |
| aseprite_frameA | Animation: create a frame after the given/active one (new, copies it by default, becomes active), activate (select), delete, or set its duration (in seconds). To draw several frames at once use aseprite_animation. Returns the sprite status. |
| aseprite_copyA | Copies a rectangle of pixels, optionally flipped, to another position, layer or frame (one undo step). Without x/y it writes back in place, so flip='h' mirrors the region where it is. Symmetry example on a 16px-wide sprite: rect [0,0,8,16], flip 'h', x 8 mirrors the left half onto the right half. |
| aseprite_animationA | Draws several frames in ONE call, each as a pixel map, creating missing frames automatically. With copyPrevious (default) a new frame starts as a copy of the previous one, so each entry only needs the changed rows (use x/y and '.' to leave pixels unchanged; '.' never erases, map a key to '#00000000' for that). Parts that repeat across frames (head, body …) belong in stamps, placed per frame with place: [name, x, y]. For generated animations write frames/palette/stamps to a .json file and pass file. Returns the sprite status. |
| aseprite_outlineA | Adds a 1px outline around (outside) or on the edge of (inside) everything opaque on a layer, in one undo step. style 'selout' (default) derives each outline pixel from the colour it borders: darker and cooler on the shadow side, lighter on the side facing the top-left light – the classic selective outline. style 'solid' uses one colour. Works on sprites up to 128x128 (or pass rect). Semi-transparent pixels (alpha < 128) count as empty. |
| aseprite_historyC | Undoes or redoes steps. |
| aseprite_saveA | Saves the active sprite. Without path the existing file is overwritten. With copy=true only a copy is exported (e.g. as .png). |
| aseprite_batchA | Runs several operations in ONE call, in order (saves round trips and tokens). Each item is {"op": , ...the same arguments as the tool aseprite_}. Allowed ops: new_sprite, pixel_map, set_pixels, draw, clear, layer, frame, copy, animation, outline, history, save. Stops at the first error; earlier ops stay applied (each op is its own undo step). Returns one short result per op plus the final sprite status if layers/frames changed. Example: [{"op":"layer","action":"new","name":"bg"},{"op":"draw","tool":"filled_rectangle","points":[[0,0],[15,15]],"color":"#5fcde4"},{"op":"layer","action":"new","name":"fg"},{"op":"pixel_map","palette":{"k":"#000"},"rows":["kk"],"x":4,"y":4}] |
| aseprite_read_pixelsA | Reads pixels back in the same palette + rows format as aseprite_pixel_map, so you can inspect exact colors or copy/modify a region cheaply. '.' = fully transparent; trailing '.' are cut off. Without layer the visible, flattened frame is read; with layer only that layer. Pass the palette (or paletteName) you drew with to get the same keys back. Max 16384 pixels per call. |
| aseprite_paletteA | Stores named palettes (character -> color) on disk so they can be reused across sprites and sessions via paletteName in aseprite_pixel_map, aseprite_read_pixels, aseprite_animation. Actions: save (name + colors), list (all saved palettes), delete (name), from_image (name; collects the colors of the visible frame, or of layer/rect, and saves them with generated keys), ramp (builds hue-shifted shading ramps – cool, saturated shadows and warm highlights – from base colours; e.g. ramps [{"base":"#d63a3a","keys":"DmrRH"}] gives 5 keys dark->light with the base in the middle; saved when name is given). |
| aseprite_spritesA | Lists the sprites open in Aseprite (id, name, size, frames, which one is active). select (id or name) switches Aseprite to that sprite and makes it the one all following tools work on – use it after an 'artist switched sprites' error or to work on several sprites in turn. |
| aseprite_backupsA | Lists the automatic backup copies (newest first). A few seconds after the assistant changes a sprite, a copy is saved as .aseprite; the artist's own files are never overwritten. Open one with aseprite_open to restore it. |
| aseprite_selectionA | Returns the region the artist has selected in Aseprite ({empty:true} if nothing is selected), so a request like 'improve this part' needs no coordinates. Most tools also accept rect "selection" directly. mask=true adds the exact shape as rows ('#' selected) when it is not a plain rectangle. |
| aseprite_changesA | Watch mode for drawing together. The first call starts watching the active sprite. Later calls return only the pixels the ARTIST changed since the previous call (your own tool calls are not reported), as a pixel map of the changed region: '.' = unchanged, '-' = erased, other keys = new colours. Feed it to aseprite_pixel_map to build on it. peek=true looks without moving the baseline; reset=true starts over. |
| aseprite_viewA | Renders the visible, flattened frame as an upscaled PNG so you can look at and check the result yourself. Transparency is shown as a checkerboard. Use rect to zoom into a detail. Call it once after a drawing pass, not after every step. If your client cannot show images, use aseprite_read_pixels instead. critique=true instead returns ONE small sheet for self-review: colour, grayscale (value/contrast check), black silhouette (readability) and true 1x size; add 'deutan' to panels for a colour-blindness check. Max 128x128 px (or pass rect). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 23 tools
Each tool targets a distinct task: pixel_map/set_pixels/draw are clearly separated by bulk vs. individual vs. shape drawing, status/sprites by active vs. all sprites, and view/read_pixels by rendered image vs. pixel data. The descriptions explicitly note when to prefer one tool over another, so an agent is unlikely to select the wrong one.
All tools share the aseprite_ prefix and lowercase snake_case, which is predictable and consistent. However, the suffix style mixes verb commands like draw, clear, copy, and view with noun commands like layer, frame, history, palette, and changes, rather than following a strict verb_noun pattern throughout.
At 23 tools, the server sits in the 16-25 range that feels heavy for a single MCP server. That said, Aseprite is a broad pixel-art editor domain and nearly every tool has a distinct purpose, so the count is defensible though not tightly scoped.
Core pixel-art workflows are well covered: file open/new/save, drawing and reading pixels, layer and frame management, animation, palettes, undo/redo, and even collaborative change monitoring. Obvious gaps like canvas resize, layer reordering/opacity, or frame reordering are missing but can generally be worked around with copy and new operations.