aseprite-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ASEPRITE_PATH | No | Full path to the Aseprite executable. Default: auto-detected. | |
| ASEPRITE_MCP_ART_ROOT | No | Where `.aseprite` documents live. Default: `<workspace>/art`. | |
| ASEPRITE_MCP_WORKSPACE | No | Workspace root. Default: session cwd. | |
| ASEPRITE_MCP_TIMEOUT_MS | No | Per-invocation timeout in milliseconds. Default: `120000`. | |
| ASEPRITE_MCP_EXPORT_ROOT | No | Where exports land by default. Default: `<workspace>/out`. |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| aseprite_create_spriteA | Create a new pixel-art document and make it active. Every other tool works on this file. Coordinates are 0-based with the origin at the TOP-LEFT, x growing right and y growing down. Choose a small canvas: 16-32 px for characters and items, 64-128 px for scenes. Set |
| aseprite_openA | Point the server at an existing .aseprite file (absolute path, or a path inside the art folder) and make it active. Use this to continue work on a file, or to work on art the user already has. |
| aseprite_infoA | Report a document's size, colour mode, layer list, frame list (with durations) and tags. Call this when you need to re-orient before editing, or to confirm a change landed. |
| aseprite_add_layerB | Add a layer. Good practice for pixel art: separate layers for outline, base colour blocks, shading and highlights, so you can revise one without touching the others. |
| aseprite_set_layerB | Change a layer's opacity, visibility, blend mode, or rename it. |
| aseprite_remove_layerB | Delete a layer and everything drawn on it. |
| aseprite_merge_layer_downA | Merge a layer into the one beneath it. Use at the end of a piece, or to flatten shading into a base layer. |
| aseprite_add_framesA | Insert empty frames. Frame indices are 0-based. Use |
| aseprite_remove_frameB | Delete a frame. Refuses to remove the last remaining frame. |
| aseprite_set_frame_durationA | Set frame durations in milliseconds. Applies to a range when |
| aseprite_duplicate_frameA | Copy a frame (all layers) to the next slot. The fastest way to build an animation: duplicate, then move or redraw only the parts that change. |
| aseprite_move_frameC | Reorder the timeline by moving one frame to another position. |
| aseprite_copy_celA | Copy one layer's artwork from one frame to another (a cel = one layer on one frame). Useful for holding poses, or stamping a base drawing across a new animation. |
| aseprite_set_tagA | Create or update a named animation tag spanning a frame range (e.g. "walk" frames 0-5). Tags are what game engines export as separate animations, and users can play them in the Aseprite timeline. |
| aseprite_remove_tagC | Delete an animation tag by name. |
| aseprite_set_loopC | Restrict playback/export looping to a frame range of the whole sprite. |
| aseprite_set_paletteB | Replace the document palette with an explicit colour list. In indexed mode this is the actual set of colours the artwork can use - which is how you keep a piece to a tight, coherent palette. |
| aseprite_load_paletteB | Apply a well-known retro palette by name, or load one from a .gpl/.ase file. Great starting point for a coherent piece. Presets: pico8, gameboy, nes, db16, db32, sweetie16, endesga32. |
| aseprite_get_paletteB | List the document's current palette as hex colours. |
| aseprite_quantize_paletteA | Reduce the artwork to N colours (k-means) and snap every pixel to the result. Use this to tame a messy palette or to hit a retro constraint like 16 colours. |
| aseprite_resize_canvasA | Change the canvas size without scaling the artwork. Use it to add room for an attack animation or breathing space around a character. |
| aseprite_cropB | Crop every frame to a rectangle. Use to trim dead space around the artwork. |
| aseprite_scale_spriteB | Scale the whole sprite (all frames and layers). Use integer factors like 2 or 4 for pixel-art upscaling; non-integer scaling blurs pixels unless Aseprite is set to nearest neighbour. |
| aseprite_flattenA | Flatten all visible layers into one. Do this last, once the composition is settled. |
| aseprite_transformB | Flip, rotate by 90/180/270, or add a 1 px outline to the artwork. Outlines are the classic way to make sprite art read clearly against any background. |
| aseprite_replace_colorA | Replace every pixel of one colour with another across the whole document. Handy for recolouring a character, or swapping a shade across all frames at once. |
| aseprite_eraseC | Erase a rectangular region (make it transparent) on a layer, across frames. |
| aseprite_pixelsA | Draw a rectangular block of pixels - the main tool for putting actual artwork into a sprite. The origin is the top-left of the canvas; x grows right, y grows down. Two ways to pass data:
All rows must be the same length. Drawing only touches the pixels you supply; everything else on the canvas is left alone. To keep revisions cheap, send one small block per part (outline, fill, shading) rather than repainting the whole sprite. |
| aseprite_fill_regionsA | Paint a set of individual pixels, each with its own colour, on one layer. Unlike |
| aseprite_frames_from_gridsB | Draw a whole animation in one call: pass one character grid per frame and the tool writes each grid into its own frame. This is the fastest, most token-efficient way to produce a multi-frame animation. Grids are applied on a single layer; use |
| aseprite_drawA | Draw geometric primitives. Pass Operations: {op:"pixel", x, y, color} one pixel {op:"line", x1, y1, x2, y2, color} Bresenham line {op:"rect", x, y, w, h, color, filled:false} rectangle (w/h in pixels) {op:"ellipse", cx, cy, rx, ry, color, filled:false} ellipse; rx=ry for a circle {op:"polygon", points:[[x,y],...], color, filled:false} {op:"spline", points:[[x,y],...], color} smooth Catmull-Rom curve (good for tails, hair, limbs) {op:"fill", x, y, color, tolerance:0} flood fill from a seed pixel {op:"clear", x, y, w, h} make a region transparent {op:"gradient", x, y, w, h, from, to, bands:8, direction:"vertical"} banded ramp (classic pixel-art shading) {op:"dither", x, y, w, h, colors:[a,b], matrix:"bayer4", ratio:0.5} ordered dithering {op:"pattern", x, y, w, h, tile:[["#111","."],["#222","#333"]]} repeating 2-D tile {op:"text", text:"Hi", x, y, color, scale:1} built-in 5x7 pixel font Each op may override |
| aseprite_draw_across_framesA | Apply the same set of drawing operations to several frames, optionally shifting them per frame. This is how you animate motion efficiently: describe the moving part once and give each frame an offset. With no |
| aseprite_textA | Draw text with the built-in 5x7 pixel font. Suitable for labels, UI mockups and small titles. Non-ASCII characters render as "?". Use |
| aseprite_viewA | Render a frame to a PNG image so you can actually LOOK at the artwork and judge it. Use this after drawing, and before telling the user the piece is finished. Set |
| aseprite_onion_previewA | Render a frame with the previous frame ghosted red and the next frame ghosted cyan. This is how animators check that motion reads correctly between frames - use it to verify the arc of a swing, a walk, or a bounce. |
| aseprite_pick_colorB | Read the final composited colour at a single pixel. Returns hex plus RGBA. |
| aseprite_inspect_pixelsA | Dump a frame as text rows, one character per pixel, with a palette legend. Cheaper and more precise than an image when you only need to verify exact pixel positions or check a symmetric arrangement. "." is transparent. |
| aseprite_export_pngA | Export the sprite as a flat PNG. By default every visible layer is composited and the first frame is written. Pass |
| aseprite_export_gifB | Export the animation as an animated GIF, using each frame's own duration. This is the quickest way to show the user a moving preview of what you animated. |
| aseprite_export_sequenceA | Export every frame as its own numbered PNG (hero_000.png, hero_001.png, ...). Use this when an engine or artist wants individual frames rather than a packed sheet. |
| aseprite_export_sprite_sheetA | Export a sprite sheet PNG plus optional JSON metadata - the standard way to hand pixel-art animations to a game engine. Use |
| aseprite_import_imageA | Bring an external image into the pipeline. With |
| aseprite_statusA | Report the Aseprite installation the server found, the workspace folders it uses, and the active document. Call this first if a tool fails, or to learn where files are being written. |
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 43 tools
Most tools have clearly distinct domains, especially frame, layer, palette, and export operations. The main ambiguity is in the drawing surface: aseprite_pixels, aseprite_fill_regions, aseprite_draw, aseprite_draw_across_frames, aseprite_frames_from_grids, and aseprite_text all write pixels, though their descriptions explain different use cases.
Every tool uses the same aseprite_ prefix followed by a snake_case verb or verb-object name. The naming is predictable and readable throughout the set.
43 tools is well above the practical range for a single MCP server and will make tool selection harder for agents. Although Aseprite is a broad domain, the set includes many specialized operations that could be consolidated or grouped.
The surface covers document lifecycle, layers, frames, tags, drawing, palettes, transforms, previews, imports, and multiple export formats. Minor gaps remain, such as explicit undo/redo or layer reordering, but core pixel-art and animation workflows are well supported.