Measured endpoints

VFX workbench (MCP only), measured

Create VFX shipped in PixelLab 0.4.128 as a web tool (pixellab.ai/create-vfx). Since October 2026 it is also the vfx_workbench tool on PixelLab's MCP server. It still has no REST endpoint: /v2/openapi.json lists nothing for it.

It is a renderer, not a model. An effect is a JSON recipe of layers (glows, rings, rays, particles, noise, and more), most of them dropped in as tuned "parts" with their own sliders. PixelLab renders the recipe to pixel-art frames, generates nothing, and bills nothing on a subscription. Rendering is deterministic: the same recipe re-rendered gave a byte-identical sheet and GIF.

Calling it. POST https://api.pixellab.ai/mcp with the REST API's own key as a bearer token, one JSON-RPC tools/call per request. No initialize handshake or session id is needed (the server issues none). The reply is a short server-sent-event stream whose data: line holds the JSON-RPC response; its content is plain text plus PNG contact sheets of the frames.

The tool takes one argv list per call:

  • start [--preset <name> | --effect <saved id>] [--sprite <image>] [--fps N] returns a step id. --preset and --effect also print the working recipe as one JSON line. --sprite accepts base64, a data: URL, a URL, or character:<id>:<direction> / object:<id> / gallery:<id>.
  • <step> add_part '{"parts": [...]}', set_part, remove_part, throw, and render '{"recipe": {...}}' or '{"patch": [...]}' each return a new step id. Steps are immutable, so an older id is a way back.
  • <step> export --name <n> [--replace <saved id>] [--game-pack] saves to the account's My effects and replies with the effect id, an edit link, <w>x<h>, <n> frames @ <fps> fps, plays once|loops, the anchor, and a download folder listing <slug>.gif, <slug>.png (sheet), <slug>.json (an Aseprite/TexturePacker-style atlas with meta.anchor), and with --game-pack, <slug>-game.zip (whole.png, one sheet per part, manifest.json with each clip's depth, frames, and offset). The download URLs need no auth.
  • describe presets|parts|recipe|edits|... documents the rest: 17 presets and about 90 parts as of October 2026.

Two gaps a wrapper has to cover:

  • No reply after a part is added prints the recipe, and the exported JSON does not carry it. start --effect <saved id> does, including slider changes made on pixellab.ai, so pixelkiln reads it back from there after each export.
  • A recipe stores only where the sprite stands (subject: {x, y, align}), not its pixels, so re-rendering an effect built around a sprite needs the sprite sent again.

Wired up as pixelkiln vfx for loose files (the CLI reference) and as the vfx manifest generator (GENERATORS.md), which cuts the exported sheet into an ordered frame set. The workbench answers "the pixel tools are busy. retry in a few seconds." while another render on the account is running; pixelkiln retries that with backoff.