Skip to main content
Glama

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 .aseprite reader/writer, an in-memory cache and one write per transaction. No process launch per call.

Transactions

apply runs any number of ops atomically: all succeed or nothing is saved. dry_run validates without saving. Undo/redo up to 50 steps per file.

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 (tiny 3x5 with A–Z and punctuation, bold 5x7 numbers) with outline, shadow and two-tone fill, crisp at 1x. One op makes a popping, rising, fading damage number.

Review

view (many frames, grid, rulers, onion skin, value and silhouette modes), lint (orphan, lone and detached pixels with coordinates), check_animation (aware of loop / one-shot / scene), check_identity (palette and proportion drift against a master), find_glitches (each frame against its previous and next frame and the master, with a marked onion-skin view), compare.

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-studio

or from a clone:

uv sync

Add 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 for verify_with_aseprite.

Tools

Tool

Does

sprite_new

New RGBA sprite with layers and frames.

sprite_info

Layers (and linked cels), frames and durations, tags, slices.

apply

Batch of edit ops as one transaction (see below).

undo / redo

Per-file history.

view

Look at frames: grid, rulers, onion skin, colour / value / silhouette.

read_pixels

Pixels as a character map, ready to edit and send back with map.

lint

Orphan, lone and detached pixels with coordinates; colour stats.

check_animation

Bounds, ground row, holds, drift, spacing; loop / oneshot / scene.

check_identity

Each frame against a master: palette conformance and size drift.

find_glitches

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.

compare

Pixel diff between frames or files.

pixelize

Image to native pixel art, with a side-by-side preview.

import_strip

A strip of poses brought in at the master's scale, palette and ground.

rig_preview

Shows which pixels each rig part takes, and where each pivot is.

animate_rig

Poses a rig over frames from a preset or from keyframes.

tween_poses

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 extra.

export

GIF, PNG, one PNG per frame, or a sprite sheet with JSON metadata.

make_ramp

Hue-shifted shading ramp in OKLCh.

verify_with_aseprite

Renders the file in the real Aseprite and compares.

live_open

Opens Studio Live, the built-in viewer (see below), and returns its URL.

review_notes

What the user marked in Studio Live: frames, painted pixels, tags, text, with a picture of the previous / marked / next frame.

resolve_note

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

  1. pixelize(image, "hero.aseprite"): check the preview. If the grid guess is off, pass cell. For a painted image with no grid, pass target_height.

  2. rig_preview("hero.aseprite", rig): adjust the masks and pivots until each part is clean.

  3. animate_rig("hero.aseprite", rig, out_layer="idle", preset="idle", source_layer="sprite").

  4. find_glitches("hero.aseprite", layer="idle", loop=true), then apply op fix_glitches and check again. check_animation(..., kind="loop"), check_identity(..., master="hero.aseprite"), then view(..., onion=true).

  5. export("hero.aseprite", "hero_idle.gif", scale=4).

Between two key poses

  1. 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).

  2. 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.

  3. 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.

  4. find_glitches(path, layer="jump", master_frames=[1, 6]) (both drawings are references), then fix_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_glitches boxes 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 with review_notes, fixes, and answers with resolve_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 tests

The 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 tools
animate_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

    B3.3/5.0

    Scored across 23 tools

    Disambiguation4/5

    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.

    Naming Consistency3/5

    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.

    Tool Count3/5

    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.

    Completeness5/5

    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

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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.
      1
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables 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.
      116
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Enables 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.
      17
      157 npm
      MIT