Aseprite MCP Tools
Aseprite MCP Tools
A Python MCP server that gives AI assistants full control over Aseprite for creating pixel art and animated sprites.
104 tools across 17 categories — canvas, drawing, layers, animation, palettes, effects, slices, tilemaps, exports, visual-feedback/analysis tools, and a raw Lua escape hatch. The tool set is designed so an LLM has everything it needs to produce good pixel art, not just primitives: shading ramps with hue shifting, ordered dithering, outlines, retro palette presets with quantization, onion-skin renders, and frame diffing for animation work.
Example: a swordsman, drawn and animated by Claude
Both were created end-to-end by Claude Fable 5 through this server's MCP tools — drawing, checking its own work with scaled export_frame previews and render_onion_skin, then exporting. The tasks recreate the benchmark from Draw Me a Swordsman by Lj Miranda, whose findings inspired this server's expanded toolset.
Tool Categories
Category | Tools | Description |
6 | Create sprites, manage layers/frames, set the active state | |
14 | Pixels, lines, rectangles, circles, ellipses, polygons, paths, fills, gradients | |
7 | Delete, rename, duplicate, reorder, blend modes, merge, flatten | |
4 | Move, copy, and erase rectangular regions or colors | |
5 | Outlines, color replacement, HSL adjustment, ordered dithering | |
24 | Frames, cels, tags, tweening with easing, propagation | |
8 | Get/set palettes, retro presets, color ramps, quantization, color modes | |
4 | Flip, rotate, resize, crop | |
5 | Named regions, 9-patch centers, pivot points | |
5 | Tilemap layers, tileset editing, tile placement | |
7 | PNG, GIF, sprite sheets, per-layer/per-tag export, image import | |
3 | Read pixels and sprite metadata | |
3 | Onion-skin renders, frame diffing, color statistics | |
4 | Validate and sanitize animation consistency | |
1 | Copy layers between sprite files | |
3 | Local HTTP preview server, workflow guide | |
1 | Raw Lua escape hatch for anything not covered above |
Canvas
Tool | Description |
| Create a new sprite with the given dimensions |
| Add a new layer, optionally inside a named group |
| Add a new (optionally nested) group layer |
| Append a new frame |
| Set the active frame |
| Set one frame's duration in ms |
| Set the active layer (optionally creating it) |
Drawing
All _at variants target a specific layer/frame and can create the cel on demand. Coordinates are sprite-global.
Tool | Description |
| Plot individual pixels with per-pixel colors |
| Plot pixels on a specific layer/frame |
| Lines with thickness |
| Outlined or filled rectangles |
| Outlined or filled circles |
| Outlined or filled ellipses with separate x/y radii |
| Outlined or filled polygons from a point list |
| Polyline through a point list with thickness |
| Paint-bucket flood fill |
| Smooth linear gradient fill in a rectangle |
Layers
Tool | Description |
| Delete a layer by name |
| Rename a layer |
| Duplicate a layer with all cels, opacity, and blend mode, optionally into a group |
| Move a layer to a position in the stack |
| Set blend mode (multiply, screen, overlay, ... 19 modes) |
| Merge a layer into the one below it |
| Flatten all layers into one |
Selection & Regions
Tool | Description |
| Cut a rectangle of pixels and paste it elsewhere |
| Copy a rectangle to another position, layer, or frame |
| Make a rectangle transparent |
| Magic-eraser: make all pixels of a color transparent (with tolerance) |
Effects
The pixel-art toolbox: clean outlines, palette-respecting blends, and shading variants.
Tool | Description |
| Add a 1px outline around all opaque pixels |
| Replace one color with another (with tolerance), preserving alpha |
| Shift hue/saturation/lightness of a cel — palette swaps, night scenes, shadows |
| Two-color gradient using Bayer 4×4 ordered dithering |
| Uniform dithered mix of two colors at a given density |
Animation
Tool | Description |
| Append N frames with optional duration |
| Delete a frame |
| Set every frame's duration |
| Duplicate a frame range N times |
| Copy all cels of a frame to other frames |
| Cel lifecycle on a layer/frame |
| Copy selected layers' cels across a frame range |
| Place a cel at x,y |
| Set a single cel's opacity |
| Shift cels by a delta across frames |
| Linear position tween across frames |
| Position tween with easing (ease_in/out, smoothstep) |
| Opacity tween with easing |
| Scale tween with easing and anchor |
| Sine-wave motion (bobbing, breathing, hovering) |
| Animation tags with direction (forward/reverse/pingpong) |
| Layer-level visibility and opacity |
| Configure onion-skin UI prefs (see |
| Sprite metadata: size, layers, frames, durations, tags |
Palette
Tool | Description |
| Read the palette as hex colors |
| Set the palette from a list of hex colors |
| List built-in retro palettes |
| Apply a preset: |
| Build a dark→light shading ramp with hue shifting from a base color |
| Snap every pixel to the nearest palette color |
| Remap specific colors across a frame range |
| Convert between RGB, grayscale, and indexed |
Transform
Tool | Description |
| Flip a cel horizontally or vertically |
| Rotate a cel 90/180/270° |
| Scale the sprite to new dimensions |
| Crop to a rectangle |
Slices
Tool | Description |
| Create a named rectangular region |
| Set the 9-patch stretchable center |
| Set the pivot point |
| List all slices with bounds, centers, pivots as JSON |
| Delete a slice |
Tilemap
Tool | Description |
| Add a tilemap layer with its own tileset and tile grid |
| Paint pixels into a tileset tile (auto-appends new tiles) |
| Place tiles on the map by grid position |
| Read which tile occupies a grid cell |
| Tile size, tile count, and map dimensions as JSON |
Export & Import
Tool | Description |
| Export to PNG, GIF, JPG, ... |
| Export one frame as PNG with integer upscaling — the core visual-feedback loop: draw, export at 8×, look, iterate |
| Sprite sheet (horizontal/vertical/rows/columns/packed) with optional JSON metadata and per-tag filtering |
| One PNG per layer |
| Export an animation tag as GIF or PNG sequence |
| Import a PNG into a layer (references, premade parts) |
| Duplicate the .aseprite file |
Inspection
Tool | Description |
| Read one pixel's RGBA |
| Read a rectangle of pixels as JSON |
| Sprite metadata (also listed under Animation) |
Analysis & Visual Feedback
Batch-mode equivalents of what a human artist gets from the Aseprite UI.
Tool | Description |
| Render a frame over translucent ghosts of neighboring frames — check motion continuity without opening Aseprite |
| Diff two frames: changed pixel count, percentage, bounding box |
| Color histogram of a frame — catches palette drift and near-duplicate colors |
Quality
Tool | Description |
| Create missing cels for layers across a frame range |
| Report missing layers/cels as JSON |
| Audit frames for overlaps and out-of-range layer activity |
| Normalize layer order, coverage, and overlaps |
Scene
Tool | Description |
| Copy layers by name from one .aseprite file to another |
Preview & Guide
Tool | Description |
| Serve exported files over local HTTP |
| Returns a step-by-step workflow guide for the LLM |
Scripting
Tool | Description |
| Execute arbitrary Aseprite Lua (API docs) in batch mode. The escape hatch when no dedicated tool fits: one script can batch many operations into a single Aseprite launch. Remember to |
Recommended Workflow for LLMs
Plan the palette first:
generate_color_rampfor each material (skin, armor, blade), orapply_palette_presetfor a retro look.Build in layers: background / body / equipment / effects, so parts can be animated and edited independently.
Draw coarse to fine: silhouette with
draw_rectangle_at/draw_ellipse_at/fill_area_at, then refine withdraw_pixels_at.Look at your work:
export_frameat 8×, inspect, fix, repeat. Useget_color_statsto keep the palette tight.Shade with intent:
adjust_hslfor shadow layers,apply_dither_gradientfor blends,outline_celfor readability.Animate with the cel tools:
propagate_cels, thentween_cel_positions_eased/oscillate_cel_positions; verify withrender_onion_skinandcompare_frames; export withexport_tag.
Docker Usage
Quick Start
Build and run the Docker image:
docker build -t aseprite-mcp:latest .
docker run -it --rm aseprite-mcp:latestOr use the provided build scripts:
Linux/macOS:
chmod +x build-docker.sh && ./build-docker.shWindows:
.\build-docker.ps1
Using Docker Compose
# Production
docker-compose up aseprite-mcp
# Development mode
docker-compose --profile dev up aseprite-mcp-devSee DOCKER.md for detailed Docker setup instructions.
Optional: Install Aseprite via Steam
To have the container install Aseprite via SteamCMD at startup, provide Steam credentials:
# Create a .env with STEAM_USERNAME/STEAM_PASSWORD (and optional STEAM_GUARD_CODE)
# Then
docker run --rm -i --env-file .env aseprite-mcp:latestIf installed, the binary will be at /opt/steamapps/common/Aseprite/aseprite and ASEPRITE_PATH will be picked up automatically.
Local Installation
Prerequisites
Python 3.13+
uvpackage managerAseprite (set
ASEPRITE_PATHin.envif it is not on your PATH)
Installation:
{
"mcpServers": {
"aseprite": {
"command": "/opt/homebrew/bin/uv",
"args": [
"--directory",
"/path/to/repo",
"run",
"-m",
"aseprite_mcp"
]
}
}
}Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/NosytLabs/aseprite-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server