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.--presetand--effectalso print the working recipe as one JSON line.--spriteaccepts base64, adata:URL, a URL, orcharacter:<id>:<direction>/object:<id>/gallery:<id>.<step> add_part '{"parts": [...]}',set_part,remove_part,throw, andrender '{"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 withmeta.anchor), and with--game-pack,<slug>-game.zip(whole.png, one sheet per part,manifest.jsonwith 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.
