pixel-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PIXEL_MCP_DATA_DIR | No | Override the data directory. Defaults to platform-specific data directory. | |
| PIXEL_MCP_EXPORT_SCALE | No | Default export scale factor. Default is 4. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_documentA | Create a new pixel art document. Palette is a preset name (gameboy, grayscale4, pico8, sweetie16, nes) or a list of hex colors; index 0 is always transparent. |
| open_documentA | Import a PNG image as a new document from exactly one of png_base64 or path, quantizing to at most max_colors colors. Max 256x256. |
| extract_paletteA | Extract a color palette from a PNG supplied as exactly one of png_base64 or path, with median-cut quantization, WITHOUT creating a document. Returns a list of hex colors ready to pass to create_document(palette=[...]) (or add_palette_color), plus a swatch render so the colors are visible. Use this to pull a palette from a reference image; use open_document when you also want its pixels. |
| exportA | Export the document to a real file and return its absolute path. png: one frame with true transparency. gif: all frames animated. aseprite_json: JSON with embedded spritesheet. This is delivery for humans — the response contains no rendered image; use view/view_frames for perception. |
| split_sprite_sheetA | Split a regular PNG sprite sheet into separate pixel-mcp documents in row-major order. Provide exactly one of png_base64 or path. Supports sheet margins and spacing between cells; transparent cells are skipped by default. |
| pack_sprite_sheetA | Pack document frames into a transparent PNG sprite sheet in row-major order and write it to disk. Sprites may have different sizes; cell dimensions default to the largest sprite. This is delivery output and returns no preview image. |
| resize_canvasA | Resize the canvas. Existing content is placed according to the anchor; new area is transparent. Clears saved selections. |
| undoB | Undo the last edit(s). |
| redoB | Redo previously undone edit(s). |
| describeB | Full document state: size, palette with usage counts, layers, frames, symmetry, stamps, selections. |
| list_documentsA | List all documents, including ones persisted by other sessions sharing the data dir. |
| delete_documentA | Permanently delete a document from memory and disk. Cannot be undone. |
| set_symmetryA | Set the document symmetry mode. While set, drawing and region tools mirror writes across the canvas center automatically. |
| set_tile_modeA | Set seamless-tiling mode. While set, drawing tools wrap across the tiling edges (a stroke off one side continues on the opposite side) and the tile_seams lint rule activates. 'horizontal' tiles left-right, 'vertical' top-bottom, 'both' for a full repeat. Use view_tiled to check seams. |
| set_active_layerB | Set the default target layer for editing tools. |
| set_active_frameC | Set the default target frame for editing tools. |
| checkpointB | Label the current state for later comparison with view_diff. |
| set_palette_colorB | Change the color (and optionally name) of a palette entry. All pixels using the index update visually. |
| add_palette_colorB | Append a color to the palette. Fails when the palette is full (64 entries). |
| remove_palette_colorA | Delete a palette entry, remapping its pixels to remap_to. Higher indices shift down by one. |
| swap_palette_indicesA | Swap two palette entries and all pixel references to them. The image looks unchanged. |
| generate_rampB | Append a shading ramp built around a base color (dark to light). Shadows hue-shift toward cool, highlights toward warm. |
| mix_palette_colorsA | Blend two palette colors and store the result. The indexed-color way to make an in-between shade: t interpolates from color a (0) to color b (1). Appends a new entry by default, or overwrites into_index. |
| adjust_palette_colorA | Nudge a palette color in HSL space: darken/lighten via lightness, shift saturation or hue. Saves the model from hand-computing hex. Edits in place (all pixels using it update), or appends a fresh variant with as_new. |
| replace_colorA | Replace every pixel of one palette index with another on a layer (palette untouched). Optionally restricted to a region. |
| set_pixelsC | Set individual pixels to palette indices. |
| lineB | Draw a Bresenham line. no_doubles removes L-shaped double pixels for pixel-perfect diagonals. |
| rectC | Draw a rectangle (outline or filled). |
| ellipseC | Draw an ellipse centered at (cx,cy) with radii rx,ry (outline or filled). |
| flood_fillA | Flood fill from a seed pixel. contiguous=false recolors every pixel that matches the seed color. |
| outlineB | Draw a 1px border around all non-transparent pixels of the layer (or region). 'outside' draws into transparent pixels; 'inside' onto the shape's edge. |
| paste_gridA | Bulk-write a region from grid text (one char per pixel, '.'=transparent, then 1-9, a-z, A-Z, '#', '@' for palette indices 1-63; rows top to bottom). The workhorse for blocking in shapes. |
| shadeA | Darken or lighten existing pixels. A pixel whose color is part of a ramp steps along that ramp; otherwise it snaps to the nearest palette color in that direction. mode 'ramp' only moves ramp colors, 'nearest' ignores ramps, 'auto' (default) does ramp-then-nearest. Operates on the whole layer unless a region is given. |
| dither_gradientA | Fill a region with an ordered-dither gradient between two palette colors. The indexed-color way to blend a smooth-looking transition: from_index at one end, to_index at the other. axis horizontal/vertical/radial; pattern bayer (4x4, smoother) or checker (2x2, coarser). Either index may be 0 to fade to/from transparent. |
| scatterA | Randomly scatter pixels from a set of palette indices across a region, at the given coverage density (0-1). For grain and noise: stone, dirt, wood texture. Deterministic for a given seed, so the same call reproduces the same grain. weights biases which indices are picked. |
| import_imageA | Import an external PNG supplied as exactly one of png_base64 or path onto the canvas. Resamples to width x height (default native size), maps to the document palette ('document') or extends the palette with median-cut colors ('extend'), then writes it to a layer at (x,y). With as_stamp it is stored as a named stamp instead (place later with paste_stamp). Unlike open_document (new doc) this drops pixels into the current canvas. |
| copy_regionB | Copy a region into a named stamp for later paste_stamp. |
| cut_regionB | Copy a region into a named stamp and clear it from the layer. |
| paste_stampA | Paste a named stamp with optional flips and rotation. Transparent stamp pixels are skipped by default. Unlike other tools, paste_stamp ignores document symmetry by default: stamps are placed content, and mirroring would silently flip deliberate asymmetry. |
| copy_from_documentA | Copy a region of pixels from another document into this one, lossless in palette-index space — the assembly tool for multi-agent fan-out: subagents draw parts in their own documents, then a parent composes them. Source colors map to identical destination palette entries where they exist; the rest are appended ('extend', default) or snapped to the perceptually nearest existing entry ('nearest'). Placed content: ignores symmetry by default, like paste_stamp. |
| move_regionB | Move a region by (dx,dy), clearing its old location. |
| mirror_regionB | Mirror a region in place across its own bounding-box axis. |
| shift_layerB | Translate the whole layer by (dx,dy), optionally wrapping around the edges. |
| clear_regionB | Set every pixel in a region to transparent. |
| save_selectionC | Store a named selection that region parameters can reference later. |
| add_layerB | Add a new transparent layer (becomes the active layer). |
| remove_layerB | Delete a layer and its pixels on every frame. |
| rename_layerC | Rename a layer. |
| reorder_layerB | Move a layer to a new position in the stack (0 = bottom). |
| set_layer_visibilityC | Show or hide a layer. |
| set_layer_lockC | Lock or unlock a layer against edits. |
| merge_downA | Merge a layer into the one below it. Non-transparent top pixels replace bottom pixels; partial layer opacity is discarded. |
| viewA | Render the canvas (or a region) as a PNG. The primary perception tool: call it after every couple of edits. |
| view_textA | Read pixels as grid text (max 64x64; use view_window or a region for bigger canvases). |
| view_diffB | Compare the current state against a checkpoint: before, after, and changed-pixels panels. |
| view_windowA | Zoomed view of a 16 or 32 px window plus a whole-canvas thumbnail with the window marked. The intended workflow for 64px+ canvases. |
| view_tiledA | Render the canvas repeated reps x reps so tiling seams are visible, with the tile boundaries marked in faint red. The perception tool for seamless textures — a tile only reads as seamless when you see it tiled. Pairs with set_tile_mode and the tile_seams lint rule. |
| load_referenceA | Store a reference PNG supplied as exactly one of png_base64 or path under an id for quantizing or side-by-side viewing. |
| quantize_referenceA | Downsample a reference to the given size and map it to the document palette ('document') or to a fresh median-cut palette appended to the document ('auto'). Optionally write the result into a layer. |
| view_referenceB | Render a reference image, optionally beside the current canvas at matched display size. |
| add_frameA | Append a frame (optionally duplicating an existing one). The new frame becomes active. |
| remove_frameC | Delete a frame. |
| reorder_frameC | Move a frame to a new position on the timeline. |
| set_frame_durationC | Set how long a frame displays (ms). |
| copy_celC | Copy one layer's pixels from one frame to another. |
| view_framesA | Render frames as a horizontal strip. With onion, each frame shows the previous frame at 40% opacity beneath it. This (plus per-frame view) is the perception tool for animation — use it to verify motion, not preview_gif. |
| preview_gifA | Render the animation as a GIF (on checkerboard background). Human-facing output only: most clients show a GIF as a single still in model context, so it verifies nothing — use view_frames to check motion. |
| lintA | Run pixel-art quality checks and return findings with a render circling them. Rules: orphans, doubles, banding, pillow_shading, unused_colors, near_duplicates, broken_outline, symmetry_drift, stray_alpha, tile_seams. Findings are advisory; nothing is auto-fixed. |
| lint_waiveA | Persistently waive lint findings so they stay waived on every future pass (reported only as a count). Scope to a region to waive only there; omit the region to waive the whole rule. |
| lint_unwaiveA | Remove a lint waiver by id, or all waivers for the document when no id is given. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/ehm-93/pixel-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server