Skip to main content
Glama

Server Details

Build a game's 2D art layer with your agent: characters, animations, tilesets, levels, 5 engines.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.8% over 39 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL

TDQS

A3.6/5.0

Scored across 72 tools

Disambiguation3/5

Most tools are individually distinct and meticulously described, but the animation/recovery/approval families contain several near-neighbor pairs (animate_asset vs frame_animation, retry_job vs retry_unusable_result, approve_automatic_pose_fallback vs approve_directional_poses, generate_project_intake vs generate_project_vision). An agent can tell them apart, but only after reading lengthy descriptions, so selection risk remains.

Naming Consistency4/5

The overwhelming majority of tools follow a clean snake_case verb_noun pattern (create_*, get_*, list_*, set_*, generate_*), making the surface predictable. Deviations like whoami, plan_sync, phase_split, and the abbreviated regen_asset_pair break the pattern but are minor and still readable.

Tool Count1/5

72 tools is far beyond the typical well-scoped 3–15 range and qualifies as an extreme surface area. Even if each tool is individually justified, the sheer count creates a heavy discovery and routing burden for any agent.

Completeness4/5

Coverage is strong across the generation lifecycle: project, asset, character, animation, UI pack, export, job retry, recovery, billing, and sync are all represented. The main gaps are the absence of delete/update operations for many entity types and no direct map editing path, but these are workaroundable via revise/regenerate and the web editor.

Available Tools

72 tools
animate_assetAnimate an assetAInspect

PAID (image-to-video; Wan 3.0 costs 150 credits/second, so each default 2-second pair is 300 credits; total 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. Confirmed background-removal provider failures already fall back automatically on the server, without a new user charge. There is no daily removal retry lockout; honor reported cooldowns and unknown-task safeguards if recovery still fails. For already-authorized generation, automatically execute a zero-credit recovery quote and poll it; no renewed approval or refund. Never duplicate a running recovery. Limit automatic retries to two per failed job per session; stop on recurring failure or any paid quote. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
pairsNoGrid assets only — which tile transitions to animate. Omit for single-image assets.
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
assetIdYesAsset id or slug.
closeLoopNoSingle-image assets — reuse the start frame as the end frame so the clip loops.
motionHintNoExtra motion guidance folded into the prompt.
videoModelNoOverride the video model.
iterationIdYesRevision (iteration) id to animate.
idempotencyKeyNoOptional 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 double-dispatch.
durationSecondsNoClip length, clamped server-side to 2-10s.

TDQS

A4.6/5.0
Behavior5/5

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

With only basic annotations (readOnlyHint=false, idempotentHint=false), the description carries the full burden and excels: it discloses cost scaling, the dryRun default, recovery and fallback behavior, retry limits, and the requirement for user approval. No contradiction with annotations; it adds substantial behavioral context beyond what annotations provide.

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

Conciseness4/5

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

The description is long but dense, front-loading the most critical cost and usage information. Each sentence adds operational value (approval flow, error handling, retry policy). It could be slightly trimmed, but the length is justified by the tool's complexity (9 params, cost implications, user interaction).

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?

Given the tool's complexity, the description covers all essential operational aspects: cost, approval flow, grid vs single-image handling, error recovery, retry limits, default behavior, and return format. It even anticipates potential mistakes (defaulting pairs) and explains server-side safeguards. Nothing an agent needs to call it correctly is missing.

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?

Although schema coverage is 100% and the schema already includes detailed parameter descriptions, the tool description adds extra meaning: it explains cost per second, the self-loop pair pattern, idempotency key reuse for retries, and the dryRun quote structure. This goes beyond the schema's basic parameter definitions.

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?

The description clearly states the tool animates any asset type, with specific behavior for grid vs single-image assets, and distinguishes it from siblings by emphasizing its universal applicability. It also clarifies the output (returns {jobId}) and the cost model, leaving no ambiguity about the core purpose.

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

Usage Guidelines4/5

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

Provides extensive usage context: when to use grid pairs vs closeLoop, the mandatory pre-approval flow (asking user which stages), the cost preview default, and error handling guidance. It does not explicitly name alternative tools but gives clear situational instructions, so it's a 4 rather than 5.

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

approve_automatic_pose_fallbackApprove an automatic pose decisionAInspect

Successful automatic poses now continue without review, including imports. Four-direction setup stays automatic and eight-direction keeps its existing selection. Imported generation preserves source rendering rather than project style. Use this tool only when get_job returns a pending automaticPoseFallback. If poseReview is present, this is a historical imported-pose checkpoint from an earlier flow: show originalUrl and poseUrl side by side and ask the user to check style, complete head/body and unwanted ground/scenery. Submit choice="generated" only after they accept that exact pose, or choice="original" to use their original character; include poseVersion from poseReview.version. Use cancel_job to cancel. Without poseReview, pose creation failed: ask whether to continue with the default pose or cancel, and use choice="original" to continue. Never approve automatically. Both choices resume the original approved animation request at normal video cost. Accepted generated poses are reused without another review until regenerated.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesJob waiting for an automatic pose decision.
choiceNoRequired for an imported-pose review. Technical-failure fallback defaults to original.
poseVersionNoExact poseReview.version shown to and approved by the user; required for an imported-pose review.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds critical behavioral context beyond these: both choices resume the original animation request at normal video cost, accepted generated poses are reused without another review, and imported generation preserves source rendering. No contradiction with annotations exists.

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

Conciseness4/5

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

The description is longer than typical but the length is justified by the branching logic. It front-loads some contextual background before the direct 'Use this tool only when...' instruction, which slightly delays the core routing guidance, but every sentence contributes useful decision-making information.

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?

Given no output schema and three parameters with conditional semantics, the description is remarkably complete. It covers both possible states (poseReview present vs absent), the exact user interaction required, how to submit the choice, when to cancel instead, and the downstream consequences of approval.

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

Parameters5/5

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

Although schema coverage is 100%, the description enriches parameter meaning substantially. It explains exactly when choice='generated' is acceptable ('only after they accept that exact pose'), that choice='original' is used for technical failure continuation, and that poseVersion must be the exact poseReview.version shown to and approved by the user.

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?

The description clearly states the tool's function: approve an automatic pose fallback decision. It also specifies the exact trigger condition ('Use this tool only when get_job returns a pending automaticPoseFallback'), which distinguishes it from sibling tools like approve_directional_poses and cancel_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?

The description provides explicit usage guidance: when to call the tool, how to branch on the presence of poseReview, which choice to submit in each scenario, and when to use cancel_job instead. It also warns 'Never approve automatically,' making the human-in-the-loop requirement unambiguous.

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

approve_directional_posesApprove directional posesAInspect

FREE approval checkpoint. Use only when get_job returns status:"waiting_approval", wizardPhase:"waiting-directional-pose-approval", and directionalPoseReview. Present every returned previewUrls to the user and let them adjust or review the proposed frameIndices and poseScales. If any remain unreviewed, get explicit confirmation to use those candidates as shown before submitting the complete returned index and scale maps. When directions is present, review only those four poses, choose unique indices 0–3, keep scale 100 and preserve unused map entries. Absent directions means eight poses. Closing or declining means do not call this tool: the job remains paused and no dependent animation credits are spent. The server rechecks the live credit balance immediately before resuming paid dependent animations.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesWaiting job id from get_job.
poseScalesNoApproved percent scale for every compass direction (70–115). Omit to keep the review values.
frameIndicesYesApproved source-frame index for every compass direction.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond annotations: it is free, calling it resumes paid dependent animations, and the server rechecks the live credit balance immediately before resuming. It also explains that declining leaves the job paused and no dependent animation credits are spent. This adds substantial context about side effects and safety, complementing the annotations (readOnlyHint=false, openWorldHint=true).

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

Conciseness4/5

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

The description is dense and long, but every sentence carries a specific, actionable rule. It is front-loaded with the usage condition, followed by process, conditional rules, and negative consequences. Some sentences could be tightened or structured into bullet points, but there is no fluff; the length is justified by the complexity of the tool.

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 tool with no output schema and complex conditional behavior, the description covers all essential aspects: when to use, how to present previews, how to handle unreviewed candidates, special handling for directions present/absent, and consequences of not calling the tool. The server-side credit recheck is also disclosed, making the agent fully informed to call it correctly.

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

Parameters5/5

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

Although the schema has 100% coverage with descriptions for all parameters and nested object properties, the description enriches semantics with critical operational instructions: use unique indices 0–3, keep scale 100, preserve unused map entries, and let the user adjust or review the proposed frameIndices and poseScales. These are not apparent from the schema alone and are essential for correct parameter values.

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?

The description clearly identifies the tool as a 'FREE approval checkpoint' for directional poses in a job workflow, with the explicit purpose of submitting approved frameIndices and poseScales. It distinguishes itself from siblings by stating precise conditions under which it applies (status 'waiting_approval', wizardPhase 'waiting-directional-pose-approval', directionalPoseReview). The action is specific: present previewUrls, let the user adjust/review, and submit the maps.

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?

Provides explicit usage conditions: 'Use only when get_job returns status...' and states the negative case: 'Closing or declining means do not call this tool'. It also distinguishes between when directions is present (four poses) versus absent (eight poses), giving clear routing guidance. This leaves no ambiguity about when to invoke the tool versus alternatives.

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

cancel_jobCancel a jobAInspect

FREE. Abort a running job. Failed/incomplete provider work is refunded automatically. If the job is waiting for directional-pose approval, its successful reusable 360 and pose charges are retained; no dependent animation has started. Use this when a generation is clearly going wrong rather than letting it run to completion.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesJob id to cancel.

TDQS

A4.5/5.0
Behavior5/5

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

The description goes beyond the annotations by explaining important side effects: failed/incomplete provider work is refunded automatically, and for waiting-for-approval jobs, reusable 360 and pose charges are retained. This is genuinely useful behavioral context that annotations like destructiveHint:false do not capture. No contradiction between the description and annotations is present.

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?

The description is concise and front-loaded, beginning with the essence 'Abort a running job.' Every sentence adds information: cost, refund rules, approval-specific behavior, and usage guidance. There is no fluff or repetition.

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 single-parameter tool with no output schema and existing annotations, the description provides all needed context: the core action, the specific cancellation timing, refund behavior, charge retention specific cases, and a usage recommendation. An agent can invoke this tool correctly without further information.

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

Parameters3/5

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

The schema already provides a clear description for jobId ('Job id to cancel.'), and coverage is 100%. The description adds no extra semantic meaning for the parameter beyond the basic one, so the baseline score of 3 applies.

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?

The description states the verb 'Abort' and the resource 'a running job', making the tool's purpose explicit. The wording distinguishes it from siblings like get_job or retry_job, since those do not abort a running generation. The phrase 'FREE' also adds a useful top-level qualifier.

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

Usage Guidelines4/5

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

The description gives a clear when-to-use condition: 'Use this when a generation is clearly going wrong rather than letting it run to completion.' This is explicit context, but it does not name a specific alternative tool such as retry_job, nor does it state when cancellation would be the wrong choice. That prevents a full score of 5.

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

convert_texture_to_materialConvert a legacy texture to a MaterialAInspect

FREE and SYNCHRONOUS, no AI. Copies a legacy repeat-xy texture into a new immutable Brushable Material revision; the original revision is preserved. Topdown/isometric conversions can be ready immediately when the legacy seam check passed. Platformer conversions are marked needs-review because the old texture has no paired surface ribbon. Legacy strip-only textures cannot be converted because they have no interior fill. Returns the new iteration and quality status; call get_asset afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesLegacy texture asset id or slug.
projectionYesMap projection this Material will paint.
iterationIdYesLegacy texture revision to preserve and convert.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses free/synchronous/no-AI execution, immutability, revision preservation, projection-dependent quality outcomes, and return behavior. Annotations only carry readOnlyHint, destructiveHint, and idempotentHint, so the description adds substantial behavioral context beyond what annotations already provide. No contradiction found.

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?

Dense but not bloated; every sentence adds a distinct fact: cost/performance, immutability, projection behavior, conversion constraints, and follow-up step. The core operation is front-loaded.

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?

Covers prerequisites (seam check, strip-only prohibition), outcome states (ready/needs-review), mutation semantics (preserves original), and the follow-up call to get_asset. Since there is no output schema, the explicit mention of return values closes the main remaining gap.

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 100%, so all three parameters are already documented. The description adds value by tying the projection enum values to concrete outcomes (topdown/isometric vs platformer) and explaining texture-type eligibility limits, which goes beyond the schema's parameter descriptions.

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: copies a legacy repeat-xy texture into a new immutable Brushable Material revision while preserving the original. This clearly distinguishes the tool from sibling asset-processing tools by naming the exact transformation and output.

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

Usage Guidelines4/5

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

Provides explicit applicability rules: topdown/isometric conversions are ready immediately if seam check passed, platformer conversions are marked needs-review, and strip-only textures cannot be converted. It gives clear when-to-use and when-not-to-use conditions, though it does not explicitly name an alternative sibling tool.

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

create_animation_from_poseCreate a 1-frame animation from a poseAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNoPlayback fps.
newIdNoSlug for the new animation ([A-Za-z0-9_-]).
poseIdYesPose id, or "__idle__" for the character's default image.
characterIdYesCharacter id.
displayNameNoHuman-facing label.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already indicate non-read-only and non-destructive behavior. The description adds valuable context: it returns a jobId (asynchronous, requiring polling get_job), handles the __idle__ special case, scales the animation to match other animations, and exports to every engine. These details go beyond the annotations and set accurate expectations for the agent.

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?

Three sentences, each serving a distinct purpose: the first states the core functionality and differentiators, the second covers the __idle__ edge case, and the third explains the async return and polling. Information is front-loaded and every sentence earns its place.

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?

There is no output schema, so the description properly explains the return value (jobId) and directs the agent to poll get_job. It also covers the __idle__ fallback and the scaling/export behavior, making the tool's workflow clear. For a moderate 5-parameter tool, this is sufficient.

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

Parameters3/5

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

Schema coverage is 100%, with all 5 parameters described in the schema. The description reinforces the special '__idle__' value for poseId but does not add new information about fps, newId, displayName, or characterId beyond what the schema already provides. Baseline 3 is appropriate.

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?

The description uses a specific verb ('Promote a pose') and clearly identifies the output as a 'real 1-frame animation (a still/idle)'. It distinguishes from siblings by emphasizing the pose-to-animation conversion and the scaling to match other animations, making the tool's purpose unmistakable.

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

Usage Guidelines4/5

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

The description states this is 'FREE, no AI', implying it is a lightweight alternative to AI-driven animation generation. It clearly explains the use case: converting a pose into a 1-frame animation that scales and exports. However, it does not explicitly name alternative tools or state when not to use it, so it falls short of fully explicit guidance.

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

create_assetCreate an assetAInspect

PAID (one image call). Creates a NEW asset from a prompt in any of the six types. The default dry run now returns a strictly text-free artwork brief: no captions, labels, lettering, digits or pseudo-writing unless the user explicitly requests specific intrinsic writing on an object. Environment Kit overlays must not have die-cut sticker borders or backing. It returns both the exact semantic plan (plan.preview, item count/list, camera, project-derived look) and planToken. SHOW that preview to the user. A real call requires the same request plus that planToken; changing the prompt, project settings, type, model, or output settings invalidates it and requires a new dry run. Standard models cost 60 credits at 1K, 100 at 2K, or 150 at 4K per image/sheet, including automatic background removal and fallback; use the dry-run quote. Object (assetType: "static", formerly Static Asset) defaults to four separately editable design alternatives of the requested object, not a state sequence. All four share project style and one of five world cameras; explicitly requested flat inventory/UI icons use front/content_type. Explicit one remains supported. Clean cutouts omit incidental scenery and sticker backing, not real outlines or integral bases. Never automatically reroute asset types. Object States (staged) is one object in exactly four ordered states on a 2×2 sheet; no filler or automatic animation. Preserve identity, shared physical scale and real size changes. Object Collection (tileset) and Environment Kit (terrain) propose 1–25 useful pieces when no count is specified; explicit lists/counts are preserved without grid-filler extras. Object Collections contain independently editable mixed items, variants, matching families, icons/symbols or cards/tokens—not automatic animation stages. World props follow project camera; flat icons/cards use front-facing presentation even in isometric projects, unless the user explicitly requests another view. Preserve requested intrinsic symbols/text, never external captions. Material uses one transparent 1K donor sheet through the configured Material provider route and yields two platformer fill+surface families or four topdown/isometric fills, and background to one image when the user did not specify a count. Explicit counts/semantic sets override defaults, and non-square counts for other grid types are filled to the smallest supported 2×2–5×5 square with disclosed supplemental items. Environment Kit camera follows the project; request a different camera explicitly in the prompt. Kit pieces are placed over Materials, not used as deterministic terrain donors or guaranteed seamless brushes. projectId is REQUIRED — the project supplies gameType, which decides how the art is drawn, and keeps the asset findable in the web app. A fan-out create returns one jobId — the asset ids appear in get_job as gridAssetIds once the job finishes. Environment Kit has NO per-tile edit path: revising a terrain asset regenerates the whole sheet. DEFAULTS TO A PLAN + COST PREVIEW — see dryRun. Returns { jobId, assetId } — poll get_job, then call get_asset. Generated atlases are cut by logical foreground objects, not trusted row geometry; get_asset exposes extraction status/warnings.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name (defaults to the prompt).
slugNoStable handle used by every /assets/:id call ([a-z0-9-]). Auto-derived from the name when omitted.
styleNoOverride the project's art style for this asset only.
bgTypeNoREQUIRED for assetType "background" — prefer scene (one opaque full scene), distant_backdrop (one opaque far vista), depth_layer (one scenery layer with transparent gaps), or foreground_overlay (transparent edge framing). All four support every camera. One image per call, no automatic parallax pack, collision/navigation or verified seamless repeat. Angled top-down and strict overhead stay distinct; atmospheric vistas need no forced isometric geometry. Preserve project style. Legacy values remain view-specific: platformer → parallax_far/parallax_mid/parallax_near/platform_scene/static_backdrop/scrolling_backdrop; topdown + topdown_overhead → ground_fill/overhead_map/functional_map/scrolling_floor/parallax_underlay; isometric → iso_ground/iso_scene/iso_far/iso_platform_surface; point_and_click → full_scene/room_stage/parallax_strip/platform_scene_front/vista_backdrop. A mismatch, or omitting it, is rejected with 400. Each sub-type runs a different tuned prompt, so this decides what KIND of image you get — a far parallax sky and a functional platform scene are not interchangeable. Ask the user which layer they want if their request does not make it obvious.
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
promptYesWhat to generate. Describe the subject, not the art style — style comes from the project.
gridColsNoLegacy compatibility only; the confirmed plan decides columns.
gridRowsNoLegacy compatibility only. The confirmed semantic plan owns layout. Object Collection and Environment Kit never add items just to fill cells.
tileSizeNoTERRAIN only — output tile size in px (64, 128 or 256).
assetTypeYes`static` = Object (formerly Static Asset), four separately editable design alternatives by default (explicit one supported); each may also be animated; tileset = Object Collection, one coordinated set of independently editable items; staged = one subject in N progressive stages (the input animate_asset expects); background = scenery, never a game object; terrain = Environment Kit, individually placed props, surface details or connecting modules; texture = Terrain Material, brushable fill/surface donors (wire names unchanged; editor topology is deterministic).
planTokenNoREQUIRED when dryRun=false. Copy unchanged from the immediately preceding dry-run response.
projectIdYesREQUIRED. Owning project (create_project / list_projects). Supplies gameType + default style.
bgViewTypeNoBACKGROUND only — which view the background is drawn for. Defaults to the project gameType.
imageModelNoOverride the image model for non-Material assets. Materials use the server-owned MATERIAL_IMAGE_PRIMARY provider route.
runtimeUseNoOBJECT only (`assetType: "static"`; formerly Static Asset). Material is locked to deterministic brush rendering server-side. Declares how the art is meant to be rendered — particle_emitter, deformable_strip, nine_slice or shader_effect — which changes the prompt AND the export metadata. Anything other than plain_image on a non-Object type is rejected. path_follow remains accepted for legacy clients but must not be used for new assets; path motion is configured per placement in the level editor. It can also be set later with set_asset_runtime_intent, for free.
aspectRatioNoBACKGROUND 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 preselects. Only pass a value if the user asked for a specific shape. 21:9 is the widest and 9:16 the tallest the image model accepts.
perspectiveNoEnvironment Kit only — legacy three-value camera override. Omit to retain the project’s distinct side, angled top-down, overhead, isometric or adventure camera; request finer camera changes in the prompt.
textureKindNoLEGACY compatibility only. New Materials derive platformer/topdown/isometric projection from the project gameType; this value does not change their donor contract.
idempotencyKeyNoOptional 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 double-dispatch.
targetTileSizeNoOutput tile side in px (16-512).
referenceAssetUrlsNoUp to 4 reference image URLs to condition the generation. URLs only — raw base64 is rejected on this surface.
backgroundResolutionNoBACKGROUND only — output tier (default 2K). 4K costs more.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only say readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, so the description carries the behavioral burden and does so extensively: the dry-run default, planToken invalidation rules, credit cost tiers, automatic background removal and fallback, terrain's lack of per-tile edit path, and the fact that atlases are cut by logical foreground objects rather than row geometry. This goes well beyond annotation coverage. It loses a point for not addressing rate limits or idempotency retry nuances beyond the schema's idempotencyKey note.

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

Conciseness2/5

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

The description is extraordinarily long — several hundred words — and heavily redundant with the input schema. The assetType enum's schema description already explains each type, yet the prose re-explains each in detail. Multiple behaviors (no grid-filler, no automatic animation, camera conventions) are restated across different type sections. The critical dry-run/plan-token flow is front-loaded, which is good, but the sheer volume of repetition means many sentences fail to earn their place.

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 complex tool with 22 parameters, 6 asset types, and a two-phase dry-run/confirm flow, the description is remarkably complete. It specifies the return shape ({ jobId, assetId }), the polling handoff (poll get_job, then get_asset), the preview requirement, extraction warnings on get_asset, credit quoting, and per-type default behaviors. Despite no output schema, an agent has everything needed to drive the full lifecycle correctly.

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 100%, so the baseline is 3, but the description adds meaningful interplay context beyond the schema: dryRun defaults to true and returns only a quote, planToken is required when dryRun=false and must be copied unchanged, bgType is REQUIRED for background and mismatches get rejected with 400, assetType 'static' defaults to four design alternatives, and idempotencyKey should be reused when retrying ENTITY_BUSY/402/429. This enriches the structured field definitions rather than repeating them.

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

Purpose4/5

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

States a specific verb and resource — 'Creates a NEW asset from a prompt in any of the six types.' The opening line is clear about the core action and the asset-type taxonomy (static, tileset, staged, background, terrain, texture) distinguishes it from siblings like create_character, create_project, and create_ui_composition. It loses a point because the purpose is buried under a very long preamble about paid calls and dry runs before the type breakdown, and sibling differentiation is implicit rather than explicit.

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

Usage Guidelines3/5

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

Provides substantial usage flow guidance: defaults to dry run, show the preview to the user, re-call with dryRun:false after approval, poll get_job then get_asset. It also tells the user to ask which layer they want when bgType is ambiguous. However, it never explicitly contrasts with alternatives like revise_asset or import_asset_image, nor states when NOT to use this tool versus those siblings — the when-to-use is implied by the workflow narrative, not stated as a routing decision.

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

create_characterCreate a characterAInspect

PAID (standard 1K: 60 credits; 2K: 100; 4K: 150; premium models may differ). 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. Artwork is strictly text-free by default: no labels, captions, lettering or pseudo-text; only specific intrinsic writing explicitly requested by the user is permitted. 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. BY DEFAULT it requests FOUR DESIGN VARIATIONS FOR THE SAME PRICE, matching the dashboard. Set generateFourVariations:false only when the user explicitly wants one character. gridRows:2 + gridCols:2 remain the legacy trigger for the same four-character mode; one image call is split by complete character silhouettes, never fixed cells. Four is the expected count, but any result with at least two separate silhouettes succeeds; every clearly separated full character is preserved whether two, three, or more than four are found. Zero or one means the sheet was not extractable and refunds. Show the user every result 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 defaults from the project but can be overridden for this character. Use topdown for the Top-Down Angled character pipeline, including characters intended for isometric projects. Passing isometric is accepted as an alias and creates a topdown character because that is the measured working directional pipeline. The STORED CHARACTER gameType — not the project gameType — controls every later animation and whether a user-facing 360 turn is available. A topdown character inside a platformer project therefore keeps the top-down directional pipeline and supports generate_character_turn. DEFAULTS TO A COST PREVIEW — see the dryRun argument.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleNoArt-style override. Omit to inherit the project's style — usually correct, since a project should look consistent.
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
promptYesWhat the character is, e.g. "a plague doctor with a lantern". Describe the subject, not the art style.
gameTypeNoCharacter perspective override. Omit to inherit the project. Use topdown for Top-Down Angled and isometric projects; isometric is mapped to topdown. The stored value controls later animation behavior and 360-turn eligibility.
gridColsNoLegacy equivalent of the default four-variation mode: set to 2 together with gridRows:2; extraction follows complete silhouettes.
gridRowsNoLegacy equivalent of the default four-variation mode: set to 2 together with gridCols:2. This is not cut geometry.
projectIdYesREQUIRED. The project the character belongs to — it supplies the default gameType and style.
imageModelNoOverride the image model. Omit unless the user asked for a specific one.
cameraAngleNoCamera elevation in degrees — only meaningful for angled top-down projects.
idempotencyKeyNoOptional 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 double-dispatch.
characterImageSizeNoAspect ratio of the generated image. Omit for the game-type default.
referenceAssetUrlsNoURLs of existing images to steer the design. URLs only — base64 is rejected by the API.
generateFourVariationsNoDefaults to true, matching the dashboard: one image call produces four design variations for the cost of one. Set false only when the user explicitly requests a single character.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only cover readOnlyHint/openWorldHint/idempotentHint/destructiveHint; the description adds substantial behavioral context beyond them: exact credit costs, text-free generation policy, image-only output, four-variation default extraction rules, refund on zero/one silhouettes, return shape { jobId, expectedCharacterCount }, polling expectations, and the dryRun cost-preview default. Nothing contradicts annotations, and it discloses side effects like spending and character persistence.

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

Conciseness4/5

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

The description is long but every sentence carries critical operational detail (costs, extraction rules, dryRun flow, animation separation). It is front-loaded with cost and purpose. Slight room to tighten redundancy around the four-variation mode, but no filler; the density is justified by the tool's complexity.

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 13-parameter tool with no output schema, the description covers all essential call aspects: prerequisites, cost/approval flow, output contract, polling, error/refund conditions, variation mechanics, and gameType's long-term effects. An agent has everything needed to decide, invoke, and interpret the result without supplemental documentation.

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

Parameters5/5

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

Schema coverage is 100%, but the description enriches many parameters: dryRun's confirmation flow and re-call pattern, gameType's topdown/isometric alias and stored-value consequences, gridRows/gridCols as legacy silhouette triggers rather than geometry, generateFourVariations default behavior, referenceAssetUrls rejecting base64, and idempotencyKey retry safety. This goes well beyond the baseline and materially improves correct invocation.

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?

The description explicitly states 'Generate a NEW character from a text prompt' and positions it as the entry point for building art from nothing. It distinguishes create_character from create_project (must come first), generate_character_animation, and generate_character_turn, making sibling differentiation clear.

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?

The description gives direct when-to and when-not-to guidance: call create_project first if no project exists, use separate animation tools only when the user explicitly wants animation because of cost, set generateFourVariations:false only on explicit user request, use topdown for isometric projects, and default to dryRun and ask for confirmation. These instructions remove ambiguity about routes and alternatives.

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

create_projectCreate a projectAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProject name shown in the dashboard.
styleNoOptional art-style id applied as the default for generations in this project.
gameTypeYesREQUIRED 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; point_and_click = straight-on adventure scenes. Ask the user if it is not obvious — it changes every prompt downstream.
styleGuideNoReviewed palette, rendering and typography. Saved as active revision 1 for future generations; font IDs must belong to the available catalog. Omit to create without a guide.
descriptionNoOptional project description. Feeds the prompt context for later generations.

TDQS

A4.3/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: it is FREE, synchronous (no jobId, so don't poll), and as a side effect seeds a starter level map for immediate preview rendering. Annotations cover safety flags but say nothing about cost, sync-vs-async behavior, or side effects, so this disclosure is genuinely additive. Minor gap: no mention of permissions or the shape of the created object.

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

Conciseness4/5

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

Front-loads the two highest-value facts (FREE, SYNCHRONOUS/don't poll) before explaining purpose and the list_projects prerequisite. Four sentences, all earning their place, though slightly dense.

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

Completeness4/5

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

For a create tool with no output schema, annotations present, and full schema coverage, the description covers purpose, cost, sync behavior, side effects and a prerequisite. The only omission is what the call returns (e.g. a project id to use downstream), which is a modest gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents name, style, gameType, styleGuide and description in detail. The description adds only the downstream consequence of gameType ('decides how they are drawn and animated'), which the schema also conveys. Baseline 3 is appropriate when structured data carries the parameter burden.

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 verb and resource ('Creates') and immediately characterizes the project as 'the container everything else needs', explaining its role relative to sibling create_asset/create_character. An agent can distinguish this from get_project/list_projects without opening any schema.

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 operating instructions: 'Call list_projects first — reuse an existing project rather than making a near-duplicate' and 'do not poll'. It names the alternative tool and the condition under which to prefer it, leaving nothing to inference.

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

create_ui_compositionAssemble UI componentsBInspect

Create a free static composition of existing icon/frame revisions; indicators and functional widgets remain independent. No new image generation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
widthYes
heightYes
packIdYesOwned UI Pack ID.
childrenYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare non-read-only, non-idempotent, non-destructive, open-world behavior. The description adds genuine scope context, that this is a static composition with no image generation and that indicators/functional widgets stay independent, plus the cost signal "free." It omits permission/ownership requirements and what happens on repeat calls.

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

Conciseness4/5

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

A single dense sentence front-loads the operation and its key constraint. Efficient, though the semicolon-joined clauses make it slightly harder to parse than two short sentences would.

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

Completeness2/5

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

For a five-required-parameter creation tool with 20% schema coverage and no output schema, the description leaves major gaps: how children are laid out or ordered, whether overlaps are valid, ownership/permission prerequisites, and the consequences of composition. It states what the tool is not (image generation) better than what it requires.

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

Parameters2/5

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

Schema description coverage is only 20% (packId and componentId only; name, width, height, children, and bounds are undocumented). The description's "existing icon/frame revisions" lightly hints at what children reference, but it adds no meaning for the 8-item child limit, bounding rules, or dimension constraints.

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

Purpose4/5

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

States a specific verb and resource ("Create a free static composition") and constrains the input to "existing icon/frame revisions" with "No new image generation." That implicitly separates it from generative siblings such as generate_ui_pack, though no sibling is named outright.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: compose from existing revisions, and don't use this when new imagery is required. There is no explicit when-to-use/when-not framing and no named alternative (e.g., generate_ui_pack) to route an agent toward.

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

create_ui_packCreate UI PackAInspect

Create an empty project-owned UI Pack with its guide snapshot. Free; generation is a separate quoted action.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
projectIdYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations cover the safety profile (write, non-destructive, non-idempotent, open-world). The description adds useful behavioral context beyond annotations: the pack is empty, includes a guide snapshot, and the action is free while generation incurs a separate quoted cost. It does not cover authentication or rate limits, but that is less critical given the annotations.

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?

Two short sentences, front-loaded with the core action and followed by the cost/scope clarification. No wasted words and the most important distinction (free creation vs. quoted generation) is immediately visible.

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

Completeness4/5

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

For a simple two-parameter creation tool with annotations and no output schema, the description covers purpose, scope, and cost. The only missing piece is parameter-level guidance, but the schema supplies required fields and types, so the definition is largely sufficient for an agent to invoke it correctly.

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

Parameters2/5

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

Schema description coverage is 0% and the description does not explain either parameter. 'Project-owned' weakly hints at projectId, but the 'name' parameter and its constraints are entirely undocumented in the description, so it fails to compensate for the schema gap.

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?

The description states a specific verb (Create) and resource (UI Pack) and clarifies it is an empty pack with its guide snapshot. It also distinguishes this from generation by noting generation is a separate quoted action, which helps separate it from the sibling generate_ui_pack.

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

Usage Guidelines4/5

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

The description gives clear context: this creates an empty pack for free, while generation is a separate quoted action. It implies use when you want a free empty pack rather than a paid generation, but it never names the alternative sibling tool or states an explicit exclusion.

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

duplicate_animationDuplicate an animationAInspect

FREE, synchronous, no AI. Make an exact copy of the CURRENT saved animation under a new slug, preserving its selected frame order, loop/hold settings, compositing, mounts, and rendered pixels. The original is untouched. Returns { jobId: null, animation }; do not poll a job.

ParametersJSON Schema
NameRequiredDescriptionDefault
newIdNoSlug for the copy ([A-Za-z0-9_-], default "<source>_copy").
animationYesSource animation slug.
characterIdYesCharacter id.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, it reveals that the operation is synchronous and AI-free, that the original is untouched, and that it returns { jobId: null, animation }, so the agent should not poll. This is substantial behavioral context not present in the annotations.

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?

The description is brief, front-loaded with the most important constraints, and every clause adds value—cost/sync/AI status, exact-copy semantics, original untouched, and response contract.

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 3-parameter tool with complete schema coverage, the description supplies the return shape, job behavior, side effects, and key constraints. It gives the agent enough to select and invoke the tool correctly without an output schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents characterId, animation, and newId. The description reinforces that the copy is made from the current saved animation and under a new slug, but adds little parameter-level meaning beyond that.

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?

The description uses a specific verb and resource: 'Make an exact copy of the CURRENT saved animation under a new slug' and lists preserved properties. It clearly distinguishes duplication from generation or mirroring alternatives.

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

Usage Guidelines4/5

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

The description gives clear context: FREE, synchronous, no AI, exact duplication of the current saved animation. It also explicitly says not to poll a job, but does not name alternative tools or state when-not-to-use conditions.

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

export_mapExport map (JSON)A
Read-onlyIdempotent
Inspect

Engine-ready map JSON built from the SAVED level data, preserving placement name/gameplayId and baking custom-field values. Every engine retains materialRendering and materialRenderingResolved when present. Bundles include material-rendering.json and bake styled terrain/areas into PNGs: never apply shading twice or replace baked art with raw donor tiles. Pixel materials require nearest filtering without mipmaps; keep semantic terrain for gameplay. GameMaker uses the supplied tizo_draw_tile Draw helper; Tiled consumers configure filtering from metadata. All engine JSON exports retain materialAreas; bundles also retain semantic outlines in material-areas.json, alongside clipped artwork. Never render both as duplicate visuals. Phaser JSON materialAreaSource needs mask/blend rendering in URL mode, not the raw donor rectangle. For the zip bundle (per-tile PNGs, loader scripts, tileset files) use get_export_command instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
mapIdYesMap id.
engineNoTarget engine (default tiled). Unreal is a beta Paper2D artwork importer; native verification and gameplay integration remain pending.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as read-only and idempotent, and the description adds substantial behavioral context beyond that: it preserves placement IDs, bakes custom fields, retains materialRendering/materialAreas, bakes terrain into PNGs, and warns against double-shading or duplicate visual rendering. No contradiction with annotations.

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

Conciseness4/5

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

The description is dense and front-loaded with the core purpose, and every sentence carries technical caveats rather than padding. It loses a point for being somewhat sprawling and mixing high-level output semantics with detailed per-engine rendering warnings, which could be better organized.

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

Completeness4/5

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

With no output schema, the description carries the burden of explaining what the export contains, and it does so thoroughly: JSON fields, bundled files, per-engine behavior, and a clear alternative for zip outputs. It is quite complete, though the lack of a clean return-structure summary and a few audience-specific rules make it slightly harder to fully rely on.

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 100%, so the baseline is 3. The description adds value by explaining behavioral differences tied to engine choices, such as GameMaker using tizo_draw_tile, Tiled consumers configuring filtering from metadata, and Phaser requiring mask/blend rendering for materialAreaSource. This goes beyond the enum names, though it doesn't add much about mapId.

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?

The description clearly states a specific verb (export) and resource (map), and specifies the output as engine-ready JSON from saved level data. It also distinguishes itself from the sibling get_export_command by explicitly pointing to that tool for the zip bundle.

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?

The description provides direct usage routing: 'For the zip bundle ... use get_export_command instead.' It also gives engine-specific consumer guidance for GameMaker, Tiled, and Phaser, helping an agent know when this JSON-focused export is appropriate versus alternatives.

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

fix_asset_seamsFix a legacy texture's seamsAInspect

LEGACY ONLY; new Brushable Materials reject this operation because they use world-space sampling. PAID (60 credits per standard-model edit attempt; use the dry-run quote). Make an old texture tile seamless. Legacy textures were 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. Confirmed background-removal provider failures already fall back automatically on the server, without a new user charge. There is no daily removal retry lockout; honor reported cooldowns and unknown-task safeguards if recovery still fails. For already-authorized generation, automatically execute a zero-credit recovery quote and poll it; no renewed approval or refund. Never duplicate a running recovery. Limit automatic retries to two per failed job per session; stop on recurring failure or any paid quote. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
assetIdYesLegacy texture asset id or slug (not a Material with a material recipe).
iterationIdYesRevision (iteration) id to fix.
idempotencyKeyNoOptional 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 double-dispatch.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds substantial behavioral context: the operation defaults to a cost preview, lands as a new current revision, has automatic fallback for background-removal provider failures, has retry limits (two per failed job per session), and has no daily removal retry lockout. It also discloses the paid nature (60 credits) and the dryRun behavior. No contradiction with annotations.

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

Conciseness4/5

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

The description is dense and front-loaded with the most important constraint (LEGACY ONLY) and the cost warning. It covers many operational details in a compact block. It is long, but every sentence carries operational information an agent needs; the structure is a single block of imperative guidance rather than a clean list, which slightly hurts scannability.

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 paid, mutating, async operation with no output schema, the description is remarkably complete: it covers cost, dryRun, pre-checks, fallback behavior, retry limits, idempotency, and the return shape ({ jobId }). The only minor gap is that it doesn't describe the full output of the real (dryRun:false) call beyond jobId, but the description explicitly says 'Returns { jobId }', which is sufficient for polling.

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 description coverage is 100%, so the schema already documents all four parameters. The description adds value by explaining the dryRun default and the confirmation flow, and by clarifying that assetId must be a legacy texture asset, not a Material. It doesn't add much beyond the schema for iterationId or idempotencyKey, but the schema already covers those well.

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?

The description states a specific verb and resource ('Make an old texture tile seamless') and clearly distinguishes this from siblings by declaring 'LEGACY ONLY' and noting that new Brushable Materials reject the operation. It also names the related get_asset check, so an agent can tell this apart from convert_texture_to_material or reprocess_asset.

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?

The description gives explicit when-to-use guidance: check get_asset first, use the free seamMetric.pass verdict, and do not spend on a cell that already passes. It also explains the dryRun flow, when to re-call with dryRun:false, and when to avoid spending. This is far beyond a minimal usage note.

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

frame_animationAnimate a grid asset from its own tilesAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNoPlayback fps (1-30, default 12).
nameNoLabel for the animation (default "Frames").
assetIdYesAsset id or slug (must be a grid asset: tileset or staged).
iterationIdYesRevision (iteration) id whose tiles are the frames.
frameIndicesYesTile 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.

TDQS

A4.9/5.0
Behavior5/5

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

The description transparently discloses key behavioral aspects: it is free, uses no AI, no credits, no approval required. It explains how the animation is composited into a spritesheet and mentions the return behavior ('Returns a jobId — poll get_job'). This goes beyond annotations, which are sparse.

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?

The description is well-structured: opens with the key differentiator (FREE, no AI), explains the mechanism, lists examples, gives usage guidance, and closes with the return value. Every sentence earns its place without being overly verbose.

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?

With no output schema, the description covers return value (jobId) and specifies how to poll. It also provides sufficient context for a 5-parameter tool, including prerequisites (tiles exist, grid asset) and destination (every engine). The alternative tool is named, making the context complete.

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 100%, so parameters are already described. The description adds semantic value, particularly for frameIndices, explaining that repeats allow holding or ping-ponging a frame. It also reinforces assetId must be a grid asset, though this is in the schema as well.

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?

The description clearly states the tool's purpose: animate a grid asset by using its tiles as frames. It uses specific verbs and resources, and explicitly differentiates from sibling animate_asset by mentioning 'Try this before animate_asset whenever the motion already exists across the tiles.'

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?

Provides explicit usage guidance including when to prefer this tool over animate_asset, with concrete examples (coin flip, flickering torch, chest opening). Also states the condition 'whenever the motion already exists across the tiles', effectively telling when not to use it.

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

generate_character_animationGenerate character animationsAInspect

PAID, and the cost MULTIPLIES BY THE NUMBER OF ANIMATIONS (each is its own image-to-video call; Wan 3.0 costs 150 credits/second, so its default 2-second clip is 300 credits). All frames are text-free by default: no subtitles, captions or invented writing. 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); the project gameType is irrelevant after character creation. A topdown character inside a platformer project still uses top-down prompts and directional behavior. A name that already exists is NEVER replaced: the server allocates the next numeric slug (walk → walk_2 → walk_3), and the returned animations list contains the resolved names. Ask the user which animations they want before spending: 4 animations cost 4x. For a topdown character, resolve the animation direction mode BEFORE choosing those animation names. Read animationDirection from get_character and preselect its Luna-classified mode; let the user override it. Pass animationDirectionMode on both the dry run and confirmed request: overhead uses one engine-rotated sprite with base action names and no 360; four_direction uses S/N/E/W rows with FREE four-pose image setup; eight_direction also uses diagonals and keeps the regular 360 video setup (+200 credits when newly needed). Overhead setup is free; animation videos are priced separately. Setup and Luna run only after animation generation is confirmed; the server creates the poses and automatically assigns matching facings without pose approval for four_direction, then continues animation generation. Poll all operation jobs while queued or running; an approved directionalPoseReview is a completion record, not a user checkpoint. The chosen mode is saved on the character. A missing classification is not permission to guess silently. Every animation defaults to 2 seconds, including walks, runs, attacks, and loops. Omit animDurations and customAnims[*].duration unless the user explicitly asks for a different clip length; never infer a longer duration from the motion or from the fact that it loops. If the character came from a successful 2x2 create, there may be two, three, four, or more 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. The server uses the standard pose-aware animation pipeline for new requests; there is no flag argument to set. When the user wants stored poses as the actual video endpoints, call list_character_poses and pass their ids through poseFirstFrameIds / poseLastFrameIds. Omit those maps to let the server plan anchors automatically; never pass a pose URL. Before each new clip the server classifies the effective anchor as empty-handed, held, or unclear and adds the matching inventory-preservation lock automatically; there is no inventory argument to send. For platformer walk/run, the server-created cached mid-walk anchor pose is FREE; explicit pose generation remains paid. For eight-direction and legacy video-based topdown/isometric clips with targetFacings, automatic planning uses one cached standing internal 360 rotation for every action, including custom actions; its one-time surcharge is included in the dry-run quote. Do NOT call generate_character_turn merely to prepare an animation — that explicit visible turn is a separate action. When that internal 360 is needed, the job pauses at waiting_approval before any animation video starts. Present directionalPoseReview from get_job and call approve_directional_poses only after the user accepts the full set, including explicit confirmation to use any candidates they did not review individually. The dry-run response includes animationPipelineAssignmentToken; copy it verbatim into the confirmed call so the quoted pipeline decision cannot change while the user is deciding. If it expires, run the same dry-run again. The same response includes preflight with per-animation resolved names, durations and credits; setup and total credits; model resolution; runtime frame size; and explicit unknown-until-generated frame count/FPS/ETA. Show that structured preview instead of inventing precision. API-key calls can use the account's full wallet balance; the dashboard-only 600-credit limit and its first-animation exception do not apply. The independent key spend cap, paid-attempt ceiling, and ordinary wallet balance still apply. Returns { jobId, animations, operations, rejectedOperations? }; jobId is the first operation only for backward compatibility. Poll, retry, or cancel every operations[].jobId independently. When an operation reaches done, it returns an animationQualityGate requiring get_character; finish that review/repair loop before exporting or saying the animation is ready. 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. Check isTemplate on that entry: false means YOUR text is what is long, so shorten it; true means the shipped template is over the ceiling and no prompt you send can fix it — report it rather than retrying. DEFAULTS TO A COST PREVIEW — see the dryRun argument.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
animationsYesAnimation slugs to generate, e.g. ["walk_right","idle"]. REQUIRED — each one is a separate paid video call.
videoModelNoOverride the video model.
animPromptsNoPer-animation extra guidance, keyed by animation slug. Folded into that animation's composed prompt.
characterIdYesCharacter id.
customAnimsNoDefine animations that are NOT part of the game type's standard set, keyed by the new slug.
mirrorAnimsNoFREE 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.
animDurationsNoUSER-REQUESTED OVERRIDES ONLY (2-10s). Omit this field by default: every animation, including walks and loops, defaults to 2s. Never choose a longer clip unless the user explicitly requested that duration. Longer clips cost more.
targetFacingsNoCamera-relative facing per animation slug (n, ne, e, se, s, sw, w, nw). Omit for overhead; four_direction accepts only n/e/s/w. Use this for custom actions and any standard action whose slug does not itself encode the intended direction.
idempotencyKeyNoOptional 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 double-dispatch.
poseLastFrameIdsNoOptional per-animation END anchor pose ids, keyed by animation slug. Resolve ids with list_character_poses and use only status:"done" poses. The same pose id may be used for both endpoints of a loop.
poseFirstFrameIdsNoOptional per-animation START anchor pose ids, keyed by animation slug. Resolve ids with list_character_poses and use only status:"done" poses. Omit an entry to let the server choose/generate its anchor.
animationDirectionModeNoChoose this BEFORE selecting animations for a topdown character and pass it on dry-run plus confirmation. Preselect get_character.animationDirection.mode when present (Luna suggestion; user may override). overhead uses one rotatable true-overhead sprite, base action names, and no 360; four_direction uses S/N/E/W animations; eight_direction also uses NE/SE/SW/NW. The confirmed choice is saved on the character.
animationPipelineAssignmentTokenNoOpaque server proof returned by this tool's dry-run. Copy it verbatim into the confirmed dryRun:false call; never create or edit it. If the server reports ANIMATION_PIPELINE_ASSIGNMENT_EXPIRED, preview again.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the annotations, revealing that this is a paid, credit-multiplying operation, that existing animation slugs are never replaced but the server allocates numeric suffixes, that dry-run defaults to a cost preview, that setup and Luna classification run only after confirmation, that directional approval may be required, that animations default to 2 seconds, and that PROMPT_TOO_LONG can occur before charging. No annotation is contradicted, and the description provides the full behavioral context an agent needs.

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

Conciseness4/5

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

The description is long, but every major section earns its place given the 14 parameters, the expensive and asynchronous nature of the operation, and the need to coordinate with sibling tools and user approvals. It front-loads the most critical information—cost multiplication, text-free output, and the difference from create_animation_from_pose—before diving into workflow details. It is not a model of brevity, and a tighter structure with headings would help, but for this complexity it is appropriately dense rather than padded.

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?

The description covers the full lifecycle: cost preview, user confirmation, direction mode resolution, naming behavior, per-operation jobs, polling, directional approval, pipeline token handling, wallet limits, error handling, quality gates, and the exact output shape. With no output schema present, the description carries that burden and does so thoroughly. An agent has enough context to invoke, verify, and recover from failures correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantial behavioral meaning to parameters: dryRun should be re-called only after explicit user approval, animDurations must be omitted unless the user requests otherwise, animationDirectionMode must be passed on both dry-run and confirmation and preselected from get_character, animationPipelineAssignmentToken must be copied verbatim, and poseFirstFrameIds/poseLastFrameIds must be resolved through list_character_poses. This goes beyond the schema's field-level descriptions and materially improves correct invocation.

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?

The description names the exact operation—generating character animations—and pins it against siblings: it is real motion rather than the 1-frame still from create_animation_from_pose, and it is not the separate visible-turn action generate_character_turn. This gives an agent a precise, differentiable purpose.

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?

The description explicitly says when to use this tool, when not to use it, and which alternatives to call instead: use it for any real motion including walk cycles and attacks, do NOT use create_animation_from_pose for 1-frame stills, do NOT use generate_character_turn merely to prepare an animation, and use list_character_poses when the user wants stored poses as video endpoints. It also warns to ask the user before spending and to poll jobs, giving an agent a clear invocation policy.

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

generate_character_turnGenerate a 360 turn animationAInspect

PAID (200 credits — ONE 2-second rotation video), except retrying the exact failed job is FREE while its provider task/result or validated stored source survives. The default dry run reports 0 credits and recovery:"stored_artifact" in that case; confirmation revives the same job and never starts another paid provider task. 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). Eligibility reads the STORED CHARACTER gameType, not its project: a topdown character inside a platformer project is supported. This explicit visible turn is separate from the internal mid-walk rotation that generate_character_animation may plan for eligible directional walk/run clips; do not call it as mandatory setup for every animation. Lands as the animation "turn", or "turn_" when seeded from a pose. An existing turn is NEVER replaced: an occupied name becomes turn_2, turn_3, and so on. It 409s (ENTITY_BUSY) while ANY other job is running on the character, because it rebuilds the spritesheet: poll that job first. Returns { jobId, animation, resumed } — poll get_job. A successful standalone 360 finishes at done after its animation is rebuilt; it does not open the directional-pose approval checkpoint. Only an internal 360 planned by generate_character_animation pauses for directionalPoseReview before dependent animation videos start. If a retained provider URL is repeatedly proven expired, support may set discardPendingResult:true and preview again; that explicit escape abandons the stale result and is a new paid generation. DEFAULTS TO A COST PREVIEW — see the dryRun argument.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
seedPoseIdNoRotate a specific DONE pose instead of the character's default image. Lands as "turn_<poseId>".
characterIdYesCharacter id.
idempotencyKeyNoOptional 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 double-dispatch.
discardPendingResultNoSupport escape hatch only: true abandons a repeatedly expired/unusable failed provider result and previews/starts a new paid turn. Omit for normal free recovery.

TDQS

A5/5.0
Behavior5/5

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

The description discloses behavior far beyond the annotations: paid 200-credit cost, free retry semantics, 409 ENTITY_BUSY, never overwriting existing turns (turn_2/turn_3), no directional-pose approval checkpoint for standalone calls, and the discardPendingResult escape hatch. There is no contradiction with the annotations.

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?

The description is long, but it is front-loaded with the most critical operational facts (cost, dry run, free retry) before moving through purpose, eligibility, naming, concurrency, output, and edge cases. Every sentence carries substantive guidance needed to invoke the tool correctly; the density is appropriate for the tool's complexity.

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?

There is no output schema, but the description specifies the return shape ({ jobId, animation, resumed }) and tells the agent to poll get_job. It also covers errors, busy states, eligibility, retries, cost, naming collisions, and checkpoint behavior. Nothing essential for correct invocation is missing.

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

Parameters5/5

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

Although the schema already documents all five parameters, the description adds crucial per-parameter behavioral context: dryRun defaults to true and returns a quote; seedPoseId controls the resulting animation name; idempotencyKey must be reused on specific retries to prevent double-dispatch; and discardPendingResult is a support-only escape that abandons a stale result and triggers a new paid generation.

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?

The description clearly states the verb and resource: it spins the character through a full 360 and lands an animation named 'turn' or 'turn_<seedPoseId>'. It differentiates this from generate_character_animation's internal mid-walk rotationasia and states eligibility explicitly (topdown and isometric only). An agent can tell exactly what this tool produces and how it differs from related siblings.

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?

The description gives precise when-to-use guidance: only for topdown/isometric characters, not for platformer/point_and_click, and not as mandatory setup for every animation. It also names the sibling alternative (generate_character_animation) and clarifies the dryRun-first confirmation flow, plus when to poll get_job on ENTITY_BUSY.

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

generate_poseGenerate a character poseAInspect

PAID (standard 1K: 60 credits; 2K: 100; 4K: 150; premium models may differ). 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesShort pose name, e.g. "casting".
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
imageModelNoOverride the image model.
characterIdYesCharacter id.
idempotencyKeyNoOptional 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 double-dispatch.
poseDescriptionYesWhat the character should be doing, e.g. "kneeling, shield raised".
referencePoseIdNoSeed from an existing DONE pose instead of the base image.

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses significant behavior beyond the annotations: credit costs, the dryRun default that changes the call's behavior, the { poseId } return, and the absence of a jobId requiring polling. This is exactly the behavioral context an agent needs and none of it conflicts with the annotations.

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?

Three sentences deliver cost, default behavior, return shape, and completion-polling instructions with no filler. The most decision-relevant facts (paid, dryRun default) are front-loaded.

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 paid, no-output-schema tool with a nonstandard dryRun flow, the description covers the essential workflow: pricing, preview behavior, execution, result shape, and polling. The parameters are fully covered by the schema, so nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already thoroughly documents dryRun, idempotencyKey, and the other parameters. The description does not add new parameter-level meaning; it merely references dryRun and the polling workflow, so the baseline of 3 is appropriate.

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?

The description states a specific verb, resource, and input: "Generate a new pose for a character from a text description." It is clearly distinguishable from sibling tools like generate_character_turn or generate_character_animation, and it adds the concrete result shape ({ poseId }).

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

Usage Guidelines4/5

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

The description gives clear operational context: this is a paid generation call, defaults to a dry-run cost preview, and must be polled via list_character_poses because it returns no jobId. It does not explicitly name alternatives or when-not-to-use conditions, but the intended use case is unambiguous.

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

generate_project_intakeTurn a game idea into a project foundationAInspect

PAID but very cheap and SYNCHRONOUS. Use this for a broad game vision, story, or mood before create_project. Returns a proposed project name, game type, art style, world description, creative guidance, and a validated styleGuide object ready to pass unchanged to create_project. It stores nothing and does not create assets. Afterward, inspect the game repository and propose an MVP art plan before any image or animation spend. Skip this tool when the user already supplied a complete project/style guide or asked for one specific asset. DEFAULTS TO A COST PREVIEW — see the dryRun argument.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
nameHintNoOptional working title. Explicit user choices win over inference.
styleHintNoOptional locked art direction.
referencesNo
descriptionYesThe game vision in the user's own words: story, mechanics, setting, mood, and audience.
gameTypeHintNoOptional locked gameplay camera/type.
idempotencyKeyNoOptional 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 double-dispatch.

TDQS

A4.3/5.0
Behavior5/5

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

The description adds significant behavioral context beyond the annotations: it is PAID, SYNCHRONOUS, stores nothing, creates no assets, and defaults to a cost preview via dryRun. It also explains the approval/re-call flow. No contradiction with the annotations is evident.

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

Conciseness4/5

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

The description is front-loaded with critical operational facts (cost, synchronous, default cost preview) and remains scannable. It is slightly redundant with the schema, but each sentence earns its place overall.

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

Completeness4/5

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

With no output schema, the description compensates by naming the returned artifacts (project name, game type, art style, world description, creative guidance, validated styleGuide) and explaining the dryRun cost-preview flow. It lacks explicit error/limit handling, but the essential invocation context is present.

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

Parameters3/5

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

Schema coverage is high at 86%, and the schema already documents each parameter thoroughly. The description adds little parameter-level detail beyond calling out the dryRun default, which is also in the schema, so it does not substantially compensate beyond structured data.

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

Purpose4/5

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

The description clearly states the tool's job: turning a broad game vision into a reusable project foundation and returning a validated styleGuide. It positions itself as a pre-create_project intake step, but it does not explicitly differentiate itself from the similarly named sibling generate_project_vision.

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?

The description gives explicit when-to-use guidance ('broad game vision, story, or mood before create_project'), explicit when-to-skip conditions ('already supplied a complete project/style guide or asked for one specific asset'), and a recommended next step. This is strong routing behavior.

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

generate_project_visionGenerate a project creative briefAInspect

PAID but very cheap (one configured text-model 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWorking title of the game.
styleNoArt style, if the user already has one in mind.
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
gameTypeYesThe view the game is played in — the brief is written for it.
referencesNoUp to 6 tagged reference images the model can look at.
descriptionNoThe idea in the user's own words: setting, mood, mechanics.
idempotencyKeyNoOptional 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 double-dispatch.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint:false, idempotentHint:false, destructiveHint:false), the description adds critical behavioral details: it is PAID but cheap, SYNCHRONOUS with no jobId to poll, stores NOTHING, and defaults to a cost preview. These are not present in annotations and significantly help the agent understand side effects, cost, and execution model.

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

Conciseness4/5

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

The description is dense but every sentence adds value: cost/sync, output purpose, storage, and dryRun default are all front-loaded. It is longer than typical but justified by the tool's complexity. No redundant phrases.

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

Completeness4/5

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

The description covers output shape, cost model, sync behavior, storage, and the dryRun flow. It does not discuss error handling or edge cases, but for a tool with no output schema and given the schema covers parameters, this is adequate. It could mention alternatives to fully round out context, but that's more usage guidance.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all parameters. The description does not add extra parameter meaning beyond what's in the schema (e.g., it references dryRun but the schema already explains it fully). The baseline of 3 applies since the description does not enhance parameter semantics.

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?

The description clearly states the tool 'turns a rough game idea into { aiVision, aiPromptGuidance, aiNegativeGuidance }' — a specific verb, resource, and output. It distinguishes from siblings like create_project and suggest_project_style by explaining its role in maintaining visual consistency, which is a unique purpose.

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

Usage Guidelines4/5

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

It provides clear context on when to use it (to generate a creative brief that feeds into create_project) and explains the dryRun flow for cost approval. However, it does not explicitly name alternatives or state when NOT to use it, so the differentiation from similar tools like suggest_project_style is left implicit.

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

generate_ui_packGenerate UI PackAInspect

Get a cost preview for an exact component list and batch breakdown, then generate using the returned signed quote. Every paid raster/SVG batch is 100 credits; one pack action can contain several batches. Fonts are free. Defaults to dry-run; never alter the quote.

ParametersJSON Schema
NameRequiredDescriptionDefault
quoteNoUnmodified signed quote returned by the dry-run. Required when dryRun is false.
dryRunNoShow the user estimatedCredits and ask whether to proceed, unless already authorized in this session. Prefer the client native question UI with Approve / Decline / Discuss choices; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or magic word. Then set false and supply the returned quote.
packIdYesOwned UI Pack ID.
requestNo
idempotencyKeyNoReuse the same key when retrying a confirmed request.

TDQS

A4/5.0
Behavior4/5

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

With annotations already conveying readOnlyHint=false and destructiveHint=false, the description adds genuinely new behavioral context: the 100-credit cost per paid raster/SVG batch, fonts being free, the dry-run default, and the do-not-modify-quote contract. This goes well beyond what the annotations alone disclose.

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?

Three sentences, each earning its place: the first front-loads the purpose and flow, the second explains the pricing/batch model, the third adds two critical constraints. No filler or redundancy.

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

Completeness3/5

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

This is a complex 5-parameter tool with nested objects, a two-phase quote flow, and no output schema, yet the description never describes what the dry-run returns (estimatedCredits, quote structure, batch breakdown shape) nor the explicit confirmation/consent step before generation (left to the dryRun parameter description). Purpose and pricing are well covered, but for this complexity the flow details are incomplete.

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?

With 80% schema coverage, the baseline is 3, but the description adds interaction-level semantics the schema lacks: how the quote relates to dryRun and request (dry-run produces a signed quote that must be passed back unmodified) and the batch-pricing model. It does not mention packId or idempotencyKey, but the schema already covers those fields.

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

Purpose4/5

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

The description states the core flow with a specific resource: get a cost preview for a UI pack component list, then generate using a signed quote. The dry-run/quote mechanism clearly distinguishes it from siblings like create_ui_pack or get_ui_pack, though it never names an alternative explicitly.

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

Usage Guidelines4/5

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

The first sentence gives an explicit invocation pattern: preview first, then generate with the returned signed quote. 'Defaults to dry-run' and 'never alter the quote' add clear constraints on how to call correctly. However, it does not name when-not-to-use cases or alternative siblings.

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

get_assetGet assetA
Read-onlyIdempotent
Inspect

One asset with its revision iterations and typed animation projection. Accepts the asset id OR its slug. New Material assets use the wire-compatible texture type and expose a typed material block containing the versioned donor recipe and its platformer, topdown, or isometric projection. Legacy textures may instead carry metadata.seamless.seamMetric and support fix_asset_seams. Generation Contract assets expose generationPlan plus extraction. extraction.status:"exact" means the planned number of logical foreground objects was recovered; "recovered" means small detached decorations were safely grouped; "needs_review" preserves every detected object and carries a warning instead of silently deleting or inventing one. grid.tiles[].url returns each extracted object as its own transparent PNG; the grid is a rebuilt presentation layout, not the geometry used to cut the model output. Legacy assets without extraction retain their historical fixed-grid metadata and should still be reviewed with the old grid fields. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesAsset id or slug.

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the readOnly/openWorld/idempotent annotations, the description adds significant non-obvious behavior: extraction statuses ('exact', 'recovered', 'needs_review') explain whether objects were consolidated, applied, or preserved with a warning. It also warns that grid.tiles[].url is 'a rebuilt presentation layout, not the geometry used to cut the model output' and tells agents to read the background block back when aspectRatio was unset. This prevents misinterpreting output as original file structure.

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

Conciseness4/5

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

The description is front-loaded with the core result ('One asset with its revision iterations') and then systematically covers variants, extraction statuses, grid semantics, and backgrounds. Every sentence adds meaningful detail, but the dense single-paragraph structure with many clauses makes it slightly harder to scan at a glance. Still, there is no filler or repetition.

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?

There is no output schema, so the description must carry the return-shape burden and does ensure the agent knows what to expect: Material typed material block, legacy seamless metadata, Generation exact, generationPlan/extraction statuses, grid tiles as transparent PNGs, and the background block for confirming aspect ratio. It also notes legacy asset behavior when extraction is absent. That is enough to make the tool call correctly without an output schema.

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

Parameters3/5

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

The input schema already provides a description for assetId as 'Asset id or slug', and schema coverage is 100%. The tool description only restates 'Accepts the asset id OR its slug' without adding constraints, formats, or examples. Since the schema carries the full parameter meaning, no additional parameter semantics are needed and 3 is the baseline.

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?

The description explicitly states 'One asset with its revision iterations and typed animation projection', naming a specific verb/resource combination and its main output. It also makes clear the lookup uses 'asset id OR its slug', which distinguishes this tool from sibling getters like get_map or get_character and from list_assets. This is specific and unambiguous.

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

Usage Guidelines3/5

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

The description never explicitly says 'use this for a single asset lookup; use list_assets to enumerate or other getters for other resources'. The intended use is only implied by the phrase 'One asset' and 'Accepts the asset id OR its slug'. Conditional clarifications (Material vs legacy vs Generation Contract) describe output semantics, not when to choose this over a sibling, so there is no explicit when-not guidance.

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

get_characterGet characterA
Read-onlyIdempotent
Inspect

The full PhaserCharacter JSON: animations, frameSize, gameType, animationDirection, per-group atlas + spritesheet URLs, poses and mount points. For topdown characters, animationDirection is Luna's saved mode suggestion or the user's last override; preselect it before asking for overhead, four-direction, or eight-direction animation generation. The top-level animationQualityGate is the delivery verdict per animation: ready:true means its deliveredIssues list is empty; needs_review means follow its actions before claiming the animation is ready; unscored means inspect the frames because no machine score can certify it. Check collision automatically: while an animation plays use animations[activeName].collisionBody before the character-level collisionBody; while displaying a pose use pose.collisionBody first. Fall back to a bbox only when the resolved body is absent. Bodies are normalized to the FULL untrimmed frameSize — never subtract atlas spriteSourceSize/alpha-trim offsets. Every binary URL is presigned and expires in ~1h — download immediately, never store or commit one. The in-app preview exercises shared export data, but validate the downloaded bundle and its supplied loader in the target engine before shipping.

ParametersJSON Schema
NameRequiredDescriptionDefault
characterIdYesCharacter id.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context beyond that: presigned URLs expire in ~1h, the in-app preview may differ from the downloaded bundle, and the top-level animationQualityGate semantics (ready/needs_review/unscored) are explained. It also discloses the collision-body resolution order and the normalization to full untrimmed frameSize. No contradiction with annotations.

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

Conciseness4/5

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

The description is dense but every sentence earns its place: it front-loads the return payload, then covers usage guidance, quality gates, collision resolution, coordinate normalization, URL expiry, and validation caveats. It is longer than a typical description, but the tool is complex and the content is high-signal. A small amount of redundancy (e.g., 'download immediately, never store or commit one') could be tightened, but the structure is logical.

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 read-only getter with one parameter and no output schema, the description is remarkably complete. It covers the return payload, the meaning of quality gates, collision-body resolution, coordinate normalization, URL expiry, and the preview-vs-bundle caveat. An agent has everything it needs to call the tool and interpret the result correctly.

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

Parameters3/5

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

Schema coverage is 100% and the only parameter, characterId, is documented in the schema. The description doesn't add parameter-level detail beyond what the schema provides, but with a single required string parameter there is little more to say. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

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?

The description opens with a precise inventory of what the tool returns ('full PhaserCharacter JSON: animations, frameSize, gameType, animationDirection, per-group atlas + spritesheet URLs, poses and mount points'), which clearly distinguishes it from sibling getters like get_character_manifest or get_asset. The verb 'get' plus the named resource and the explicit content list make the purpose unmistakable.

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?

The description gives explicit when-to-use guidance: preselect animationDirection before asking for directional animation generation, follow needs_review actions before claiming readiness, and check collision bodies in a specified order. It also tells the agent what not to do (never subtract atlas offsets, never store/commit presigned URLs). This is far beyond a minimal 'use this to fetch a character' statement.

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

get_character_manifestGet character manifestA
Read-onlyIdempotent
Inspect

The self-describing export contract (tizo-export.json manifest + its JSON Schema) without downloading the zip. Use this to learn the Phaser integration shape and field meanings before wiring an export into a game project. Its files[] is a logical canonical inventory, not an exact archive listing; use get_export_command and read the downloaded zip's tizo-export.json when exact shipped contents matter.

ParametersJSON Schema
NameRequiredDescriptionDefault
characterIdYesCharacter id.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds valuable context beyond annotations: it clarifies that the files[] array is a logical canonical inventory, not an exact archive listing, and that this tool avoids downloading the zip. This is meaningful behavioral nuance that helps an agent interpret results correctly.

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?

Two sentences with no filler. The first sentence states the deliverable and the download behavior, the second explains usage and the key caveat with an alternative. Information is front-loaded and each sentence earns its place.

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 single-parameter read-only tool with rich annotations, the description fully covers what the tool returns, why to use it, and the important caveat about files[]. The absence of an output schema is mitigated by the description naming the manifest and JSON Schema. Nothing essential is missing for correct invocation.

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

Parameters3/5

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

The input schema covers the single parameter characterId with a simple description. With 100% schema description coverage, the description adds little beyond the schema, and none is strictly needed for this straightforward parameter. Baseline 3 is appropriate.

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?

Description states exactly what the tool returns: the tizo-export.json manifest plus its JSON Schema, without downloading the zip. It explicitly frames the purpose as learning the Phaser integration shape and field meanings, and distinguishes itself from get_export_command for exact archive contents. This is a specific verb+resource with clear sibling differentiation.

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?

The description gives direct usage guidance: use this to learn integration shape before wiring an export into a game project. It also names get_export_command as the alternative when exact shipped contents matter, and explains the files[] limitation. This is explicit when-to-use and when-not-to-use guidance.

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

get_creditsGet credit balanceA
Read-onlyIdempotent
Inspect

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. API-key calls can use the account's full wallet balance; the dashboard-only 600-credit experiment and its activation exception do not apply. freeCreditLimit therefore reports applies:false with exemptionReason:"api_key". Two remaining walls 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax items to return (default 100, max 500).
apiKeyIdNoFilter ledger entries to one key (UUID).
includeLedgerNoAlso return recent ledger entries.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark it read-only, open-world, idempotent, and non-destructive, so the description adds substantial behavioral context beyond those hints: the 402 response carries topUpUrl, the 403 carries capSettingsUrl, freeCreditLimit reports applies:false with exemptionReason:'api_key', and the cap cannot be edited via API. This is valuable non-obvious behavior an agent needs to act correctly.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and is dense rather than padded. It is long, but nearly every sentence contributes decision-relevant guidance about balance vs. cap, error responses, and user communication. It could be trimmed slightly without losing value, but it remains well organized.

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 read-only billing tool with no output schema, the description is unusually complete: it covers response semantics, error-code behavior, the freeCreditLimit exception, and the exact decision path for insufficient balance versus daily cap. An agent has enough information to call the tool and interpret the result correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3; the schema already documents limit, apiKeyId, and includeLedger. The description adds some context by explaining that ledger entries carry apiKeyId/apiKeyName, which deepens the meaning of filtering, but it does not materially compensate for or add to the individual parameter semantics.

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?

The description opens with 'Current credit balance, and optionally the recent ledger,' which identifies the exact resource and the two modes of the call. It also clarifies that ledger entries carry apiKeyId/apiKeyName, making the tool's specific value distinct from generic getters like get_subscription_allowances.

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?

The description is explicit about when to call it: 'Check the balance before proposing any paid generation.' It also gives conditional guidance depending on the result, including what to say when the balance is short, and distinguishes a balance shortfall from a daily spend cap trip. No alternative tool is needed because the description fully covers when this read is appropriate.

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

get_custom_fieldsGet custom field definitionsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesWhich entity table to read.
entityIdYesCharacter id, or asset id/slug.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds that definitions are read-only and that values are on get_map, which is useful behavioral context. However, beyond this definitions-vs-values distinction, it does not disclose much additional behavior not already covered by annotations.

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?

The description is three sentences, all informative: what it returns, where values live, and how definitions are edited. No filler or redundancy, perfectly front-loaded.

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

Completeness4/5

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

The tool is simple with two parameters, so the description covers the essential context (definitions vs. values, builtins, dashboard editing). Since there is no output schema, it could be more explicit about the response structure, but the high-level description is sufficient for this low-complexity tool.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters have descriptions. The description adds that kind selects 'character or asset' which aligns with the schema enum, but does not significantly deepen understanding beyond the schema. Baseline 3 is appropriate.

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?

The description clearly states it returns typed custom-field definitions for characters or assets, which is a specific verb+resource. It also distinguishes itself from siblings like get_map (which carries per-placement values) and get_character/get_asset (which likely return the full entity).

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

Usage Guidelines4/5

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

The description explicitly contrasts with get_map and mentions that definitions are edited in the dashboard. This gives clear when-to-use guidance and exclusions, though it does not explicitly say 'use this when you need definitions', but it's strongly implied.

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

get_export_commandGet export download commandA
Read-onlyIdempotent
Inspect

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. Phaser character exports may select size 512, 256, 128, or 64; the selected sheet/atlas pairs keep canonical size-agnostic filenames. Sparrow XML is character-only: preserve the bundle's Sparrow prefixes and multisparrow assetPath routing. This tool exports whole characters, not a dashboard single-animation selection. Requires SPRITESHIP_API_KEY to be set in that shell.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoPhaser character exports only — narrow the zip to one downscale variant. Godot, Unity, GameMaker, Unreal and Sparrow XML use full-resolution source frames; omit size for them.
engineYesTarget engine. "fnf" is characters only and emits Sparrow PNG/XML plus character JSON. "tiled" is maps only; sprites have no Tiled emitter. "unreal" is beta Paper2D artwork/flipbook import, not automatic gameplay or native-engine certification.
targetYesWhat to export.
entityIdYesCharacter id, asset id/slug, or map id.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool read-only, open-world, idempotent, and non-destructive, which is consistent. The description adds substantial behavioral context beyond those annotations: the need to execute curl externally, the API key requirement, size-variant filename behavior, Sparrow prefix routing, and the whole-character scope. It fully discloses what the agent must know before invoking it.

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?

The description is front-loaded with the core outcome and then delivers dense, high-value constraints without filler. Every sentence contributes operational or scoping information an agent needs, from shell execution to engine-specific export behavior. It earns its length through content density rather than wordiness.

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?

With no output schema, the description correctly explains what the tool returns: a download URL and a curl command line. It also covers prerequisites, export scope, engine-specific restrictions, and filename behavior. Nothing essential for correct invocation appears to be missing.

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 description coverage is 100%, so the baseline is 3 even without additional parameter detail. The description adds meaningful nuance beyond the schema, such as size-agnostic canonical filenames for Phaser sheet/atlas pairs and Sparrow prefix/multisparrow assetPath routing rules. It effectively complements the structured parameter descriptions.

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?

The description uses a specific verb and resource: it builds an authenticated download URL and ready-to-run curl line for zip exports. It clearly scopes the tool to character, asset, and map bundles, and distinguishes it from single-animation dashboard exports. The behavior is unambiguous even among many sibling tools.

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

Usage Guidelines4/5

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

The description gives explicit operational guidance: run the curl in your own shell, requires SPRITESHIP_API_KEY to be set, and warns that multi-MB zips must not be passed through the model. It also clarifies that this exports whole characters rather than a single animation, but it does not explicitly name sibling alternatives like get_ui_pack_export_command.

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

get_framesGet animation framesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoMax thumbnail edge (default 256, cap 1024). "full" opts out of downscaling.
formatNo"sheet" returns one labeled contact sheet.
pairIdNoMotion pair id — required when target=assetPair.
targetYesFrames of a character animation, or of an asset motion pair.
indicesNoComma-separated frame indices to subset, e.g. "0,4,8".
entityIdYesCharacter id (target=character) or asset id/slug (target=assetPair).
animationNoAnimation slug — required when target=character.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent, so the description doesn't need to rehash safety. It adds valuable behavioral detail: output is presigned (URLs) and never inline base64, and the sheet is index-labeled. This goes beyond the structured annotations and helps set expectations about the response format.

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?

Two sentences, front-loaded with the core output type, and each clause earns its place. The contrast between inline base64 and presigned URLs is a critical constraint stated in a single phrase, and the sheet usage guidance is concise but complete.

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

Completeness4/5

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

Despite 7 parameters and no output schema, the description covers the key behavioral aspects: output format, presigned URLs, sheet semantics, and integration with select_frames. The schema handles parameter details, so the description doesn't need to enumerate every field. It lacks some detail on how indices and size interact, but this is adequately covered by the schema. Overall, sufficiently complete for the tool's complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds meaningful context around the format parameter (explaining the sheet's purpose) and the output nature (presigned), but doesn't materially enhance the understanding of other parameters beyond what the schema provides. Baseline 3 is appropriate.

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?

The description clearly states the tool's function: returning presigned per-frame thumbnails for character animations or asset motion pairs. It distinguishes itself from sibling tools by explicitly referencing select_frames as the intended downstream action, making its role in the workflow unambiguous.

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?

Provides explicit usage guidance: warns against inline base64, recommends format:"sheet" for judging whole captures, and names select_frames as the next step. This clarifies when to use this tool and how to choose between thumbnails and contact sheet, effectively covering both when and how.

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

get_integration_statusCheck SpriteShip skill updatesA
Read-onlyIdempotent
Inspect

Free advisory version check. Call once when starting SpriteShip work in a session, passing the version actually read from the installed skill; omit it when unknown. Report an available update with its release summary and manual update guide once, then continue compatible work. Unknown is not outdated; never downgrade a newer local copy. Does not install files, grant permissions, spend credits or require an update.

ParametersJSON Schema
NameRequiredDescriptionDefault
installedSkillVersionNoStable major.minor.patch version from the installed SpriteShip instructions; omit for unversioned or unknown copies.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description goes beyond these by adding critical behavioral context: 'Free advisory version check' (no cost), 'Does not install files, grant permissions, spend credits or require an update' (clarifies side-effects), and 'Report an available update ... once' (confirms idempotency in a specific way). It also clarifies that 'Unknown is not outdated' and never downgrades, which is safety-relevant. No contradictions with annotations.

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?

The description is efficient and well-structured. It opens with the core purpose ('Free advisory version check'), then immediately gives usage instructions, followed by edge-case clarifications and a list of what it does not do. Every sentence adds value; there is no fluff or redundancy. The structure is front-loaded with the most important information.

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?

Given the tool's simplicity (one optional parameter, no output schema), the description is complete. It covers when to call, how to construct the call, what to expect (report update once), constraints (no downgrade, unknown is not outdated), and side-effects (none). An agent has everything needed to invoke this tool correctly without further inference.

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

Parameters3/5

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

The schema covers 100% of the parameter with a detailed description including pattern and usage guidance. The description repeats the 'omit when unknown' instruction but adds no new semantic information beyond what the schema already provides. With full schema coverage, baseline 3 is appropriate; the description does not need to compensate.

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?

The description states a specific verb ('check') and resource ('SpriteShip skill updates'), and clearly indicates it is an advisory version check. It distinguishes itself from sibling tools like get_credits or get_project by focusing on update detection, and it specifies exactly what it does not do (install, grant permissions, spend credits). This is a clear, non-tautological purpose.

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?

The description explicitly instructs when to call: 'Call once when starting SpriteShip work in a session' and how to handle the parameter: 'passing the version actually read from the installed skill; omit it when unknown.' It also clarifies edge cases: 'Unknown is not outdated; never downgrade a newer local copy' and states to report updates only once. This is explicit, actionable guidance with no ambiguity.

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

get_jobGet job statusA
Read-onlyIdempotent
Inspect

Poll a background job. Every write tool that returns a jobId is polled here. On status:"error" the response is enriched with failureKind, failureAction, attempt-scoped creditsRefunded, retryCost, retryMode, and retryRecovery. If failureAction is edit_input, change the prompt or reference inputs and create a new generation instead of calling retry. 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. IMPORTANT FOR CHARACTER ANIMATION JOBS: status:"done" means processing finished, not that the animation is ready. The response carries animationQualityGate.status:"check_required" with the affected animationNames; you MUST call get_character and resolve each affected animation until its gate is ready (or report that it needs review). Do not export, sync, or claim completion before this check. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesJob id.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses critical behavioral details: queued:true means not started and no cost incurred, terminal statuses include a credits block, and it mandates reporting credits.net and balance. It also warns against quoting pre-flight estimates and attaching purchase suggestions, which are non-obvious side effects not covered by annotations.

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?

The description is long, but every sentence carries essential operational detail—polling cadence, failure handling, credit reporting, animation quality gate, and cost reporting rules. It is front-loaded with the core purpose, then progressively adds necessary nuance without redundancy. No filler exists.

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?

Given the lack of an output schema, the description thoroughly covers all response-handling requirements: interpreting queued status, handling error enrichment, reporting credits, and checking animation quality gates. It leaves no ambiguity about what the agent should do with the tool's result.

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

Parameters3/5

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

The sole parameter jobId is fully described in the schema as 'Job id.' The description adds context that write tools return this ID, but the parameter meaning itself is already clear from the schema. No additional semantic depth is needed for such a trivial parameter, so baseline 3 is appropriate.

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?

The description clearly states the tool polls a job and explicitly ties it to every write tool that returns a jobId. It differentiates itself from sibling tools like retry_job and cancel_job by focusing on status retrieval, giving a specific and unambiguous purpose.

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?

It provides explicit when-to-use guidance: poll after write operations, poll every few seconds, handle terminal states, and avoid retry when failureAction is edit_input. It also instructs when not to claim completion (animation quality gate) and how to handle credits reporting, covering both usage and non-usage scenarios.

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

get_mapGet mapA
Read-onlyIdempotent
Inspect

A map row plus its saved level data. Every placement has an immutable internal id and may have a user-authored mapData.materialRendering v1 snapshots the art style with optional profile, edgeMode and pixelSize overrides. Preserve it; it affects materials only, never geometry/physics. Hard edges suppress feathering without deleting saved blend widths. Absent settings retain original appearance. materialArea v1 visual fill: preserve its closed shape, material revision, repeatSize and blendWidthPx (inherits layer materialAreaBlendPx, default 16). Areas imply no swimming, damage or collision. Terrain layer can contain both materialGrid cells and materialArea objects: draw cells first, then shapes in array order. Honor materialArea.hidden. Terrain stays above Background and below object layers. Each placement can have a name plus map-unique gameplayId for game-code references; layers, Navigation paths, and per-placement custom-field values are included. Terrain materialGrid cells include elevation and continuous ramps; appearance.elevationShading (0–1, default 0.35) controls slope lighting, opaque cliff shading, and height-edge cues together, not collision. Zero disables all elevation lighting. Cell dimensions are authoritative; editor grid guides are not saved. Returns mapData:null when the map has never been saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
mapIdYesMap id.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the read-only nature is covered. The description adds useful behavioral context beyond annotations by stating that returning mapData:null when the map has never been saved, and also clarifies that several values are immutable or must be preserved on round-trip. This provides edge-case and usage information that the annotations do not.

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

Conciseness4/5

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

The description is long, but the tool has no output schema, so it must document a fairly intricate payload. It is front-loaded with a high-level identity and then escalates from simple facts about immutability to more specialized rendering and gameplay details. While some details could arguably live in a schema, the description is not bloated with unrelated information.

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?

Because no output schema is present, the description itself must explain enough for an agent to know what the map will contain. It covers the map row, saved data, the materialRendering state, terrain materialGrid, navigation, custom fields, z-order, elevation rules, cell constraints, and the null case. That is a high level of completeness for a 1-parameter, read-only fetch tool.

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

Parameters3/5

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

The schema already documents mapId as 'Map id.' with 100% coverage, so the description does not need to restate it. It adds nothing technical beyond the phrase 'map row,' so the parameter retains the baseline meaning already supplied by the schema.

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?

The description names a specific resource ('A map row plus its saved level data') and itemizes the distinct kinds of data it returns: gameplayId, custom-field values, terrain, materialRendering, and Navigation paths. This clearly separates it from sibling fetch tools like get_asset or get_project and from list_maps, which returns a list rather than a full saved-map payload.

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

Usage Guidelines3/5

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

The description clearly covers what the tool returns, so an agent can infer this is the correct tool for fetching one map's full saved state. However, it never explicitly states when to use it instead of list_maps or get_project, nor does it say anything about retrieving only metadata or confirming a map's existence. Usage is implied rather than directly instructed.

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

get_projectGet projectA
Read-onlyIdempotent
Inspect

One project with its description, registered mount slots, and saved style guide. The legacy assetSuggestions field is currently always null because automatic suggestions are disabled; do not poll for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject id.

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already indicate read-only, idempotent, and non-destructive behavior, so the description adds value by warning that the legacy assetSuggestions field is always null and should not be polled. This is a concrete, non-obvious behavioral detail beyond what annotations provide.

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?

Two sentences with no filler: the first front-loads the main purpose, and the second adds a targeted warning. Every clause earns its place.

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

Completeness4/5

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

For a single-parameter read-only tool with no output schema, the description names the main returned elements and flags a stale field. It does not describe error or not-found behavior, but annotations already cover the safety and idempotency profile, making this sufficient for typical use.

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

Parameters3/5

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

Schema coverage is 100% for the single projectId parameter, and the schema already says 'Project id.' The description adds no new parameter-level semantics, but none are needed here.

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 clearly that the tool returns a single project and names its contents: description, registered mount slots, and saved style guide. This distinguishes it from siblings like list_projects and get_project_style_guide.

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

Usage Guidelines3/5

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

The phrase 'One project' implies this is for fetching a single project, but there is no explicit when-to-use guidance or mention of alternatives. With a get_project_style_guide sibling available, the description could be clearer about not using this tool for style-guide-only needs.

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

get_project_style_guideRead project style guideB
Read-onlyIdempotent
Inspect

Read the current guide; old projects without an adopted guide receive an initial suggestion. Existing assets retain their saved guide versions.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, openWorld and non-destructive traits, so the bar is lower. The description still adds real behavioral context: old projects without an adopted guide get an initial suggestion, and existing assets retain their saved guide versions, which is meaningful fallback and versioning behavior beyond the annotations.

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

Conciseness4/5

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

Two tightly written sentences with the primary action front-loaded and edge cases following. No filler, though the structure is a touch terse for the edge-case behavior it packs in.

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

Completeness3/5

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

No output schema exists, so the description carries the burden of explaining the return, and it only vaguely describes what a 'guide' or 'initial suggestion' contains. It handles edge-case behavior well but leaves the shape of the returned guide unspecified.

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

Parameters2/5

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

With schema description coverage at 0%, the description must compensate for the undocumented projectId parameter, but it never mentions it. The parameter name is self-explanatory, which prevents a 1, but no format, scope, or meaning is added.

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

Purpose4/5

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

States a specific verb and resource ('Read the current guide'), and the mention of 'initial suggestion' implicitly distinguishes it from suggest_project_style and save_project_style_guide. It is clear what the tool returns, though it doesn't name the sibling alternatives outright.

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

Usage Guidelines3/5

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

The description implies the read context and notes the fallback for old projects, but gives no explicit when-to-use guidance or direction toward suggest_project_style or save_project_style_guide. Usage is inferable rather than stated.

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

get_subscription_allowancesGet enabled subscription allowancesA
Read-onlyIdempotent
Inspect

Read the currently enabled subscriber benefits and their separate monthly limits, caps and balances. Disabled benefits return zeroed values and cannot be used. Unused units accumulate up to three monthly grants while the feature is enabled. These are not generation credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses meaningful runtime behaviors: disabled benefits return zeroed values and are unusable, unused units accumulate up to three monthly grants while enabled, and the values are not generation credits. This is valuable, non-obvious context.

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, each carrying essential information, with the core purpose front-loaded. There is no filler, repetition of the title, or irrelevant detail.

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 parameterless read-only tool, this description fully equips an agent: it explains what is returned, how disabled benefits are represented, accumulation behavior, and what the data is not. Nothing essential is missing.

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?

There are no parameters, so the schema has nothing to document and the baseline is 4. The description adds useful semantics about what the response covers (limits, caps, balances) and how disabled benefits behave, which compensates for the absence of an output schema.

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?

The description clearly states a specific action ('Read') and a specific resource ('currently enabled subscriber benefits') and distinguishes this from generation credits. This makes the tool's purpose unmistakable even among many sibling tools like get_credits.

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

Usage Guidelines4/5

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

The description gives strong contextual guidance by stating what the tool reads and explicitly noting 'These are not generation credits,' which helps an agent avoid confusing it with get_credits. It does not name an alternative tool explicitly, but the boundary is clear enough for selection.

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

get_ui_packRead a UI PackB
Read-onlyIdempotent
Inspect

Read components, immutable revisions, capabilities, fonts and batch progress. Artwork URLs expire; native engine capability gaps are not successful tests.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds real behavioral context beyond them: artwork URLs expire, and native engine capability gaps should not be read as successful tests. These are non-obvious traits an agent would otherwise miss, though the second clause is terse and unexplained.

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

Conciseness4/5

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

Two tight sentences with no filler, and the returnable-content list is front-loaded ahead of the caveats. The caveat sentence is somewhat compressed and under-explained, which slightly dents readability but not length.

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

Completeness3/5

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

With no output schema, the description must carry the return-shape burden, and it only partially does so by listing content categories without indicating structure, pagination, or what an empty/errored pack looks like. Adequate but with clear gaps for a read tool whose output is not otherwise specified.

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

Parameters3/5

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

With a single required parameter and 100% schema description coverage ('Owned UI Pack ID'), the schema fully documents the input. The description adds no format, ownership, or scoping detail beyond what the schema already states, so the baseline 3 applies.

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

Purpose4/5

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

Names a specific verb (Read) and enumerates the resources returned: components, immutable revisions, capabilities, fonts, batch progress. This distinguishes it from write-side siblings like revise_ui_pack_png or create_ui_pack, though it never explicitly contrasts with the close read sibling get_ui_pack_batch.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives such as get_ui_pack_batch, get_ui_pack_batch_recovery, or list_ui_packs. The second sentence gives cautions about URLs and test outcomes, but not selection guidance or prerequisites.

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

get_ui_pack_batchRead UI Pack batchB
Read-onlyIdempotent
Inspect

Read one paid batch and retained source URL; provider completion does not prove usable component delivery.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.
batchIdYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety burden is covered. The description still earns credit by disclosing that a completed provider batch may not contain usable components and that a retained source URL is returned — semantic context an agent cannot get from annotations alone.

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

Conciseness4/5

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

A single compact sentence with the core action front-loaded. It is efficient, though 'paid batch' and the abrupt second clause compress meaning at the cost of clarity.

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

Completeness3/5

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

With no output schema, the description should carry return-value detail; it hints at a retained source URL but does not describe what a batch record actually contains. Combined with an undocumented batchId parameter, it is minimally adequate for a two-param read tool.

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

Parameters2/5

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

Schema coverage is only 50% — packId has a description ('Owned UI Pack ID.') but batchId has none anywhere. The description adds no syntax, format, or relationship information to compensate for that gap, so it must be scored below the 3 baseline that full coverage would grant.

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

Purpose4/5

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

States a specific verb (read) and resource (one UI Pack batch), plus an unexpected detail — the retained source URL — that tells an agent this returns more than just batch status. However, it never differentiates itself from close siblings like get_ui_pack or get_ui_pack_batch_recovery, and the phrase 'paid batch' is left unexplained.

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

Usage Guidelines2/5

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

The clause 'provider completion does not prove usable component delivery' is a caveat about the data, not guidance on when to pick this tool over get_ui_pack_batch_recovery or get_ui_pack. No when-to-use condition, no alternatives, and no prerequisites (e.g. required ownership) are given.

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

get_ui_pack_batch_recoveryInspect retained UI sheet for recoveryB
Read-onlyIdempotent
Inspect

Read original PNG dimensions, expiring image URL, source hash, and exact delivered/missing slots for an illustrated batch needing review. Inspect artwork before choosing crops.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.
batchIdYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so safety is covered. The description adds genuinely new behavioral context by flagging the image URL as 'expiring,' signaling that the returned resource is time-sensitive, plus the fact that slot delivery status is included.

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

Conciseness4/5

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

Two sentences, front-loaded with the returned data and followed by the usage trigger; every phrase carries weight with no filler. It could be marginally tighter but wastes little.

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

Completeness3/5

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

With no output schema, the description does outline the return payload, and annotations cover the safety profile, so an agent can call it. However it omits the undocumented batchId meaning and any mention of the recovery workflow context the name implies.

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

Parameters2/5

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

Schema coverage is only 50%: packId is documented ('Owned UI Pack ID.') but batchId has no description in the schema. The description does not explain batchId or the relationship between packId/batchId, so it fails to compensate for the coverage gap.

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

Purpose4/5

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

Specific verb (Read) plus a concrete return set: original PNG dimensions, expiring image URL, source hash, and delivered/missing slot counts. This clearly distinguishes it as an inspection tool from the plain get_ui_pack_batch sibling, though it never names that sibling to sharpen the contrast.

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

Usage Guidelines3/5

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

The clause 'Inspect artwork before choosing crops' supplies a sequencing trigger for using it, but there is no explicit when-not guidance and no alternative tools (e.g., get_ui_pack_batch, recover_ui_pack_components) are referenced for comparison.

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

get_ui_pack_export_commandDownload UI Pack commandA
Read-onlyIdempotent
Inspect

Return an authenticated curl command for a whole/selected UI Pack ZIP or component source. Run locally; never put multi-MB ZIP data into model context. Phaser has browser behavior coverage; Godot/Unity native acceptance is pending; GameMaker/Unreal deliver artwork, Tiled transports metadata. Recovery artworkOnly must be explicit.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNophaser
packIdYesOwned UI Pack ID.
artworkOnlyNo
componentIdsNo
sourceFormatNopng
sourceComponentIdNoOwned component ID within this pack.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive, but the description adds real behavioral context: the output is an authenticated curl command (auth requirement), it should not be piped into model context, and it gives an engine support matrix (Phaser full, Godot/Unity pending, GameMaker/Unreal artwork-only, Tiled metadata). Only the cryptic 'Recovery artworkOnly must be explicit' clause is left unexplained.

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

Conciseness3/5

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

Front-loaded with the core purpose, and every clause carries information, but the style is telegraphic ('Godot/Unity native acceptance is pending', 'Recovery artworkOnly must be explicit') and the dangling final sentence is hard to parse without opening the schema.

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

Completeness4/5

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

There is no output schema, and the description explains what is returned (an authenticated curl command), how to handle it, and the per-engine caveats. It is largely complete, though it does not say whether the command/token expires or how the component-source variant differs in the response.

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 description coverage is only 33%, so the description must compensate, and it does reasonably: 'whole/selected' maps to packId vs componentIds/sourceComponentId, 'ZIP or component source' maps to the archive vs source extraction paths, artworkOnly gets a usage rule, and engine differences are called out. sourceFormat is still left to the schema.

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

Purpose4/5

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

States a specific verb and resource: 'Return an authenticated curl command for a whole/selected UI Pack ZIP or component source.' This clearly scopes it to UI Packs and distinguishes it from get_ui_pack (metadata) and get_export_command (generic). It stops short of naming those siblings explicitly.

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

Usage Guidelines3/5

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

'Run locally; never put multi-MB ZIP data into model context' tells the agent how to consume the result, and 'Recovery artworkOnly must be explicit' implies a condition for that flag. However, there is no explicit statement of when to choose this tool over get_ui_pack, get_ui_pack_batch, or get_export_command.

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

import_asset_imageImport a transparent asset imageAInspect

Free imports: import ONE still PNG or WebP as an Object or Character. Unlimited for every account, including free users, with zero credits and no subscription or allowance check. Before uploading, tell the user: transparency required, one clear complete subject, clean edges, consistent project style and camera, no text/watermark, up to 10 MB and 4096px per side; recommend 256px or more except intentional pixel art. No videos, GIFs or animated files; upload does not remove backgrounds or fix quality. Set confirmed only after this notice and approval. For local files, prefer POST /api/v1/asset-imports multipart file/projectId/name/kind/requestId rather than passing large base64 through model context. Persist requestId for safe network retries.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
nameYes
confirmedNo
projectIdYes
requestIdYes
imageBase64Yes

TDQS

A4.2/5.0
Behavior5/5

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

The description adds meaningful behavior beyond annotations: imports use zero credits, no subscription or allowance check is performed, upload does not remove backgrounds or fix quality, and animated formats are rejected. It also clarifies the confirmed flag semantics and instructs persisting requestId for retries. This is rich, non-obvious context and does not contradict the readOnly, destructive, or idempotent hints.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and then moves logically through constraints, user-notice requirements, confirmation, transport, and retry behavior. It is dense but justifiable; minor redundancy such as 'Unlimited for every account, including free users' could be tightened without losing information.

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

Completeness4/5

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

The description covers the full invocation path: pre-upload notices, file format and size constraints, confirmation semantics, local-file transport choice, and requestId persistence for retries. Since there is no output schema, success and error response behavior is left implicit, which is the only material gap for a mutating import tool.

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?

With 0% schema coverage, the description compensates well: it maps kind to Object vs Character, explains when confirmed should be true, and advises against using imageBase64 for large local files in favor of the multipart endpoint. projectId and name are not explicitly defined, though they are named in the preferred endpoint and are relatively self-explanatory in context.

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

Purpose4/5

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

The description names a specific verb and resource: 'import ONE still PNG or WebP as an Object or Character,' so the purpose is immediately clear. It also communicates key constraints such as still images only and no animated files. It does not explicitly distinguish itself from sibling tools like create_asset or create_character, so it stops short of full sibling differentiation.

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

Usage Guidelines4/5

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

It gives strong usage context: imports are free and unlimited, the user must receive a transparency/quality notice before confirmation, and confirmed should only be set after approval. It also provides transport guidance, preferring multipart POST over large base64 for local files. It does not name an alternative tool or clearly state when a sibling such as create_asset should be chosen instead.

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

list_assetsList assetsA
Read-onlyIdempotent
Inspect

Assets (Object / Object Collection / staged / background / Environment Kit / Terrain Materials) with slug, hasAnimation, updatedAt, tags and favourite. Wire types remain tileset for collections, terrain for kits and texture for brushable materials. Object was formerly called Static Asset; its API type remains static. hasAnimation is data-derived: ANY asset type can carry an animation, so never infer it from the type.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCase-insensitive substring filter on the name.
slugNoExact slug match (a slug is an identifier — no partial hits).
typeNoFilter by asset type. Use `static` for Object (formerly Static Asset).
limitNoMax items to return (default 100, max 500).
projectIdNoRestrict to one project.

TDQS

A3.9/5.0
Behavior4/5

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

ReadOnly, idempotent, non-destructive hints are already in annotations dry; the description adds valuable behavioral details: exposed fields and the mapping of API wire types to semantic types, plus the critical warning that hasAnimation must never be inferred from asset type.

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

Conciseness4/5

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

The description is compact and information-dense. Each clause earns its place; the static-type and hasAnimation caveats prevent real misinterpretation. Minor USD: no explicit statement of return shape/order, but not required for this read-only list.

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

Completeness4/5

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

For a read-only listing tool, the description sufficiently clarifies type names and a tricky inference issue. It doesn't state default ordering or scope (e.g., project context), but the openWorld and projectId parameter capture the main filtering behavior.

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

Parameters3/5

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

The schema fully documents all five parameters with descriptions and a limit enum range. The description does not add parameter semantics beyond domain type mapping, so baseline 3 is appropriate.

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?

The description names the exact resource (assets), enumerates the asset categories included, and explicitly disambiguates legacy type names (e.g., collections remain `tileset`, kits as `terrain`, brushable materials as `texture`), making the tool's purpose unmistakable versus list_characters and list_maps.

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

Usage Guidelines3/5

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

The description explains what is returned and clarifies type semantics, but it never states when to prefer this over siblings like get_asset or how the list should be used. The guidance is implicit rather than explicit.

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

list_character_posesList character posesA
Read-onlyIdempotent
Inspect

All poses on a character: { id, name, prompt, status pending|done|error, url, direction, pendingSince, errorCode, creditsRefunded }. This is the poll target after generate_pose — pose generation has no job id. It is also the source of ready pose ids for generate_character_animation poseFirstFrameIds / poseLastFrameIds. A pose still pending long after pendingSince is stalled, not working.

ParametersJSON Schema
NameRequiredDescriptionDefault
characterIdYesCharacter id.

TDQS

A4.7/5.0
Behavior5/5

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

The description reveals that pose generation has no job ID, making this the correct polling mechanism, and explains the meaning of the status fields (pending, done, error) and the stall condition. This goes beyond the annotations, which only declare read-only and idempotent hints.

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?

The description is well-structured, with each sentence providing necessary context: field list, usage scenario, and stall warning. It is concise yet complete without any redundant or irrelevant information.

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?

Given the tool's role in the generation workflow, the description covers all necessary aspects: field enumeration, status semantics, integration with generate_pose and generate_character_animation, and troubleshooting guidance for stalled poses. It is fully self-contained for a user to understand when and how to use it.

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

Parameters3/5

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

The only parameter, characterId, is described in the schema as 'Character id.' The description adds no further meaning or context for this parameter, so it does not enhance understanding beyond the schema. Since schema coverage is 100%, a baseline of 3 is appropriate.

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?

The description clearly states the tool lists all poses on a character, enumerates the returned fields, and explains its role as the poll target after generate_pose and source for generate_character_animation, distinguishing it from related tools.

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?

It explicitly states when to use this tool: after generate_pose to poll for completion, and to fetch ready pose IDs for generate_character_animation. It also warns about interpreting 'pending long after pendingSince' as a stall, providing actionable guidance.

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

list_charactersList charactersA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCase-insensitive substring filter on the name.
limitNoMax items to return (default 100, max 500).
projectIdNoRestrict to one project.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context about contentVersion being an opaque change token that must not be parsed or ordered, plus a caching strategy. This goes beyond the annotations and enriches the agent's understanding of the tool's contract.

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?

The description is two tight sentences: the first lists the returned re-sync signals, the second states the persistence strategy. No filler or repetition. Every phrase carries meaning, and the most important info (contentVersion handling) is front-loaded. This is an example of efficient, high-signal writing.

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

Completeness4/5

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

With no output schema, the description bears responsibility for explaining return values, and it does: contentVersion, hasActiveJob, apiReady, pose/animation counts, tags, favourite. It also provides the important re-fetch strategy. It doesn't explicitly state that the result is a list or cover pagination, but the limit parameter handles that. Overall, it is complete for a read-only list tool with good annotations.

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

Parameters3/5

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

Input schema covers 100% of parameters with descriptions (name substring filter, limit with default/max, projectId restrict). The description adds no parameter-specific detail beyond what the schema provides, so the baseline of 3 applies. It does not mention parameters at all, but the schema is fully sufficient.

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

Purpose4/5

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

The description focuses on the re-sync signals returned for characters, which clearly implies this lists characters. The tool name and title explicitly say 'List characters', and the description distinguishes it from singular get_character by emphasizing the list with change tokens. However, the description lacks an explicit verb like 'lists' or 'returns', relying on context.

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

Usage Guidelines4/5

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

The description provides a clear usage pattern: 'Persist contentVersion per character and re-fetch only when it changes.' This tells the agent when to call the tool and how to use it efficiently. It does not explicitly mention alternatives like get_character for single-character retrieval, but the polling guidance is strong. There's no 'when not to use' exclusion, but the context is clear.

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

list_mapsList mapsB
Read-onlyIdempotent
Inspect

Level-editor maps with updatedAt and hasMapData. hasMapData:false means the map was never saved and cannot be exported.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax items to return (default 100, max 500).
projectIdNoRestrict to one project.

TDQS

B3.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral context beyond annotations by explaining the meaning of hasMapData:false (never saved, cannot be exported) and that maps include updatedAt, which helps an agent interpret the returned data. No contradictions.

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

Conciseness4/5

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

The description is very short: two sentences with no unnecessary words. However, it starts awkwardly as a noun phrase rather than a verb phrase, which slightly reduces clarity. Still, it avoids fluff and front-loads the key fact that this is about maps.

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

Completeness3/5

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

Given the tool's simplicity (2 optional params, no output schema), the description is reasonably complete but lacks an explicit statement that this tool returns a list/collection of maps. It does mention relevant response fields (updatedAt, hasMapData), but doesn't describe pagination or default behavior beyond what the parameter schema covers. The warning about hasMapData:false adds value but doesn't fully compensate for the missing 'list' framing.

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

Parameters3/5

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

Schema coverage is 100% and both parameters (limit, projectId) have descriptions in the schema. The tool description adds no parameter-specific information, so it doesn't improve on the schema. Thus, baseline 3 is appropriate.

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

Purpose3/5

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

The description is a noun phrase describing map properties ('Level-editor maps with updatedAt and hasMapData') rather than stating the action of listing maps. It doesn't use a verb like 'list' or 'retrieve', and while the title provides that, the description itself is vague about purpose. It also doesn't explicitly distinguish from siblings like get_map or export_map.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool vs alternatives. There's no mention of scrolling through maps, filtering, or that get_map might be more appropriate for a single map. The hasMapData note is about data semantics, not tool usage.

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

list_projectsList projectsA
Read-onlyIdempotent
Inspect

All of the user's projects: { id, name, gameType, style, itemCount, createdAt, updatedAt }. gameType (platformer / topdown / topdown_overhead / isometric / point_and_click) is the default perspective for new content — read it before generating anything. A character may override that default at creation; afterward its stored character gameType controls its own animation and turn behavior.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax items to return (default 100, max 500).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover read-only, open-world, idempotent, and non-destructive behavior. The description adds important hidden semantics beyond those annotations: gameType is the project-wide default perspective at creation, while a character's stored gameType later governs its own animation and turn behavior. No contradictions with annotations are present.

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?

Two compact sentences provide the full return shape and the key usage constraint without unnecessary filler. The most important facts about the default project gameType are front-loaded in the second sentence, just after the list definition.

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

Completeness4/5

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

For a simple list-only with one optional parameter and rich annotations, the description is nearly complete: output fields are listed and the critical gameType nuance is explained. The only missing element is explicit mention of pagination or truncation by the optional limit, but the schema already documents default 100 and max 500.

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

Parameters3/5

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

There is only one parameter, limit, and the input schema already fully documents it with description, default, minimum, and maximum; schema parameter coverage is 100%. The description itself adds no parameter-specific meaning, so the baseline of 3 is appropriate.

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?

The tool clearly returns all of the user's projects and explicitly lists the fields returned: id, name, gameType, style, itemCount, createdAt, updatedAt. This also differentiates it from sibling tools like get_project and list_assets by scoping the tool to the project resource set.

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

Usage Guidelines4/5

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

The description gives clear contextual guidance: it tells the agent to read project.gameType before generating anything because it is the default perspective for new content. It does not explicitly mention when to avoid this tool or name alternatives, but the sibling list and 'all projects' framing make the intended usage clear.

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

list_ui_fontsList UI fontsA
Read-onlyIdempotent
Inspect

Read the retained licensed Google Fonts catalog. Existing font selection, preview and export cost zero customer credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds billing behavior the annotations do not convey – that selection, preview and export are free of customer credits – which is genuine extra context, though return format and pagination remain undisclosed.

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?

Two short sentences, scope stated first, cost caveat second. No filler and nothing buried.

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

Completeness4/5

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

For a zero-parameter list tool with no output schema, the description covers what the tool returns and its cost profile. It stops short of describing the catalog's shape or ordering, a minor gap given the small surface area.

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?

Zero parameters, so there is nothing for the schema to document and this dimension defaults to the 4 baseline. No parameter-level meaning is required or missing.

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

Purpose4/5

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

States a specific verb+resource: 'Read the retained licensed Google Fonts catalog.' An agent knows exactly what is returned. It does not name a sibling or explain how it differs from other list_* tools, so it stays at 4 rather than 5.

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

Usage Guidelines3/5

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

The credit-cost note ('selection, preview and export cost zero customer credits') implies when this is cheap to call, but there is no explicit when-to-use guidance or named alternative. Usage is implied rather than stated.

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

list_ui_packsList UI PacksA
Read-onlyIdempotent
Inspect

List owned UI Packs, optionally within a project.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds one genuinely useful behavioral detail the annotations lack: results are scoped to packs the caller owns. It says nothing about result size, pagination, or ordering.

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?

A single short sentence carrying verb, resource, and both scope qualifiers with zero filler. Front-loaded and fully earned.

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

Completeness4/5

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

For a simple read-only list tool whose annotations cover safety and idempotency, the description is close to complete; the ownership scoping is the key bit an agent needs. Missing only return-shape/pagination context, and there is no output schema to cover it.

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

Parameters3/5

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

Schema description coverage is 0% for the single param projectId, so the description must compensate. Saying the listing is 'optionally within a project' does convey that projectId is optional and acts as a scope filter, which is real added meaning, but no format or expected value is given.

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

Purpose4/5

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

States a specific verb (List) and resource (UI Packs) plus scope (owned, optionally by project), which is enough to distinguish it from get_ui_pack and list_ui_fonts. It stops short of explicitly naming those siblings but the resource noun is unambiguous.

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

Usage Guidelines3/5

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

The 'owned' qualifier and 'optionally within a project' hint at when to use it, but there is no explicit when-to-use/when-not guidance and no reference to alternatives like get_ui_pack for a single pack. Usage is implied rather than stated.

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

mirror_animationMirror an animation horizontallyAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
animationYesAnimation slug to flip in place.
characterIdYesCharacter id.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (which already indicate non-idempotent and non-read-only), the description adds critical behavioral details: the flip is applied in-place, calling twice reverts the animation, frame count/order are preserved, and the return shape is { jobId, mirrored }. It also mentions cost ('FREE, no AI'), which is useful context not in annotations.

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?

The description is front-loaded with the critical info ('FREE, no AI'), then explains the action, the idempotency gotcha, the frame preservation, the alternative, and the return value. Every sentence earns its place; nothing is wasted or redundant.

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?

Given the absence of an output schema, the description explicitly states the return object and polling mechanism. It also covers the non-idempotency hazard and the workflow for keeping both directions. This makes the tool fully understood without needing extra documentation.

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

Parameters3/5

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

The schema already documents both parameters with clear descriptions (animation slug, character id) at 100% coverage. The description adds context about the effect on the animation (in-place, frame preservation) but does not introduce new parameter-level semantics beyond the schema, so the baseline of 3 applies.

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?

The description uses a specific verb ('flip every cached frame') and names the resource ('ONE animation'), clearly distinguishing it from siblings like duplicate_animation. It also gives a concrete use case ('get walk_left from walk_right'), making the tool's purpose immediately obvious.

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?

The description explicitly warns about non-idempotency ('call it once and check the result before calling again') and provides an alternative for preserving both directions ('call duplicate_animation first and mirror the copy'). This is direct when-to-use and when-not-to-use guidance.

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

phase_splitSplit an animation into game phasesAInspect

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[].phaseProposal — pass its phases through verbatim. Frame windows index the FULL capture. Returns { jobId, created } — poll get_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
phasesYes2-6 phase windows. animations[<anim>].phaseProposal from get_character usually supplies these verbatim.
animationYesSource animation slug (e.g. "jump").
characterIdYesCharacter id.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations indicate non-destructive (destructiveHint=false) but description adds crucial behavior: 'the source animation is untouched,' 'FREE, no AI,' and async returns via job polling. It also discloses that frame windows index the FULL capture, which is an important caveat for correct use.

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?

Every sentence delivers value: purpose, classic example, proposal hint, indexing note, and return contract. It is front-loaded with the core action and remains compact despite covering multiple important nuances.

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?

The tool is async (returns jobId), has a non-trivial input (phase windows), and relies on external context (phaseProposal). The description covers all of this: how to get proposals, indexing semantics, output shape, and polling guidance. No significant gaps remain.

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 covers 100% of parameters, so baseline is 3. The description adds meaningful semantics beyond schema: clarifies that frame windows are absolute indices into the FULL capture, and suggests phaseProposal as a verbatim source for the phases array. This elevates the score.

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?

The description states a specific verb+resource: 'Carve ONE multi-state clip into separate game-phase animations by frame windows.' It gives a concrete example (jump → crouch/rise/fall/land) and distinguishes this from other animation tools by emphasizing it splits one clip into multiple exportable animations.

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

Usage Guidelines4/5

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

The description clearly explains when to use this tool (multi-state clips needing game-phase separation) and provides the classic jump example. It even guides users to leverage phaseProposal from get_character. However, it doesn't explicitly mention alternatives or when not to use it, leaving room for minor ambiguity.

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

plan_syncPlan changed asset syncA
Read-onlyIdempotent
Inspect

Compare the versions in assets/spriteship/spriteship.lock.json with current SpriteShip state in one call. Returns unchanged/changed/unavailable per character, asset, map, or UI pack; exact animation frame-count/FPS/collision, revision, runtime-intent, map-shape and UI component summaries when the previous lock entry includes the snapshot returned by an earlier call; and explicit fetch/download/review-removal actions. Existing v1 lock files without snapshots still detect version changes, then upgrade by saving each returned snapshot. Requests may contain 100 entries; honor Retry-After if the weighted sync budget is reached. Never delete local files for an unavailable entity without user confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds substantial behavioral detail beyond that: it explains the conditional return of detailed summaries only when a snapshot is present, the upgrade path for v1 lock files, the explicit actions it plans (without executing them), and the safety constraint about local file deletion. It also discloses rate-limit handling via Retry-After, which is not implied by annotations.

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

Conciseness4/5

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

The description is dense but each sentence contributes meaning. It is front-loaded with the core purpose and then adds conditional behavior, upgrade notes, limits, and safety in a logical order. It is longer than typical, but the tool's complexity warrants the length. No redundancy or filler sentences.

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

Completeness4/5

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

For a complex planning tool with no output schema, the description covers the main return categories (unchanged/changed/unavailable, detailed summaries, actions), conditions for detailed summaries, legacy support, request limits, rate limiting, and safety. It doesn't describe the exact JSON response structure, but it lists the information types. Given the tool's complexity, this is a strong but not exhaustive coverage.

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?

The input schema itself contains descriptions for each property (id, kind, engine, version, snapshot, artworkOnly, componentIds), so the description doesn't need to repeat them. The description adds valuable semantics around the snapshot parameter: it clarifies that snapshots come from prior calls and enable richer summaries, and explains the v1 upgrade behavior. Since schema coverage is effectively complete, the description's additional guidance on when to provide snapshot and the limit of 100 entries justifies a high score.

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 verb and resource: 'Compare the versions in assets/spriteship/spriteship.lock.json with current SpriteShip state in one call.' It clearly distinguishes itself from individual getters and lists by being a bulk comparison that returns per-entity statuses. The mention of returning actions (fetch/download/review-removal) further clarifies its planning role.

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

Usage Guidelines4/5

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

Provides clear context for when to use this tool: for checking changed entities and planning sync actions. It implicitly contrasts with individual get_* tools by being bulk and comparative. It also gives operational guidance: honor Retry-After, request limit of 100 entries, and the safety rule about not deleting without confirmation. It doesn't explicitly name alternatives but the context is sufficient for an agent to decide.

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

rebuild_characterRebuild a character from its cached framesAInspect

FREE, no AI. Re-render one animation from its durable cached frames by passing animation. 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. Omit animation only for an explicit full-character maintenance rebuild. Exact pose-owned scale references make the targeted path sibling-independent; legacy captures retain their compatibility sizing fallback. Image-only characters return NO_ANIMATIONS_TO_REBUILD without creating a job. A targeted rebuild returns an operationId/jobId — poll get_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
animationNoAnimation slug to rebuild independently. Omit only to rebuild the whole character.
characterIdYesCharacter id.

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the annotations, it discloses that the operation is FREE and no-AI, that it cannot change art, that image-only characters return NO_ANIMATIONS_TO_REBUILD without creating a job, and that targeted rebuilds return an operationId/jobId to poll. This gives agents a strong behavioral model.

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

Conciseness3/5

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

The description is front-loaded with the core purpose and is reasonably sized, but it includes dense jargon like 'exact pose-owned scale references' and 'sibling-independent' that is unlikely to help an agent. Some sentences overlap with schema information and reduce conciseness.

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

Completeness4/5

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

Given the tool's complexity and lack of an output schema, the description covers the main use cases, response format, and an important edge case (image-only characters). It is not fully complete because it leaves some technical phrases vague and doesn't explain failure modes beyond the image-only case.

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

Parameters3/5

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

The input schema already provides 100% parameter description coverage, so the baseline is 3. The description adds some context around the animation parameter's optionality and full-character rebuild behavior, but it largely restates what the schema says and does not clarify parameter formats or constraints beyond that.

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?

The description clearly identifies the tool as a repair/refresh tool that re-renders an animation from durable cached frames, with a specific verb and resource. It differentiates itself from art-generation siblings by explicitly stating it never re-generates art and only repacks/normalizes frames.

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

Usage Guidelines4/5

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

It gives explicit conditions: use it when a sheet looks stale or wrong after edits, or after a previous rebuild failed. It also states when not to use it (to change art) and how to distinguish targeted vs full-character rebuilds, though it does not name an alternative tool by name.

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

recover_ui_pack_componentsRecover missing UI components for freeAInspect

Crop missing slots from a retained original PNG after visual review. No provider call or credit charge. Supply original-pixel rectangles and the current source hash; already delivered siblings remain untouched. Inspect validation after recovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
cropsYes
packIdYesOwned UI Pack ID.
batchIdYes
sourceHashYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false. The description adds meaningful non-structured behavior: no credit charge, no provider call, and that previously delivered siblings are preserved. The stale-source guard via sourceHash is implied but not explicitly explained as a failure mode.

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

Conciseness4/5

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

Four short sentences, each contributing something (action, cost, integrity guard, follow-up). Slightly clipped telegraphic style, but front-loaded and waste-free.

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

Completeness3/5

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

For a non-idempotent write tool with no output schema and only 25% schema coverage, the description covers cost and preservation behavior but omits what happens on hash mismatch, whether recovery is repeatable, and what the post-recovery validation check returns.

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

Parameters3/5

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

Schema description coverage is only 25%, so the description must carry weight. It clarifies that crop bounds are 'original-pixel rectangles' and that sourceHash must be 'current', but says nothing about packId, batchId, or the 0-7 index semantics of the crops array.

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

Purpose4/5

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

States a specific verb and resource: cropping missing slots from a retained original PNG. The phrase 'already delivered siblings remain untouched' implicitly separates it from siblings like revise_ui_pack_png and replace_ui_component_png, though no sibling is named explicitly.

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

Usage Guidelines4/5

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

Gives a clear triggering condition ('after visual review' of missing slots) and a follow-up step ('Inspect validation after recovery'), plus a cost rationale (no provider call or credit charge) that affects tool choice. It stops short of naming an alternative tool to use instead when the conditions don't hold.

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

regen_asset_pairRegenerate one asset motion pairAInspect

PAID (Wan 3.0 costs 150 credits/second: 300 credits at the default 2-second settings). 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
pairIdYesMotion pair id (from get_asset).
assetIdYesAsset id or slug.
videoModelNoOverride the video model.
motionPromptNoReplacement motion prompt for this take.
idempotencyKeyNoOptional 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 double-dispatch.
durationSecondsNoInforms the cost estimate only — the dispatched job uses the pair's own duration.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: it discloses the paid nature and cost rate, explains the dryRun cost-preview default, guarantees earlier takes are preserved (reinforcing destructiveHint=false), and states the return contract with polling guidance. No contradiction with annotations exists.

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?

The description is compact and front-loaded, leading with the PAID warning and cost formula. Every sentence earns its place: scope, preservation guarantee, dryRun default, and jobId return. The all-caps emphasis highlights the most action-relevant facts without bloat.

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 paid 7-parameter mutation tool with no output schema, the description covers the essential operational contract: single-pair scope, preservation of existing takes, cost preview default, required user approval, and the returned jobId with polling direction. Parameter details are already fully covered by 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 100%, so the baseline is 3. The description adds value by highlighting the dryRun default, tying the cost preview to the approval workflow, and clarifying that durationSeconds only informs the cost estimate. This meaningfully supplements the structured parameter descriptions.

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?

The description states a specific verb, resource, and scope: 'Re-run video generation for a SINGLE motion pair of an animated asset, leaving its other pairs alone.' It further distinguishes itself by explaining that the new take is an additional iteration and earlier takes are preserved, which separates it from broad regeneration or duplication siblings.

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

Usage Guidelines4/5

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

Clear context is provided: this tool is for regenerating exactly one motion pair while preserving other pairs, and it defaults to a cost preview before spending. It does not explicitly name alternatives or exclusions, but the scope condition is concrete and actionable.

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

rematte_animationFix an animation's edge artifacts (re-matte)AInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
animationYesAnimation slug to re-matte in place.
characterIdYesCharacter id.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations indicate readOnly=false, destructiveHint=false, idempotentHint=false, which are consistent with the description's statement that the cleaner version is kept only if it measures better, and that it can never make the animation worse. The description goes beyond annotations by detailing the matteRepair stamp semantics, the conditional keep, the unchanged motion, the async pattern (returns { jobId } and poll get_job), and the source video expiration failure. This rich context is not redundant with annotations and enhances transparency. No contradiction.

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

Conciseness4/5

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

The description is concise yet packed with valuable details: purpose, safety guarantee, retry behavior, failure mode, and return usage. It is front-loaded with the main action and condition. The opening 'FREE, no AI' may be slightly tangential but adds context about cost/technology. Overall, each sentence earns its place, though the density could be overwhelming for a quick scan.

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?

Given that there is no output schema, the description compensates by clearly stating the return shape ({ jobId }) and the subsequent steps (poll get_job, re-read quality block). It also covers prerequisites (deliveredIssues containing 'matte'), the non-destructive conditional behavior, retry semantics, and the SOURCE_VIDEO_EXPIRED failure mode. This completes the tool's context for an async mutation operation, making it highly informative.

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

Parameters3/5

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

The input schema already provides 100% coverage for both parameters, with descriptions for 'animation' (Animation slug to re-matte in place) and 'characterId' (Character id). The tool description does not add significant parameter-specific meaning; it only mentions 'ONE animation's source video', which aligns with the existing schema. Given the high schema coverage, the baseline of 3 is appropriate, with no need for the description to compensate.

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?

The description clearly states the tool fixes edge artifacts (matte) on one animation's source video, specifically as a repair for quality read issues containing 'matte'. It distinguishes itself by targeting animation-specific quality defects and explicitly mentions the resource (animation) and the action (re-matte). This provides a specific verb+resource combination that sets it apart from sibling tools.

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?

The description gives explicit when-to-use guidance: 'the repair for a quality read showing deliveredIssues containing "matte"' with examples (green fringe, flickering holes, ragged edges). It also provides an exclusion: if the same frames were already tried (matteRepair stamp), regenerate the animation instead. It further mentions the FREE and no-AI nature, as well as the SOURCE_VIDEO_EXPIRED failure, giving clear context for decision-making.

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

rename_ui_componentRename UI componentAInspect

Rename an owned component for free. Supply its current name as expectedName to reject stale edits. Preserves IDs, artwork and historical revisions; re-sync updates its exported display name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
packIdYesOwned UI Pack ID.
componentIdYesOwned component ID within this pack.
expectedNameYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false) by disclosing what survives a rename (IDs, artwork, historical revisions), the cost model ('for free'), the optimistic-concurrency guard via expectedName, and the downstream effect that re-sync refreshes the exported display name. This is exactly the mutation-relevant context annotations can't provide.

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?

Two sentences, no waste, front-loaded with the action and cost, followed by the safety mechanic and preservation guarantees. Every clause earns its place.

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

Completeness4/5

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

For a non-idempotent mutation tool with no output schema, the description covers cost, concurrency behavior, and preservation/sync side effects. It stops short of describing failure/error behavior or the return value, but is otherwise complete enough to call correctly.

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 only 50% — packId and componentId are documented but name and expectedName are not. The description compensates by explaining expectedName is the component's CURRENT name used as a stale-edit guard, though the new-name parameter is left to inference.

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 verb (Rename) and resource (an owned UI component) and adds a distinguishing constraint ('owned', 'for free'). An agent can immediately tell this apart from save_ui_component_defaults, replace_ui_component_png, and revise_ui_pack_png in the sibling list.

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

Usage Guidelines4/5

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

Gives clear operational context — 'Supply its current name as expectedName to reject stale edits' — which tells the agent how and when the call is safe to make. It does not, however, name alternative tools or state when another sibling should be preferred instead.

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

replace_ui_component_pngReplace edited UI PNGBInspect

Save a locally edited PNG, revalidate behavior metadata and preserve the prior revision. Free. Maximum PNG 4 MB and 2048 pixels per axis; no SVG artwork editing.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.
revisionIdYes
componentIdYesOwned component ID within this pack.
imageBase64Yes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations cover the safety profile (non-read-only, open-world, non-idempotent, non-destructive), and the description adds genuinely new behavioral facts: the prior revision is preserved, behavior metadata is revalidated, and hard input limits apply. It still does not say what happens on validation failure or whether the call consumes the referenced revisionId.

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

Conciseness4/5

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

Three compact clauses, front-loaded with the primary action and followed by side effects and limits; every phrase carries information. 'Free' is a marginal inclusion but does convey no-cost invocation.

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

Completeness3/5

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

For a mutation tool with no output schema, the description covers the main effects and input limits, which is the minimum viable set. It omits ownership/permission expectations (the schema only hints 'Owned'), failure behavior, and what the caller sees after revalidation, leaving real gaps for a write operation.

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

Parameters2/5

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

Schema description coverage is only 50%: revisionId and imageBase64 carry no schema descriptions, and the description adds nothing about either — it does not explain whether revisionId targets the revision being replaced or the new base, nor what encoding/format imageBase64 expects. The size constraints loosely map to imageBase64 but without stating the field.

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

Purpose4/5

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

The description states a specific verb and resource: saving a locally edited PNG for a UI component, plus secondary effects (revalidate metadata, preserve prior revision). It distinguishes scope from the sibling revise_ui_pack_png by targeting a single component, but it never names that sibling explicitly, so the agent must infer the boundary from the tool name alone.

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

Usage Guidelines3/5

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

Usage is only implied: the agent can infer this is for pushing a locally edited PNG back, and hard constraints (4 MB, 2048 px, no SVG) narrow applicability. There is no explicit when-to-use, when-not-to-use, or routing to revise_ui_pack_png or import_asset_image.

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

reprocess_assetArrange, align, and fit collection itemsAInspect

FREE and SYNCHRONOUS (no jobId — do not poll), no AI. Rebuild a staged, tileset, or terrain collection's presentation layout: anchor chooses the shared fixed point and cellOffsets apply per-item nudges. Modern manifest revisions are recomposed from their independent item PNGs and are never re-sliced; legacy staged and tileset revisions retain the source-sheet re-cut path, where cellInset can remove separator bleed. For a manifest revision, fitItemIndices makes those items fill their shared cell as much as possible while preserving aspect ratio. Legacy terrain must be upgraded to independent items first. Omitted fields keep the revision's current values; send cellOffsets:[] or cellInset:0 to clear. Returns a grid summary; call get_asset afterwards for fresh presigned tile URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
anchorNoWhere each sprite is placed inside its cell. "bottom-middle" is the default for sprites that stand on the ground.
assetIdYesAsset id or slug (staged, tileset, or manifest-backed terrain).
cellInsetNoLegacy source sheets only: pixels shaved off every side of each cell to drop neighbouring bleed (0-32). Ignored for independent-item manifests. Pass 0 to clear.
cellOffsetsNoPer-cell pixel nudges, in tile-index order. Pass [] to clear all nudges.
iterationIdYesCollection revision (iteration) id to arrange.
fitItemIndicesNoIndependent-item manifests only: itemIndex values to fit to the shared cell while preserving aspect ratio. This is a one-shot operation; omitted items keep their saved size.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false and openWorldHint=true, but the description adds crucial behavioral context: the operation is synchronous and free, modern manifest revisions are never re-sliced, legacy paths retain source-sheet re-cutting, fitItemIndices is one-shot, omitted fields preserve current values, and cellOffsets:[]/cellInset:0 clear values. It also tells the agent to call get_asset afterwards. This goes well beyond the annotations and makes the side effects and return behavior clear.

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?

The description is dense but every sentence earns its place: sync/free status, main operation, per-revision path differences, legacy prerequisites, field semantics, clearing semantics, and follow-up call. The most important operational facts (FREE, SYNCHRONOUS, no polling) are front-loaded. It is long, but the tool has real complexity to convey.

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 6-parameter synchronous tool with no output schema, the description covers the operation, the revision-dependent behaviors, the legacy upgrade prerequisite, clearing semantics, and the recommended follow-up call. There is no obvious missing piece an agent would need to safely invoke it or interpret the flow.

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 100%, so params are already documented. The description adds meaning beyond the schema by explaining how parameters interact: anchor chooses the shared fixed point, cellOffsets apply per-item nudges, cellInset removes legacy separator bleed, fitItemIndices makes items fill their shared cell while preserving aspect ratio, and omitted fields keep current values. It doesn't enumerate every enum value, but the schema already does that.

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?

The description states a specific verb+resource: 'Rebuild a staged, tileset, or terrain collection's presentation layout', and clearly differentiates itself from siblings like animate_asset, fix_asset_seams, or revise_asset by describing the layout/arrangement operation. It names the key dimensions (anchor, cellOffsets, cellInset, fitItemIndices) and distinguishes modern manifest revisions from legacy revisions, so an agent can identify the tool's unique role.

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?

The description gives explicit when-to-use guidance: 'FREE and SYNCHRONOUS (no jobId — do not poll)', 'Legacy terrain must be upgraded to independent items first', and 'call get_asset afterwards for fresh presigned tile URLs'. It also states what not to expect (no AI) and how to clear fields, leaving little ambiguity about when this tool is appropriate.

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

resume_poseResume saved pose background removalAInspect

FREE. Resume a failed pose when list_character_poses reports removalRecoveryAvailable. Reuses the saved image; never generates or charges for another image. Respect the retry-after time on cooldown errors, then poll list_character_poses.

ParametersJSON Schema
NameRequiredDescriptionDefault
poseIdYes
characterIdYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations indicate this is not read-only but the description adds valuable behavioral detail beyond them: it is FREE, reuses the saved image, and never generates or charges for another image. It also discloses cooldown/retry behavior, which is not inferable from annotations or schema. This meaningfully informs agent expectations.

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?

Three sentences deliver a clear trigger, cost implication, and retry behavior with zero filler. The most decision-relevant fact ('FREE') is front-loaded, and every sentence earns its place.

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

Completeness4/5

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

For a simple two-parameter recovery action with no output schema, the description covers the key operational context: trigger condition, cost semantics, and cooldown/polling flow. The only minor gap is the lack of detail about the response value or how to interpret success beyond polling list_character_poses.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the burden for parameter meaning. It identifies that a 'failed pose' is involved but does not explain what characterId and poseId represent beyond their names, nor how to obtain valid values. The agent must infer that poseId refers to the failed pose and characterId to the owning character.

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?

The description states a specific verb ('Resume') and resource ('failed pose' / 'saved pose background removal'), and adds a precise trigger condition ('when list_character_poses reports removalRecoveryAvailable'). This clearly distinguishes it from sibling retry/resume tools like retry_job or resume_ui_pack_batch.

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

Usage Guidelines4/5

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

The description explicitly states when to use the tool: only when list_character_poses reports removalRecoveryAvailable. It also provides operational guidance for cooldown handling and subsequent polling. It does not explicitly name exclusions or alternatives, but the usage context is clear enough.

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

resume_ui_pack_batchResume saved UI artwork background removalAInspect

FREE. Resume background removal when a failed/uncertain illustrated batch reports removalRecoveryAvailable. Reuses its saved artwork and original billing identity. Respect cooldown errors; never create a replacement paid batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.
batchIdYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only indicate mutation and non-idempotency, so the description carries the behavioral burden. It adds valuable context: the operation is FREE, reuses saved artwork and the original billing identity, and must not create a replacement batch. No contradiction with annotations.

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 short sentences contain the trigger, billing behavior, cooldown constraint, and prohibition on replacement with no filler. The key fact (FREE) is front-loaded.

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

Completeness4/5

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

Given no output schema and minimal annotations, the description covers the main decision inputs: recovery availability condition, billing reuse, cooldown, and the prohibition on replacement. It does not describe the return value or how to check removalRecoveryAvailable, but it is enough to invoke correctly under the stated condition.

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

Parameters2/5

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

The schema only documents packId; batchId has no schema description. The description does not explain how to obtain or validate either parameter, and it does not connect 'batch' or 'recovery available' explicitly to the batchId input, so it fails to compensate for the 50% schema coverage gap.

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?

The description names a specific action ('Resume background removal'), a concrete trigger ('failed/uncertain illustrated batch reports removalRecoveryAvailable'), and a clear resource (saved UI artwork). This differentiates it from generic siblings like retry_job, resume_pose, and recover_ui_pack_components.

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

Usage Guidelines4/5

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

It states the exact condition for use and gives explicit when-not guidance: respect cooldown errors and never create a replacement paid batch. It does not name an alternative tool to use when recovery is unavailable, so it stops short of fully explicit routing.

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

retry_jobRetry a failed jobAInspect

FREE when the original KIE task or a validated stored artifact can be recovered; otherwise 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 reports retryMode, retryRecovery and retryCost, and the dryRun quote here is that same number. If get_job reports failureAction:"edit_input", do not use this tool; edit the prompt or references and create a new generation. A non-retryable phase answers 400 JOB_NOT_RETRYABLE — some late phases hold partially-committed state and deliberately have no blanket retry. Eligible overhead Material jobs use stored_artifact recovery to repair the original without new generation or background removal. A confirmed failed repair is not offered again by that processor; refresh get_job and honor server eligibility, even below the general two-attempt limit. No automatic refund is implied. Confirmed background-removal provider failures already fall back automatically on the server, without a new user charge. There is no daily removal retry lockout; honor reported cooldowns and unknown-task safeguards if recovery still fails. For already-authorized generation, automatically execute a zero-credit recovery quote and poll it; no renewed approval or refund. Never duplicate a running recovery. Limit automatic retries to two per failed job per session; stop on recurring failure or any paid quote. DEFAULTS TO A COST PREVIEW — see the dryRun argument. Returns { jobId } — poll get_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesId of a job whose status is "error" (from get_job).
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
idempotencyKeyNoOptional 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 double-dispatch.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses cost behavior (FREE vs PAID, no re-charge for completed work), dryRun defaulting to a cost preview, server-side fallback for background-removal failures, no automatic refund, and non-retryable 400 responses. This is far more behavioral context than the annotations alone provide, and nothing contradicts readOnlyHint/idempotentHint/destructiveHint.

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

Conciseness4/5

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

The description is long, but the tool has genuinely complex billing, recovery, and retry semantics; nearly every sentence carries operational information. It front-loads the core purpose and cost model, though a few points (e.g., dryRun default) restate schema content and the single-paragraph layout makes it harder to scan.

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?

With no output schema, the description still states the return shape ({ jobId }) and tells the agent to poll get_job. It covers eligibility, cost, failure modes, idempotency, retry limits, and user-approval flow, so an agent has what it needs to invoke the tool correctly in both dryRun and real modes.

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 100%, so the schema already documents jobId, dryRun, and idempotencyKey. The description adds value by explaining that the dryRun quote matches get_job's retryCost, that idempotencyKey reuse prevents double-dispatch on transient failures, and that dryRun defaults to a preview requiring user approval before spending.

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?

The description opens with a precise verb and resource: it re-runs the FAILED step of a job whose status is "error", and it distinguishes itself from creating a whole new generation. It also names the exact condition under which it should not be used (failureAction:"edit_input"), making its purpose unambiguous relative to siblings.

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?

It gives explicit when-to-use criteria (error status, retryable phase, eligible recovery), an explicit when-not-to-use case (edit_input), and points to get_job for retryMode/retryRecovery/retryCost before calling. It also sets operational limits (two attempts per session, no duplicate running recovery) that govern invocation.

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

retry_unusable_resultRetry an unusable AI resultAInspect

Quality Retry is the subscription compensation for AI art that invents details, ignores the request, or arrives unusable, letting the user try again without asking support for a credit refund. Costs ONE quality retry and ZERO credits; it is not a refund and preserves the original. Use get_subscription_allowances first and proceed only when features.retry is true; explain the purpose/cost and obtain approval before confirmed=true. This is distinct from retry_job (technical recovery) and ordinary paid revision. Do not use for arbitrary new ideas or imported still images. Persist requestId and reuse it after network errors; a returned allowance requires a new requestId.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesUse character_pose with poseId for a completed generated pose with saved inputs, creating a new pose on the same character. Extracted/mirrored poses are excluded. Use character_animation for ordinary character animations and completed standalone or automatic setup 360 video turns. Setup requires a completed owned job with an approved review and retained padded input. Turn retries create a new standalone turn without replacing approved poses or rerunning dependent animations. Grid-sheet rotations and unidentifiable sources are excluded.
poseIdNo
reasonYes
entityIdYes
confirmedNoTrue only after the user approved using one quality retry.
requestIdYes
revisionIdNo
animationIdNo
issueDetailsNoRequired for reason=other. Describe the unusable result in up to 1000 characters; stored for support, not sent to AI or used to change the original prompt. Preserve on requestId replay.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare the safety envelope (non-read-only, non-destructive, non-idempotent, open-world). The description adds substantial context beyond that: cost is one quality retry and zero credits, it is not a refund, it preserves the original, and requestId must be persisted/reused after network errors while a spent allowance requires a new requestId.

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

Conciseness4/5

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

Front-loaded with what the tool is and its cost, and every clause carries information. It is dense and slightly run-on across cost, prerequisites, exclusions, and replay semantics, but no sentence is filler.

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

Completeness4/5

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

For a complex, 9-param mutation with no output schema, the description covers purpose, cost, prerequisite checks, approval gating, requestId replay, and exclusions. The remaining gap is per-parameter meaning for the id fields, which is not resolved anywhere.

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

Parameters3/5

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

Schema coverage is only 33% across 9 params, so the description must compensate. It adds real meaning for requestId (persist/reuse, new id when allowance returned) and confirmed (approval gate), but leaves entityId, poseId, revisionId, and animationId undocumented in either place. kind and issueDetails are already well covered by the schema.

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 verb+resource with a clear scope: a subscription 'Quality Retry' compensation for unusable AI art, distinct from a refund. It explicitly separates itself from retry_job (technical recovery) and ordinary paid revision, so an agent can pick the right sibling without opening schemas.

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 when-to-use (hallucinated/ignored/unusable output), a prerequisite sequence (call get_subscription_allowances, proceed only when features.retry is true, obtain approval before confirmed=true), and when-not-to-use ('arbitrary new ideas or imported still images'). Alternatives are named directly.

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

revise_assetRevise an assetAInspect

PAID. Generate a new revision of an asset from feedback text. The previous revision is kept — revisions are additive, never destructive. Environment Kit (terrain) assets also accept the legacy templateId to pull a whole category pack (edges / grounds / props / slopes / textures / structures). Passing sourceItemIndex uses that extracted item as the visual source for a complete new related collection: the source stays untouched and every output is a separate new asset listed in get_job.assetIds. The default dry run returns the exact semantic revision plan and planToken; show the preview to the user, then resend the unchanged request with that token. DEFAULTS TO A PLAN + COST PREVIEW — see dryRun. Returns { jobId } — poll get_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
promptNoWhat to change. Required unless templateId is given (terrain).
assetIdYesAsset id or slug.
planTokenNoREQUIRED when dryRun=false. Copy unchanged from the immediately preceding dry-run response.
imageModelNoOverride the image model.
templateIdNoEnvironment Kit (`terrain`) only — legacy focused category pack, not a dashboard prompt-starter ID.
textureKindNoTexture only — 4-way seamless fill, or a directional left-right strip. Defaults to the asset's existing kind.
idempotencyKeyNoOptional 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 double-dispatch.
sourceItemIndexNoCollection item to seed a related collection. Preserves the source and creates one new asset per output.
sourceIterationIdNoRevise from a specific earlier revision instead of the current one.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint false, idempotentHint false, destructiveHint false), the description discloses crucial behaviors: it is PAID, revisions are additive and never destructive, the default is a dry run that returns a plan and cost preview, a planToken must be carried over, and the real call returns a jobId to poll. It also clarifies that sourceItemIndex preserves the source and creates new assets. This far exceeds the annotation baseline and provides rich, non-contradictory transparency.

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?

The description is long but every sentence earns its place. It starts with 'PAID.' and the core purpose, then systematically covers additive behavior, terrain templateId, sourceItemIndex semantics, dry-run default and workflow, and the return shape. The structure is logical and front-loaded, with no filler or redundancy. Given the tool's complexity (10 params, confirmation flow), the length is justified and efficient.

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?

The description covers the full lifecycle: purpose, variants, dry-run plan, confirmation requirements, planToken usage, return type, and the need to poll get_job. It even mentions that outputs from sourceItemIndex appear in get_job.assetIds. For a tool with no output schema, it clearly states the return shape and next step. Nothing essential for an agent to invoke it correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning to multiple parameters. It explains dryRun's default, the exact quote returned, the confirmation UX requirements, and the need to re-call with dryRun:false. It clarifies planToken's mandatory nature when dryRun=false and that it must be copied unchanged. It also elaborates on templateId (terrain-only, legacy category pack) and sourceItemIndex (preserves source, creates per-output assets) and idempotencyKey reuse on retries. This goes well beyond the schema descriptions.

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?

The description opens with a clear verb+resource: 'Generate a new revision of an asset from feedback text.' It immediately distinguishes itself from create_asset (new asset) and other revision tools by stating revisions are additive and never destructive. The mention of templateId and sourceItemIndex further clarifies specific variants, making the purpose unmistakable even among a large sibling set.

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

Usage Guidelines4/5

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

The description provides concrete guidance on when to use this tool (revising an asset from feedback) and explains the dry-run-to-confirm workflow, which is essential. It also conditions templateId and sourceItemIndex usage. However, it does not explicitly name alternative tools (e.g., 'use create_asset for a new asset') or state exclusions, so it stops short of fully routing the agent. The workflow instructions and variant conditions are strong enough to merit a 4.

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

revise_ui_pack_pngRevise UI Pack PNGAInspect

Get a cost preview for a 100-credit selected PNG revision, then pass its signed quote to execute. SVG artwork editing is Phase 2; it is not enabled by this tool. Siblings and prior revisions remain available.

ParametersJSON Schema
NameRequiredDescriptionDefault
quoteNoUnmodified signed quote returned by the dry-run. Required when dryRun is false.
dryRunNoShow the user estimatedCredits and ask whether to proceed, unless already authorized in this session. Prefer the client native question UI with Approve / Decline / Discuss choices; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or magic word. Then set false and supply the returned quote.
packIdYesOwned UI Pack ID.
requestNo
componentIdYesOwned component ID within this pack.
idempotencyKeyNoReuse the same key when retrying a confirmed request.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already indicate that this is not read-only and not idempotent. The description adds useful context beyond those flags: a two-phase preview-then-execute flow, a fixed 100-credit cost, signed-quote validation, and preservation of siblings and prior revisions. It does not fully describe what execution returns, but the behavioral additions are meaningful.

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

Conciseness4/5

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

Three compact sentences with the core operation and execution flow front-loaded before scope exclusions. There is no filler, though '100-credit selected PNG revision' is slightly compressed and could be more explicit about what 'selected' refers to.

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

Completeness3/5

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

For a nested, two-phase mutation tool with no output schema, the description leaves notable gaps: it does not state what a successful execution returns, does not mention idempotency/retry behavior despite the idempotencyKey parameter, and only lightly sketches the request object's role. The dryRun parameter fills in some context, but a complete mental model of the execution response is missing.

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

Parameters3/5

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

Schema description coverage is high and already documents packId, componentId, quote, dryRun, and idempotencyKey. The description only adds minor semantic color around the signed quote and the 100-credit cost. It does not clarify request.revisionId, request.prompt, or referenceImageBase64 beyond what the schema provides.

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

Purpose4/5

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

The description clearly states the action: get a cost preview for a PNG revision, then pass a signed quote to execute. It also disambiguates scope by stating that SVG artwork editing is Phase 2 and not enabled by this tool. It does not name a concrete sibling like replace_ui_component_png, but the PNG-revision resource is clear.

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

Usage Guidelines3/5

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

The intended two-step workflow is implied: request a preview, receive a signed quote, then execute. The description also explicitly excludes SVG editing. However, it does not explain when to prefer this tool over named alternatives such as replace_ui_component_png or revise_asset, and the approval/auth context is mostly deferred to the dryRun parameter.

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

save_project_style_guideSave project style guideAInspect

Adopt a new immutable guide revision with optimistic concurrency. Colors, typography and camera apply to future generation, never silently rewrite prior assets.

ParametersJSON Schema
NameRequiredDescriptionDefault
guideYes
projectIdYes
expectedRevisionYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations declare a non-readonly, non-destructive, non-idempotent write, and the description adds genuinely new behavior: immutability of revisions, optimistic concurrency, and the guarantee that colors/typography/camera only affect future generation and never rewrite prior assets. That is meaningful context beyond the hints, though it doesn't cover auth or failure behavior on revision mismatch.

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?

Two tightly packed sentences with the core action front-loaded and the side-effect constraint second. No filler text.

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

Completeness3/5

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

For a 3-required-param mutation with no output schema and 0% schema documentation, the description gives useful conceptual context but leaves the guide payload shape and the revision-mismatch failure mode unaddressed. Adequate but with clear gaps.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. 'Optimistic concurrency' hints at the role of expectedRevision, and the colors/typography/camera mention gestures at the guide object's contents, but projectId is undocumented and the guide's expected structure remains opaque (nested open object).

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

Purpose4/5

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

The description states a specific verb and resource: adopting a new immutable guide revision for a project. It is distinguishable from get_project_style_guide and suggest_project_style by the write semantics, though it never names those siblings explicitly.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance, nor any mention of alternatives such as suggest_project_style or get_project_style_guide. Usage is only implied by the write semantics of 'adopt'.

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

save_ui_component_defaultsSave UI component defaultsBInspect

Save supported fill, text and layout values for an exact current revision. Free and deterministic; cannot manufacture unsupported capabilities or edit arbitrary SVG geometry.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.
revisionIdYes
componentIdYesOwned component ID within this pack.
configurationYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false. The description adds real value with 'Free and deterministic' and the negative capability limits (cannot manufacture unsupported capabilities or edit arbitrary SVG geometry), but it does not explain the non-idempotent behavior or what a re-save against a stale revision does.

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

Conciseness4/5

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

Two tight sentences, front-loaded with the core action and followed by constraints; no filler. Slightly terse given the tool's mutation semantics, but nothing is wasted.

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

Completeness2/5

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

A mutation tool with four required parameters, an undocumented nested configuration object, and no output schema. The description never explains the configuration payload structure or what happens on subsequent saves despite idempotentHint=false, leaving a significant gap for an agent to call it correctly.

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

Parameters3/5

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

Schema coverage is 50%, with packId and componentId documented but revisionId bare and the nested `configuration` object fully untyped (additionalProperties {}). The description's mention of 'fill, text and layout values' partially compensates by indicating what belongs in configuration, but the object's accepted shape remains undocumented.

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

Purpose4/5

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

States a specific verb (Save) and resource (fill, text and layout values for a revision), which is concrete enough to distinguish it from siblings like revise_ui_pack_png or save_ui_pack_style. It does not, however, explicitly contrast itself with the other save-style siblings, so differentiation must be inferred.

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

Usage Guidelines2/5

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

There is no when-to-use / when-not-to-use guidance and no named alternative. The phrase 'for an exact current revision' hints at a precondition but does not say what to do if the revision has changed or which sibling to use for pack-level styling instead.

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

save_ui_pack_styleSave UI Pack styleAInspect

Save a pack-specific style for future quotes using the current pack updatedAt. Free; preserves project defaults and existing component revisions. A stale timestamp is rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.
styleGuideYes
expectedUpdatedAtYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly=false, idempotent=false, destructive=false, openWorld=true). The description adds genuinely new behavioral context: the operation is free, it preserves project defaults and existing component revisions (what is NOT destroyed), and stale timestamps are rejected. This is useful disclosure beyond structured fields.

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?

Three tight sentences, front-loaded with the action, then constraints. Every clause earns its place with no filler.

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

Completeness3/5

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

For a mutation tool with annotations carrying the safety profile and no output schema, the description covers cost, preservation, and concurrency well. It stops short of describing the shape/expectations of the nested styleGuide object, which is the most ambiguous part of the call.

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

Parameters3/5

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

Schema coverage is only 33%, so the description must compensate. It clarifies expectedUpdatedAt semantics (use the current pack updatedAt, stale values rejected), which the bare date-time schema does not. But styleGuide, a nested free-form object, remains completely unexplained in both description and schema, leaving a real gap.

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

Purpose4/5

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

States a specific verb+resource: saving a 'pack-specific style'. The qualifier 'pack-specific' implicitly separates it from save_project_style_guide, but the sibling is never named outright. Clear purpose, though sibling differentiation relies on inference.

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

Usage Guidelines3/5

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

Gives context ('for future quotes', 'Free') and a hard condition ('A stale timestamp is rejected'), which tells the agent this is an optimistic-concurrency write. However, it never explains when to prefer this over save_project_style_guide or save_ui_component_defaults, leaving alternative selection to inference.

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

select_framesSelect animation framesAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
framesYesOrdered frame indices to keep. Empty array resets to the full capture.
pairIdNoMotion pair id — required when target=assetPair.
targetYesA character animation, or an asset motion pair.
entityIdYesCharacter id (target=character) or asset id/slug (target=assetPair).
animationNoAnimation slug — required when target=character.
compositingNoCharacters only — apply scale/offset in the same rebuild.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations (which only indicate non-read-only, non-destructive, open-world), the description adds valuable behavioral detail: the full capture is retained (non-destructive), re-selection is possible, empty array resets, and it returns a jobId requiring polling via get_job. This gives the agent a clear mental model of the tool's behavior.

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?

The description is five concise sentences, each providing distinct value: cost/aspect, core purpose, reset behavior, non-destructive guarantee, prerequisite workflow, and async pattern. It is front-loaded with the most critical information and contains no filler.

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?

Despite having 6 parameters and no output schema, the description covers the essential workflow (get_frames first), the async job pattern, reset behavior, and non-destructive nature. The target variations are handled by the schema, so the description is complete enough for an agent to invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents the key param semantics (ordered frames, empty array reset, target types, etc.). The tool description repeats some of this but adds no new meaning beyond the schema, so the baseline of 3 is appropriate.

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?

The description uses a specific verb ('Curate') with a clear resource ('which frames an animation keeps'), and specifies the mechanism ('by index into the full capture, in order'). This clearly distinguishes it from sibling tools like frame_animation, which likely deals with creating/editing animation frames rather than selecting subsets.

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

Usage Guidelines4/5

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

The description provides explicit usage context: 'Use get_frames with format:"sheet" first to choose indices' and explains the reset behavior via empty array. It also notes the non-destructive nature enabling re-selection. However, it does not explicitly name alternative tools or state when NOT to use this tool, so it falls just short of a 5.

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

set_asset_collision_bodySet an asset's collision bodyAInspect

FREE and SYNCHRONOUS (no jobId — do not poll). Author the PHYSICS shape a game should build its collider from for an asset revision: a rect, a circle, or a closed polygon, in NORMALIZED coordinates (0..1 fractions of the sprite/tile cell, origin top-left; a circle radius is a fraction of WIDTH). Set tileIndex to give one tile of a tileset/staged asset its own shape — it overrides the asset-level default for that tile. Pass collisionBody: null to clear.

This is what stops a game from falling back to the sprite bounding box. The shape flows into every map and asset export made AFTER this edit — Tiled per-tile objectgroups, the Tiled map Collision layer, and the Phaser/Godot/Unity/GameMaker colliders — and it is resolved from the asset at export time, so it applies to tiles that were already placed on a map before you set it. Distinct from the FOOTPRINT, which is only the level editor's snap/tessellation shape and has no physics meaning.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesAsset id or slug.
tileIndexNoTarget one collection tile (tileset/staged/terrain). Coordinates are normalized to its padded presentation cell, not the cropped item image. Omit for the asset-level default.
iterationIdYesRevision (iteration) id to stamp.
collisionBodyYesThe shape, or null to clear it.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses that the call is 'FREE and SYNCHRONOUS (no jobId — do not poll)', which is operationally critical given many sibling tools are async job-based. It also reveals the retroactive export-time resolution ('applies to tiles that were already placed on a map'), adding behavioral context that structured annotations cannot convey.

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

Conciseness4/5

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

The most operationally urgent fact — 'FREE and SYNCHRONOUS (no jobId — do not poll)' — is front-loaded, and every sentence carries a distinct fact about coordinates, tile overrides, export flow, or the footprint distinction. The description is long, but the density is warranted given the coordinate-system and export-pipeline complexity.

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

Completeness4/5

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

For a complex 4-parameter tool with a three-variant nested shape and no output schema, the description covers the coordinate convention, tileIndex override, the shape-kind variants, and downstream export effects, so an agent has what it needs to invoke correctly. The only gap is the absence of any statement about the return value or error behavior, which is a minor omission for a synchronous mutation tool.

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 description coverage is 100%, so the baseline is 3, but the description adds real value: it defines the NORMALIZED coordinate space ('0..1 fractions of the sprite/tile cell, origin top-left') and the circle radius convention ('fraction of WIDTH'). It also clarifies tileIndex's override semantics and the null-to-clear behavior, enabling more correct calls than the schema alone would.

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?

The description states a specific verb and resource — 'Author the PHYSICS shape a game should build its collider from for an asset revision' — and enumerates the exact shape kinds (rect, circle, closed polygon). It further distinguishes the collision body from the FOOTPRINT ('no physics meaning'), preventing confusion with a closely related geometry concept even though no sibling shares the same purpose.

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

Usage Guidelines4/5

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

The description gives clear context on when this tool matters ('stops a game from falling back to the sprite bounding box') and explains scoping rules for tileIndex (per-tile override vs asset-level default). It provides a conceptual exclusion against the FOOTPRINT, but never names an alternative sibling tool as an explicit when-not-to-use, which keeps it just shy of a 5.

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

set_asset_runtime_intentSet an asset's runtime render intentAInspect

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 or shader_effect. path_follow is accepted only for backward compatibility; do not set it on new assets. Draw and configure motion per placement in the level editor instead. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
configNoIntent-specific config. Validated and clamped server-side; unknown keys are dropped.
assetIdYesAsset id or slug.
tileIndexNoTarget one tile (tileset/staged only).
runtimeUseYesThe render intent. plain_image clears any previous intent. path_follow is legacy-only; new path motion is authored per placement in the level editor.
iterationIdYesRevision (iteration) id to stamp.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description reveals synchronous/no-job behavior, the effect on all later engine exports, and the legacy status of path_follow. It also documents that plain_image clears previous intent. None of this contradicts the readOnlyHint=false, destructiveHint=false annotations.

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?

The description is a set of short, focused sentences with no filler. It front-loads the most critical call-shaping information—FREE and SYNCHRONOUS, no jobId—then covers purpose, allowed values, deprecation caveat, export effect, and tileIndex guidance efficiently.

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

Completeness4/5

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

For a synchronous mutation with five parameters, the description covers call mode, side effects, legacy handling, and conditional tile targeting. It does not enumerate per-intent config sub-fields or the exact success return, but the schema intentionally leaves config open and the tool has no output schema, so this is only a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description mostly restates what the schema already provides: the runtimeUse enum, path_follow's legacy status, plain_image clearing previous intent, and tileIndex targeting a tileset/staged asset. It does not add meaningful new parameter meaning beyond the schema.

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?

The description opens with a specific verb and object: 'Declare how an asset revision should be rendered at runtime,' then enumerates the accepted render-intent modes. This clearly separates it from sibling asset tools like set_asset_collision_body and makes the tool's scope unambiguous.

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

Usage Guidelines4/5

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

It gives clear operational context, including that the call is synchronous and must not be polled, and that the intent flows into future engine exports. It also gives an explicit when-not for path_follow, directing users to author motion per placement in the level editor instead, though it does not contrast this tool with MCP sibling tools.

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

suggest_motion_hintSuggest a motion hint for a staged assetAInspect

PAID but very cheap (one configured text-model 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 300 credits on a default video and are unsure what to write: a few credits here protects that spend. Object States assets only — any other type answers 400.

ParametersJSON Schema
NameRequiredDescriptionDefault
pairsNoThe stage transitions you plan to animate — context for the hint, nothing is generated from them.
dryRunNoDEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend.
assetIdYesObject States asset id or slug.
idempotencyKeyNoOptional 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 double-dispatch.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already tell the agent this is not read-only, not destructive, and not idempotent, but the description adds genuinely new context: the tool is PAID and cheap, synchronous with an inline return (no jobId), and returns a { hint, cost } object. It also discloses the failure mode for wrong asset types. These go well beyond the structured annotations.

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 dense sentences, each earning its place: cost/sync behavior, what it reads and writes, when to use it, and the type restriction. The most decision-relevant details (paid, synchronous, inline return) are front-loaded, and there is no filler.

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

Completeness4/5

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

The description covers the return shape, cost, synchronization, input purpose, supported asset type, and points to the consuming tool. The schema covers parameter details and dryRun behavior. It is complete enough for an agent to call correctly, though a mention of what happens on failure beyond 400 would round it out.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents parameters in detail. The description adds the crucial usage context that 'pairs' are only context ('nothing is generated from them') and that the output maps to animate_asset's motionHint, but it does not add syntax-level meaning beyond the schema. A 3 is appropriate per the baseline rule.

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?

The description states a specific verb ('suggests'/'writes') and resource (motion hint for a staged asset), and distinguishes it from siblings by tying its output to animate_asset's motionHint. It also explicitly names the asset type it supports, so an agent can tell it apart from animate_asset and other creation tools.

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?

The description gives a concrete when-to-use: 'Use it when you are about to spend 300 credits on a default video and are unsure what to write.' It also clearly excludes unsupported asset types ('any other type answers 400') and implies the alternative (proceeding without a hint). This is explicit and actionable.

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

suggest_project_styleSuggest style and fontsBInspect

Suggest palette, treatment and existing font IDs from the available catalog. Free to customers; suggestions require explicit save to adopt.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionYes
projectIdYes
previewTextNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds valuable context: suggestions are free and require explicit save to adopt. This clarifies the non-destructive but non-read-only nature. However, it doesn't describe return format or what 'direction' entails.

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

Conciseness4/5

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

Two concise sentences, front-loaded with the core action and scope, then a key behavioral note. Efficient and clear.

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

Completeness3/5

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

Given 3 parameters with 0% schema coverage and no output schema, the description is incomplete regarding parameter meanings and expected output. It covers the free/save aspect well but misses essential details about how 'direction' and 'previewText' are used.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It mentions palette, treatment, and font IDs, which loosely maps to the 'direction' parameter, but does not explain the required projectId or optional previewText. Significant gap.

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

Purpose4/5

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

States a specific verb (suggest) and resource (palette, treatment, font IDs from the available catalog), which is clear and differentiated from siblings like save_project_style_guide and get_project_style_guide. However, it doesn't explicitly distinguish itself from those siblings by name.

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

Usage Guidelines3/5

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

The description implies when to use it by saying it is 'free to customers' and that suggestions require explicit save, but it doesn't explicitly state when to use this vs alternatives like save_project_style_guide or list_ui_fonts.

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

validate_ui_component_layoutValidate UI component layoutAInspect

Revalidate an exact current revision and apply only proven deterministic runtime layout repairs, including bar fill openings, panel text/slice regions, and explicitly named SVG button-state separation. Free; preserves original sources. This is not arbitrary SVG artwork editing and cannot promise a successful capability result.

ParametersJSON Schema
NameRequiredDescriptionDefault
packIdYesOwned UI Pack ID.
revisionIdYes
componentIdYesOwned component ID within this pack.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, idempotentHint=false, openWorldHint=true; the description is consistent (mutation, not read-only) and adds meaningful context: 'Free; preserves original sources' discloses cost and side effects, and 'cannot promise a successful capability result' sets outcome expectations. It still leaves the precise mutation semantics (what gets overwritten on the revision) unspecified.

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

Conciseness4/5

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

Front-loaded with the verb and core action, three tight sentences with no filler. The parenthetical repair-scope list is dense and jargon-heavy but still earns its place as scope-defining content.

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

Completeness3/5

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

No output schema exists and the description does not describe the return value or how pass/fail is reported ('cannot promise a successful capability result' hints at ambiguity but does not resolve it). For a non-idempotent, non-read-only mutation tool with three required params, it should clarify what a caller receives back.

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

Parameters3/5

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

Schema coverage is 67%; packId and componentId carry descriptions but revisionId does not. The description adds nothing about parameter formats, relationships, or which revision to pass beyond 'exact current revision'. Baseline 3 is appropriate given the schema does most of the work.

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

Purpose4/5

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

States a specific verb (revalidate) plus scope (apply deterministic runtime layout repairs) against an exact revision, and explicitly says what it is not ('not arbitrary SVG artwork editing'). An agent can distinguish it from siblings like revise_ui_pack_png or replace_ui_component_png. However, the repair scope list ('bar fill openings, panel text/slice regions') is domain jargon that is not clarified.

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

Usage Guidelines3/5

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

Provides one exclusion ('This is not arbitrary SVG artwork editing') implying when-not, but never names a positive trigger, prerequisite, or an alternative sibling to prefer. Usage is largely left to inference from the description.

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

whoamiWho am IA
Read-onlyIdempotent
Inspect

Verify the API key and report which powers it has. Returns { userId, username, keyId, keyName, scopes, mapLimits }. mapLimits contains maxMapsPerProject (null means unlimited), maxAreaPx (width × height allowance per map), maxWidthPx and maxHeightPx (independent technical side limits), and canResizeMaps. Paid plans allow any aspect ratio within both area and side limits. Admin accounts receive Studio map capacity even without a subscription. Read effective limits and the saved map before recommending gameplay-sized dimensions; starter dimensions are not an account limit. Free is fixed at 720 × 480; saved larger maps remain editable/exportable, but resizing requires a subscription. Map creation and editing use the web editor. Call this first when a tool fails with a scope error — the scopes array tells you what this key can and cannot do.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the description goes beyond by explaining subtle behaviors: null maxMapsPerProject means unlimited, Admin accounts receive Studio capacity without a subscription, Free is fixed at 720×480, and saved larger maps remain editable/exportable but not resizable. This is rich context the annotations cannot convey.

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

Conciseness4/5

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

The description is long but every sentence carries operational value: return format, mapLimits interpretation, plan differences, admin exception, free-tier behavior, and error routing. It is front-loaded with the core purpose and only slightly verbose in the mapLimits explanation.

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?

With no output schema, the description must carry the full burden of explaining return values, and it does thoroughly — enumerating userId, username, keyId, keyName, scopes, and mapLimits, then detailing each mapLimits subfield and its edge cases (null limits, side limits vs area limits, resizing rules). Nothing an agent needs to interpret the response is missing.

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?

The tool has 0 parameters with 100% schema coverage, so there is nothing for the description to add on parameters. The baseline of 4 applies — the description instead productively explains return-value semantics, which is the relevant information for a no-argument tool.

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?

The description states a specific verb and resource ('Verify the API key and report which powers it has') and enumerates the return fields. This clearly differentiates it from the 60+ sibling tools, none of which deal with authentication or key introspection.

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?

Explicit guidance is given: 'Call this first when a tool fails with a scope error — the scopes array tells you what this key can and cannot do.' It also instructs when to read effective limits and saved maps before recommending dimensions, giving the agent a clear decision procedure.

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

Tool Schema Changelog

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

  1. 2 tool updates
    • Addedresume_pose
    • Addedresume_ui_pack_batch
  2. 1 tool update
    • Addedapprove_automatic_pose_fallback
  3. 3 tool updates
    • Changedcreate_asset1 field changed
      • addedInput schema / properties / prompt / maxLength
        Added value: +20000
    • Changedcreate_character1 field changed
      • addedInput schema / properties / prompt / maxLength
        Added value: +20000
    • Changedrevise_asset1 field changed
      • addedInput schema / properties / prompt / maxLength
        Added value: +20000
  4. 1 tool update
    • Changedset_asset_collision_body1 field changed
      • changedInput schema / properties / tileIndex / description
        Previous value: -"Target one tile (tileset/staged only). Omit for the asset-level default."New value: +"Target one collection tile (tileset/staged/terrain). Coordinates are normalized to its padded presentation cell, not the cropped item image. Omit for the asset-level default."
  5. 15 tool updates
    • Changedanimate_asset1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedcreate_asset1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedcreate_character1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedfix_asset_seams1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedgenerate_character_animation1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedgenerate_character_turn1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedgenerate_pose1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Addedgenerate_project_intake
    • Changedgenerate_project_vision1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedgenerate_ui_pack1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"Show the user estimatedCredits and get an explicit yes for that scope, unless already authorized in this session. Then set false and supply the returned quote."New value: +"Show the user estimatedCredits and ask whether to proceed, unless already authorized in this session. Prefer the client native question UI with Approve / Decline / Discuss choices; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or magic word. Then set false and supply the returned quote."
    • Changedregen_asset_pair1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedretry_job1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedrevise_asset1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
    • Changedrevise_ui_pack_png1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"Show the user estimatedCredits and get an explicit yes for that scope, unless already authorized in this session. Then set false and supply the returned quote."New value: +"Show the user estimatedCredits and ask whether to proceed, unless already authorized in this session. Prefer the client native question UI with Approve / Decline / Discuss choices; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or magic word. Then set false and supply the returned quote."
    • Changedsuggest_motion_hint1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"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 explicit yes for that amount, THEN re-call with dryRun:false to actually spend."New value: +"DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."
  6. 1 tool update
    • Changedcreate_character3 fields changed
      • addedInput schema / properties / generateFourVariations
        Added value: +{
        +  "description": "Defaults to true, matching the dashboard: one image call produces four design variations for the cost of one. Set false only when the user explicitly requests a single character.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / gridCols / description
        Previous value: -"Legacy trigger: set to 2 together with gridRows:2 to request 4 variations; extraction follows complete silhouettes."New value: +"Legacy equivalent of the default four-variation mode: set to 2 together with gridRows:2; extraction follows complete silhouettes."
      • changedInput schema / properties / gridRows / description
        Previous value: -"Legacy trigger: set to 2 together with gridCols:2 to request 4 variations for the cost of one image. This is not cut geometry."New value: +"Legacy equivalent of the default four-variation mode: set to 2 together with gridCols:2. This is not cut geometry."
  7. 1 tool update
    • Changedgenerate_character_animation1 field changed
      • changedInput schema / properties / targetFacings / description
        Previous value: -"Camera-relative facing per animation slug (n, ne, e, se, s, sw, w, nw). Use this for custom actions and any standard action whose slug does not itself encode the intended direction."New value: +"Camera-relative facing per animation slug (n, ne, e, se, s, sw, w, nw). Omit for overhead; four_direction accepts only n/e/s/w. Use this for custom actions and any standard action whose slug does not itself encode the intended direction."
  8. 1 tool update
    • Changedgenerate_character_animation1 field changed
      • addedInput schema / properties / animationDirectionMode
        Added value: +{
        +  "description": "Choose this BEFORE selecting animations for a topdown character and pass it on dry-run plus confirmation. Preselect get_character.animationDirection.mode when present (Luna suggestion; user may override). overhead uses one rotatable true-overhead sprite, base action names, and no 360; four_direction uses S/N/E/W animations; eight_direction also uses NE/SE/SW/NW. The confirmed choice is saved on the character.",
        +  "enum": [
        +    "overhead",
        +    "four_direction",
        +    "eight_direction"
        +  ],
        +  "type": "string"
        +}
  9. 3 tool updates
    • Changedget_export_command3 fields changed
      • changedInput schema / properties / engine / description
        Previous value: -"Target engine. \"tiled\" is maps only; sprites have no Tiled emitter. \"unreal\" is beta Paper2D artwork/flipbook import, not automatic gameplay or native-engine certification."New value: +"Target engine. \"fnf\" is characters only and emits Sparrow PNG/XML plus character JSON. \"tiled\" is maps only; sprites have no Tiled emitter. \"unreal\" is beta Paper2D artwork/flipbook import, not automatic gameplay or native-engine certification."
      • changedInput schema / properties / engine / enum
        Previous value: -[
        -  "phaser",
        -  "godot",
        -  "unity",
        -  "gamemaker",
        -  "unreal",
        -  "tiled"
        -]New value: +[
        +  "phaser",
        +  "godot",
        +  "unity",
        +  "gamemaker",
        +  "fnf",
        +  "unreal",
        +  "tiled"
        +]
      • changedInput schema / properties / size / description
        Previous value: -"Phaser character exports only — narrow the zip to one downscale variant. Godot, Unity, GameMaker and Unreal use full-resolution source frames."New value: +"Phaser character exports only — narrow the zip to one downscale variant. Godot, Unity, GameMaker, Unreal and Sparrow XML use full-resolution source frames; omit size for them."
    • Addedget_integration_status
    • Changedplan_sync2 fields changed
      • changedInput schema / properties / entities / items / properties / engine / description
        Previous value: -"Export engine already used by this lock entry. Defaults to phaser; tiled supports maps and UI pack artwork."New value: +"Export engine already used by this lock entry. Defaults to phaser; Sparrow XML supports characters; tiled supports maps and UI pack artwork."
      • changedInput schema / properties / entities / items / properties / engine / enum
        Previous value: -[
        -  "phaser",
        -  "godot",
        -  "unity",
        -  "gamemaker",
        -  "unreal",
        -  "tiled"
        -]New value: +[
        +  "phaser",
        +  "godot",
        +  "unity",
        +  "gamemaker",
        +  "fnf",
        +  "unreal",
        +  "tiled"
        +]
  10. 21 tool updates
    • Changedcreate_project1 field changed
      • addedInput schema / properties / styleGuide
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Reviewed palette, rendering and typography. Saved as active revision 1 for future generations; font IDs must belong to the available catalog. Omit to create without a guide.",
        +  "properties": {
        +    "bodyFont": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "color": {
        +          "pattern": "^#[0-9a-fA-F]{6}$",
        +          "type": "string"
        +        },
        +        "family": {
        +          "maxLength": 100,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "fontId": {
        +          "maxLength": 100,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "lineHeight": {
        +          "maximum": 3,
        +          "minimum": 1,
        +          "type": "number"
        +        },
        +        "sha256": {
        +          "pattern": "^[a-f0-9]{64}$",
        +          "type": "string"
        +        },
        +        "size": {
        +          "maximum": 160,
        +          "minimum": 8,
        +          "type": "number"
        +        },
        +        "version": {
        +          "maxLength": 100,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "weight": {
        +          "maximum": 900,
        +          "minimum": 100,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "family",
        +        "fontId",
        +        "weight",
        +        "size",
        +        "lineHeight",
        +        "color"
        +      ],
        +      "type": "object"
        +    },
        +    "camera": {
        +      "enum": [
        +        "platformer",
        +        "topdown",
        +        "topdown_overhead",
        +        "isometric",
        +        "point_and_click"
        +      ],
        +      "type": "string"
        +    },
        +    "direction": {
        +      "maxLength": 2000,
        +      "type": "string"
        +    },
        +    "headingFont": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "color": {
        +          "pattern": "^#[0-9a-fA-F]{6}$",
        +          "type": "string"
        +        },
        +        "family": {
        +          "maxLength": 100,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "fontId": {
        +          "maxLength": 100,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "lineHeight": {
        +          "maximum": 3,
        +          "minimum": 1,
        +          "type": "number"
        +        },
        +        "sha256": {
        +          "pattern": "^[a-f0-9]{64}$",
        +          "type": "string"
        +        },
        +        "size": {
        +          "maximum": 160,
        +          "minimum": 8,
        +          "type": "number"
        +        },
        +        "version": {
        +          "maxLength": 100,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "weight": {
        +          "maximum": 900,
        +          "minimum": 100,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "family",
        +        "fontId",
        +        "weight",
        +        "size",
        +        "lineHeight",
        +        "color"
        +      ],
        +      "type": "object"
        +    },
        +    "lockedColors": {
        +      "items": {
        +        "pattern": "^#[0-9a-fA-F]{6}$",
        +        "type": "string"
        +      },
        +      "maxItems": 24,
        +      "type": "array"
        +    },
        +    "palette": {
        +      "additionalProperties": {
        +        "pattern": "^#[0-9a-fA-F]{6}$",
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "pattern": "^[a-zA-Z][a-zA-Z0-9_-]{0,39}$"
        +      },
        +      "type": "object"
        +    },
        +    "references": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "key": {
        +            "maxLength": 1500,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "target": {
        +            "enum": [
        +              "overall_style",
        +              "ui",
        +              "world_indicators",
        +              "characters",
        +              "backgrounds"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "key",
        +          "target"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 12,
        +      "type": "array"
        +    },
        +    "rendering": {
        +      "maxLength": 500,
        +      "type": "string"
        +    },
        +    "shapeLanguage": {
        +      "maxLength": 500,
        +      "type": "string"
        +    },
        +    "version": {
        +      "const": 1,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "version",
        +    "direction",
        +    "palette",
        +    "shapeLanguage",
        +    "rendering",
        +    "headingFont",
        +    "bodyFont",
        +    "camera",
        +    "references",
        +    "lockedColors"
        +  ],
        +  "type": "object"
        +}
    • Addedcreate_ui_composition
    • Addedcreate_ui_pack
    • Addedgenerate_ui_pack
    • Addedget_project_style_guide
    • Addedget_ui_pack
    • Addedget_ui_pack_batch
    • Addedget_ui_pack_batch_recovery
    • Addedget_ui_pack_export_command
    • Addedlist_ui_fonts
    • Addedlist_ui_packs
    • Changedplan_sync6 fields changed
      • addedInput schema / properties / entities / items / properties / artworkOnly
        Added value: +{
        +  "description": "UI pack only: preserve the originally authorized recovery mode; never silently enable it.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / entities / items / properties / componentIds
        Added value: +{
        +  "description": "UI pack only: preserve the original selected component IDs; omit for the whole pack.",
        +  "items": {
        +    "format": "uuid",
        +    "type": "string"
        +  },
        +  "maxItems": 256,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / entities / items / properties / engine / description
        Previous value: -"Export engine already used by this lock entry. Defaults to phaser; tiled is map-only."New value: +"Export engine already used by this lock entry. Defaults to phaser; tiled supports maps and UI pack artwork."
      • changedInput schema / properties / entities / items / properties / kind / enum
        Previous value: -[
        -  "character",
        -  "asset",
        -  "map"
        -]New value: +[
        +  "character",
        +  "asset",
        +  "map",
        +  "ui-pack"
        +]
      • changedInput schema / properties / entities / items / properties / snapshot / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "animations": {
        -        "additionalProperties": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "collisionBody": {
        -              "anyOf": [
        -                {
        -                  "anyOf": [
        -                    {
        -                      "additionalProperties": false,
        -                      "properties": {
        -                        "cx": {
        -                          "type": "number"
        -                        },
        -                        "cy": {
        -                          "type": "number"
        -                        },
        -                        "hh": {
        -                          "type": "number"
        -                        },
        -                        "hw": {
        -                          "type": "number"
        -                        },
        -                        "kind": {
        -                          "const": "rect",
        -                          "type": "string"
        -                        },
        -                        "rot": {
        -                          "type": "number"
        -                        }
        -                      },
        -                      "required": [
        -                        "kind",
        -                        "cx",
        -                        "cy",
        -                        "hw",
        -                        "hh"
        -                      ],
        -                      "type": "object"
        -                    },
        -                    {
        -                      "additionalProperties": false,
        -                      "properties": {
        -                        "cx": {
        -                          "type": "number"
        -                        },
        -                        "cy": {
        -                          "type": "number"
        -                        },
        -                        "kind": {
        -                          "const": "circle",
        -                          "type": "string"
        -                        },
        -                        "r": {
        -                          "type": "number"
        -                        }
        -                      },
        -                      "required": [
        -                        "kind",
        -                        "cx",
        -                        "cy",
        -                        "r"
        -                      ],
        -                      "type": "object"
        -                    },
        -                    {
        -                      "additionalProperties": false,
        -                      "properties": {
        -                        "kind": {
        -                          "const": "polygon",
        -                          "type": "string"
        -                        },
        -                        "points": {
        -                          "items": {
        -                            "additionalProperties": false,
        -                            "properties": {
        -                              "x": {
        -                                "type": "number"
        -                              },
        -                              "y": {
        -                                "type": "number"
        -                              }
        -                            },
        -                            "required": [
        -                              "x",
        -                              "y"
        -                            ],
        -                            "type": "object"
        -                          },
        -                          "maxItems": 64,
        -                          "minItems": 3,
        -                          "type": "array"
        -                        },
        -                        "rot": {
        -                          "type": "number"
        -                        }
        -                      },
        -                      "required": [
        -                        "kind",
        -                        "points"
        -                      ],
        -                      "type": "object"
        -                    }
        -                  ]
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ]
        -            },
        -            "displayName": {
        -              "anyOf": [
        -                {
        -                  "maxLength": 200,
        -                  "type": "string"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ]
        -            },
        -            "fps": {
        -              "minimum": 0,
        -              "type": "number"
        -            },
        -            "frameCount": {
        -              "minimum": 0,
        -              "type": "integer"
        -            },
        -            "loop": {
        -              "type": "boolean"
        -            }
        -          },
        -          "required": [
        -            "displayName",
        -            "frameCount",
        -            "fps",
        -            "loop",
        -            "collisionBody"
        -          ],
        -          "type": "object"
        -        },
        -        "propertyNames": {
        -          "maxLength": 200
        -        },
        -        "type": "object"
        -      },
        -      "collisionBody": {
        -        "anyOf": [
        -          {
        -            "anyOf": [
        -              {
        -                "additionalProperties": false,
        -                "properties": {
        -                  "cx": {
        -                    "type": "number"
        -                  },
        -                  "cy": {
        -                    "type": "number"
        -                  },
        -                  "hh": {
        -                    "type": "number"
        -                  },
        -                  "hw": {
        -                    "type": "number"
        -                  },
        -                  "kind": {
        -                    "const": "rect",
        -                    "type": "string"
        -                  },
        -                  "rot": {
        -                    "type": "number"
        -                  }
        -                },
        -                "required": [
        -                  "kind",
        -                  "cx",
        -                  "cy",
        -                  "hw",
        -                  "hh"
        -                ],
        -                "type": "object"
        -              },
        -              {
        -                "additionalProperties": false,
        -                "properties": {
        -                  "cx": {
        -                    "type": "number"
        -                  },
        -                  "cy": {
        -                    "type": "number"
        -                  },
        -                  "kind": {
        -                    "const": "circle",
        -                    "type": "string"
        -                  },
        -                  "r": {
        -                    "type": "number"
        -                  }
        -                },
        -                "required": [
        -                  "kind",
        -                  "cx",
        -                  "cy",
        -                  "r"
        -                ],
        -                "type": "object"
        -              },
        -              {
        -                "additionalProperties": false,
        -                "properties": {
        -                  "kind": {
        -                    "const": "polygon",
        -                    "type": "string"
        -                  },
        -                  "points": {
        -                    "items": {
        -                      "additionalProperties": false,
        -                      "properties": {
        -                        "x": {
        -                          "type": "number"
        -                        },
        -                        "y": {
        -                          "type": "number"
        -                        }
        -                      },
        -                      "required": [
        -                        "x",
        -                        "y"
        -                      ],
        -                      "type": "object"
        -                    },
        -                    "maxItems": 64,
        -                    "minItems": 3,
        -                    "type": "array"
        -                  },
        -                  "rot": {
        -                    "type": "number"
        -                  }
        -                },
        -                "required": [
        -                  "kind",
        -                  "points"
        -                ],
        -                "type": "object"
        -              }
        -            ]
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "frameSize": {
        -        "anyOf": [
        -          {
        -            "exclusiveMinimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "kind": {
        -        "const": "character",
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 300,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "name",
        -      "frameSize",
        -      "collisionBody",
        -      "animations"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "animationPairs": {
        -        "additionalProperties": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "fps": {
        -              "anyOf": [
        -                {
        -                  "minimum": 0,
        -                  "type": "number"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ]
        -            },
        -            "frameCount": {
        -              "anyOf": [
        -                {
        -                  "minimum": 0,
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ]
        -            },
        -            "iterationCount": {
        -              "minimum": 0,
        -              "type": "integer"
        -            },
        -            "label": {
        -              "anyOf": [
        -                {
        -                  "maxLength": 300,
        -                  "type": "string"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ]
        -            }
        -          },
        -          "required": [
        -            "label",
        -            "frameCount",
        -            "fps",
        -            "iterationCount"
        -          ],
        -          "type": "object"
        -        },
        -        "propertyNames": {
        -          "maxLength": 200
        -        },
        -        "type": "object"
        -      },
        -      "currentIterationId": {
        -        "anyOf": [
        -          {
        -            "maxLength": 300,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "hasAnimation": {
        -        "type": "boolean"
        -      },
        -      "iterationCount": {
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "kind": {
        -        "const": "asset",
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 300,
        -        "type": "string"
        -      },
        -      "runtimeUse": {
        -        "maxLength": 100,
        -        "type": "string"
        -      },
        -      "slug": {
        -        "anyOf": [
        -          {
        -            "maxLength": 200,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "tileRuntimeUses": {
        -        "items": {
        -          "maxLength": 200,
        -          "type": "string"
        -        },
        -        "maxItems": 256,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "name",
        -      "slug",
        -      "currentIterationId",
        -      "iterationCount",
        -      "hasAnimation",
        -      "runtimeUse",
        -      "tileRuntimeUses",
        -      "animationPairs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "gridSize": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "hasMapData": {
        -        "type": "boolean"
        -      },
        -      "heightPx": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "kind": {
        -        "const": "map",
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 300,
        -        "type": "string"
        -      },
        -      "widthPx": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "name",
        -      "widthPx",
        -      "heightPx",
        -      "gridSize",
        -      "hasMapData"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "animations": {
        +        "additionalProperties": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "collisionBody": {
        +              "anyOf": [
        +                {
        +                  "anyOf": [
        +                    {
        +                      "additionalProperties": false,
        +                      "properties": {
        +                        "cx": {
        +                          "type": "number"
        +                        },
        +                        "cy": {
        +                          "type": "number"
        +                        },
        +                        "hh": {
        +                          "type": "number"
        +                        },
        +                        "hw": {
        +                          "type": "number"
        +                        },
        +                        "kind": {
        +                          "const": "rect",
        +                          "type": "string"
        +                        },
        +                        "rot": {
        +                          "type": "number"
        +                        }
        +                      },
        +                      "required": [
        +                        "kind",
        +                        "cx",
        +                        "cy",
        +                        "hw",
        +                        "hh"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    {
        +                      "additionalProperties": false,
        +                      "properties": {
        +                        "cx": {
        +                          "type": "number"
        +                        },
        +                        "cy": {
        +                          "type": "number"
        +                        },
        +                        "kind": {
        +                          "const": "circle",
        +                          "type": "string"
        +                        },
        +                        "r": {
        +                          "type": "number"
        +                        }
        +                      },
        +                      "required": [
        +                        "kind",
        +                        "cx",
        +                        "cy",
        +                        "r"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    {
        +                      "additionalProperties": false,
        +                      "properties": {
        +                        "kind": {
        +                          "const": "polygon",
        +                          "type": "string"
        +                        },
        +                        "points": {
        +                          "items": {
        +                            "additionalProperties": false,
        +                            "properties": {
        +                              "x": {
        +                                "type": "number"
        +                              },
        +                              "y": {
        +                                "type": "number"
        +                              }
        +                            },
        +                            "required": [
        +                              "x",
        +                              "y"
        +                            ],
        +                            "type": "object"
        +                          },
        +                          "maxItems": 64,
        +                          "minItems": 3,
        +                          "type": "array"
        +                        },
        +                        "rot": {
        +                          "type": "number"
        +                        }
        +                      },
        +                      "required": [
        +                        "kind",
        +                        "points"
        +                      ],
        +                      "type": "object"
        +                    }
        +                  ]
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "displayName": {
        +              "anyOf": [
        +                {
        +                  "maxLength": 200,
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "fps": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "frameCount": {
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "loop": {
        +              "type": "boolean"
        +            }
        +          },
        +          "required": [
        +            "displayName",
        +            "frameCount",
        +            "fps",
        +            "loop",
        +            "collisionBody"
        +          ],
        +          "type": "object"
        +        },
        +        "propertyNames": {
        +          "maxLength": 200
        +        },
        +        "type": "object"
        +      },
        +      "collisionBody": {
        +        "anyOf": [
        +          {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "cx": {
        +                    "type": "number"
        +                  },
        +                  "cy": {
        +                    "type": "number"
        +                  },
        +                  "hh": {
        +                    "type": "number"
        +                  },
        +                  "hw": {
        +                    "type": "number"
        +                  },
        +                  "kind": {
        +                    "const": "rect",
        +                    "type": "string"
        +                  },
        +                  "rot": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "kind",
        +                  "cx",
        +                  "cy",
        +                  "hw",
        +                  "hh"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "cx": {
        +                    "type": "number"
        +                  },
        +                  "cy": {
        +                    "type": "number"
        +                  },
        +                  "kind": {
        +                    "const": "circle",
        +                    "type": "string"
        +                  },
        +                  "r": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "kind",
        +                  "cx",
        +                  "cy",
        +                  "r"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "kind": {
        +                    "const": "polygon",
        +                    "type": "string"
        +                  },
        +                  "points": {
        +                    "items": {
        +                      "additionalProperties": false,
        +                      "properties": {
        +                        "x": {
        +                          "type": "number"
        +                        },
        +                        "y": {
        +                          "type": "number"
        +                        }
        +                      },
        +                      "required": [
        +                        "x",
        +                        "y"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    "maxItems": 64,
        +                    "minItems": 3,
        +                    "type": "array"
        +                  },
        +                  "rot": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "kind",
        +                  "points"
        +                ],
        +                "type": "object"
        +              }
        +            ]
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "frameSize": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "kind": {
        +        "const": "character",
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 300,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "name",
        +      "frameSize",
        +      "collisionBody",
        +      "animations"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "animationPairs": {
        +        "additionalProperties": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "fps": {
        +              "anyOf": [
        +                {
        +                  "minimum": 0,
        +                  "type": "number"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "frameCount": {
        +              "anyOf": [
        +                {
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "iterationCount": {
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "label": {
        +              "anyOf": [
        +                {
        +                  "maxLength": 300,
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            }
        +          },
        +          "required": [
        +            "label",
        +            "frameCount",
        +            "fps",
        +            "iterationCount"
        +          ],
        +          "type": "object"
        +        },
        +        "propertyNames": {
        +          "maxLength": 200
        +        },
        +        "type": "object"
        +      },
        +      "currentIterationId": {
        +        "anyOf": [
        +          {
        +            "maxLength": 300,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "hasAnimation": {
        +        "type": "boolean"
        +      },
        +      "iterationCount": {
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "kind": {
        +        "const": "asset",
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 300,
        +        "type": "string"
        +      },
        +      "runtimeUse": {
        +        "maxLength": 100,
        +        "type": "string"
        +      },
        +      "slug": {
        +        "anyOf": [
        +          {
        +            "maxLength": 200,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "tileRuntimeUses": {
        +        "items": {
        +          "maxLength": 200,
        +          "type": "string"
        +        },
        +        "maxItems": 256,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "name",
        +      "slug",
        +      "currentIterationId",
        +      "iterationCount",
        +      "hasAnimation",
        +      "runtimeUse",
        +      "tileRuntimeUses",
        +      "animationPairs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "gridSize": {
        +        "exclusiveMinimum": 0,
        +        "type": "integer"
        +      },
        +      "hasMapData": {
        +        "type": "boolean"
        +      },
        +      "heightPx": {
        +        "exclusiveMinimum": 0,
        +        "type": "integer"
        +      },
        +      "kind": {
        +        "const": "map",
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 300,
        +        "type": "string"
        +      },
        +      "widthPx": {
        +        "exclusiveMinimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "name",
        +      "widthPx",
        +      "heightPx",
        +      "gridSize",
        +      "hasMapData"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "componentCount": {
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "components": {
        +        "additionalProperties": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "configurationHash": {
        +              "anyOf": [
        +                {
        +                  "maxLength": 300,
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "name": {
        +              "maxLength": 300,
        +              "type": "string"
        +            },
        +            "revisionId": {
        +              "anyOf": [
        +                {
        +                  "maxLength": 300,
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "status": {
        +              "maxLength": 200,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "revisionId",
        +            "configurationHash",
        +            "status"
        +          ],
        +          "type": "object"
        +        },
        +        "propertyNames": {
        +          "maxLength": 200
        +        },
        +        "type": "object"
        +      },
        +      "kind": {
        +        "const": "ui-pack",
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 300,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "name",
        +      "componentCount",
        +      "components"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / entities / items / properties / version / description
        Previous value: -"contentVersion for a character; updatedAt for an asset or map."New value: +"contentVersion for a character or the exact UI pack export; updatedAt for an asset or map."
    • Addedrecover_ui_pack_components
    • Addedrename_ui_component
    • Addedreplace_ui_component_png
    • Addedrevise_ui_pack_png
    • Addedsave_project_style_guide
    • Addedsave_ui_component_defaults
    • Addedsave_ui_pack_style
    • Addedsuggest_project_style
    • Addedvalidate_ui_component_layout
  11. 1 tool update
    • Changedretry_unusable_result3 fields changed
      • changedInput schema / properties / kind / description
        Previous value: -"Use character_animation for ordinary character animations and completed standalone 360 video turns. Turn retries preserve the saved seed pose/strategy in a new turn; internal setup captures and grid-sheet rotations are excluded."New value: +"Use character_pose with poseId for a completed generated pose with saved inputs, creating a new pose on the same character. Extracted/mirrored poses are excluded. Use character_animation for ordinary character animations and completed standalone or automatic setup 360 video turns. Setup requires a completed owned job with an approved review and retained padded input. Turn retries create a new standalone turn without replacing approved poses or rerunning dependent animations. Grid-sheet rotations and unidentifiable sources are excluded."
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "asset_image",
        -  "asset_animation",
        -  "character_image",
        -  "character_animation"
        -]New value: +[
        +  "asset_image",
        +  "asset_animation",
        +  "character_image",
        +  "character_animation",
        +  "character_pose"
        +]
      • addedInput schema / properties / poseId
        Added value: +{
        +  "type": "string"
        +}
  12. 3 tool updates
    • Addedget_subscription_allowances
    • Addedimport_asset_image
    • Addedretry_unusable_result
  13. 8 tool updates
    • Addedconvert_texture_to_material
    • Changedcreate_asset8 fields changed
      • changedInput schema / properties / assetType / description
        Previous value: -"`static` = Object (formerly Static Asset), one sprite/prop that may also be animated; 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-tiling 3×3 ground sheet; texture = seamless tileable material."New value: +"`static` = Object (formerly Static Asset), four separately editable design alternatives by default (explicit one supported); each may also be animated; tileset = Object Collection, one coordinated set of independently editable items; staged = one subject in N progressive stages (the input animate_asset expects); background = scenery, never a game object; terrain = Environment Kit, individually placed props, surface details or connecting modules; texture = Terrain Material, brushable fill/surface donors (wire names unchanged; editor topology is deterministic)."
      • changedInput schema / properties / bgType / description
        Previous value: -"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 + topdown_overhead → ground_fill/overhead_map/functional_map/scrolling_floor/parallax_underlay; isometric → iso_ground/iso_scene/iso_far/iso_platform_surface; point_and_click → full_scene/room_stage/parallax_strip/platform_scene_front/vista_backdrop. A mismatch, or omitting it, is rejected with 400. Each sub-type runs a different tuned prompt, so this decides what KIND of image you get — a far parallax sky and a functional platform scene are not interchangeable. Ask the user which layer they want if their request does not make it obvious."New value: +"REQUIRED for assetType \"background\" — prefer scene (one opaque full scene), distant_backdrop (one opaque far vista), depth_layer (one scenery layer with transparent gaps), or foreground_overlay (transparent edge framing). All four support every camera. One image per call, no automatic parallax pack, collision/navigation or verified seamless repeat. Angled top-down and strict overhead stay distinct; atmospheric vistas need no forced isometric geometry. Preserve project style. Legacy values remain view-specific: platformer → parallax_far/parallax_mid/parallax_near/platform_scene/static_backdrop/scrolling_backdrop; topdown + topdown_overhead → ground_fill/overhead_map/functional_map/scrolling_floor/parallax_underlay; isometric → iso_ground/iso_scene/iso_far/iso_platform_surface; point_and_click → full_scene/room_stage/parallax_strip/platform_scene_front/vista_backdrop. A mismatch, or omitting it, is rejected with 400. Each sub-type runs a different tuned prompt, so this decides what KIND of image you get — a far parallax sky and a functional platform scene are not interchangeable. Ask the user which layer they want if their request does not make it obvious."
      • changedInput schema / properties / bgType / enum
        Previous value: -[
        -  "parallax_far",
        -  "parallax_mid",
        -  "parallax_near",
        -  "platform_scene",
        -  "static_backdrop",
        -  "scrolling_backdrop",
        -  "ground_fill",
        -  "overhead_map",
        -  "functional_map",
        -  "scrolling_floor",
        -  "parallax_underlay",
        -  "iso_ground",
        -  "iso_scene",
        -  "iso_far",
        -  "iso_platform_surface",
        -  "full_scene",
        -  "room_stage",
        -  "parallax_strip",
        -  "platform_scene_front",
        -  "vista_backdrop"
        -]New value: +[
        +  "scene",
        +  "distant_backdrop",
        +  "depth_layer",
        +  "foreground_overlay",
        +  "parallax_far",
        +  "parallax_mid",
        +  "parallax_near",
        +  "platform_scene",
        +  "static_backdrop",
        +  "scrolling_backdrop",
        +  "ground_fill",
        +  "overhead_map",
        +  "functional_map",
        +  "scrolling_floor",
        +  "parallax_underlay",
        +  "iso_ground",
        +  "iso_scene",
        +  "iso_far",
        +  "iso_platform_surface",
        +  "full_scene",
        +  "room_stage",
        +  "parallax_strip",
        +  "platform_scene_front",
        +  "vista_backdrop"
        +]
      • changedInput schema / properties / gridRows / description
        Previous value: -"Legacy compatibility only. New generations derive a supported square layout from the confirmed semantic plan."New value: +"Legacy compatibility only. The confirmed semantic plan owns layout. Object Collection and Environment Kit never add items just to fill cells."
      • changedInput schema / properties / imageModel / description
        Previous value: -"Override the image model."New value: +"Override the image model for non-Material assets. Materials use the server-owned MATERIAL_IMAGE_PRIMARY provider route."
      • changedInput schema / properties / perspective / description
        Previous value: -"TERRAIN only — camera perspective. Defaults from the project gameType."New value: +"Environment Kit only — legacy three-value camera override. Omit to retain the project’s distinct side, angled top-down, overhead, isometric or adventure camera; request finer camera changes in the prompt."
      • changedInput schema / properties / runtimeUse / description
        Previous value: -"OBJECT only (`assetType: \"static\"`; formerly Static Asset). Texture is locked to repeat_fill server-side. Declares how the art is meant to be rendered — particle_emitter, deformable_strip, nine_slice or shader_effect — which changes the prompt AND the export metadata. Anything other than plain_image on a non-Object type is rejected. path_follow remains accepted for legacy clients but must not be used for new assets; path motion is configured per placement in the level editor. It can also be set later with set_asset_runtime_intent, for free."New value: +"OBJECT only (`assetType: \"static\"`; formerly Static Asset). Material is locked to deterministic brush rendering server-side. Declares how the art is meant to be rendered — particle_emitter, deformable_strip, nine_slice or shader_effect — which changes the prompt AND the export metadata. Anything other than plain_image on a non-Object type is rejected. path_follow remains accepted for legacy clients but must not be used for new assets; path motion is configured per placement in the level editor. It can also be set later with set_asset_runtime_intent, for free."
      • changedInput schema / properties / textureKind / description
        Previous value: -"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. Created cells are RAW: read metadata.seamless.seamMetric.pass from get_asset and only pay fix_asset_seams for the ones that fail."New value: +"LEGACY compatibility only. New Materials derive platformer/topdown/isometric projection from the project gameType; this value does not change their donor contract."
    • Changedexport_map2 fields changed
      • changedInput schema / properties / engine / description
        Previous value: -"Target engine (default tiled)."New value: +"Target engine (default tiled). Unreal is a beta Paper2D artwork importer; native verification and gameplay integration remain pending."
      • changedInput schema / properties / engine / enum
        Previous value: -[
        -  "tiled",
        -  "phaser",
        -  "godot",
        -  "unity",
        -  "gamemaker"
        -]New value: +[
        +  "tiled",
        +  "phaser",
        +  "godot",
        +  "unity",
        +  "gamemaker",
        +  "unreal"
        +]
    • Changedfix_asset_seams1 field changed
      • changedInput schema / properties / assetId / description
        Previous value: -"Texture asset id or slug."New value: +"Legacy texture asset id or slug (not a Material with a material recipe)."
    • Changedget_export_command3 fields changed
      • changedInput schema / properties / engine / description
        Previous value: -"Target engine. \"tiled\" is maps only; sprites have no Tiled emitter."New value: +"Target engine. \"tiled\" is maps only; sprites have no Tiled emitter. \"unreal\" is beta Paper2D artwork/flipbook import, not automatic gameplay or native-engine certification."
      • changedInput schema / properties / engine / enum
        Previous value: -[
        -  "phaser",
        -  "godot",
        -  "unity",
        -  "gamemaker",
        -  "tiled"
        -]New value: +[
        +  "phaser",
        +  "godot",
        +  "unity",
        +  "gamemaker",
        +  "unreal",
        +  "tiled"
        +]
      • changedInput schema / properties / size / description
        Previous value: -"Phaser character exports only — narrow the zip to one downscale variant. Godot, Unity, and GameMaker always use full-resolution source frames."New value: +"Phaser character exports only — narrow the zip to one downscale variant. Godot, Unity, GameMaker and Unreal use full-resolution source frames."
    • Changedplan_sync1 field changed
      • changedInput schema / properties / entities / items / properties / engine / enum
        Previous value: -[
        -  "phaser",
        -  "godot",
        -  "unity",
        -  "gamemaker",
        -  "tiled"
        -]New value: +[
        +  "phaser",
        +  "godot",
        +  "unity",
        +  "gamemaker",
        +  "unreal",
        +  "tiled"
        +]
    • Changedrevise_asset1 field changed
      • changedInput schema / properties / templateId / description
        Previous value: -"Terrain only — generate a focused category pack."New value: +"Environment Kit (`terrain`) only — legacy focused category pack, not a dashboard prompt-starter ID."
    • Changedsuggest_motion_hint1 field changed
      • changedInput schema / properties / assetId / description
        Previous value: -"Staged asset id or slug."New value: +"Object States asset id or slug."

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources