SpriteMCP
SpriteMCP lets you create, outfit, shade, manually edit, and animate consistent side-view pixel-art characters through MCP tools.
Inspect the shared rig: part IDs, joints, joint docs, draw order, view lock, frame count, and outfit slot specs.
Manage output locations and references: set/get/clear output root, default paths, and reference grid previews.
Generate the base armature and named characters: base idle, pivots, demo pattern, and generate_character.
Plan, inspect, and manage outfit layers: plan_outfit, get_outfit_plan, list_outfit_layers, prepare slot references, and clear/generate outfit slots.
Paint design layers with MCP-native tools: fill_parts_on_slot, paint_pixels/set_pixels, fill_rect, stroke_rect, draw_line, fill_ellipse, clear_rect, flood_fill, paint_from_commands, and get_layer_pixels.
Plan and apply hard shading: plan_shading, get_shading_plan, suggest_shade_regions, and get_shade_palette.
Compose the dressed rest pose and open a local manual pixel editor for human edits.
Plan, build, finish, and export 8-frame animations: plan_animation, get_animation_plan, build_frame_animation, finish_frame_animation, and export_animation_preview.
List registered tools to verify live MCP tool availability.
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., "@SpriteMCP Create an 8-frame walk cycle for a side-view samurai character."
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.
SpriteMCP
SpriteMCP is a pixel-art character toolkit for creating and animating consistent side-view characters.
Drawing each sprite manually gives precise control, but building outfits and multiple animation frames is slow and repetitive. AI Image generators are faster and can explore creative ideas, but their outputs are harder to keep structurally consistent across poses and frames.
SpriteMCP combines the two approaches: the agent can use its generative capabilities to design and iterate on the character, while the toolkit provides a structured pixel-art workflow with a shared armature, editable layers, and deterministic animation.
It provides a Python API and an MCP server for Cursor and other MCP clients.
Demo
The prompts shown above are the initial requests given to the agent. The final results were not produced in a single pass.
Each demo required roughly five iterations of prompting and refinement to reach the final result. The iteration included reviewing generated output, adjusting the request, and correcting details in the character design or animation.
Samurai
Initial prompt
Side-view samurai, sepia palette. Light skin. Yellow cloth (kimono and hakama). Blue armor on chest, shoulders, forearms, leg plates, and boots. Blue conical jingasa with a straight lower edge, covering the upper half of the face. Orange details/accents. Hard one-step-darker shading (no gradients), light from top-front.
Walk
Standard side-view walk cycle, 8 frames, natural stride with opposing arm counterbalance. No special requirements beyond reading clearly as a walk.
![]()
Run
Run cycle with a wide stride and a forward-driven body. Arms in a high forward pump; the elbow must not break backward behind the torso. Arms reach higher than in the walk.
![]()
Attack
Two-handed katana strike. Feet slightly apart and static. Hands locked in the same grip (tips aligned). Raise the katana above the head, then slash downward.
![]()
![]()
![]()
![]()
Dark mage
Initial prompt
Generate a dark fantasy mage.
Medieval warrior (templar)
Initial prompt
Generate a medieval templar warrior. Use sepia colors. Add his armor.
War orc
Initial prompt
Generate a war orc in battle armor. Sepia palette. Green orc skin, red eyes, metal-colored armor. He carries a red banner with a violet symbol on his back, attached to the torso.
Desert wanderer
Initial prompt
Create a desert wanderer character, with bandages covering the whole body and brown skin. Yellow eyes.
Related MCP server: openpixel-mcp
How it works (high level)
The base character is authored once at 90×128. Characters get a copy of that base and its joint pivots, while their appearance is defined by separate design layers.
authored base (90×128) shared naked armature + eyes
│
generate_character(name) copy base + pivots → characters/<name>/base/
│
plan_outfit → paint design/layers/*.png (flat colors)
│
plan_shading → paint optional hard shadows (one darker step)
│
compose_character dressed rest preview
│
human edit gate ask → optional open_pixel_editor → re-compose
│
plan_animation 8 beats + silhouette story
│
build + finish × 8 joint angles → frame_00..07 + GIF / contact sheetThe same joint hierarchy is used for all characters. Clothing follows the body part it belongs to.
Manual pixel editor
![]()
After composing a character, the design can be edited in a local browser UI before animation.
CLI: python -m spritemcp pixel-editor <name>
The editor modifies only design/layers/*.png. After applying changes, run compose_character again.
Requirements
Install
Cursor MCP via uvx (recommended)
Add SpriteMCP to your MCP configuration:
{
"mcpServers": {
"SpriteMCP": {
"command": "uvx",
"args": [
"--native-tls",
"--from",
"git+https://github.com/NicoRMA/SpriteMCP.git",
"spritemcp"
]
}
}
}Restart SpriteMCP from Cursor → Settings → MCP.
SpriteMCP can then be used directly through the MCP tools.
See docs/mcp.example.json for the complete configuration.
Local development
For development or when modifying the source:
git clone https://github.com/NicoRMA/SpriteMCP.git
cd SpriteMCP
uv syncThen run:
uv run spritemcp
The Python package and import name are both spritemcp.
CLI
SpriteMCP also provides a CLI for working without MCP:
uv run python -m spritemcp paths
uv run python -m spritemcp joints
uv run python -m spritemcp generate-character hero(With uvx: uvx --from . -- python -m spritemcp paths.)
Outputs require an explicit root: MCP/agents must call set_output_root(<project>/output) before writes (or SPRITE_GEN_OUTPUT_ROOT / per-call output_dir). Curated showcase characters live in demo/ (tracked).
MCP server (Cursor)
Preferred: uvx --from … spritemcp. Alternatives after editable install: python -m spritemcp.mcp_server or run_mcp_server.py.
Generated files are written to output/ by default.
Agent pipeline (do not skip gates)
Required:
set_output_root(<agent_project>/output)before any writegenerate_character(name)plan_outfit→ show summary, wait for OK →prepare_outfit_slot_reference→ paint (fill_parts_on_slot,fill_rect,paint_pixels, …)Recommended:
plan_shading→ paint one-step-darker shadows →compose_characterHuman edit gate: ask if the user wants manual edits. If yes →
open_pixel_editor→ Apply → re-compose_character. If no → continue.plan_animation→ show summary, wait for OK(build_frame_animation → finish_frame_animation)for frames0..7
Outfit layers must be painted via MCP paint tools not Shell/PIL one-offs or external image generators. open_pixel_editor is the human-only exception after shading+compose.
Full tool table and return schemas: docs/overview.md.
Layout
SpriteMCP/
base/ # authored 90×128 masks + eyes.png
demo/ # curated showcase characters (tracked)
output/ # local workspace (gitignored)
docs/
src/spritemcp/ # Python package (API + MCP server)
run_mcp_server.py # preferred MCP entry (PYTHONPATH-safe)Per character (under output/characters/<name>/ or demo/<name>/):
base/ # shared armature copy
design/
plan.json
layers/<layer>.png # 10 export layers
compose_preview.png
anims/<anim>/
plan.json
frame_00.png … frame_07.png
<anim>_preview.gif
<anim>_contact_sheet.pngPublic API (summary)
Import from spritemcp or spritemcp.api. MCP tools use the same names.
Area | Functions |
Character |
|
Outfit |
|
Shading |
|
Manual edit |
|
Animation |
|
Rig |
|
Joint names: neck, shoulder_far / shoulder_near, elbow_far / elbow_near, hip_far / hip_near, knee_far / knee_near.
License
MIT — free to download, use, modify, and redistribute in your own projects. Demo art in demo/ is included under the same license unless a file says otherwise.
Status
Early public release. APIs may evolve; prefer MCP tool names and spritemcp.api as the stable surface. Wrist/ankle pivots and engine-specific importers are not in scope yet.
Available Tools
45 toolsbuild_frame_animationA
Draft one animation frame (0..7) with hierarchical joint rotations.
GATE: refuses if no valid plan.json exists for this character+animation. If painted design/outfit plan exists, also requires compose_character. Optional plan_id must match the locked plan from plan_animation.
NEVER call this until plan_animation succeeded AND you showed user_facing_summary to the user (and they OK'd). Jumping straight to rotations is forbidden (e.g. a sword clip must not reuse a fist-fight plan).
DRESSED FRAMES: when design/ layers exist, the draft includes outfit layers rigid-rotated with the same pivot transforms as their parent body parts (DRAW_ORDER, draw_after, overhang preserved). No design → base only. Result includes dressed=true and design_slots when clothes were composited.
Pose model: each body part is a RIGID full-canvas layer rotated about articulation pivots (parent joints rotate children) — not freehand redraw. Use get_joint_docs for which parts each joint rotates.
rotations example: {"hip_near": -20, "knee_near": 6, "hip_far": 18, "knee_far": 14}. Joints: neck, shoulder_far, shoulder_near, elbow_far, elbow_near, hip_far, hip_near, knee_far, knee_near. Angles are absolute degrees from rest. Does not finalize — call finish_frame_animation next. For +X-facing idle: negative hip ≈ forward, positive knee ≈ flexion. Optional output_dir overrides session output root.
Inputs: name (required), frame_index (required), animation_name (required), scale, +3 more. Returns: object
clear_outfit_slotC
Blank one slot's design layer (transparent PNG) and refresh its reference.
Inputs: name (required), slot (required), plan_id, output_dir. Returns: object
clear_output_rootA
Clear session output override; restore /output default.
Inputs: no named parameters. Returns: object
clear_rectB
Erase (transparent) a rectangle on the design layer only — never body.
Inputs: x (required), y (required), name (required), slot (required), +5 more. Returns: object
compose_characterA
Compose dressed rest = base body + design layers (required before anim).
Writes design/compose_preview.png. Uses DRAW_ORDER for body; each design export layer is inserted full after draw_after (no clip-to-body — overhang OK). GATE: call after painting layers (and preferably after plan_shading + shadow paint), BEFORE plan_animation. Soft gate: does not refuse when no shading plan exists. When design exists, build_frame_animation refuses without this compose preview — animation frames then rigid-rotate each design PNG 1:1 with its body part.
After this returns: HUMAN EDIT GATE — ask the user if they want manual pixel edits. If yes → open_pixel_editor → Apply → re-compose. If no → plan_animation.
Inputs: name (required), scale, output_dir, include_skipped. Returns: object
draw_lineC
Draw a line on design/layers/.png; refresh ref preview.
Inputs: x0 (required), x1 (required), y0 (required), y1 (required), +7 more. Returns: object
export_animation_previewA
Rebuild horizontal contact sheet + looping preview GIF for an animation.
Requires finished frame_00.png … frame_07.png. Writes <animation_name>_contact_sheet.png and <animation_name>_preview.gif under anims/<animation_name>/. Preview GIF scale is LOCKED to native 90×128 — do not ask for or invent a per-clip scale. Also runs automatically when finish_frame_animation locks frame 7.
Inputs: name (required), animation_name (required), output_dir, duration_ms. Returns: object
fill_ellipseA
Fill an ellipse bounded by (x,y,width,height) on the design layer.
Inputs: x (required), y (required), name (required), slot (required), +6 more. Returns: object
fill_parts_on_slotA
Fill body-part silhouettes onto design/layers/.png (MCP-native).
REPLACES ad-hoc Shell/PIL scripts that looped part_pixels and stamped colors. Server uses the character part map; base body is never modified.
Omit parts/part_ids → fill this layer's body_parts (e.g. torso for torso, lower_arm_far+hand_far for lower_arm_far).
parts: names like "torso", "head" (see get_part_ids).
part_ids: integer ids from get_part_ids.
color: hex / [r,g,b,a] for all selected parts.
part_colors: optional {part_name: color} overrides (e.g. darker far legs).
Flat local fill only — do NOT bake underside shading here; use plan_shading + paint_* after outfit paint. Then add details with fill_rect / draw_line / paint_pixels (belt, cross, nasal bar, plates). Overhang: paint outside silhouette with those tools. FORBIDDEN: Shell python/PIL scripts or external image generators.
Inputs: name (required), slot (required), color, parts, +5 more. Returns: object
fill_rectA
Fill a rectangle on design/layers/.png; refresh body-under ref.
color: hex / [r,g,b,a] / transparent. Overhang past body OK. Prefer this or paint_from_commands for blocky pixel-art clothing shapes.
Inputs: x (required), y (required), name (required), slot (required), +6 more. Returns: object
finish_frame_animationA
Lock the current draft frame as final under anims/<animation_name>/.
GATE: refuses without a valid plan.json (same as build_frame_animation). Never finalize frames until plan_animation was called and the user saw user_facing_summary. Optional plan_id must match the stored plan.
Writes frame_XX.png + poses/frame_XX.json. When frame 7 finishes (all frames present), also writes <animation_name>_contact_sheet.png and <animation_name>_preview.gif. Repeat build→finish for frames 0..7.
Inputs: name (required), frame_index (required), animation_name (required), plan_id, +1 more. Returns: object
flood_fillA
Flood-fill connected pixels on the design layer from (x,y).
Optional. Do NOT flood the entire body silhouette as the sole outfit design — prefer fill_rect / paint_pixels / paint_from_commands for shapes. Large fills return a warning field.
Inputs: x (required), y (required), name (required), slot (required), +4 more. Returns: object
generate_base_idleA
Author shared naked side-view idle as full separate layers + composed previews.
Imports user-authored 90x128 masks from spritemcp/base/ into output_dir/base_idle_90x128/. Prefer generate_character for named chars.
Inputs: scale, output_dir. Returns: object
generate_characterA
Copy the SHARED naked side-view armature into a named character folder.
All characters share the same authored 90x128 base idle + pivots; do not invent a per-style skeleton. Writes <output_root>/characters//base/ (part map, layers, silhouette, pivots, previews). Optional output_dir overrides the session root from set_output_root. Call once before plan_outfit / animation.
Inputs: name (required), scale, output_dir. Returns: object
generate_outfit_slotA
OPTIONAL import/finalize: ensure design layer + refresh body-under ref.
Preferred flow paints with MCP tools (paint_pixels, fill_rect, paint_from_commands, …) which already write design/layers/.png and refresh refs. Use this to import an existing RGBA PNG via design_image_path, or re-sync refs. Does not clip to body alpha.
GATE: requires plan_outfit. Never use Shell/PIL or GenerateImage to create the layer — use MCP paint tools instead.
Inputs: name (required), slot (required), scale, plan_id, +2 more. Returns: object
generate_pivotsB
Compute articulation pivots on the shared base idle map.
Prefer generate_character for named chars.
Inputs: scale, output_dir. Returns: object
get_animation_planA
Read the locked plan.json for a character animation.
Use before build_frame_animation if you need the plan_id or to re-show user_facing_summary. Errors if plan_animation was never called.
Inputs: name (required), animation_name (required), output_dir. Returns: object
get_default_pathsA
Active output root, style ref, and common subdirs.
Default is /output/ (agent/MCP working directory). Optional SPRITE_GEN_OUTPUT_ROOT env seeds the session at start. Call set_output_root(path) or pass output_dir on write tools to redirect. Characters live under <output_root>/characters//{base,design,anims}.
Inputs: no named parameters. Returns: object
get_draw_orderB
Side-view compose order: far limbs, torso/head, near legs, near arms.
Inputs: no named parameters. Returns: result
get_frame_countA
Number of frames per character animation (always 8; indices 0..7).
Inputs: no named parameters. Returns: result
get_joint_docsB
Joint name, parent, child, and which parts each joint rotates.
Inputs: no named parameters. Returns: result
get_jointsB
Hierarchical joint specs: name, parent part, child part.
Inputs: no named parameters. Returns: result
get_layer_pixelsA
Sample a region of design/layers/.png for read-modify workflows.
Returns pixels as [{x,y,rgba:[r,g,b,a]}, ...]. Caps response size; use a smaller region or opaque_only=true. Does not modify the layer.
Inputs: name (required), slot (required), x, y, +5 more. Returns: object
get_outfit_planB
Read the locked design/plan.json for a character outfit.
Inputs: name (required), output_dir. Returns: object
get_output_rootA
Return the absolute output root currently in effect (session or default).
Inputs: no named parameters. Returns: object
get_part_idsB
Stable part name → integer id map for the base idle template.
Inputs: no named parameters. Returns: object
get_shade_paletteA
Local flat color → one-step-darker shadow roles (style-lock shading).
Example: off_white cloth → shadow_beige underside. Use these roles / hex values with paint_* after plan_shading. No soft gradients.
Inputs: no named parameters. Returns: object
get_shading_planB
Read the locked design/shading_plan.json for a character.
Inputs: name (required), output_dir. Returns: object
get_view_lockC
Permanent view + layering rules (side profile; far behind, near in front).
Inputs: no named parameters. Returns: object
list_outfit_layersC
List design layers (10 export names), parent/body parts, paint status, paths.
allow_overhang is always true (body is not a clip).
Inputs: name (required), output_dir. Returns: object
list_outfit_slot_specsA
Structural design layers = the 10 EXPORT_LAYER_NAMES (no style presets).
Same names as base/layers/: upper_arm_far, lower_arm_far, upper_leg_far, lower_leg_far, torso, head, upper_leg_near, lower_leg_near, upper_arm_near, lower_arm_near (lower_* includes hand/foot). Each layer has a single pose parent and body_parts for paint/ref underlay. Conceptual notes (jingasa/do/hakama) map onto these keys — paint targets are always the 10 layer files. Every layer allows overhang.
Inputs: no named parameters. Returns: result
list_registered_toolsA
Return every tool name registered on this live MCP process.
Cold-start check: expected_tool_count=45 and must include plan_outfit, plan_shading, compose_character, open_pixel_editor, fill_parts_on_slot, paint_pixels, fill_rect, set_output_root, etc. If Cursor shows ~28 tools or paint_* are missing from the agent catalog, restart SpriteMCP — do not fall back to Shell/API/GenerateImage.
Inputs: no named parameters. Returns: object
open_pixel_editorA
Open the local manual pixel editor for design layers (human edit gate).
Call AFTER compose_character when the user wants to edit pixels by hand. Opens a small localhost web UI (pencil / eyedropper / eraser) for all 10 EXPORT_LAYER_NAMES. Apply writes design/layers/.png only — never base/. After the user clicks Apply, re-run compose_character before plan_animation. Resolves paths via session output_root / output_dir.
Inputs: name (required), port, output_dir, open_browser. Returns: object
paint_from_commandsA
Batch paint commands on one slot (single save + ref refresh).
Each command: {op, ...} with op in fill_parts_on_slot|paint_pixels| fill_rect|clear_rect|stroke_rect|draw_line|fill_ellipse|flood_fill. Preferred for multi-step pixel-art (silhouette + belt/cross details). FORBIDDEN: Shell/PIL or external generators.
Inputs: name (required), slot (required), commands (required), scale, +2 more. Returns: object
paint_pixelsA
Paint individual pixels onto design/layers/.png (REQUIRED paint path).
Each item: {x, y, color} where color is "#RRGGBB" / "#RRGGBBAA" / [r,g,b,a] / "transparent". Canvas coords match the character (body ref). Writes the design layer only; refreshes refs/_ref.png. Read preview_paths after. FORBIDDEN alternatives: Shell/PIL, GenerateImage.
Inputs: name (required), slot (required), pixels (required), scale, +2 more. Returns: object
plan_animationA
REQUIRED before any frames: lock a reasoned animation plan.
YOU (the agent) must author the plan — this tool validates and stores it. Do NOT jump to joint rotations. Do NOT reuse an unrelated clip's plan (e.g. a sword cut must not copy a bare-knuckle fight).
Required plan keys:
beats: list of exactly 8 objects {frame_index: 0..7, pose_description: str, primary_joints: [joint names]}
silhouette_story: short paragraph describing how the clip reads to a viewer
differs_from: map {other_anim_name: explanation} (or list of {name, difference}) — must cover existing sibling clips / contrast_with
weapon_or_style_notes: e.g. overhead sword cut vs jab/punch fight
Returns plan_id + user_facing_summary. You MUST show user_facing_summary to the user and wait for confirmation before build_frame_animation. next_step always says: show summary, then build frames.
Inputs: name (required), plan (required), intent (required), animation_name (required), +2 more. Returns: object
plan_outfitA
REQUIRED before painting clothes: lock an outfit plan from a free brief.
YOU (the agent) author the plan from brief (e.g. "samurai") — no
hardcoded style tables. Do NOT invent if-samurai code paths.
Required plan keys:
overall_look: short paragraph of the dressed silhouette (may note overhang such as helmet bulk or hat brim past the head)
slots: object with ALL 10 EXPORT_LAYER_NAMES — upper_arm_far, lower_arm_far, upper_leg_far, lower_leg_far, torso, head, upper_leg_near, lower_leg_near, upper_arm_near, lower_arm_near — each {skip: bool, visual_notes: str}. Conceptual vocabulary (jingasa, do, hakama, boots, gloves) belongs in notes; paint keys are the layers. lower_* includes hand/foot (gloves/boots paint there).
Overhang rule: clothing MAY extend outside body silhouette margins; parent body parts are alignment/proportion reference, NOT a hard clip. Keep proportions sensible (not absurd scale).
Saves characters//design/plan.json. Returns plan_id + user_facing_summary — SHOW the summary to the user before painting. Next: prepare_outfit_slot_reference → MCP paint tools (flat local colors; do NOT bake shading in fill_parts_on_slot) → recommended plan_shading → shadow paint → compose_character. FORBIDDEN: Shell/PIL scripts or external image generators.
Inputs: name (required), plan (required), brief (required), output_dir. Returns: object
plan_shadingA
RECOMMENDED after flat outfit paint: lock where hard shadows go.
YOU (the agent) author the plan — this tool validates and stores it. Soft gate: compose_character does NOT refuse without shading, but MCP SOP expects plan_shading → paint shadows → compose (or re-compose).
Required plan keys:
light_direction: e.g. "top-front / +X-up"
rules: must include "one_step_darker" and "no_gradients"
layers: object with ALL 10 EXPORT_LAYER_NAMES, each {skip: bool, shade_notes: str, strokes?: [{region?, intent, color_role?}]} Optional overall_notes. Alternate: flat strokes list with layer + intent.
Style: one darker step of local color (see get_shade_palette); hard 1–2px bands; shade design layers only; never rewrite base; do not strip eyes.
Saves design/shading_plan.json. Returns plan_id + user_facing_summary — SHOW the summary and wait for OK before painting shadows with paint_*.
Inputs: name (required), plan (required), brief (required), output_dir. Returns: object
prepare_outfit_slot_referenceA
MANDATORY before/during paint: body part layer(s) UNDER + design on TOP.
slot is one of the 10 export layer names (same as base/layers/).
Writes design/refs/_ref.png. That layer's body_parts are the underlay
(alignment / proportions only — NOT a clip mask); design/layers/.png
is the transparent paint target. Clothing MAY overhang the body silhouette
if scale stays sensible. Example:
prepare_outfit_slot_reference("", "torso") → refs/torso_ref.png.
Then paint with MCP fill_parts_on_slot (silhouette) + fill_rect /
draw_line / paint_pixels (details) / paint_from_commands
(never Shell/PIL or GenerateImage).
Inputs: name (required), slot (required), scale, plan_id, +1 more. Returns: object
run_demoC
Paint the tiny palette test pattern under output_dir/demo/.
Inputs: output_dir. Returns: object
set_output_rootA
Set where character/outfit/anim output is written for this MCP session.
Resolves to an absolute path and creates the directory. Persists until the MCP process exits or clear_output_root(). Does NOT move existing files — only redirects new writes. Per-call output_dir still overrides. Example: set_output_root("C:/Users/me/game/assets/art/sprites"). When unset, tools use /output/.
Inputs: path (required). Returns: object
set_pixelsC
Alias for paint_pixels — set {x,y,color} on the design layer.
Inputs: name (required), slot (required), pixels (required), scale, +2 more. Returns: object
show_reference_gridB
Upscale the style-ref PNG onto a visible per-pixel grid.
Writes under output_dir/reference_grid/. Returns path strings for grid PNGs.
Inputs: scale, style_ref, output_dir, readable_scale. Returns: object
stroke_rectC
Stroke (outline) a rectangle on the outfit design layer.
Inputs: x (required), y (required), name (required), slot (required), +7 more. Returns: object
suggest_shade_regionsA
Propose underside / far-limb shade band hints (does NOT write pixels).
Uses design-layer alpha when painted, else body-part geometry. Returns structured regions (layer, bbox, sample_pixels, reason). Agent filters into plan_shading, then paints with MCP tools. Optional helper before plan_shading.
Inputs: name (required), output_dir, band_height. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 45 tools
Most tools have clearly distinct purposes, but there is a direct alias (set_pixels for paint_pixels) and some getter tools (get_joints vs get_joint_docs) that could be confused. The painting primitives (fill_rect, stroke_rect, draw_line, etc.) are distinct but similar in nature, requiring careful reading of descriptions.
Tool names follow a consistent verb_noun snake_case pattern (get_, set_, clear_, plan_, build_, finish_, paint_, fill_, stroke_, draw_, flood_, generate_, list_, etc.). The naming is highly predictable, with only minor exceptions like run_demo and show_reference_grid that still fit the verb-first style.
45 tools is well above the 25+ threshold for 'too many'. While the domain is complex, many tools are narrow helpers (e.g., list_registered_tools, run_demo, get_view_lock) and some are redundant (set_pixels alias). The count feels bloated and could be consolidated.
The tool set covers the full sprite generation pipeline: character creation, outfit planning, painting, shading, composition, animation planning, frame building, and preview export. There are no obvious dead ends or missing critical operations for the stated purpose.
Maintenance
Related MCP Connectors
Generate authentic pixel art - sprites, animations, and tilesets - from any MCP client
Generate pixel art sprites, animations, 8-direction rotations and palettes for games.
Generate, edit, style-match, turn, and animate game-ready pixel art at exact sizes.
Build a game's 2D art layer with your agent: characters, animations, tilesets, levels, 5 engines.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to create, edit, inspect, render, diff, preview, watch, and export indexed pixel-art sprites and animations as text grids through twelve MCP tools, including .tt and .aseprite import/export.27 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to create, inspect, validate, edit, render, and export layered pixel art assets and animations through structured MCP tools.78 npm8MIT
- AlicenseBqualityBmaintenanceEnables AI agents to create and refine pixel art and sprite animations through MCP tools, including seeded generators, indexed palettes, shading, animation presets, inline PNG previews, and multi-format export.28MIT
- AlicenseAqualityBmaintenanceEnables a coding agent to draw, shade, rig, animate and export pixel art directly inside the user's already-open Aseprite document via MCP tools, skills and a bundled pixel-art knowledge base. Every change is a step the user can undo, and the agent checks each result by looking at the canvas before continuing.181,484 npmMIT