Skip to main content
Glama

Web Asset Studio

License: MIT Node MCP

Generate consistent sticker packs, pixel-art sprites, animation sheets and web icons with your own ChatGPT web account, then cut, clean and pack them automatically. An MCP server plus an agent skill. No OpenAI API key, no paid image API.

▶ Watch the 24-second promo · Bahasa Indonesia

Why

The OpenAI image API is paid per image. Students and hobbyists often already have a ChatGPT account and can generate images in the web app, but one prompt gives one image with one expression, and a second prompt drifts: different face, different style, a fake "transparent" checkerboard background, pixel art that is not on a grid.

Web Asset Studio fixes the part around the generation:

Problem

What this does

Characters drift between prompts

One reusable style bible is repeated in every prompt, an approved anchor image is attached every time, and many variations are generated inside one grid image

Backgrounds are fake or noisy

Flood-fill background removal from the edges (keeps the white of the eyes), detects fake checkerboards, and never eats a subject cropped at the frame edge

"Pixel art" is not pixel art

Area-downscale to the true grid, hard alpha, a limited palette that can be shared across a whole set

Files end up everywhere

A project folder with raw, frames, processed, sheets and a project.json that records every prompt and chat link

Game engines need sheets

Uniform-cell sprite sheet PNG, a JSON atlas, and a GIF preview

Related MCP server: aseprite-mcp

How it works

Two halves, plus a skill that tells the agent how to use them:

photo ──► add_reference ──► project_create (style bible) ──► build_prompt
                                                               │
        browser MCP drives chatgpt.com in your logged-in Chrome ◄┘
        (attach files, type prompt, wait, download)
                                                               │
 ingest ──► agent checks the preview ──► slice_grid ──► process ──► build_spritesheet
                                                       │
                              raw/  frames/  processed/  sheets/   project.json
  • Browser MCP (Claude in Chrome or @agent360/browser-mcp) operates chatgpt.com in the Chrome profile where you are already signed in.

  • web-asset-studio MCP server (this repo) does everything deterministic: folders, manifest, prompt composition, ingesting downloads, background removal, pixelation, outlines, slicing, packing. Pure JavaScript, no native dependencies, bundled to one file.

  • asset-studio skill is the procedure for the agent: lock the character, generate in grids, QA every result, regenerate what drifts. Clients without skills can read the same text from the MCP prompt asset_studio_workflow.

Read this first

  • Terms of use. OpenAI's terms restrict automatic extraction of output from the service. Automating chatgpt.com with your account is a gray area and the risk (rate limits, account restrictions) is yours. The workflow is deliberately slow: one image at a time, it stops at usage limits, and it never works around login or CAPTCHA (it hands those to you).

  • Limits. Free accounts have a small daily image quota; a 3x3 grid gives nine assets for one image.

  • Privacy. Any photo you attach is uploaded to ChatGPT. The agent is instructed to ask you first.

  • ChatGPT's UI changes. The selectors in skills/asset-studio/references/chatgpt-web.md are hints; the agent is told to discover elements on the live page. That page was verified against a real account in October 2026, but expect drift.

  • Video (Sora) is only partly covered: ingest and video_to_frames (needs ffmpeg) exist, the browser flow is untested.

Install

Requirements: Node.js 18.17+, Chrome signed in to chatgpt.com, and one browser MCP.

1. A browser MCP (pick one)

  • Claude in Chrome: install the extension and connect it to Claude.

  • Agent360 Browser MCP:

    claude mcp add --scope user browser-mcp -- npx @agent360/browser-mcp@latest

    then install its Chrome extension. To upload reference photos, enable Allow access to file URLs for the extension in chrome://extensions.

2a. Claude Code (plugin: server + skill)

claude plugin marketplace add EgiStr/web-asset-studio
claude plugin install web-asset-studio@web-asset-studio

Restart Claude Code. The server is prebuilt in dist/server.mjs, so there is nothing to compile.

2b. Any other MCP client (Claude Desktop, Cursor, VS Code, Codex, Windsurf)

{
  "mcpServers": {
    "web-asset-studio": {
      "command": "node",
      "args": ["/path/to/web-asset-studio/dist/server.mjs"],
      "env": { "ASSET_STUDIO_ROOT": "/path/to/your/project/asset-studio" }
    }
  }
}

Environment variables

Variable

Default

Purpose

ASSET_STUDIO_ROOT

<project dir>/asset-studio

Where projects are stored

ASSET_STUDIO_DOWNLOADS

OS Downloads folder (on Windows, read from the registry, so a relocated Downloads folder works)

Folder Chrome saves to, watched by ingest

ASSET_STUDIO_FFMPEG

ffmpeg on PATH

Used by video_to_frames

In Chrome, turn off Ask where to save each file before downloading and allow multiple downloads when asked.

Use it

Tell your agent, for example:

Use asset-studio. Here is my photo ~/photos/me.jpg. Make 18 chibi sticker expressions with transparent backgrounds, a white outline, 512 px.

Make a 48 px pixel-art character from this photo, then a 4-frame idle and an 8-frame walk cycle facing right, packed as a sprite sheet for Phaser.

Make 16 pixel icons, 32 px, for a farming web game: coin, seed bag, watering can, hoe, and so on, all sharing one palette.

Output lives in asset-studio/<project>/:

project.json   style bible, palette, anchor, every asset with its prompt and chat URL
refs/          reference photos
raw/           ChatGPT downloads, untouched
frames/        cells cut from grid sheets or video
processed/     final transparent PNGs, uniform size
sheets/        sprite sheet .png + atlas .json + preview .gif
video/         downloaded videos

MCP tools

Tool

What it does

studio_info

Asset root, watched Downloads folder, ffmpeg, existing projects

project_create, project_get, project_update

Project and style bible (subject, style, palette, background, rules), pixel settings, locked palette

add_reference

Copy a photo or style sample into refs/

set_anchor

Mark an approved asset that every later generation must attach

build_prompt

Compose a single, grid, animation or variation prompt and list the files to attach; returns a prompt_one_line so Enter does not send early

ingest

Save a finished browser download (moved out of Downloads), a URL, or a local path; returns a preview

slice_grid

Cut a grid image into named cells (overwrite replaces cells after a regenerate)

process

Ordered steps on the raw files: remove_bg, trim (group keeps animation frames aligned), crop, resize, fit, scale, pixelate, outline

build_spritesheet

Uniform-cell sheet PNG + JSON atlas (TexturePacker hash, works in Phaser/Pixi; frameWidth/frameHeight for Godot/Unity) + GIF

video_to_frames

Extract PNG frames from an ingested video (needs ffmpeg)

Recipes for stickers, pixel stickers, sprite animation, emotes, web icons, phone wallpapers and fixes for common problems are in skills/asset-studio/references/recipes.md.

Development

npm install
npm test      # builds dist/server.mjs first, then runs 18 tests
npm run build

The tests cover image processing on synthetic images (fake checkerboard, off-grid pixel art, a subject cropped at the edge, aligned animation frames), the full pipeline from a fake Downloads folder, and the bundled server started without node_modules through a real MCP client. dist/server.mjs is committed because the plugin runs it directly: rebuild and commit it after changing src/.

src/        image.mjs (pixels), workspace.mjs (projects), prompts.mjs, server.mjs (MCP)
skills/     the asset-studio skill and its references
test/       node:test suites
docs/       promo.mp4

Contributions are welcome, especially: updates to the ChatGPT page hints when the UI changes, an objects-only mode for build_prompt (it currently always injects the character bible), and a tested Sora/video flow.

License

MIT

Available Tools

12 tools
add_referenceA

Copy a reference image (the user's face photo, a style sample) into the project's refs folder. Upload the returned path to ChatGPT.

Inputs: path (required), role (required), project (required), note.

build_promptC

Compose the ChatGPT prompt from the bible plus this request, and list the files to attach (anchor first). Paste the prompt verbatim.

Inputs: task (required), items (required), project (required), cols, +4 more.

build_spritesheetB

Pack frames into one uniform-cell sprite sheet PNG + JSON atlas (TexturePacker hash, works in Phaser/Pixi; frameWidth/frameHeight for Godot/Unity) + animated GIF preview.

Inputs: name (required), frames (required), project (required), fps, +5 more.

ingestB

Save a generated image or video into the project (raw/ or video/) and record its prompt. Source: a finished browser download (moved out of Downloads), a URL, or a local path.

Inputs: name (required), source (required), project (required), tags, +5 more.

processA

Run steps, in order, on the RAW files of one or more assets and write processed/.png. Always starts from raw, so re-run with new settings freely. Pass every asset of a set in ONE call with the same steps so they come out uniform. Recipes: sticker = remove_bg, trim, outline, fit 512; animation = remove_bg, trim group, pixelate shared.

Inputs: steps (required), assets (required), project (required), preview.

project_createB

Create an asset project with a style bible that every prompt reuses (this is what keeps a set consistent).

Inputs: name (required), type (required), bible (required), pixel.

project_getC

Project bible, anchor, references, every asset with absolute file paths, and sheets.

Inputs: project (required).

project_updateC

Change the style bible (merged field by field), pixel settings, or the locked palette.

Inputs: project (required), bible, pixel, palette.

set_anchorA

Mark an approved asset as the anchor: build_prompt then attaches it to every later generation so the character stays the same.

Inputs: asset (required), project (required), stage.

slice_gridB

Cut a grid image (from task grid/animation) into equal cells; each cell becomes its own asset in frames/.

Inputs: cols (required), rows (required), asset (required), project (required), +4 more.

studio_infoA

Where assets are stored, which downloads folder is watched, ffmpeg availability, and the list of projects. Call first.

Inputs: no named parameters.

video_to_framesC

Extract PNG frames from an ingested video (needs ffmpeg) so they can be processed and packed like other frames.

Inputs: asset (required), project (required), fps, max_frames.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 12 tools

    Disambiguation4/5

    Most tools target a distinct stage of the asset pipeline (ingest, process, slice_grid, build_spritesheet), so selection is usually clear. Minor overlap exists between project_get and studio_info (both surface project listings) and between add_reference and ingest (both bring files into a project), but the descriptions clarify the distinction.

    Naming Consistency3/5

    All names use snake_case, which helps, but the ordering convention is mixed: noun_verb (project_get, project_create, project_update) alongside verb_noun (add_reference, set_anchor, build_prompt, slice_grid) and bare verbs (process, ingest). It remains readable but is not a predictable single pattern.

    Tool Count5/5

    Twelve tools is well-scoped for a multi-stage asset pipeline covering project setup, prompt building, ingestion, processing, slicing, and packing. Each tool maps to a distinct operation and none appear redundant.

    Completeness4/5

    The surface covers the full lifecycle from project creation and references through ingestion, processing, grid slicing, and sprite sheet export, with clear recipes documented. Gaps are minor, such as no asset/project deletion or rename operations, which agents can likely work around.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers