Aseprite Studio
Reads and writes the native .aseprite file format directly, enabling pixel-art and sprite-animation work without a headless Aseprite launch (Aseprite is optional and only used to verify renders). Provides tools for creating and editing sprites, layers, frames, tags and cels; drawing primitives, palette reduction, pixelizing images into true-resolution pixel art, building and posing cut-out rigs with RotSprite rotation and tweening between key poses, adding bitmap text and motion effects, and reviewing output with frame viewers, linting, animation/identity checks and glitch detection. Supports exporting to GIF, PNG, per-frame PNG and sprite sheets with JSON metadata, and can render a file in the real Aseprite for pixel-for-pixel verification.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Aseprite Studio pixelize hero.png, rig it, and export a walk cycle GIF"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
aseprite-mcp-studio
A fast, pure-Python MCP server for pixel art and sprite
animation in .aseprite files. It reads and writes the Aseprite format itself, so an edit takes
milliseconds instead of the seconds a headless Aseprite launch costs, and Aseprite does not
even need to be installed (it is only used, if present, to double-check files).
What it is for:
Turning any character image into real pixel art. It finds the fake pixel grid that image models produce (blocks of ~4–14 px, drifting grid lines, thousands of colours) and rebuilds the sprite at its true resolution with a small perceptual palette.
Animating that character correctly. It cuts the character into a rig of parts with pivots, then poses them with RotSprite rotation, keyframes and motion presets (idle, walk_side, attack, hurt, death). Joint gaps are filled automatically. It can also import a reference strip of poses at the master's scale and palette, standing on its ground line.
Drawing and editing with a transactional batch of operations, plus review tools that report problems with exact coordinates.
Highlights
Speed | Native |
Transactions |
|
Exact | The compositor matches Aseprite's own render pixel for pixel (verified in the tests against the real Aseprite). Pixels drawn past the canvas stay in the cel instead of being clipped. |
Pixelize | FFT autocorrelation for the cell size, dynamic-programming grid fitting that follows drift, perceptual-mode cell sampling (no muddy averages), agglomerative OKLab palette reduction that keeps small deliberate accents, background removal, speck and orphan cleanup that never eats eyes or highlights. |
Animation | Cut-out rigs (rect / polygon / character-map / colour masks), parent chains, RotSprite rotation (colour-safe, line-safe), joint overlap fill, keyframe interpolation, presets, hit flash. |
Text | Built-in bitmap fonts ( |
Review |
|
Safe | Paths are confined to allowed roots. Writes are atomic (temp file + rename), so a crash never leaves half a file. |
Related MCP server: Pixel Art AI
Install
uv tool install git+https://github.com/mhpm/aseprite-mcp-studioor from a clone:
uv syncAdd it to your MCP client (Claude Code .mcp.json, Claude Desktop config, ...):
{
"mcpServers": {
"aseprite-studio": {
"command": "uv",
"args": ["--directory", "/path/to/aseprite-mcp-studio", "run", "aseprite-mcp-studio"],
"env": { "ASE_STUDIO_ROOTS": "/path/to/your/game/assets" }
}
}
}Environment:
ASE_STUDIO_ROOTS: folders the server may read and write, separated by;on Windows and:elsewhere. Default: the working directory.ASEPRITE_PATH: optional, only forverify_with_aseprite.
Tools
Tool | Does |
| New RGBA sprite with layers and frames. |
| Layers (and linked cels), frames and durations, tags, slices. |
| Batch of edit ops as one transaction (see below). |
| Per-file history. |
| Look at frames: grid, rulers, onion skin, colour / value / silhouette. |
| Pixels as a character map, ready to edit and send back with |
| Orphan, lone and detached pixels with coordinates; colour stats. |
| Bounds, ground row, holds, drift, spacing; |
| Each frame against a master: palette conformance and size drift. |
| What animating broke, per frame: cuts, flat blocks, one-frame flicker (against the previous and next frame, motion compensated), strays, spurs, holes, orphans; the design's own details (judged against the master) are not reported. Returns an onion-skin view with each problem boxed. |
| Pixel diff between frames or files. |
| Image to native pixel art, with a side-by-side preview. |
| A strip of poses brought in at the master's scale, palette and ground. |
| Shows which pixels each rig part takes, and where each pivot is. |
| Poses a rig over frames from a preset or from keyframes. |
| In-betweens between two drawn key poses: fits each part's turn (bones for parts that carry others, pixels for the rest) and draws each in-between from the nearest real drawing; anticipation and overshoot via |
| GIF, PNG, one PNG per frame, or a sprite sheet with JSON metadata. |
| Hue-shifted shading ramp in OKLCh. |
| Renders the file in the real Aseprite and compares. |
| Opens Studio Live, the built-in viewer (see below), and returns its URL. |
| What the user marked in Studio Live: frames, painted pixels, tags, text, with a picture of the previous / marked / next frame. |
| Answers a note (the user sees the reply) and marks it resolved or reopens it. |
apply ops
Layers: add_layer, add_group, remove_layer, set_layer, move_layer, duplicate_layer.
Frames: add_frames, remove_frames, duplicate_frame, move_frame, set_duration, set_durations, reverse_frames.
Tags and slices: add_tag, remove_tag, add_slice, remove_slice.
Cels: copy_cel, move_cel, set_cel, clear, link_cels, unlink_cels.
Drawing: pixels, map, line, polyline, curve, rect, ellipse, fill, text, stamp, erase, outline.
Colour: replace_color, remap, flash, palette_lock, set_palette, clean.
Repair: fix_glitches (erases strays and spurs, fills holes, outlines cuts, until find_glitches finds none), seal_cuts.
Transform: flip, rotate (RotSprite), scale, squash_stretch.
Motion and FX: tween_move, shake, fade, damage_number, blink_flash.
Drawing ops take frame or frames ([1,3], "all", "2-6", "1,3,5-8"), so one op can draw
on many frames at once. Add lock_alpha: true to paint only over existing pixels.
[
{"op": "add_layer", "name": "fx"},
{"op": "map", "layer": "fx", "frame": 4, "x": 23, "y": 20,
"legend": {"w": "#ffffff", "q": "#bfe0ff"}, "rows": ["..www.", ".wwqq.", "wwq..."]},
{"op": "flash", "layer": "slime", "frames": "5-6", "color": "#e04040", "amount": 0.8},
{"op": "damage_number", "text": "-12", "x": 58, "y": 32, "frames": "6-14", "rise": 10}
]From an image to an animated character
pixelize(image, "hero.aseprite"): check the preview. If the grid guess is off, passcell. For a painted image with no grid, passtarget_height.rig_preview("hero.aseprite", rig): adjust the masks and pivots until each part is clean.animate_rig("hero.aseprite", rig, out_layer="idle", preset="idle", source_layer="sprite").find_glitches("hero.aseprite", layer="idle", loop=true), thenapplyopfix_glitchesand check again.check_animation(..., kind="loop"),check_identity(..., master="hero.aseprite"), thenview(..., onion=true).export("hero.aseprite", "hero_idle.gif", scale=4).
Between two key poses
Put both drawings on one canvas, on two layers (
start,end), where they should be in the scene (the end of a jump higher up).Write a rig for each with the same part names and pivots on the same joints (neck, shoulder, hip, grip). Children hang from their parent (
"parent"); use"overlap_from": "parent"so a limb that swings far does not drag pixels it only touched.tween_poses(path, rig_start, rig_end, "start", "end", "jump", inbetweens=4, extra=[{"torso": {"dy": 3}}, {"torso": {"dy": -1}}, {}, {}]): here a crouch before the take-off. The report gives each part's turn and how well it matched; under 0.4 the part changes shape a lot (foreshortening), so look at it closely.find_glitches(path, layer="jump", master_frames=[1, 6])(both drawings are references), thenfix_glitches, and fix by hand what is left.
Studio Live (built-in viewer)
The server starts a local web viewer with it (127.0.0.1, port 7790 or ASE_STUDIO_LIVE_PORT;
ASE_STUDIO_LIVE=0 turns it off; two sessions share one viewer). live_open returns the URL;
python -m aseprite_mcp_studio.live [--port N] [folder ...] runs it on its own. It draws with the
same renderer as the tools, so it shows exactly what gets exported.
Plays frames at their real durations, by tag (forward, reverse, ping-pong), at 0.25x to 2x.
Onion skin (previous red, next blue), pixel grid, checker / green / dark / light backgrounds, integer zoom with the wheel (anchored on the cursor), drag the view holding Space, with the middle button or the Move tool.
Compare two frames side by side, as a difference (changed pixels in magenta) or blinking.
Versions: every save is kept (last 30 per file in memory); pick an older one and see what a fix changed against the current file.
find_glitchesboxes over the frames and serious-problem counts on the timeline; the "keys" field takes the key drawings of a transition (e.g.1,6).Review: select wrong frames (Ctrl/Shift-click or the check box), paint the exact pixels with the brush or a box, add quick tags (hole, stray pixel, cut, limb wrong, flicker, stiff, pose, colour, shape, timing) and a note. Notes are saved next to the sprite as
<name>.aseprite.review.json; the agent reads them withreview_notes, fixes, and answers withresolve_note, and the page shows the answer live.Updates live (server-sent events) when a tool edits a file or it is saved in Aseprite; each version of a sprite renders once, as one strip the page slices.
Keys: V move, B brush, R box, E eraser, Space play (hold it to drag the view), wheel zoom, arrows step, S select frame, O onion, G grid, X glitches, M notes, D compare, 1-9 zoom, N save note, Esc clear, Ctrl+Z undo and Ctrl+Y / Ctrl+Shift+Z redo (strokes, boxes, erasing, frame selection, clearing).
Development
uv sync --extra dev
uv run pytest
uv run ruff check src testsThe tests rebuild a 15-frame reference scene exactly and, when Aseprite is installed, open the written files in Aseprite and compare its renders with this server's.
Acknowledgements
The ideas behind several tools were inspired by two other open Aseprite MCP servers,
MalloyTheDev/aseprite-mcp and
diivi/aseprite-mcp. This is an independent
implementation; no code was taken from either. RotSprite is Xenowhirl's algorithm. OKLab is
Björn Ottosson's colour space. The .aseprite format follows Aseprite's published specification.
License
MIT
Available Tools
23 toolsanimate_rigA
Pose a rigged character over several frames and write them to out_layer.
Motion comes from a preset (idle, walk_side, attack, hurt, death; strength scales it) or
from keys: [{"frame": 1, "pose": {"arm_front": {"rotate": -30}, "torso": {"dy": 1},
"root": {"dx": 2, "rotate": 5, "pivot": [x,y]}}}, ...] interpolated over frames
(ease: ease_in_out | linear | hold). Parts turn with RotSprite about their pivots, children
follow parents, and joint gaps are filled from the source (rig "overlap"). feet [x,y] is
the pivot for whole-body rotations (default bottom centre). clean removes specks and orphan
pixels the rotation left. Frames are added if needed; the source layer is hidden.
Returns a summary and a view with onion skin.
Inputs: rig (required), path (required), out_layer (required), ease, +12 more.
applyA
Run edit operations on a sprite as ONE transaction: if any op fails nothing is saved and the error names the op. ops_list items are {"op": name, ...arguments}. Frames are 1-based; drawing ops take frame (one) or frames (list, "all", "2-6", "1,3,5-8"); layer defaults to the top image layer. Pixels drawn past the canvas edge are kept in the cel, never clipped. dry_run=true runs everything and reports, but saves nothing.
Ops (name(arguments), ? = optional): add_frames(count?=1, at? (1-based position to insert before; default: append), duration?=100, copy_from?) add_group(name, group?) add_layer(name, group?, opacity?=255, blend?=normal, visible?=true, reference?=false) add_slice(name, x, y, w, h, frame?=1, pivot? [x,y], center? [x,y,w,h], data?) add_tag(name, from, to, direction?=forward, repeat?=0 (0 = loop forever), color?) blink_flash(layer?, frames, color?=#ffffff (white flash) — alternates flash on/off across the frames) clean(specks?=2 (max size of detached islands to delete), orphans?=true, protect? [colors], layer?, frames?) clear(layer?, frames?, region? [x,y,w,h]) copy_cel(layer, from, to (frames), to_layer?, linked?=false, dx?=0, dy?=0) curve(points (3 = quadratic, 4 = cubic Bezier control points), color, layer?, frames?) damage_number(text, x, y (where it pops: its bottom centre), frames, rise?=10, layer?=damage, color?=#fff1a8, bottom_color?=#ff5a3c, outline?=#3a0c14, font?=bold, pop?=true, fade_frames?=2) duplicate_frame(frame, linked?=false) duplicate_layer(layer, name) ellipse(x, y, w, h (bounding box, even sizes fine), color, fill?=true, layer?, frames?, lock_alpha?) erase(x, y, w, h, layer?, frames?) fade(layer, frames, from?=255, to?=0, ease?=linear) fill(x, y, color, tolerance?=0, diagonal?=false, layer?, frames?) fix_glitches(kinds?=[stray, spur, hole, cut, block], master_frame?=1, master_frames? (key drawings), layer?, frames?) flash(color?=#ffffff, amount?=1.0 (1 = solid silhouette), layer?, frames? (hit flash)) flip(axis?=h|v, center? (canvas x for h, y for v; default canvas middle), layer?, frames?) line(x0, y0, x1, y1, color, perfect?=true, layer?, frames?, lock_alpha?) link_cels(layer, source (frame), frames) map(rows (one string per row), legend {char: color}, x?=0, y?=0, layer?, frames?, lock_alpha? ('.' = leave)) move_cel(layer, dx, dy, frames?) move_frame(frame, to) move_layer(layer, to (1 = bottom among its siblings)) outline(color, where?=outside|inside, diagonal?=false, layer?, frames?) palette_lock(palette? [colors] or source? (.aseprite/.png whose colours to use), layer?, frames?) pixels(points [[x,y],...] or [[x,y,color],...], color?, layer?, frames?, lock_alpha?) polyline(points [[x,y],...], color, closed?=false, perfect?=true, layer?, frames?) rect(x, y, w, h, color, fill?=false, layer?, frames?, lock_alpha?) remap(mapping {from_color: to_color}, tolerance?=0, layer?, frames?) remove_frames(frames) remove_layer(layer) remove_slice(name) remove_tag(name) replace_color(from, to, tolerance?=0, layer?, frames?) reverse_frames(frames (an unbroken range)) rotate(degrees (clockwise), pivot [x,y] (canvas), method?=rotsprite|nearest, layer?, frames?) scale(factor (or sx, sy), anchor?=topleft|center|bottom, layer?, frames? (nearest neighbour)) seal_cuts(master_frame?=1, color? (default: the master's darkest colour), layer?, frames? (outline what animating cut open)) set_cel(layer, frames?, opacity?, z?) set_duration(ms, frames?=all) set_durations(durations (list of ms, one per frame from frame 1)) set_layer(layer, name?, opacity?, blend?, visible?, editable?) set_palette(colors [list], replace?=true) shake(layer, frames, amplitude?=1, axis?=x|y|both) squash_stretch(amount (0.2 = squash 20%, -0.2 = stretch), anchor?=bottom|top|left|right, layer?, frames?) stamp(source (png/aseprite path), x?=0, y?=0, source_frame?=1, source_layer?, blend?=true, layer?, frames?) text(text, x, y, color, font?=tiny|bold, bottom_color?, outline?, shadow?, scale?=1, anchor?=topleft|center|bottom|topright, layer?, frames?) tween_move(layer, frames (in order), dx?, dy?, ease?=linear|ease_in|ease_out|ease_in_out|back_out, arc?=0) unlink_cels(layer, frames)
Inputs: path (required), ops_list (required), dry_run.
check_animationB
Measure an animation without playing it: per-frame bounds, ground row, centroid, height, repeated frames, colour drift and spacing. kind: "loop" (walk, idle: must close), "oneshot" (attack, hurt, death: may hold poses) or "scene" (several actors: report only).
Inputs: path (required), tag, kind, layer, +1 more.
check_identityB
Compare every frame with a master image (png or .aseprite): share of pixels that are master colours (within a just-noticeable difference), colours the master lacks, and height/width drift. The check that a character is still itself after animating.
Inputs: path (required), master (required), layer, frames, +1 more.
compareA
Pixel difference between two frames (of one sprite, or of two files): changed pixel count and the box that changed. 0 changed pixels proves a part did not move.
Inputs: path (required), frame_a (required), frame_b (required), layer, +2 more.
exportB
Export without Aseprite. kind (default from the extension): "gif" (real transparency or a
background, global palette, per-frame durations, loop or play once), "png" (one frame),
"frames" (output must contain {frame}: one png per frame), "sheet" (layout horizontal |
vertical | grid with columns, padding, optional JSON frame data). Reference layers and
hidden layers are left out; layers restricts to some layers.
Inputs: path (required), output (required), tag, kind, +10 more.
find_glitchesA
Find what animating broke, frame by frame, with an onion-skin view of every frame that has a problem (previous frame red, next blue, each problem boxed and labelled). Each frame is compared with its previous and next frame (loop=true wraps round) and with the master (default: the first frame), so the design's own details are not reported. Kinds: cut (a part sliced open: interior colours on the outer edge), block (a flat fill larger than the master has), blip (a small patch unlike both neighbour frames), stray (a detached speck), spur (a single pixel sticking out), hole (an enclosed gap), orphan (a pixel unlike all its neighbours). Run it after every animate/edit pass; fix until ok. master_frames: several frames of this sprite that are real drawings (a transition's start and end keys); what any of them contains is design.
Inputs: path (required), loop, layer, frames, +3 more.
import_stripA
Bring a strip of poses (drawn by hand or generated) into a sprite as frames, at the
master's scale: every frame is pixelized on one shared cell size (taken from the master's
height unless cell is given), locked to the master's colours, and stood on the master's
ground line with its feet (or centre) on the master's axis. Frames are added as needed.
count: frames in the strip (default: split at transparent gaps). Returns a preview.
Inputs: path (required), image (required), cell, align, +6 more.
lintB
Find what is easy to miss, with coordinates: orphan pixels (unlike all 8 neighbours), lone pixels, detached parts, colour count, darkest colour share and pixels past the canvas. Use a layer for one object; the flattened frame touches everything else.
Inputs: path (required), frame, layer.
live_openA
Studio Live: the built-in web viewer (local only). Plays frames at their real durations,
onion skin, compare two frames (side by side / difference / blink), versions of every save
with a before/after difference, and find_glitches boxes over the frames. The user selects
wrong frames and paints the exact wrong pixels with a brush, adds quick tags and a note; read
those with review_notes. Returns the URL (open it in the browser pane); with path it opens
that file.
Inputs: path.
make_rampC
A shading ramp around one colour, darkest first, built in OKLCh: even lightness steps, hue leaning warm in the lights and cool in the shadows, chroma tapering at both ends.
Inputs: base (required), steps, contrast, hue_shift.
pixelizeA
Convert an image into real pixel art and save it as a native-resolution .aseprite.
Finds the fake pixel grid of image-model "pixel art" (cell size, drifting grid lines) and turns each cell into one pixel by perceptual majority; a real illustration (no grid) or an explicit target_height is downscaled by majority vote instead. Palette reduced in OKLab (small distinct accents kept), specks and orphan pixels cleaned. cell: force the cell size in source px. target_height: the native height wanted. background: auto (remove a flat background if there is no transparency) | remove | keep. outline: none, "auto" (darkest palette colour) or a colour, adds a 1 px keyline. palette_from: lock to another image's colours (e.g. the character's master). Returns the report and a preview: source | result enlarged.
Inputs: image (required), output (required), cell, layer, +8 more.
read_pixelsA
Pixels as a character map: {"legend": {char: colour}, "rows": [...]} ('.' = transparent).
Edit the rows and send them back with the map op: a read-edit-write round trip. Without
layer it reads the flattened frame. Region capped at 128x128.
Inputs: path (required), frame, layer, region.
redoC
Redo edits that were undone.
Inputs: path (required), steps.
resolve_noteA
Answer a Studio Live note: say what was fixed (the user sees it under the note) and mark it resolved, or reopen it with status="open".
Inputs: path (required), note_id (required), reply, status.
review_notesA
What the user marked in Studio Live: wrong frames, painted pixels, tags and text.
Without path, every sprite with notes under the allowed folders. status: open | resolved | all.
Each note gives its frames (1-based), tags (hole, stray, cut, limb, flicker, stiff, pose,
color, shape, timing), the user's text and per marked frame the pixel bbox and the pixels
themselves (sprite coordinates). The picture of each note shows the previous frame, the
marked frame with the user's marks in pink, and the next frame. Fix, then resolve_note.
Inputs: path, status, pictures.
rig_previewA
Check a rig before animating: which pixels each part got (tinted), each pivot (white dot), pixel counts and bounding boxes. Parts claim pixels in list order; leftovers form "rest". rig = {"parts": [{"name", "mask": {"rect"|"polygon"|"rows"|"colors"|"union"|"minus"}, "pivot": [x,y], "parent"?, "z"?}], "overlap"?: 1}. Name parts head, torso, arm_front, arm_back, leg_front, leg_back, weapon, tail, hair to use the motion presets.
Inputs: rig (required), path (required), frame, layer.
sprite_infoB
Structure of a sprite: size, frame durations, layer tree (with which frames have cels and which are linked), tags, slices, palette size and warnings.
Inputs: path (required).
sprite_newC
Create a new transparent RGBA .aseprite sprite. layers are created bottom to top
(default one layer named "Layer 1").
Inputs: path (required), width (required), height (required), frames, +3 more.
tween_posesA
In-betweens between two drawn key poses of one character (pose-to-pose).
rig_start / rig_end cut each drawing into parts with the SAME names (same masks syntax as
rig_preview); put each pivot on the same joint in both drawings (neck, shoulder, hip, grip).
For every part the rotation and position that carry it from one drawing to the other are
fitted; in-betweens in the first half move the start drawing's parts, those in the second half
move the end drawing's parts back, so every frame is made of real drawn pixels.
Writes out_layer from first_frame: the start drawing, inbetweens frames, the end drawing.
ease: ease_in_out | ease_in | ease_out | linear. extra: one pose per in-between added on top
(e.g. anticipation [{"torso": {"dy": 3}}, {}, ...]); parts of both rigs, plus "root".
Returns the fit per part (angle, match 0..1; under 0.4 = shape changes too much: split it at
its joint, e.g. a leg into thigh + shin, or redraw it), bone_stretch (joints whose limb is
over 2 px longer or shorter in one drawing: joints stay closed in every in-between, and the
length changes where the frames switch drawings), and an onion-skin view.
Parts that carry others turn by their bones (pivot -> children's pivots).
Inputs: path (required), rig_end (required), end_layer (required), out_layer (required), +11 more.
undoB
Undo the last edits made through this server to a file (up to 50 per file).
Inputs: path (required), steps.
verify_with_asepriteA
Open the file with the real Aseprite (if installed: ASEPRITE_PATH or the usual install folder), render every frame there and compare with this server's renderer. Proves the file is valid and that previews here match what Aseprite shows.
Inputs: path (required).
viewB
Look at frames: one image with up to 16 frames side by side, each on a checkerboard with a pixel grid (darker every 8 px), rulers in sprite coordinates and its number and duration. frames: 1-based list, "all" or "2-6". region [x,y,w,h] zooms into a detail. mode: color, value (lightness only: do the forms read without hue?) or silhouette. onion=true shows the previous frame in red and the next in blue under each frame.
Inputs: path (required), grid, mode, onion, +5 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 23 tools
Most tools have clearly distinct purposes across creation, editing, rigging, verification, and review. The main overlap is the diagnostic cluster (lint, check_animation, find_glitches, check_identity, compare), but their descriptions define separate scopes well enough for an agent to choose correctly.
All names use snake_case, which keeps them readable. However, the word order is mixed: many are verb_noun (check_animation, find_glitches, animate_rig) while several are noun_verb or adjective_verb (sprite_new, sprite_info, rig_preview, live_open), so the pattern is not fully predictable.
The 23-tool surface is heavy, though the broad studio scope justifies many capabilities. Still, the set sits in the borderline-heavy range, and some diagnostic or review tools could feel like extra surface area for an agent to manage.
The server covers the full lifecycle: sprite creation and inspection, extensive transactional editing via apply, rigging and animation, import/pixelization, linting and glitch checks, export, real-Aseprite verification, and user review notes. No obvious CRUD or workflow dead ends are apparent for the stated pixel-art studio purpose.
Maintenance
Related MCP Connectors
Turn images into pixel art, extract and remap palettes, and upscale sprites without blur.
Generate, edit, style-match, turn, and animate game-ready pixel art at exact sizes.
Generate pixel art sprites, animations, 8-direction rotations and palettes for games.
Generate authentic pixel art - sprites, animations, and tilesets - from any MCP client
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to create, inspect, edit, and export pixel art, sprites, animations, and spritesheets using headless Aseprite, and to convert arbitrary images into indexed pixel art.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI coding agents to create, draw, and refine Aseprite documents through deterministic canvas, layer, frame, tag, and palette tools, with pixel analyzers, style validation, and preview/diff visual feedback. It also supports spritesheet and animated GIF export, producing multi-layer game-ready assets.1MIT
- AlicenseBqualityCmaintenanceEnables AI assistants to create and edit pixel art and animated sprites in Aseprite through 104 tools covering drawing, layers, animation, palettes, tilemaps, exports, visual analysis, and raw Lua scripting.116MIT
- AlicenseBqualityBmaintenanceEnables AI assistants to draw, animate, and export game-ready pixel art and sprite sheets through a local Aseprite installation, including palette work, layer rigging, and cleanup of AI-generated frames. It also offers a CLI for running the same animation recipes in a game asset pipeline.17157 npmMIT