{"name":"io.github.oaktreegames/aseprite-live-mcp","slug":"oaktreegames-aseprite-live-mcp","title":"Aseprite Live","description":"Live+headless Aseprite MCP: Unity export, art-QA, tilemaps, in-editor dialogs, update-aware","url":"https://mcp.market/server/oaktreegames-aseprite-live-mcp","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":27,"stars":7,"forks":0,"downloads_week":53,"last_push_at":"2026-07-29T02:58:50.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/oaktreegames/aseprite-live-mcp","website":null,"version":"0.2.0","remotes":[],"packages":[{"registryType":"pypi","identifier":"aseprite-live-mcp","version":"0.2.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"live (default) or headless","name":"ASEPRITE_MCP_BACKEND"},{"description":"Path to the Aseprite executable (auto-detected if unset)","name":"ASEPRITE_PATH"},{"description":"Relay HTTP base for the live backend (default http://127.0.0.1:9878)","name":"ASEPRITE_RELAY_URL"},{"description":"Set to disable the daily PyPI update check","name":"ASEPRITE_MCP_NO_UPDATE_CHECK"}]}],"tools":[{"name":"add_frame","description":"Append a new empty frame.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_frames","description":"Append ``count`` empty frames in one undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_group","description":"Add a layer group. Move layers into it with ``move_layer_to_group``; reference nested layers anywhere by name or as ``Group/Layer``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_layer","description":"Add a new empty layer (optionally named) at the top of the stack.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_outline","description":"Add a 1px outline in ``color`` around the opaque pixels of the active cel — readability against busy backgrounds. ``diagonal`` true also outlines diagonally (8-connected). One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_palette_color","description":"Append ``color`` to the palette and return its new index.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adjust_brightness_contrast","description":"Adjust the active cel's brightness and contrast, each -100..100 (0 = unchanged). Alpha is preserved. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adjust_hsl","description":"Shift the active cel's colors in HSL: ``hue_shift`` degrees (-360..360), ``saturation`` a multiplier (1.0 = unchanged), ``lightness`` a delta (-1..1). Useful for tint variants. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_bundled_palette","description":"Apply one of Aseprite's bundled extension palettes by resource ID — e.g. DB16, DB32, ARQ4, EDG16 (availability depends on the installed palette extensions). For gameboy/pico8/cga see ``apply_preset_palette``. One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_dither","description":"Fill a rectangle with a uniform ordered (Bayer 4x4) dither mixing ``color1`` and ``color2``. ``density`` 0..1 is the fraction of ``color2`` — 0.5 is an even checker-style mix. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_preset_palette","description":"Replace the palette with a built-in preset: gameboy | pico8 | cga.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ask_point","description":"Live editor only: ask the ARTIST to click a point on the canvas (pivot, anchor, paint origin). Returns immediately; call ``get_asked_point`` to collect the click. Human-in-the-loop, in-editor.","write_action":false,"price_micros":0,"input_schema":null},{"name":"batch_apply_palette","description":"Palette-lock every ``.aseprite`` in ``folder``: snap each sprite (first frame, alpha preserved) to a palette and export images to ``out_dir``. Give a ``preset`` (gameboy/pico8/cga) or an explicit ``palette`` list of #rrggbb. Non-destructive; continues past per-file errors. Headless.","write_action":false,"price_micros":0,"input_schema":null},{"name":"batch_export","description":"Export every ``.aseprite`` in ``folder`` (first frame) to an image, optionally integer-upscaled by ``scale``. Non-destructive: writes ``<name>.<format>`` to ``out_dir`` (default = ``folder``); never modifies the source. Continues past per-file errors. Headless. (``file`` is ignored — this operates on a folder.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"batch_resize","description":"Resize every ``.aseprite`` in ``folder`` (first frame, nearest-neighbor) and write images to ``out_dir``. Give either ``scale`` (multiplier) or explicit ``width``/``height``. Non-destructive; continues past per-file errors. Headless.","write_action":false,"price_micros":0,"input_schema":null},{"name":"box_blur","description":"Blur the active cel with an alpha-weighted box kernel. ``radius`` 1-4 (1 = 3x3). Transparent neighbors don't darken edges. One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"cancel_ask_point","description":"Withdraw a pending ``ask_point`` request (e.g. the artist stepped away and you're moving on).","write_action":true,"price_micros":0,"input_schema":null},{"name":"clear_cel","description":"Empty the cel at the given layer + frame (transparent).","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_sprite","description":"Create a new sprite. Live: opens a new untitled sprite in the editor. Headless: writes a new .aseprite to ``file`` (required). ``color_mode`` is one of rgb | gray | indexed.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_frame","description":"Delete frame ``number`` (1-based). Cannot delete the last frame.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_layer","description":"Delete the layer with the given name.","write_action":true,"price_micros":0,"input_schema":null},{"name":"desaturate","description":"Convert the active cel to grayscale (Rec. 601 luma), keeping alpha. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_circle","description":"Draw a circle centered at (center_x, center_y). ``fill`` true fills the disk. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_ellipse","description":"Draw an ellipse centered at (center_x, center_y) with independent x/y radii. ``fill`` true fills it. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_gradient","description":"Fill a rectangle with a linear gradient from ``color1`` to ``color2``. ``direction`` is horizontal | vertical | diagonal. ``dither`` true uses an ordered Bayer dither between the two colors instead of blending RGB — the palette-friendly way. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_iso_box","description":"Draw a 2:1 isometric box. The footprint diamond is centered at (center_x, center_y) with the given ``half_width`` (full tile width = 2×half_width), rising ``height`` px. Top/left/right faces are auto-shaded from ``color`` (#rrggbb, light from top-left) with stroke + highlight. Returns the top/SE/SW face corner polygons so you can attach recessed ports or details. One undo step. Headless: pass ``fi","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_iso_cylinder","description":"Draw a vertical isometric cylinder (tank/silo/chimney): top ellipse + shaded body + front rim, auto-shaded from ``color``. ``top_y`` is the top of the body. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_line","description":"Draw a 1px line from (x1,y1) to (x2,y2). One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_pixels","description":"Set individual pixels: ``pixels`` is a list of ``{\"x\": int, \"y\": int, \"color\": \"#rrggbb[aa]\"}``. The precision tool for detail work — one undo step for the whole batch. Capped at 4096 pixels per call. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_polyline","description":"Stroke connected line segments through ``points`` (ordered [x, y] pairs); ``close=True`` joins the last point back to the first. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draw_rectangle","description":"Draw a rectangle on the active layer + frame. ``color`` is #rrggbb or #rrggbbaa. ``fill`` false draws only the outline. One undo step (live). Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"duplicate_frame","description":"Duplicate frame ``number`` (1-based).","write_action":false,"price_micros":0,"input_schema":null},{"name":"duplicate_layer","description":"Duplicate a layer (with its cels) above the original.","write_action":false,"price_micros":0,"input_schema":null},{"name":"expand_canvas","description":"Grow (or shrink, with negatives) the canvas per side WITHOUT scaling content — existing pixels keep their positions relative to the old origin. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_layers","description":"Export every image layer (recursing into groups) as its own PNG in ``out_dir``, named ``<sanitized-layer-name>.png``. Hidden layers are exported too; every layer's original visibility is restored afterwards, so the document ends exactly as it started. A multi-frame sprite splits each layer into ``<name>1.png``, ``<name>2.png``, ...; the returned ``files`` lists what was actually written. Headless:","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_sprite","description":"Export the active sprite to a file; format is chosen by ``out_path`` extension (.png, .gif, ...). A multi-frame sprite saved to a single-image format is split into ``<name>1.ext``, ``<name>2.ext``, ...; a multi-frame sprite saved to ``.gif`` becomes one animated GIF (all frames, honoring per-frame durations). The returned ``files`` lists what was actually written. Does not modify the sprite. Headl","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_spritesheet","description":"Pack all frames into a single sprite-sheet image (optionally writing a JSON atlas to ``data_path``). ``sheet_type`` is rows | columns | horizontal | vertical | packed. Does not modify the sprite. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_tags","description":"Export each animation tag's frame range as its own file in ``out_dir``: an animated ``<tag-name>.gif`` (format=\"gif\", default) or a horizontal ``<tag-name>.png`` strip (format=\"png\"). Errors if the sprite has no tags. Returns each tag's file, frame range, and frame count. Does not modify the sprite. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_palette_from_image","description":"Extract a palette (median-cut) from an external image file and, by default, set it as the active sprite's palette — the concept-art → locked-palette step. Returns the colors as hex, sorted dark→light. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fill_area","description":"Flood-fill the contiguous same-color region at (x, y). Most reliable on RGB sprites. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fill_polygon","description":"Scanline-fill an arbitrary polygon given ``points`` (a list of [x, y] pairs, in order). ``color`` is #rrggbb or #rrggbbaa. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"flatten_sprite","description":"Flatten all layers into a single layer.","write_action":false,"price_micros":0,"input_schema":null},{"name":"frame_diff","description":"Pixel-exact diff of two composited frames: changed-pixel count and ratio, the bounding box of the change, and whether they're identical. Use it to verify an animation actually moves — or that an edit didn't leak into frames it shouldn't touch. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_color_ramp","description":"Generate a dark->light shading ramp from ``base_color`` and APPEND it to the palette in order — ready for ``palette_ramp_walk``. ``count`` colors; ``hue_shift`` pushes shadows toward blue and highlights toward yellow. Returns the ramp as hex. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_asked_point","description":"Poll the result of ``ask_point``: ``done`` false while waiting, then the clicked ``x``/``y`` (or ``cancelled`` if the artist pressed Esc).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_color_stats","description":"Return a color histogram of the composited sprite: distinct opaque color count, total opaque pixels, and the ``top`` most-used colors with counts — a palette-drift check for the art-QA loop. Read-only. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_dialog_choice","description":"Poll the result of ``show_choice_dialog``: ``done`` false while the dialog is open, then the chosen button text.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_editor_state","description":"Live editor only: current zoom, scroll, and which sprite pixel the mouse is over — lets an agent know what the artist is looking at.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_palette","description":"Return the active sprite's palette as #rrggbbaa hex strings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_pixel","description":"Read one composited pixel (all layers) at (x, y) as #rrggbbaa.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_pixels","description":"Read a composited pixel region as a grid of #rrggbbaa strings — the AI feedback loop for 'what does the canvas look like now'. Capped at 4096 px; use a smaller region or export for larger areas.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sprite_info","description":"Get the active sprite's size, color mode, and layer/frame/tag lists. Headless: pass ``file`` (the .aseprite to inspect).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sprite_metadata","description":"Read the sprite's typed key/value metadata (Properties).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_watched_changes","description":"Poll the change counter started by ``watch_changes`` (``reset=True`` zeroes it after reading).","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_image_as_layer","description":"Import an external image file (PNG, etc.) into a new layer at (x, y) — a reference/trace layer for concept-art intake. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_spritesheet","description":"Slice a sheet PNG into animation frames: cells are read row-major at the given frame size onto a new \"imported\" layer, adding frames as needed. The sheet's dimensions must be exact multiples of the frame size. One undo step. Headless: pass ``file`` (the target sprite).","write_action":false,"price_micros":0,"input_schema":null},{"name":"invert_colors","description":"Invert the active cel's RGB (alpha untouched). One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iso_recessed_panel","description":"Draw a recessed docking socket/port on an isometric face — a light lit lip framing a dark recessed interior. ``points`` = the 4 corner [x, y] pairs of a face (e.g. the ``face_se`` returned by draw_iso_box). This is the consistent I/O-port style. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_layers","description":"The full layer tree, top of stack first: name, path, kind (image/group/tilemap), visibility, and opacity — including layers nested in groups (which ``get_sprite_info`` lists only at the top level).","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_palette","description":"Replace the sprite's palette from a palette file (.gpl, .pal, .ase, .png strip — anything Aseprite reads). One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"measure_padding","description":"Measure the transparent 'sticker' padding around the content: content bounding box, per-side padding (left/right/top/bottom), fill ratio, and distinct opaque color count. Read-only. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"merge_layer_down","description":"Merge a layer into the layer directly beneath it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"move_layer","description":"Reorder a layer in the stack. ``direction`` is up | down | top | bottom (bottom = stack index 1).","write_action":false,"price_micros":0,"input_schema":null},{"name":"move_layer_to_group","description":"Move a layer inside a layer group.","write_action":false,"price_micros":0,"input_schema":null},{"name":"paint_with_stamp","description":"Stamp an image at each [x, y] in ``points`` (points are stamp centers). The stamp comes from ``source_path`` (a PNG) or ``source_rect`` ([x, y, width, height] cut from the composited sprite). One undo step for the whole scatter. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"palette_from_sprite","description":"Derive the palette FROM the sprite's actual pixels (Aseprite's color quantization) — the inverse of ``quantize_to_palette``. Returns the new palette as hex. One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"qa_sweep","description":"Audit the active sprite against project conventions and return per-check pass/fail. Any rule you pass is checked: exact canvas size (``expected_width``/``expected_height``), ``grid_multiple`` (canvas dims divisible by N), ``max_colors`` (distinct opaque colors ≤ N), and ``require_symmetric_padding`` (equal left/right + top/bottom margins). Read-only. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"quantize_to_palette","description":"Snap every opaque pixel of the active cel to its nearest color in the sprite's palette (alpha preserved) — enforce palette discipline after intake or shading. RGB sprite; one undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"redo","description":"Redo the last undone edit (live editor).","write_action":false,"price_micros":0,"input_schema":null},{"name":"rename_layer","description":"Rename a layer.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_onion_composite","description":"Write a PNG of ``frame`` with up to ``prev`` earlier frames ghosted in red and ``next`` later frames ghosted in blue (Aseprite's onion-skin convention) at the given ghost ``opacity`` — so you can *see* the motion arc in one image. Does not modify the sprite. Headless: pass ``file``.","write_action":true,"price_micros":0,"input_schema":null},{"name":"replace_color","description":"Replace every pixel matching ``from_color`` (within ``tolerance``, a 0-255 RGB distance) with ``to_color`` across the active cel, preserving each pixel's alpha unless ``to_color`` carries its own. One undo step. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reverse_frames","description":"Reverse frame order (cels on every layer, plus durations) — the whole sprite by default, or the inclusive [from_frame..to_frame] range. One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_lua","description":"Run arbitrary Lua inside Aseprite and return its result (advanced escape hatch — equivalent to local code execution). ``J(value)`` is available for JSON returns; wrap your own edits in ``app.transaction`` for clean undo. The prelude also provides ``editCel(fn)`` and ``findLayer(s, name)``. Set ``save=true`` (headless) to persist changes to ``file``. Your code must ``return`` a value.","write_action":true,"price_micros":0,"input_schema":null},{"name":"save_palette","description":"Write the sprite's palette to a file (.gpl, .pal, .png — by extension).","write_action":true,"price_micros":0,"input_schema":null},{"name":"select_all","description":"Select the whole canvas.","write_action":false,"price_micros":0,"input_schema":null},{"name":"select_rectangle","description":"Set a rectangular selection. Most meaningful on the live editor.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_cel_opacity","description":"Set the cel's opacity (0-255).","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_cel_position","description":"Move the cel's top-left origin to (x, y).","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_editor_view","description":"Live editor only: set the viewport zoom (1.0 = 100%) and/or scroll — e.g. zoom to the region you're about to edit so the artist can watch.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_frame_duration","description":"Set frame ``number``'s duration in milliseconds.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_frame_durations","description":"Set every frame in [from_frame..to_frame] to ``ms`` milliseconds.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_layer_blend_mode","description":"Set a layer's blend mode. One of: normal, multiply, screen, overlay, darken, lighten, color_dodge, color_burn, hard_light, soft_light, difference, exclusion, hue, saturation, color, luminosity, addition, subtract, divide.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_layer_opacity","description":"Set a layer's opacity (0-255).","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_layer_visibility","description":"Show or hide a layer.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_onion_skin","description":"Configure the editor's onion-skin view: on/off, ghost counts each direction, and whether ghosting stays inside the current tag. A view preference — visually meaningful in the live editor. (For a rendered onion-skin image any backend can produce, use ``render_onion_composite``.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_palette","description":"Replace the whole palette with ``colors`` (list of #rrggbb/#rrggbbaa).","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_palette_color","description":"Set palette entry ``index`` to ``color`` (#rrggbb or #rrggbbaa).","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_sprite_metadata","description":"Attach typed key/value metadata to the sprite (Aseprite's Properties system — stored in the .aseprite file itself). Values may be strings, numbers, or booleans. Useful for provenance (\"generated_by\", spec IDs) and pipeline state. One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_symmetry","description":"Live editor only: set mirror-painting symmetry — ``mode`` is ``none``, ``horizontal`` (mirror across a vertical axis), ``vertical``, or ``both``; optionally place the axis lines. Affects the artist's subsequent brush strokes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sharpen","description":"Sharpen the active cel (unsharp mask over a 3x3 neighborhood). ``strength`` 0.1-2.0. Only opaque pixels are considered, so sprite edges don't halo against transparency. One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"show_choice_dialog","description":"Live editor only: pop a small dialog IN Aseprite with a message and up to 4 option buttons (e.g. approve/redo). Non-blocking — call ``get_dialog_choice`` to collect the artist's pick.","write_action":false,"price_micros":0,"input_schema":null},{"name":"smear_frame","description":"Append a motion-smear frame blending ``from_frame`` and ``to_frame``: overlapping pixels averaged, single-frame areas ghosted at half alpha — a pixel-content smear. RGB sprite only. Headless: pass ``file``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sort_palette","description":"Reorder palette swatches by ``luminance`` (default), ``hue``, or ``saturation``. Intended for RGB sprites' swatch organization — on an INDEXED sprite this changes which color each pixel shows (indices aren't remapped). One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"status","description":"Report backend health plus this server's version and whether a newer release exists. Live: whether Aseprite is connected + its version. Headless: the resolved Aseprite executable path and whether it exists.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_watching_changes","description":"Detach the ``watch_changes`` listener.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tween_cel_opacity","description":"Fade a layer's cels across [from_frame..to_frame]: opacity interpolates from ``from_opacity`` to ``to_opacity`` (0-255) with the chosen easing. Every frame in the range needs a cel on the layer. One undo step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tween_frames","description":"Insert ``count`` in-between frames between ``from_frame`` and ``to_frame`` that interpolate the cel's position (a motion tween of the start cel's image). ``easing``: linear, ease_in, ease_out, or smoothstep. Headless: pass ``file``.","write_action":true,"price_micros":0,"input_schema":null},{"name":"undo","description":"Undo the last edit on the active sprite (live editor).","write_action":false,"price_micros":0,"input_schema":null},{"name":"watch_changes","description":"Live editor only: start counting edits the ARTIST makes to the active sprite (via ``Sprite.events``). Poll with ``get_watched_changes`` — e.g. wait for the artist to finish touching up, then re-run the QA sweep.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-09-25T21:43:05.535Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T21:43:05.554Z","components":{"code":{"score":25,"max":25,"notes":["45 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":12,"max":15,"notes":["last push 59 days ago"]},"identity":{"score":6,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"aseprite-live-mcp","version":"0.2.0","found":true,"weeklyDownloads":53,"license":"MIT","dependencyCount":4,"publishedAt":"2026-07-17T02:12:45.821615Z","repositoryUrl":"https://github.com/oaktreegames/aseprite-live-mcp"}],"repo":{"found":true,"owner":"oaktreegames","repo":"aseprite-live-mcp","archived":false,"pushedAt":"2026-07-29T02:58:50Z","stars":7,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/283829593?v=4","ownerCreatedAt":"2026-05-12T00:33:19Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/283829593?v=4&s=128","source":"github"},"presence":{"stars":7,"forks":0,"downloadsWeek":53,"license":"MIT","lastPushAt":"2026-07-29T02:58:50.000Z","score":27}}}},"grade_history":[],"reviews":[]}