PixelForge MCP
Exports indexed PNG sprites and .gpl palette files for direct import and editing in Aseprite, supporting palette lock and indexed output.
Exports palettes in .gpl format for direct import into GIMP for further editing.
Exports palettes in .hex format compatible with Lospec for sharing and importing into pixel art tools.
Provides cutout skeletal rigging and animation assembly compatible with Spine/DragonBones/Godot cutout workflows, including rig kit export and pose synthesis.
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., "@PixelForge MCP pixelize this character art to 32px with the studio palette"
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.
PixelForge MCP
AI 생성 일러스트를 인게임 도트 스프라이트로 변환하는 파이프라인을 MCP(Model Context Protocol) 서버로 노출한 도구입니다. Claude·Cursor 같은 AI 에이전트가 Tool-use 로 직접 호출해, 배경제거 → 픽셀화 → 팔레트 통일 → 아웃라인 → 스프라이트시트 패킹을 자동화합니다.
여러 게임/앱 프로젝트에서 손으로 반복하던 "AI 일러 → 도트 스프라이트" 작업을 재사용 가능한 MCP 툴로 코드화한 것입니다. 아트 파이프라인 자동화 = TA(테크니컬 아트) 업무의 핵심 반복작업입니다.
![]()
왼쪽부터: 입력 일러스트(1024px) · 32px 스프라이트 · 64px 스프라이트+selout 아웃라인 · 2프레임 스프라이트시트. 전부 동일 배율 nearest 업스케일. uv run python examples/demo.py 로 재생성.
스튜디오 워크플로우: 캐릭터셋을 잠긴 공통 팔레트로 통일
![]()
위 = 캐릭터별 독립 팔레트(제각각) · 아래 = 잠긴 20색 공통 팔레트로 통일(인덱스 PNG 출력) · 맨 아래 = Aseprite 로 임포트되는 실제 .gpl 팔레트. build_palette 로 키아트에서 프로젝트 팔레트를 뽑아 batch_pixelize 에 넘기면 모든 에셋이 정확히 같은 색을 공유한다. 아트 코히어런스 = TA 자동화의 실제 가치. uv run python examples/palette_workflow.py 로 재생성.
애니메이션 — 컷아웃 스켈레탈 리깅 (진짜 프레임 애니)
*캐릭터를 파트(몸통·머리·상완·하완·허벅지·정강이)로 나눠 부모-자식 관절 트리(FK)에 붙이고, 관절 회전을 키프레임으로 돌려 프레임마다 서로 다른 포즈를 합성한다 — Spine/DragonBones/Godot Cutout 방식. 2관절 팔다리라 무릎·팔꿈치가 굽는 진짜 gait(걷기·달리기·펀치). 한 장을 흔드는 워프가 아님. 결정적·오프라인. uv run python examples/rig_demo.py 로 재생성.*
리그 킷(계약서) — 리깅용 아트를 규격에 맞게 뽑기. 사후에 완성 스프라이트를 자르는 건 항상 타협이라, 처음부터 리깅용으로 그리는 게 정답. export_rig_kit 은 배치 가이드 + 파츠별 생성 프롬프트 + rig.json 을 뱉는다. 아티스트/AI 가 이 규격(슬롯·크기·피벗)에 맞춰 아트만 그리거나 생성해 PNG 를 교체하면 animate_rig 이 walk/run/idle/punch 를 자동 렌더한다.
배치 가이드: 각 파츠 슬롯의 위치·크기 + 피벗(빨간 점). 이 규격대로 그리면 리그가 자동으로 물린다.
프레임 조립 — 포즈 프레임이 이미 있으면(아티스트·AI 생성) assemble_animation 이 N 프레임을 공통 스케일·단일 팔레트로 맞춰(깜빡임 방지) 스프라이트시트+타이밍JSON+GIF 로 조립한다. pixelize=False 면 이미 도트인 프레임을 색 보존해 팩만.
절차적 juice(보조) — animate 는 정적 스프라이트 한 장에 결정적 변형(bob/breathe/sway/hop/pulse)을 얹어 가벼운 idle 움직임을 만든다. 진짜 캐릭터 애니가 아니라 살아있는 느낌용 보조 툴.
왜 MCP 인가
같은 PIL 스크립트를 매번 복붙하는 대신 MCP 서버로 만들면, AI 에이전트가 대화 중에 직접 "이 일러스트 64px 도트로 만들고, 프로젝트 팔레트로 통일해서 8프레임 시트로 묶어줘" 같은 요청을 툴 호출로 수행합니다. 에이전트 워크플로우 안에서 아트 파이프라인이 한 단계로 흡수됩니다.
Related MCP server: Retro Diffusion MCP Server
품질이 어디서 나오나 (naive resize 와의 차이)
픽셀화의 품질은 다운스케일을 어떻게 하느냐에서 갈립니다. img.resize() 한 줄로는 색이 탁해지고 가장자리에 검은 띠가 낍니다. PixelForge 는:
감마보정 선형광 다운스케일 — sRGB 를 선형광으로 디코드한 뒤 리샘플. sRGB 값을 그대로 평균하면 색이 어두워지고 머디해지는 문제를 제거.
프리멀티플라이 알파 리샘플 — 투명 영역이 피사체 가장자리 색을 오염시키지 않게, 알파를 곱한 뒤 리샘플하고 나눠서 복원.
OKLab k-means 팔레트 — MEDIANCUT/FASTOCTREE 보다 지각적으로 정확한 팔레트. 색 램프(shadow→mid→highlight)가 뚜렷해져 '축소한 일러'가 아니라 '도트 스프라이트'로 읽힌다. (테스트로 median-cut 대비 OKLab 오차가 낮음을 검증)
실루엣 정리 — 리샘플이 남기는 튀는 픽셀·가시·1px 구멍을 despeckle/hole-fill 로 제거. 깨끗한 실루엣이 픽셀아트의 핵심.
하드 알파 + selout 아웃라인 — 반투명 가장자리는 칼같이. selout(선택적 아웃라인)은 각 테두리 픽셀을 맞닿은 실루엣 색을 어둡게(OKLab 명도만 낮춤) 칠해, 균일 검정보다 훨씬 프로다운 결과를 낸다.
Bayer 정렬 디더(옵션) — 필요 시 밴딩을 규칙적 패턴으로 완화. FS 오차확산 같은 컨페티가 아니라 의도된 디더. 스프라이트 스케일에선 보통 off.
OKLab 팔레트 스냅 — 큐레이션/추출 팔레트로 여러 에셋을 통일(코히어런스). OKLab 거리라 색상 드리프트 없음.
스튜디오 연동
실제 도트 스튜디오 파이프라인(Aseprite·게임 엔진)에 그대로 들어가도록:
인덱스 컬러 PNG 출력(
indexed=True) — 픽셀아트 표준 형식. Aseprite 에서 바로 열어 편집·팔레트 스왑 가능, 용량 작음, 인덱스 0 = 투명.팔레트 파일 export —
.gpl(GIMP/Aseprite)·.hex(lospec)·스와치 PNG.잠긴 공통 팔레트(
build_palette→palette=인자) — 캐릭터 키아트에서 프로젝트 팔레트를 뽑아 전체 에셋셋에 강제. 수백 개 에셋의 색 일관성을 자동 유지.스프라이트시트 + JSON 메타데이터 — 프레임 좌표를 엔진 임포트용으로 함께 출력.
제공 툴 (18종)
툴 | 하는 일 |
| 일러 → 고품질 도트 스프라이트 (감마보정 다운스케일 + OKLab k-means + 실루엣 정리 + selout 아웃라인, 옵션: 팔레트 잠금·인덱스 PNG·업스케일) |
| 컷아웃 스켈레탈 리그로 진짜 프레임 애니 (걷기/공격 등 실제 팔다리 움직임) → 프레임+시트+타이밍JSON+GIF |
| 빌트인 2족 리그(파트+스켈레톤+walk/idle/wave)를 저장 (저작 시작 템플릿) |
| 리깅용 아트 제작 킷 — 배치 가이드 + 파츠 생성 프롬프트 + rig.json (규격에 맞춰 아트만 뽑으면 리그 자동) |
| 여러 포즈 프레임 → 공유 팔레트·공통 스케일로 애니 조립 (시트+GIF) |
| 정적 스프라이트에 절차적 juice (bob/breathe/sway/hop/pulse) — idle 보조용 |
| 절차적 juice 모션 목록/설명 |
| 2프레임 애니를 공통 스케일·공유 팔레트로 함께 도트화 (깜빡임 방지) |
| 네 모서리 flood fill 로 단색/오프화이트 배경 투명화 (배경제거 모델 폴백) |
| 투명 여백을 잘라 피사체만 남김 |
| 여러 프레임을 균일 격자 시트로 패킹 + 프레임 좌표 JSON(엔진 임포트용) |
| 여러 키아트에서 잠긴 공통 팔레트 생성 → |
| 단일 이미지 팔레트를 |
| 해상도 유지한 채 색 수만 축소 |
| 이미지에서 대표 팔레트(헥스) 추출 + 스와치 PNG |
| 큐레이션 팔레트로 스냅 (아트 코히어런스) |
| 내장 팔레트 목록 (pico8 / sweetie16 / db16 / edg32) |
| 폴더 전체를 동일/잠긴 팔레트로 일괄 픽셀화 (인덱스 PNG 지원) |
설치 & 실행
uv sync # 의존성 설치 (mcp, pillow, numpy)
uv run --extra dev pytest -q # 테스트 38종
uv run pixelforge-mcp # MCP 서버 실행 (stdio)Claude Desktop / Claude Code 에 등록
{
"mcpServers": {
"pixelforge": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/pixelforge-mcp", "run", "pixelforge-mcp"]
}
}
}등록 후:
~/art/dragon.png배경 제거하고 56px 도트로 만들어줘. 아웃라인 넣고, idle 프레임dragon_b.png도 같이 페어로 도트화해서 스프라이트시트 + 메타데이터로 묶어줘.
에이전트가 remove_background → pixelize_pair → build_spritesheet 를 순서대로 호출합니다.
설계
color.py— 색 공간/리샘플링 코어 (감마, 프리멀티플라이 리샘플, OKLab, k-means 양자화, 실루엣 정리, selout 아웃라인, 팔레트 추출/스냅). 품질의 핵심.palettes.py— 큐레이션 레트로 팔레트 (PICO-8 / Sweetie16 / DB16 / EDG32).export.py— 인덱스 PNG /.gpl/.hex/ 스와치 export, 팔레트 스펙 해석.rig.py— 컷아웃 스켈레탈 애니 엔진(FK 관절 트리 + 키프레임 + 파트 회전 합성) + 빌트인 템플릿(2관절 휴머노이드/단순 2족) + 배치 가이드·프롬프트 생성.animate.py— 절차적 juice 리그(bob/breathe/sway/wave/hop/pulse) + 루프 GIF 렌더.pipeline.py— 위를 조합한 순수 함수 (MCP 비의존, 단위 테스트 대상).server.py— FastMCP 로 파이프라인을 툴로 노출하는 얇은 래퍼.
코어/파이프라인/서버 분리 덕분에 MCP 런타임 없이 직접 실행·테스트할 수 있고, CLI·CI 에서도 재사용됩니다. 테스트 38종(색 왕복, k-means vs median-cut 오차, 실루엣 정리, 인덱스 PNG 왕복, 잠긴 팔레트 배치 일관성, 애니 프레임/GIF/타이밍, 컷아웃 2관절 워크/런 등)으로 커버.
라이선스
MIT. 내장 팔레트는 각 커뮤니티 표준(퍼블릭/CC0).
Available Tools
18 toolsanimateA
정적 이미지 한 장에서 절차적 루프 애니를 자동 생성(추가 아트 불필요).
개별 프레임 PNG + 스프라이트시트 + 타이밍 JSON + 루프 GIF 미리보기를 출력.
Args: src: 입력 이미지(일러 또는 이미 픽셀화된 스프라이트). out_dir: 출력 폴더(자동 생성). motion: breathe/bob/float/sway/wave/hop/pulse (list_motions 로 확인). frames: 프레임 수. amplitude: 모션 강도(px 단위 기준). fps: GIF/애니 프레임레이트. target_height: (pixelize_first 시) 도트 높이. colors: (pixelize_first 시) 팔레트 색 수. outline: selout 아웃라인 여부. pixelize_first: True 면 원본을 먼저 도트화 후 리깅(1024px 일러 → 애니 한 번에). palette: 잠긴 팔레트(builtin 또는 .gpl/.hex 경로). indexed: 프레임을 인덱스 PNG 로 저장. gif: 루프 GIF 미리보기 생성 여부. gif_upscale: GIF nearest 업스케일 배율.
Inputs: src (required), out_dir (required), fps, gif, +10 more.
animate_rigA
컷아웃 스켈레탈 리그로 진짜 프레임별 포즈 애니를 렌더(걷기/공격 등 실제 팔다리 움직임).
파트(몸통·팔·다리)를 뼈에 붙여 관절 회전을 키프레임으로 돌린 프레임들을 합성 → 개별 PNG + 스프라이트시트 + 타이밍 JSON + 루프 GIF. 절차적 워프가 아닌 진짜 애니.
Args: rig: rig.json 경로, 또는 빌트인 "humanoid"(2관절 walk/run/idle/punch) / "biped"(walk/idle/wave). out_dir: 출력 폴더. clip: 클립 이름. frames: 렌더할 프레임 수. fps: 프레임레이트(0이면 클립 기본값). palette: 잠긴 팔레트(builtin 또는 .gpl/.hex 경로). indexed: 인덱스 PNG 저장 여부. gif: 루프 GIF 생성 여부. gif_upscale: GIF 업스케일 배율.
Inputs: rig (required), out_dir (required), fps, gif, +5 more.
assemble_animationA
여러 포즈 프레임(아티스트/AI 생성)을 공유 팔레트로 애니로 조립.
N 프레임을 공통 정렬·단일 팔레트로 맞춰(깜빡임 방지) 스프라이트시트 + 타이밍 JSON + 루프 GIF 로 출력.
Args: frame_sources: 포즈 프레임 이미지 경로 리스트(순서 = 재생 순서). out_dir: 출력 폴더. fps: 프레임레이트. target_height: (pixelize 시) 도트 높이. colors: (pixelize 시) 공유 팔레트 색 수. outline: (pixelize 시) selout 아웃라인 여부. indexed: 인덱스 PNG 저장 여부. gif: 루프 GIF 생성 여부. gif_upscale: GIF 업스케일 배율. pixelize: True=일러 프레임 픽셀화 조립 / False=이미 도트인 프레임을 원해상도로 정렬·팩만. palette: 잠긴 팔레트(builtin 또는 .gpl/.hex). 지정 시 그 팔레트로 통일.
Inputs: out_dir (required), frame_sources (required), fps, gif, +7 more.
autocropB
투명 여백을 잘라 피사체만 남긴다.
Args: src: 입력 이미지 경로(PNG 권장). dst: 출력 경로. padding: 잘라낸 뒤 사방에 남길 여백 픽셀.
Inputs: dst (required), src (required), padding.
batch_pixelizeA
폴더 전체를 동일 설정으로 픽셀화(아트 일관성 일괄 적용).
palette 에 잠긴 팔레트(.gpl/.hex/builtin)를 주면 캐릭터셋 전체가 정확히 같은 색을 공유한다 — 스튜디오 에셋 일관성의 정석.
Args: src_dir: 입력 폴더. dst_dir: 출력 폴더(자동 생성). pattern: 파일 글롭 패턴. target_height: 도트 높이(px). colors: 팔레트 색 수(palette 미지정 시). outline: 아웃라인 추가 여부. palette: 잠긴 공통 팔레트(builtin 이름 또는 .gpl/.hex 경로). indexed: 인덱스 컬러 PNG 로 저장.
Inputs: dst_dir (required), src_dir (required), colors, indexed, +4 more.
build_paletteA
여러 레퍼런스에서 잠긴 공통 팔레트를 만들어 .gpl/.hex 로 저장(OKLab k-means).
캐릭터 키아트 몇 장 → 프로젝트 팔레트 파일. 그 파일을 pixelize/batch_pixelize 의 palette 인자로 넘겨 모든 에셋을 같은 색으로 통일한다.
Args: sources: 레퍼런스 이미지 경로 리스트. out: 팔레트 저장 경로(.gpl 또는 .hex). colors: 팔레트 색 수. swatch: 지정 시 팔레트 스와치 PNG 저장 경로.
Inputs: out (required), sources (required), colors, swatch.
build_spritesheetA
여러 프레임을 균일 격자 스프라이트시트로 패킹 + JSON 메타데이터(엔진 임포트용).
Args: frames: 프레임 이미지 경로 리스트(순서 = 시트 순서). dst: 출력 스프라이트시트 경로. columns: 열 수(0이면 한 줄로 가로 배치). cell_padding: 각 셀 안쪽 여백 픽셀. write_metadata: 프레임 좌표 JSON 동시 저장 여부.
Inputs: dst (required), frames (required), columns, cell_padding, +1 more.
create_demo_rigA
빌트인 2족 캐릭터 리그(파트 PNG + 스켈레톤 + walk/idle/wave 클립)를 디스크에 저장.
사용자 리그 저작의 시작 템플릿이자 컷아웃 애니 데모. 외부 에셋 불필요. 저장된 rig.json 을 편집(파트 교체·스켈레톤·클립 키프레임)해 커스텀 캐릭터를 만들 수 있다.
Args: out_dir: 리그를 저장할 폴더.
Inputs: out_dir (required).
export_paletteA
단일 이미지에서 팔레트를 추출해 .gpl/.hex 로 저장(Aseprite 임포트용).
Args: src: 입력 이미지 경로. out: 팔레트 저장 경로(.gpl 또는 .hex). colors: 팔레트 색 수.
Inputs: out (required), src (required), colors.
export_rig_kitA
리깅용 스프라이트 제작 킷(계약서)을 저장 — 아트를 규격에 맞춰 뽑기 위한 것.
rig.json + 파츠 PNG + 배치 가이드(layout_guide.png) + 파츠별 생성 프롬프트 (prompts.md) + README 를 출력. 아티스트/AI 가 이 규격(파츠 슬롯·크기·피벗)에 맞춰 아트만 그리거나 생성해 PNG 를 교체하면 animate_rig 이 walk/run/idle/attack 을 자동 렌더한다. "리깅에 맞게 처음부터 스프라이트를 뽑는" 워크플로우의 핵심.
Args: out_dir: 킷을 저장할 폴더. character: 프롬프트에 넣을 캐릭터 묘사(예: "red-haired sniper in dark coat"). kind: 리그 종류 — "humanoid"(옆모습 2관절) 또는 "biped"(단순 2족).
Inputs: out_dir (required), kind, character.
extract_paletteA
이미지에서 대표 팔레트(헥스 리스트)를 추출 + 옵션 스와치 PNG 저장.
추출한 팔레트를 snap_to_palette 의 기준으로 삼아 여러 에셋을 통일할 수 있다.
Args: src: 입력 이미지 경로. colors: 추출할 색 수. swatch: 지정 시 팔레트 스와치 PNG 저장 경로.
Inputs: src (required), colors, swatch.
list_motionsA
절차적 애니 모션 목록과 설명.
Inputs: no named parameters.
list_palettesA
내장 큐레이션 팔레트 목록과 각 색 수를 반환.
Inputs: no named parameters.
pixelizeA
일러스트를 고품질 도트 스프라이트로 변환.
감마보정 선형광 다운스케일 + 프리멀티플라이 알파 + 실루엣 정리 + OKLab k-means 양자화(또는 고정 팔레트 스냅) + selout 아웃라인. 인덱스 PNG 출력 지원.
Args: src: 입력 이미지 경로. dst: 출력 경로. target_height: 도트 스프라이트 높이(px). 폭은 비율 유지. colors: 팔레트 색 수(palette 미지정 시 k-means 색 수). dither: Bayer 정렬 디더 여부(도트룩은 보통 False). outline: 아웃라인 추가 여부. outline_width: 아웃라인 두께(px). outline_style: "selout"(가장자리색 어둡게, 권장) 또는 "solid"(단색). clean: 실루엣 정리(despeckle/hole-fill) 여부. palette: None=이미지별 k-means / builtin 이름(pico8/sweetie16/db16/edg32) / .gpl·.hex 파일 경로(잠긴 공통 팔레트). indexed: 인덱스 컬러 PNG 로 저장(Aseprite/엔진 표준). 지정 시 upscale 무시. upscale: 저장 전 nearest 정수배 업스케일(표시용, 1=원본 도트 해상도).
Inputs: dst (required), src (required), clean, colors, +8 more.
pixelize_pairB
2프레임 애니를 공통 스케일·공유 OKLab k-means 팔레트로 도트화(깜빡임 방지).
Args: frame0: 첫 프레임 경로. frame1: 둘째 프레임 경로(같은 캐릭터, 다른 포즈). dst0: 첫 프레임 출력 경로. dst1: 둘째 프레임 출력 경로. target_height: 도트 높이(px). colors: 공유 팔레트 색 수. outline: 아웃라인 추가 여부. outline_style: "selout" 또는 "solid". indexed: 인덱스 컬러 PNG 로 저장.
Inputs: dst0 (required), dst1 (required), frame0 (required), frame1 (required), +5 more.
quantize_paletteA
해상도 유지한 채 색 수만 줄인다(팔레트 통일/용량 절감).
Args: src: 입력 이미지 경로. dst: 출력 경로. colors: 목표 색 수. dither: 디더링 여부.
Inputs: dst (required), src (required), colors, dither.
remove_backgroundA
네 모서리 flood fill 로 단색/오프화이트 배경을 투명화(배경제거 모델 폴백).
Args: src: 입력 이미지 경로. dst: 출력 경로(RGBA PNG). tolerance: 배경으로 간주할 색 차이 임계값(0-255). feather: 경계 한 줄의 알파 감쇠(0=칼같이, 1=완전투명).
Inputs: dst (required), src (required), feather, tolerance.
snap_to_paletteB
이미지를 큐레이션 팔레트로 스냅(OKLab 지각 거리, 아트 코히어런스).
Args: src: 입력 이미지 경로. dst: 출력 경로. palette: 팔레트 이름(pico8/sweetie16/db16/edg32). list_palettes 로 확인. dither: Floyd-Steinberg 디더링으로 그라데이션 띠/노이즈 완화.
Inputs: dst (required), src (required), palette (required), dither.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 18 tools
Most tools have distinct purposes, but export_palette and extract_palette are very similar in functionality (both extract palette from a single image), which could cause confusion. The other tools are clearly differentiated by description and naming.
All tool names use underscore_case and follow a verb-based pattern (e.g., pixelize, build_palette, list_motions). The naming is uniform and predictable, with no problematic mixing of styles.
With 18 tools for pixel art creation and animation, the count is slightly above the ideal range but still reasonable. The tools cover the main workflow without being overwhelming.
The tool set covers the full pixel art pipeline: image preparation, pixelization, palette management, animation (procedural and rig-based), spritesheet packing, and batch processing. No obvious gaps for the intended domain.
Maintenance
Related MCP Connectors
Game-ready pixel art: generate sprites, animate them, pixelate images, remove backgrounds.
Generate, edit, style-match, turn, and animate game-ready pixel art at exact sizes.
Generate authentic pixel art - sprites, animations, and tilesets - from any MCP client
Turn images into pixel art, extract and remap palettes, and upscale sprites without blur.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server that forges pixel art sprites & game assets using Google Gemini — generate, crop, split & process, all from your AI assistant.68323 npm6MIT
- AlicenseNot gradedqualityCmaintenanceGenerate real pixel art — sprites, animations, and tilesets — from any MCP-capable AI assistant. Grid-aligned pixels, controlled palettes, transparent backgrounds, with cost estimation always free.7MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that lets AI agents create, edit, and animate pixel-art sprites, with PNG previews after every step and support for export to GIF/APNG/spritesheets.48,326 npmMIT
- AlicenseBqualityCmaintenanceAn MCP server that turns images generated in a logged-in ChatGPT web session into consistent, game-ready assets: it composes style-bible prompts, ingests browser downloads, removes backgrounds, pixelates to a true grid, outlines, slices grid sheets into cells, and packs uniform sprite sheets with JSON atlases and GIF previews. Everything runs locally in pure JavaScript with no API key or native dependencies.121MIT