Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Aseprite Agent MCP

PYPI · ASEPRITE-AGENT-MCP

Create and verify pixel-art assets with atomic Aseprite edits and Phaser export.

Available components

+4 this week 83 Trust /100

Last scanned (12 hours ago)

Scores higher than 86% of PyPI servers

Category Design and Media

Recent critical change

GHSA-6q48-6c7w-9gw2 affects this package (21 Oct 2026). See the changelog before you install this server.

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 0 of 29 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to SarutobiSasuke8/aseprite-agent-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 19 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability53
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 6720 tokens (~160/item across 42 items; 42 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management67
  • Stability observed for 20 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage67
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "remove_frame" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 43 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

  • 3 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 27 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

  • 23 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 22 Oct 26 +76
    • GHSA-6q48-6c7w-9gw2 no longer affects this package ▲ security
    • Known CVEs: fail → pass ▲ security
    • Score status: failed → scored ▲ functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed pypi/aseprite-agent-mcp@0.3.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo SarutobiSasuke8/aseprite-agent-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/SarutobiSasuke8/aseprite-agent-mcp/.github/workflows/release.yml@refs/tags/v0.3.0
Rekor log index 3282256476
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:4af146bcdb3a5f7b94d1b10a8c22cf5dd00c9889193094e33fbae1ce97669b16

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 29 packages
Packages resolved 29
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 42 exposed · ~6,141 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_frame ~87

Append a new frame to the animation. Args: duration_ms: Frame duration in milliseconds (default 100). copy_from: If given (1-based), duplicate the content of that frame; otherwise the new frame is empty. Returns the new frame number and updated frame count.

NameTypeReqDescription
copy_from–––
duration_msinteger––
filenamestringyes–

No output schema declared.

No examples provided.

add_layer ~154

Add a new (empty) normal layer on top of the stack. Args: name: Layer name. group: Optional name of an existing group layer to nest the new layer in. opacity: 0-255. blend_mode: normal, multiply, screen, overlay, darken, lighten, color_dodge, color_burn, hard_light, soft_light, difference, exclusion, hue, saturation, color, luminosity, addition, subtract, divide. visible: Initial visibility.

NameTypeReqDescription
blend_modestring––
filenamestringyes–
group–––
namestringyes–
opacityinteger––
visibleboolean––

No output schema declared.

No examples provided.

add_tag ~99

Create an animation tag spanning frames [from_frame, to_frame] (1-based). direction: "forward" (default), "reverse", "pingpong", or "pingpong_reverse". color: optional tag colour (shown in the timeline).

NameTypeReqDescription
color–––
directionstring––
filenamestringyes–
from_frameintegeryes–
namestringyes–
to_frameintegeryes–

No output schema declared.

No examples provided.

apply_operations ~834

Apply a list of edit operations to a sprite in one atomic, single-process batch. If any op fails, the whole batch is rolled back, nothing is saved, and the error names the failing op index. dry_run=true checks the list without launching Aseprite (shape only; a missing layer still fails on a real run). Returns a workflow_manifest.v1 with a per-op operations list. Each operation is {"op": "<name>", "args": {...}}. Ops run in order against the same open sprite, so later ops see earlier ones (add a layer, then draw on it). Coordinates are pixels from the top-left (0,0); frames are 1-based and must exist; layer is a name or 1-based index and defaults to the top layer; durations are milliseconds. '?' marks an optional arg. - add_layer(name:str, opacity?:int, blend_mode?:str, visible?:bool): new layer on top - rename_layer(layer:str, new_name:str): rename a layer - set_layer_visible(layer:str, visible:bool): show or hide a layer - set_layer_opacity(layer:str, opacity:int): layer opacity 0-255 - remove_layer(layer:str): delete a layer (not the last one) - add_frame(duration_ms?:int, copy_from?:int): append a frame (copy_from copies an existing frame) - duplicate_frame(frame:int): insert a copy of a frame after it - set_frame_duration(frame:int, duration_ms:int): frame duration in milliseconds - add_tag(name:str, from:int, to:int, direction?:str, color?:color): animation tag over frames from..to (direction forward|reverse|pingpong) - remove_tag(name:str): delete a tag by name - set_pixel(layer?:str, frame?:int, x:int, y:int, color:color): one pixel - draw_line(layer?:str, frame?:int, x1:int, y1:int, x2:int, y2:int, color:color): 1px line between two points - draw_rectangle(layer?:str, frame?:int, x:int, y:int, width:int, height:int, color:color): rectangle outline - fill_rectangle(layer?:str, frame?:int, x:int, y:int, width:int, height:int, color:color): filled rectangle - draw_ellipse(layer?:str, frame?:int, cx:int, cy:int, rx:int, ry:int, color:color): ellipse outline -…

NameTypeReqDescription
dry_runboolean––
filenamestringyes–
operationsarrayyes–

No output schema declared.

No examples provided.

ase_apply_and_preview ~814

Atomically apply typed batch operations to a native master, then return the result and a nearest-neighbour PNG of `frame` at `scale` (1-16). Save succeeds before the preview; a preview failure is reported as saved, not rolled back. Each operation is {"op": "<name>", "args": {...}}. Ops run in order against the same open sprite, so later ops see earlier ones (add a layer, then draw on it). Coordinates are pixels from the top-left (0,0); frames are 1-based and must exist; layer is a name or 1-based index and defaults to the top layer; durations are milliseconds. '?' marks an optional arg. - add_layer(name:str, opacity?:int, blend_mode?:str, visible?:bool): new layer on top - rename_layer(layer:str, new_name:str): rename a layer - set_layer_visible(layer:str, visible:bool): show or hide a layer - set_layer_opacity(layer:str, opacity:int): layer opacity 0-255 - remove_layer(layer:str): delete a layer (not the last one) - add_frame(duration_ms?:int, copy_from?:int): append a frame (copy_from copies an existing frame) - duplicate_frame(frame:int): insert a copy of a frame after it - set_frame_duration(frame:int, duration_ms:int): frame duration in milliseconds - add_tag(name:str, from:int, to:int, direction?:str, color?:color): animation tag over frames from..to (direction forward|reverse|pingpong) - remove_tag(name:str): delete a tag by name - set_pixel(layer?:str, frame?:int, x:int, y:int, color:color): one pixel - draw_line(layer?:str, frame?:int, x1:int, y1:int, x2:int, y2:int, color:color): 1px line between two points - draw_rectangle(layer?:str, frame?:int, x:int, y:int, width:int, height:int, color:color): rectangle outline - fill_rectangle(layer?:str, frame?:int, x:int, y:int, width:int, height:int, color:color): filled rectangle - draw_ellipse(layer?:str, frame?:int, cx:int, cy:int, rx:int, ry:int, color:color): ellipse outline - fill_ellipse(layer?:str, frame?:int, cx:int, cy:int, rx:int, ry:int, color:color): filled ellipse - fill_layer(layer?:str, frame?:int…

NameTypeReqDescription
filenamestringyes–
frameinteger––
operationsarrayyes–
scaleinteger––

No output schema declared.

No examples provided.

ase_export_cast_atlas ~137

Validate several character masters and export them as ONE Phaser atlas. Each member is validated against its own contract; if any fails, nothing is written and every failure is returned. Characters are stacked as row blocks in one sheet.png. Atlas frames are "<character>/<tag>_<nn>" and animations are "<character>:<tag>", all under the atlas key `name`. Every frame of every master is reopened and compared pixel-for-pixel with the written sheet before publishing.

NameTypeReqDescription
membersarrayyes–
namestringyes–
output_directorystringyes–
replaceboolean––

No output schema declared.

No examples provided.

ase_export_phaser ~157

Validate a native master and export a Phaser bundle directory. Writes sheet.png (one row per contract row), a Phaser hash atlas, animations.json (per-frame timing, repeat and yoyo from the contract), qa.json, contract.json and loader.js. The master and the written PNG are reopened and every RGBA pixel is compared before publishing. Animations are named "<contract name>:<row tag>". An existing directory is only replaced with replace=true, and only if it is a previous bundle; the swap is a rename, so a failed export leaves the old one intact.

NameTypeReqDescription
contract–yes–
filenamestringyes–
output_directorystringyes–
replaceboolean––

No output schema declared.

No examples provided.

ase_preview_animation ~188

Return a labelled contact sheet of every frame, scaled with nearest-neighbour. With by_tag (default) each tag gets its own row, labelled with its name, frame range, playback and the frame numbers; untagged frames share a final row. The background is a checkerboard so transparency is visible, or any colour. Also returns the sprite info (frame timing in seconds, tags). This is a review sheet, not proof that the motion reads well. Args: scale: 1-16 pixel magnification. background: "checker" (default), a colour such as "#202020", or null for transparent. by_tag: One row per tag (True) or a plain 8-column grid (False).

NameTypeReqDescription
background–––
by_tagboolean––
filenamestringyes–
scaleinteger––

No output schema declared.

No examples provided.

ase_validate_asset_contract ~114

Reopen a native master and check every frame against a contract. Checks frame count, cell size, that each row's tag covers exactly its frames in order with the expected playback, binary alpha, palette membership, empty frames, and optional per-row foot/centre drift. Unknown contract fields are rejected. Rows are laid out in contract order starting at frame 1. Passing proves geometry and colours, not art quality: still review with ase_preview_animation.

NameTypeReqDescription
contract–yes–
filenamestringyes–

No output schema declared.

No examples provided.

assemble_animation ~253

Clean 1..128 ordered PNG poses with one palette; save master, sheet and JSON. Bounding-box mode uses one shared scale, bottom-centres silhouettes and leaves an outline margin. Anchor mode scales same-size canvases and translates each source [x,y] to (width//2,height-2), refusing clipping. No pose synthesis is implied: inspect the preview for identity, timing and motion coherence. Output is atomically published only after master and PNG pixel verification. Use height=128 and colours=32..48 for detailed sprites. palette_first snaps one shared source palette before sampling; defaults retain the prior pipeline.

NameTypeReqDescription
alignmentstring––
alpha_thresholdinteger––
anchors–––
background–––
background_toleranceinteger––
coloursinteger––
duration_msinteger––
durations_ms–––
filenamesarrayyes–
heightinteger––
methodstring––
outline–––
output_directorystringyes–
palette–––
palette_firstboolean––
tagstring––
widthinteger––

No output schema declared.

No examples provided.

copy_cel ~58

Copy a cel's image (and position) from one frame to another on the same layer.

NameTypeReqDescription
filenamestringyes–
from_frameintegeryes–
layerstringyes–
to_frameintegeryes–

No output schema declared.

No examples provided.

copy_frames_from ~229

Append frames from another sprite file, flattened onto one layer of this sprite. Use it to start every character from a shared base body or animation. The source frames are composited (all visible layers) and placed on `layer` of `filename`, keeping each frame's duration. If this sprite has a single empty frame (a fresh file), the first copied frame fills it instead of leaving a blank frame in front. Args: source: The .aseprite file to copy from (same width, height and colour mode). source_tag: Copy this tag's frames. Or give from_frame/to_frame (1-based, inclusive). With neither, every frame is copied. layer: Destination layer name or 1-based index (default: top layer). new_tag: Optionally tag the copied frames with this name (must not exist yet).

NameTypeReqDescription
filenamestringyes–
from_frame–––
layer–––
new_tag–––
sourcestringyes–
source_tag–––
to_frame–––

No output schema declared.

No examples provided.

create_sprite ~179

Create a new sprite file and save it. Args: filename: Output path. Relative paths go in the workspace. Use a .aseprite/.ase extension to keep layers & frames editable. width, height: Canvas size in pixels (1-65535). color_mode: "rgb" (default), "indexed", or "gray". background: Optional fill colour for the first layer (e.g. "#1d2b53"). Omit for a transparent canvas. overwrite: Replace `filename` if it already exists (default False = no-clobber). Returns the new sprite's structured info.

NameTypeReqDescription
background–––
color_modestring––
filenamestringyes–
heightintegeryes–
overwriteboolean––
widthintegeryes–

No output schema declared.

No examples provided.

derive_mirrored_tag ~189

Create a new animation tag by mirroring an existing one (e.g. walk_left from walk_right). Copies every frame of `source_tag` to new frames at the end of the sprite, flips every layer's cel along `axis`, keeps each frame's duration, and tags the new frames `new_tag` with the source tag's playback direction. Other tags keep their exact ranges. Asymmetric details (a sword hand, a logo) flip too, so review the result with ase_preview_animation. Args: source_tag: Existing tag to mirror. new_tag: Name for the new tag; must not exist yet. axis: "horizontal" (left/right) or "vertical" (up/down).

NameTypeReqDescription
axisstring––
filenamestringyes–
new_tagstringyes–
source_tagstringyes–

No output schema declared.

No examples provided.

draw_line ~159

Draw a straight line from (x1,y1) to (x2,y2). Args: pixel_perfect: Remove L-shaped corner pixels for a clean 1px pixel-art line. antialias: Smooth (Xiaolin Wu) line with alpha blending — RGB sprites only; ignored on indexed/gray. Takes precedence over pixel_perfect.

NameTypeReqDescription
antialiasboolean––
colorstringyes–
filenamestringyes–
frameinteger––
layer–––
pixel_perfectboolean––
x1integeryes–
x2integeryes–
y1integeryes–
y2integeryes–

No output schema declared.

No examples provided.

draw_pixel_rows ~303

Draw a block of pixel art in one call, like a text-art bitmap. Each string in `rows` is one pixel row; each character is looked up in `key` and painted at (x + column, y + row), with (0,0) the top-left of the canvas. '.' and ' ' are left untouched unless `key` defines them. Any other character missing from `key` is an error, so typos never paint silently. Example: rows=["..oo..", ".oxxo.", "..oo.."], key={"o": "#203040", "x": "#f0c060"}. Args: rows: Up to 256 strings of up to 256 characters each. key: Single character -> colour ("#RRGGBB", "#RRGGBBAA", "r,g,b", "index:N", a name). Map a character to "transparent" to erase pixels. layer: Layer name or 1-based index (default: top layer). frame: 1-based frame; it must already exist. clear: Erase the whole cel before drawing (use for full-frame redraws).

NameTypeReqDescription
clearboolean––
filenamestringyes–
frameinteger––
keyobjectyes–
layer–––
rowsarrayyes–
xinteger––
yinteger––

No output schema declared.

No examples provided.

draw_pixels ~130

Plot individual pixels. Args: pixels: List of {"x": int, "y": int, "color": "#hex"?}. If a pixel omits "color", the shared `color` argument is used. color: Default colour for pixels that don't specify their own. layer: Target layer name or 1-based index (default: top layer). frame: Target frame, 1-based (default 1).

NameTypeReqDescription
color–––
filenamestringyes–
frameinteger––
layer–––
pixelsarrayyes–

No output schema declared.

No examples provided.

draw_rectangle ~86

Draw a rectangle. filled=False draws a 1px outline, True fills it.

NameTypeReqDescription
colorstringyes–
filenamestringyes–
filledboolean––
frameinteger––
heightintegeryes–
layer–––
widthintegeryes–
xintegeryes–
yintegeryes–

No output schema declared.

No examples provided.

draw_symmetric_pixels ~110

Plot pixels together with their mirror image(s). mode: "horizontal" (mirror across vertical axis_x), "vertical" (across axis_y), or "both" (4-way radial symmetry). Axes default to the canvas centre.

NameTypeReqDescription
axis_x–––
axis_y–––
colorstringyes–
filenamestringyes–
frameinteger––
layer–––
modestring––
pixelsarrayyes–

No output schema declared.

No examples provided.

export_onion_skin ~170

Export a frame with neighbouring frames ghosted behind it (onion skin). Args: frame: The in-focus frame (drawn fully opaque), 1-based. previous, next: How many earlier/later frames to ghost. ghost_opacity: Max opacity (0-255) of the nearest ghost; further frames fade. scale: Integer upscaling factor for the output PNG. overwrite: Replace an existing output file. Editable .ase/.aseprite masters are never replaced.

NameTypeReqDescription
filenamestringyes–
frameintegeryes–
ghost_opacityinteger––
nextinteger––
outputstringyes–
overwriteboolean––
previousinteger––
scaleinteger––

No output schema declared.

No examples provided.

fill_area ~76

Flood fill (paint bucket): replace the contiguous region of matching colour starting at (x,y) on the target layer with `color`.

NameTypeReqDescription
colorstringyes–
filenamestringyes–
frameinteger––
layer–––
xintegeryes–
yintegeryes–

No output schema declared.

No examples provided.

flip_sprite ~36

Flip the entire sprite. direction: "horizontal" or "vertical".

NameTypeReqDescription
directionstring––
filenamestringyes–

No output schema declared.

No examples provided.

get_palette ~33

Return the sprite's palette as a list of "#RRGGBBAA" colours.

NameTypeReqDescription
filenamestringyes–

No output schema declared.

No examples provided.

get_pixels ~103

Read the composited (all visible layers) pixel colours of a region. Returns rows of "#RRGGBBAA" hex strings. The region is capped at 64x64 (4096 pixels) per call to keep responses small — read in tiles for bigger areas.

NameTypeReqDescription
filenamestringyes–
frameinteger––
height–––
width–––
xinteger––
yinteger––

No output schema declared.

No examples provided.

get_sprite_info ~56

Return structured info about a sprite: size, colour mode, frames (with durations), the full layer tree (names, opacity, blend mode, visibility), animation tags, and palette size.

NameTypeReqDescription
filenamestringyes–

No output schema declared.

No examples provided.

health_check ~73

Run a self-test of the server and its Aseprite integration. Returns whether Aseprite was found, its version, the resolved workspace, the number of registered tools, and whether a real create-sprite + export-PNG round-trip succeeds. `ok` is True only if the full round-trip works.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

import_generated_image ~202

Clean one PNG into a binary-alpha pixel grid, palette and editable master. background is an explicit #RRGGBB border-connected colour key, not semantic segmentation. outline adds a 1px eight-neighbour border, clipped at the cell edge, and may add one palette colour. N colours excludes transparency. New output directory only. Returns a nearest-neighbour preview for review. width/height support 1..256px grids. palette_first snaps the source to one shared palette before sampling, useful with majority on generated shading.

NameTypeReqDescription
alpha_thresholdinteger––
background–––
background_toleranceinteger––
coloursinteger––
filenamestringyes–
heightinteger––
methodstring––
outline–––
output_directorystringyes–
palette–––
palette_firstboolean––
widthinteger––

No output schema declared.

No examples provided.

list_sprites ~18

List sprite/image files in the workspace directory.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

load_palette ~48

Load a palette from a file (.gpl, .pal, .aseprite, .png, ...) and apply it.

NameTypeReqDescription
filenamestringyes–
palette_filestringyes–

No output schema declared.

No examples provided.

mirror_layer ~132

Mirror one half of a layer onto the other (build symmetric artwork). Args: direction: "horizontal" (reflect left<->right) or "vertical" (top<->bottom). source_side: which half is copied: "first" (left/top) or "second" (right/bottom). axis: mirror line position (x for horizontal, y for vertical); default = centre.

NameTypeReqDescription
axis–––
directionstring––
filenamestringyes–
frameinteger––
layerstringyes–
source_sidestring––

No output schema declared.

No examples provided.

recolor_sprite ~239

Replace colours across every layer, frame and palette entry of a sprite. Use it to turn one character template into another (new shirt, hair, skin). Each source colour is matched per channel within `tolerance` and replaced by its target; every pixel is mapped once from its original value, so swaps such as A->B and B->A work. With `output`, the recoloured sprite is saved as a new file and the original is left untouched. Args: mapping: Source colour -> target colour, e.g. {"#3060c0": "#c03030"}. output: Optional new .aseprite path. Without it the sprite is edited in place. tolerance: Per-channel match tolerance 0-255 (default exact). overwrite: Allow `output` to replace an existing file. Returns per-colour pixel counts; a source colour with zero matches is listed under `unmatched` so a typo is visible.

NameTypeReqDescription
filenamestringyes–
mappingobjectyes–
output–––
overwriteboolean––
toleranceinteger––

No output schema declared.

No examples provided.

remove_frame ~38

Delete a frame (1-based). The sprite must have more than one frame.

NameTypeReqDescription
filenamestringyes–
frameintegeryes–

No output schema declared.

No examples provided.

remove_tag ~29

Delete an animation tag by name.

NameTypeReqDescription
filenamestringyes–
namestringyes–

No output schema declared.

No examples provided.

rename_layer ~34

Rename a layer.

NameTypeReqDescription
filenamestringyes–
layerstringyes–
new_namestringyes–

No output schema declared.

No examples provided.

render_preview ~78

Render a single frame to a PNG and return it as an image you can view. Use this to *see* your work. frame is 1-based; scale enlarges small sprites (default 8x) so individual pixels are visible.

NameTypeReqDescription
filenamestringyes–
frameinteger––
scaleinteger––

No output schema declared.

No examples provided.

replace_color ~79

Replace every pixel matching `from_color` (within `tolerance` per channel) with `to_color`, on the chosen layer + frame.

NameTypeReqDescription
filenamestringyes–
frameinteger––
from_colorstringyes–
layer–––
to_colorstringyes–
toleranceinteger––

No output schema declared.

No examples provided.

save_sprite_as ~101

Save a copy of a sprite under a new path (optionally flattened). The original file is left untouched. Useful for exporting an editable .aseprite to another .aseprite, or snapshotting a version. overwrite: Replace `new_filename` if it already exists (default False = no-clobber).

NameTypeReqDescription
filenamestringyes–
flattenboolean––
new_filenamestringyes–
overwriteboolean––

No output schema declared.

No examples provided.

set_cel_position ~61

Move a cel's image to position (x, y) within the canvas.

NameTypeReqDescription
filenamestringyes–
frameintegeryes–
layerstringyes–
xintegeryes–
yintegeryes–

No output schema declared.

No examples provided.

set_frame_duration ~44

Set a single frame's duration in milliseconds (1-based frame).

NameTypeReqDescription
duration_msintegeryes–
filenamestringyes–
frameintegeryes–

No output schema declared.

No examples provided.

set_layer_properties ~64

Update one or more layer properties. Only the arguments you pass are changed.

NameTypeReqDescription
blend_mode–––
editable–––
filenamestringyes–
layerstringyes–
name–––
opacity–––
visible–––

No output schema declared.

No examples provided.

set_palette ~59

Replace the entire palette with the given list of colours. colors: list of colour strings, e.g. ["#000000", "#ffffff", "255,0,0"].

NameTypeReqDescription
colorsarrayyes–
filenamestringyes–

No output schema declared.

No examples provided.

set_tag ~88

Update an existing tag. Only the arguments you pass are changed. Note: changing from_frame/to_frame recreates the tag in place to update its range reliably across Aseprite versions.

NameTypeReqDescription
color–––
direction–––
filenamestringyes–
from_frame–––
namestringyes–
new_name–––
to_frame–––

No output schema declared.

No examples provided.

Install

How do I install the Aseprite Agent MCP server?

Aseprite Agent MCP runs locally as a PyPI package, launched with uvx aseprite-agent-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · aseprite-agent-mcp

# add to Claude Code
claude mcp add sarutobisasuke8-aseprite-agent-mcp -- uvx aseprite-agent-mcp
Common questions

What is the Aseprite Agent MCP server?

Aseprite Agent MCP is listed in the public MCP registry as io.github.SarutobiSasuke8/aseprite-agent-mcp. Create and verify pixel-art assets with atomic Aseprite edits and Phaser export. This page covers its PyPI package (aseprite-agent-mcp).

Is the Aseprite Agent MCP server safe to use?

Aseprite Agent MCP scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Aseprite Agent MCP server expose?

Aseprite Agent MCP exposes 42 tools: apply_operations, export_onion_skin, get_sprite_info, render_preview, get_pixels, and 37 more. Their descriptions and schemas cost roughly 6,141 tokens of context every time the server is loaded.

Is the Aseprite Agent MCP server still maintained?

Aseprite Agent MCP is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Aseprite Agent MCP server under?

Aseprite Agent MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.