Skip to main content
Glama

sprite-canon

AI가 생성한 게임 스프라이트가 하나의 게임처럼 보이게 유지하는 MCP 서버.

원본 vs 결정적 리페인트 — 음영은 유지되고, 실루엣은 절대 변하지 않습니다

한 캐릭터, 세 벌의 의상 — 파란색과 빨간색 행은 sprite_repaint 호출이지 재생성이 아닙니다. 동일한 음영 순서, 동일한 실루엣, 매번 동일한 결과.

AI 생성기는 예쁜 스프라이트를 만드는 데는 뛰어나지만, 이전 것과 일치하게 만드는 데는 형편없습니다. 같은 캐릭터를 두 번 요청하면 팔레트가 어긋나고, 의상이 변형되며, 새 모자는 머리 위 3픽셀 위에 떠 있습니다 — 각 자산은 단독으로는 괜찮지만, 조합하면 게임이 어긋나 보입니다. "일치할 때까지" 재생성하는 것은 수렴하지 않으며, 비용만 소모하고 결과물을 비교할 수도 없습니다.

sprite-canon은 반대 접근 방식을 취합니다. 실제 게임 프로젝트에서 약 4,000프레임을 생성하면서 모든 교훈을 고통스럽게 얻은 경험에서 출발했습니다:

  1. 일관성 규칙이 데이터가 됩니다 — 팔레트, 명명된 색상 영역(피부, 의상, 윤곽선…), 상대적 배율, 검사 임계값을 담은 sprite-canon.json("캐논")이 자산 옆에 커밋됩니다.

  2. 검증은 숫자로, 시각적으로 하지 않습니다. 96가지 의상 변형 × 8방향 × 4프레임을 눈으로 확인할 수는 없습니다. sprite_verify는 실제로 문제가 되는 결함에 대해 명확한 통과/실패 수치를 반환합니다: 팔레트를 벗어난 픽셀, 프레임 간에 떨리는 액세서리, 뒤에서 보면 밝고 앞에서 보면 어두운 영역, 얼굴에 닿은 리페인트.

  3. 수정은 결정적 픽셀 연산이지 재생성이 아닙니다. 영역을 새 색상 램프로 다시 칠하면 음영과 실루엣이 보존되고, 보호 영역에는 절대 닿지 않으며, 매번 동일한 결과를 생성합니다. 의상 변형은 프롬프트 복권이 아니라 도구 호출 한 번입니다.

설치

Claude Desktop — 파일 하나, 설정 불필요

  1. 최신 릴리스에서 sprite-canon.mcpb를 다운로드합니다.

  2. Claude Desktop에서 설정 → 확장 프로그램을 엽니다(Windows에서는 ☰ 메뉴 → 파일 → 설정).

  3. .mcpb 파일을 확장 프로그램 페이지로 끌어다 놓고 검토 후 설치를 클릭합니다.

(운영체제에 .mcpb 연결이 등록되어 있다면 파일을 더블클릭해도 됩니다 — 끌어다 놓기가 항상 동작합니다. 대안: 확장 프로그램 → 고급 설정 → 확장 프로그램 설치 → 파일 선택.)

설치의 전부입니다: 번들은 자체 의존성을 포함하며, Claude Desktop이 Node 런타임을 제공합니다. Claude Desktop 앱이 필요합니다 — Claude Code는 아래를 참조하세요.

Claude Code / 기타 MCP 클라이언트

git clone https://github.com/useka12-eng/sprite-canon
cd sprite-canon && npm install

그런 다음 프로젝트의 .mcp.json(또는 기타 MCP 클라이언트 설정)에 등록합니다:

{
  "mcpServers": {
    "sprite-canon": {
      "command": "node",
      "args": ["/path/to/sprite-canon/src/mcp/server.mjs"]
    }
  }
}

Node 18+가 필요합니다. 네이티브 의존성 없음 — PNG/GIF 코덱은 자체 포함입니다.

직접 번들 빌드하기

npx @anthropic-ai/mcpb pack . dist/sprite-canon.mcpb

Related MCP server: Spiritmarch Aseprite MCP

도구

도구

기능

canon_init

캐논 생성; 샘플 이미지에서 팔레트 학습(색상 사용 횟수 ≥ N — 더 적은 것은 보통 안티앨리어싱 노이즈)

canon_learn

픽셀 샘플링, 색상 나열, 또는 HSL 규칙으로 영역 정의. 영역의 휘도 범위 기록. 얼굴/윤곽선을 protected로 표시

canon_info

해석된 캐논 표시 + 파일에 대한 인구 조사(일치하지 않는 픽셀 = 영역 정의의 누락)

colors_inspect

실제 사용된 색상을 빈도와 휘도별로 나열 — 캐논 결정을 위한 원자재

sprite_measure

프레임별 해부학(bbox, 머리/캡 너비, 허리 행, 각 영역의 첫 행) + 프레임 간 떨림

sprite_verify

숫자 검사: palette, jitter, spread, protected, leftover, scale

sprite_repaint

영역을 어두운→밝은 램프로 결정적으로 재색상화; 보호 영역은 건드릴 수 없음

sprite_sheet

확대된 연락처 시트를 인라인 이미지로 반환 — 프레임이 아닌 시트 단위로 판단

gif_patch

무손실 GIF 작업: 모든 색상 테이블에서 팔레트 대체(제로 손실), 재타이밍

입력은 PNG, 애니메이션 GIF, 또는 PNG 스프라이트시트(cellW/cellH)가 될 수 있습니다.

워크플로우

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 game

이 도구가 담은 교훈

이것들은 가상의 사례가 아니라 실제 결함으로 먼저 발생한 것들입니다:

  • 비율을 추측하지 말고 측정하세요. "머리 높이의 52%"에 모자 챙을 배치했더니 정확히 눈 위에 떨어졌습니다: 20px 머리에서 눈은 위에서 7–9px에 있는데, 모든 고정 비율이 눈을 맞춥니다. sprite_measure는 프레임별로 얼굴이 실제로 시작하는 위치를 보고합니다.

  • 고정 휘도 범위로 리페인트하세요. 이미지별 정규화는 영역이 보이는 정도에 따라 같은 소스 색상을 다른 출력으로 매핑합니다 — 우리 모자는 뒤에서 보면 밝고, 앞에서 보면 어두웠습니다. 캐논은 각 영역의 범위를 한 번 기록하고, 리페인트는 항상 그 범위를 사용합니다.

  • 구조적으로 영역을 보호하세요. "얼굴 주변은 조심"은 규모가 커지면 실패합니다. protected: true는 리페인트가 절대 닿을 수 없게 하고, verify가 닿지 않았음을 증명합니다.

  • GIF 팔레트를 패치하고, 재인코딩하지 마세요. 인덱스 GIF의 색상은 색상 테이블에 있습니다 — 전역 그리고 프레임별 로컬 테이블 모두(전역 테이블만 패치하는 것은 전형적인 절반 수정입니다). 테이블 항목을 대체하면 모든 프레임이 완벽한 동기화로, 제로 손실로 다시 옷을 입습니다.

  • 영역 정의에 누락이 있습니다; 인구 조사를 하세요. 리페인트 후 남은 이전 색상 픽셀 12개는 육안으로는 보이지 않지만 leftover에는 명확합니다. 이 검사가 실행되면 canon_info의 인구 조사가 영역이 커버하지 않는 색상을 보여줍니다.

배율 테이블

sprite_verify의 scale 검사는 canon.scale.heights를 읽습니다 — 기준 자산(값이 1인 항목)에 대한 상대적 크기입니다. 아직 이 섹션을 작성하는 도구는 없습니다. sprite-canon.json에 직접 추가하세요:

"scale": { "heights": { "hero": 1, "house": 3.4, "chicken": 0.45 } }

그런 다음 scaleNames로 파일 베이스네임을 해당 키에 매핑합니다. 이렇게 하면 "집이 영웅보다 작다"는 고전적인 문제를 플레이어들이 발견하기 일주일 전에 잡아냅니다.

실용적인 참고 사항

  • 항상 canonPath를 전달하세요 (또는 캐논이 그 위에 있는 파일). stdio MCP 서버의 작업 디렉터리는 클라이언트의 것이지 프로젝트의 것이 아니므로, 도구들은 cwd에서 추측하기를 거부합니다.

  • 코덱 제한: PNG는 8비트, 논인터레이스, RGB/RGBA/팔레트여야 합니다(일반적인 픽셀아트 케이스; 16비트 또는 인터레이스 파일은 명확한 오류와 함께 거부됩니다). GIF 인코더는 파일당 255개의 불투명 색상까지 정확합니다 — 그 이상은 최근접 팔레트 스냅핑이 적용됩니다.

  • sprite_sheet는 약 800KB까지 인라인 이미지로 반환합니다 — 더 큰 시트는 파일 경로만 반환합니다.

  • 스프라이트시트는 셀 단위로 왕복됩니다: 빈 셀은 빈 채로 유지되며, 압축되거나 이동되지 않습니다.

이것은 무엇이 아닌가

  • 생성기가 아닙니다. PixelLab, Aseprite, Gemini, 손으로 그린 픽셀 등 무엇으로 아트를 만들든 짝지어 사용하세요; sprite-canon은 결과물의 일관성을 유지하는 레이어입니다.

  • 아틀라스 패커 / 충돌 도구가 아닙니다 — sprite-tools가 그 부분을 잘 다룹니다.

  • 마법이 아닙니다: 프로젝트당 약 10분을 투자해 캐논을 가르치면, 그 투자가 이후 모든 검사와 수정을 신뢰할 수 있게 만듭니다.

개발

npm test          # unit + end-to-end MCP tests (22)

테스트 스위트는 v0.1에서 적대적 다중 에이전트 리뷰가 발견한 모든 버그에 대한 회귀 테스트를 포함합니다 — 시트 셀 압축, GIF 디스포저 의미론, 가짜 성공 응답, 무음 제로 검사 통과. 하나라도 실패하면, 한때 존재했던 버그가 다시 돌아온 것입니다.

MIT

Available Tools

9 tools
canon_infoA

Show the resolved canon (palette size, regions with their rules and protection flags, scale table, thresholds) and optionally census a file against it — how many pixels each region matches, and how many match nothing (unmatched pixels mean your region definitions have gaps). Pass canonPath or censusFile — without either there is nowhere to search from (the server's working directory is the client's, not your project's).

NameRequiredDescriptionDefault
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
canonPathNopath to sprite-canon.json (default: search upward from the target file)
censusFileNocount region membership of this file's first frame (also used as the search origin for the canon)
listColorsNoinclude the full palette hex list

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses the path-resolution quirk ('the server's working directory is the client's, not your project's') and explains that unmatched pixels indicate gaps in region definitions. It does not explicitly state read-only, but 'Show' and 'census' imply non-destructive inspection, and no contradictions exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence adds context: the main action, the optional census, the required parameter condition, and a path caveat. It is front-loaded with the core purpose and avoids redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an inspection tool with no output schema, it fully describes what is returned (canon details and census counts) and explains how to interpret results (unmatched pixels). It covers the key operational caveat about paths and leaves no obvious gap for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds real value by explaining that canonPath and censusFile serve as the search origin and that censusFile also counts frame membership, plus the semantic meaning of unmatched pixels. This goes beyond the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a clear verb ('Show') with a specific resource (the resolved canon), and enumerates exactly what is shown (palette size, regions, rules, protection flags, scale table, thresholds) plus the optional census operation. This distinguishes it from sibling tools like canon_init or canon_learn by describing a distinct inspection/analysis action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a strong usage condition ('Pass canonPath or censusFile — without either there is nowhere to search from') and warns about the server working directory. However, it does not explicitly compare against sibling tools or state when to prefer this over others, so it clarifies how to call but not when to choose it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

canon_initA

Create sprite-canon.json for a project: the single source of truth for palette, regions, scale and check thresholds. Learns the palette from sample images (colours used at least minCount times; rarer colours are usually anti-aliasing noise). Run once per project, then commit the file.

NameRequiredDescriptionDefault
dirYesproject directory to create sprite-canon.json in
nameNoproject name
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
minCountNomin occurrences for a colour to enter the palette (default 4)
sampleFilesNoPNG/GIF files or directories to learn the palette from
updatePaletteNorelearn just the palette of an EXISTING canon from sampleFiles (regions/scale/checks untouched)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It discloses the file-creation behavior and the palette-learning algorithm: colors must occur at least minCount times, rarer colors are usually anti-aliasing noise. It could go further by stating what happens if the file already exists, but the described behavior is substantive and not hidden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only three sentences, front-loads the main purpose, and each sentence contributes meaningful information. There is no filler or repetition of the input schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters and no output schema, the description provides the essential context: what file is created, what data it encodes, how the palette is learned, and when to run the tool. It omits edge-case guidance such as behavior with an existing sprite-canon.json, but the schema compensates for parameter-level detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so the baseline is 3. The description adds useful context around the palette-learning threshold meaning of minCount, but it does not map parameters or clarify options like updatePalette beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create sprite-canon.json for a project', and explains that the file is the single source of truth for palette, regions, scale, and thresholds. It is clear and not tautological, though it never explicitly contrasts itself with sibling tools like canon_learn.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives strong lifecycle guidance: 'Run once per project, then commit the file', which tells the agent initialization is a one-time action per project. It does not explicitly state when not to use this tool or when to prefer a sibling like canon_learn for updating an existing canon.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

canon_learnA

Define or update a named region in the canon (e.g. skin, hair, outfit, outline). Give a few [x,y] points on sample images; the sampled colours (optionally expanded by absorb) become the region. The region's luminance range is recorded — repaint uses that FIXED range so the same source colour always maps to the same output colour in every frame and direction. Mark regions like face/eyes/outline as protected: repaint will never touch them and verify will fail if anything else does. Instead of points you may pass explicit colors, or an HSL rule (hue/sat/light ranges) for anti-aliased art — an HSL-only region additionally needs lumRange if you ever want to repaint it. Updates MERGE additively into an existing region; pass replace=true to redefine it from scratch (the only way to remove a mis-sampled colour).

NameRequiredDescriptionDefault
hueNoHSL rule: hue range in degrees
satNoHSL rule: saturation range 0..1
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
lightNoHSL rule: lightness range 0..1
absorbNoalso absorb colours within this per-channel distance of sampled ones (default 0)
colorsNoexplicit hex colours instead of samples
regionYesregion name, e.g. 'skin' / 'outline' / 'cloak'
replaceNoredefine the region from scratch instead of merging (default false)
samplesNo
lumRangeNofixed luminance range (0-255) for repainting — required for HSL-only regions, auto-computed for colour lists
canonPathNopath to sprite-canon.json (default: search upward from the target file)
protectedNomark as protected (never repainted, verified untouched)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does so thoroughly. It explains the fixed luminance-range behavior for repaint, that protected regions are never repainted and cause verify to fail if touched, that updates merge additively, and that replace=true is required to remove mis-sampled colors. These are exactly the nontrivial behavioral facts an agent must know before calling the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph, but every sentence carries meaningful content: region definition, sampling, luminance range, protected regex, HSL rules, and replace/merge semantics. It is slightly unstructured, but the length is justified by the complexity of the tool's behaviors.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this tool's complexity (13 parameters; no annotations; no output schema to lean on), the description covers all the essential behavior safely and completely: how to define a region from colors, HSL, or points; how protection works; fixed luminance behavior; how update/merge works; and how to remove colors. Very little is left to an agent's guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92%, so the baseline is 3, but the description adds significant meaning beyond the schema: it explains how sampled colors expand via `absorb`, how HSL rules need `lumRange` for repainting, what `protected` means, and how `replace=true` differs from the default merge. This goes beyond the bare property descriptions to explain how parameters relates to one another.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource: 'Define or update a named region in the canon,' and gives concrete examples (skin, hair, outfit, outline). It is easily distinguished from sibling tools like sprite_repaint or sprite_verify, since it is about defining regions rather than painting or verifying them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool—defining or updating canon regions—and explains which sampling modes to use when (points, explicit colors, HSL rules). It does not explicitly name alternatives or state 'use X instead,' but the workflow interactions with repaint and verify are described, so an agent gets a solid sense of when this tool is relevant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

colors_inspectA

List the colours actually used in files, sorted by frequency, with luminance — the raw material for canon_init/canon_learn decisions. Use it to spot near-duplicate colours, anti-aliasing noise, and which hexes belong to which visual part before defining regions.

NameRequiredDescriptionDefault
topNohow many colours to list (default 40)
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
filesYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the tool lists colors sorted by frequency with luminance, and mentions it handles spritesheet cell dimensions (cellH/cellW) for PNG sheets. However, it doesn't disclose potential performance implications for large files, whether it reads from disk or memory, or any side effects (though it's clearly a read-only inspection tool). The description adds some behavioral context beyond the schema (e.g., the purpose of cellH/cellW), but lacks details on output format or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core function (list colors by frequency with luminance) and immediately followed by the use case. Every sentence earns its place: the first states what it does, the second explains why it matters and what to look for. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 params, no output schema, no annotations), the description is fairly complete. It explains the purpose, the use case, and hints at the spritesheet handling. However, it doesn't specify the output format (e.g., list of hex codes with counts), which could be important for an agent to parse results. Since there's no output schema, the description could have mentioned the return structure. Also, it doesn't clarify whether 'files' accepts glob patterns or specific paths, which might be relevant. Overall, it's good but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% (3 of 4 parameters have descriptions). The description adds meaning by explaining the purpose of the tool's output (raw material for canon decisions) and how cellH/cellW relate to spritesheet handling. It doesn't explicitly describe the 'files' parameter beyond the schema, but the schema already covers it. The description compensates for the missing 'top' parameter description by implying it controls the number of colors listed (default 40), which is not in the schema. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists colors used in files, sorted by frequency with luminance, and explicitly frames it as raw material for canon_init/canon_learn decisions. This distinguishes it from sibling tools like sprite_measure or sprite_verify, which focus on dimensions or verification rather than color analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: to spot near-duplicate colors, anti-aliasing noise, and map hexes to visual parts before defining regions. It implies this is a preliminary analysis step before canon_init/canon_learn, but doesn't explicitly state when NOT to use it or name alternative tools for other color-related tasks. The sibling list includes canon_init and canon_learn, which are the downstream consumers, but no explicit exclusion is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gif_patchA

Operations on animated GIFs. 'palette' swaps colours in every colour table (global AND per-frame local — patching only the global table is a classic half-fix) without touching frame data: zero generation loss, every frame changes in perfect sync — the correct way to re-dress an indexed sprite. The response reports how many table entries each source colour actually matched; 0 means that hex isn't in the file (use colors_inspect to find the exact hexes). 'retime' re-times all frames to msPerFrame. GIF delays are quantised to 10ms steps with a 20ms minimum; pixels survive a decode/re-encode that is exact up to 255 opaque colours (beyond that, nearest-palette snapping). Real bug this fixes: an animation authored at 1.8s being cut off by game code that frees the sprite after 0.62s — retime the GIF instead of dropping frames.

NameRequiredDescriptionDefault
fileYes
actionYes
outFileYes
colorMapNofor 'palette': { fromHex: toHex, ... }
msPerFrameNofor 'retime': delay per frame in ms (quantised to 10ms steps, min 20ms)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers thoroughly. It explicitly states that 'palette' swaps colors in every color table including per-frame local tables, makes zero generation loss, and doesn't touch frame data. It discloses the quantization behavior for 'retime' (10ms steps, 20ms minimum) and the exact pixel preservation limits (255 opaque colors, nearest-palette snapping beyond that). It even explains the failure mode where 0 matches means the hex isn't in the file. This is exemplary transparency for a tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense and front-loaded with the most critical distinction (operations on animated GIFs) in the first sentence, then dives into action-specific details. The structure uses a clear 'palette' / 'retime' split, making it scannable for an agent. It's long, but every sentence earns its place — the real-bug example adds significant context for decision-making. The only minor deduction is that the final example of the 1.8s-vs-0.62s bug is somewhat verbose and could be tightened without losing its instructional value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, no annotations, and no output schema, the description is remarkably complete. It covers what each action does, the limitations (quantization, palette depth), the failure mode of the response (0 matches), and provides a decision rule for when to use the sibling tool. An agent has everything it needs to select between palette and retime, construct the parameters correctly, and interpret the result. The only theoretical gap is the absence of the full return format, but the description's statement that 'the response reports how many table entries each source colour actually matched' is sufficient for an agent to validate the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40% (2 of 5 parameters have descriptions), so the description must compensate — and it does. It explains that 'colorMap' is a mapping of source hex to target hex for the palette action, and that 'msPerFrame' is the delay per frame with quantization behavior. It also clarifies the conditional nature of parameters (colorMap for palette, msPerFrame for retime) and that 'action' is the discriminator. The connection between 'file' and 'outFile' is implied but the description doesn't explicitly say that outFile is the write destination — a small gap that keeps this from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as operating on animated GIFs with two distinct actions ('palette' and 'retime'). It specifies the exact resource ('animated GIFs'), the verbs ('swaps colours', 're-times all frames'), and critically states what it does NOT do ('without touching frame data'), which differentiates it from sibling tools like sprite_repaint. The description uses specific terminology ('global AND per-frame local', 'zero generation loss') that gives the agent a precise mental model of the tool's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use each action: 'palette' for re-dressing indexed sprites, 'retime' for fixing animation timing issues. It names the sibling tool 'colors_inspect' as the alternative for finding exact hexes when a color returns 0 matches. It even includes a concrete real-world scenario ('a real bug this fixes') that helps the agent recognize when retime is the right choice vs. dropping frames. This is well above the minimum viable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sprite_measureA

Measure a sprite's anatomy per frame and its cross-frame jitter: bounding box, top row, widest row, cap (head) width, waist (neck) row, and — with canon regions — the first row of each region (e.g. where the face starts). Use before placing anything relative to a sprite: measured rows beat guessed proportions. Real bug this catches: a hat brim placed at '52% of head height' landed exactly on the eyes, because eye rows vary per frame — measure, don't assume.

NameRequiredDescriptionDefault
fileYesPNG / GIF / spritesheet
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
canonPathNopath to sprite-canon.json (default: search upward from the target file)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It does add useful context: measurements are per-frame, canon regions affect which rows are returned, and row positions can vary across frames. However, it does not explicitly state whether the tool mutates anything, how it handles missing canon files, or what the return format is. 'Measure' implies read-only behavior, but the description leaves some behavioral details implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a bit longer than the minimum, but each sentence earns its place: the first lists what is measured, the second gives the intended timing, and the third grounds the guidance in a concrete failure mode. It is front-loaded and readable, though the bug anecdote could be trimmed without losing core meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a measurement tool with no output schema and no annotations, the description covers the key outputs, the per-frame nature, and the role of canon regions. The input schema handles the parameter semantics. It stops short of describing the exact return structure or edge-case behavior, but it gives an agent enough to invoke the tool correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds conceptual context around canon regions, which relates to canonPath, but it does not give additional parameter-level detail beyond the schema. Per the rubric, baseline 3 is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Measure a sprite's anatomy per frame and its cross-frame jitter.' It enumerates concrete outputs (bounding box, top row, widest row, cap width, waist row, region first rows), which makes the tool's purpose unmistakable. This clearly distinguishes it from siblings like sprite_verify or sprite_repaint, which do not measure anatomy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit use case: 'Use before placing anything relative to a sprite: measured rows beat guessed proportions.' It also provides a concrete bug example showing when this tool prevents errors. It does not name alternative tools or state when not to use it, but the context is strong enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sprite_repaintA

Deterministically recolour a canon region onto a colour ramp (dark→light hex list) — the alternative to regenerating with AI and losing consistency. Shading survives (luminance maps onto the ramp using the region's FIXED recorded range), silhouettes never change, protected regions are never touched, and the same input always gives the same output. Use maskFromFile when repainting an already-recoloured variant: regions are matched on the original (identical pixel layout), paint is applied to the variant. Writes to outFile (never overwrites the input unless outFile equals it).

NameRequiredDescriptionDefault
fileYes
rampYeshex colours dark→light, e.g. ['4a3418','7a5628','a8813c','cfae6b']
rowsNorestrict painting to this row range [from,to]
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
regionYescanon region to repaint
outFileYes
canonPathNopath to sprite-canon.json (default: search upward from the target file)
maskFromFileNomatch the region on this file instead (same pixel layout)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full weight. It discloses determinism, luminance mapping via fixed recorded range, silhouette invariance, protection of regions, and write behavior (never overwrites input unless identical outFile). These are behavioral promises beyond what the schema reveals, giving the agent a reliable mental model.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly long but every sentence contributes: purpose, guarantees, variant guidance, output behavior. It front-loads the core purpose and packs the rest efficiently. No filler, though the length might be trimmed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no output schema, the description covers the essential behavior: determinism, shading preservation, masks, and file output. It does not explain what the resulting file contains (e.g., format, dimensions) but those are likely inferred from input. The clerical params (rows, cell dimensions, canonPath) are not discussed, but they are not core to understanding the tool's function. Overall, an agent can call it correctly based on this text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 78%, so baseline is 3. The description adds meaning for ramp (dark→light hex list), maskFromFile (explains variant matching and paint application), and outFile (overwrite rule). It does not elaborate on rows, cellH/W, or canonPath, but those have schema hints and are auxiliary. Overall it enriches several key parameters beyond schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb–resource pair (“Deterministically recolour a canon region”) and immediately contrasts it with AI regeneration, clearly marking scope and intent. The explicit mention of maskFromFile and outFile behavior also disambiguates it from sibling tools like sprite_verify or sprite_measure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the primary use case (deterministic recolor vs. AI) and gives an explicit directive for a specific parameter: “Use maskFromFile when repainting an already-recoloured variant.” It also explains the region-matching logic and when outFile may overwrite the input. This is concrete, actionable guidance beyond generic 'when to use'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sprite_sheetA

Compose a zoomed contact sheet (PNG on a checkerboard) from sprites — one row per file, one column per frame — and return it as an image so you can LOOK at what you just made. Judge consistency on sheets, not in-game: every visual defect we ever caught was caught on a sheet. Use crop to zoom into the area under suspicion (e.g. just the head).

NameRequiredDescriptionDefault
cropNocrop every cell to this rect before zooming
zoomNopixel zoom (default 4)
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
filesYesfiles or directories; each file becomes a row
outFileYeswhere to write the sheet PNG
maxFramesNomax frames per row (default 8)
returnImageNoalso return the sheet inline as an image (default true; sheets over ~800KB are returned as path only)

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It explains the output (returns an image) and mentions the behavior of returning path only for large sheets in the schema. It doesn't mention potential side effects like file overwriting or error conditions, but the core behavior is adequately described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly verbose with a motivational clause ('every visual defect we ever caught...'), but it's still concise and well-structured. It opens with the verb and object, then details, and ends with a usage tip. The extra sentence adds value without being redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 8 parameters and no output schema, the description provides sufficient context for typical use: it's for visual inspection and consistency checking. It doesn't elaborate on error scenarios or edge cases, but the core purpose and usage are covered. The context signals (sibling tools) further clarify its role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All parameters are described in the schema with clear meanings (e.g., files, outFile, crop, zoom, cellW, cellH, maxFrames, returnImage). The description reinforces key concepts like row-per-file and column-per-frame. The schema coverage is 100%, and the descriptions are precise, leaving little ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: composing a zoomed contact sheet from sprites. It specifies the arrangement (one row per file, one column per frame) and that it returns an image, making its purpose unambiguous and distinct from sibling tools like sprite_measure or sprite_verify.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides usage context: it's for visual inspection and consistency checking ('so you can LOOK at what you just made', 'Judge consistency on sheets'). It also hints at using crop for zooming. However, it doesn't explicitly contrast with alternative tools or state when not to use it, though the context is fairly clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sprite_verifyA

Run numeric consistency checks and get hard pass/fail numbers — the replacement for eyeballing hundreds of frames. Checks: 'palette' (every pixel on the canon palette), 'jitter' (landmarks stay put across frames), 'spread' (a region's mean luminance agrees across a file group — catches 'bright from behind, dark from the front'), 'protected' (vs baseFile: face/outline pixels untouched), 'leftover' (vs baseFile: no source-region pixel survived inside a repainted area), 'scale' (relative sizes match the canon table). Files may be directories (all PNG/GIF inside).

NameRequiredDescriptionDefault
cellHNospritesheet cell height (PNG sheets only)
cellWNospritesheet cell width (PNG sheets only)
filesYesfiles or directories to verify
checksNowhich checks to run (default: palette + jitter)
regionNoregion name for 'spread'/'leftover'
baseFilesNooriginals for 'protected'/'leftover'. Paired to files by identical filename (case-insensitive) when names line up, otherwise by list position (equal lengths required). Each result echoes which base it was compared against.
canonPathNopath to sprite-canon.json (default: search upward from the target file)
scaleNamesNofor 'scale': map of filename -> name in canon.scale.heights

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does substantial work: it discloses that the tool returns pass/fail numbers, explains what each check verifies, and notes that directories are accepted (all PNG/GIF inside). It does not explicitly state that it is non-destructive or describe error behavior, but 'verify' plus the pass/fail framing makes the core behavior clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: the purpose is front-loaded, the check list is compactly structured, and the directory-handling note is directly actionable. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity — 8 parameters, 6 checks, no output schema, and no annotations — the description covers the essential behavioral surface: what checks exist, what they catch, and how file inputs behave. It falls slightly short on specifying the exact return structure beyond 'pass/fail numbers' and on edge-case behavior, but it is strong enough for an agent to select and invoke the tool correctly in most cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema by explaining the check enum values in detail (e.g., 'spread' catches 'bright from behind, dark from the front') and by clarifying that 'files' may be directories containing PNG/GIF. This elevates it above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Run numeric consistency checks and get hard pass/fail numbers.' It then enumerates the exact checks (palette, jitter, spread, protected, leftover, scale) with one-line semantics, making the tool's scope unmistakable and clearly distinct from siblings like sprite_measure or sprite_repaint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool — 'the replacement for eyeballing hundreds of frames' — and clarifies that it is for numeric consistency verification. However, it does not explicitly contrast with sibling tools or state when NOT to use it, leaving the agent to infer the boundary against sprite_measure or colors_inspect.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.0
    • First observedcanon_info
    • First observedcanon_init
    • First observedcanon_learn
    • First observedcolors_inspect
    • First observedgif_patch
    • First observedsprite_measure
    • First observedsprite_repaint
    • First observedsprite_sheet
    • First observedsprite_verify

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation4/5

Each tool has a clearly different job: inspecting colors, defining canon, measuring sprites, verifying, repainting, compositing sheets, and patching GIFs. The only mild overlap is between sprite_repaint and gif_patch palette swapping, but their contexts (canon region remapping vs. indexed GIF color tables) are distinct enough to avoid real confusion.

Naming Consistency4/5

Names follow a clear snake_case pattern of a domain prefix (colors, canon, sprite, gif) plus an action or noun. Minor grammatical inconsistency exists (colors_inspect, canon_info, sprite_sheet are noun-heavy while canon_learn and sprite_repaint are verb-focused), but the overall convention is predictable and readable.

Tool Count5/5

Nine tools is a well-scoped set for a sprite canon workflow: each tool covers a distinct step from inspection and canon creation to measurement, verification, repainting, contact sheets, and GIF operations. Nothing feels redundant or missing at the count level.

Completeness4/5

The suite covers the full workflow: inspect, initialize canon, define regions, measure, verify, repaint, and generate contact sheets. Minor gaps exist, such as no explicit tool for deleting or renaming a region, and global canon settings like scale/thresholds can only be managed through init or by editing the file directly.

Maintenance

ActivityStale
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI coding agents to create, draw, and refine Aseprite documents through deterministic canvas, layer, frame, tag, and palette tools, with pixel analyzers, style validation, and preview/diff visual feedback. It also supports spritesheet and animated GIF export, producing multi-layer game-ready assets.
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables agents to author, validate, inspect, patch, and render editable JSON pixel-art and animation recipes through local tools, producing PNG contact sheets, APNGs, sprite atlases, and related export bundles.
    2
    8
    684 npm
    41
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to create layered pixel-art sprites and animations, inspect pixels, and export images, spritesheets, GIFs, APNGs, and TrueType pixel fonts. Documents and edits stay local, accessible over stdio MCP or callable directly from a shell.
    26
    MIT