Skip to main content
Glama

Generate pixel art with SpriteForge

generate
Destructive

Start an AI generation that spends the user's SpriteForge credits; the result is saved into their library. Unless the user has said to go ahead without asking, quote_generation first and get their OK on the price. max_cents is required: the job is refused if its price is higher (use the quoted price, or the user's budget). Returns a job_id - call get_job with it to wait for the result (most sprites take 20 s to a few minutes). Pass a request_id to make retries safe: the same request_id never starts or charges a second job.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "type": "<type>",
      "tier": "<tier>",
      "max_cents": "<max_cents>"
    },
    "name": "generate"
  }
}

Input Schema

NameRequiredDescriptionDefault
colsNomultiterrain: map width in tiles (default 16).
nameNoName for the new sprite (default: the artist names it).
rowsNomultiterrain: map height in tiles (default 12). The whole map (cols x rows x tile size) must stay under about 160,000 pixels.
tierYesModel x effort. If the user hasn't chosen, choose for them from get_generation_options: Sonnet is the usual default up to 32px, Opus for 48-64px canvases, complex characters and final assets, Haiku for cheap small icons. Low/High variants trade price and time for care. Fable is the newest model; use it when the user asks for it.
typeYesWhat to make. single = one sprite. edit = AI-change a library sprite (asset_id + prompt). set = 1-8 sprites sharing one palette (subjects). animation = a looping animation (subject + frame_count; give asset_id to animate a library sprite). phased = one sprite drawn in 2-3 staged passes, the strongest choice for humanoids. terrain = top-down wall / transition / floor tiles. wang = a 16-tile autotile terrain set plus 4 variants of its solid tile. platformer = 49 side-view ground tiles incl. slopes. multiterrain = a map of 2-6 terrains blending into each other (terrains, cols, rows).
lightNoLight direction, e.g. "Top-left" (default: the project's).
notesNoAnything else the artist should know (max 500 characters).
styleNoArt-style line for this generation, e.g. "chunky 16-bit fantasy" (on top of the project's style).
widthNoCanvas width in pixels (1-64). Required except for edit and an animation of a library sprite. Tile types need width = height (the tile size).
heightNoCanvas height in pixels (1-64).
motionNoanimation: the movement, e.g. "walk cycle". Lines starting with a frame number direct that frame ("3: raise the sword").
passesNophased: 2 or 3 passes (default 3).
promptNoedit: the change to make, e.g. "give him a red scarf".
outlineNo"Dark-tinted" (optionally "Dark-tinted:<darkness 0-100>"), "Black" or "None" (default: the project's).
subjectNoWhat to draw - single, phased, animation; the material for terrain (the wall) and wang; for platformer the ground surface on top, e.g. "lush grass". Concrete beats vague: subject, pose, colours, materials, mood.
asset_idNoedit: the library sprite to change (required). animation: a library sprite to animate - it becomes the loop's rest pose and sets the size.
subjectsNoset: one short description per sprite.
symmetryNo"Off", or a note such as "horizontal" - mirrored after drawing.
terrainsNomultiterrain: the terrains, e.g. grass, sand, water.
max_centsYesThe most this generation may cost, in US cents.
set_themeNoset: the theme they share, e.g. "medieval armory icons".
subject_bNoterrain: the floor material (default: same as subject). platformer: the earth fill under the surface, e.g. "dark packed earth" (default: same as subject).
aggressionNoanimation: how hard poses are pushed (default normal).
mask_cellsNoedit: limit the change to these [x,y] pixels; everything else is kept.
open_endedNoanimation: a one-shot progression that doesn't loop back to the start.
project_idNoProject to generate into (default: the most recently used). Its style, description, light, outline and palette steer the result.
referencesNoLibrary sprites (up to 64px) that guide the result: role style (default) copies the look, subject copies what's depicted. Used by single, edit, set, phased, wang and multiterrain; each adds a small surcharge.
request_idNoOptional idempotency key, unique per intended generation.
detail_tierNophased: a second tier for the passes after the silhouette, e.g. tier "Opus High" + detail_tier "Sonnet".
frame_countNoanimation: drawn motion frames (1-8; the rest pose of an animated library sprite isn't counted).
perspectiveNoe.g. "side view", "3/4 top-down", "isometric".
save_as_newNoedit: save the result as a new sprite instead of updating the original (whose old version is otherwise kept in its history).
terrain_mapNomultiterrain: rows x cols of indexes into terrains - a painted layout (default: the server paints one).
lock_paletteNoSnap the result strictly onto the project palette.
terrain_rulesNomultiterrain: optional edge-blend rules.
animation_nameNoanimation of a library sprite: the name it's saved under on that sprite (default "idle").
use_project_styleNoApply the project's style and description (default true).
use_project_paletteNoSteer toward the project's palette (default true).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / detail_tier / enum
      Previous value: -[
      -  "Haiku",
      -  "Sonnet",
      -  "Opus",
      -  "Haiku Low",
      -  "Haiku High",
      -  "Sonnet Low",
      -  "Sonnet High",
      -  "Opus Low",
      -  "Opus High"
      -]New value: +[
      +  "Haiku",
      +  "Sonnet",
      +  "Opus",
      +  "Fable",
      +  "Haiku Low",
      +  "Haiku High",
      +  "Sonnet Low",
      +  "Sonnet High",
      +  "Opus Low",
      +  "Opus High"
      +]
    • changedInput schema / properties / tier / description
      Previous value: -"Model x effort. If the user hasn't chosen, choose for them from get_generation_options: Sonnet is the usual default up to 32px, Opus for 48-64px canvases, complex characters and final assets, Haiku for cheap small icons. Low/High variants trade price and time for care."New value: +"Model x effort. If the user hasn't chosen, choose for them from get_generation_options: Sonnet is the usual default up to 32px, Opus for 48-64px canvases, complex characters and final assets, Haiku for cheap small icons. Low/High variants trade price and time for care. Fable is the newest model; use it when the user asks for it."
    • changedInput schema / properties / tier / enum
      Previous value: -[
      -  "Haiku",
      -  "Sonnet",
      -  "Opus",
      -  "Haiku Low",
      -  "Haiku High",
      -  "Sonnet Low",
      -  "Sonnet High",
      -  "Opus Low",
      -  "Opus High"
      -]New value: +[
      +  "Haiku",
      +  "Sonnet",
      +  "Opus",
      +  "Fable",
      +  "Haiku Low",
      +  "Haiku High",
      +  "Sonnet Low",
      +  "Sonnet High",
      +  "Opus Low",
      +  "Opus High"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / type / description
      Previous value: -"What to make. single = one sprite. edit = AI-change a library sprite (asset_id + prompt). set = 1-8 sprites sharing one palette (subjects). animation = a looping animation (subject + frame_count; give asset_id to animate a library sprite). phased = one sprite drawn in 2-3 staged passes, the strongest choice for humanoids. terrain = top-down wall / transition / floor tiles. wang = a 16-tile autotile terrain set. platformer = 49 side-view ground tiles incl. slopes. multiterrain = a map of 2-6 terrains blending into each other (terrains, cols, rows)."New value: +"What to make. single = one sprite. edit = AI-change a library sprite (asset_id + prompt). set = 1-8 sprites sharing one palette (subjects). animation = a looping animation (subject + frame_count; give asset_id to animate a library sprite). phased = one sprite drawn in 2-3 staged passes, the strongest choice for humanoids. terrain = top-down wall / transition / floor tiles. wang = a 16-tile autotile terrain set plus 4 variants of its solid tile. platformer = 49 side-view ground tiles incl. slopes. multiterrain = a map of 2-6 terrains blending into each other (terrains, cols, rows)."
  3. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only tell the agent this is a destructive, non-read-only, non-idempotent call; the description supplies the actual behavior that matters: credits are spent, output lands in the library, jobs are refused above max_cents, the call is asynchronous via job_id, typical latency is 20 s to minutes, and request_id makes retries safe. The request_id explanation correctly accounts for idempotentHint=false rather than contradicting it — idempotency is opt-in via a key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the action and its cost/persistence implications, then the approval workflow, then the async handle, then the idempotency key. No filler; every clause carries decision-relevant information despite the compact size.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 38-parameter, expensive, asynchronous generator with no output schema, the description covers the pieces an agent cannot get from structured fields: cost approval flow, price ceiling behavior, return value (job_id) and how to poll it, latency expectation, and retry safety. The parameter matrix itself is fully documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100% with unusually rich per-parameter text, so the baseline is 3. The description still adds operational meaning the schema does not: that max_cents is a hard refusal bound and should be set from the quote or the user's budget, and why request_id exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action with concrete consequences: 'Start an AI generation that spends the user's SpriteForge credits; the result is saved into their library.' An agent knows immediately that this is the paid, persisted generation entry point, distinct from siblings like quote_generation and get_job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit ordering rules and exclusions: quote_generation first unless the user already approved, then get_job with the returned job_id to wait. It also names the condition that lifts the prerequisite ('unless the user has said to go ahead without asking'), so the decision path is fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources