SpriteForge Editor

Free pixel and tileset editor, no account: hand-edit sprites, animations and Wang tilesets in chat

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
90%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,292Tokens (tool definitions)
~2.7 KBTypical response size
Moderate attention impact (1.79% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "editor": {
      "url": "https://www.spriteforge.tech/mcp/editor"
    }
  }
}

Remote endpoints

https://www.spriteforge.tech/mcp/editorstreamable-http

What it can do

Tool inventory

Tools (6)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡open_editor(name, png_base64, art, width, height, ...)

Opens pixel art in SpriteForge's compact pixel editor - pencil, eraser, fill, colour picker, palette, undo and animation frames - as an interactive card where the app shows them, and returns an edit link (the same editor in a browser) and a session_id. No account needed. One source at most: png_base64 (an existing PNG), art (palette + index grid), or neither for a blank width x height canvas. Max 128x128 pixels and 256 colours. The user's edits save to the edit session automatically.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Sprite name, used as the download filename (letters, digits, _ and -)."
    },
    "png_base64": {
      "type": "string",
      "description": "A PNG file, base64-encoded (a data: URL prefix is fine). Pixels under 50% alpha become transparent."
    },
    "art": {
      "type": "object",
      "description": "Pixel art in SpriteForge's format: palette = hex colours, grid = rows of palette indexes (-1 = transparent). Optional frames for an animation, each { grid } on the same palette.",
      "properties": {
        "palette": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 256
        },
        "grid": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        },
        "frames": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "grid": {
                "type": "array",
                "items": {
                  "type": "array",
                  "items": {
                    "type": "integer"
                  }
                }
              }
            },
            "required": [
              "grid"
            ]
          }
        }
      },
      "required": [
        "palette",
        "grid"
      ]
    },
    "width": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128,
      "description": "Blank canvas width in pixels (default 32)."
    },
    "height": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128,
      "description": "Blank canvas height in pixels (default 32)."
    },
    "palette": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 256,
      "description": "Starting palette for a blank canvas, as hex colours."
    }
  },
  "additionalProperties": false
}
🟢get_sprite(session_id, include_pixels)

Returns the current state of a SpriteForge edit session: a preview image, its size and palette, how many edits were saved, and a PNG URL with the exact pixels at 1x (add &frame=N for another frame). With include_pixels it also returns the palette-index grid. Read-only.

Input Schema

{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string",
      "description": "An edit session's id (the s= value of an edit link), or the edit link itself."
    },
    "include_pixels": {
      "type": "boolean",
      "description": "Also return the palette and index grid (default false)."
    }
  },
  "required": [
    "session_id"
  ],
  "additionalProperties": false
}
🟡open_full_editor(session_id, name, png_base64, art, width, ...)

Opens a sprite in SpriteForge's full pixel editor - layers, selection and move, line/rectangle/ellipse, mirror painting, brush sizes, animation frames with onion skin and playback, palette tools - as an interactive card where the app shows them, and returns an edit link that opens the same editor in a browser. One source at most: session_id (an edit session that's already open, or an edit link), png_base64 (an existing PNG), art (palette + index grid), or none for a blank width x height canvas. Max 128x128 pixels and 256 colours. The user's edits save to the edit session.

Input Schema

{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string",
      "description": "An edit session that's already open, or an edit link containing ?s=<id>."
    },
    "name": {
      "type": "string",
      "description": "Sprite name, used as the download filename (letters, digits, _ and -)."
    },
    "png_base64": {
      "type": "string",
      "description": "A PNG file, base64-encoded (a data: URL prefix is fine). Pixels under 50% alpha become transparent."
    },
    "art": {
      "type": "object",
      "description": "Pixel art in SpriteForge's format: palette = hex colours, grid = rows of palette indexes (-1 = transparent). Optional frames for an animation, each { grid } on the same palette.",
      "properties": {
        "palette": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 256
        },
        "grid": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        },
        "frames": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "grid": {
                "type": "array",
                "items": {
                  "type": "array",
                  "items": {
                    "type": "integer"
                  }
                }
              }
            },
            "required": [
              "grid"
            ]
          }
        }
      },
      "required": [
        "palette",
        "grid"
      ]
    },
    "width": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128,
      "description": "Blank canvas width in pixels (default 32)."
    },
    "height": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128,
      "description": "Blank canvas height in pixels (default 32)."
    },
    "palette": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 256,
      "description": "Starting palette for a blank canvas, as hex colours."
    }
  },
  "additionalProperties": false
}
🟡open_tileset_editor(session_id, kind, palette, tiles, base, ...)

Opens a tileset in SpriteForge's tileset editor as an interactive card where the app shows them, and returns an edit link that opens the same editor in a browser. For a Wang autotile set (16 tiles; tile i is drawn where the map cells at its corners are painted, NW=1 NE=2 SW=4 SE=8, so tile 15 is the solid base) the user paints a small map to see the tiles chain, draws on the map or on single tiles, and edits the base texture, which re-derives the edge tiles (tiles drawn by hand stay); a platformer set (49 tiles) is edited tile by tile. With session_id it opens a tileset that's already in an edit session, and kind (wang = flat floor terrain, wall, iso) switches that Wang set's preview, keeping its tiles and the user's edits. Otherwise it makes a new set from kind (wang, wall, iso or platformer; default wang) plus palette + tiles (16 or 49 grids in mask order), palette + base (a seamless square texture; the 16 Wang tiles are derived from it as SpriteForge does), png_base64 (a tileset sheet or a texture), or size alone for a blank set. With png_base64 and no layout, a 16x1 image is a strip, and a square one is a 4x4 sheet when its tiles look like a Wang set in mask order (tile 0 empty, or nearly every tile's corners matching tile 15 where its mask has that corner and tile 0 where it doesn't), else a texture. The result says which view it opened and how it read the PNG. The user's edits save to the edit session.

Input Schema

{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string",
      "description": "An existing tileset edit session, or an edit link containing ?s=<id>. Give kind with it to change a Wang set's preview; the other fields are for a new set."
    },
    "kind": {
      "type": "string",
      "enum": [
        "wang",
        "wall",
        "iso",
        "platformer"
      ],
      "description": "wang (flat floor terrain), wall (Wang walls), iso (isometric Wang) or platformer. For a new set, default wang. With session_id, wang, wall or iso switches that Wang set's preview, keeping its tiles; a Wang set can't become a platformer set or the other way round."
    },
    "palette": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 256,
      "description": "Hex colours for tiles or base."
    },
    "tiles": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        }
      },
      "description": "The set's tiles in mask order (16 for Wang kinds, 49 for platformer), palette indexes, -1 transparent."
    },
    "base": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "integer"
        }
      },
      "description": "A square seamless texture to derive a Wang set's 16 tiles from."
    },
    "png_base64": {
      "type": "string",
      "description": "A tileset PNG (a Wang set's 4x4 sheet or 16x1 strip, a platformer set's 7x7 sheet) or a square texture, base64."
    },
    "layout": {
      "type": "string",
      "enum": [
        "sheet",
        "strip",
        "texture"
      ],
      "description": "How to read png_base64: sheet (4x4 Wang sheet, or a platformer set's 7x7), strip (16x1) or texture (a square base texture the 16 Wang tiles are derived from). Default: guessed from the image (see the tool description)."
    },
    "size": {
      "type": "integer",
      "minimum": 4,
      "maximum": 64,
      "description": "Tile size for a blank set (default 32)."
    },
    "name": {
      "type": "string",
      "description": "The set's name."
    }
  },
  "additionalProperties": false
}
🟢load_art(session_id)

Loads an edit session's sprite into the SpriteForge editor card. Only the card calls it.

Input Schema

{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string"
    }
  },
  "required": [
    "session_id"
  ],
  "additionalProperties": false
}
🟡save_art(session_id, art)

Saves the user's edits from the SpriteForge editor card to its edit session. Only the card calls it.

Input Schema

{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string"
    },
    "art": {
      "type": "object",
      "description": "Pixel art in SpriteForge's format: palette = hex colours, grid = rows of palette indexes (-1 = transparent). Optional frames for an animation, each { grid } on the same palette.",
      "properties": {
        "palette": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 256
        },
        "grid": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        },
        "frames": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "grid": {
                "type": "array",
                "items": {
                  "type": "array",
                  "items": {
                    "type": "integer"
                  }
                }
              }
            },
            "required": [
              "grid"
            ]
          }
        }
      },
      "required": [
        "palette",
        "grid"
      ]
    }
  },
  "required": [
    "session_id",
    "art"
  ],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools