com.spriteship/spriteship
REMOTE · SPRITESHIP.COM · SCANNED AUG 17
Build a game's 2D art layer with your agent: characters, animations, tilesets, levels, 5 engines.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security80
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability67
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 10058 tokens (~245/item across 41 items; 41 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management10
- Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · spriteship.com
claude mcp add --transport http com-spriteship-spriteship https://spriteship.com/mcp
[mcp_servers.com-spriteship-spriteship] url = "https://spriteship.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-spriteship-spriteship": {
"type": "remote",
"url": "https://spriteship.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-spriteship-spriteship --url https://spriteship.com/mcp --transport streamable-http
mcp_servers:
com-spriteship-spriteship:
url: "https://spriteship.com/mcp" {
"mcpServers": {
"com-spriteship-spriteship": {
"type": "http",
"url": "https://spriteship.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 17 Aug 26 +1
- Tool “generate_character_animation” rewrote its description, which is the text the model reads security
- New tool “phase_split” functional
- New tool “rematte_animation” functional
- “generate_character_animation” added an optional parameter “mirrorAnims” cosmetic
- 16 Aug 26 0
- Tool “get_project” rewrote its description, which is the text the model reads security
- 15 Aug 26 +1
- Stability: unverified → 0.03 ▲ functional
- 14 Aug 26 68
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 17 Aug 2026 · Probed https://spriteship.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=spriteship.com | CN=YE1,O=Let's Encrypt,C=US | 19 Jul 2026 | 17 Oct 2026 | ECDSA 256 | ECDSA-SHA384 | 5413b0b423510fc915b63643157a29472f4 |
| SANs: *.spriteship.com, spriteship.com | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC insecure
Validation of spriteship.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| spriteship.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://spriteship.com/mcp | Verified | 200 | |
| http (plaintext) | http://spriteship.com/mcp | HTTPS enforced | 302 | https://spriteship.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
animate_asset Animate an asset ~461
PAID (image-to-video, cost scales with duration × pair count). Animate ANY asset type — the animation lands on the source asset and its still image is preserved. For grid assets (tileset/staged) pass pairs of tile indices; a self-loop { from: n, to: n } makes one tile loop seamlessly. ASK THE USER WHICH STAGES FIRST. Call get_asset, describe the tiles you can see, and get an explicit answer on which is the START and which is the END before you spend. "Animate the treasure box" does not tell you whether they mean closed→open, open→closed, or the lid alone, and guessing wrong bills them for a clip they cannot use. The server rejects a grid animate with no pairs (400) precisely so that this choice is always made deliberately — do not satisfy it by defaulting to 0→last. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Asset id or slug. |
| closeLoop | boolean | – | Single-image assets — reuse the start frame as the end frame so the clip loops. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| durationSeconds | number | – | Clip length, clamped server-side to 2-10s. |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| iterationId | string | yes | Revision (iteration) id to animate. |
| motionHint | string | – | Extra motion guidance folded into the prompt. |
| pairs | array | – | Grid assets only — which tile transitions to animate. Omit for single-image assets. |
| videoModel | string | – | Override the video model. |
No output schema declared.
No examples provided.
cancel_job Cancel a job ~55
FREE. Abort a running job. Outstanding credit charges for the aborted work are refunded automatically. Use this when a generation is clearly going wrong rather than letting it run to completion.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | yes | Job id to cancel. |
No output schema declared.
No examples provided.
create_animation_from_pose Create a 1-frame animation from a pose ~150
FREE, no AI. Promote a pose into a real 1-frame animation (a still/idle) that is scaled to match the character's other animations and exports to every engine. Pass poseId "__idle__" to use the character's default image when it has no poses. Returns a jobId — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| characterId | string | yes | Character id. |
| displayName | string | – | Human-facing label. |
| fps | integer | – | Playback fps. |
| newId | string | – | Slug for the new animation ([A-Za-z0-9_-]). |
| poseId | string | yes | Pose id, or "__idle__" for the character's default image. |
No output schema declared.
No examples provided.
create_asset Create an asset ~1,264
tileset and staged REQUIRE gridRows+gridCols (e.g. 4x4) — ask the user how many tiles or stages they want. PAID (one image call). Creates a NEW asset from a prompt, in any of the six types: static (a single sprite/prop), tileset (a grid of tiles), staged (one subject in N stages, the input to animate_asset), background (scenery), terrain (a 3×3 auto-tiling sheet), texture (a seamless material). projectId is REQUIRED — the project supplies gameType, which decides how the art is drawn, and keeps the asset findable in the web app. Set gridRows:2 + gridCols:2 on a static asset to get FOUR variations for the price of ONE call; texture always produces four. A fan-out create returns one jobId — the four asset ids appear in get_job as gridAssetIds once the job finishes. Terrain has NO per-tile edit path: revising a terrain asset regenerates the whole sheet. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId, assetId } — poll get_job. For tileset and staged, finish by calling get_asset and checking `grid.complete`: a grid sheet can cut wrong while the job still reports done, and that is the only place it shows up.
| Name | Type | Req | Description |
|---|---|---|---|
| aspectRatio | string | – | BACKGROUND only — OPTIONAL, and best left unset: the server applies the recommended ratio for the chosen sub-type (e.g. 21:9 for a parallax layer, 1:1 for a ground fill), which is what the web wizard… |
| assetType | string | yes | static = one sprite/prop; tileset = a grid of related tiles; staged = one subject in N progressive stages (the input animate_asset expects); background = scenery, never a game object; terrain = auto-… |
| backgroundResolution | string | – | BACKGROUND only — output tier (default 2K). 4K costs more. |
| bgType | string | – | REQUIRED for assetType "background" — the sub-type, and it must be legal for the view: platformer → parallax_far/parallax_mid/parallax_near/platform_scene/static_backdrop/scrolling_backdrop; topdown… |
| bgViewType | string | – | BACKGROUND only — which view the background is drawn for. Defaults to the project gameType. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| gridCols | integer | – | Grid columns — see gridRows. |
| gridRows | integer | – | REQUIRED for tileset and staged — they are split into a grid, and without it the image is generated ungridded and every tile comes out cut. Optional elsewhere; on static, 2x2 means four variations fr… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| imageModel | string | – | Override the image model. |
| name | string | – | Display name (defaults to the prompt). |
| perspective | string | – | TERRAIN only — camera perspective. Defaults from the project gameType. |
| projectId | string | yes | REQUIRED. Owning project (create_project / list_projects). Supplies gameType + default style. |
| prompt | string | yes | What to generate. Describe the subject, not the art style — style comes from the project. |
| referenceAssetUrls | array | – | Up to 4 reference image URLs to condition the generation. URLs only — raw base64 is rejected on this surface. |
| runtimeUse | string | – | STATIC only (texture is locked to repeat_fill server-side). Declares how the art is meant to be rendered — particle_emitter, deformable_strip, nine_slice, shader_effect, path_follow — which changes t… |
| slug | string | – | Stable handle used by every /assets/:id call ([a-z0-9-]). Auto-derived from the name when omitted. |
| style | string | – | Override the project's art style for this asset only. |
| targetTileSize | integer | – | Output tile side in px (16-512). |
| textureKind | string | – | TEXTURE only — fill = uniform material tiling in all directions (walls/floors/ground); strip = has a directional top surface and repeats left↔right (platformer platforms). Defaults per gameType. Crea… |
| tileSize | number | – | TERRAIN only — output tile size in px (64, 128 or 256). |
No output schema declared.
No examples provided.
create_character Create a character ~600
PAID (~150 credits). Generate a NEW character from a text prompt. This is the entry point for building art from nothing — call create_project first if the user has no project. IMAGE ONLY: it produces the character still, not animations. Animation is a separate explicit step (generate_character_animation for a walk cycle, generate_character_turn for the 360 rotation), because animating costs several times more and the user should choose it. SET gridRows:2 AND gridCols:2 TO GET FOUR DESIGN VARIATIONS FOR THE SAME PRICE — one image call is split into four separate characters. That is almost always the right call for a first attempt: show the user all four and let them pick. Returns { jobId, expectedCharacterCount } — poll get_job; on status:"done" its characterIds and characterPreviews tell you which characters exist and what they look like. gameType is inherited from the project, never passed here (isometric projects create TOP-DOWN characters — the working directional pipeline; the character reads gameType:"topdown" afterwards). DEFAULTS TO A COST PREVIEW — see the dryRun argument.
| Name | Type | Req | Description |
|---|---|---|---|
| cameraAngle | number | – | Camera elevation in degrees — only meaningful for angled top-down projects. |
| characterImageSize | string | – | Aspect ratio of the generated image. Omit for the game-type default. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| gridCols | number | – | Set to 2 together with gridRows:2 for the 4-variation grid. |
| gridRows | number | – | Set to 2 together with gridCols:2 for the 4-variation grid. Same cost as one image. |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| imageModel | string | – | Override the image model. Omit unless the user asked for a specific one. |
| projectId | string | yes | REQUIRED. The project the character belongs to — it supplies gameType and the default style. |
| prompt | string | yes | What the character is, e.g. "a plague doctor with a lantern". Describe the subject, not the art style. |
| referenceAssetUrls | array | – | URLs of existing images to steer the design. URLs only — base64 is rejected by the API. |
| style | string | – | Art-style override. Omit to inherit the project's style — usually correct, since a project should look consistent. |
No output schema declared.
No examples provided.
create_project Create a project ~222
FREE and SYNCHRONOUS (no jobId — do not poll). Creates the container everything else needs: characters and assets are created INSIDE a project, and the project's gameType is what decides how they are drawn and animated. Also seeds a starter level map, so the game preview has something real to render immediately. Call list_projects first — reuse an existing project rather than making a near-duplicate.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional project description. Feeds the prompt context for later generations. |
| gameType | string | yes | REQUIRED and permanent for everything in the project. platformer = side view with gravity; topdown = 4/8-direction overhead-ish (Zelda-like); topdown_overhead = straight down; isometric = 2:1 diamond… |
| name | string | yes | Project name shown in the dashboard. |
| style | string | – | Optional art-style id applied as the default for generations in this project. |
No output schema declared.
No examples provided.
duplicate_animation Duplicate an animation ~115
FREE, no AI. Clone an animation under a new slug so you can curate a DIFFERENT frame subset on the copy — e.g. duplicate walk_right, then select_frames down to one frame to get a directional idle. The original is untouched. Returns a jobId — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| animation | string | yes | Source animation slug. |
| characterId | string | yes | Character id. |
| newId | string | – | Slug for the copy ([A-Za-z0-9_-], default "<source>_copy"). |
No output schema declared.
No examples provided.
export_map Export map (JSON) ~73
Engine-ready map JSON built from the SAVED level data, with custom-field values baked in. For the zip bundle (per-tile PNGs, loader scripts, tileset files) use get_export_command instead.
| Name | Type | Req | Description |
|---|---|---|---|
| engine | string | – | Target engine (default tiled). |
| mapId | string | yes | Map id. |
No output schema declared.
No examples provided.
fix_asset_seams Fix a texture's seams ~277
PAID (~100 credits, one image-to-image call). Make a texture tile seamlessly. Textures are created as raw grid cells, so CHECK get_asset first: metadata.seamless.seamMetric.pass is a FREE verdict on whether this cell already tiles cleanly, and metadata.seamless.fixed tells you if it was already fixed. Do not spend on a cell that passes. The fix lands as a new current revision. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Texture asset id or slug. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| iterationId | string | yes | Revision (iteration) id to fix. |
No output schema declared.
No examples provided.
frame_animation Animate a grid asset from its own tiles ~251
FREE, and NO AI AT ALL — no video model, no credits, nothing to approve. The tiles of a tileset/staged asset ARE the frames: give the tile indices in playback order (repeats allowed) and they are composited into a real spritesheet animation on that asset, exportable to every engine. This is how you animate a coin flip, a flickering torch or a chest opening WITHOUT paying for image-to-video. Try this before animate_asset whenever the motion already exists across the tiles. Returns a jobId — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Asset id or slug (must be a grid asset: tileset or staged). |
| fps | integer | – | Playback fps (1-30, default 12). |
| frameIndices | array | yes | Tile indices in playback order, e.g. [0,1,2,3,2,1]. At least 2, at most 120. Repeats are allowed — that is how you hold or ping-pong a frame. |
| iterationId | string | yes | Revision (iteration) id whose tiles are the frames. |
| name | string | – | Label for the animation (default "Frames"). |
No output schema declared.
No examples provided.
generate_character_animation Generate character animations ~587
PAID, and the cost MULTIPLIES BY THE NUMBER OF ANIMATIONS (each is its own image-to-video call, ~400 credits at defaults). This is real motion — a walk cycle, an attack, an idle bob — not the 1-frame still that create_animation_from_pose produces. Read the character's gameType and use the standard animation names for it (get_character shows what already exists); a name that already exists is REGENERATED. Ask the user which animations they want before spending: 4 animations cost 4x. If the character came from a 2x2 create, there are FOUR siblings and animating is per-character: show the user the characterPreviews from get_job and have them pick one before you spend. For multi-direction sets, mirrorAnims gives you FREE flipped copies of a direction generated in the same call (walk_left from walk_right) — prefer a real generation when the character is asymmetric, because a held item switches sides under a mirror. Returns { jobId, animations } — poll get_job. A prompt that composes too long for the model is rejected with PROMPT_TOO_LONG before anything is charged, and the response names the animation to shorten. DEFAULTS TO A COST PREVIEW — see the dryRun argument.
| Name | Type | Req | Description |
|---|---|---|---|
| animDurations | object | – | Per-animation clip length in seconds (2-10). Longer clips cost more. |
| animPrompts | object | – | Per-animation extra guidance, keyed by animation slug. Folded into that animation's composed prompt. |
| animations | array | yes | Animation slugs to generate, e.g. ["walk_right","idle"]. REQUIRED — each one is a separate paid video call. |
| characterId | string | yes | Character id. |
| customAnims | object | – | Define animations that are NOT part of the game type's standard set, keyed by the new slug. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| mirrorAnims | object | – | FREE mirrored copies, keyed newName → sourceName (e.g. { "walk_left": "walk_right" }). The source must be in this call's animations list; its fresh frames are flipped in the same job at no extra cost. |
| videoModel | string | – | Override the video model. |
No output schema declared.
No examples provided.
generate_character_turn Generate a 360 turn animation ~421
PAID (~400 credits — ONE 2-second rotation video). Spins the character through a full 360 so the sprite exists from every side; its frames are also what the directional-pose extractor reads, which is what makes top-down characters usable in more than one facing (isometric projects use top-down characters). ONLY topdown and isometric characters are supported — any other game type errors 400 TURN_NOT_SUPPORTED (topdown_overhead: the engine rotates the sprite image; platformer/point_and_click: side/front views, mirror instead). Lands as the animation "turn", or "turn_<seedPoseId>" when seeded from a pose. It 409s (ANIMATION_EXISTS) if that animation already exists — pass regenerate:true to replace it, which also clears the cached frames so you actually get new output. It also 409s (ENTITY_BUSY) while ANY other job is running on the character, because it rebuilds the spritesheet: poll that job first. Returns { jobId, animation } — poll get_job. DEFAULTS TO A COST PREVIEW — see the dryRun argument.
| Name | Type | Req | Description |
|---|---|---|---|
| characterId | string | yes | Character id. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| regenerate | boolean | – | Replace an existing turn animation instead of failing with ANIMATION_EXISTS. |
| seedPoseId | string | – | Rotate a specific DONE pose instead of the character's default image. Lands as "turn_<poseId>". |
No output schema declared.
No examples provided.
generate_pose Generate a character pose ~278
PAID (~150 credits). Generate a new pose for a character from a text description. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { poseId } once executed; poses have no jobId, so poll list_character_poses until status is done or error.
| Name | Type | Req | Description |
|---|---|---|---|
| characterId | string | yes | Character id. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| imageModel | string | – | Override the image model. |
| name | string | yes | Short pose name, e.g. "casting". |
| poseDescription | string | yes | What the character should be doing, e.g. "kneeling, shield raised". |
| referencePoseId | string | – | Seed from an existing DONE pose instead of the base image. |
No output schema declared.
No examples provided.
generate_project_vision Generate a project creative brief ~346
PAID but very cheap (one Gemini call) and SYNCHRONOUS — the result comes back in this response, there is no jobId to poll. Turns a rough game idea into { aiVision, aiPromptGuidance, aiNegativeGuidance }: a written creative direction plus the positive/negative guidance to reuse in later prompts, which is what keeps a whole project visually consistent instead of every asset drifting. Stores NOTHING — feed the wording into create_project (description/style) and into your own prompts. DEFAULTS TO A COST PREVIEW — see the dryRun argument.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | The idea in the user's own words: setting, mood, mechanics. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| gameType | string | yes | The view the game is played in — the brief is written for it. |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| name | string | yes | Working title of the game. |
| references | array | – | Up to 6 tagged reference images the model can look at. |
| style | string | – | Art style, if the user already has one in mind. |
No output schema declared.
No examples provided.
get_asset Get asset ~300
One asset with its revision iterations and typed animation projection. Accepts the asset id OR its slug. Texture assets carry metadata.seamless.seamMetric (a FREE wrap-edge verdict) and metadata.seamless.fixed — read seamMetric.pass to decide whether a cell needs the paid fix_asset_seams call at all. For tileset/staged/terrain the `grid` block reports how the sheet was actually cut — rows, cols, tileCount, cell size, one url per cell, and the engine-ready sidecars. After creating one, COMPARE `grid.rows`/`grid.cols`/`grid.tileCount` AGAINST THE GRID YOU REQUESTED — that comparison is the real check, because the sheet can cut wrong while the job still reports done. Do not rely on `grid.complete` alone: it only verifies the server is self-consistent (tileCount === rows × cols), so a sheet cut on dims nobody asked for still reads as complete. `grid.tiles[].url` gives you any single cell on its own if you want to look. `grid.dimsAssumed: true` means no grid was specified and the splitter invented one — treat those dims as untrustworthy. Backgrounds carry a `background` block echoing the sub-type, view and the aspect ratio actually generated — read it back to confirm the shape when you left aspectRatio unset.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Asset id or slug. |
No output schema declared.
No examples provided.
get_character Get character ~87
The full PhaserCharacter JSON: animations, frameSize, gameType, per-group atlas + spritesheet URLs, poses and mount points. Every binary URL is presigned and expires in ~1h — download immediately, never store or commit one. This is the same payload the in-app game preview consumes, so it is always a correct export.
| Name | Type | Req | Description |
|---|---|---|---|
| characterId | string | yes | Character id. |
No output schema declared.
No examples provided.
get_character_manifest Get character manifest ~60
The self-describing export contract (tizo-export.json manifest + its JSON Schema) without downloading the zip. Use this to learn the file inventory and field meanings before wiring an export into a game project.
| Name | Type | Req | Description |
|---|---|---|---|
| characterId | string | yes | Character id. |
No output schema declared.
No examples provided.
get_credits Get credit balance ~325
Current credit balance, and optionally the recent ledger. Every ledger entry carries apiKeyId/apiKeyName so you can see exactly what THIS key spent. Check the balance before proposing any paid generation. When the balance will not cover what the user wants, say what IS affordable rather than only that they are short — "1200 for all three animations, you have 900, so two now or top up for all three" is the useful answer. Two different walls exist and they need OPPOSITE advice: running out of BALANCE is fixed by buying credits (the 402 carries a topUpUrl — send that link, never quote prices, they change), while hitting the key's DAILY SPEND CAP is not a money problem at all — the credits are already in the account, and the fixes are raising the cap or waiting for resetsAt. Never suggest a purchase for a cap trip. If the user asks HOW to raise the cap: the 403 carries capSettingsUrl — give them that link and tell them to edit the key there. YOU cannot change it, by design: the cap edit needs a logged-in session and is unreachable with an API key, because a key that could raise its own cap would not be a cap. Do not retry hoping it passes, and do not ask them to paste credentials.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKeyId | string | – | Filter ledger entries to one key (UUID). |
| includeLedger | boolean | – | Also return recent ledger entries. |
| limit | integer | – | Max items to return (default 100, max 500). |
No output schema declared.
No examples provided.
get_custom_fields Get custom field definitions ~96
Typed custom-field definitions for a character or asset, plus the derived builtins ($animation for characters, $autoplay/$loop for animated assets). Per-placement VALUES ride on get_map; map exports bake resolved values and ship fields-schema.json. Read-only here — definitions are edited in the dashboard.
| Name | Type | Req | Description |
|---|---|---|---|
| entityId | string | yes | Character id, or asset id/slug. |
| kind | string | yes | Which entity table to read. |
No output schema declared.
No examples provided.
get_export_command Get export download command ~147
Build the authenticated download URL + a ready-to-run curl line for a zip export (character engine bundle, asset bundle, or map bundle). Run the curl in your own shell — zips are multi-MB binaries and must not be passed through the model. Requires SPRITESHIP_API_KEY to be set in that shell.
| Name | Type | Req | Description |
|---|---|---|---|
| engine | string | yes | Target engine. "tiled" is maps only; sprites have no Tiled emitter. |
| entityId | string | yes | Character id, asset id/slug, or map id. |
| size | string | – | Characters only — narrow a phaser zip to one downscale variant. |
| target | string | yes | What to export. |
No output schema declared.
No examples provided.
get_frames Get animation frames ~213
Presigned per-frame thumbnails for a character animation or an asset motion pair — never inline base64. Use format:"sheet" to get ONE index-labeled contact sheet, which lets you judge a whole capture in a single look; that is the intended way to pick which frames to keep before calling select_frames.
| Name | Type | Req | Description |
|---|---|---|---|
| animation | string | – | Animation slug — required when target=character. |
| entityId | string | yes | Character id (target=character) or asset id/slug (target=assetPair). |
| format | string | – | "sheet" returns one labeled contact sheet. |
| indices | string | – | Comma-separated frame indices to subset, e.g. "0,4,8". |
| pairId | string | – | Motion pair id — required when target=assetPair. |
| size | – | – | Max thumbnail edge (default 256, cap 1024). "full" opts out of downscaling. |
| target | string | yes | Frames of a character animation, or of an asset motion pair. |
No output schema declared.
No examples provided.
get_job Get job status ~307
Poll a background job. Every write tool that returns a jobId is polled here. On status:"error" the response is enriched with creditsRefunded and retryCost, so you can tell the user exactly what a retry costs. Poll every few seconds — generations routinely take minutes. THIS IS HOW YOU LEARN WHAT A CREATE CALL MADE: characterIds / assetIds list the entities this job produced — ONE normally, FOUR when create_character ran with the 2x2 variation grid — and on status:"done" characterPreviews carries a presigned image per character so you can show the user the options and let them pick. queued:true means it has not started yet (waiting for a slot) and has spent nothing. On any TERMINAL status (done or error) the response carries a `credits` block — { charged, refunded, net, balance, spendCapDaily, spentLast24h, capRemaining }. TELL THE USER `credits.net` AND `credits.balance` when the work finishes, in one short line. Report `net`, never your own pre-flight estimate: the two differ routinely — a 2x2 grid is ONE charge for four entities and failed steps are refunded — so quoting the estimate can report a cost that never happened. Do NOT attach a purchase suggestion to a successful generation; only raise buying credits when a call is actually blocked or the balance will not cover what the user asked for next.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | yes | Job id. |
No output schema declared.
No examples provided.
get_map Get map ~49
A map row plus its saved level data (layers, placements, per-placement custom-field values). Returns mapData:null when the map has never been saved.
| Name | Type | Req | Description |
|---|---|---|---|
| mapId | string | yes | Map id. |
No output schema declared.
No examples provided.
get_project Get project ~81
One project with its description, registered mount slots, and assetSuggestions — premade AI prompt ideas per entity type (character + the 6 asset types), tailored to the project's vision. Use them as ready-made prompts when creating characters/assets. May be null right after create (generated asynchronously — re-fetch to read).
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Project id. |
No output schema declared.
No examples provided.
list_assets List assets ~136
Assets (static / tileset / staged / background / terrain / texture) with slug, hasAnimation, updatedAt, tags and favourite. hasAnimation is data-derived: ANY asset type can carry an animation, so never infer it from the type.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max items to return (default 100, max 500). |
| name | string | – | Case-insensitive substring filter on the name. |
| projectId | string | – | Restrict to one project. |
| slug | string | – | Exact slug match (a slug is an identifier — no partial hits). |
| type | string | – | Filter by asset type. |
No output schema declared.
No examples provided.
list_character_poses List character poses ~82
All poses on a character: { id, name, prompt, status pending|done|error, url, pendingSince, errorCode, creditsRefunded }. This is the poll target after generate_pose — pose generation has no job id. A pose still pending long after pendingSince is stalled, not working.
| Name | Type | Req | Description |
|---|---|---|---|
| characterId | string | yes | Character id. |
No output schema declared.
No examples provided.
list_characters List characters ~108
Characters with the re-sync signals: contentVersion (opaque change token — compare for equality, never parse or order), hasActiveJob, apiReady, pose/animation counts, tags, favourite. Persist contentVersion per character and re-fetch only when it changes.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max items to return (default 100, max 500). |
| name | string | – | Case-insensitive substring filter on the name. |
| projectId | string | – | Restrict to one project. |
No output schema declared.
No examples provided.
list_maps List maps ~66
Level-editor maps with updatedAt and hasMapData. hasMapData:false means the map was never saved and cannot be exported.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max items to return (default 100, max 500). |
| projectId | string | – | Restrict to one project. |
No output schema declared.
No examples provided.
list_projects List projects ~93
All of the user's projects: { id, name, gameType, style, itemCount, createdAt, updatedAt }. gameType (platformer / topdown / topdown_overhead / isometric / point_and_click) determines how every character and asset in the project is drawn and animated — read it before generating anything.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max items to return (default 100, max 500). |
No output schema declared.
No examples provided.
mirror_animation Mirror an animation horizontally ~132
FREE, no AI. Flip every cached frame of ONE animation horizontally and rebuild it — the cheap way to get walk_left from walk_right. NOT idempotent: calling it twice flips the animation back to its original orientation, so call it once and check the result before calling again. Frame count and order are preserved, so any frame selection stays valid. To keep BOTH directions, call duplicate_animation first and mirror the copy. Returns { jobId, mirrored } (frames flipped) — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| animation | string | yes | Animation slug to flip in place. |
| characterId | string | yes | Character id. |
No output schema declared.
No examples provided.
phase_split Split an animation into game phases ~174
FREE, no AI. Carve ONE multi-state clip into separate game-phase animations by frame windows — the classic case is a jump becoming crouch/rise/fall/land, with fall looping while airborne and the rest playing once. Each phase becomes a real exportable animation; the source animation is untouched. Jump-family animations often carry a ready-made suggestion: get_character → animations[<anim>].phaseProposal — pass its phases through verbatim. Frame windows index the FULL capture. Returns { jobId, created } — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| animation | string | yes | Source animation slug (e.g. "jump"). |
| characterId | string | yes | Character id. |
| phases | array | yes | 2-6 phase windows. animations[<anim>].phaseProposal from get_character usually supplies these verbatim. |
No output schema declared.
No examples provided.
rebuild_character Rebuild a character from its cached frames ~141
FREE, no AI. Re-render every spritesheet, atlas and export of a character from its durable cached frames. This is the repair/refresh tool: use it when a sheet looks stale or wrong after a series of edits, or when a previous rebuild failed. It never re-generates art, so it cannot change what the character looks like — only how the frames are packed and normalized. Always rebuilds ALL animations: heights are normalized ACROSS animations, so rebuilding a subset would size that subset against itself and make animations drift apart on screen. Takes no options. Returns a jobId — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| characterId | string | yes | Character id. |
No output schema declared.
No examples provided.
regen_asset_pair Regenerate one asset motion pair ~284
PAID (~400 credits at defaults). Re-run video generation for a SINGLE motion pair of an animated asset, leaving its other pairs alone. The new take lands as an additional iteration on that pair — earlier takes are preserved. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Asset id or slug. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| durationSeconds | number | – | Informs the cost estimate only — the dispatched job uses the pair's own duration. |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| motionPrompt | string | – | Replacement motion prompt for this take. |
| pairId | string | yes | Motion pair id (from get_asset). |
| videoModel | string | – | Override the video model. |
No output schema declared.
No examples provided.
rematte_animation Fix an animation's edge artifacts (re-matte) ~192
FREE, no AI. Try a cleaner background removal on ONE animation's source video — the repair for a quality read showing deliveredIssues containing "matte" (green fringe, flickering holes, ragged edges). The cleaner version is kept ONLY if it measures better, so this can never make the animation worse; the motion itself is unchanged. One attempt per capture: if the same frames were already tried (matteRepair stamp), a repeat call is a cheap re-check + free re-render — regenerate the animation for a fresh take instead. Fails with SOURCE_VIDEO_EXPIRED when the source video aged past its 30-day retention. Returns { jobId } — poll get_job, then re-read the character's quality block: "matte" gone = the cleaner version shipped.
| Name | Type | Req | Description |
|---|---|---|---|
| animation | string | yes | Animation slug to re-matte in place. |
| characterId | string | yes | Character id. |
No output schema declared.
No examples provided.
reprocess_asset Re-cut a grid asset's tiles ~281
FREE and SYNCHRONOUS (no jobId — do not poll), no AI. Re-run the grid split on a tileset or staged asset revision using its STORED original image, so you can change how the sheet is CUT without paying for a new generation: anchor (where each sprite sits in its cell), per-cell nudges, and a per-cell inset. Omitted fields keep the revision's current values; send cellOffsets:[] or cellInset:0 to clear. tileset and staged ONLY — other types have no grid, and terrain has no re-cut path at all (it is alpha-split from one sheet; iterate it with revise_asset instead). Returns a grid summary; call get_asset afterwards for fresh presigned tile URLs.
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | – | Where each sprite is placed inside its cell. "bottom-middle" is the default for sprites that stand on the ground. |
| assetId | string | yes | Asset id or slug (tileset or staged). |
| cellInset | integer | – | Pixels shaved off every side of each cell, to drop neighbouring bleed (0-32). Pass 0 to clear. |
| cellOffsets | array | – | Per-cell pixel nudges, in tile-index order. Pass [] to clear all nudges. |
| iterationId | string | yes | Revision (iteration) id to re-cut. |
No output schema declared.
No examples provided.
retry_job Retry a failed job ~326
PAID (only for the sub-steps that still need to run). Re-runs the FAILED step of a job whose status is "error" — the prompt, model and every setting are already on the job, so this is the cheap way out of a failure instead of creating the whole thing again. Work that already succeeded is NOT redone or re-charged: a generation that failed after its image landed reuses the paid result. get_job on an errored job reports retryCost, and the dryRun quote here is that same number. A non-retryable phase answers 400 JOB_NOT_RETRYABLE — some late phases hold partially-committed state and deliberately have no blanket retry. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| jobId | string | yes | Id of a job whose status is "error" (from get_job). |
No output schema declared.
No examples provided.
revise_asset Revise an asset ~324
PAID. Generate a new revision of an asset from feedback text. The previous revision is kept — revisions are additive, never destructive. Terrain assets also accept templateId to pull a whole category pack (edges / grounds / props / slopes / textures / structures). DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Asset id or slug. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| imageModel | string | – | Override the image model. |
| prompt | string | – | What to change. Required unless templateId is given (terrain). |
| sourceIterationId | string | – | Revise from a specific earlier revision instead of the current one. |
| templateId | string | – | Terrain only — generate a focused category pack. |
| textureKind | string | – | Texture only — 4-way seamless fill, or a directional left-right strip. Defaults to the asset's existing kind. |
No output schema declared.
No examples provided.
select_frames Select animation frames ~195
FREE, no AI. Curate which frames an animation keeps, by index into the full capture, in order. Pass an empty array to reset to all frames. Non-destructive: the full capture is retained, so you can re-select at any time. Use get_frames with format:"sheet" first to choose indices. Returns a jobId — poll get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| animation | string | – | Animation slug — required when target=character. |
| compositing | object | – | Characters only — apply scale/offset in the same rebuild. |
| entityId | string | yes | Character id (target=character) or asset id/slug (target=assetPair). |
| frames | array | yes | Ordered frame indices to keep. Empty array resets to the full capture. |
| pairId | string | – | Motion pair id — required when target=assetPair. |
| target | string | yes | A character animation, or an asset motion pair. |
No output schema declared.
No examples provided.
set_asset_runtime_intent Set an asset's runtime render intent ~175
FREE and SYNCHRONOUS (no jobId — do not poll). Declare how an asset revision should be rendered at runtime: plain_image, particle_emitter, deformable_strip, repeat_fill, nine_slice, shader_effect or path_follow. The intent and its config flow into every engine export made AFTER this edit. Set tileIndex to target one tile of a tileset/staged asset.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Asset id or slug. |
| config | object | – | Intent-specific config. Validated and clamped server-side; unknown keys are dropped. |
| iterationId | string | yes | Revision (iteration) id to stamp. |
| runtimeUse | string | yes | The render intent. plain_image clears any previous intent. |
| tileIndex | integer | – | Target one tile (tileset/staged only). |
No output schema declared.
No examples provided.
suggest_motion_hint Suggest a motion hint for a staged asset ~277
PAID but very cheap (one Gemini call) and SYNCHRONOUS — returns { hint, cost } inline, no jobId. Reads a STAGED asset's prompt plus the stage pairs you intend to animate and writes the one-sentence motion description to pass as animate_asset's motionHint. Use it when you are about to spend ~400 credits on video and are unsure what to write: a few credits here protects that spend. Staged assets only — any other type answers 400.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Staged asset id or slug. |
| dryRun | boolean | – | DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits and get an… |
| idempotencyKey | string | – | Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot doub… |
| pairs | array | – | The stage transitions you plan to animate — context for the hint, nothing is generated from them. |
No output schema declared.
No examples provided.
whoami Who am I ~59
Verify the API key and report which powers it has. Returns { userId, username, keyId, keyName, scopes }. Call this first when a tool fails with a scope error — the scopes array tells you what this key can and cannot do.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.