sprite-canon
Click on "Install 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., "@sprite-canonverify these character sprites against the canon and show any failures"
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.
sprite-canon
MCP server that keeps AI-generated game sprites looking like ONE game.
![]()
One character, three outfits — the blue and red rows are sprite_repaint calls, not regenerations. Same shading order, same silhouette, same result every time.
AI generators are great at making a pretty sprite and terrible at making it match the last one. Ask for the same character twice and the palette drifts, the outfit mutates, the new hat floats 3 pixels above the head — each asset is fine alone, and the game looks wrong assembled. Regenerating "until it matches" doesn't converge; it burns money and you can't diff the result.
sprite-canon takes the opposite approach, extracted from a real game project that generated ~4,000 frames and learned every lesson the hard way:
Your consistency rules become data — a
sprite-canon.json("the canon") holding the palette, named colour regions (skin, outfit, outline…), relative scale, and check thresholds. Committed next to your assets.Verification is numeric, not visual. You cannot eyeball 96 outfit variants × 8 directions × 4 frames.
sprite_verifyreturns hard pass/fail numbers for the defects that actually ship: off-palette pixels, accessories that jitter between frames, a region that's bright from behind and dark from the front, a repaint that touched the face.Fixes are deterministic pixel operations, not regeneration. Repainting a region onto a new colour ramp preserves shading and silhouettes, never touches protected regions, and produces the same output every time. An outfit variant is one tool call, not a prompt lottery.
Install
Claude Desktop — one file, no config
Download
sprite-canon.mcpbfrom the latest release.In Claude Desktop, open Settings → Extensions (☰ menu → File → Settings on Windows).
Drag the
.mcpbfile into the Extensions page, review, and click Install.
(Double-clicking the file also works if your OS has the .mcpb association registered — drag-and-drop always works. Alternative: Extensions → Advanced settings → Install Extension → pick the file.)
That's the whole install: the bundle ships its own dependencies, and Claude Desktop provides the Node runtime. Requires the Claude Desktop app — for Claude Code see below.
Claude Code / other MCP clients
git clone https://github.com/useka12-eng/sprite-canon
cd sprite-canon && npm installThen register in your project's .mcp.json (or any MCP client config):
{
"mcpServers": {
"sprite-canon": {
"command": "node",
"args": ["/path/to/sprite-canon/src/mcp/server.mjs"]
}
}
}Requires Node 18+. No native dependencies — the PNG/GIF codecs are self-contained.
Build the bundle yourself
npx @anthropic-ai/mcpb pack . dist/sprite-canon.mcpbRelated MCP server: mcp-spritesheet-forge
Tools
Tool | What it does |
| Create the canon; learn the palette from sample images (colours used ≥ N times — rarer ones are usually anti-aliasing noise) |
| Define a region by sampling a few pixels, listing colours, or an HSL rule. Records the region's luminance range. Mark face/outline |
| Show the resolved canon + census a file against it (unmatched pixels = gaps in your region definitions) |
| List colours actually used, by frequency and luminance — raw material for canon decisions |
| Per-frame anatomy (bbox, cap/head width, waist row, first row of each region) + cross-frame jitter |
| Numeric checks: |
| Deterministically recolour a region onto a dark→light ramp; protected regions are untouchable |
| Zoomed contact sheet returned inline as an image — judge consistency on sheets, not in-game |
| Lossless GIF ops: palette substitution across all colour tables (zero generation loss), retiming |
Inputs can be PNGs, animated GIFs, or PNG spritesheets (cellW/cellH).
The workflow
canon_init → learn the palette from your existing good assets
canon_learn → sample skin / outfit / outline once; mark face + outline protected
sprite_measure → read the numbers before placing anything ("where do the eyes start?")
sprite_repaint → make variants deterministically (outfits, teams, seasons)
sprite_verify → prove it: face untouched, nothing left over, no jitter, on palette
sprite_sheet → look at the result as a sheet, zoomed, before it enters the gameLessons this tool encodes
These are not hypothetical — each one shipped as a real defect first:
Measure, don't assume proportions. A hat brim placed at "52% of head height" landed exactly on the eyes: on a 20px head the eyes are 7–9px from the top, so every fixed ratio hits them.
sprite_measurereports where the face actually starts, per frame.Repaint with a fixed luminance range. Normalising per image maps the same source colour to different outputs depending on how much of the region is visible — our hat was bright from behind, dark from the front. The canon records each region's range once; repaint always uses it.
Protect regions structurally. "Be careful around the face" fails at scale.
protected: truemeans repaint cannot touch it and verify proves it didn't.Patch GIF palettes, don't re-encode. An indexed GIF's colours live in its colour tables — global and per-frame local ones (patching only the global table is the classic half-fix). Substituting table entries re-dresses every frame in perfect sync with zero loss.
Region definitions have gaps; census them. 12 stray pixels of the old colour surviving a repaint is invisible to the eye and obvious to
leftover. When it fires,canon_info's census shows which colours your regions don't cover.
The scale table
sprite_verify's scale check reads canon.scale.heights — relative sizes in units of a reference asset (the entry equal to 1). No tool writes this section yet; add it to sprite-canon.json by hand:
"scale": { "heights": { "hero": 1, "house": 3.4, "chicken": 0.45 } }Then verify with scaleNames mapping file basenames to those keys. This catches the classic "the house is smaller than the hero" a week before your players do.
Practical notes
Always pass
canonPath(or a file the canon sits above). A stdio MCP server's working directory belongs to the client, not your project, so the tools refuse to guess from cwd.Codec limits: PNG must be 8-bit, non-interlaced, RGB/RGBA/palette (the common pixel-art cases; 16-bit or interlaced files are rejected with a clear error). The GIF encoder is exact up to 255 opaque colours per file — beyond that, nearest-palette snapping.
sprite_sheetreturns the image inline up to ~800 KB; larger sheets return the file path only.Spritesheets round-trip cell-for-cell: empty cells stay empty, nothing is compacted.
What this is not
Not a generator. Pair it with whatever makes your art (PixelLab, Aseprite, Gemini, hand pixels); sprite-canon is the layer that keeps the results coherent.
Not an atlas packer / collision tool — sprite-tools covers that well.
Not magic: you spend ~10 minutes once per project teaching it your canon. That investment is exactly what makes every later check and fix trustworthy.
Development
npm test # unit + end-to-end MCP tests (22)The test suite includes regression tests for every bug an adversarial multi-agent review found in v0.1 — sheet cell compaction, GIF disposal semantics, fake-success responses, silent zero-check passes. If one fails, a bug that already existed once is back.
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables AI assistants to create and manipulate pixel art by providing tools for drawing, layer management, and animation frame control. It supports exporting projects to PNG, GIF, and sprite sheet formats via the Model Context Protocol.2213Apache 2.0
- AlicenseNot gradedqualityBmaintenanceA hosted Model Context Protocol (MCP) server for game-dev spritesheet workflows. Connect it to Claude or any MCP-compatible AI client and pack, split, trim, and animate sprites through natural language — no local tools required.MIT
- AlicenseBqualityBmaintenanceEnables LLMs to create and edit pixel art reliably with support for layers, frames, symmetry, and various drawing tools.70MIT No Attribution
- AlicenseAqualityBmaintenancePixelForge MCP provides a pipeline for converting AI-generated illustrations into in-game dot sprites. It automates background removal, pixelization, palette unification, outlining, and spritesheet packing via MCP tools.18MIT
Related MCP Connectors
Generate authentic pixel art - sprites, animations, and tilesets - from any MCP client
On-demand drift checks: declared CSS color, radius, spacing & type vs your own tokens or a pack
Source-first URL clone, capture, rebuild, and fidelity verification tools.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/useka12-eng/sprite-canon'
If you have feedback or need assistance with the MCP directory API, please join our Discord server