The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Mc Asset — Minecraft Pixel Asset Engine listing page.

A pixel-native 2D asset engine and deterministic CLI/MCP toolchain for Minecraft Java Edition resource packs, built for human creators and AI coding agents.
Language models can't place pixels by eye, so mc-asset turns texture work into text and commands. Draw a sprite as a character grid, pixelize reference art, generate tiling textures, pack animation sheets, and validate a whole resource pack, from a shell or over MCP. The same input and seed always produce the same bytes.

Six 16×16 items, each written as a text grid and rendered by mc-asset render (shown ×6), drawn to the vanilla style rules in the minecraft-pixel-art skill. The grids are in docs/assets/showcase/items/.
--operations).grid) or editable multi-layer sources (.mcpx) that build to PNG. See docs/mcpx-format.md..mcpx output is identical run to run and between Bun and Node.--json returns one { success, result, error } envelope with a stable error code, and logs never mix into data on stdout.--force, and each file lands through a temp file and an atomic rename.Every image below is produced by mc-asset itself, with fixed seeds for the procedural sources, so the whole set is reproducible. The commands live in docs/assets/showcase/README.md.
| Pixelize | Quantize |
|---|---|
→ ![]() | |
| A detailed reference image (128px, shown ×2) reduced to 16px (shown ×16): the grain coarsens and shapes snap to a tidy pixel grid. | A 64-color gradient reduced to 8 colors (both ×4): the color count drops and the result settles into clear steps. |
Material variants — the sword from the top of this page fanned out into all seven built-in materials (copper, crystal, gold, iron, oxidized_copper, stone, wood, shown ×5). Its palette gives each color a role, so the blade and guard take the new ramp while the darkest outline, the white glint, the wooden grip, and the guard's gem keep their colors:

Procedural patterns — every generate pattern as a 16px swatch from a fixed seed (shown ×4):
noise | clustered-noise | stripes | checker | gradient |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
brick | spots | veins | cracks | grain |
![]() | ![]() | ![]() | ![]() | ![]() |
Seamless tiling — a 16px brick block face (left, ×8) and a 4×4 wall of it (right, ×4); the mortar lines continue across every edge:

Animation sheet — four frames of a glowing ore block packed into one vertical strip (×4), the layout Minecraft reads with an .mcmeta animation:

Run the server straight from the registry — no local install needed:
Install the CLI globally to get the mc-asset command on your PATH:
Prerequisites: tested with Node.js 22 and Bun 1.3. bun run build needs Bun and ./bin/mc-asset.js needs Node.js; with Bun alone, run bun ./bin/mc-asset.js.
llms.txt — a compact index of the repository for agents.llms-full.txt — the same material as a single file: install, the twenty-one MCP tools, batch operations, the error model, and the limits.docs/cli-surface.md — the frozen CLI commands, the batch operations specification, and the exit-code registry.docs/mcpx-format.md — the editable multi-layer .mcpx and .grid grammar and specification.docs/mcp-guide.md — registration, one verbatim capture per MCP tool, and the error model.docs/mcp-surface.md — the frozen MCP surface: tool names, inputs, and the read/write contract.AGENTS.md — the rules for changing this repository.The repository ships two Agent Skills in skills/, installable with the skills CLI:
mc-asset — the draw → render → preview → measure → validate loop with this tool, the CLI/MCP command map, and how palette roles drive recoloring.minecraft-pixel-art — the vanilla style rules for items, blocks, GUI sprites, and animations: palettes and hue-shifted ramps, material outlines, top-left light, tiling, and an anti-pattern review checklist.Add --skill mc-asset or --skill minecraft-pixel-art to install only one.
Draw a 16×16 gem as a character grid, one character per pixel:
Render the grid into a PNG texture and save the editable .mcpx source:
The rendered gem.png, shown ×8:

Check its colors and alpha:
Validate it as a Minecraft item texture:
pixelize)Turn a high-resolution reference image into a 16×16 item texture. The same image and preset always give the same pixels:
--preset item sets a 16-color budget and turns on the crop, background, subject, edge, and cluster stages.block, gui, particle, and generic.generate & tile)Generate a stone texture from a fixed seed, then check whether it tiles:
quantize & cleanup)Cut a sprite down to 8 colors, then remove the stray pixels left behind:
These fix classes can change alpha, and with it the render pass the texture needs, so cleanup refuses them without --allow-render-pass-change.
variant & recolor)Fan one source out into several material tiers, or recolor it to a single material:
animate)Pack a folder of frames into a vertical sheet, then check it against its .mcmeta:
validate-pack)Scan a whole resource pack for missing textures, bad namespaces, orphaned textures, broken model references, and reference cycles. --minecraft-version picks the pack format to check against:
build & apply_asset_operations)Edit the Quickstart gem in one batch: a 4×4 gold square framed by a 6×6 black outline. The CLI applies the batch and writes a PNG:
Before and after the batch (both ×8):
→ 
Over MCP, apply_asset_operations runs the same batch and can send back a picture of what changed:
With feedback, the result keeps its usual fields and adds a PNG image block cropped to the changed area and upscaled by scale (1–16), plus a diff summary (raw, composited, structural, outsideSelectionUnchanged). An edit with no visible change returns noVisibleChange instead of an image. The agent sees its edit without pulling the whole canvas. The output path differs from the CLI run because MCP tools never overwrite an existing file.
gui-scale)Resize a GUI frame without smearing its border. With nine_slice, the corners copy 1:1 and the edges and center tile (or stretch, with stretch_inner: true). The 16×16 dialog.png declares a 4px border in dialog.png.mcmeta:
gui-scale never picks up a sibling .mcmeta on its own; without --mcmeta it stretches the whole sprite.
| Source, 16×16 | nine_slice, 48×32 | No --mcmeta (stretch), 48×32 |
|---|---|---|
![]() | ![]() | ![]() |
All three are shown ×4. With the mcmeta the cut corners and the 2px bevels copy 1:1 and keep their width; the plain stretch thickens the bevels unevenly and smears the corners.
mc-asset mcp starts a stdio MCP server on the same core as the CLI, so a tool call and the matching command return the same result. It exposes 21 tools.
| Tool | Capability |
|---|---|
analyze_asset | Read-only inspection: dimensions, palette distribution, alpha classification, pixel-art heuristics. |
pixelize_asset | Converts raster inputs (PNG, JPEG, WebP) into pixel art; returns PNG bytes or .mcpx source. |
render_pixel_asset | Compiles inline ASCII grid strings or .grid files with optional batch operations. |
apply_asset_operations | Applies atomic batch pixel/layer/region mutations to .mcpx text. |
recolor_asset | Remaps texture palettes to built-in material ramps (iron, gold, stone, etc.). |
create_variants | Fans out a source asset into per-material variants in an output directory. |
validate_asset | Checks single texture and .mcmeta conformance against Minecraft requirements. |
import_asset | Decodes raster inputs (PNG, JPEG, WebP) into the pixel canvas with an optional batch. |
build_asset | Builds .mcpx sources into PNG bytes or re-serialized source with an optional batch. |
transform_asset | Applies one geometry operation (flip, rotate, crop, pad, resize, translate) to a raster or .mcpx input. |
scale_gui_asset | Scales a GUI sprite with the mcmeta stretch/tile/nine_slice mapping; PNG only. |
quantize_asset | Reduces distinct colors to a target count. |
cleanup_asset | Detects or fixes pixel defects (isolated, noise, cluster, fringe, outlier, hole, aa). |
palette_asset | Read-only palette extract / inspect reports (unique colors, distribution, roles, contrast). |
material_asset | Read-only list / show reports over the built-in material set. |
tile_asset | Seam, edge-repetition, and brightness analysis with an optional tiled preview PNG. |
generate_asset | Deterministic procedural texture generation (pattern, size, palette, seed). |
preview_asset | ascii / palette-map reports, scale and nine-slice guide PNGs. |
animate_asset | Animation pack / unpack / reorder / resize / validate / preview over frame sets. |
validate_pack_asset | Read-only whole-pack scan: namespaces, models, textures, atlases, version targeting. |
inspect_asset | Read-only structure (layers, regions, color usage, overlaps) or view (composited PNG image block plus metadata); takes inputPath. |
inspect_asset has two modes: structure reports layers, regions, color usage, and overlaps; view returns the composited canvas as a PNG image block, with optional crop and scale (1–16). A view wider than 1024px is refused with a crop hint instead of being downscaled. apply_asset_operations takes an optional feedback object (Recipe 7); without it the result is unchanged. docs/mcp-guide.md has one captured call per tool.
Every client runs the same stdio command, npx -y mc-asset mcp. Config file locations change between client versions, so check the client's own docs if one below has moved.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
Add to .cursor/mcp.json:
Add to opencode.json or opencode.jsonc:
| Category | Command | Description |
|---|---|---|
| Intake & Build | import <image> | Decodes PNG, JPEG, or WebP to PNG and/or .mcpx. |
render <grid> | Compiles ASCII grid (.grid) to PNG and/or .mcpx. | |
build [source] | Builds .mcpx source file or stdin (--stdin) to PNG. | |
| Transform & Geometry | transform <input> | Spatial operations: --flip, --rotate, --crop, --pad, --resize, --translate. |
| Color & Cleanup | quantize <input> | Color reduction to target count (--colors <N>). |
cleanup <input> | Artifact removal (--fix isolated,noise,outlier). | |
palette extract | Extracts palette from image. | |
palette inspect | Detailed palette analysis and role mapping. | |
material list | Lists built-in Minecraft materials. | |
material show | Shows color ramps for a material. | |
recolor <source> | Remaps .mcpx colors using a material ramp. | |
variant <source> | Generates multiple material variants into --output-dir. | |
| Generation & Tiles | generate <pattern> | Deterministic procedural texture generation (--seed <int>). |
tile <input> | Seam measurement and automatic tile correction. | |
preview <input> | Visual previews: --ascii, --palette-map, --scale <N>, --nine-slice. | |
gui-scale <input> | Scales a GUI sprite to --size <N|WxH> with the mcmeta stretch/tile/nine_slice mapping. | |
| Animation | animate pack | Packs frame directory into sprite sheet. |
animate unpack | Unpacks sprite sheet into frame directory. | |
animate reorder | Re-sequences animation frames. | |
animate resize | Rescales animation frames. | |
animate validate | Validates frame counts and layout against .mcmeta. | |
animate preview | ASCII or diagnostic preview of animation sequence. | |
| Validation | analyze <image> | Read-only metric analysis (colors, alpha, dimensions). |
inspect <input> | Read-only structure report or composited view (--mode structure|view, --crop, --scale). | |
validate <asset> | Validates single asset texture and optional .mcmeta. | |
validate-pack <path> | Validates entire resource pack root directory. | |
| Agent Interface | mcp | Starts the stdio MCP server. |
--operations)The import, render, and build commands support batch pixel edits via --operations <path> or --operations - (stdin).
transparent, #RRGGBB, or #RRGGBBAA.setPixel, clearPixel, drawLine, drawRect, fillRect, floodFill, ellipse, polygonFill, strokeMask) plus layer, region, stampRect, and regionFromSelection operations. The full per-type table lives in docs/cli-surface.md.ellipse fills or outlines the ellipse inside a rect; polygonFill takes up to 4096 integer [x, y] points (more is RESOURCE_LIMIT_EXCEEDED; a self-intersecting ring is SELF_INTERSECTING_POLYGON; no holes); strokeMask outlines a source selection on one layer.selection expression; an empty match refuses the write with EMPTY_SELECTION and rolls the batch back.src/io/png.ts) with pure integer color blending. Output files do not embed timestamps or host metadata.--seed.scripts/compare-runtime.mjs matrix..tmp-<pid>-<counter>-<randomhex>-<original name>) in the target directory and committed via atomic rename.--in-place or defining duplicate output targets fails before any bytes land on disk.--stdout: Human logs route to stdout. With --json, a structured { success, result, error } envelope routes to stdout and logs route to stderr.--stdout: Raw artifact bytes exclusively own stdout. Envelope and logs route to stderr.| Exit Code | Category | Meaning |
|---|---|---|
| 0 | Success | Operation completed successfully. |
| 1 | Internal Error | Unhandled engine failure (INTERNAL_ERROR). |
| 2 | Invalid Invocation | Syntax error, conflicting options, missing parameters (INVALID_ARGUMENT). |
| 3 | Validation Failure | Engine succeeded, but asset or pack failed validation (VALIDATION_FAILED). |
| 4 | Filesystem Error | Output exists without --force, missing directory without --mkdir, or an unreadable input. |
| 5 | Unsupported / Limit | Unsupported file type, or a size or resource limit exceeded. |
MIT © 2026 Smile Minecraft Project