Skip to main content
Glama

Server Details

AI photoshoot studio: garments, avatars, locations, and art direction

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 75 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

C2.8/5.0

Scored across 84 tools

Disambiguation2/5

There are many overlapping tools for the Shoot Board context/items (mcp_get_context, read_shoot_board, mcp_add_context, mcp_replace_context, mcp_clear_context, modify_shoot_board) and for briefs/automations (get_brief, list_briefs, mcp_brief_list, mcp_edit_brief, propose_brief, update_brief, save_automation, mcp_recipe_save_draft). Descriptions sometimes clarify intent, but an agent can easily misselect between near-duplicate board, brief, and automation lifecycle tools.

Naming Consistency2/5

Most names are snake_case, but conventions are mixed: mcp_ prefixed tools coexist with unprefixed tools, and the same concepts are called brief vs mcp_brief, automation vs recipe, context vs shoot_board. Verb patterns are also inconsistent (get_ vs read_ vs list_ vs mcp_brief_list), making the set hard to predict.

Tool Count1/5

84 tools is far beyond a well-scoped set for this domain, especially with many overlapping board, brief, intake, automation, and generation-result tools. The surface is large enough that discovery and correct selection become a major burden.

Completeness4/5

The surface is broadly comprehensive across the photoshoot workflow: library search, board editing, brief proposal/update/confirmation, generation polling/results, QA, automations, montage, uploads, and settings. There may be minor gaps and redundancies, but core lifecycle coverage is strong.

Available Tools

84 tools
add_chat_photos_to_boardAdd Chat Photos to BoardAInspect

Use this when the user attaches images in this chat and wants them in Uwear, on the Shoot Board or in a shoot: clothing, a Model, a Location or a reference. Put each attachment in its own field, image_file_1, image_file_2, ... in attachment order, as the chat provides it: ChatGPT passes the file itself, also when you see only a file name or path. Chat attachments only: a web address is refused (ask the user to attach that photo). kinds: {image_file_N: garment|avatar|location|reference} for photos whose kind the user said or is clear (avatar: a person to use as a Model); Uwear sorts the rest. Saves each photo to the library (a repeat is reused), adds it to the board and returns its pile and asset id for propose_brief / update_brief. A photo returned unsure lists two candidates: ask the user and call again with the same files, kinds, sides and back_of. back_of: {image_file_N: image_file_M} when image_file_N is the back of the same garment image_file_M shows from the front (you can see they match): Uwear saves one garment with both photos. sides: {image_file_N: back} for a garment photo that plainly shows a garment's back with no front photo of it here; left out, a photo is its garment's front.

NameRequiredDescriptionDefault
kindsNoWhat each photo is, when you can tell (garment: clothing; avatar: a person to use as a Model; location: a place; reference: a pose, mood or styling photo), or the user's answer for one that came back unsure: {image_file_N: kind}. A photo left out is sorted by Uwear.
sidesNoGarment photos only, when you can see which side one shows: {image_file_N: back} for a photo of the garment's back. A photo left out is its garment's front.
back_ofNoTwo photos of one garment, when you can see they match: {image_file_N: image_file_M} for image_file_N showing the back of the garment image_file_M shows from the front. Uwear saves one garment with both photos.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
image_file_1YesAn image attached in this chat, passed as the chat provides it.
image_file_2NoAn image attached in this chat, passed as the chat provides it.
image_file_3NoAn image attached in this chat, passed as the chat provides it.
image_file_4NoAn image attached in this chat, passed as the chat provides it.
image_file_5NoAn image attached in this chat, passed as the chat provides it.
image_file_6NoAn image attached in this chat, passed as the chat provides it.
image_file_7NoAn image attached in this chat, passed as the chat provides it.
image_file_8NoAn image attached in this chat, passed as the chat provides it.
image_file_9NoAn image attached in this chat, passed as the chat provides it.
image_file_10NoAn image attached in this chat, passed as the chat provides it.
upload_handlesNoOnly after running a previous call's upload_command: {image_file_N: the sha256 it printed for that photo}. Never the attachments themselves: those go in image_file_N.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only say non-readonly, non-destructive, non-idempotent; the description adds the substantive behavior: each photo is saved to the library, a repeat is reused, it is added to the board, and the return includes pile and asset id for propose_brief/update_brief. It also discloses the unsure-two-candidates flow and that Uwear auto-sorts unlabeled photos, none of which is derivable from 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.

Conciseness3/5

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

The activation condition is correctly front-loaded, but the body is a set of long run-on sentences dense with internal jargon ('Uwear sorts the rest', 'returns its pile'), which slows parsing. Nearly every clause carries information, but the packaging is heavier than needed for a 15-parameter tool.

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 15-parameter nested-schema mutation with no output schema, the description covers trigger, refusal case, kind/side/back_of semantics, and what is returned (pile and asset id). The main omission is the upload_handles / upload_command escape hatch for oversized files, which is only discoverable from 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 baseline is 3; the description still earns a bump by giving the ordering rule (attachment order into image_file_1, image_file_2, ...), the meaning of avatar ('a person to use as a Model'), the sides default, and the matching rule for back_of. It never mentions upload_handles or the upload_command retry, leaving that two-step path to the schema alone.

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?

Opens with a concrete trigger and verb+resource: attaching images in the chat and getting them onto the Shoot Board in Uwear, with the accepted photo categories spelled out. It does not name the near-sibling upload paths (save_reference_file_from_chat_file, upload_avatar_from_chat_file, upload_garment_from_public_url), so the agent must infer the boundary from 'Chat attachments only: a web address is refused'.

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?

States the activation condition ('when the user attaches images in this chat and wants them in Uwear'), the exclusion ('Chat attachments only: a web address is refused (ask the user to attach that photo)'), and the re-invocation path when a photo returns unsure – 'ask the user and call again with the same files, kinds, sides and back_of'. When-to-use, when-not, and the follow-up loop are all explicit.

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

confirm_briefGenerate BriefA
DestructiveIdempotent
Inspect

Executes the reviewed photoshoot flow, including its declared image and video steps. Spends credits at the brief's quote. This client may show no approval prompt, so call it only when the user agreed in chat to run the brief: their message asking to generate or run it is that agreement, a request to change the brief is not one; otherwise give the quote and wait for their yes. expected_brief_revision, runs and expected_total_credits must match the latest brief; if they changed, nothing runs and the current brief is returned. The same idempotency_key never runs or charges twice.

NameRequiredDescriptionDefault
runsYesWhat this Generate runs: each Automation, its looks and its steps, as get_brief returns them.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
idempotency_keyYesRetry key for one Generate: never runs or charges twice.
expected_total_creditsYesThe credits this Generate charges, as get_brief returns them.
expected_brief_revisionYesThe board's brief_revision shown with this brief.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructive, non-read-only and idempotent, but the description adds context the annotations cannot: that no approval prompt may be shown to the client, that stale expected_brief_revision or expected_total_credits causes a no-op with the current brief returned, and that the idempotency key prevents double charging. It does not say what a successful run yields or how to follow progress.

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 it does and what it costs, then the gating rule, then the validation and idempotency guarantees. Dense but every clause carries operational meaning; the approval-prompt sentence is long but earns its length given the risk of unauthorized spend.

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 destructive, credit-spending call with six required parameters, the description covers the preconditions, the stale-data failure mode, and the retry guarantee. The remaining gap is the post-call path — no output schema exists, and it never says what comes back or that get_generation_status / mcp_brief_runs should be used to follow the run.

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 83%, so the baseline is 3; the description raises it by explaining the guard semantics of expected_brief_revision and expected_total_credits (mismatch means nothing runs) and by tying idempotency_key to the no-double-charge guarantee. brief_id and board_id meaning is left to 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 and resource — executes the reviewed photoshoot flow with its declared image and video steps — and names the material consequence (spends credits at the quote). This clearly separates it from propose_brief, get_brief, update_brief and the read-only 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?

Explicitly defines the precondition: call only when the user agreed in chat, with a concrete test for what counts as agreement (asking to generate/run) and what does not (a request to change the brief). It also names the fallback when the condition is unmet — give the quote and wait for a yes.

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

create_locationCreate LocationAInspect

Create a reusable location/scene reference from an image URL. If no description is supplied, the backend analyzes the image. Use the returned location_id in propose_brief/update_brief.

NameRequiredDescriptionDefault
nameYesName for the reusable location/scene reference
tag_idsNoOptional tag IDs to assign after creating the location
image_urlYesURL of the location/reference image
descriptionNoOptional location description. If omitted, the system analyzes the image.
thumbnail_urlNoOptional thumbnail URL
source_metadataNoOptional provenance metadata for the source image

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare this is a write operation (readOnlyHint=false) and not destructive. The description adds valuable context: the backend automatically analyzes the image if no description is supplied, and the tool returns a location_id for later use. This goes beyond the annotations by disclosing the auto-analysis behavior and the reusable nature of the created reference.

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 sentences with no filler. It front-loads the core action, then adds the conditional behavior, then a usage hint. Every sentence earns its place, and the structure is clean and scannable.

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 6 parameters, 2 required, and nested objects, the description covers the key behavioral aspects: what it creates, the auto-analysis fallback, and the returned ID. It does not explain error handling or permissions, but the schema and annotations already cover the parameter details and safety profile. For a create tool, this is reasonably complete for an agent to invoke 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%, so each parameter is documented in the schema. The description adds minimal extra parameter-specific meaning: it clarifies the behavior of the 'description' parameter (if omitted, backend analyzes the image). This is a useful nuance but does not substantially compensate for the schema already covering all parameters. 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 states a specific verb ('Create'), a clear resource ('reusable location/scene reference'), and the source ('from an image URL'). It clearly distinguishes from sibling tools like create_tag or create_art_direction by focusing on location references. The downstream usage hint ('Use the returned location_id in propose_brief/update_brief') further clarifies its 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 implies when to use the tool (to create a location reference for briefs) and gives a downstream usage hint. However, it does not explicitly state when not to use it or name alternatives like update_brief or get_location. Still, the purpose is clear enough that an agent can infer appropriate usage without explicit exclusions.

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

create_tagCreate TagAInspect

Create a new tag for organizing assets (garments, models, outfits, files, results, locations). Requires an active company workspace.

NameRequiredDescriptionDefault
nameYesTag name (unique within the company)
colorNoOptional hex color, e.g. '#22C55E'

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds the workspace requirement but doesn't disclose uniqueness enforcement or idempotency-related behavior (e.g., what happens if a duplicate name is submitted). 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?

The description is a single front-loaded sentence that communicates the core functionality. The asset type list is slightly detailed but remains compact and useful.

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 create tool with full schema coverage and no output schema, the description and schema together provide sufficient guidance. It could mention return values or duplicate-name behavior, but these are not critical for tool selection and 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?

Schema description coverage is 100%, with both parameters fully described (name with uniqueness and maxLength; color with format example). The description adds no parameter-specific meaning beyond listing asset types, 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 action ('Create a new tag'), the resource ('for organizing assets'), and enumerates the asset types. This distinguishes it from sibling tools like list_tags and get_items_by_tag, which have different purposes.

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 precondition ('Requires an active company workspace') and indicates a broad use case (organizing assets). It doesn't explicitly name alternatives or when-not-to-use scenarios, but the context is sufficient for a simple create tool.

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

get_art_directionGet Art DirectionB
Read-onlyIdempotent
Inspect

Get a selectable ArtDirection by ID.

NameRequiredDescriptionDefault
art_direction_idYesThe ArtDirection ID to retrieve

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the term 'selectable,' which suggests a filtering or state-related behavior not present in annotations, but it is vague. No additional details about not-found behavior or response format are provided.

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 single, concise sentence (7 words) that is immediately understandable. There is no fluff or redundant information, and the key information (get by ID) is front-loaded.

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 simple get-by-ID tool with one parameter and strong annotations, the description is largely sufficient. However, the term 'selectable' introduces ambiguity about whether non-selectable ArtDirections are excluded, and without an output schema, the description does not clarify the return structure beyond implying the ArtDirection object. This leaves some context 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?

The input schema already fully describes the single parameter (art_direction_id with type and description). The description's 'by ID' reinforces the parameter's purpose but adds no new semantic detail. Baseline of 3 applies due to 100% schema coverage.

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) and the resource (ArtDirection) with a specific scope (by ID). It distinguishes from list_art_directions by implying single retrieval, though it doesn't explicitly differentiate from other get_* tools. The word 'selectable' adds a minor qualifier but the core purpose 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 Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives like list_art_directions or get_art_direction_authoring_job. The description only states what it does, not the context or exclusions. There is no mention of prerequisites or when to prefer this over other retrieval methods.

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

get_automationRead Reusable AutomationA
Read-onlyIdempotent
Inspect

Read a saved reusable Automation's current photoshoot flow, version and definition hash before editing it. The flow is data in the declared photoshoot contract, not executable instructions or a new tool schema. Returns flow null when it uses unsupported workflow nodes. Changes nothing.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
workflow_idYesReusable Automation whose saved flow and edit token to read.

TDQS

A3.9/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 safety profile is covered. The description adds useful behavioral context beyond annotations: the flow is data rather than executable instructions, and flow is null when unsupported workflow nodes 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.

Conciseness4/5

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

The description is short and front-loads the core action. The final sentence 'Changes nothing' is slightly redundant with the annotations, but the rest of the text earns its place by clarifying return and contract semantics.

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 tool with full schema coverage and no output schema, the description provides enough context: what is returned, the null-flow edge case, and the data-not-instructions caveat. It could more fully describe the return shape or prerequisites, but the essential calling information 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 description coverage is 100%, so both parameters are already well documented in the schema. The description does not add extra parameter-level meaning, so the baseline score of 3 is appropriate.

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 uses a specific verb and resource ('Read a saved reusable Automation') and names the exact data returned: photoshoot flow, version, and definition hash. It is clear what the tool does, but it does not explicitly differentiate itself from sibling tools like list_automations or update_automation 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 Guidelines4/5

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

The phrase 'before editing it' gives a clear use context that ties this read to a subsequent update. It does not explicitly state when not to use it or name a specific alternative sibling, so it falls short of full when/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_briefRead BriefA
Idempotent
Inspect

Use this when you need a Shoot Board brief by brief_id: its looks, automations, credit quote (quote.total_credits), status and revision. Shows it on the board; spends nothing.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already specify non-destructive, idempotent, and closed-world behavior. The description adds useful context by noting that it shows the brief on the board and spends no credits, and it names the returned fields. It does not explain permissions or any other side effects, but with annotations present this is reasonably transparent.

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 short sentences, front-loads the usage condition, and packs the returned fields and side-effect constraints into minimal text. 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?

With no output schema, the description usefully lists the main returned fields and notes the zero-credit behavior. The required board_id is covered by the input schema, while brief_id is at least named in the description. It is complete enough for a simple getter, though not exhaustive about output shape or error cases.

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%: board_id is described in the schema, while brief_id has no schema description. The description compensates partially by saying the brief is retrieved by brief_id, but it does not discuss board_id or add further parameter guidance. This is adequate but incomplete.

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: get a Shoot Board brief by brief_id. It also lists what is returned (looks, automations, credit quote, status, revision), so the tool's purpose is clear. It does not explicitly distinguish itself from siblings such as list_briefs or read_shoot_board, which keeps it at 4.

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 opening 'Use this when you need...' gives a clear usage context. However, it does not state when not to use it or name alternatives such as list_briefs or read_shoot_board, so it falls short of full routing guidance.

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

get_generation_resultsShow ResultsA
Read-onlyIdempotent
Inspect

Use this to show results in chat: generation_result_id (from mcp_brief_runs) for one result, generation_id for a job's results, or query, filters and dates to find past ones. Returns image previews to show as they are (never Markdown-embed result URLs); url is the original. Changes nothing.

NameRequiredDescriptionDefault
kindNoFilter by type: 'Image', 'Edit', 'Upscale', 'Video'
pageNoPage number for pagination
limitNoNumber of items per page
queryNoHybrid search across generated image content, originating item names, and SKUs.
tag_idsNoFilter by tag IDs (results must have at least one)
decisionNoFilter by the unified result verdict.
end_dateNoFilter results created on or before this ISO date/datetime, e.g. 2026-04-27.
model_idsNoFilter results to images generated with these AI models
avatar_idsNoFilter results to images generated with these avatars
outfit_idsNoFilter results to images generated with these outfits
start_dateNoFilter results created on or after this ISO date/datetime, e.g. 2026-04-20.
qa_statusesNoFilter by QA statuses, e.g. pending, processing, completed, error.
location_idsNoFilter results to images generated with these locations
generation_idNoFilter by parent generation ID (lists all result images from one generation job)
decision_sourceNoFilter by the verdict source.
include_snapshotNoInclude full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery.
art_direction_idsNoFilter results to images generated with these art directions
clothing_item_idsNoFilter results to images generated with these clothing items
generation_result_idNoLook up a single result image by its generation_result_id (the exact integer ID required by QA/edit/upscale/video tools). Returns that one result directly.

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, non-destructive, closed-world, so 'Changes nothing' is redundant. What the description does add is beyond the annotations: it discloses that responses carry image previews intended to be displayed verbatim and that 'url' points to the original asset. That render-contract is exactly the kind of context annotations can't convey, though it says nothing about pagination or result volume.

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 intent ('Use this to show results in chat'), then the disambiguation modes, then the rendering rule. It packs a lot into a couple of dense clauses, though the parenthetical '(from mcp_brief_runs)' is slightly opaque to an agent that doesn't know that tool.

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 19-parameter, zero-required, no-output-schema list tool, the definition covers the key decision points: which identifier selects which mode and how to render what comes back. Return shape is only partially described (previews + url), and pagination defaults/limits are left to the schema, but 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.

Parameters3/5

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

Schema coverage is 100% across 19 parameters, so the schema already carries the semantics; the description only highlights three of them by name. It adds the relationship 'generation_result_id is the exact integer ID required by QA/edit/upscale/video tools', which is useful, but the many filter dimensions are left entirely to the schema. Baseline 3 with schema doing the heavy lifting.

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 ('show results in chat') and enumerates three distinct lookup modes keyed on generation_result_id, generation_id, or query/filters/dates. It's clear what the tool retrieves, though it never names the sibling it differs from (e.g. mcp_read_generation_result or mcp_review_generation_results), so an agent must infer the split.

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 a/b/c mode breakdown is genuine routing guidance: one result by generation_result_id, all results of a job by generation_id, past results by query/filters/dates. It also gives a rendering directive (use previews as-is, never Markdown-embed result URLs, url is the original). No explicit exclusions versus sibling reader tools, but the usage context is clear.

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

get_generation_statusGeneration StatusA
Read-onlyIdempotent
Inspect

Use this to check one generation job by generation_id: its status, credits and, when it failed, a safe error_message. A brief's runs are read with mcp_brief_runs. Changes nothing.

NameRequiredDescriptionDefault
generation_idYesThe generation ID to check. Returns compact status, avatar_id, model_id, model_slug, and use_case. UI 'Gemini Pro' maps to model_slug nano-banana-pro or nano_banana_pro_clothing.
include_snapshotNoInclude full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotent/non-destructive, so 'Changes nothing' is mostly a restatement; however, the description adds genuinely new behavioral facts the annotations cannot carry — that a failed job yields a sanitized 'safe error_message' and that credits are reported per job. That is useful context for interpreting the response.

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, zero filler: the identity/purpose leads, the sibling routing follows, and the safety note closes. Every clause carries information an agent would otherwise have to infer.

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 takes on responsibility for signaling what comes back and does so at a high level (status, credits, error_message), while the schema fills in the rest. Minor gap: it says nothing about failure/pending states or how long a job may take, which matters for a polling-style status check.

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 generation_id property description is unusually rich (returned fields, model_slug mapping, include_snapshot cost warning). The description only echoes 'by generation_id', adding no semantics beyond the schema, which is the correct baseline-3 outcome when the schema does the heavy lifting.

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 ('check one generation job by generation_id') and enumerates what is returned: status, credits, and a safe error_message on failure. It also names the sibling it is not (mcp_brief_runs), so the agent can separate it from the brief-level run listing without opening a schema.

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?

Clearly frames the use case as a single job by ID and routes the agent to mcp_brief_runs when it actually wants a brief's runs. It does not address the other plausibly overlapping siblings (get_generation_results, mcp_read_generation, mcp_read_generation_result), so the disambiguation is helpful but incomplete.

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

get_user_creditsGet Credit BalanceA
Read-onlyIdempotent
Inspect

Get user's current credit balance.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the context that it retrieves the 'current' balance for the user, which is useful but minimal. It does not contradict 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 single, clear sentence with no wasted words. It is immediately understandable and well-structured.

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 tool with no parameters and rich annotations, the description sufficiently communicates the operation. It does not describe the return format, but given the low complexity, this is an acceptable 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?

The tool has zero parameters and schema coverage is trivially 100%, so the baseline is 4. The description adds no parameter details because there are none to describe.

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 a specific verb ('Get') and resource ('user's current credit balance'), which distinguishes it from related tools such as create_credit_checkout_session and estimate_cost. It is slightly more specific than the title, though it does not explicitly mention alternatives.

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 about when to use this tool versus alternatives. The description does not mention any exclusions or context for use, leaving the agent to infer from the name alone.

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

list_art_directionsList Art DirectionsA
Read-onlyIdempotent
Inspect

List selectable ArtDirections as compact summaries: visible system ArtDirections plus company ArtDirections. Use query to match exact names and natural-language creative requests. Use this as the catalog step before choosing an art_direction_id for a brief; if there is no clear match, fall back to the user's phrase as prompt/creative_context. Use get_art_direction for the full markdown document before reusing one in a brief.

NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoNumber of compact ArtDirection summaries per page
queryNoHybrid search across saved ArtDirection names and creative content.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral context about the returned format (compact summaries), inclusion of system and company ArtDirections, and query behavior for natural-language requests, which is useful beyond 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, front-loaded with the primary function and using each sentence for distinct guidance: output scope, query usage, and follow-up action. 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?

The tool is a simple list operation with optional parameters and no output schema, but the description covers what is returned (compact summaries), what is included, how to use it in the workflow, and where to go for full details. It is fully contextualized within its sibling set.

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%, so the schema already documents page, limit, and query. The description adds slight nuance by explaining query can match exact names and natural-language creative requests, but this largely mirrors the schema's 'hybrid search' description, so a baseline score 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 lists selectable ArtDirections as compact summaries, specifying the scope (visible system plus company ArtDirections). This distinguishes it from get_art_direction, which is referenced for full documents.

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 positions the tool as the catalog step before choosing an art_direction_id for a brief and advises a fallback to the user's phrase if no match. It also directs users to get_art_direction for full markdown, providing clear when-to-use and alternative guidance.

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

list_automationsAutomationsA
Read-onlyIdempotent
Inspect

Lists the user's Automations, most recently used first, one row each. 10 per page (limit up to 25; cursor: next_cursor for more). Changes nothing.

NameRequiredDescriptionDefault
limitNoRows per page (default 10).
cursorNoThe next rows: the next_cursor of the previous page.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so 'Changes nothing' is largely redundant. The description does add behavior not in annotations: the ordering guarantee (most recently used first) and the concrete paging model (10 per page, up to 25, continue with next_cursor), which are real operational facts.

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 tight sentences with zero filler; the core purpose is front-loaded, and paging plus the read-only note are packed into the same compact statement.

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 describing returns; it covers count, ordering and row granularity but not which fields each automation row contains. For a low-risk read-only lister with full schema coverage on inputs, this is nearly complete.

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 description merely restates what the schema documents (limit up to 25, cursor as next_cursor from the previous page). It adds no format or edge-case meaning 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?

States a specific verb and resource (lists the user's Automations) plus scope, result shape ('one row each'), and ordering ('most recently used first'). No sibling tool lists automations, so there is no ambiguity to disambiguate, and the agent can tell exactly what comes back.

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 board_id requirement (from Open Shoot Board or context) and the paging hints suggest enumerating automations on a board and browsing when there are more than 10. There is no explicit statement of when to prefer this over other listing tools or any exclusion, so an agent must infer the trigger.

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

list_avatarsList ModelsA
Read-onlyIdempotent
Inspect

List the user's Models: the reusable people who wear the Clothing (not the AI models; for those, use mcp_list_model_catalog). Supports structured filters or query for hybrid name/metadata/image-attribute search. Set include_image_url=true when the Model's image itself is needed.

NameRequiredDescriptionDefault
pageNoPage number for pagination
sortNoSort order: 'field:direction', e.g. 'created_at:desc'. Default: created_at:desc
limitNoNumber of items per page
queryNoHybrid search across avatar/model names, metadata, and visual attributes.
tag_idsNoFilter to avatars with any of these tags
end_dateNoFilter: created on or before this date (ISO format)
avatar_idsNoFilter to specific avatar IDs
start_dateNoFilter: created on or after this date (ISO format)
include_image_urlNoSet true when you need to inspect or reuse the avatar/model image URL.

TDQS

A4.4/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 bar is lower. The description adds genuinely new behavioral context: image URLs are opt-in via include_image_url, and search is hybrid across names, metadata, and visual attributes. It does not describe return shape or pagination behavior, but that is a modest gap given the annotation coverage.

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 core action and disambiguation before the capability notes. No filler or restated title text; every clause carries 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?

For a zero-required-parameter list tool with 100% schema coverage and safety annotations, the description covers identity, routing, search modes, and the key opt-in flag. It does not mention result volume/pagination behavior, a minor omission since no output schema exists.

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 nine parameters including defaults and constraints. The description reinforces query and include_image_url semantics but adds no syntax or format detail beyond what the schema already states, so baseline 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?

States a specific verb (List) and resource (the user's Models/avatars), and immediately disambiguates the ambiguous term 'Model' from AI models by naming the sibling mcp_list_model_catalog. An agent can route correctly without opening either 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?

Explicitly names the alternative (mcp_list_model_catalog) and the condition that selects it ('for those [AI models]'), plus states the two search modes (structured filters vs. hybrid query) and when to set include_image_url=true. Both the when-to-use and the sibling alternative are covered.

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

list_briefsBrief HistoryA
Read-onlyIdempotent
Inspect

Use this to find a past shoot when the user refers to one ("run the same as last week") or asks what ran: the account's briefs, newest first, 10 by default (limit up to 25; before: next_before for older ones; status ran for generated ones only; automation_workflow_id for the runs of one Automation). Each compact row has its brief_id, title, status, ran_at, automations, direction label, image model, output, look count and credits. Then read the one you need with get_brief for its full values. Changes nothing.

NameRequiredDescriptionDefault
limitNoRows per page (default 10).
beforeNoOlder briefs: the next_before of the previous page.
statusNoran: briefs that were generated; draft: this board's unrun brief. Omit for both.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
automation_workflow_idNoOnly briefs on this Automation (a workflow_id from list_automations or a brief row), its copies included; the board's draft counts unless status is ran.

TDQS

A4.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 the description reinforces this with 'Changes nothing'. It adds genuinely useful behavior beyond that: newest-first ordering, default page size, the next_before cursor for paging older, and the exact compact row fields returned. Not a 5 only because it doesn't note edge cases like what happens when the board has no briefs.

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 use case and resource are front-loaded in the first clause, and every sentence carries information. The parenthetical parameter list is dense and slightly repetitive with the schema, keeping it just below top marks.

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 compensates by enumerating the returned row fields (brief_id, title, status, ran_at, etc.) and the paging model. Combined with the annotations, an agent has everything needed to call and interpret 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 100%, so the schema already documents limit, before, status, board_id, and automation_workflow_id, including the enum meanings and cursor semantics. The description restates these inline but adds no format or usage detail beyond the schema, so baseline 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?

States a specific verb and resource ('find a past shoot… the account's briefs, newest first') and frames the user phrasings that trigger it. It also distinguishes itself from get_brief by pointing there for full values, so an agent can route correctly without opening either 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 when-to-use triggers ('run the same as last week', 'what ran') and names the follow-up alternative get_brief for details. The status/automation_workflow_id notes further imply when to narrow versus list broadly.

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

list_garmentsList GarmentsA
Read-onlyIdempotent
Inspect

List user's garments with structured filters or query for hybrid name/SKU/metadata/image-attribute search. body_zone expands to categories and is ORed with category when both are given. With a category or body_zone filter and include_uncategorized=false, uncategorized_count reports garments hidden by the category filter within the same scope. If matches are short and uncategorized_count > 0, call again with include_uncategorized=true and inspect those garments.

NameRequiredDescriptionDefault
pageNoPage number for pagination
sortNoSort order: 'field:direction', e.g. 'created_at:desc', 'clothing_item_name:asc'. Default: created_at:desc
limitNoNumber of items per page
queryNoHybrid search across garment names, SKUs, metadata, and visual attributes.
tag_idsNoFilter to garments with any of these tags
categoryNoFilter to garments in any of these canonical categories; OR with body_zone when both are given.
end_dateNoFilter: created on or before this date (ISO format)
body_zoneNoFilter to categories in any of these body zones; OR with category when both are given.
start_dateNoFilter: created on or after this date (ISO format, e.g. '2025-06-01')
clothing_item_idsNoFilter to specific garment IDs
include_image_urlNoSet true when the garment image itself is needed for visual display or reuse.
include_uncategorizedNoAlso include garments with no category when category and/or body_zone filters are used. If the first result has uncategorized_count > 0 and too few matches, call again with true and inspect those garments.
exclude_clothing_item_idsNoExclude these garment IDs, for example the attached garment.

TDQS

A4.2/5.0
Behavior5/5

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

Annotations only declare the generic safety profile (readOnly, idempotent, non-destructive), so the description carries the real behavioral load. It discloses the OR semantics between body_zone and category, the scoping rule that uncategorized_count only reports when a category/body_zone filter is active with include_uncategorized=false, and the recovery workflow. Since there is no output schema, surfacing uncategorized_count behavior here is genuinely necessary.

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 sentences, front-loaded with the core purpose, then filter semantics, then the follow-up rule. No filler or repetition of schema text. It is somewhat dense for a single paragraph, but every sentence carries a distinct operational fact.

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 13-parameter, zero-required read tool with no output schema, the description covers the non-obvious interactions (category/body_zone OR, uncategorized handling) that an agent would otherwise get wrong. Pagination, sorting and ID filters are adequately covered by the schema. The main omission is what the response shape looks like beyond uncategorized_count, though that is defensible without an output 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 description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: body_zone 'expands to categories' (expanding rather than exact-matching), the OR relationship with category, and the conditional semantics of include_uncategorized and uncategorized_count. That is real added value over the per-field schema text.

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 ('List user's garments') and immediately distinguishes two modes: structured filters versus hybrid name/SKU/metadata/image-attribute search. It does not, however, name the closest sibling (e.g. search_uwear_library or list_outfits) to route the agent between them, so the differentiation is functional rather than sibling-aware.

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 concrete conditional guidance: body_zone ORs with category when both are supplied, and it prescribes an explicit follow-up ('If matches are short and uncategorized_count > 0, call again with include_uncategorized=true'). That is unusually actionable for a list tool. It stops short of stating when to prefer this tool over the sibling list/search tools.

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

list_locationsList LocationsA
Read-onlyIdempotent
Inspect

List reusable location/scene reference images by structured filters or query: IDs, tags, date range, and sort. Use when the user wants to pick a saved background/location reference for a generation.

NameRequiredDescriptionDefault
pageNoPage number for pagination
sortNoSort order: 'field:direction', e.g. 'created_at:desc', 'location_name:asc'. Default: created_at:desc
limitNoNumber of items per page
queryNoHybrid search across location names, metadata, and visual attributes.
tag_idsNoFilter to locations with any of these tags
end_dateNoFilter: created on or before this date (ISO format)
start_dateNoFilter: created on or after this date (ISO format)
location_idsNoFilter to specific location IDs
include_image_urlNoSet true when the location/reference image URL is needed for inspection or reuse.

TDQS

A4/5.0
Behavior3/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds useful context about the data being 'reusable location/scene reference images' and the user intent, but it does not disclose additional behavioral traits like return format, pagination behavior, or any edge cases 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 unnecessary words. The description front-loads the main action and resource, then provides filter details and a use case. Every word 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?

Despite having 9 optional parameters and no output schema, the description is adequate for a list tool: it names the resource, the filter dimensions, and the primary use case. The comprehensive schema covers parameter semantics. It could be slightly more complete by mentioning the return type (e.g., paginated list of location references), but the current coverage is solid.

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%, with each parameter having a detailed description. The description's summary of filters ('IDs, tags, date range, and sort') offers a high-level abstraction but does not add meaning 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 clearly states the verb 'List' and the specific resource 'reusable location/scene reference images'. It enumerates filter types (IDs, tags, date range, sort) and gives a concrete use case ('pick a saved background/location reference'), which distinguishes it from sibling tools like get_location or create_location.

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 phrase 'Use when the user wants to pick a saved background/location reference for a generation' provides clear context on when to invoke this tool. However, it does not explicitly mention when not to use it or name alternative tools, so it stops short of full usage guidance.

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

list_outfitsList OutfitsA
Read-onlyIdempotent
Inspect

List user's outfits (saved garment combinations). Filter by garment IDs, active status, date range, or query against contained garments.

NameRequiredDescriptionDefault
pageNoPage number for pagination
sortNoSort: 'field:direction'. Use 'latest_generation_at:desc' to surface recently generated outfits. Default: created_at:desc
limitNoNumber of items per page
queryNoSearch outfit names and contained garments.
sourceNoFilter by outfit source.
tag_idsNoFilter to outfits with any of these tags
end_dateNoFilter: created on or before this date (ISO format)
is_activeNoFilter by status: 'true', 'false', or 'both' (default: both)
outfit_idsNoFilter to specific outfit IDs
start_dateNoFilter: created on or after this date (ISO format)
clothing_item_idsNoFilter to outfits containing any of these garments

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destrutiveHint=false, so the safety profile is covered. The description adds that the listing is user-scoped and that outfits are saved combinations, but does not disclose pagination behavior, default filter semantics, or return shape. Given annotation coverage, this is adequate but not rich.

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 single compact sentence that leads with the core action and usefully clarifies what an outfit is. Every clause earns its place; there is no filler or redundancy.

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 list operation with full schema descriptions, annotations, and a clear resource scope, this description is almost complete. It would be fully complete with an explicit pointer to the single-outfit sibling or a note about pagination defaults, but those are already inferable from the 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 every parameter is already documented with defaults and meaning. The description only summarizes parameter categories (garment IDs, active status, date range, query) and adds no new semantic detail 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.

Purpose4/5

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

Clear verb+resource: 'List user's outfits' and defines outfits as 'saved garment combinations'. The filtering summary helps identify the operation, but it does not explicitly differentiate itself from siblings like get_outfit or propose_outfits, 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 Guidelines3/5

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

The phrase 'List user's outfits' and the filter list imply this is the bulk retrieval tool for saved outfits, and the user-scoped wording signals scope. However, there is no explicit when-to-use versus alternatives, such as using get_outfit for a single outfit or propose_outfits for generated suggestions.

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

list_tagsList TagsA
Read-onlyIdempotent
Inspect

List available tags for the user's company. Use this to resolve user-provided tag names like 'summer26' before selecting garments, outfits, models, files, generations, or locations. For no-UI MCP flows, find the tag ID here, then call get_items_by_tag or the relevant list_* tool with tag_ids.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds behavioral context by outlining a typical workflow (resolving tag names to IDs) and directing to follow-up tools, which goes beyond annotation coverage.

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 purpose, and immediately followed by actionable usage guidance. No wasted words.

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 simple list tool with no output schema, the description fully covers what the tool does, why it's useful (tag resolution), and how to use its output. No 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?

The tool has zero parameters, and the input schema is empty. The baseline for 0 params is 4 because there are no parameter semantics to explain. The description appropriately focuses on the tool's purpose and usage.

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: 'List available tags for the user's company.' This is a specific verb+resource+scope, and it distinguishes from siblings by explaining that this is the tag lookup tool used before other operations.

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 when-to-use guidance is provided: 'Use this to resolve user-provided tag names... before selecting garments, outfits, models, files, generations, or locations.' It also gives a concrete alternative: 'For no-UI MCP flows, find the tag ID here, then call get_items_by_tag or the relevant list_* tool with tag_ids.'

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

list_templatesList TemplatesA
Read-onlyIdempotent
Inspect

List canonical company templates, optionally filtered by kind, scope, command use case, creator, or public t-xxxx share code, with usage sorting. Keeps identify which values apply. Templates persist canonical commands but do not execute generations. System templates named Demo — … are worked examples of the canonical command language; read one with get_template before authoring a first brief or workflow.

NameRequiredDescriptionDefault
kindNo
pageNoPage number for pagination
sortNonewest
use_caseNoFilter by a use_case present in any stored command
share_codeNoReturn the template assigned this public t-xxxx share code
catalog_scopeNoFilter by library or owner_only. Owner-only templates are hidden unless explicitly requested.
template_kindNoFilter generation presets or read-only historical batch_workflow records
items_per_pageNoNumber of templates per page
created_by_profile_idNo

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/non-destructive, so the bar is lower; the description still adds value by clarifying that templates persist canonical commands but do not execute generations (a key misconception an agent could have) and that owner-only entries are hidden unless requested. Return shape and pagination behavior are not described.

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?

Three sentences, mostly dense and front-loaded, but the middle fragment 'Keeps identify which values apply' is broken and wastes space without conveying anything actionable. Otherwise there is little redundancy.

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 9-parameter, zero-required listing tool with no output schema, the description covers filtering, sorting defaults conceptually, and the Demo/get_template workflow. It never sketches what a returned template looks like, so an agent must infer the response shape from the schema alone.

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 67%, and the description compensates by naming the filter axes — kind, scope, command use case, creator, public t-xxxx share code — and usage sorting, mapping them to use_case, catalog_scope, created_by_profile_id, share_code and sort. It adds interpretive meaning (e.g. 'command use case') beyond the raw enum fields, though pagination controls go unmentioned.

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?

Opens with a concrete verb+resource ('List canonical company templates') and enumerates the filter dimensions plus sorting, which separates it from sibling list tools like list_briefs or list_art_directions. The fragment 'Keeps identify which values apply' is garbled and slightly muddies an otherwise precise statement of 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?

Gives real routing guidance: system templates named 'Demo — …' are worked examples, and the agent should read one via `get_template` before authoring a first brief or workflow. It lacks explicit when-not-to-use and doesn't contrast with other list tools, so it stops 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.

mcp_add_contextAdd to Shoot BoardCInspect

Append items to the Uwear Shoot Board.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
board_versionNoPass 2 to receive board v2 state, including the board's output settings
context_itemsYesShoot Board items to append to the current list
expected_revisionYesBoard revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The word 'Append' is consistent with that additive profile but adds no new behavioral information such as the revision-conflict safety mechanism, what happens on stale revisions, or whether duplicate items are merged.

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 short sentence with zero waste, front-loading the verb and resource. It is efficient, though its terseness is the source of the coverage gaps noted elsewhere rather than a structural flaw.

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 multi-parameter write tool with nested context_items, intake states, enum-constrained item types, and a revision-conflict protocol, one sentence is not enough. The description never surfaces the concurrency guard (expected_revision) or the item taxonomy, leaving the agent to reconstruct intent entirely from the 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 board_id, expected_revision, board_version, and the context_items shape. The description adds nothing beyond the schema, which is the baseline 3 case when structured fields do the heavy lifting.

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: 'Append items to the Uwear Shoot Board.' An agent can tell this is an additive write to a board. However, it does not distinguish itself from close siblings like modify_shoot_board, show_in_shoot_board, or mcp_replace_context, which an agent must choose between.

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 when-to-use guidance, no prerequisites, and no mention of the obvious alternatives (mcp_replace_context for replacing, mcp_clear_context for clearing, modify_shoot_board for edits). The agent is left to infer from the name alone when appending is the right call.

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

mcp_add_garment_viewAdd Garment ViewA
DestructiveIdempotent
Inspect

A Clothing card dropped on another. The photo of from_garment_id becomes the back, side or detail view of garment_id, and from_garment_id leaves the board (deleted only when it is a fresh drop nothing else uses). Or a photo put in the brief's missing-photo slot: image_url instead of from_garment_id, nothing leaves the board. The board's draft brief is saved again when the view changes it. Returns the board (and brief); asking again answers status unchanged.

NameRequiredDescriptionDefault
viewYesback, side, or detail (a close-up)
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
image_urlNoinstead of from_garment_id: the stored photo (host file download URL, or the image_url mcp_upload_intake_photo returned)
garment_idYesthe board garment that gains the photo as a view
from_garment_idNothe board garment whose photo it is; it leaves the board
expected_revisionYesBoard revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses exactly what is destroyed and under what condition: from_garment_id leaves the board and is deleted 'only when it is a fresh drop nothing else uses,' while the image_url path leaves the board untouched. It also adds side effects (the draft brief is re-saved) and idempotent behavior ('asking again answers status unchanged'), which is exactly the extra context annotations cannot carry.

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 sentences, front-loaded with the primary drop-on-garment scenario, and every sentence carries information (modes, deletion rule, brief save, return value). Phrasing is slightly telegraphic ('The photo of from_garment_id', 'the board's draft brief is saved again') which costs some readability but not content.

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 mutation tool with no output schema, the description covers the return value ('Returns the board (and brief)'), the destructive semantics of the source garment, the brief-save side effect, and repeat-call behavior. Combined with the schema's expected_revision conflict documentation, an agent has what it needs to call this 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 schema already documents all six parameters and the baseline is 3. The description adds real meaning on top: it explains that image_url and from_garment_id are mutually exclusive modes and that from_garment_id causes the source garment to leave the board, which the schema alone does not convey.

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 concrete effect: the photo of from_garment_id becomes the back/side/detail view of garment_id, with a second mode using image_url for the brief's missing-photo slot. An agent can tell what the tool accomplishes, though the framing as a UI gesture ('a Clothing card dropped on another') is less direct than a verb+resource statement, and no sibling is named.

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 clearly lays out two usage modes and the condition selecting each: use from_garment_id when dropping one garment card onto another, use image_url when filling the brief's missing-photo slot. It does not name alternatives such as add_chat_photos_to_board or mcp_upload_intake_photo for routing purposes, so it stops short of 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.

mcp_brief_listBriefsB
Read-onlyIdempotent
Inspect

The account's Shoot Board briefs, newest first: every brief that ran (on any Shoot Board) and this board's draft, each with its status, looks, automations, credits and covers.

NameRequiredDescriptionDefault
pageNo
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare a safe, idempotent, closed read, so the bar is lower. The description adds genuine behavioral value beyond them: sort order ('newest first'), the exact inclusion rule (all account briefs plus this board's draft), and the shape of each item (status, looks, automations, credits, covers).

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 that front-loads the resource and ordering before the scope enumeration. No filler, though the trailing field list makes it slightly heavy.

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 usefully enumerates returned fields, and the tool is a simple 2-param read, so safety and scope are covered. However, the page parameter and pagination behavior are unexplained, leaving an agent unable to call the tool correctly for multi-page results.

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%: board_id is documented in the schema but the page parameter has no description anywhere. The description never mentions pagination or what board_id scopes, so it does not 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?

States a specific verb+resource (list the account's Shoot Board briefs) and even defines the exact scope returned: every brief that ran plus this board's draft. It does not name or differentiate against siblings like get_brief or mcp_brief_runs, so it stops short of a 5.

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 guidance and no alternative is named. The scope sentence ('every brief that ran ... and this board's draft') implies this is the broad listing versus get_brief's single fetch, but the agent must infer that rather than being told.

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

mcp_brief_runsFollow Brief RunsA
Read-onlyIdempotent
Inspect

Use this after confirm_brief or when the user asks how a shoot is going: each look's run of brief_id with its status, credits, results (generation_result_id, kind, url) by step and the error of every step that failed (failures lists them all). Read it again until done is true; while it runs, say so (the board shows progress). Then show the results with get_generation_results. Changes nothing.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idNo
workflow_run_idsNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the 'Changes nothing' clause is redundant, but the description adds genuinely new behavior: this is an asynchronous job that must be re-polled until done is true, and the agent should narrate progress while the board shows it. That polling/settling semantics is not derivable from the annotations and is the key thing 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?

Front-loaded with the usage trigger, then return shape, then polling loop, then follow-up - a sensible order. Somewhat run-on with stacked parentheticals, but every clause carries information; nothing is padding.

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?

No output schema exists, and the description does the necessary work by enumerating what comes back (status, credits, results, failures, done). With annotations covering safety, the main gap is the undocumented workflow_run_ids parameter and the exactly-one constraint, which leaves it slightly short of fully self-contained.

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 33% - only board_id carries a schema description, and the object-level 'exactly one' note is the only guidance for brief_id vs workflow_run_ids. The description references brief_id in passing but says nothing about workflow_run_ids (up to 50 UUIDs) or the mutually exclusive selection, 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?

States clearly what the tool returns: each look's run for a brief_id with status, credits, results (generation_result_id, kind, url) and per-step errors. The verb is implicit ('follow' / 'how a shoot is going') rather than a crisp verb+resource, but an agent can determine what the call produces. It distinguishes itself from confirm_brief (upstream) and get_generation_results (downstream), though not from the sibling get_generation_status.

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?

Explicit trigger conditions: 'after confirm_brief or when the user asks how a shoot is going', plus a polling instruction ('Read it again until done is true') and a downstream routing hint ('show the results with get_generation_results'). No exclusion statement, and it never contrasts with get_generation_status, so a sibling ambiguity remains.

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

mcp_clear_contextClear Shoot BoardB
DestructiveIdempotent
Inspect

Clear all Shoot Board items, or only one context type.

NameRequiredDescriptionDefault
typeNoContext type to remove; omit to clear the entire Shoot Board
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
board_versionNoPass 2 to receive board v2 state, including the board's output settings
expected_revisionYesBoard revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is fully covered by structured data. The description adds no extra behavioral context such as irreversibility of the wipe, the revision-conflict guard, or what happens to dependent items; it essentially restates the purpose.

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 tight sentence with the primary action front-loaded and the variant clause second. No filler, though the extreme brevity leaves room for a clause that would earn its place.

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 destructive, revision-guarded write with no output schema, the annotations and 100% schema coverage carry most of the load, so the description is minimally sufficient. It nonetheless omits confirmation of irreversibility and the revision-conflict recovery path, which an agent invoking a destructive clear would benefit from.

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 all four parameters (including the type enum and expected_revision) are already documented in the schema. The description's 'only one context type' merely echoes the type parameter's own description, adding no syntax or format detail beyond it.

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 (clear) and resource (Shoot Board items), plus a scope variant (a single context type). It is distinguishable from siblings like mcp_add_context and mcp_replace_context by verb, though it doesn't name those alternatives directly.

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 'or only one context type' implies the two usage modes (clear everything when no type is given, clear selectively when it is), but no explicit when-to-use or when-not-to-use guidance is provided relative to replace_context or modify_shoot_board. Usage is inferable from the schema rather than stated.

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

mcp_commit_intakeSave Dropped PhotosA
Idempotent
Inspect

Save sorted Shoot Board photos to the library as garments, avatars, locations or reference files, skip ones already saved, and add them to the Shoot Board at expected_revision; a board that changed is refused before anything is saved (revision_conflict with the current board).

NameRequiredDescriptionDefault
itemsYesPhotos to save, each with its confirmed kind
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
expected_revisionYesBoard revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it

TDQS

A4.1/5.0
Behavior5/5

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

Annotations cover the safety profile (non-read-only, non-destructive, idempotent), and the description adds real behavioral context beyond them: dedup by already-saved state, optimistic concurrency via expected_revision, and the atomic guarantee that a stale board is refused before anything is saved with a revision_conflict payload. That is exactly the write-failure semantics an agent needs before invoking.

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?

One front-loaded sentence that leads with the action, then the dedup rule, then the concurrency clause. The semicolon-chained clauses are dense but each carries information; nothing is padding.

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, and the description still discloses the failure shape (revision_conflict with the current board) and the atomicity guarantee, which is the main uncertainty for a batch write against a versioned board. Required inputs and their roles are otherwise fully documented in the 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%, including detailed per-field docs for items, sha256, views and side, so the schema carries the load. The description only restates expected_revision's conflict behavior (already in the schema) and adds no syntax or format detail of its own; 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?

States a specific verb and resource: it saves sorted Shoot Board photos into the library as one of four asset kinds, then attaches them to the board. The batch/dedup/revision-check framing implicitly separates it from single-asset siblings like mcp_upload_intake_photo and upload_garment_from_public_url, 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 description places the tool in a clear workflow (photos are already sorted and screenshotted/uploaded; this commits them), and notes that already-saved photos are skipped rather than erroring. It gives no explicit exclusion such as 'use upload_garment_from_public_url for a single non-board garment', so guidance is clear but not complete.

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

mcp_delete_generation_resultsDelete ResultsA
DestructiveIdempotent
Inspect

Delete the user's results and their stored images, as the platform's Delete. Cannot be undone: call it only after the user confirmed in chat which results to delete.

NameRequiredDescriptionDefault
generation_result_idsYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds genuine context beyond that: it also destroys stored images, and it requires prior in-chat user confirmation. It does not disclose irreversibility beyond what destructiveHint implies, nor any batch/limit behavior, keeping it below 5.

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, action front-loaded and the precondition second — no filler. The 'as the platform's Delete' phrase is slightly redundant and costs a small amount of clarity.

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 destructive delete with no output schema and no param docs, the description covers the essentials: what gets removed, that it is irreversible, and the confirmation gate. It omits how to source valid IDs and the 100-item batch ceiling, which are the remaining operational gaps.

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 schema supplies structure only (array of positive ints, 1-100 items) with no semantics. The description alludes to 'which results to delete' but never explains the parameter's format, valid range, or where IDs are obtained; it does not 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?

States a specific verb (Delete) and resource (the user's results and their stored images), and clarifies it maps to the platform's own Delete. An agent can distinguish it from read-side siblings like mcp_read_generation_result and sibling mutations like set_generation_result_favorite. The 'as the platform's Delete' clause is slightly awkward but does not obscure the action.

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 an explicit precondition for invocation: 'call it only after the user confirmed in chat which results to delete.' This is exactly the gating guidance a destructive tool needs. It stops short of naming an alternative or where the IDs originate, so not a full 5.

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

mcp_edit_briefEdit Board BriefAInspect

Edit the Shoot Board's brief by hand: add, remove or change looks, or run looks through another automation. Saves a new brief linked to the board and returns the board, the brief, its quote and the credit delta; dry_run only quotes.

NameRequiredDescriptionDefault
opsYes
dry_runNoQuote the edit and its credit delta; save nothing.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYesThe board's brief (board.brief_id).
expected_brief_revisionYesThe board's brief_revision shown with the brief.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare non-read-only, non-destructive, non-idempotent, closed-world, so the bar is lower; the description still adds real value by disclosing that the edit is saved as a NEW brief linked to the board (versioning, not in-place mutation) and that the response includes board, brief, quote and credit delta. It does not mention the expected_brief_revision concurrency guard, though the schema does.

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 filler: the first names the action and the operation families, the second covers the save semantics, return payload and dry_run. Purpose is front-loaded ahead of behavioral detail.

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 multi-op mutation tool with no output schema, the description does state what is returned (board, brief, quote, credit delta) and that a new brief is saved. Remaining gaps are sibling routing guidance and the concurrency/idempotency contract, the latter of which the schema covers via expected_brief_revision.

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 80%, so the schema already documents board_id, brief_id, expected_brief_revision and dry_run. The description's op enumeration ('add, remove or change looks, or run looks through another automation') covers only a subset of the ten available ops (direction, models, output, refresh, restore, discard are unmentioned), so it neither adds nor fully compensates.

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 ('Edit the Shoot Board's brief') and enumerates the main operation families (add/remove/change looks, run looks through an automation). It does not distinguish this from close siblings like update_brief, propose_brief, or confirm_brief, so an agent cannot route purely from the description.

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?

'By hand' signals a manual-edit path and 'run looks through another automation' hints at the recipe workflow, plus 'dry_run only quotes' gives a preview usage pattern. But there is no explicit statement of when to choose this over update_brief or propose_brief, and no prerequisites or exclusions are given.

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

mcp_export_montageExport Montage VideoA
Destructive
Inspect

Export montage clips as one stitched video. Spends credits: call it only after the user confirmed the clips and their order in chat. Returns the generation_id to poll with get_generation_status.

NameRequiredDescriptionDefault
clipsYesOrdered generation-result clips to stitch into the montage
fit_modeYesHow each clip fits the output frame: contain or cover
aspect_ratioYesOutput video aspect ratio in W:H format
base_resolutionYesOutput base resolution in pixels

TDQS

A4/5.0
Behavior4/5

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

Adds two pieces of context beyond the annotations: that the call 'spends credits' and that it 'returns the generation_id to poll with get_generation_status.' The credit-cost warning and the follow-up polling workflow are genuinely useful behavioral facts the annotations (destructive, non-idempotent) don't convey. Could say more about irreversibility, but it is solid.

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, each earning its place: purpose, cost/precondition, and return handling. No redundancy or filler, and the most important constraint 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?

With no output schema, the description correctly carries the return-value burden by naming generation_id and the polling tool. Combined with the credit and confirmation caveats, an agent has what it needs to call this correctly, though edge cases (failure handling, credit cost magnitude) remain unstated.

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 seven clip sub-fields and output settings are already documented structurally. The description only reinforces the clips/order concept without adding syntax, format, or constraint detail beyond the schema. 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?

States a specific verb (Export) and resource (montage clips stitched into one video), which is clear and distinguishable from propose_montage/update_montage_proposal. It stops short of explicitly naming an alternative tool for the agent to compare against, but the action 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 Guidelines4/5

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

Gives an explicit precondition: 'call it only after the user confirmed the clips and their order in chat.' This is strong when-to-use guidance. It does not enumerate alternatives, but the confirmation gate is the operative condition and is clearly stated.

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

mcp_extract_video_frameSave Video FrameBInspect

Save a still frame of a video result as a new image result, as POST /generation-result/{id}/extract-frame. The result viewer's Save frame.

NameRequiredDescriptionDefault
timestamp_secondsNoFrame time in seconds; omit for the last frame.
generation_result_idYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations declare non-read-only, non-destructive, non-idempotent. The description is consistent, adding that the output is a NEW image result (so nothing existing is destroyed) and the endpoint. It does not explain what happens on repeat calls (idempotentHint=false implies duplicates) or auth requirements.

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?

One tight sentence plus a UI anchor phrase; the action and output are front-loaded with no filler. Slightly terse rather than padded.

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 mutation with no output schema that produces a brand-new artifact, the description never indicates what is returned (e.g., the new image result id) or how the new frame relates to the source result. Combined with the undocumented required parameter, an agent lacks enough to use it confidently.

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% and the description names no parameters at all. It says 'a still frame' without clarifying which frame, so the caller learns nothing about timestamp_seconds (last frame by default) or the required generation_result_id beyond what the schema shows.

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: 'Save a still frame of a video result as a new image result', plus the underlying route. It is clearly distinguishable from siblings like mcp_save_retouch or mcp_generate_clip, though it doesn't explicitly name a sibling.

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 'The result viewer's Save frame' anchors the tool to a known UI action, implying when it applies. However, it gives no conditions for choosing it over alternatives and no exclusions or prerequisites, leaving usage largely inferred.

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

mcp_generate_clipGenerate Montage ClipA
Destructive
Inspect

Queue an image-to-video generation for one montage clip. Spends credits: call it only after the user agreed in chat. Returns the generation_id to poll with get_generation_status.

NameRequiredDescriptionDefault
modelYesVideo model slug or supported model name
promptNoOptional motion prompt for the video clip
durationNoVideo duration in seconds; defaults to 5
image_urlNoHTTPS source image URL; provide exactly one source
resolutionNoOptional output resolution; defaults to 480p
generate_audioNoInclude audio in the delivered video. False delivers a silent file; fixed-audio providers are muted after generation at the same credits.
last_frame_urlNoOptional final-frame image URL for supported video models
uploaded_file_idNoUploaded file ID to use as the source image; provide exactly one source
generation_result_idNoExisting generation result ID to use as the source image; provide exactly one source

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, but the description adds value the annotations cannot: it spends credits and requires prior user consent in chat, and it returns a generation_id. These are important operational facts (cost and confirmation) beyond the safety profile.

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 tightly written sentences, each earning its place: what it does, the cost/consent constraint, and the follow-up call. The most critical constraint (spends credits) is front-loaded within the first two 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 9-parameter mutation tool with a fully documented schema and no output schema, the description covers the essentials an agent needs: the action, cost, consent gate, and the returned generation_id for polling. It is near-complete, lacking only explicit guidance on the mutually exclusive source parameters.

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 adds no per-parameter meaning (defaults, mutual exclusivity of the three source parameters, etc.) beyond what the schema already documents in detail.

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: 'Queue an image-to-video generation for one montage clip.' The 'one montage clip' scoping and the image-to-video modality make the operation concrete. It does not explicitly differentiate from siblings like propose_montage or queue_generation_result_qa, which keeps it from a 5.

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 a clear precondition ('call it only after the user agreed in chat') and routes the agent onward to get_generation_status for polling. This is actionable when-to-use guidance, though it doesn't state explicit when-not conditions or name a competing generation tool.

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

mcp_get_contextGet Shoot BoardC
Read-onlyIdempotent
Inspect

Read the Uwear Shoot Board.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
board_versionNoPass 2 to receive board v2 state, including the board's output settings

TDQS

C2.5/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds nothing beyond that: no note on required board state, no note on what 'context' means, no indication of whether an open board session is needed.

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?

It is a single short sentence with no wasted words, which is structurally clean. But the brevity here reflects under-specification rather than efficient front-loading, so it does not rise above adequate.

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?

There is no output schema, so the description should carry more weight regarding what a 'read' returns, yet it says nothing about return shape or how the result differs from read_shoot_board. For a tool whose name/title disagree and that has a near-identical sibling, this is incomplete.

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 (board_id, board_version with its enum) are documented in the schema itself, so the baseline is 3. The description contributes no additional meaning about the parameters.

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 one-liner does state a verb (Read) and a resource (the Uwear Shoot Board), which is minimally specific. However, it gives no way to distinguish this tool from the sibling read_shoot_board, and the tool name mcp_get_context actively misleads toward generic context retrieval. An agent cannot tell from the description why two read-board tools exist.

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 guidance, no prerequisites, and no mention of the obvious alternative read_shoot_board. The only faint signal is that it reads a board, which the name and title already imply.

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

mcp_intake_filesSort Dropped PhotosA
Read-onlyIdempotent
Inspect

Sort photos dropped on the Shoot Board into garment, avatar, location or reference (or unsure with two candidates) and report duplicates within the drop and in the library. Saves nothing. A photo the call had no time left for comes back with error deferred: send it again.

NameRequiredDescriptionDefault
filesYesDropped photos, in drop order; results use the same index
board_idNoThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

A4.2/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 the description reinforces this with 'Saves nothing' rather than contradicting it. It adds genuinely useful behavior beyond annotations: duplicate detection within the drop and against the library, and the deferred-error/retry 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?

Three dense sentences, front-loaded with the action and categories, with no filler. The critical non-destructive and retry facts are stated compactly.

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 does the work of describing returns (category assignment, unsure-with-two-candidates, duplicate reports) and the deferred error case. It is largely complete, though the result shape/index mapping is left to the 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%, covering sha256, image_url, file_name, and board_id in detail, so the schema carries parameter meaning. The description adds only a light hint about drop order/results indexing, which the schema already states.

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 precise verb ('sort') and resource ('photos dropped on the Shoot Board'), then enumerates the output categories (garment, avatar, location, reference, unsure-with-two-candidates) and the duplicate reporting. The 'Saves nothing' clause immediately separates it from write siblings like mcp_commit_intake.

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?

Clarifies it is a non-committing pass, implies the commit step lives in a sibling, and gives clear retry guidance for the deferred case. It stops short of naming the alternative tool or stating explicit when-not conditions.

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

mcp_list_filesList FilesB
Read-onlyIdempotent
Inspect

List uploaded (reference) files for the Uwear MCP workspace files tab and the Shoot Board's References tab.

NameRequiredDescriptionDefault
pageNoPage number for uploaded file results
limitNoMaximum number of uploaded files per page
queryNoOptional search over file names and tags (the Shoot Board's References tab)
tag_idsNoOptional: only files with any of these tags

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the useful scoping context that results come from two tabs, but says nothing about pagination defaults, result merging, or ordering. Adequate but not rich.

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 front-loaded sentence with no filler or redundancy. Efficient, though it is arguably too terse for a 4-parameter listing tool where extra routing context would earn its place.

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 read-only list tool with full annotation coverage and no output schema, the description is minimally complete. It lacks disambiguation from sibling listers, pagination behavior, and whether results from the two tabs are combined or separate, leaving real gaps for an agent to fill.

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 all four parameters (page, limit, query, tag_ids) are already documented in the schema; baseline is 3. The description adds no parameter-level meaning beyond the schema, and the schema's note that 'query' searches only the References tab is not reconciled with the description's claim of covering both tabs.

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 ('List uploaded (reference) files') and scopes it to two concrete surfaces (the workspace files tab and the Shoot Board References tab). This is clear, but it does not distinguish itself from overlapping siblings like mcp_workflow_assets, mcp_intake_files, or search_uwear_library, so an agent cannot fully disambiguate on the description alone.

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 when-to-use, when-not-to-use, or alternative guidance is given. With many sibling listing/search tools (list_tags, mcp_workflow_assets, search_uwear_library), the description offers no signal on when this tool is the right choice over those.

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

mcp_list_model_catalogList Model CatalogA
Read-onlyIdempotent
Inspect

The active AI models with their capabilities and pricing rules, as GET /models returns them, for the widget's model pickers.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, which fully characterize this as a safe, repeatable read. The description adds that it reflects 'as GET /models returns them' and that the catalog is 'active' models, which adds minor scoping context but no auth, rate-limit, or freshness detail 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?

A single front-loaded sentence with no filler or repetition. The embedded clauses ('as GET /models returns them', 'for the widget's model pickers') are compact, though slightly qualifier-heavy.

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 (no params, no output schema) and the description covers what is returned, its scope, and the intended consumer. For such a low-complexity, annotation-backed read tool, this is nearly complete; only the return shape and any update cadence are unspecified, which is acceptable.

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 zero parameters, so the schema needs no compensation and the baseline is 4. The description correctly implies that no filtering or query options exist, matching the empty parameter 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?

States a specific verb (list) and resource (model catalog), naming returned content: active AI models with capabilities and pricing rules. It is clearly distinguishable from the many list_* siblings by its subject matter, though it doesn't contrast against an obvious direct alternative.

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 'for the widget's model pickers' implies the consumer context, giving some sense of when it matters. However, there is no explicit when-to-use/when-not guidance and no named alternative among the siblings.

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

mcp_read_generationRead GenerationA
Read-onlyIdempotent
Inspect

One generation with its results as GET /generation/{id} returns it (prompt, model, settings, inputs), for the result viewer's Info panel.

NameRequiredDescriptionDefault
generation_idYes

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, idempotent, non-destructive, closed-world), so the bar is lowered. The description adds real value by disclosing the returned fields (prompt, model, settings, inputs), which matters since there is no output schema; it stops short of describing error behavior for a missing id.

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 front-loaded sentence that names the resource first, then the returned contents, then the use case. The API-path reference is slightly technical filler but overall efficient.

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 single-parameter read with annotations covering safety, the description supplies the return contents and use context. Missing only edge-case behavior (unknown id), which renders it nearly complete.

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 one parameter at 0% schema coverage, the description only implicitly maps generation_id via the GET /generation/{id} path and "one generation." A single integer id is largely self-evident, so this is adequate but adds little beyond 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 (read) and resource (one generation with its results) and enumerates the returned content (prompt, model, settings, inputs), with the API mapping GET /generation/{id}. It is clear on its own but does not differentiate from close siblings such as mcp_read_generation_result, get_generation_results, or get_generation_status.

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 "for the result viewer's Info panel" implies a usage context, but there is no explicit when/when-not guidance and no alternative tool is named. An agent must infer when to pick this over the other generation-reading siblings.

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

mcp_read_generation_resultRead ResultA
Read-onlyIdempotent
Inspect

One generation result as GET /generation-result/{id} returns it (tags, review verdict, QA, prompt, model), for the widget's result viewer.

NameRequiredDescriptionDefault
generation_result_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description adds value beyond them by enumerating what comes back (tags, review verdict, QA, prompt, model), which is meaningful given no output schema exists. It does not mention error behavior or that the id must come from a prior listing call.

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-loaded with verb and resource and then the returned field list. Nothing is wasted, though the trailing widget-viewer clause is of marginal value to an agent and the sentence is a fragment rather than complete prose.

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 correctly compensates by naming the returned fields, and the endpoint reference anchors the resource identity. It is nearly sufficient for a one-parameter read tool; missing only guidance on sourcing the id and on error cases.

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 required parameter generation_result_id, so the description carries the burden. The embedded endpoint template /generation-result/{id} implies the value identifies a result, but there is no detail on where to obtain the id or its accepted range beyond the schema's minimum.

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 ('One generation result') and even pins the underlying endpoint GET /generation-result/{id}, which cleanly distinguishes it from the plural sibling get_generation_results. It does not explicitly name that sibling or mcp_read_generation, so differentiation is implied rather than stated.

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?

'For the widget's result viewer' gives an implied usage context, but it is framed as a caller's need rather than agent guidance. No when-to-use/when-not guidance and no routing against get_generation_results, mcp_read_generation, or read_generation_result_qa, which all appear in the sibling list.

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

mcp_recipe_copyCopy as New AutomationCInspect

Copy an automation as a new automation for this shoot.

NameRequiredDescriptionDefault
nameNo
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
source_version_idNo
source_workflow_idYes

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the safety profile is covered. The description confirms creation of a *new* copy, which is useful, but says nothing about what is duplicated (version, asset bindings), whether the source is left untouched, or permission requirements. Adequate but thin for a duplication operation.

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 tight sentence with the verb and scope front-loaded and no filler. It is efficient, though its brevity contributes to the gaps in other dimensions rather than being a virtue on its own.

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?

This is a four-parameter mutation with 25% schema coverage, no output schema, and no annotations explaining what is created or which optional fields default to what. The description does not fill those gaps, leaving the agent under-informed about how to call 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 only 25% – just board_id is documented – so the description is expected to compensate and does not. It never explains that 'name' sets the new copy's title, that source_version_id picks which version to duplicate, or that source_workflow_id identifies the source recipe. Half the parameters remain semantically opaque.

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?

States a clear verb+resource: copying an automation into a new one scoped to this shoot. However, it uses 'automation' where the tool name and siblings use 'recipe', and it does nothing to distinguish itself from mcp_recipe_list, mcp_recipe_open, mcp_recipe_save_draft, or mcp_recipe_preflight. An agent gets the gist but must infer the relationship to those siblings.

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 guidance and no named alternative. 'For this shoot' hints at context but never states when an agent should duplicate rather than open, edit, or list a recipe. The agent must guess the triggering condition.

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

mcp_recipe_historyAutomation HistoryB
Read-onlyIdempotent
Inspect

An automation's past runs, newest first: one row per Shoot Board Generate (its looks) or per run started on Uwear, with when, how it went, credits and covers.

NameRequiredDescriptionDefault
pageNo
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
workflow_idYes

TDQS

B3.2/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 safety is covered. The description adds genuinely useful behavioral detail not in the annotations: results are ordered newest first, one row per run, and each row carries timing, outcome, credits and covers. It omits pagination behavior even though a page parameter 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?

A single dense sentence that front-loads the resource and ordering, with no filler. The parenthetical 'its looks' is slightly awkward but does not cost much space.

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 usefully enumerates the returned fields, which is the right instinct. However, two of three parameters remain undocumented and pagination/result-count behavior is unstated, so it is only adequate for a read tool that requires two identifiers.

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 33%: board_id is documented in the schema, workflow_id and page are not. The description adds nothing about parameter meaning, format, or what page does, so it does not 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?

The description names the resource (an automation's past runs) and the shape of the result (one row per Shoot Board Generate or per Uwear run, with timing, outcome, credits, covers). It is specific enough to distinguish from mcp_recipe_list and mcp_brief_runs, though the phrasing ('its looks') is slightly idiosyncratic.

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 call this versus mcp_brief_runs, mcp_recipe_preflight, or mcp_recipe_open, and no prerequisites beyond what the schema requires. Usage must be inferred from the name and required parameters alone.

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

mcp_recipe_listList AutomationsC
Read-onlyIdempotent
Inspect

The company's shoot automations (and other automations to copy).

NameRequiredDescriptionDefault
pageNo
queryNoName search.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
items_per_pageNo
include_automationsNoAlso list automations (read/copy only).
include_definitionsNoAlso return each listed automation's live graph (the cards that draw its steps).

TDQS

C2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds only a loose scope statement and says nothing about pagination, return shape, or the effect of the include_* flags beyond what the schema already notes.

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?

It is short, but this is under-specification rather than conciseness: a single sentence fragment that omits the core action verb, so it does not front-load a usable statement of what the tool does.

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 paginated, filterable listing tool with six parameters and no output schema, the description is far too thin. An agent cannot tell what is returned, how paging behaves, or how this differs from the other mcp_recipe_* tools.

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?

Six parameters at 67% schema coverage, and the description contributes no meaning for any of them — not the required board_id, the query search, paging, or the include_automations/include_definitions toggles. It neither supplements the documented params nor compensates for the undocumented ones.

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

Purpose2/5

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

The description is a noun fragment — 'The company's shoot automations (and other automations to copy)' — with no verb stating that it lists them. It names the resource but the parenthetical 'and other automations to copy' muddies scope, and it never distinguishes this from siblings like mcp_recipe_copy, mcp_recipe_history, or mcp_recipe_open.

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. The phrase 'to copy' faintly implies this feeds mcp_recipe_copy, but the agent must infer that; no alternative or condition is named.

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

mcp_recipe_openOpen AutomationAInspect

Open the brief's automation in the builder: its draft, or once Generate published it its live version (saving an edit of it makes a new automation); another automation opens read-only.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
read_onlyNoShow a published version (version_id, else the live one) without opening a draft: a brief that ran shows what it ran, the board's pinned Automation its live version.
version_idNoThe published version to show (an automation, or read_only); a brief recipe opened to edit always opens its draft.
workflow_idYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already disclose the non-read-only, non-idempotent, non-destructive profile, so the bar is lower. The description adds real behavioral value beyond that: saving an edit spawns a new automation rather than mutating the existing one, and non-brief automations open read-only. It stops short of stating auth/permission requirements or what the builder returns.

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 purpose is front-loaded, which helps, but the remainder is a single dense run-on sentence with nested parentheticals ('its draft, or once Generate published it its live version (saving an edit of it makes a new automation)') that is hard to parse on first read.

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?

There is no output schema, so return values need not be described, and annotations cover the safety profile. The description covers the key edit-vs-read-only nuance but leaves workflow_id unexplained and the opening/closing UI flow ambiguous, which is a gap for a 4-parameter 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 coverage is 75%, so the schema documents board_id, read_only, and version_id in detail; only workflow_id is undocumented there. The description's 'another automation opens read-only' and the draft-vs-live explanation give some meaning to workflow_id/version_id selection, but it does not compensate for the untagged workflow_id or add format details. Baseline 3 is appropriate.

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: 'Open the brief's automation in the builder,' and goes on to distinguish the draft vs. the published/live version. However, it never names or contrasts a sibling like mcp_recipe_list, mcp_recipe_copy, or mcp_recipe_save_draft, so the agent must infer why it would open rather than list or copy.

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: opening a brief's automation puts you in an editable builder ('saving an edit of it makes a new automation'), while 'another automation opens read-only.' There is no explicit when-to-use/when-not guidance or pointer to the alternative tools for listing, copying, or saving drafts.

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

mcp_recipe_preflightCheck AutomationC
Read-onlyIdempotent
Inspect

Validate and price the automation being edited.

NameRequiredDescriptionDefault
graphYesThe unsaved authoring graph (as the builder holds it).
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
version_idYes
workflow_idYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the useful fact that this both validates AND prices, which is more than a plain read, but says nothing about failure behavior or what a failed validation means.

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 front-loaded sentence with zero wasted words. It is efficient, though arguably too terse for a four-required-parameter tool, which keeps it short of a 5.

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 tool taking a nested authoring graph and three identifiers, with no output schema, the description should explain what validation reports and how pricing is expressed. Instead it stops after one clause, leaving output shape and error semantics undocumented.

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%: graph and board_id are documented, but workflow_id and version_id carry only a UUID pattern with no meaning. The description adds no parameter context at all, 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?

States two specific verbs (validate, price) against a clear resource (the automation/recipe being edited), so the agent knows it is a preflight check rather than a read or save. However it never names sibling tools like mcp_recipe_save_draft or mcp_workflow_contract, 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?

The phrase 'being edited' faintly implies it belongs in the edit flow, but there is no explicit when-to-use, no prerequisite (e.g. a recipe must already be open), and no mention of alternatives. An agent gets no routing guidance.

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

mcp_recipe_save_draftSave Automation DraftD
Destructive
Inspect

Save the automation's draft.

NameRequiredDescriptionDefault
edgesYes
nodesYes
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
version_idNo
workflow_idYes
failure_policyNo
base_version_idNo
contract_versionNo
result_projectionNo
expected_definition_hashNo

TDQS

D1.8/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, and the description does not contradict them. However, it adds no behavioral context beyond those hints — nothing about what a save overwrites, hash guarding, or concurrency — so it contributes no value over the structured metadata.

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?

It is a single short sentence with no wasted words, but this length reflects under-specification rather than conciseness. There is nothing front-loaded to help an agent decide or act.

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

Completeness1/5

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

For a 10-parameter destructive mutation tool with no output schema, the description omits required inputs, the meaning of optional fields, and the version/hash semantics that govern whether it POSTs or PATCHes. An agent cannot safely invoke this from the description alone.

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

Parameters1/5

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

There are 10 parameters and schema description coverage is only 10%, so the description carries the burden of explaining parameters and instead says nothing about any of them (nodes, edges, failure_policy, expected_definition_hash, result_projection, version_id). None of the ambiguous or untyped fields are clarified, leaving the caller to guess.

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

Purpose2/5

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

The description 'Save the automation's draft' essentially restates the name and title (mcp_recipe_save_draft / Save Automation Draft) without adding scope, target, or effect. It does not distinguish itself from close siblings like mcp_recipe_open, mcp_recipe_copy, or mcp_recipe_preflight beyond the generic word 'save'.

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 when-to-use guidance is given: it doesn't say when a draft should be saved versus using recipe_preflight, recipe_open, or recipe_history, nor mention prerequisites such as an open board. The one useful routing hint (new draft vs existing version) lives in the schema, not the description.

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

mcp_reclassify_board_itemMove Photo to Another PileA
DestructiveIdempotent
Inspect

Move a Shoot Board photo between the Clothing, Models and Locations piles. Saves the same image as the new kind and swaps it on the board; the old asset is deleted only if intake saved it in the last 24 hours and nothing uses it, otherwise it stays in the library. Asking for a move that already happened changes nothing and returns the board (status "unchanged").

NameRequiredDescriptionDefault
toYesThe pile to move it to
itemYesThe board item to move
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
expected_revisionYesBoard revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it

TDQS

A4.1/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that the image is re-saved as the new kind and swapped on the board, and that the old asset is deleted only if intake saved it within 24 hours and nothing references it, otherwise it remains in the library. It also explains the idempotent no-op and its 'unchanged' board return, adding real destruction and side-effect context on top of destructiveHint/idempotentHint.

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 action and its scope, then the side-effect conditions. Two sentences carry a lot of conditional detail, which is dense but every clause earns its place; only slight compression is possible.

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 destructive, nested-object mutation with no output schema, it covers the important unknowns: what is destroyed and when, that re-issuing is a no-op, and the 'unchanged' return. It stops short of covering permission/authorization needs or failure modes beyond the schema-described revision conflict.

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 four parameters, including the revision-conflict semantics of expected_revision. The description's mention of the three pile names merely restates the enum, so a 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?

States a specific verb and resource ('Move a Shoot Board photo') and bounds it to three enumerated piles (Clothing, Models, Locations), which separates it from the generic modify_shoot_board sibling. An agent can tell exactly what this does without opening the schema.

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?

It gives conditional behavior ('a move that already happened changes nothing') but never says when to prefer this over modify_shoot_board or show_in_shoot_board, nor what preconditions (e.g. an open board) are required. 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.

mcp_replace_contextReplace Shoot BoardC
DestructiveIdempotent
Inspect

Replace the Uwear Shoot Board items.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
board_versionNoPass 2 to receive board v2 state, including the board's output settings
context_itemsNoShoot Board items that replace the current list when context_state is omitted
context_stateNoComplete Shoot Board state to sanitize and persist; takes precedence over context_items
expected_revisionYesBoard revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it

TDQS

C2.2/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is partly covered. However, the description omits important behavior the schema implies: that this is a full-list replacement, that context_state takes precedence over context_items, and that a stale expected_revision returns a revision_conflict error rather than overwriting. It adds essentially nothing 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.

Conciseness2/5

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

The single sentence is short but this is under-specification rather than conciseness. For a destructive, nested, five-parameter tool, one sentence cannot carry the necessary information, and there is nothing to front-load.

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?

Given a destructive full-replace tool with nested item objects, a context_state precedence rule, and a revision-conflict mechanism, the description leaves the agent without any of that. Annotations cover only the generic safety profile and there is no output schema, so the description should have done far more.

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 fully documents board_id, board_version, context_items, context_state, and expected_revision (including the revision_conflict behavior). The description adds no parameter meaning of its own, so the baseline 3 applies.

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

Purpose2/5

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

The description "Replace the Uwear Shoot Board items" is essentially a restatement of the title "Replace Shoot Board" plus the word "items". It gives a verb and resource but offers no scope or differentiation from close siblings like modify_shoot_board, mcp_add_context, and mcp_clear_context, which an agent would need to tell apart.

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 when-to-use, when-not-to-use, or alternative is named, despite obvious candidates in the sibling list (modify_shoot_board for partial edits, mcp_add_context for appends, mcp_clear_context for wiping). The only implied guidance comes from the verb "replace".

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

mcp_review_generation_resultsReview ResultsA
DestructiveIdempotent
Inspect

The result viewer's review rail. Sets the user's verdict on their own results to approved or rejected, or clears it (decision null), replacing any verdict they had; deletes nothing and spends no credits.

NameRequiredDescriptionDefault
noteNo
decisionYes
generation_result_idsYes

TDQS

A4/5.0
Behavior4/5

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

With destructiveHint=true declared, the description does valuable disambiguation work by clarifying that 'deletes nothing' — i.e. the destructive aspect is overwriting a prior verdict, not data loss — and it adds the non-obvious 'spends no credits' fact. It stops short of covering ownership/permission requirements or per-item behavior for a batch of up to 50 ids.

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?

Compact and front-loaded: the operation is stated first, then the value space, then the two guardrails. Only 'The result viewer's review rail' is filler, though it does locate the surface in the UI, so almost every clause 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 mutation tool with no output schema, the description plus annotations cover what an agent needs: what is set, what it replaces, that nothing is deleted, and that no credits are spent. Ownership is scoped ('their own results'), and remaining omissions (batch size, note semantics) are documented in the schema itself.

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 carries the burden. It explains the semantically tricky 'decision' enum well, including that null clears the verdict, but says nothing about the 'note' parameter or why 'generation_result_ids' is an array (batch of 1-50), leaving two of three parameters undocumented.

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 ('Sets the user's verdict on their own results') plus the exact value space (approved/rejected/null), so an agent knows precisely what the tool mutates. The phrase 'deletes nothing and spends no credits' implicitly separates it from the sibling mcp_delete_generation_results and from any generation-spending tool.

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: an agent can infer this is the tool for triaging results, and the 'deletes nothing' clause hints at the delete sibling's domain. However, no alternative is named explicitly, and there is no guidance on when to prefer mcp_set_generation_result_tags or set_generation_result_favorite instead of setting a verdict.

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

mcp_save_retouchSave Retouched ImageAInspect

Save an edited image (image_base64) as a new child result of parent_generation_result_id. Changes no existing result.

NameRequiredDescriptionDefault
file_nameNoOptional filename for the saved retouched image
mime_typeNoOptional image MIME type; inferred from a data URL or defaults to image/png
operationsNoOptional retouch operation metadata stored with the child result
image_base64YesRetouched image encoded as base64 or an image data URL
parent_generation_result_idYesGeneration result ID of the original image

TDQS

A3.5/5.0
Behavior3/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 the useful structural fact that a new child result is created rather than mutating the parent, but it does not warn that repeated calls create duplicate children (consistent with idempotentHint=false) or mention any permission/error 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?

Two short sentences, zero filler, with the core action and the parent linkage front-loaded. Every clause earns its place.

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 five-parameter save tool with no output schema, the description covers the write semantics but says nothing about what is returned (e.g., the new result ID) or failure modes such as an invalid parent_generation_result_id. 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 100%, so all five parameters are already documented. The description reinforces the relationship between image_base64 and parent_generation_result_id (child-of-parent), but adds no syntax, format, or constraint details beyond the schema; 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?

States a specific verb (save) and resource (edited/retouched image) and clarifies the result is stored as a new child of parent_generation_result_id. It is distinguishable from generation and read siblings, though it never names a contrasting sibling tool 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?

Usage is implied: call this when you have a retouched image to persist under an existing generation result. The clause 'Changes no existing result' hints at the non-destructive scope, but there is no explicit when-to-use/when-not guidance or named alternative.

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

mcp_set_generation_result_tagsSet Result TagsA
DestructiveIdempotent
Inspect

Replace a result's tags with tag_ids (empty removes all), as PUT /generation-result/{id}/tags. The result viewer's tag tray. A tag that starts one of the user's automations starts it, as on the platform.

NameRequiredDescriptionDefault
tag_idsYes
generation_result_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds genuinely new behavior: full replacement semantics ('empty removes all') and a real side effect not in annotations — 'A tag that starts one of the user's automations starts it'. That automation trigger is the kind of consequence an agent must know before invoking.

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 short sentences with the core action front-loaded and no filler. Phrases like 'as on the platform' are slightly imprecise, but the REST-path anchor adds precision at low cost.

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 low-complexity, 2-param mutation with no output schema, the description covers replacement semantics, the empty-array case, and the automation side effect. Return value and auth/error handling are unstated, but those are minor for this operation.

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 0%, so the description carries the burden. It explains tag_ids semantics well (replacement list, empty array clears all) but omits the maxItems=100 cap and says nothing about generation_result_id beyond its obvious name. Partial compensation 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?

States a specific verb+resource: 'Replace a result's tags with tag_ids', and anchors it to the REST equivalent PUT /generation-result/{id}/tags. The resource (a generation result's tags) is distinct from siblings like mcp_update_tag (tag metadata) or mcp_add_context, but no sibling is named explicitly, so it stops short of full differentiation.

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?

Implied usage is clear from 'Replace a result's tags' plus the '(empty removes all)' nuance, and 'The result viewer's tag tray' locates the effect. However, it names no alternative (e.g., mcp_update_tag) and gives no explicit when-not guidance, so the agent must infer the routing.

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

mcp_update_tagEdit TagC
DestructiveIdempotent
Inspect

Rename or recolor one of the company's tags, as PATCH /tag/{id}. The result viewer's tag tray.

NameRequiredDescriptionDefault
nameNo
colorNo
tag_idYes

TDQS

C2.6/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, and the description adds almost nothing on top of them — it never warns that this is flagged destructive, never says what gets destroyed or that tags may be removed, and never explains auth needs. The sole added detail is 'as PATCH /tag/{id}', which hints at partial-update semantics but is not elaborated.

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 first sentence is tight and front-loaded, but the second sentence is a dangling noun fragment ('The result viewer's tag tray.') that spends tokens without conveying usable instruction. Overall short, but one of the two sentences does not earn its place.

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 destructive, idempotent mutation with three parameters at 0% schema coverage and no output schema, the description leaves major gaps: it does not explain null-field semantics, the destructive flag, or what happens on success/failure. An agent could call it, but not confidently.

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 full burden for three parameters. 'Rename or recolor' loosely maps to name and color, but it says nothing about the required tag_id, nothing about the nullable string types (can passing null clear a field?), and nothing about the 100/32 max-length 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 pair ('Rename or recolor') against a specific resource ('the company's tags') and even pins the underlying endpoint (PATCH /tag/{id}). It is clear what the tool does, though it never explicitly contrasts with siblings like create_tag or list_tags, and the trailing fragment 'The result viewer's tag tray.' adds no discriminating information.

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 versus create_tag, list_tags, or mcp_workflow_tags, and no prerequisites (does the tag need to exist, does the caller need permissions). The only implicit cue is the PATCH endpoint, which a reader must interpret as 'modify an existing tag'.

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

mcp_upload_intake_photoUpload Dropped PhotoA
Idempotent
Inspect

Store one photo dropped on the Shoot Board, sent inline as base64, for a host that cannot upload files itself. Returns a receipt (sha256, size, stored, image_url, image_url_expires_at); pass image_url to mcp_intake_files and mcp_commit_intake. Without data, stores nothing and returns the receipt of the photo already stored under sha256 (a fresh image_url), or stored: false.

NameRequiredDescriptionDefault
dataNoThe image bytes, standard base64, at most 4 MiB decoded (downscale larger photos). Omit it to ask for the receipt of a photo already stored
sha256YesHex SHA-256 of the dropped file as the user picked it (the intake tools take the same value), even when data is a downscaled copy
content_typeNoImage MIME type of data (required with data)

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare not-read-only and idempotent, and the description goes further by explaining the mechanism behind idempotency: omitting data stores nothing and returns the receipt of the photo already stored under sha256, or stored:false. It also enumerates the receipt contents (sha256, size, stored, image_url, expiry), which no annotation provides.

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?

Purpose is front-loaded in the first clause, then return contract, then the empty-data edge case. Dense but every sentence carries information; the parenthetical receipt list is slightly heavy but justified since no output schema 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?

With no output schema, the description fully specifies the return receipt fields and their downstream use, and it covers the no-data branch explicitly. An agent has everything needed to call the tool correctly and to handle both success and dedup outcomes.

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 data, sha256 and content_type including the downscale/omit behavior. The description largely restates the no-data path rather than adding syntax, format, or cross-parameter nuance the schema lacks, so the 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?

States a specific verb and resource ('Store one photo dropped on the Shoot Board') plus the exact transport ('sent inline as base64') and the audience constraint ('a host that cannot upload files itself'). An agent can distinguish this from sibling uploaders without opening the schema.

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 condition that selects this tool is explicit ('for a host that cannot upload files itself'), and it routes downstream work to mcp_intake_files and mcp_commit_intake. It stops short of naming a competing sibling (e.g. upload_garment_from_public_url) as the alternative when a host CAN upload, leaving that inference to the agent.

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

mcp_workflow_assetsWorkflow AssetsB
Read-onlyIdempotent
Inspect

The automation builder reads library items (Clothing, Models, Locations, ...) of one kind by id to show them on its cards. Read-only.

NameRequiredDescriptionDefault
idsYes
kindYes
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description's 'Read-only' largely restates that, but the 'reads items of one kind' scoping does add that it performs a single-category batch lookup rather than a general search or mutation. No return shape, ordering, or behavior on missing ids is disclosed.

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 short sentences with the purpose front-loaded and no wasted clauses. The trailing 'Read-only' is somewhat redundant against the annotations, costing a little, but the overall structure is tight and readable.

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?

With no output schema, an undefined 'kind' parameter (no enum, no description, 0% enum coverage), and annotations that only cover the safety profile, the definition leaves a real gap: an agent cannot know which kind values are legal without trial and error. For a 3-required-param lookup tool this is under-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?

Schema coverage is only 33% (only board_id is documented), so the description must compensate. It clarifies that kind selects a single category and ids identifies the specific items, which maps to two of the three parameters. However it never spells out the allowed kind strings or the 100-item ids cap, so the compensation is partial.

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: it reads library items of one kind by id, and gives the consumer context (the automation builder's cards). This distinguishes it reasonably well from list_* siblings and other mcp_workflow_* tools, though it never enumerates valid 'kind' values so the resource boundary stays fuzzy.

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 and no named alternative among the large sibling set (mcp_workflow_gallery, mcp_workflow_tags, list_locations, etc.). Usage is only implied by the 'automation builder cards' framing, leaving the agent to infer when this beats the sibling lookups.

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

mcp_workflow_camerasCamerasB
Read-onlyIdempotent
Inspect

The camera views (front, side, back, crops) a shot or camera edit can use, for the automation builder. Read-only.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint, so the safety profile is fully covered and "Read-only" in the description is largely redundant. The description does add one useful behavioral fact – that the result is a fixed enumerated set of camera views – but says nothing about return shape or ordering. Adequate against an already-strong annotation block.

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?

One compact sentence with the resource and its values front-loaded and no filler. The phrasing is slightly awkward ("the camera views ... a shot can use") but nothing is wasted.

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 trivial one-parameter lookup this is nearly complete, but with no output schema the description should still confirm what is returned (a list of camera-view identifiers) and whether it is scoped to the board. The value enumeration partially compensates.

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 there is a single required board_id, so the schema carries the parameter burden fully. The description adds no format or sourcing detail beyond what the schema already states, making the baseline 3 correct.

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 resource (camera views) and enumerates its values (front, side, back, crops), which is enough to distinguish it from sibling list/enumeration tools like mcp_workflow_assets or mcp_workflow_tags. The verb is implicit rather than stated, but the intent 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?

"For the automation builder" implies the context in which this lookup is needed, but there is no explicit when-to-use statement, no named alternative, and no prerequisites beyond the schema's board_id. Usage is inferable rather than spelled out.

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

mcp_workflow_contractWorkflow ContractC
Read-onlyIdempotent
Inspect

The automation format (step kinds and their settings) the automation builder edits against. Read-only.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
contract_versionNo

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the trailing 'Read-only' adds nothing beyond structured data. The description discloses no behavior beyond that — nothing about what the contract contains, whether contract_version changes the returned shape, or how large the payload is.

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 short clauses, front-loaded with the resource identity and no filler. It is efficiently sized, though its brevity edges toward under-specification rather than tightness.

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?

With no output schema, the description must carry the return-value burden, yet it never explains what the contract object looks like or what contract_version selects. An agent gets safety hints from annotations but not enough to call this confidently when the optional parameter matters.

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 50%: board_id is described but contract_version has no description anywhere. The prose mentions neither parameter, so it does not compensate for the undocumented optional param or explain how defaulting contract_version behaves. The description adds no parameter meaning.

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 identifies the resource — the automation format / workflow contract that the builder edits against — which hints at what is returned and distinguishes it from siblings like mcp_workflow_assets or mcp_workflow_tags. But it is a noun phrase with no verb; it never says 'returns' or 'retrieves', so an agent must infer the action. Purpose is implied rather than stated.

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 guidance and no mention of alternatives. 'Read-only' describes a trait, not a usage condition, and the description never says when an agent should call this versus opening a board or reading another workflow_* tool. No exclusions or prerequisites are given.

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

mcp_workflow_garment_categoriesGarment CategoriesC
Read-onlyIdempotent
Inspect

The garment categories, for the automation builder's category filters. Read-only.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

C2.6/5.0
Behavior2/5

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

The only behavioral claim, 'Read-only', merely restates the readOnlyHint/destructiveHint annotations that the agent already receives. No additional context is offered about what the categories are, how they are scoped to the board, or whether results are cached or stable. No contradiction with annotations, but essentially no value added beyond them.

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?

Two short sentences with no filler, and the purpose is front-loaded. However, the extreme brevity comes at the cost of substance rather than being efficient conciseness, so it lands at minimum-viable rather than strong.

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 one-parameter, read-only tool with annotations covering safety and no output schema, the description is adequate but thin: it never indicates the form of the returned categories (names? objects? board-scoped?), which the agent needs to wire them into a filter.

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 board_id parameter, and the schema description already explains where to obtain it ('from Open Shoot Board or your context'). The description adds nothing about the parameter, so the baseline of 3 applies.

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?

Identifies the resource (garment categories) and its intended consumer (the automation builder's category filters), but never states the verb — that it lists or returns them. A reader can infer a read/list tool, and it is distinguishable from sibling list_garments, but the phrasing is noun-fragment rather than a clear action statement.

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?

'For the automation builder's category filters' hints at one use case, but there is no explicit when-to-use guidance, no mention of prerequisites, and no differentiation from closely related siblings such as mcp_workflow_tags or mcp_workflow_cameras.

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

mcp_workflow_tagsWorkflow TagsC
Read-onlyIdempotent
Inspect

The account's tags, for the automation builder's tag filters. Read-only.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

C2.9/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=false, and the description's 'Read-only' merely restates that. Its one additive contribution is the scope context ('the account's tags, for the automation builder's tag filters'), which tells the agent which consumer the data serves. No return format or pagination behavior is disclosed.

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 short sentences with no padding, though the opening noun phrase is less front-loaded than a verb-first statement would be and the trailing 'Read-only.' fragment is redundant with the annotations. Efficient overall but with a little wasted signal.

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 low-complexity one-parameter tool with no output schema, the description identifies the resource and scope, but it never describes what the returned tag objects contain or how they are ordered/filtered. Annotations cover safety, so the remaining gap is modest rather than critical.

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 single board_id parameter is already fully documented in the schema, including where to obtain it. The description adds nothing beyond the schema. Baseline 3 applies.

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 names the resource ('the account's tags') and a use context ('the automation builder's tag filters'), but it is a noun phrase with no verb, so the agent must infer that it lists/retrieves tags. It also does not clearly distinguish itself from the sibling list_tags, which is the obvious alternative. Purpose is discernible but not crisp.

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 guidance on when to use this tool versus list_tags, mcp_update_tag, or create_tag, and no stated prerequisites or exclusions. The only hint is the phrase 'automation builder's tag filters', which implies but does not state the triggering context.

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

modify_shoot_boardChange Shoot BoardA
Destructive
Inspect

Use this when the user asks in chat to change what is on the open Shoot Board. add puts items on it; set replaces the whole item list (to remove items, send the ones to keep); clear empties one type, or without type starts a new shoot on the same board (its brief is unlinked; photos stay in the library); add_as_view makes from_garment_id's photo the back, side or detail view of garment_id and takes from_garment_id off the board, only after the user agrees the two show one garment. Items are {type, id} from search_uwear_library or read_shoot_board. To reuse an automation, add {type: automations, id: a workflow_id from brief_inputs.automations}: the board pins one and the next brief runs every look through it. Pass expected_revision from read_shoot_board; on revision_conflict, apply the change to the returned board once.

NameRequiredDescriptionDefault
typeNoclear: only this type; omit for a new shoot (the whole board and its brief)
viewNoadd_as_view: back, side, or detail (a close-up)
itemsNoadd / set: the items. An automations item (id: a workflow_id from brief_inputs.automations) pins the Automation every look of the brief runs through; a board pins one, a new one replaces it. A board holds one art direction the same way
actionYesadd: put items on the board; set: replace all items; clear: remove one type, or without type everything and the board's brief (a new shoot on this board); add_as_view: from_garment_id's photo becomes a view of garment_id
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
garment_idNoadd_as_view: the board garment that gains the photo as a view
from_garment_idNoadd_as_view: the board garment whose photo it is; it leaves the board
expected_revisionYesBoard revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint=true annotation it discloses concrete consequences: clear unlinks the board's brief while photos stay in the library, set wipes the whole item list, add_as_view removes from_garment_id from the board, an automations item pins a workflow that the next brief runs every look through, and a board holds one automation/art direction. It also documents the revision_conflict recovery protocol, which is exactly the operational context annotations cannot carry.

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 trigger sentence and organized action-by-action, with every clause carrying distinct information. It is a dense semicolon-heavy run-on paragraph, so readability suffers slightly, but there is little dead weight.

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 an 8-param destructive mutation with no output schema, it covers side effects, item provenance, ordering dependencies, and the conflict-retry path. It omits what a successful call returns (updated board vs. confirmation), which an agent would want since no output schema exists.

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 reasoning the schema lacks: items are {type, id} sourced from search_uwear_library/read_shoot_board, set removes items by sending the ones to keep, and an automations item must be a workflow_id from brief_inputs.automations. expected_revision's role is also restated with its failure mode.

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 ('change what is on the open Shoot Board') and then enumerates all four actions with their distinct effects. An agent can tell it apart from read_shoot_board or add_chat_photos_to_board from the text alone.

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 per-action usage: add vs set (with the removal-by-keeping trick), clear with/without type, and add_as_view gated on user agreement that two photos show one garment. It routes to search_uwear_library/read_shoot_board for item IDs and read_shoot_board for expected_revision, but never explicitly excludes sibling writers like add_chat_photos_to_board or show_in_shoot_board.

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

plan_shoot_background_removalPlan Shoot Background RemovalAInspect

Append or replace one background removal. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
shot_indexYes
step_indexNoOne-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings.
expected_brief_revisionYes

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 hints: 'No media generation, credit charge or library change' discloses the side-effect boundary, 'Returns a new brief and quote' discloses the return shape, and the revision/recipe_key instructions disclose concurrency and chaining requirements. With annotations only giving generic hints, this carries the design well, though what a 'replace' discards is not spelled out.

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?

Front-loaded with the operation, then preconditions, then side-effect profile and chaining. Six short sentences with essentially no waste; 'Photo format is shared across the shoot' is the only line whose relevance is slightly opaque.

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 7-parameter planning mutation with no output schema, the definition covers what changes, what is returned, what is not touched, and the required edit protocol. Only the indexing params (shot_index) are left implicit, which is minor.

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 57%, so some params already carry documentation. The description reinforces expected_brief_revision and the append-vs-replace meaning of step_index, but adds little on shot_index, brief_id, or board_id, and much of what it says (default looks, omit to append) is already in 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 concrete verb pair (append or replace) and a concrete resource (one background removal) that clearly sets it apart from the other plan_shoot_* siblings. The scope (selected looks via a named flow) is also specified, so the agent knows exactly what is being modified.

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 preconditions and sequencing: 'requires the current brief revision' and 'Read the returned recipe_key before the next edit.' The default-looks behavior is stated. It stops short of naming any alternative tool (e.g. plan_shoot_edit or plan_shoot_image) or saying when not to use it, but the usage context is otherwise clear.

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

plan_shoot_camera_changePlan Shoot Camera ChangeAInspect

Append or replace one camera-view edit. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
shot_indexYes
step_indexNoOne-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings.
camera_edit_idYesCamera edit preset.
expected_brief_revisionYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=false, idempotent=false), the description discloses cost and side-effect boundaries ('No media generation, credit charge or library change'), an optimistic-concurrency requirement ('requires the current brief revision'), the return shape ('Returns a new brief and quote'), and a required workflow ordering ('Read the returned recipe_key before the next edit'). That is exactly the extra context annotations cannot carry.

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 mutation verb and its append/replace modes lead, followed by scope, prerequisites, side-effect exclusions, return value and follow-up action — each sentence adds a distinct fact with 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?

For a mutation tool with no output schema, the description covers preconditions, side effects, return summary and next-step workflow. What it lacks is any detail on the returned 'quote' or the structure of the new brief, and the relationship of shot_index to photo format is only loosely implied.

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 63%, with brief_id, shot_index and expected_brief_revision undocumented in the schema; the description partly compensates by explaining the revision precondition and the look_keys default ('default: all its looks'). The recipe_key is clarified as 'the named brief flow' from the current brief. However, brief_id and shot_index remain unglossed and 'Photo format is shared across the shoot' is an ambiguous hint rather than a stated parameter rule.

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 opening sentence states a specific verb and resource ('Append or replace one camera-view edit') and the scope of what gets revised ('selected looks using the named brief flow'). It is distinguishable from plan_shoot_edit/plan_shoot_image/plan_shoot_video by 'camera-view edit' and 'Photo format is shared across the shoot', though it never explicitly names those 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?

It gives a clear context (correcting camera framing on a planned shoot), states the append-vs-replace choice up front, and surfaces the prerequisite 'requires the current brief revision'. It also carves out what this tool is NOT for via 'No media generation, credit charge or library change', but it never names the alternative tool to use for those cases.

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

plan_shoot_editPlan Shoot EditAInspect

Append or replace one prompt-based image edit. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
promptYes
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
shot_indexYes
step_indexNoOne-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings.
expected_brief_revisionYes

TDQS

A4/5.0
Behavior4/5

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

With readOnlyHint=false and destructiveHint=false, the agent is left guessing about side effects, and the description fills that gap by declaring no media generation, no credit charge and no library change. It also names the return artifacts (new brief and quote) and the optimistic revision requirement, which explains the non-idempotent behavior.

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 operation and its constraints are front-loaded in the first two sentences, followed by effect disclosure and return behavior, with no filler. A couple of phrases such as "Photo format is shared across the shoot" are compressed to the point of being cryptic without prior context.

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 an 8-parameter planning mutation with no output schema, the description covers preconditions, defaults, side-effect boundaries and what is returned. It leaves some parameters (brief_id, shot_index) undocumented, but the critical workflow facts an agent needs to call it safely are present.

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?

At 50% schema coverage the description must carry weight, and it explains the trickiest interactions: the named flow (recipe_key), the affected looks with an all-looks default, and the append-vs-replace split that maps to step_index. brief_id, shot_index and expected_brief_revision semantics are only loosely implied rather than spelled out.

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 pair ("Append or replace") and a precise resource ("one prompt-based image edit"), scoped to a shot/look within a brief flow. That qualifier distinguishes it from siblings like plan_shoot_image, plan_shoot_background_removal or plan_shoot_upscale, 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 real preconditions and sequencing: it requires the current brief revision, defaults to all looks on the flow, and instructs reading the returned recipe_key before the next edit. It does not state when to prefer this over the other plan_shoot_* edit tools, so it stops short of explicit alternatives.

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

plan_shoot_imagePlan Shoot ImageAInspect

Add a base image shot or revise its camera. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
cameraYes
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
resolutionNoShared photo resolution for the whole shoot.
shot_indexNoOne-based shot to revise; omit to append a new shot. Revising its camera retains dependent steps.
aspect_ratioNoShared photo format for the whole shoot.
expected_brief_revisionYes

TDQS

A3.7/5.0
Behavior4/5

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

Goes beyond annotations with genuinely decision-relevant behavior: 'No media generation, credit charge or library change', plus 'Returns a new brief and quote'. That tells the agent this is a free, planning-only mutation, which annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false) alone don't convey. It stops short of describing concurrency failure behavior for a stale expected_brief_revision.

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 action, then constraints, then return behavior, then the workflow tip — a sensible ordering with no filler. The telegraphic 'Revises the selected looks using the named brief flow (default: all its looks)' is slightly compressed and ambiguous about which entity 'its' refers to.

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 9-parameter planning mutation with no output schema, it covers the essentials: what is created, what is returned, that no credits or library state change, and the recipe_key handoff. Missing pieces are minor — no sibling routing and no error/stale-revision behavior — but an agent can call it correctly from this.

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?

At 67% schema coverage the schema already documents board_id, look_keys, recipe_key, resolution, shot_index and aspect_ratio; the description mostly restates the 'shared across the shoot' framing already in those fields. Its real added value is flagging that the current brief revision is required (expected_brief_revision, which has no schema description), but camera, brief_id and the revision semantics stay unexplained.

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: 'Add a base image shot or revise its camera', and clarifies it revises looks using a named brief flow. The two-mode framing (append vs. revise) is clear, but the description never names the nearby siblings (plan_shoot_camera_change, plan_shoot_edit, plan_shoot_upscale) that an agent would otherwise confuse it with.

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?

'Requires the current brief revision' and 'Read the returned recipe_key before the next edit' give sequencing and preconditions, which is useful. However, there is no explicit statement of when to choose this over plan_shoot_camera_change or plan_shoot_edit, so selection between planning siblings remains inferred.

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

plan_shoot_upscalePlan Shoot UpscaleAInspect

Append or replace one image upscale. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
factorYes
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
shot_indexYes
step_indexNoOne-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings.
expected_brief_revisionYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare it as a non-destructive, non-idempotent, closed-world mutation, so the bar is lower; the description still adds substantive context the annotations cannot: no media generation, no credit charge, no library change, and it returns a new brief and quote rather than producing assets. The optimistic-concurrency requirement ('requires the current brief revision') is also disclosed. It stops short of saying what a 'replace' discards from the existing step.

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?

Five short sentences, action front-loaded, with the cost/side-effect disclaimer and the next-edit instruction at the end where they are most useful. It is dense but every sentence carries information; the only cost is a slightly telegraphic register ('the named brief flow') with no wasted prose.

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 6-required-parameter mutation with no output schema, the description does well on the return contract ('returns a new brief and quote') and the follow-up workflow ('read the returned recipe_key'), but leaves the two most semantically loaded parameters, factor and shot_index, entirely unexplained. An agent can call it correctly but cannot reason about the effect of a given factor value.

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 50% schema description coverage, the description partially compensates: it explains look_keys defaulting to all looks on the flow, step_index as append-vs-replace, recipe_key as 'the named brief flow', and expected_brief_revision as the current revision. But factor (the numeric upscale multiplier, exclusiveMinimum 0) and shot_index (1-8) get no meaning at all, and 'Photo format is shared across the shoot' is too vague to resolve 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?

Specific verb and resource: 'Append or replace one image upscale' names the exact operation on the shoot plan, and 'Revises the selected looks using the named brief flow' scopes the affected entities. It is clearly distinct from plan_shoot_image / plan_shoot_edit / plan_shoot_video by naming the upscale operation, though it never explicitly contrasts itself with those siblings.

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?

'Requires the current brief revision' and 'Read the returned recipe_key before the next edit' give real pre/post conditions for chaining calls, and 'omit for every look using it' is echoed from look_keys. However, there is no statement of when to choose upscale over plan_shoot_edit or plan_shoot_image, and no explicit exclusion criteria; usage is implied by the operation name rather than guided.

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

plan_shoot_videoPlan Shoot VideoAInspect

Append or replace one image-to-video step. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
soundNo
promptNo
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
shot_indexYes
step_indexNoOne-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings.
length_secondsYes
expected_brief_revisionYes

TDQS

A4/5.0
Behavior4/5

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

Beyond the annotations it discloses real behavior: optimistic-concurrency requirement on expected_brief_revision, the absence of side effects ('No media generation, credit charge or library change'), and the return payload ('a new brief and quote'), all useful given there is no output schema. It stops short of describing what happens on a revision mismatch or whether the previous step is lost on replace.

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 compact sentences, front-loaded with the mutation mode and ending with the next-action instruction; almost nothing is filler. The telegraphic packing ('Photo format is shared across the shoot') and the dangling 'read the returned recipe_key' make it slightly cryptic rather than maximally efficient.

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 10-parameter, 6-required mutation with no output schema, the description covers the mutation model, concurrency, side-effect scope and return shape — the essentials. But several required parameters (shot_index, length_seconds, board_id) and the failure mode for a stale revision go unexplained, leaving real gaps for a planning write.

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 40%, so the description is carrying weight — it clarifies step_index's append-vs-replace semantics, that look_keys defaults to every look on the flow, that recipe_key is a flow from the current brief, and that expected_brief_revision is the current one. It says nothing about length_seconds, sound, prompt, shot_index bounds, or what 'Photo format is shared across the shoot' constrains.

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 opening verb phrase 'Append or replace one image-to-video step' names the operation, the object, and its two modes, which immediately separates it from plan_shoot_image and plan_shoot_edit in the sibling list. Scope is further pinned down ('Revises the selected looks using the named brief flow') so the agent knows it is a plan-level step, not a generation.

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 when the edit applies (default: all looks using the flow, 'requires the current brief revision') and closes with an explicit follow-up rule: 'Read the returned recipe_key before the next edit.' What is missing is any exclusion or sibling routing — it never says to use plan_shoot_image for stills, remove_shoot_step to undo, or what to do when the revision is stale.

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

propose_briefPropose BriefAInspect

Saves a new brief and shows it on the board: the looks to shoot, their direction and the Automation they run through. The previous brief is kept (one that ran stays in Brief History). Returns the saved brief, or the problems to fix.

NameRequiredDescriptionDefault
looksYesThe looks to shoot, each one outfit worn in the shoot, with ids from read_shoot_board.
titleNoThe shoot's name, only in the user's own words; otherwise leave it out.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
directionYesRequired: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look.
image_modelNoThe shoot's image model: a slug from brief_inputs.ai_models (omit: kept).
video_modelNoThe shoot's video model: a slug from brief_inputs.ai_models (omit: kept).
recipe_workflow_idNoThe Automation every look runs through, as it is saved: a workflow_id from brief_inputs.automations or save_automation. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare it is not read-only, not destructive, and not idempotent; the description adds real context beyond that by stating the previous brief is preserved in Brief History and that the call returns either the saved brief or "the problems to fix" (i.e. validation failures). It stops short of describing what problems look like or whether a failed call leaves partial state.

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 action, then the persistence rule and the return contract. 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 7-parameter mutation with nested look objects and no output schema, the description covers the essential outcome (new brief saved, old one retained, success/failure return). It omits prerequisites such as needing an open board or what "problems" resolve to, which is the main remaining 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 looks, direction, board_id, and the model/automation slugs in detail. The description restates the high-level shape (looks, direction, automation) without adding format or constraint detail beyond the schema, 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?

"Saves a new brief and shows it on the board" gives a specific verb and resource, and the follow-on clause enumerates what the brief contains (looks, direction, automation). An agent can tell it creates a brief rather than reading or editing one, but it never names siblings like confirm_brief or update_brief, so the boundary against those is left implicit.

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 parenthetical about Brief History implies this is the create path and that prior briefs survive, which hints at when to use it. However, there is no explicit statement of when to choose propose_brief over confirm_brief, update_brief, or mcp_edit_brief, and no prerequisites (e.g. an open board) are spelled out.

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

propose_montageCreate Video MontageAInspect

ONLY for video montage/stitching/export workflows. Use when the user explicitly asks to create a montage, stitch clips, make a reel, export a video sequence, make video clips from images, or combine images/videos into one final video. Never use this for a photoshoot, lookbook, product shoot, collection shoot, outfit shoot, garment shoot, or image-generation request; those must use request_user_context followed by propose_brief/update_brief. Do not call this merely because selected context contains images, generations, garments, or models. A photoshoot may later feed a montage, but the photoshoot itself must be proposed as a BriefProposal first. PROPOSES the montage for user review — user can edit clips, generate missing videos, then export. Supports: existing videos with optional trim (target_duration or start_time/end_time), images that need video generation (specify video_model + a bespoke per-image motion prompt, and optionally target_duration or duration), per-clip speed/mute, global aspect ratio. If the user asks for clips to be e.g. '3 seconds each', set target_duration: 3 on every item, including image items. For image items, avoid generic repeated prompts: tailor each prompt to the specific image and any requested zoom, movement, energy, or camera direction. If motion is not specified, inspect the image first with view_image and then write a fitting motion prompt from the image content before proposing. The user reviews and confirms in the UI. Export is free (0 credits); video generation clips cost credits per their model.

NameRequiredDescriptionDefault
itemsYesOrdered list of montage items. Each is either an existing video or an image needing video generation. Min 1, max 10.
board_idNoThe open Shoot Board's board_id, from Open Shoot Board or your context.
aspect_ratioNoOutput aspect ratio (e.g. '9:16', '16:9', '1:1')9:16
base_resolutionNoOutput resolution height in pixels

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds substantial context beyond them: this PROPOSES rather than commits, the user reviews/edits/generates in the UI before export, export is free (0 credits), and video-generation clips consume credits per model. That cost and lifecycle disclosure is exactly what an agent needs and cannot get from 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.

Conciseness4/5

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

Front-loaded with the routing constraint, then capabilities, then cost — a sensible order. It is long and repeats the negative guidance in two overlapping sentences ('Never use this for a photoshoot...' and 'Do not call this merely because selected context contains...'), but the density is justified by the misrouting risk and multi-parameter workflow.

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?

No output schema exists, and the description compensates by explaining the return/lifecycle: a proposal the user reviews, edits, fills in with generated videos, and then exports. Combined with the cost note and the per-item authoring guidance, an agent has everything needed to call this 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?

Schema coverage is 100%, so baseline is 3, but the description adds real semantics: how to express '3 seconds each' (set target_duration: 3 on every item, including image items), the requirement of video_model plus a bespoke per-image prompt for type='image', and the interplay of target_duration vs duration. It also prescribes inspecting the image with view_image before writing a motion prompt when motion is unspecified.

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?

Specific verb+resource ('PROPOSES the montage') with an explicit scope line: 'ONLY for video montage/stitching/export workflows.' It actively distinguishes itself from siblings by naming request_user_context, propose_brief/update_brief, and implicitly mcp_export_montage ('proposes... user can edit clips... then export').

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 triggers (create a montage, stitch clips, make a reel, combine images/videos) plus hard exclusions (photoshoot, lookbook, product/collection/outfit/garment shoot, image generation) and names the alternative toolchain for those cases. It also warns against a common false-positive trigger: 'Do not call this merely because selected context contains images, generations, garments, or models.'

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

queue_generation_result_qaRun QA on ResultsA
Destructive
Inspect

Default tool for generation-result QA. Use this whenever the user asks to QA, quality check, validate, review, inspect for defects, approve/reject, or assess already-created generation results. Do not substitute view_image for QA unless the user explicitly asks for a manual visual critique instead of the official Uwear QA pipeline. First identify the numeric generation_result_ids, then call this tool, then call read_generation_result_qa for the same IDs. QA is free. QA is built for scale — validating large batches (hundreds or thousands of results). When the user is iterating on a handful of results one by one, do not queue QA on your own initiative; run it when the user asks for it or when operating at batch scale.

NameRequiredDescriptionDefault
max_qa_retriesNoMaximum QA-triggered retry generations to allow. Retry generations can cost additional generation credits.
generation_result_idsYesGeneration result IDs to QA. QA is free.

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: that QA is free, that it is designed for batches of hundreds/thousands, and that results must be read back via read_generation_result_qa. It does not explain the mutation side flagged by destructiveHint=true / idempotentHint=false — namely that QA-triggered retries consume generation credits and can replace results (only the schema's max_qa_retries note hints at this). Not a contradiction, but the costly/destructive lever goes undisclosed in the description.

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 default-tool claim and the usage rule, and every sentence is operational. It is on the long side for two parameters, and the 'QA is free' point is restated in both the description and the schema.

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 no-output-schema enqueue tool, the description supplies the full loop: identify IDs, queue, then call read_generation_result_qa for results — which compensates for the missing output schema. Cost and batching expectations are set, leaving no ambiguity about how to sequence the call.

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 two parameters are already documented, and the description reinforces that generation_result_ids are numeric and must be reused for the read-back call. It adds little on max_qa_retries beyond what the schema says (retries cost credits), so this sits just above 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?

States a specific verb and resource ('queue generation-result QA') and explicitly declares itself the default for that task. It also carves out the nearest alternative ('Do not substitute view_image ... unless the user explicitly asks for a manual visual critique'), so an agent can discriminate without opening the 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 triggers (QA, quality check, validate, review, approve/reject), an explicit exclusion (manual visual critique via view_image), an explicit negative rule ('do not queue QA on your own initiative' when iterating one-by-one), and the exact call sequence. Alternatives and when-not-to-use are both named.

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

read_generation_result_qaRead QA ResultsA
Read-onlyIdempotent
Inspect

Read official Uwear QA status, decision, and structured QA JSON for existing generation results. Call this after queue_generation_result_qa when the user asks to QA/check/validate/review generated outputs; summarize the structured decision and issues, not a manual view_image opinion.

NameRequiredDescriptionDefault
generation_result_idsYesGeneration result IDs to read QA for

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds value by explaining the tool returns structured QA decision and issues, and advising the agent to summarize rather than give a manual opinion. This extra context about output content and expected behavior goes beyond 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 two sentences, front-loaded with the verb 'Read' and the resource. Every clause provides useful information: purpose, sequencing, and usage guidance. No waste or redundancy.

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 simple one-parameter read-only tool, the description covers purpose, when to call, what to return, and how to handle the result. Annotations cover safety, and schema covers parameters. No output schema is needed because the description indicates structured data and summarization advice. Complete enough for an agent to select and invoke 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% for the single parameter generation_result_ids, with clear description. The tool description does not add significant parameter detail, but the schema already fully describes what the parameter means. Baseline 3 applies because the schema does the heavy lifting.

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 reads official Uwear QA status, decision, and structured QA JSON for existing generation results. It distinguishes itself from siblings by emphasizing 'official' and 'structured' data, and explicitly contrasts with view_image, making the purpose specific and non-ambiguous.

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 usage guidance: 'Call this after queue_generation_result_qa when the user asks to QA/check/validate/review generated outputs' and instructs to 'summarize the structured decision and issues, not a manual view_image opinion.' This clearly tells when to use it and what not to do, differentiating it from alternatives.

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

read_shoot_boardRead Shoot BoardA
Read-onlyIdempotent
Inspect

Use this before modify_shoot_board, propose_brief or update_brief: the user changes the board in the widget at any time. Returns the board's items (Clothing, Models, Outfits, Locations, art directions, files, results) with ids and names, its revision, its linked brief_id, and brief_inputs: the guide, asset facts, automations, cameras, AI models and limits a brief is written from. Changes nothing.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.

TDQS

A4.3/5.0
Behavior3/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 'Changes nothing' is largely a restatement of what the agent already knows. The genuinely additive disclosure is the staleness/race hazard ('the user changes the board in the widget at any time') and the return contents, but there is no detail on permissions, auth, or size/pagination limits.

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 calling condition and ending with the safety statement. The dense parenthetical inventory of return fields is justified because no output schema exists, though it is close to a run-on 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?

No output schema exists, so describing the payload (items, revision, brief_id, brief_inputs) is load-bearing and done well, and the freshness hazard is called out. It stops short of noting anything about repeated calls, payload size, or what happens for an invalid/closed board_id.

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?

Single parameter with 100% schema description coverage; the schema already tells the agent where to get board_id ('from Open Shoot Board or your context'). The description adds nothing parameter-specific, so baseline behavior applies, and zero optional params keeps ambiguity low.

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 (read) and resource (Shoot Board) and enumerates exactly what comes back: items with ids/names, revision, linked brief_id, and brief_inputs. This enumeration separates it cleanly from siblings like get_brief or list_garments 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?

Explicitly says to call it before modify_shoot_board, propose_brief and update_brief, and gives the reason: the widget's board can change at any time. That is a concrete prerequisite rule plus a named set of dependent tools, leaving little to inference.

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

remove_shoot_imageRemove Shoot ImageAInspect

Remove one base shot and its dependent steps. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
shot_indexYes
expected_brief_revisionYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive, non-idempotent, closed-world mutation. The description goes beyond that by disclosing the exact side-effect boundary (no media generation, no credit charge, no library change), the returned artifacts (new brief and quote) and the follow-up requirement to read recipe_key. That is meaningful added context annotations do not carry.

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 removal action and its dependent steps are front-loaded, followed by prerequisites, side effects and follow-up. Sentences are dense and purposeful. The line about photo format being shared across the shoot is somewhat tangentially placed and only loosely tied to the removal action.

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 6-parameter mutation with no output schema, the description covers prerequisites, side-effect boundaries, and the need to read the returned recipe_key before the next edit. Gaps remain on how shot_index is interpreted and on what the returned quote contains, but the core invocation contract is present.

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 50% schema coverage, the description compensates by explaining that the recipe_key names the brief flow, that look_keys defaults to all looks using that flow while other looks retain theirs, and that the current brief revision is required. shot_index and board_id are only weakly conveyed, so it is not complete, but it adds real meaning beyond 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: removes one base shot plus its dependent steps, and notes it revises selected looks via a named brief flow. It is clear about what is removed and what side product (new brief and quote) results. It does not explicitly distinguish itself from the close sibling remove_shoot_step, so an agent must infer the difference from 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?

Prerequisites are stated well (requires the current brief revision, read returned recipe_key before next edit), which effectively tells the agent when it is safe to invoke. However, there is no explicit routing against alternatives such as remove_shoot_step versus remove_shoot_image, leaving the agent to infer which removal tool applies.

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

remove_shoot_stepRemove Shoot StepAInspect

Remove one dependent step and reconnect its successor. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
look_keysNoAffected looks using this flow; omit for every look using it. Other looks retain their flow.
recipe_keyYesFlow from the current brief.
shot_indexYes
step_indexYes
expected_brief_revisionYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnly=false, destructive=false, idempotent=false), and the description adds real value on top: what is NOT affected (no media generation, credit charge, or library change), what is returned (new brief and quote, implying revisioned rather than in-place destruction), and the revision precondition. It does not explain the concurrency failure mode when expected_brief_revision is stale, which keeps it below a 5.

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 dense sentences, front-loaded with the action and its immediate consequence. Every sentence carries information, though the parenthetical "(default: all its looks)" and the trailing procedural instruction make it slightly telegraphic rather than cleanly structured.

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 correctly discloses the return value (a new brief and quote) and the recipe_key to reuse. It also covers the cost/side-effect surface. The remaining gap is the undescribed index parameters and the failure behavior on a stale revision.

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 43% and three of seven parameters (shot_index, step_index, expected_brief_revision, brief_id) have no field descriptions. The description compensates for look_keys scoping/default, recipe_key, and the revision requirement, but adds nothing about what shot_index vs step_index identify, so it is partially but not fully compensating.

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?

"Remove one dependent step and reconnect its successor" gives a specific verb, resource, and side effect, which separates it from siblings like remove_shoot_image or modify_shoot_board. It stops short of explicitly naming a sibling or contrasting when to use those instead, so a 4 rather than a 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 description supplies the operating context (brief flow scoping, default to all looks using that flow, requirement of the current brief revision) but never states when to choose this over the other board/edit siblings. The sequencing hint "Read the returned recipe_key before the next edit" is the closest thing to explicit guidance.

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

request_user_contextNew Shoot BoardAInspect

Use this when the user wants a photoshoot and you have no board_id yet. Creates a new, empty Uwear Shoot Board and returns its board_id, which every other Shoot Board tool takes. This client shows no widget: build the shoot with tools (search_uwear_library, modify_shoot_board, propose_brief) and tell the user what is on the board. prompt: one line describing the shoot; expected_types: what it needs.

NameRequiredDescriptionDefault
promptYesInstruction shown to the user, e.g. 'Select the clothing items you want to use and add them to the Shoot Board'
board_idNoThe open Shoot Board's board_id, from Open Shoot Board or your context.
min_itemsNoMinimum number of items the user must provide
expected_typesYesAccepted item types (match panel tabs): 'clothing', 'models', 'outfits', 'generations', 'files'. Legacy 'file' is accepted as an alias for 'files'.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare the mutation profile (readOnlyHint=false, idempotentHint=false), so the description adds real value: it discloses that the created board is empty, that its board_id is the prerequisite for every other Shoot Board tool, and that no widget is rendered so the agent must narrate board state itself. It stops short of covering failure modes or what happens if the user abandons the flow.

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 trigger and the core action in the first two sentences, then compresses the client-behavior note and parameter gloss tightly. The trailing parameter line is largely redundant with the schema, which is the only slight waste.

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 the return value (board_id) and its downstream role, and it tells the agent how to proceed in a no-widget client. Nothing an agent needs in order to call and follow up 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%, so the schema already documents all four parameters thoroughly (including the 'file'/'files' alias and min_items default). The description's gloss ('prompt: one line describing the shoot; expected_types: what it needs') adds only marginal meaning over that, so the 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?

States a specific verb and resource ('Creates a new, empty Uwear Shoot Board') plus the key output ('returns its board_id'), which reconciles the otherwise confusing mismatch between the tool name 'request_user_context' and the title 'New Shoot Board'. An agent can distinguish it from siblings like modify_shoot_board or search_uwear_library without opening the 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 an explicit trigger ('when the user wants a photoshoot and you have no board_id yet') and names the follow-up tools to use instead (search_uwear_library, modify_shoot_board, propose_brief). It also states the client-specific behavior to follow when no widget is shown, which is a concrete when/when-not instruction.

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

save_art_directionSave Art DirectionAInspect

Use this when the user asks to create, write or save an art direction, or the board's New art direction asks for one: write it from their words, the chat and the board, and save it in the same turn. Saves it to the library and makes it the board's one art direction, replacing the previous one (which stays in the library). Fill every section with concrete, photographable choices. It applies to every look, so it names no garment, outfit, Model or Location (text naming a board item is refused). If the board has a brief, apply it with update_brief direction.art_direction_id. If the result lists problems, fix them all and call again.

NameRequiredDescriptionDefault
moodYesThe feeling and the pose language: energy, expression, how the model moves.
nameYesIts title, 2-6 words, the one you used in chat (never Untitled or Art direction).
avoidNoWhat never appears, one per line.
lightYesDirection, softness, colour temperature and shadows (e.g. low warm sun from the left, long soft shadows).
cameraYesFraming, angle, lens feel and distance (e.g. eye-level 50mm, full body with headroom).
paletteYesThe colours of set, light and styling (e.g. terracotta, sand, washed olive).
settingYesWhere it is shot: studio backdrop or place, surfaces, props.
stylingYesHow the clothes are worn, hair, makeup, accessories, footwear.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
overviewYesWhat the photos should feel like overall, in 1-2 sentences.
must_keepNoRules every photo keeps, one per line (the user's own must-haves).
variationsNoOnly when the user wants variety across photos: each a name (Pose, Backdrop) and 2-6 complete alternatives Uwear rotates through.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that saving replaces the board's single art direction while the previous one stays in the library, that text naming a board item is refused, and that validation problems require a re-call. These are exactly the non-obvious behavioral traits (replacement semantics, refusal rules, error handling) an agent needs and that annotations do not 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?

Dense but front-loaded: trigger, write instruction, save semantics, content rules, and follow-up steps in a logical order. A few clauses (e.g. repeating the same-turn save and the brief pointer) are slightly verbose, though each still carries 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?

For a 12-parameter, 9-required mutation tool with no output schema, the description covers purpose, trigger, content constraints, replacement behavior, and post-call handling. An agent has enough to invoke it correctly and recover from the validation responses it should expect.

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 real meaning: 'Fill every section with concrete, photographable choices', the rule that the direction names no garment/outfit/Model/Location, and that variations apply 'only when the user wants variety'. These are semantic constraints 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?

States a specific verb and resource ('create, write or save an art direction') and distinguishes itself from siblings by naming the exact situation (the board's New art direction) that triggers it. An agent can separate it from get_art_direction, list_art_directions and update_brief without opening the 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?

Explicitly gives when-to-use ('when the user asks...or the board's New art direction asks for one'), the alternative workflow ('If the board has a brief, apply it with update_brief direction.art_direction_id'), and the retry rule ('If the result lists problems, fix them all and call again'). Nothing is left to inference.

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

save_automationSave Reusable AutomationAInspect

Save one flow from a reviewed brief as a new reusable library Automation, with its current shots, dependent steps and settings. Does not modify the brief, generate media or charge credits.

NameRequiredDescriptionDefault
nameYesName of the reusable library Automation to save.
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
recipe_keyYesThe flow's key in the brief's recipes list.
expected_brief_revisionYes

TDQS

A4/5.0
Behavior4/5

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

Annotations establish a non-readonly, non-idempotent, non-destructive write; the description usefully adds that copying existing shots/steps/settings happens and that no credits are charged or brief mutated, which is real cost/side-effect context beyond the hints. The gap is that idempotentHint=false is never explained — nothing says whether repeated calls with the same brief create duplicate Automations or how a revision mismatch is handled.

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 tight sentences: the positive action first, then the exclusions. Every clause carries information an agent needs; no filler or restated title.

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 five-parameter required, non-idempotent mutation with no output schema, the description covers what is produced and what is not touched, but silent on return value, duplicate-call behavior, and revision-conflict semantics. Adequate as a minimum, with clear gaps for a state-changing 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 description coverage is only 60%: brief_id and expected_brief_revision carry no schema description at all, and the description adds nothing about them — notably no hint that expected_brief_revision enforces an optimistic-concurrency check. The phrase 'from a reviewed brief' loosely points at brief_id, but none of the five required parameters gain meaning from the description.

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 pairs a specific verb ('Save') with a precisely scoped resource ('one flow from a reviewed brief as a new reusable library Automation'), plus what gets carried over (current shots, dependent steps, settings). The word 'new' implicitly separates it from update_automation and get_automation without needing to name them.

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 origin condition is explicit ('from a reviewed brief'), which tells an agent the brief must already be reviewed before calling. The exclusion sentence ('does not modify the brief, generate media or charge credits') rules out expectations in adjacent domains, but no sibling tool is named as an alternative for non-reusable or in-place edits.

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

save_reference_file_from_chat_fileSave Reference ImagesAInspect

Batch save reference images from chat attachments into the Files library. Keep file metadata in files[] and pass top-level image_file_1, image_file_2, etc. in the same order. No base64, no local paths. Use for mood boards, backgrounds, and other reference images that are not Clothing or Models.

NameRequiredDescriptionDefault
filesNoReference file metadata in the same order as image_file_1, image_file_2, etc. No base64.
board_idNoThe open Shoot Board's board_id, from Open Shoot Board or your context.
file_nameNoSingle recovered display name
image_urlNoSingle resolved download URL used by automatic opaque-file recovery.
mime_typeNoSingle recovered MIME/content type, e.g. image/png
image_file_1NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_2NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_3NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_4NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_5NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_6NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_7NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_8NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_9NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_10NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.

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 (not read-only, not destructive, open-world, non-idempotent), so the description adds the operational constraints instead: ordering between files[] and image_file_N, and the format bans on base64 and local paths. It stays silent on board_id requiring an open Shoot Board and on conflict/error behavior.

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 tight sentences, front-loaded with the core action before the mechanics and the routing rule. No filler, though the schema description noticeably duplicates the ordering instruction.

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 15-parameter nested tool with no output schema, the description covers the essentials an agent needs: purpose, the batch/ordering contract, accepted input formats, and routing exclusions. The rich schema carries the field detail, though the board_id precondition and result behavior are left implicit.

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%, so all 15 parameters are already documented at the field level, including the files[]-to-image_file_N ordering note. The description largely restates this and adds only the 'no base64, no local paths' constraint, so baseline 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?

States a specific verb (save), resource (reference images), and source (chat attachments) plus destination (Files library). Crucially it distinguishes itself from siblings by scoping out Clothing and Models, which routes the agent away from upload_garment_from_public_url and upload_avatar_from_chat_file.

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 usage context ('mood boards, backgrounds, and other reference images') and an explicit when-not ('not Clothing or Models'). It does not name the alternative tools by name, but the exclusion criteria are strong enough to steer selection.

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

search_uwear_librarySearch LibraryA
Read-onlyIdempotent
Inspect

Use this when the user names Clothing, Models, Locations, art directions, files or past results in chat and you need their ids. Takes a short keyword query (2-5 words, or an exact name, SKU or id) and returns typed ids, names and thumbnails. It finds items; it does not recommend them. Changes nothing.

NameRequiredDescriptionDefault
limitNoMaximum number of hybrid matches to return
queryYesShort keyword query: 2 to 5 words, one concept per call, or an exact name/SKU/ID. Every word must match for lexical results, so long sentences can return no lexical matches. Describing a garment finds that garment, not pieces to pair with it.
item_typesNoOptional item types to search. Omit to search clothing, avatars/models, locations, art directions, uploaded files, and generation results.
refresh_indexNoDeprecated compatibility input. No index refresh is performed, even when true. Search uses the maintained index and current lexical metadata. Leave false.
exclude_clothing_item_idsNoExclude these garment IDs after ranking and before the result limit; other item types are unaffected.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so 'Changes nothing' mostly restates them, though it usefully confirms the safety profile in prose. The description does add genuine behavioral context beyond annotations — hybrid matching, lexical all-words-must-match semantics, and that a described garment returns that garment rather than pairing suggestions — but says nothing about result ranking, scoring, or empty-result 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?

Three sentences, front-loaded with the usage trigger, then inputs/returns, then the find-vs-recommend boundary. Every clause carries routing or behavioral information; no filler and no restatement of the tool name.

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 takes on the job of saying what comes back (typed ids, names, thumbnails) and does so. Combined with full schema coverage and the annotation safety profile, an agent has everything needed to decide to call it and to construct a valid 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 description coverage is 100%, and the schema itself richly documents query, limit, item_types, the deprecated refresh_index, and exclude_clothing_item_ids. The description's query guidance (word count, exact SKU/id, one concept per call) largely mirrors the schema's own query description rather than adding new meaning. Baseline 3 is appropriate when the schema carries the parameter detail.

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?

Specific verb+resource+scope: it names the six searchable item categories (Clothing, Models, Locations, art directions, files, past results) and the payload (typed ids, names, thumbnails). It also carves out a boundary against a whole class of siblings — 'It finds items; it does not recommend them' — so an agent can separate it from list_* and proposal tools 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 Guidelines4/5

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

The trigger condition is explicit: use it when the user names an entity in chat and you need its ids, with a query-shape rule (2-5 words, one concept per call, or an exact name/SKU/id). The find-vs-recommend exclusion adds further routing signal. It stops short of naming the concrete alternative tools (list_garments, list_locations, mcp_list_files) for when a flat enumeration is wanted.

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

set_garment_sideSet Garment SideA
Idempotent
Inspect

Use this when a garment's photo shows its back but Uwear has it as the front (or the other way round): you saw the photo in this chat, or the user says so. side back makes the photo the garment's back, so back shots run from it; front undoes that. When the board holds the same garment twice, front and back photos as two garments, pass garment_id (the front) with side back and from_garment_id (the back): one garment with both photos. Call it yourself and continue (confirm_brief if the user asked to run): never ask the user to relabel a photo on the board. The board's brief is saved again with its new quote. Deletes nothing.

NameRequiredDescriptionDefault
sideYeswhat its photo shows: back makes it the garment's back photo
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
garment_idYesthe garment (clothing id on the board, or worn by a look of its brief)
from_garment_idNoside back only: a board garment whose photo is garment_id's back (the same garment added twice). Its photo becomes garment_id's back; it leaves the board, kept in the library

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover safety (readOnly=false, destructive=false, idempotent=true), and the description adds real context beyond them: the board's brief is re-saved with a new quote, nothing is deleted, and the source garment leaves the board but stays in the library. It stops short of describing permissions or what the response contains, but the side-effect profile is well disclosed.

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 trigger condition is front-loaded in the opening clause, and every sentence carries operational content. It is dense and slightly run-on, and the parenthetical '(confirm_brief if the user asked to run)' is terse to the point of ambiguity, but there is 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?

For a mutation tool with no output schema, the description covers what the agent needs: when to trigger it, how to handle the duplicate-garment case, what gets re-saved (quote), what is not destroyed, and that the agent should proceed without asking the user.

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 genuine value: it explains the front/back pair pattern where garment_id (front) plus from_garment_id (back) merge two board entries into one garment with both photos. That is usage-level meaning the schema doesn't convey.

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?

Names the exact condition and the effect: a garment whose photo shows its back but is registered as front gets relabeled, with 'side back' making the photo the garment's back and 'front' undoing it. That is specific enough to distinguish it from board-editing siblings like modify_shoot_board or mcp_reclassify_board_item.

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 triggers ('you saw the photo in this chat, or the user says so'), the duplicate-garment workflow with from_garment_id, and an explicit prohibition ('never ask the user to relabel a photo on the board'). It even states the follow-up behavior (call it yourself and continue, confirm_brief if the user asked to run).

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

set_generation_result_favoriteFavorite ResultA
DestructiveIdempotent
Inspect

The result viewer's star. Marks one of the user's own generation results as a favorite (favorite true) or removes the mark (false); deletes nothing and spends no credits.

NameRequiredDescriptionDefault
is_favoriteYesTrue to favorite, false to unfavorite
generation_result_idYesThe generation result ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so safety is partly covered. The description adds genuinely new context not present in the annotations: that the operation costs no credits and only touches the user's own result. The 'deletes nothing' phrasing scopes the destructive hint (the result row is not destroyed, only the favorite mark is toggled) rather than contradicting 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?

Two short sentences, front-loaded with a memorable frame ('The result viewer's star') followed immediately by the operative behavior and the safety/cost caveats. No 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 simple two-parameter boolean toggle with rich annotations and full schema coverage, the description covers purpose, effect, cost, and scope. A minor gap is that it never states reversibility/idempotency explicitly, though the toggle semantics imply 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 coverage is 100%, so both parameters are already documented (is_favorite: 'True to favorite, false to unfavorite'). The description mostly restates this, adding only the ownership constraint on generation_result_id, so the baseline 3 for schema-driven parameters 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 a specific verb+resource: it marks or unmarks a generation result as a favorite, and adds scope ('one of the user's own generation results'). This clearly separates it from near neighbors like mcp_set_generation_result_tags, mcp_delete_generation_results, and mcp_read_generation_result without the agent needing to open a schema.

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?

It explains the two modes ('favorite true' vs. 'false'), which is implied usage, but offers no explicit when-to-use guidance, no prerequisites, and no named alternative to prefer for related tasks. Adequate but with clear gaps.

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

show_in_shoot_boardShow in Shoot BoardA
Idempotent
Inspect

Moves a Shoot Board that is open in a widget to a view (board, brief, automation, results, brief_history). This client shows no widget, so it changes nothing the user sees: read the board, brief or results with read_shoot_board, get_brief or get_generation_results and tell the user.

NameRequiredDescriptionDefault
viewYesboard: the board's photos (Clothing, Models, Locations, references, the pinned Automation); brief: the brief's looks beside its automation (once it ran, each look with its photos and videos); automation: the same page, for its automation; results: a brief that ran, at its photos and videos; brief_history: every brief the user ran
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
look_keyNobrief / results: the look to bring forward (a key of the brief's looks)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds an important behavioral caveat that the effect is invisible in this client, supplementing the annotations well. It does not describe return values, but the annotations already cover the safety profile, so this is a strong addition.

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 action, then immediately delivers the critical caveat and the recommended workaround. It is compact with no redundant sentences.

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 three-parameter tool with full schema coverage and no output schema, the description provides the essential context an agent needs: what it does, where it has no visible effect, and what to do instead. Nothing critical 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%, so the schema already documents all parameters including the view enum and look_key pattern. The description adds no syntax or format details beyond what the schema provides, so the baseline 3 is appropriate.

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 action (move a Shoot Board that is open in a widget) and the target views, so the purpose is clear. It distinguishes itself from siblings by naming the read alternatives (read_shoot_board, get_brief, get_generation_results), but the underlying resource and effect are less immediately obvious than a tool like 'update_brief'.

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 tells the agent when not to bother: this client shows no widget, so the tool changes nothing visible, and instead the agent should read with read_shoot_board, get_brief, or get_generation_results. That is a concrete when/when-not with named alternatives.

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

update_automationUpdate Reusable AutomationA
Destructive
Inspect

Publish the reviewed flow identified by brief_id, revision and recipe_key as a new version of an existing reusable Automation. Requires its current definition hash. Accepts no operation definitions. Existing shoot snapshots remain unchanged. No media generation or charge.

NameRequiredDescriptionDefault
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYes
recipe_keyYesThe flow's key in the brief's recipes list.
workflow_idYesReusable Automation to version using the reviewed brief flow named here.
expected_brief_revisionYes
expected_definition_hashYesCurrent library hash; stale edits are refused.

TDQS

A4/5.0
Behavior4/5

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

The annotations already flag destructiveHint=true and idempotentHint=false, and the description adds valuable context beyond them: stale edits are refused via the hash, existing shoot snapshots remain unchanged (scoping the blast radius), and no media generation or charge occurs. It doesn't state what happens to the previous version beyond 'new version', but the added scope clarification is meaningful.

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?

Five short sentences, front-loaded with the action and identity, then requirements, then scope of side effects. Every sentence carries information about behavior or constraints.

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?

A mutation tool with rich annotations, no output schema, and 67% param coverage. The description covers the action, the identity keys, the guard (hash), the exclusions, and the absence of destructive side effects on snapshots or billing — enough 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.

Parameters4/5

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

Schema coverage is 67%; brief_id and expected_brief_revision have no schema descriptions, and the description compensates by tying brief_id, revision and recipe_key together as the identifying tuple and by explaining that expected_definition_hash must be the current hash or the edit is refused. It doesn't explain board_id or workflow_id semantics, but overall adds real meaning over 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?

The description gives a specific verb and resource: 'Publish the reviewed flow ... as a new version of an existing reusable Automation', which distinguishes it from sibling save_automation that creates new ones. It names the identifying keys (brief_id, revision, recipe_key) but omits workflow_id, which is the actual Automation being versioned, leaving a small mismatch between stated identity and the required parameters.

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?

Mentions prerequisites ('Requires its current definition hash') and exclusions ('Accepts no operation definitions'), which implies usage. But it never names an alternative (save_automation, mcp_recipe_save_draft) or states the condition that selects this tool over those siblings.

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

update_briefRevise BriefAInspect

Revise shoot looks, direction or model settings, or assign a saved Automation by ID. Accepts no operation definitions; use the separately published plan_shoot tools to change individual steps. Returns the revised plan and quote. No media generation, credit charge or reusable-library write.

NameRequiredDescriptionDefault
looksYesThe complete new look list (not a diff); an unchanged look keeps its key.
titleNoA new name for the shoot, only the user's own words (omit: kept).
board_idYesThe open Shoot Board's board_id, from Open Shoot Board or your context.
brief_idYesThe brief being revised: the board's brief_id from read_shoot_board.
directionNoA new Direction for the whole shoot, replacing the brief's (omit: kept): prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look.
image_modelNoThe shoot's image model: a slug from brief_inputs.ai_models (omit: kept).
video_modelNoThe shoot's video model: a slug from brief_inputs.ai_models (omit: kept).
recipe_look_keysNoThe looks (keys you send) that move to recipe_workflow_id; omit for every look.
recipe_workflow_idNoThe Automation the looks below move to, run as it is saved: a workflow_id from brief_inputs.automations or save_automation.
expected_brief_revisionNo

TDQS

A4/5.0
Behavior4/5

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

With destructiveHint=false and readOnlyHint=false already declared, the description adds genuine value by disclaiming side effects the agent would otherwise worry about on a mutation: no media generation, no credit charge, no reusable-library write. It also discloses the return payload (revised plan and quote). It does not explain the concurrency/staleness behavior implied by expected_brief_revision, which is the main unaddressed risk for a revision tool.

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, front-loaded with the capability, then the exclusion, then the return/side-effect profile. Every sentence carries distinct information and nothing repeats the schema or the title.

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 10-parameter mutation with no output schema, the description covers scope, exclusions, return values, and side-effect boundaries, and the nested LookInput/ProposedDirection types are well documented in-schema. The gap is expected_brief_revision, whose optimistic-concurrency meaning is left entirely implicit.

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 90%, so the schema already carries nearly all parameter meaning and the baseline of 3 applies. The description adds only marginal semantics — that the Automation is assigned "by ID" and that operation definitions are not accepted. The one undocumented parameter, expected_brief_revision, gets no explanation in the description either.

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 opening sentence states a specific verb and enumerates the resources it mutates: shoot looks, direction, model settings, and Automation assignment. It clearly separates itself from the plan_shoot_* family. It does not explain how it differs from the similarly named mcp_edit_brief or modify_shoot_board siblings, so differentiation is incomplete.

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?

"Accepts no operation definitions; use the separately published plan_shoot tools to change individual steps" is an explicit exclusion plus a named alternative, which is strong guidance. However, it gives no criteria for choosing between update_brief, propose_brief, mcp_edit_brief, and modify_shoot_board, all of which appear to touch brief/board state.

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

update_montage_proposalUpdate Video MontageAInspect

Patch the latest MontageProposal already shown in the UI. Use only for an existing video montage/reel/stitched sequence proposal; do not use this to modify a photoshoot brief. For photoshoot brief changes, call update_brief instead. Prefer operations, an ordered list of typed montage edits such as clear_trim, remove, set_duration, set_trim_range, set_speed, set_muted, set_prompt, set_video_model, set_generate_audio, set_last_frame, set_aspect_ratio, and set_base_resolution. Use set_trim_range for requests like 'use the second half', 'start at 3s', or 'trim from 3s to 6s'. Operations are applied in order to the current montage state. Legacy flat fields are still accepted as a compatibility shim. This updates the proposal only; it does not execute export or generation.

NameRequiredDescriptionDefault
mutedNoMute or unmute the selected clip(s).
speedNoPlayback speed multiplier.
promptNoUpdate the motion prompt for image-to-video montage items.
removeNoRemove the selected clip(s) from the proposal.
board_idNoThe open Shoot Board's board_id, from Open Shoot Board or your context.
end_timeNoTrim end time in seconds for legacy trim-range updates.
clear_trimNoFor video clips, remove trim bounds and restore the full clip length in the proposal.
operationsNoOrdered montage patch operations. Preferred over the legacy flat fields below.
start_timeNoTrim start time in seconds for legacy trim-range updates.
clip_numberNo1-based clip number to update. Omit when apply_to_all=true.
video_modelNoUpdate the video model for image-to-video montage items.
apply_to_allNoApply changes to every clip in the current montage proposal.
aspect_ratioNoUpdate the montage output aspect ratio.
clip_numbersNoOptional list of 1-based clip numbers to update together.
generate_audioNoEnable or disable generated audio for image-to-video montage items.
last_frame_urlNoOptional last-frame URL for image-to-video montage items.
base_resolutionNoUpdate the montage output resolution height.
target_durationNoDesired final clip length in seconds.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare it is a non-read-only, non-open-world, non-idempotent, non-destructive mutation, so the bar is lower. The description nonetheless adds real behavioral context beyond the annotations: operations apply in order to the current montage state, legacy flat fields act as a compatibility shim, and it explicitly does not execute export or generation.

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 core purpose, then exclusions, then the preferred parameter shape and ordering semantics. The op enumeration partially duplicates the schema enum, which costs a little, but the sentence about mapping user phrasing to set_trim_range 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 an 18-parameter mutation with no required params and no output schema, the description covers scope, the preferred vs legacy input paths, ordering behavior, and non-execution clearly. No return values are explained, which is acceptable since there is no output schema; the main minor gap is that reversibility of destructive-looking ops like `remove`/`clear_trim` is not spelled out.

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 genuine meaning: it names the preferred `operations` path, enumerates the op types, and maps natural-language requests to a concrete op ('use the second half', 'start at 3s', 'trim from 3s to 6s' → set_trim_range). This is more than the schema conveys.

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 ('Patch the latest MontageProposal already shown in the UI') and immediately scopes it to video montage/reel/stitched-sequence proposals. It explicitly distinguishes itself from the sibling update_brief, so an agent can route correctly 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 when-to-use ('Use only for an existing video montage...') and when-not ('do not use this to modify a photoshoot brief'), plus the alternative to call instead ('For photoshoot brief changes, call update_brief instead'). Nothing is left to inference.

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

upload_avatar_from_chat_fileUpload Models from ChatAInspect

Batch upload reusable Models from person photos the user attached in chat. Each photo becomes the upper_body_front identity anchor. Keep names and optional user-given age_range, build, and height_cm in avatars[], then pass top-level image_file_1, image_file_2, etc. in the same order. Traits are never guessed. No base64, no local paths. Do not use ordinary text-to-image results as an upload fallback. Use only when the user explicitly wants a specific or consistent person.

NameRequiredDescriptionDefault
nameNoSingle recovered avatar/model name
buildNoOptional concrete physical build. Never inferred.
avatarsNoAvatar/model metadata in the same order as image_file_1, image_file_2, etc. No base64.
board_idNoThe open Shoot Board's board_id, from Open Shoot Board or your context.
age_rangeNoOptional concrete age or age range. Never inferred.
file_nameNoSingle recovered original file name
height_cmNoOptional height in centimeters. Never inferred.
image_urlNoSingle resolved download URL used by automatic opaque-file recovery.
mime_typeNoSingle recovered MIME/content type, e.g. image/png
descriptionNoSingle recovered avatar metadata
image_file_1NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_2NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_3NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_4NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_5NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_6NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_7NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_8NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_9NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.
image_file_10NoHost-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare this as a non-readonly, non-destructive, non-idempotent, open-world write. The description adds genuine behavioral context beyond that: traits are never inferred, no base64 or local paths are accepted, and each uploaded photo maps to a repeatable identity anchor.

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?

Purpose is front-loaded in the first sentence, followed by mechanics and then guardrails ('Traits are never guessed', 'No base64'). It is slightly dense with multiple operating instructions, but nearly every sentence carries actionable content.

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 20-parameter write tool with nested objects and no output schema, the description covers the essential call mechanics (ordering, prohibited inputs, trait policy, usage trigger). It does not describe what the tool returns, which an agent might reasonably want for follow-up steps.

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 semantics: it explains the positional contract between avatars[] metadata and the top-level image_file_1..N fields ('in the same order') and which trait fields the agent may supply versus infer. The single-vs-batch duality is still somewhat under-explained.

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: 'Batch upload reusable Models from person photos the user attached in chat', and clarifies the artifact produced (an upper_body_front identity anchor). It is clearly distinguishable from a generic image upload, though it never names the close siblings (save_reference_file_from_chat_file, mcp_upload_intake_photo) that an agent might confuse it with.

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 an explicit positive condition ('Use only when the user explicitly wants a specific or consistent person') and a negative one ('Do not use ordinary text-to-image results as an upload fallback'). These are strong selection cues, but no named alternative tools are offered for the excluded cases.

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

upload_garment_from_public_urlUpload Clothing from URLAInspect

Upload Clothing from public HTTP(S) image URLs. Queues a recoverable batch upload and returns an operation immediately; retry with the exact same arguments to read its state (a retry creates no second upload). Photos are stored as uploaded, without background removal; processing_mode is ignored. Prefer assets with {asset_kind: full|detail, asset_view: front|back|side, asset_url}; exactly one full front is required, every full view is unique, and detail views can repeat. No base64, chat file objects, or local paths.

NameRequiredDescriptionDefault
nameNoSingle garment name
assetsNoSingle garment full asset set. Use asset_kind/asset_view. Exactly one full front is required; full views are unique and detail views can repeat.
genderNoSingle garment gender: male, female, unisex
board_idNoThe open Shoot Board's board_id, from Open Shoot Board or your context.
garmentsNoGarments to upload from public HTTP(S) URLs. No chat file objects and no base64.
file_nameNoSingle original file name
image_urlNoSingle public HTTP(S) front image URL
mime_typeNoSingle MIME/content type, e.g. image/png
descriptionNoSingle item-level garment description hint
back_image_urlNoSingle optional public HTTP(S) back image URL
side_image_urlNoSingle optional public HTTP(S) side image URL
processing_modeNoOptional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal.
detail_image_urlsNoSingle optional public HTTP(S) detail image URLs

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare write/open-world/safety hints; the description adds substantively: asynchronous queue semantics with immediate operation return, retry-as-poll behavior that creates no second upload, no background removal, processing_mode ignored, and rejected input forms. It even overrides the schema's claim that 'background_removal' is the platform default, which is high-value behavioral correction. The retry-dedup statement sits in mild tension with idempotentHint=false but reads as an operation-polling special case rather than a flat 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?

Four dense sentences, purpose front-loaded, no filler or repetition of the title. It is packed enough that the asset-shape and validity rules compete for attention with the async/retry contract, but every clause carries information an agent needs.

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 13-parameter, nested-typedef tool with no output schema and only safety annotations, the description covers the operational contract (async operation, retry/poll, no background removal), the accepted input surface, and asset validity rules. Gaps: no mention of the required board_id source, no guidance on how/when to check operation status beyond 'retry', and no per-field guidance for the legacy shortcut parameters.

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 cross-field validation semantics the schema does not state as rules: 'exactly one full front is required, every full view is unique, and detail views can repeat', plus the preferred {asset_kind, asset_view, asset_url} shape over deprecated asset_role/legacy shortcuts. It does not mention board_id or the 50-item cap on garments.

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?

Opens with a specific verb+resource+transport: 'Upload Clothing from public HTTP(S) image URLs', and immediately scopes it against sibling upload paths by ruling out 'base64, chat file objects, or local paths' (which separates it from upload_avatar_from_chat_file / save_reference_file_from_chat_file). The batch/operation model ('Queues a recoverable batch upload and returns an operation') further pins down what the tool actually does.

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 conditions for correct use: retry with the exact same arguments to read state, use assets shaped as {asset_kind, asset_view, asset_url}, exactly one full front required, full views unique, detail repeatable. It does not explicitly name an alternative tool for the chat-file/base64 case (it only negates those input forms), so routing guidance is implicit rather than spelled out.

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

uwear_settings_readRead Photoshoot SettingsA
Read-onlyIdempotent
Inspect

Read the user's saved photoshoot defaults (aspect ratio, camera, resolution) with every allowed value. Backs the plugin settings page.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
layoutNo
schemaYes
valuesYes

TDQS

A3.7/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=false, so the safety profile is fully covered structurally. The description adds that it returns 'every allowed value,' which usefully signals the response enumerates valid options, but does not disclose anything further about behavior or return structure.

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 tight sentence that front-loads the verb and resource, then the fields, then the use context. Nothing is wasted and no padding is present.

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 zero params, an output schema present, and annotations covering the safety profile, the description needs only to state purpose and context, which it does. The only mild omission is any explicit tie to the uwear_settings_update sibling, but nothing critical to calling the tool 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. No parameter-related gaps exist.

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 ('photoshoot defaults') and enumerates the concrete fields returned (aspect ratio, camera, resolution). It is clear what the tool does, though it never names or distinguishes itself from the obvious sibling uwear_settings_update beyond the read/update naming.

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?

'Backs the plugin settings page' gives some context for when this tool is relevant, implying it is used to populate a settings UI. However, there is no explicit when-to-use, when-not-to-use, or reference to the alternative uwear_settings_update for changing settings.

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

uwear_settings_updateUpdate Photoshoot SettingsA
DestructiveIdempotent
Inspect

Save changed photoshoot defaults (aspect ratio, camera, resolution). Send only the settings that changed; returns every current value. Defaults never authorize a paid generation.

NameRequiredDescriptionDefault
setYes

Output Schema

NameRequiredDescription
valuesYes

TDQS

A4/5.0
Behavior4/5

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

Beyond the annotations (readOnly=false, idempotent=true, destructive=true), the description discloses that only changed settings need to be sent (merge semantics), that every current value is returned, and that defaults never authorize a paid generation. It never clarifies what the destructiveHint actually destroys, which is the main remaining gap.

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 with the mutation action front-loaded, then the merge instruction, then the cost caveat. No filler or redundancy.

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 mutation tool with a nested partial-update schema and annotations, the description covers the action, the send-only-changed pattern, return behavior, and the critical 'no paid generation' caveat. An output schema exists, so return values need not be detailed; only the destructive semantics remain thin.

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 effectively 0% for the top-level 'set' object, and the description names the three nested fields (aspect ratio, camera, resolution), which is useful. However it omits the valid-value source (the enums in uwear_settings_read) that only appears in the schema, so it adds only modest meaning over the structure.

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 (save photoshoot defaults) and enumerates the affected fields (aspect ratio, camera, resolution), which is enough to distinguish it from the read sibling uwear_settings_read. It does not name that sibling explicitly, 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?

'Send only the settings that changed' gives a concrete partial-update usage pattern rather than leaving the caller to infer it. It does not spell out when to prefer this over reading settings first, but the intent is clear.

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. 4 tool updates
    • Changedadd_chat_photos_to_board1 field changed
      • addedInput schema / properties / back_of
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Two photos of one garment, when you can see they match: {image_file_N: image_file_M} for image_file_N showing the back of the garment image_file_M shows from the front. Uwear saves one garment with both photos.",
        +  "properties": {
        +    "image_file_1": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_10": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_2": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_3": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_4": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_5": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_6": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_7": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_8": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    },
        +    "image_file_9": {
        +      "pattern": "^image_file_([1-9]|10)$",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_templates3 fields changed
      • addedInput schema / properties / created_by_profile_id
        Added value: +{
        +  "default": null,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / kind
        Added value: +{
        +  "default": null,
        +  "enum": [
        +    "image",
        +    "edit",
        +    "video"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "default": "newest",
        +  "enum": [
        +    "newest",
        +    "most_used",
        +    "last_used"
        +  ],
        +  "type": "string"
        +}
    • Changedmcp_commit_intake2 fields changed
      • addedInput schema / properties / items / items / properties / back
        Added value: +{
        +  "description": "A new garment only: another photo of the same garment, showing its back (saved as its back photo; not with side back)",
        +  "properties": {
        +    "image_url": {
        +      "description": "Public HTTP(S) URL of the uploaded image (host file download URL, or the image_url mcp_upload_intake_photo returned)",
        +      "type": "string"
        +    },
        +    "sha256": {
        +      "description": "Hex SHA-256 of the file bytes, computed by the widget",
        +      "pattern": "^[0-9a-fA-F]{64}$",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "image_url",
        +    "sha256"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / items / items / properties / views
        Added value: +{
        +  "description": "A new garment only: its other photos (full back or side once each, not with back; details any view, repeatable; not with side back)",
        +  "items": {
        +    "properties": {
        +      "asset_kind": {
        +        "enum": [
        +          "full",
        +          "detail"
        +        ],
        +        "type": "string"
        +      },
        +      "asset_view": {
        +        "enum": [
        +          "front",
        +          "back",
        +          "side",
        +          "unspecified"
        +        ],
        +        "type": "string"
        +      },
        +      "image_url": {
        +        "description": "Public HTTP(S) URL of the uploaded image (host file download URL, or the image_url mcp_upload_intake_photo returned)",
        +        "type": "string"
        +      },
        +      "sha256": {
        +        "description": "Hex SHA-256 of the file bytes, computed by the widget",
        +        "pattern": "^[0-9a-fA-F]{64}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "image_url",
        +      "sha256",
        +      "asset_kind",
        +      "asset_view"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 12,
        +  "type": "array"
        +}
    • Changedset_garment_side1 field changed
      • addedInput schema / properties / from_garment_id
        Added value: +{
        +  "description": "side back only: a board garment whose photo is garment_id's back (the same garment added twice). Its photo becomes garment_id's back; it leaves the board, kept in the library",
        +  "minimum": 1,
        +  "type": "integer"
        +}
  2. 11 tool updates
    • Addedplan_shoot_background_removal
    • Addedplan_shoot_camera_change
    • Addedplan_shoot_edit
    • Addedplan_shoot_image
    • Addedplan_shoot_upscale
    • Addedplan_shoot_video
    • Changedpropose_brief4 fields changed
      • removedInput schema / $defs / RecipeSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "The recipe a demand asks for: its shots and their steps.",
        -  "properties": {
        -    "asks_for": {
        -      "default": null,
        -      "description": "What each look gives it besides its clothing: model (a Model wears the look), location, references (reference photos). Omit: references, and model and location when the board holds them.",
        -      "items": {
        -        "enum": [
        -          "model",
        -          "location",
        -          "references"
        -        ],
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "aspect_ratio": {
        -      "default": null,
        -      "description": "Photo aspect ratio, e.g. \"3:4\".",
        -      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        -      "type": "string"
        -    },
        -    "image_model": {
        -      "default": null,
        -      "description": "A listed image model's slug, only when the user named it.",
        -      "type": "string"
        -    },
        -    "name": {
        -      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        -      "maxLength": 80,
        -      "minLength": 1,
        -      "type": "string"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Photo resolution, e.g. \"2K\".",
        -      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        -      "type": "string"
        -    },
        -    "shots": {
        -      "description": "One shot per view, in order.",
        -      "items": {
        -        "$ref": "#/$defs/ShotSpec"
        -      },
        -      "maxItems": 8,
        -      "minItems": 1,
        -      "type": "array"
        -    },
        -    "video_model": {
        -      "default": null,
        -      "description": "A listed video model's slug, only when the user named it.",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "name",
        -    "shots"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / ShotSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One photo of each look, from one camera.",
        -  "properties": {
        -    "camera": {
        -      "description": "The view, from the camera list.",
        -      "enum": [
        -        "auto",
        -        "full_body_front",
        -        "full_body_back",
        -        "full_body_side",
        -        "upper_body_front",
        -        "upper_body_back",
        -        "upper_body_side",
        -        "lower_body_front",
        -        "lower_body_back",
        -        "lower_body_side",
        -        "clothing_detail_front",
        -        "clothing_detail_back",
        -        "clothing_detail_side"
        -      ],
        -      "type": "string"
        -    },
        -    "then": {
        -      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        -      "items": {
        -        "$ref": "#/$defs/StepSpec"
        -      },
        -      "maxItems": 4,
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "camera"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / StepSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One step on a shot's photo (or on the step before it).",
        -  "properties": {
        -    "camera_edit_id": {
        -      "default": null,
        -      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        -      "type": "string"
        -    },
        -    "factor": {
        -      "default": null,
        -      "description": "upscale only: the upscale factor, e.g. 2.",
        -      "exclusiveMinimum": 0,
        -      "type": "number"
        -    },
        -    "kind": {
        -      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        -      "enum": [
        -        "camera_edit",
        -        "edit",
        -        "upscale",
        -        "video",
        -        "remove_background"
        -      ],
        -      "type": "string"
        -    },
        -    "length_seconds": {
        -      "default": null,
        -      "description": "video only: the video length in seconds.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "prompt": {
        -      "default": null,
        -      "description": "edit: the change; video: the motion (optional).",
        -      "maxLength": 1000,
        -      "type": "string"
        -    },
        -    "sound": {
        -      "default": null,
        -      "description": "video only: whether the video has sound.",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "kind"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / properties / flow
        Removed value: -{
        -  "$ref": "#/$defs/RecipeSpec",
        -  "default": null,
        -  "description": "The complete photoshoot flow to build for this shoot: shots and their dependent steps. Omit to reuse recipe_workflow_id, the pinned flow or the current flow. Does not save a reusable library Automation."
        -}
    • Addedremove_shoot_image
    • Addedremove_shoot_step
    • Changedupdate_automation8 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "RecipeSpec": {
        -    "additionalProperties": false,
        -    "description": "The recipe a demand asks for: its shots and their steps.",
        -    "properties": {
        -      "asks_for": {
        -        "default": null,
        -        "description": "What each look gives it besides its clothing: model (a Model wears the look), location, references (reference photos). Omit: references, and model and location when the board holds them.",
        -        "items": {
        -          "enum": [
        -            "model",
        -            "location",
        -            "references"
        -          ],
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "aspect_ratio": {
        -        "default": null,
        -        "description": "Photo aspect ratio, e.g. \"3:4\".",
        -        "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        -        "type": "string"
        -      },
        -      "image_model": {
        -        "default": null,
        -        "description": "A listed image model's slug, only when the user named it.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        -        "maxLength": 80,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "resolution": {
        -        "default": null,
        -        "description": "Photo resolution, e.g. \"2K\".",
        -        "pattern": "^\\d{1,2}(\\.\\d)?K$",
        -        "type": "string"
        -      },
        -      "shots": {
        -        "description": "One shot per view, in order.",
        -        "items": {
        -          "$ref": "#/$defs/ShotSpec"
        -        },
        -        "maxItems": 8,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "video_model": {
        -        "default": null,
        -        "description": "A listed video model's slug, only when the user named it.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "name",
        -      "shots"
        -    ],
        -    "type": "object"
        -  },
        -  "ShotSpec": {
        -    "additionalProperties": false,
        -    "description": "One photo of each look, from one camera.",
        -    "properties": {
        -      "camera": {
        -        "description": "The view, from the camera list.",
        -        "enum": [
        -          "auto",
        -          "full_body_front",
        -          "full_body_back",
        -          "full_body_side",
        -          "upper_body_front",
        -          "upper_body_back",
        -          "upper_body_side",
        -          "lower_body_front",
        -          "lower_body_back",
        -          "lower_body_side",
        -          "clothing_detail_front",
        -          "clothing_detail_back",
        -          "clothing_detail_side"
        -        ],
        -        "type": "string"
        -      },
        -      "then": {
        -        "description": "Steps on this shot's photo, in order (a video ends the chain).",
        -        "items": {
        -          "$ref": "#/$defs/StepSpec"
        -        },
        -        "maxItems": 4,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "camera"
        -    ],
        -    "type": "object"
        -  },
        -  "StepSpec": {
        -    "additionalProperties": false,
        -    "description": "One step on a shot's photo (or on the step before it).",
        -    "properties": {
        -      "camera_edit_id": {
        -        "default": null,
        -        "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        -        "type": "string"
        -      },
        -      "factor": {
        -        "default": null,
        -        "description": "upscale only: the upscale factor, e.g. 2.",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "kind": {
        -        "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        -        "enum": [
        -          "camera_edit",
        -          "edit",
        -          "upscale",
        -          "video",
        -          "remove_background"
        -        ],
        -        "type": "string"
        -      },
        -      "length_seconds": {
        -        "default": null,
        -        "description": "video only: the video length in seconds.",
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "prompt": {
        -        "default": null,
        -        "description": "edit: the change; video: the motion (optional).",
        -        "maxLength": 1000,
        -        "type": "string"
        -      },
        -      "sound": {
        -        "default": null,
        -        "description": "video only: whether the video has sound.",
        -        "type": "boolean"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  }
        -}
      • addedInput schema / properties / brief_id
        Added value: +{
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / expected_brief_revision
        Added value: +{
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / expected_definition_hash / description
        Previous value: -"Current saved definition hash from get_automation or list_automations; refuses stale edits."New value: +"Current library hash; stale edits are refused."
      • removedInput schema / properties / flow
        Removed value: -{
        -  "$ref": "#/$defs/RecipeSpec",
        -  "description": "Complete replacement photoshoot flow. Publishes a new library version; existing shoot snapshots and past runs stay unchanged."
        -}
      • addedInput schema / properties / recipe_key
        Added value: +{
        +  "description": "The flow's key in the brief's recipes list.",
        +  "pattern": "^recipe_\\d{2,3}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / workflow_id / description
        Previous value: -"The reusable library Automation to update, not a shoot's private flow."New value: +"Reusable Automation to version using the reviewed brief flow named here."
      • changedInput schema / required
        Previous value: -[
        -  "workflow_id",
        -  "expected_definition_hash",
        -  "flow",
        -  "board_id"
        -]New value: +[
        +  "brief_id",
        +  "expected_brief_revision",
        +  "recipe_key",
        +  "workflow_id",
        +  "expected_definition_hash",
        +  "board_id"
        +]
    • Changedupdate_brief5 fields changed
      • removedInput schema / $defs / RecipeSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "The recipe a demand asks for: its shots and their steps.",
        -  "properties": {
        -    "asks_for": {
        -      "default": null,
        -      "description": "What each look gives it besides its clothing: model (a Model wears the look), location, references (reference photos). Omit: references, and model and location when the board holds them.",
        -      "items": {
        -        "enum": [
        -          "model",
        -          "location",
        -          "references"
        -        ],
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "aspect_ratio": {
        -      "default": null,
        -      "description": "Photo aspect ratio, e.g. \"3:4\".",
        -      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        -      "type": "string"
        -    },
        -    "image_model": {
        -      "default": null,
        -      "description": "A listed image model's slug, only when the user named it.",
        -      "type": "string"
        -    },
        -    "name": {
        -      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        -      "maxLength": 80,
        -      "minLength": 1,
        -      "type": "string"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Photo resolution, e.g. \"2K\".",
        -      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        -      "type": "string"
        -    },
        -    "shots": {
        -      "description": "One shot per view, in order.",
        -      "items": {
        -        "$ref": "#/$defs/ShotSpec"
        -      },
        -      "maxItems": 8,
        -      "minItems": 1,
        -      "type": "array"
        -    },
        -    "video_model": {
        -      "default": null,
        -      "description": "A listed video model's slug, only when the user named it.",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "name",
        -    "shots"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / ShotSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One photo of each look, from one camera.",
        -  "properties": {
        -    "camera": {
        -      "description": "The view, from the camera list.",
        -      "enum": [
        -        "auto",
        -        "full_body_front",
        -        "full_body_back",
        -        "full_body_side",
        -        "upper_body_front",
        -        "upper_body_back",
        -        "upper_body_side",
        -        "lower_body_front",
        -        "lower_body_back",
        -        "lower_body_side",
        -        "clothing_detail_front",
        -        "clothing_detail_back",
        -        "clothing_detail_side"
        -      ],
        -      "type": "string"
        -    },
        -    "then": {
        -      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        -      "items": {
        -        "$ref": "#/$defs/StepSpec"
        -      },
        -      "maxItems": 4,
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "camera"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / StepSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One step on a shot's photo (or on the step before it).",
        -  "properties": {
        -    "camera_edit_id": {
        -      "default": null,
        -      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        -      "type": "string"
        -    },
        -    "factor": {
        -      "default": null,
        -      "description": "upscale only: the upscale factor, e.g. 2.",
        -      "exclusiveMinimum": 0,
        -      "type": "number"
        -    },
        -    "kind": {
        -      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        -      "enum": [
        -        "camera_edit",
        -        "edit",
        -        "upscale",
        -        "video",
        -        "remove_background"
        -      ],
        -      "type": "string"
        -    },
        -    "length_seconds": {
        -      "default": null,
        -      "description": "video only: the video length in seconds.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "prompt": {
        -      "default": null,
        -      "description": "edit: the change; video: the motion (optional).",
        -      "maxLength": 1000,
        -      "type": "string"
        -    },
        -    "sound": {
        -      "default": null,
        -      "description": "video only: whether the video has sound.",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "kind"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / expected_brief_revision
        Added value: +{
        +  "default": null,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • removedInput schema / properties / flow
        Removed value: -{
        -  "$ref": "#/$defs/RecipeSpec",
        -  "default": null,
        -  "description": "Complete replacement shots and dependent steps for this shoot only. recipe_look_keys selects affected looks; omit it for all looks. Saved library Automations and earlier shoot flows remain unchanged."
        -}
  3. 6 tool updates
    • Removedcreate_automation
    • Addedget_automation
    • Changedpropose_brief5 fields changed
      • addedInput schema / $defs / RecipeSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The recipe a demand asks for: its shots and their steps.",
        +  "properties": {
        +    "asks_for": {
        +      "default": null,
        +      "description": "What each look gives it besides its clothing: model (a Model wears the look), location, references (reference photos). Omit: references, and model and location when the board holds them.",
        +      "items": {
        +        "enum": [
        +          "model",
        +          "location",
        +          "references"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "aspect_ratio": {
        +      "default": null,
        +      "description": "Photo aspect ratio, e.g. \"3:4\".",
        +      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        +      "type": "string"
        +    },
        +    "image_model": {
        +      "default": null,
        +      "description": "A listed image model's slug, only when the user named it.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        +      "maxLength": 80,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "resolution": {
        +      "default": null,
        +      "description": "Photo resolution, e.g. \"2K\".",
        +      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        +      "type": "string"
        +    },
        +    "shots": {
        +      "description": "One shot per view, in order.",
        +      "items": {
        +        "$ref": "#/$defs/ShotSpec"
        +      },
        +      "maxItems": 8,
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "video_model": {
        +      "default": null,
        +      "description": "A listed video model's slug, only when the user named it.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "shots"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / ShotSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One photo of each look, from one camera.",
        +  "properties": {
        +    "camera": {
        +      "description": "The view, from the camera list.",
        +      "enum": [
        +        "auto",
        +        "full_body_front",
        +        "full_body_back",
        +        "full_body_side",
        +        "upper_body_front",
        +        "upper_body_back",
        +        "upper_body_side",
        +        "lower_body_front",
        +        "lower_body_back",
        +        "lower_body_side",
        +        "clothing_detail_front",
        +        "clothing_detail_back",
        +        "clothing_detail_side"
        +      ],
        +      "type": "string"
        +    },
        +    "then": {
        +      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        +      "items": {
        +        "$ref": "#/$defs/StepSpec"
        +      },
        +      "maxItems": 4,
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "camera"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / StepSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One step on a shot's photo (or on the step before it).",
        +  "properties": {
        +    "camera_edit_id": {
        +      "default": null,
        +      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        +      "type": "string"
        +    },
        +    "factor": {
        +      "default": null,
        +      "description": "upscale only: the upscale factor, e.g. 2.",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    "kind": {
        +      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        +      "enum": [
        +        "camera_edit",
        +        "edit",
        +        "upscale",
        +        "video",
        +        "remove_background"
        +      ],
        +      "type": "string"
        +    },
        +    "length_seconds": {
        +      "default": null,
        +      "description": "video only: the video length in seconds.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "prompt": {
        +      "default": null,
        +      "description": "edit: the change; video: the motion (optional).",
        +      "maxLength": 1000,
        +      "type": "string"
        +    },
        +    "sound": {
        +      "default": null,
        +      "description": "video only: whether the video has sound.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / flow
        Added value: +{
        +  "$ref": "#/$defs/RecipeSpec",
        +  "default": null,
        +  "description": "The complete photoshoot flow to build for this shoot: shots and their dependent steps. Omit to reuse recipe_workflow_id, the pinned flow or the current flow. Does not save a reusable library Automation."
        +}
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"The Automation every look runs through, as it is saved: a workflow_id from brief_inputs.automations or create_automation. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it."New value: +"The Automation every look runs through, as it is saved: a workflow_id from brief_inputs.automations or save_automation. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it."
    • Addedsave_automation
    • Addedupdate_automation
    • Changedupdate_brief5 fields changed
      • addedInput schema / $defs / RecipeSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The recipe a demand asks for: its shots and their steps.",
        +  "properties": {
        +    "asks_for": {
        +      "default": null,
        +      "description": "What each look gives it besides its clothing: model (a Model wears the look), location, references (reference photos). Omit: references, and model and location when the board holds them.",
        +      "items": {
        +        "enum": [
        +          "model",
        +          "location",
        +          "references"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "aspect_ratio": {
        +      "default": null,
        +      "description": "Photo aspect ratio, e.g. \"3:4\".",
        +      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        +      "type": "string"
        +    },
        +    "image_model": {
        +      "default": null,
        +      "description": "A listed image model's slug, only when the user named it.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        +      "maxLength": 80,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "resolution": {
        +      "default": null,
        +      "description": "Photo resolution, e.g. \"2K\".",
        +      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        +      "type": "string"
        +    },
        +    "shots": {
        +      "description": "One shot per view, in order.",
        +      "items": {
        +        "$ref": "#/$defs/ShotSpec"
        +      },
        +      "maxItems": 8,
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "video_model": {
        +      "default": null,
        +      "description": "A listed video model's slug, only when the user named it.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "shots"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / ShotSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One photo of each look, from one camera.",
        +  "properties": {
        +    "camera": {
        +      "description": "The view, from the camera list.",
        +      "enum": [
        +        "auto",
        +        "full_body_front",
        +        "full_body_back",
        +        "full_body_side",
        +        "upper_body_front",
        +        "upper_body_back",
        +        "upper_body_side",
        +        "lower_body_front",
        +        "lower_body_back",
        +        "lower_body_side",
        +        "clothing_detail_front",
        +        "clothing_detail_back",
        +        "clothing_detail_side"
        +      ],
        +      "type": "string"
        +    },
        +    "then": {
        +      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        +      "items": {
        +        "$ref": "#/$defs/StepSpec"
        +      },
        +      "maxItems": 4,
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "camera"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / StepSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One step on a shot's photo (or on the step before it).",
        +  "properties": {
        +    "camera_edit_id": {
        +      "default": null,
        +      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        +      "type": "string"
        +    },
        +    "factor": {
        +      "default": null,
        +      "description": "upscale only: the upscale factor, e.g. 2.",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    "kind": {
        +      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        +      "enum": [
        +        "camera_edit",
        +        "edit",
        +        "upscale",
        +        "video",
        +        "remove_background"
        +      ],
        +      "type": "string"
        +    },
        +    "length_seconds": {
        +      "default": null,
        +      "description": "video only: the video length in seconds.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "prompt": {
        +      "default": null,
        +      "description": "edit: the change; video: the motion (optional).",
        +      "maxLength": 1000,
        +      "type": "string"
        +    },
        +    "sound": {
        +      "default": null,
        +      "description": "video only: whether the video has sound.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / flow
        Added value: +{
        +  "$ref": "#/$defs/RecipeSpec",
        +  "default": null,
        +  "description": "Complete replacement shots and dependent steps for this shoot only. recipe_look_keys selects affected looks; omit it for all looks. Saved library Automations and earlier shoot flows remain unchanged."
        +}
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"The Automation the looks below move to, run as it is saved: a workflow_id from brief_inputs.automations or create_automation."New value: +"The Automation the looks below move to, run as it is saved: a workflow_id from brief_inputs.automations or save_automation."
  4. 3 tool updates
    • Addedcreate_automation
    • Changedpropose_brief8 fields changed
      • changedInput schema / $defs / ProposedDirection / description
        Previous value: -"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs."New value: +"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither,\nso every brief says what runs."
      • removedInput schema / $defs / RecipeSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "The recipe a demand asks for: its shots and their steps.",
        -  "properties": {
        -    "aspect_ratio": {
        -      "default": null,
        -      "description": "Photo aspect ratio, e.g. \"3:4\".",
        -      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        -      "type": "string"
        -    },
        -    "image_model": {
        -      "default": null,
        -      "description": "A listed image model's slug, only when the user named it.",
        -      "type": "string"
        -    },
        -    "name": {
        -      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        -      "maxLength": 80,
        -      "minLength": 1,
        -      "type": "string"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Photo resolution, e.g. \"2K\".",
        -      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        -      "type": "string"
        -    },
        -    "shots": {
        -      "description": "One shot per view, in order.",
        -      "items": {
        -        "$ref": "#/$defs/ShotSpec"
        -      },
        -      "maxItems": 8,
        -      "minItems": 1,
        -      "type": "array"
        -    },
        -    "video_model": {
        -      "default": null,
        -      "description": "A listed video model's slug, only when the user named it.",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "name",
        -    "shots"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / ShotSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One photo of each look, from one camera.",
        -  "properties": {
        -    "camera": {
        -      "description": "The view, from the camera list.",
        -      "enum": [
        -        "auto",
        -        "full_body_front",
        -        "full_body_back",
        -        "full_body_side",
        -        "upper_body_front",
        -        "upper_body_back",
        -        "upper_body_side",
        -        "lower_body_front",
        -        "lower_body_back",
        -        "lower_body_side",
        -        "clothing_detail_front",
        -        "clothing_detail_back",
        -        "clothing_detail_side"
        -      ],
        -      "type": "string"
        -    },
        -    "then": {
        -      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        -      "items": {
        -        "$ref": "#/$defs/StepSpec"
        -      },
        -      "maxItems": 4,
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "camera"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / StepSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One step on a shot's photo (or on the step before it).",
        -  "properties": {
        -    "camera_edit_id": {
        -      "default": null,
        -      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        -      "type": "string"
        -    },
        -    "factor": {
        -      "default": null,
        -      "description": "upscale only: the upscale factor, e.g. 2.",
        -      "exclusiveMinimum": 0,
        -      "type": "number"
        -    },
        -    "kind": {
        -      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        -      "enum": [
        -        "camera_edit",
        -        "edit",
        -        "upscale",
        -        "video",
        -        "remove_background"
        -      ],
        -      "type": "string"
        -    },
        -    "length_seconds": {
        -      "default": null,
        -      "description": "video only: the video length in seconds.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "prompt": {
        -      "default": null,
        -      "description": "edit: the change; video: the motion (optional).",
        -      "maxLength": 1000,
        -      "type": "string"
        -    },
        -    "sound": {
        -      "default": null,
        -      "description": "video only: whether the video has sound.",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "kind"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / image_model
        Added value: +{
        +  "default": null,
        +  "description": "The shoot's image model: a slug from brief_inputs.ai_models (omit: kept).",
        +  "type": "string"
        +}
      • removedInput schema / properties / recipe
        Removed value: -{
        -  "$ref": "#/$defs/RecipeSpec",
        -  "default": null,
        -  "description": "The shots and steps the user described (views, crops, edits, upscale, video): Uwear builds them as a new automation. Not with recipe_workflow_id."
        -}
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An automation from read_shoot_board's brief_inputs.automations that every look runs through as is (only when it matches what the user asked for). Not with recipe. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it."New value: +"The Automation every look runs through, as it is saved: a workflow_id from brief_inputs.automations or create_automation. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it."
      • addedInput schema / properties / video_model
        Added value: +{
        +  "default": null,
        +  "description": "The shoot's video model: a slug from brief_inputs.ai_models (omit: kept).",
        +  "type": "string"
        +}
    • Changedupdate_brief9 fields changed
      • changedInput schema / $defs / ProposedDirection / description
        Previous value: -"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs."New value: +"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither,\nso every brief says what runs."
      • removedInput schema / $defs / RecipeSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "The recipe a demand asks for: its shots and their steps.",
        -  "properties": {
        -    "aspect_ratio": {
        -      "default": null,
        -      "description": "Photo aspect ratio, e.g. \"3:4\".",
        -      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        -      "type": "string"
        -    },
        -    "image_model": {
        -      "default": null,
        -      "description": "A listed image model's slug, only when the user named it.",
        -      "type": "string"
        -    },
        -    "name": {
        -      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        -      "maxLength": 80,
        -      "minLength": 1,
        -      "type": "string"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Photo resolution, e.g. \"2K\".",
        -      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        -      "type": "string"
        -    },
        -    "shots": {
        -      "description": "One shot per view, in order.",
        -      "items": {
        -        "$ref": "#/$defs/ShotSpec"
        -      },
        -      "maxItems": 8,
        -      "minItems": 1,
        -      "type": "array"
        -    },
        -    "video_model": {
        -      "default": null,
        -      "description": "A listed video model's slug, only when the user named it.",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "name",
        -    "shots"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / ShotSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One photo of each look, from one camera.",
        -  "properties": {
        -    "camera": {
        -      "description": "The view, from the camera list.",
        -      "enum": [
        -        "auto",
        -        "full_body_front",
        -        "full_body_back",
        -        "full_body_side",
        -        "upper_body_front",
        -        "upper_body_back",
        -        "upper_body_side",
        -        "lower_body_front",
        -        "lower_body_back",
        -        "lower_body_side",
        -        "clothing_detail_front",
        -        "clothing_detail_back",
        -        "clothing_detail_side"
        -      ],
        -      "type": "string"
        -    },
        -    "then": {
        -      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        -      "items": {
        -        "$ref": "#/$defs/StepSpec"
        -      },
        -      "maxItems": 4,
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "camera"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / StepSpec
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "One step on a shot's photo (or on the step before it).",
        -  "properties": {
        -    "camera_edit_id": {
        -      "default": null,
        -      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        -      "type": "string"
        -    },
        -    "factor": {
        -      "default": null,
        -      "description": "upscale only: the upscale factor, e.g. 2.",
        -      "exclusiveMinimum": 0,
        -      "type": "number"
        -    },
        -    "kind": {
        -      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        -      "enum": [
        -        "camera_edit",
        -        "edit",
        -        "upscale",
        -        "video",
        -        "remove_background"
        -      ],
        -      "type": "string"
        -    },
        -    "length_seconds": {
        -      "default": null,
        -      "description": "video only: the video length in seconds.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "prompt": {
        -      "default": null,
        -      "description": "edit: the change; video: the motion (optional).",
        -      "maxLength": 1000,
        -      "type": "string"
        -    },
        -    "sound": {
        -      "default": null,
        -      "description": "video only: whether the video has sound.",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "kind"
        -  ],
        -  "type": "object"
        -}
      • changedInput schema / properties / image_model / description
        Previous value: -"A listed image model's slug the user asked for (\"use GPT Image\"): the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."New value: +"The shoot's image model: a slug from brief_inputs.ai_models (omit: kept)."
      • removedInput schema / properties / recipe
        Removed value: -{
        -  "$ref": "#/$defs/RecipeSpec",
        -  "default": null,
        -  "description": "The complete new shots and steps, built as a new automation for the looks below (e.g. the old shots plus a side view). Not with recipe_workflow_id."
        -}
      • changedInput schema / properties / recipe_look_keys / description
        Previous value: -"The looks (keys you send) that move to recipe / recipe_workflow_id; omit for every look."New value: +"The looks (keys you send) that move to recipe_workflow_id; omit for every look."
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An automation from read_shoot_board's brief_inputs.automations for the looks below. Not with recipe."New value: +"The Automation the looks below move to, run as it is saved: a workflow_id from brief_inputs.automations or create_automation."
      • changedInput schema / properties / video_model / description
        Previous value: -"A listed video model's slug the user asked for: the shoot's videos run on it. Not with recipe (name it in recipe.video_model)."New value: +"The shoot's video model: a slug from brief_inputs.ai_models (omit: kept)."
  5. 1 tool update
    • Changedconfirm_brief5 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "BriefRun": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "automation": {
        +        "maxLength": 300,
        +        "type": "string"
        +      },
        +      "looks": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 50,
        +        "type": "array"
        +      },
        +      "steps": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "automation",
        +      "looks",
        +      "steps"
        +    ],
        +    "type": "object"
        +  }
        +}
      • removedInput schema / properties / expected_total_credits / default
        Removed value: -null
      • changedInput schema / properties / expected_total_credits / description
        Previous value: -"The quote's total_credits the user saw."New value: +"The credits this Generate charges, as get_brief returns them."
      • addedInput schema / properties / runs
        Added value: +{
        +  "description": "What this Generate runs: each Automation, its looks and its steps, as get_brief returns them.",
        +  "items": {
        +    "$ref": "#/$defs/BriefRun"
        +  },
        +  "maxItems": 50,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "brief_id",
        -  "expected_brief_revision",
        -  "idempotency_key",
        -  "board_id"
        -]New value: +[
        +  "brief_id",
        +  "expected_brief_revision",
        +  "idempotency_key",
        +  "expected_total_credits",
        +  "runs",
        +  "board_id"
        +]
  6. 2 tool updates
    • Changedpropose_brief13 fields changed
      • removedInput schema / $defs / OutputInput
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "This brief's output; a field left out is kept, null follows the board's default again.",
        -  "properties": {
        -    "aspect_ratio": {
        -      "default": null,
        -      "description": "Photo aspect ratio, e.g. \"3:4\".",
        -      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        -      "type": "string"
        -    },
        -    "duration": {
        -      "default": null,
        -      "description": "Video length in seconds.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "generate_audio": {
        -      "default": null,
        -      "description": "Whether videos have sound.",
        -      "type": "boolean"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Photo resolution, e.g. \"2K\".",
        -      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        -      "type": "string"
        -    },
        -    "upscale_factor": {
        -      "anyOf": [
        -        {
        -          "exclusiveMinimum": 0,
        -          "type": "integer"
        -        },
        -        {
        -          "exclusiveMinimum": 0,
        -          "type": "number"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Upscale factor, e.g. 2."
        -    }
        -  },
        -  "type": "object"
        -}
      • changedInput schema / $defs / ProposedDirection / description
        Previous value: -"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither."New value: +"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs."
      • changedInput schema / $defs / ProposedDirection / properties / prompt / description
        Previous value: -"The direction in words, in English. Optional with an art_direction_id."New value: +"Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id."
      • addedInput schema / $defs / RecipeSpec / properties / aspect_ratio
        Added value: +{
        +  "default": null,
        +  "description": "Photo aspect ratio, e.g. \"3:4\".",
        +  "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        +  "type": "string"
        +}
      • addedInput schema / $defs / RecipeSpec / properties / resolution
        Added value: +{
        +  "default": null,
        +  "description": "Photo resolution, e.g. \"2K\".",
        +  "pattern": "^\\d{1,2}(\\.\\d)?K$",
        +  "type": "string"
        +}
      • addedInput schema / $defs / StepSpec / properties / factor
        Added value: +{
        +  "default": null,
        +  "description": "upscale only: the upscale factor, e.g. 2.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / $defs / StepSpec / properties / length_seconds
        Added value: +{
        +  "default": null,
        +  "description": "video only: the video length in seconds.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / $defs / StepSpec / properties / sound
        Added value: +{
        +  "default": null,
        +  "description": "video only: whether the video has sound.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / direction / description
        Previous value: -"The brief's direction: prompt, art_direction_id (a saved art direction), or both."New value: +"Required: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
      • removedInput schema / properties / image_model
        Removed value: -{
        -  "default": null,
        -  "description": "The brief's image model (a slug from brief_inputs.ai_models). Not with recipe.",
        -  "type": "string"
        -}
      • removedInput schema / properties / output
        Removed value: -{
        -  "$ref": "#/$defs/OutputInput",
        -  "default": null,
        -  "description": "This brief's output settings; a field left out keeps the brief's."
        -}
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An Automation for the looks (a workflow_id from brief_inputs.automations). Not with recipe."New value: +"An automation from read_shoot_board's brief_inputs.automations that every look runs through as is (only when it matches what the user asked for). Not with recipe. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it."
      • removedInput schema / properties / video_model
        Removed value: -{
        -  "default": null,
        -  "description": "The brief's video model (a slug from brief_inputs.ai_models). Not with recipe.",
        -  "type": "string"
        -}
    • Changedupdate_brief13 fields changed
      • removedInput schema / $defs / OutputInput
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "This brief's output; a field left out is kept, null follows the board's default again.",
        -  "properties": {
        -    "aspect_ratio": {
        -      "default": null,
        -      "description": "Photo aspect ratio, e.g. \"3:4\".",
        -      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        -      "type": "string"
        -    },
        -    "duration": {
        -      "default": null,
        -      "description": "Video length in seconds.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "generate_audio": {
        -      "default": null,
        -      "description": "Whether videos have sound.",
        -      "type": "boolean"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Photo resolution, e.g. \"2K\".",
        -      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        -      "type": "string"
        -    },
        -    "upscale_factor": {
        -      "anyOf": [
        -        {
        -          "exclusiveMinimum": 0,
        -          "type": "integer"
        -        },
        -        {
        -          "exclusiveMinimum": 0,
        -          "type": "number"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Upscale factor, e.g. 2."
        -    }
        -  },
        -  "type": "object"
        -}
      • changedInput schema / $defs / ProposedDirection / description
        Previous value: -"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither."New value: +"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs."
      • changedInput schema / $defs / ProposedDirection / properties / prompt / description
        Previous value: -"The direction in words, in English. Optional with an art_direction_id."New value: +"Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id."
      • addedInput schema / $defs / RecipeSpec / properties / aspect_ratio
        Added value: +{
        +  "default": null,
        +  "description": "Photo aspect ratio, e.g. \"3:4\".",
        +  "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        +  "type": "string"
        +}
      • addedInput schema / $defs / RecipeSpec / properties / resolution
        Added value: +{
        +  "default": null,
        +  "description": "Photo resolution, e.g. \"2K\".",
        +  "pattern": "^\\d{1,2}(\\.\\d)?K$",
        +  "type": "string"
        +}
      • addedInput schema / $defs / StepSpec / properties / factor
        Added value: +{
        +  "default": null,
        +  "description": "upscale only: the upscale factor, e.g. 2.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / $defs / StepSpec / properties / length_seconds
        Added value: +{
        +  "default": null,
        +  "description": "video only: the video length in seconds.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / $defs / StepSpec / properties / sound
        Added value: +{
        +  "default": null,
        +  "description": "video only: whether the video has sound.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / direction / description
        Previous value: -"The brief's new direction, replacing its current one (omit: kept): prompt, art_direction_id (a saved art direction), or both."New value: +"A new Direction for the whole shoot, replacing the brief's (omit: kept): prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
      • changedInput schema / properties / image_model / description
        Previous value: -"The brief's image model (a slug from brief_inputs.ai_models). Not with recipe."New value: +"A listed image model's slug the user asked for (\"use GPT Image\"): the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."
      • removedInput schema / properties / output
        Removed value: -{
        -  "$ref": "#/$defs/OutputInput",
        -  "default": null,
        -  "description": "This brief's output settings; a field left out keeps the brief's."
        -}
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An Automation for the looks (a workflow_id from brief_inputs.automations). Not with recipe."New value: +"An automation from read_shoot_board's brief_inputs.automations for the looks below. Not with recipe."
      • changedInput schema / properties / video_model / description
        Previous value: -"The brief's video model (a slug from brief_inputs.ai_models). Not with recipe."New value: +"A listed video model's slug the user asked for: the shoot's videos run on it. Not with recipe (name it in recipe.video_model)."
  7. 3 tool updates
    • Changedmcp_edit_brief2 fields changed
      • changedInput schema / $defs / BriefOutputSet / properties / upscale_factor / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "number"
        +  }
        +]
      • removedInput schema / $defs / BriefOutputSet / properties / upscale_factor / gt
        Removed value: -0
    • Changedpropose_brief2 fields changed
      • changedInput schema / $defs / OutputInput / properties / upscale_factor / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "number"
        +  }
        +]
      • removedInput schema / $defs / OutputInput / properties / upscale_factor / gt
        Removed value: -0
    • Changedupdate_brief2 fields changed
      • changedInput schema / $defs / OutputInput / properties / upscale_factor / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "number"
        +  }
        +]
      • removedInput schema / $defs / OutputInput / properties / upscale_factor / gt
        Removed value: -0
  8. 1 tool update
    • Changedconfirm_brief3 fields changed
      • changedInput schema / properties / expected_brief_revision / description
        Previous value: -"brief.revision of the latest result for this brief; any other runs nothing."New value: +"The board's brief_revision shown with this brief."
      • changedInput schema / properties / expected_total_credits / description
        Previous value: -"quote.total_credits of the latest result for this brief; any other total runs nothing and returns the new quote."New value: +"The quote's total_credits the user saw."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Retry key for one Generate, brief-{brief_id}-r{revision}: the same key never runs or charges twice."New value: +"Retry key for one Generate: never runs or charges twice."
  9. 2 tool updates
    • Changedpropose_brief11 fields changed
      • changedInput schema / $defs / OutputInput / properties / aspect_ratio / description
        Previous value: -"e.g. \"3:4\", \"1:1\", \"9:16\": one of the shoot image model's aspect_ratios."New value: +"Photo aspect ratio, e.g. \"3:4\"."
      • changedInput schema / $defs / OutputInput / properties / duration / description
        Previous value: -"Video steps only: the clip's length in seconds, one of the video model's durations (a longer one costs more)."New value: +"Video length in seconds."
      • changedInput schema / $defs / OutputInput / properties / generate_audio / description
        Previous value: -"Video steps only: true for a clip with sound (only a video model that supports audio), false for a silent one."New value: +"Whether videos have sound."
      • changedInput schema / $defs / OutputInput / properties / resolution / description
        Previous value: -"e.g. \"1K\", \"2K\", \"4K\": one of the shoot image model's resolutions (a higher one costs more)."New value: +"Photo resolution, e.g. \"2K\"."
      • changedInput schema / $defs / OutputInput / properties / upscale_factor / description
        Previous value: -"Upscale steps only: e.g. 2, 4: one of the upscale model's upscale_factors."New value: +"Upscale factor, e.g. 2."
      • changedInput schema / $defs / ProposedDirection / properties / prompt / description
        Previous value: -"Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id."New value: +"The direction in words, in English. Optional with an art_direction_id."
      • changedInput schema / properties / direction / description
        Previous value: -"What every shot of every look follows: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."New value: +"The brief's direction: prompt, art_direction_id (a saved art direction), or both."
      • changedInput schema / properties / image_model / description
        Previous value: -"A listed image model's slug the user asked for, or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."New value: +"The brief's image model (a slug from brief_inputs.ai_models). Not with recipe."
      • changedInput schema / properties / output / description
        Previous value: -"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the photos' aspect ratio and resolution, the videos' duration and generate_audio, the upscales' upscale_factor (only when the brief makes them). The brief's output is what is priced; a value its AI model does not offer is refused with the values it offers: pick one of them."New value: +"This brief's output settings; a field left out keeps the brief's."
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An automation from read_shoot_board's brief_inputs.automations that every look runs through as is (only when it matches what the user asked for), or a past brief's. Not with recipe. Omitted: the board's pinned one (brief_inputs.pinned_automation), else the board brief's."New value: +"An Automation for the looks (a workflow_id from brief_inputs.automations). Not with recipe."
      • changedInput schema / properties / video_model / description
        Previous value: -"A listed video model's slug the user asked for, or a past brief's ai_models.video: the shoot's videos run on it. Not with recipe (name it in recipe.video_model)."New value: +"The brief's video model (a slug from brief_inputs.ai_models). Not with recipe."
    • Changedupdate_brief11 fields changed
      • changedInput schema / $defs / OutputInput / properties / aspect_ratio / description
        Previous value: -"e.g. \"3:4\", \"1:1\", \"9:16\": one of the shoot image model's aspect_ratios."New value: +"Photo aspect ratio, e.g. \"3:4\"."
      • changedInput schema / $defs / OutputInput / properties / duration / description
        Previous value: -"Video steps only: the clip's length in seconds, one of the video model's durations (a longer one costs more)."New value: +"Video length in seconds."
      • changedInput schema / $defs / OutputInput / properties / generate_audio / description
        Previous value: -"Video steps only: true for a clip with sound (only a video model that supports audio), false for a silent one."New value: +"Whether videos have sound."
      • changedInput schema / $defs / OutputInput / properties / resolution / description
        Previous value: -"e.g. \"1K\", \"2K\", \"4K\": one of the shoot image model's resolutions (a higher one costs more)."New value: +"Photo resolution, e.g. \"2K\"."
      • changedInput schema / $defs / OutputInput / properties / upscale_factor / description
        Previous value: -"Upscale steps only: e.g. 2, 4: one of the upscale model's upscale_factors."New value: +"Upscale factor, e.g. 2."
      • changedInput schema / $defs / ProposedDirection / properties / prompt / description
        Previous value: -"Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id."New value: +"The direction in words, in English. Optional with an art_direction_id."
      • changedInput schema / properties / direction / description
        Previous value: -"A new Direction for the whole shoot, replacing the brief's (omit: kept): prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."New value: +"The brief's new direction, replacing its current one (omit: kept): prompt, art_direction_id (a saved art direction), or both."
      • changedInput schema / properties / image_model / description
        Previous value: -"A listed image model's slug the user asked for, or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."New value: +"The brief's image model (a slug from brief_inputs.ai_models). Not with recipe."
      • changedInput schema / properties / output / description
        Previous value: -"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the photos' aspect ratio and resolution, the videos' duration and generate_audio, the upscales' upscale_factor (only when the brief makes them). The brief's output is what is priced; a value its AI model does not offer is refused with the values it offers: pick one of them."New value: +"This brief's output settings; a field left out keeps the brief's."
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An automation from read_shoot_board's brief_inputs.automations (or a past brief's) for the looks below. Not with recipe."New value: +"An Automation for the looks (a workflow_id from brief_inputs.automations). Not with recipe."
      • changedInput schema / properties / video_model / description
        Previous value: -"A listed video model's slug the user asked for, or a past brief's ai_models.video: the shoot's videos run on it. Not with recipe (name it in recipe.video_model)."New value: +"The brief's video model (a slug from brief_inputs.ai_models). Not with recipe."
  10. 4 tool updates
    • Changedconfirm_brief3 fields changed
      • changedInput schema / properties / expected_brief_revision / description
        Previous value: -"The board's brief_revision shown with this brief."New value: +"brief.revision of the latest result for this brief; any other runs nothing."
      • changedInput schema / properties / expected_total_credits / description
        Previous value: -"The quote's total_credits the user saw."New value: +"quote.total_credits of the latest result for this brief; any other total runs nothing and returns the new quote."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Retry key for one Generate: the same key never runs or charges twice."New value: +"Retry key for one Generate, brief-{brief_id}-r{revision}: the same key never runs or charges twice."
    • Changedmodify_shoot_board1 field changed
      • removedInput schema / properties / items / items / additionalProperties
        Removed value: -false
    • Changedpropose_brief5 fields changed
      • changedInput schema / $defs / ProposedDirection / description
        Previous value: -"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs."New value: +"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither."
      • changedInput schema / properties / direction / description
        Previous value: -"What every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."New value: +"What every shot of every look follows: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
      • changedInput schema / properties / image_model / description
        Previous value: -"A listed image model's slug the user asked for (\"use GPT Image\"), or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."New value: +"A listed image model's slug the user asked for, or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."
      • changedInput schema / properties / output / description
        Previous value: -"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the Shoots' aspect ratio and resolution, the Video steps' duration and generate_audio, the Upscale steps' upscale_factor (only when its Automation has that step). The brief's output is what runs and is priced; a value the step's AI model does not offer is refused with the values it offers: pick one of them."New value: +"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the photos' aspect ratio and resolution, the videos' duration and generate_audio, the upscales' upscale_factor (only when the brief makes them). The brief's output is what is priced; a value its AI model does not offer is refused with the values it offers: pick one of them."
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"The Automation every look runs through as is: one from read_shoot_board's brief_inputs.automations that matches what the user asked for, or a past brief's (get_brief recipes[].workflow_id) to shoot it again; Uwear may save a copy as this shoot's automation draft. Not with recipe. Omitted: the board's pinned Automation (brief_inputs.pinned_automation), else the board brief's."New value: +"An automation from read_shoot_board's brief_inputs.automations that every look runs through as is (only when it matches what the user asked for), or a past brief's. Not with recipe. Omitted: the board's pinned one (brief_inputs.pinned_automation), else the board brief's."
    • Changedupdate_brief4 fields changed
      • changedInput schema / $defs / ProposedDirection / description
        Previous value: -"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs."New value: +"The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither."
      • changedInput schema / properties / image_model / description
        Previous value: -"A listed image model's slug the user asked for (\"use GPT Image\"), or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."New value: +"A listed image model's slug the user asked for, or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."
      • changedInput schema / properties / output / description
        Previous value: -"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the Shoots' aspect ratio and resolution, the Video steps' duration and generate_audio, the Upscale steps' upscale_factor (only when its Automation has that step). The brief's output is what runs and is priced; a value the step's AI model does not offer is refused with the values it offers: pick one of them."New value: +"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the photos' aspect ratio and resolution, the videos' duration and generate_audio, the upscales' upscale_factor (only when the brief makes them). The brief's output is what is priced; a value its AI model does not offer is refused with the values it offers: pick one of them."
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An automation from read_shoot_board's brief_inputs.automations (or a past brief's) for the looks below; Uwear may save a copy as this shoot's automation draft. Not with recipe. On a board that pins an Automation, only one this brief already runs."New value: +"An automation from read_shoot_board's brief_inputs.automations (or a past brief's) for the looks below. Not with recipe."
  11. 9 tool updates
    • Changedget_generation_results1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_generation_status1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedlist_automations
    • Addedlist_briefs
    • Changedmcp_edit_brief4 fields changed
      • changedInput schema / $defs / BriefOutputSet / description
        Previous value: -"Set this brief's output: a field left out is kept, null follows the board's default (the user's\npreferences) again. Every Shoot runs and is priced on it."New value: +"Set this brief's output: a field left out is kept, null follows the board's default (the user's\npreferences) again. Every step it is for (a Shoot, a Video, an Upscale) runs and is priced on it."
      • addedInput schema / $defs / BriefOutputSet / properties / duration
        Added value: +{
        +  "default": null,
        +  "description": "Video steps only: the clip's length in seconds, one of the video model's durations (a longer one costs more).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / $defs / BriefOutputSet / properties / generate_audio
        Added value: +{
        +  "default": null,
        +  "description": "Video steps only: true for a clip with sound (only a video model that supports audio), false for a silent one.",
        +  "type": "boolean"
        +}
      • addedInput schema / $defs / BriefOutputSet / properties / upscale_factor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "number"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Upscale steps only: e.g. 2, 4: one of the upscale model's upscale_factors.",
        +  "gt": 0
        +}
    • Changedmodify_shoot_board1 field changed
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
    • Changedpropose_brief11 fields changed
      • addedInput schema / $defs / OutputInput / properties / duration
        Added value: +{
        +  "default": null,
        +  "description": "Video steps only: the clip's length in seconds, one of the video model's durations (a longer one costs more).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / $defs / OutputInput / properties / generate_audio
        Added value: +{
        +  "default": null,
        +  "description": "Video steps only: true for a clip with sound (only a video model that supports audio), false for a silent one.",
        +  "type": "boolean"
        +}
      • addedInput schema / $defs / OutputInput / properties / upscale_factor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "number"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Upscale steps only: e.g. 2, 4: one of the upscale model's upscale_factors.",
        +  "gt": 0
        +}
      • removedInput schema / properties / direction / default
        Removed value: -null
      • changedInput schema / properties / direction / description
        Previous value: -"Required unless from_brief_id: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."New value: +"What every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
      • removedInput schema / properties / from_brief_id
        Removed value: -{
        -  "default": null,
        -  "description": "\"The same\" on other clothing: a brief_id that ran. The new brief keeps its automations as they are now, its direction, AI model and output (leave out direction, recipe and recipe_workflow_id); a model_id, location_id or reference_ids left out or empty is that brief's looks' in turn. If the user asked to run it, call confirm_brief in the same turn; otherwise do not.",
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • addedInput schema / properties / image_model
        Added value: +{
        +  "default": null,
        +  "description": "A listed image model's slug the user asked for (\"use GPT Image\"), or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model).",
        +  "type": "string"
        +}
      • changedInput schema / properties / output / description
        Previous value: -"The shoot's aspect ratio and resolution, only when the user asked for them; omit to keep the brief's (the user's preferences by default). The brief's output is what runs and is priced; a value the image model does not offer runs at the nearest one it does."New value: +"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the Shoots' aspect ratio and resolution, the Video steps' duration and generate_audio, the Upscale steps' upscale_factor (only when its Automation has that step). The brief's output is what runs and is priced; a value the step's AI model does not offer is refused with the values it offers: pick one of them."
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An automation from read_shoot_board's brief_inputs.automations that every look runs through as is (only when it matches what the user asked for). Not with recipe. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it."New value: +"The Automation every look runs through as is: one from read_shoot_board's brief_inputs.automations that matches what the user asked for, or a past brief's (get_brief recipes[].workflow_id) to shoot it again; Uwear may save a copy as this shoot's automation draft. Not with recipe. Omitted: the board's pinned Automation (brief_inputs.pinned_automation), else the board brief's."
      • addedInput schema / properties / video_model
        Added value: +{
        +  "default": null,
        +  "description": "A listed video model's slug the user asked for, or a past brief's ai_models.video: the shoot's videos run on it. Not with recipe (name it in recipe.video_model).",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "looks",
        -  "board_id"
        -]New value: +[
        +  "looks",
        +  "direction",
        +  "board_id"
        +]
    • Changedqueue_generation_result_qa1 field changed
      • changedInput schema / properties / generation_result_ids / description
        Previous value: -"Generation result IDs to QA. Queued or requeued QA costs 1 credit per result."New value: +"Generation result IDs to QA. QA is free."
    • Changedupdate_brief7 fields changed
      • addedInput schema / $defs / OutputInput / properties / duration
        Added value: +{
        +  "default": null,
        +  "description": "Video steps only: the clip's length in seconds, one of the video model's durations (a longer one costs more).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / $defs / OutputInput / properties / generate_audio
        Added value: +{
        +  "default": null,
        +  "description": "Video steps only: true for a clip with sound (only a video model that supports audio), false for a silent one.",
        +  "type": "boolean"
        +}
      • addedInput schema / $defs / OutputInput / properties / upscale_factor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "number"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Upscale steps only: e.g. 2, 4: one of the upscale model's upscale_factors.",
        +  "gt": 0
        +}
      • changedInput schema / properties / image_model / description
        Previous value: -"A listed image model's slug the user asked for (\"use GPT Image\"): the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."New value: +"A listed image model's slug the user asked for (\"use GPT Image\"), or a past brief's ai_models.image: the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model)."
      • changedInput schema / properties / output / description
        Previous value: -"The shoot's aspect ratio and resolution, only when the user asked for them; omit to keep the brief's (the user's preferences by default). The brief's output is what runs and is priced; a value the image model does not offer runs at the nearest one it does."New value: +"The shoot's output, only the fields the user asked for; omit to keep the brief's (the user's preferences by default): the Shoots' aspect ratio and resolution, the Video steps' duration and generate_audio, the Upscale steps' upscale_factor (only when its Automation has that step). The brief's output is what runs and is priced; a value the step's AI model does not offer is refused with the values it offers: pick one of them."
      • changedInput schema / properties / recipe_workflow_id / description
        Previous value: -"An automation from read_shoot_board's brief_inputs.automations for the looks below. Not with recipe."New value: +"An automation from read_shoot_board's brief_inputs.automations (or a past brief's) for the looks below; Uwear may save a copy as this shoot's automation draft. Not with recipe. On a board that pins an Automation, only one this brief already runs."
      • changedInput schema / properties / video_model / description
        Previous value: -"A listed video model's slug the user asked for: the shoot's videos run on it. Not with recipe (name it in recipe.video_model)."New value: +"A listed video model's slug the user asked for, or a past brief's ai_models.video: the shoot's videos run on it. Not with recipe (name it in recipe.video_model)."
  12. 7 tool updates
    • Changedadd_chat_photos_to_board2 fields changed
      • addedInput schema / properties / sides
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Garment photos only, when you can see which side one shows: {image_file_N: back} for a photo of the garment's back. A photo left out is its garment's front.",
        +  "properties": {
        +    "image_file_1": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_10": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_2": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_3": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_4": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_5": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_6": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_7": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_8": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    },
        +    "image_file_9": {
        +      "enum": [
        +        "front",
        +        "back"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / upload_handles / description
        Previous value: -"Only the upload_handle values a previous call of this tool returned in upload_needed, after running their commands: {image_file_N: upload_handle}. Never the attachments themselves: those go in image_file_N."New value: +"Only after running a previous call's upload_command: {image_file_N: the sha256 it printed for that photo}. Never the attachments themselves: those go in image_file_N."
    • Changedconfirm_brief1 field changed
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Retry key for one Generate tap: never runs or charges twice."New value: +"Retry key for one Generate: the same key never runs or charges twice."
    • Changedmcp_commit_intake1 field changed
      • addedInput schema / properties / items / items / properties / side
        Added value: +{
        +  "description": "A new garment only: the side its photo shows (default front; back: it is also its back photo)",
        +  "enum": [
        +    "front",
        +    "back"
        +  ],
        +  "type": "string"
        +}
    • Changedmcp_edit_brief3 fields changed
      • addedInput schema / $defs / BriefOutputSet
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Set this brief's output: a field left out is kept, null follows the board's default (the user's\npreferences) again. Every Shoot runs and is priced on it.",
        +  "properties": {
        +    "aspect_ratio": {
        +      "default": null,
        +      "description": "e.g. \"3:4\", \"1:1\", \"9:16\": one of the shoot image model's aspect_ratios.",
        +      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        +      "type": "string"
        +    },
        +    "op": {
        +      "const": "brief.output",
        +      "type": "string"
        +    },
        +    "resolution": {
        +      "default": null,
        +      "description": "e.g. \"1K\", \"2K\", \"4K\": one of the shoot image model's resolutions (a higher one costs more).",
        +      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "op"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / ops / items / discriminator / mapping / brief.output
        Added value: +"#/$defs/BriefOutputSet"
      • changedInput schema / properties / ops / items / oneOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/LookAdd"
        -  },
        -  {
        -    "$ref": "#/$defs/LookRemove"
        -  },
        -  {
        -    "$ref": "#/$defs/LookSet"
        -  },
        -  {
        -    "$ref": "#/$defs/LookAssignRecipe"
        -  },
        -  {
        -    "$ref": "#/$defs/BriefDirectionSet"
        -  },
        -  {
        -    "$ref": "#/$defs/BriefModelsSet"
        -  },
        -  {
        -    "$ref": "#/$defs/BriefRefresh"
        -  },
        -  {
        -    "$ref": "#/$defs/BriefRestore"
        -  },
        -  {
        -    "$ref": "#/$defs/BriefDiscard"
        -  }
        -]New value: +[
        +  {
        +    "$ref": "#/$defs/LookAdd"
        +  },
        +  {
        +    "$ref": "#/$defs/LookRemove"
        +  },
        +  {
        +    "$ref": "#/$defs/LookSet"
        +  },
        +  {
        +    "$ref": "#/$defs/LookAssignRecipe"
        +  },
        +  {
        +    "$ref": "#/$defs/BriefDirectionSet"
        +  },
        +  {
        +    "$ref": "#/$defs/BriefModelsSet"
        +  },
        +  {
        +    "$ref": "#/$defs/BriefOutputSet"
        +  },
        +  {
        +    "$ref": "#/$defs/BriefRefresh"
        +  },
        +  {
        +    "$ref": "#/$defs/BriefRestore"
        +  },
        +  {
        +    "$ref": "#/$defs/BriefDiscard"
        +  }
        +]
    • Changedpropose_brief6 fields changed
      • addedInput schema / $defs / OutputInput
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "This brief's output; a field left out is kept, null follows the board's default again.",
        +  "properties": {
        +    "aspect_ratio": {
        +      "default": null,
        +      "description": "e.g. \"3:4\", \"1:1\", \"9:16\": one of the shoot image model's aspect_ratios.",
        +      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        +      "type": "string"
        +    },
        +    "resolution": {
        +      "default": null,
        +      "description": "e.g. \"1K\", \"2K\", \"4K\": one of the shoot image model's resolutions (a higher one costs more).",
        +      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / direction / default
        Added value: +null
      • changedInput schema / properties / direction / description
        Previous value: -"Required: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."New value: +"Required unless from_brief_id: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
      • addedInput schema / properties / from_brief_id
        Added value: +{
        +  "default": null,
        +  "description": "\"The same\" on other clothing: a brief_id that ran. The new brief keeps its automations as they are now, its direction, AI model and output (leave out direction, recipe and recipe_workflow_id); a model_id, location_id or reference_ids left out or empty is that brief's looks' in turn. If the user asked to run it, call confirm_brief in the same turn; otherwise do not.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / output
        Added value: +{
        +  "$ref": "#/$defs/OutputInput",
        +  "default": null,
        +  "description": "The shoot's aspect ratio and resolution, only when the user asked for them; omit to keep the brief's (the user's preferences by default). The brief's output is what runs and is priced; a value the image model does not offer runs at the nearest one it does."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "looks",
        -  "direction",
        -  "board_id"
        -]New value: +[
        +  "looks",
        +  "board_id"
        +]
    • Addedset_garment_side
    • Changedupdate_brief2 fields changed
      • addedInput schema / $defs / OutputInput
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "This brief's output; a field left out is kept, null follows the board's default again.",
        +  "properties": {
        +    "aspect_ratio": {
        +      "default": null,
        +      "description": "e.g. \"3:4\", \"1:1\", \"9:16\": one of the shoot image model's aspect_ratios.",
        +      "pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
        +      "type": "string"
        +    },
        +    "resolution": {
        +      "default": null,
        +      "description": "e.g. \"1K\", \"2K\", \"4K\": one of the shoot image model's resolutions (a higher one costs more).",
        +      "pattern": "^\\d{1,2}(\\.\\d)?K$",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / output
        Added value: +{
        +  "$ref": "#/$defs/OutputInput",
        +  "default": null,
        +  "description": "The shoot's aspect ratio and resolution, only when the user asked for them; omit to keep the brief's (the user's preferences by default). The brief's output is what runs and is priced; a value the image model does not offer runs at the nearest one it does."
        +}
  13. 3 tool updates
    • Changedmcp_edit_brief1 field changed
      • changedInput schema / $defs / BriefDirectionSet / description
        Previous value: -"Set the shoot's Direction, the same for every look: the words every shot follows and/or an art\ndirection (the one left out: none; both left out: Uwear's default look). Never changes an\nautomation."New value: +"Set the shoot's Direction, the same for every look: the words every shot follows and/or an art\ndirection (the one left out: none; both left out: nothing directs the shoot and Generate waits for\none, ``slots.UNDIRECTED``). Never changes an automation."
    • Changedpropose_brief4 fields changed
      • addedInput schema / $defs / ProposedDirection
        Added value: +{
        +  "additionalProperties": false,
        +  "anyOf": [
        +    {
        +      "required": [
        +        "prompt"
        +      ]
        +    },
        +    {
        +      "required": [
        +        "art_direction_id"
        +      ]
        +    }
        +  ],
        +  "description": "The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs.",
        +  "properties": {
        +    "art_direction_id": {
        +      "default": null,
        +      "description": "A saved art direction (a library id, or the id save_art_direction returns).",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "prompt": {
        +      "default": null,
        +      "description": "Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id.",
        +      "maxLength": 2000,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / art_direction_id
        Removed value: -{
        -  "default": null,
        -  "description": "The shoot's one art direction (a library id, or the id save_art_direction returns); omit it to keep the current one.",
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • addedInput schema / properties / direction
        Added value: +{
        +  "$ref": "#/$defs/ProposedDirection",
        +  "description": "Required: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "looks",
        -  "board_id"
        -]New value: +[
        +  "looks",
        +  "direction",
        +  "board_id"
        +]
    • Changedupdate_brief3 fields changed
      • addedInput schema / $defs / ProposedDirection
        Added value: +{
        +  "additionalProperties": false,
        +  "anyOf": [
        +    {
        +      "required": [
        +        "prompt"
        +      ]
        +    },
        +    {
        +      "required": [
        +        "art_direction_id"
        +      ]
        +    }
        +  ],
        +  "description": "The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither\n(``NO_DIRECTION``), so every brief says what runs.",
        +  "properties": {
        +    "art_direction_id": {
        +      "default": null,
        +      "description": "A saved art direction (a library id, or the id save_art_direction returns).",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "prompt": {
        +      "default": null,
        +      "description": "Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id.",
        +      "maxLength": 2000,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / art_direction_id
        Removed value: -{
        -  "default": null,
        -  "description": "A new art direction for the whole shoot (omit: kept). Changing it never changes the automation. For a new look and feel, call save_art_direction first and pass its id.",
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • addedInput schema / properties / direction
        Added value: +{
        +  "$ref": "#/$defs/ProposedDirection",
        +  "default": null,
        +  "description": "A new Direction for the whole shoot, replacing the brief's (omit: kept): prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
        +}
  14. 86 tool updates
    • Removedadd_avatar_reference
    • Addedadd_chat_photos_to_board
    • Removedapply_backdrop
    • Removedauthor_art_direction
    • Removedbuild_avatar_prompt
    • Changedconfirm_brief11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / description
        Removed value: -"Confirm and optionally execute an immutable canonical-command brief."
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • removedInput schema / properties / brief_id / description
        Removed value: -"ID of the persisted brief to confirm"
      • removedInput schema / properties / brief_id / exclusiveMinimum
        Removed value: -0
      • addedInput schema / properties / brief_id / minimum
        Added value: +1
      • removedInput schema / properties / execute
        Removed value: -{
        -  "default": true,
        -  "description": "Execute the brief immediately after confirming. Defaults true because MCP 'confirm the brief' means approve and run. Set false only when the user explicitly wants to save approval without starting generation.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / expected_brief_revision
        Added value: +{
        +  "description": "The board's brief_revision shown with this brief.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / expected_total_credits
        Added value: +{
        +  "default": null,
        +  "description": "The quote's total_credits the user saw.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / idempotency_key
        Added value: +{
        +  "description": "Retry key for one Generate tap: never runs or charges twice.",
        +  "maxLength": 64,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "brief_id"
        -]New value: +[
        +  "brief_id",
        +  "expected_brief_revision",
        +  "idempotency_key",
        +  "board_id"
        +]
    • Removedcopy_template_to_generate_node_config
    • Removedcreate_art_direction
    • Removedcreate_avatar_from_references
    • Removedcreate_outfit_from_garment_ids
    • Removeddelete_template
    • Removedduplicate_art_direction
    • Removedestimate_cost
    • Removedfinish_local_garment_upload
    • Removedgenerate_avatar
    • Removedget_art_direction_authoring_job
    • Changedget_brief7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / description
        Removed value: -"Input schema for loading a persisted brief for UI rehydration."
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • removedInput schema / properties / brief_id / description
        Removed value: -"Real persisted brief ID to load unchanged. Do not use 0, guessed IDs, or this tool for editing a visible brief."
      • removedInput schema / properties / brief_id / exclusiveMinimum
        Removed value: -0
      • addedInput schema / properties / brief_id / minimum
        Added value: +1
      • changedInput schema / required
        Previous value: -[
        -  "brief_id"
        -]New value: +[
        +  "brief_id",
        +  "board_id"
        +]
    • Removedget_connection_identity
    • Removedget_garment
    • Changedget_generation_results1 field changed
      • addedInput schema / properties / include_snapshot
        Added value: +{
        +  "default": false,
        +  "description": "Include full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery.",
        +  "type": "boolean"
        +}
    • Changedget_generation_status2 fields changed
      • changedInput schema / properties / generation_id / description
        Previous value: -"The generation ID to check. Returns raw payload, generation_setting, avatar_id, model_id, model_slug, and use_case. UI 'Gemini Pro' maps to model_slug nano-banana-pro or nano_banana_pro_clothing."New value: +"The generation ID to check. Returns compact status, avatar_id, model_id, model_slug, and use_case. UI 'Gemini Pro' maps to model_slug nano-banana-pro or nano_banana_pro_clothing."
      • addedInput schema / properties / include_snapshot
        Added value: +{
        +  "default": false,
        +  "description": "Include full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery.",
        +  "type": "boolean"
        +}
    • Removedget_items_by_tag
    • Removedget_location
    • Removedget_outfit
    • Removedget_template
    • Removediterate_art_direction
    • Changedlist_garments1 field changed
      • changedInput schema / properties / include_uncategorized / description
        Previous value: -"Also include garments with no category when category and/or body_zone filters are used."New value: +"Also include garments with no category when category and/or body_zone filters are used. If the first result has uncategorized_count > 0 and too few matches, call again with true and inspect those garments."
    • Removedlist_models
    • Changedmcp_add_context9 fields changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • addedInput schema / properties / board_version
        Added value: +{
        +  "description": "Pass 2 to receive board v2 state, including the board's output settings",
        +  "enum": [
        +    2
        +  ],
        +  "type": "integer"
        +}
      • addedInput schema / properties / context_items / items / properties / description
        Added value: +{
        +  "maxLength": 500,
        +  "type": "string"
        +}
      • addedInput schema / properties / context_items / items / properties / gender
        Added value: +{
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / context_items / items / properties / intake
        Added value: +{
        +  "description": "Board v2: intake state of an item still being sorted; absent means ready",
        +  "properties": {
        +    "candidates": {
        +      "items": {
        +        "enum": [
        +          "clothing",
        +          "models",
        +          "outfits",
        +          "generations",
        +          "files",
        +          "locations",
        +          "art_directions",
        +          "automations"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "source_hash": {
        +      "description": "sha256 hex of the source file",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "enum": [
        +        "sorting",
        +        "needs_answer",
        +        "ready"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / context_items / items / properties / meta
        Added value: +{
        +  "description": "Short display facts, e.g. ['female', 'ID 7']",
        +  "items": {
        +    "type": [
        +      "string",
        +      "number",
        +      "boolean"
        +    ]
        +  },
        +  "maxItems": 8,
        +  "type": "array"
        +}
      • changedInput schema / properties / context_items / items / properties / type / enum
        Previous value: -[
        -  "clothing",
        -  "models",
        -  "outfits",
        -  "generations",
        -  "files",
        -  "locations"
        -]New value: +[
        +  "clothing",
        +  "models",
        +  "outfits",
        +  "generations",
        +  "files",
        +  "locations",
        +  "art_directions",
        +  "automations"
        +]
      • addedInput schema / properties / expected_revision
        Added value: +{
        +  "description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "context_items"
        -]New value: +[
        +  "context_items",
        +  "board_id",
        +  "expected_revision"
        +]
    • Addedmcp_add_garment_view
    • Addedmcp_brief_list
    • Addedmcp_brief_runs
    • Changedmcp_clear_context5 fields changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • addedInput schema / properties / board_version
        Added value: +{
        +  "description": "Pass 2 to receive board v2 state, including the board's output settings",
        +  "enum": [
        +    2
        +  ],
        +  "type": "integer"
        +}
      • addedInput schema / properties / expected_revision
        Added value: +{
        +  "description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "clothing",
        -  "models",
        -  "outfits",
        -  "generations",
        -  "file",
        -  "files",
        -  "location",
        -  "locations"
        -]New value: +[
        +  "clothing",
        +  "models",
        +  "outfits",
        +  "generations",
        +  "file",
        +  "files",
        +  "location",
        +  "locations",
        +  "art_direction",
        +  "art_directions",
        +  "automation",
        +  "automations"
        +]
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "board_id",
        +  "expected_revision"
        +]
    • Addedmcp_commit_intake
    • Addedmcp_delete_generation_results
    • Addedmcp_edit_brief
    • Addedmcp_extract_video_frame
    • Changedmcp_get_context3 fields changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • addedInput schema / properties / board_version
        Added value: +{
        +  "description": "Pass 2 to receive board v2 state, including the board's output settings",
        +  "enum": [
        +    2
        +  ],
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "board_id"
        +]
    • Addedmcp_intake_files
    • Changedmcp_list_files2 fields changed
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Optional search over file names and tags (the Shoot Board's References tab)",
        +  "type": "string"
        +}
      • addedInput schema / properties / tag_ids
        Added value: +{
        +  "description": "Optional: only files with any of these tags",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
    • Addedmcp_list_model_catalog
    • Addedmcp_read_generation
    • Addedmcp_read_generation_result
    • Addedmcp_recipe_copy
    • Addedmcp_recipe_history
    • Addedmcp_recipe_list
    • Addedmcp_recipe_open
    • Addedmcp_recipe_preflight
    • Addedmcp_recipe_save_draft
    • Addedmcp_reclassify_board_item
    • Changedmcp_replace_context15 fields changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • addedInput schema / properties / board_version
        Added value: +{
        +  "description": "Pass 2 to receive board v2 state, including the board's output settings",
        +  "enum": [
        +    2
        +  ],
        +  "type": "integer"
        +}
      • addedInput schema / properties / context_items / items / properties / description
        Added value: +{
        +  "maxLength": 500,
        +  "type": "string"
        +}
      • addedInput schema / properties / context_items / items / properties / gender
        Added value: +{
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / context_items / items / properties / intake
        Added value: +{
        +  "description": "Board v2: intake state of an item still being sorted; absent means ready",
        +  "properties": {
        +    "candidates": {
        +      "items": {
        +        "enum": [
        +          "clothing",
        +          "models",
        +          "outfits",
        +          "generations",
        +          "files",
        +          "locations",
        +          "art_directions",
        +          "automations"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "source_hash": {
        +      "description": "sha256 hex of the source file",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "enum": [
        +        "sorting",
        +        "needs_answer",
        +        "ready"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / context_items / items / properties / meta
        Added value: +{
        +  "description": "Short display facts, e.g. ['female', 'ID 7']",
        +  "items": {
        +    "type": [
        +      "string",
        +      "number",
        +      "boolean"
        +    ]
        +  },
        +  "maxItems": 8,
        +  "type": "array"
        +}
      • changedInput schema / properties / context_items / items / properties / type / enum
        Previous value: -[
        -  "clothing",
        -  "models",
        -  "outfits",
        -  "generations",
        -  "files",
        -  "locations"
        -]New value: +[
        +  "clothing",
        +  "models",
        +  "outfits",
        +  "generations",
        +  "files",
        +  "locations",
        +  "art_directions",
        +  "automations"
        +]
      • addedInput schema / properties / context_state / properties / items / items / properties / description
        Added value: +{
        +  "maxLength": 500,
        +  "type": "string"
        +}
      • addedInput schema / properties / context_state / properties / items / items / properties / gender
        Added value: +{
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / context_state / properties / items / items / properties / intake
        Added value: +{
        +  "description": "Board v2: intake state of an item still being sorted; absent means ready",
        +  "properties": {
        +    "candidates": {
        +      "items": {
        +        "enum": [
        +          "clothing",
        +          "models",
        +          "outfits",
        +          "generations",
        +          "files",
        +          "locations",
        +          "art_directions",
        +          "automations"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "source_hash": {
        +      "description": "sha256 hex of the source file",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "enum": [
        +        "sorting",
        +        "needs_answer",
        +        "ready"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / context_state / properties / items / items / properties / meta
        Added value: +{
        +  "description": "Short display facts, e.g. ['female', 'ID 7']",
        +  "items": {
        +    "type": [
        +      "string",
        +      "number",
        +      "boolean"
        +    ]
        +  },
        +  "maxItems": 8,
        +  "type": "array"
        +}
      • changedInput schema / properties / context_state / properties / items / items / properties / type / enum
        Previous value: -[
        -  "clothing",
        -  "models",
        -  "outfits",
        -  "generations",
        -  "files",
        -  "locations"
        -]New value: +[
        +  "clothing",
        +  "models",
        +  "outfits",
        +  "generations",
        +  "files",
        +  "locations",
        +  "art_directions",
        +  "automations"
        +]
      • addedInput schema / properties / context_state / properties / output
        Added value: +{
        +  "description": "Board v2: the shoot's output settings; omitted keys keep their current value",
        +  "properties": {
        +    "aspect_ratio": {
        +      "description": "e.g. \"3:4\"",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "model_slug": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "num_images": {
        +      "minimum": 1,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "resolution": {
        +      "description": "e.g. \"2K\"",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / expected_revision
        Added value: +{
        +  "description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "board_id",
        +  "expected_revision"
        +]
    • Addedmcp_review_generation_results
    • Addedmcp_set_generation_result_tags
    • Addedmcp_update_tag
    • Addedmcp_upload_intake_photo
    • Addedmcp_workflow_assets
    • Addedmcp_workflow_cameras
    • Addedmcp_workflow_contract
    • Addedmcp_workflow_gallery
    • Addedmcp_workflow_garment_categories
    • Addedmcp_workflow_tags
    • Addedmodify_shoot_board
    • Removedprepare_local_garment_upload
    • Changedpropose_brief19 fields changed
      • removedInput schema / $defs / GenerationCommand
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "Versioned command shared by REST, Agent, MCP, jobs, and briefs.\n\nThe nested ``input`` is intentionally the API's public intent model. A\nfield added there therefore appears automatically in this command's JSON\nschema, serialization, and persisted brief representation.",
        -  "properties": {
        -    "input": {
        -      "$ref": "#/$defs/GenerationIntent"
        -    },
        -    "schema_version": {
        -      "const": 2,
        -      "type": "integer"
        -    },
        -    "source": {
        -      "default": null,
        -      "discriminator": {
        -        "propertyName": "type"
        -      },
        -      "oneOf": [
        -        {
        -          "properties": {
        -            "generation_result_id": {
        -              "minimum": 1,
        -              "type": "integer"
        -            },
        -            "type": {
        -              "const": "generation_result",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "generation_result_id"
        -          ],
        -          "type": "object"
        -        },
        -        {
        -          "properties": {
        -            "type": {
        -              "const": "uploaded_file",
        -              "type": "string"
        -            },
        -            "uploaded_file_id": {
        -              "minimum": 1,
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "uploaded_file_id"
        -          ],
        -          "type": "object"
        -        },
        -        {
        -          "properties": {
        -            "image_url": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "type": {
        -              "const": "public_url",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "image_url"
        -          ],
        -          "type": "object"
        -        },
        -        {
        -          "description": "Durable identity for a source produced by an earlier pipeline step.",
        -          "properties": {
        -            "output_index": {
        -              "minimum": 0,
        -              "type": "integer"
        -            },
        -            "post_claim_reference": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "step_index": {
        -              "minimum": 0,
        -              "type": "integer"
        -            },
        -            "type": {
        -              "const": "pipeline_step",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "post_claim_reference",
        -            "step_index",
        -            "output_index"
        -          ],
        -          "type": "object"
        -        }
        -      ],
        -      "properties": {
        -        "generation_result_id": {
        -          "minimum": 1,
        -          "type": "integer"
        -        },
        -        "image_url": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "output_index": {
        -          "minimum": 0,
        -          "type": "integer"
        -        },
        -        "post_claim_reference": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "step_index": {
        -          "minimum": 0,
        -          "type": "integer"
        -        },
        -        "type": {
        -          "enum": [
        -            "generation_result",
        -            "uploaded_file",
        -            "public_url",
        -            "pipeline_step"
        -          ],
        -          "type": "string"
        -        },
        -        "uploaded_file_id": {
        -          "minimum": 1,
        -          "type": "integer"
        -        }
        -      },
        -      "type": "object"
        -    }
        -  },
        -  "required": [
        -    "schema_version",
        -    "input"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / GenerationIntent
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "Caller-owned model-generation intent shared by every public adapter.\n\nAuthentication-derived identity deliberately does not belong here. REST,\nAgent, MCP, batch, and integrations all submit this exact contract; the\ncommand planner combines it with server-owned execution context later. MCP omits webhook callback configuration, which remains API-only.",
        -  "properties": {
        -    "alignment": {
        -      "default": null,
        -      "enum": [
        -        "left",
        -        "center",
        -        "right",
        -        "top",
        -        "bottom"
        -      ],
        -      "type": "string"
        -    },
        -    "art_direction_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "aspect_ratio": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "audio_ref_urls": {
        -      "default": null,
        -      "description": "Public audio URLs supplied as model references. Only models that declare a positive max_reference_audio capability accept them.",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "avatar_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "backdrop_mode": {
        -      "default": null,
        -      "description": "Canonical Backdrop mode for new generation requests.",
        -      "enum": [
        -        "transparent",
        -        "solid",
        -        "image"
        -      ],
        -      "type": "string"
        -    },
        -    "background_image_url": {
        -      "default": null,
        -      "description": "Canonical Backdrop background image URL.",
        -      "type": "string"
        -    },
        -    "camera": {
        -      "default": "",
        -      "type": "string"
        -    },
        -    "camera_edit_id": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "children": {
        -      "default": null,
        -      "description": "Nested generation requests to run after this generation completes. Every child must provide model_slug.",
        -      "items": {
        -        "$ref": "#/$defs/GenerationIntent"
        -      },
        -      "type": "array"
        -    },
        -    "clothing_item_ids": {
        -      "default": null,
        -      "items": {
        -        "type": "integer"
        -      },
        -      "type": "array"
        -    },
        -    "color_hex": {
        -      "default": null,
        -      "description": "Canonical Backdrop solid or fallback color.",
        -      "type": "string"
        -    },
        -    "do_qa": {
        -      "default": null,
        -      "description": "When true, enqueue QA after result storage and gate acceptance on QA.",
        -      "type": "boolean"
        -    },
        -    "duration": {
        -      "default": null,
        -      "type": "integer"
        -    },
        -    "enhance_user_prompt": {
        -      "default": null,
        -      "deprecated": true,
        -      "description": "Deprecated REST compatibility alias. true is normalized at command preparation to the legacy prompt-enhancement ArtDirection ID; false has no effect. Prefer art_direction_id. Removal requires 90 consecutive days without production use; usage was last observed on 2026-07-26.",
        -      "type": "boolean",
        -      "ui": {
        -        "editable": false,
        -        "visibility": [
        -          "rest"
        -        ]
        -      }
        -    },
        -    "extra_params": {
        -      "additionalProperties": true,
        -      "default": null,
        -      "description": "Model-specific extension parameters. Backdrop controls are not accepted here; use backdrop_mode, color_hex, and background_image_url.",
        -      "type": "object"
        -    },
        -    "generate_audio": {
        -      "default": false,
        -      "description": "Include audio in the delivered video. False delivers a file with no audio stream; fixed-audio providers are muted after generation, without reducing native-generation credits.",
        -      "type": "boolean"
        -    },
        -    "generation_result_parent_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "image_url": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "img_ref_urls": {
        -      "default": null,
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "last_frame_attachment": {
        -      "$ref": "#/$defs/GenerationReferenceAttachmentInput",
        -      "default": null,
        -      "description": "Durable reference to the photo the clip closes on, resolved to a URL at dispatch. The durable form of last_frame_url, for callers that hold an id rather than a link — a workflow wiring a step's output into a later step's last frame cannot know the URL when the graph is authored."
        -    },
        -    "last_frame_url": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "location_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "max_qa_retries": {
        -      "default": null,
        -      "description": "Maximum QA-triggered retry generations after the initial attempt.",
        -      "maximum": 5,
        -      "minimum": 0,
        -      "type": "integer"
        -    },
        -    "model_slug": {
        -      "description": "Active AI model slug. Required for every generation command.",
        -      "minLength": 1,
        -      "type": "string"
        -    },
        -    "negative_prompt": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "num_images": {
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "outfit_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "prompt": {
        -      "default": "",
        -      "description": "Scene brief for this shot: setting, lighting, mood, camera/framing, pose — 2-5 compact positive sentences. Without art_direction_id this prompt reaches the image model as-is and is the entire creative direction: carry the shoot's world, lighting, and atmosphere here. With art_direction_id, the saved direction carries reusable style; add only per-shot intent. Supplied garment/avatar/reference images carry product appearance: refer to them semantically ('the supplied jacket'), never by image number — the backend appends the numbered reference map at dispatch. Styling intent (fit, tuck, drape, opening state) belongs here when it matters; re-described garment construction, product-fidelity warnings, and negative 'do not ...' blocks do not — with good references they degrade output. Say what to show, not what to avoid. Video commands: describe motion and camera movement. Video does not inherit the source generation's ArtDirection; omit art_direction_id to use only the source frame and this prompt. May be empty for upscale; generation routes validate separately.",
        -      "type": "string"
        -    },
        -    "reference_attachments": {
        -      "default": null,
        -      "items": {
        -        "$ref": "#/$defs/GenerationReferenceAttachmentInput"
        -      },
        -      "type": "array"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Model-defined output resolution. Legacy image tiers are normalized to 1K, 2K, or 4K; video and exact pixel presets retain their model-defined casing.",
        -      "maxLength": 32,
        -      "minLength": 2,
        -      "type": "string"
        -    },
        -    "seed": {
        -      "default": null,
        -      "type": "integer"
        -    },
        -    "tag_ids": {
        -      "default": null,
        -      "items": {
        -        "type": "integer"
        -      },
        -      "type": "array"
        -    },
        -    "target_resolution": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "upscale_factor": {
        -      "default": null,
        -      "type": "number"
        -    },
        -    "use_case": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "video_ref_urls": {
        -      "default": null,
        -      "description": "Public video URLs supplied as model references. Only models that declare a positive max_reference_videos capability accept them.",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "num_images",
        -    "model_slug"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / GenerationReferenceAttachmentInput
        Removed value: -{
        -  "properties": {
        -    "avatar_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "clothing_item_asset_id": {
        -      "default": null,
        -      "description": "Exact durable clothing asset reference. Provide with clothing_item_id; preferred over the deprecated side selector for repeated detail assets.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "clothing_item_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "generation_result_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "location_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "outfit_id": {
        -      "default": null,
        -      "description": "Outfit reference. The generation uses the front image of every garment in the outfit, as if each were attached as clothing_item.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "side": {
        -      "default": null,
        -      "enum": [
        -        "front",
        -        "back"
        -      ],
        -      "type": "string"
        -    },
        -    "type": {
        -      "enum": [
        -        "uploaded_file",
        -        "generation_result",
        -        "location",
        -        "avatar",
        -        "clothing_item",
        -        "outfit"
        -      ],
        -      "type": "string"
        -    },
        -    "uploaded_file_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    }
        -  },
        -  "required": [
        -    "type"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / $defs / LookInput
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One look: one outfit worn in the shoot, with who wears it and where.",
        +  "properties": {
        +    "clothing_ids": {
        +      "description": "Clothing worn together.",
        +      "items": {
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "maxItems": 4,
        +      "type": "array"
        +    },
        +    "key": {
        +      "default": null,
        +      "description": "update_brief: an existing look's key, to keep that look.",
        +      "pattern": "^look_\\d{2,3}$",
        +      "type": "string"
        +    },
        +    "label": {
        +      "default": "",
        +      "description": "The look's name, e.g. 'Linen summer set'.",
        +      "maxLength": 120,
        +      "type": "string"
        +    },
        +    "location_id": {
        +      "default": null,
        +      "description": "Where the look is shot.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "model_id": {
        +      "default": null,
        +      "description": "The Model who wears the look.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "outfit_id": {
        +      "default": null,
        +      "description": "A saved outfit.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "reference_ids": {
        +      "description": "Reference photos (uploaded file ids from the board's References).",
        +      "items": {
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "maxItems": 50,
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / $defs / RecipeSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The recipe a demand asks for: its shots and their steps.",
        +  "properties": {
        +    "image_model": {
        +      "default": null,
        +      "description": "A listed image model's slug, only when the user named it.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        +      "maxLength": 80,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "shots": {
        +      "description": "One shot per view, in order.",
        +      "items": {
        +        "$ref": "#/$defs/ShotSpec"
        +      },
        +      "maxItems": 8,
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "video_model": {
        +      "default": null,
        +      "description": "A listed video model's slug, only when the user named it.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "shots"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / ShotSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One photo of each look, from one camera.",
        +  "properties": {
        +    "camera": {
        +      "description": "The view, from the camera list.",
        +      "enum": [
        +        "auto",
        +        "full_body_front",
        +        "full_body_back",
        +        "full_body_side",
        +        "upper_body_front",
        +        "upper_body_back",
        +        "upper_body_side",
        +        "lower_body_front",
        +        "lower_body_back",
        +        "lower_body_side",
        +        "clothing_detail_front",
        +        "clothing_detail_back",
        +        "clothing_detail_side"
        +      ],
        +      "type": "string"
        +    },
        +    "then": {
        +      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        +      "items": {
        +        "$ref": "#/$defs/StepSpec"
        +      },
        +      "maxItems": 4,
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "camera"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / StepSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One step on a shot's photo (or on the step before it).",
        +  "properties": {
        +    "camera_edit_id": {
        +      "default": null,
        +      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        +      "enum": [
        +        "camera_edit",
        +        "edit",
        +        "upscale",
        +        "video",
        +        "remove_background"
        +      ],
        +      "type": "string"
        +    },
        +    "prompt": {
        +      "default": null,
        +      "description": "edit: the change; video: the motion (optional).",
        +      "maxLength": 1000,
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / description
        Removed value: -"Propose a brief made exclusively of canonical generation commands."
      • addedInput schema / properties / art_direction_id
        Added value: +{
        +  "default": null,
        +  "description": "The shoot's one art direction (a library id, or the id save_art_direction returns); omit it to keep the current one.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • removedInput schema / properties / commands
        Removed value: -{
        -  "description": "Canonical generation commands. Each command contains the MCP-safe GenerationIntent fields and a durable source reference. Write each input.prompt as a compact positive scene description (setting, lighting, mood, camera, pose — for video, motion and camera movement); without art_direction_id the prompt is the entire creative direction, so give it the full scene. The attached garment/avatar/reference images carry product appearance, so never pad prompts with restated garment construction details, product-fidelity warnings, or negative 'do not' instruction blocks; styling intent (fit, tuck, drape) is fine. For video commands, attach available full back or side garment assets that the camera may reveal through input.reference_attachments when capacity permits. Do not combine reference_attachments with img_ref_urls; uploaded garment assets are not attached automatically. Webhook callback configuration is API-only.",
        -  "items": {
        -    "$ref": "#/$defs/GenerationCommand"
        -  },
        -  "minItems": 1,
        -  "type": "array"
        -}
      • removedInput schema / properties / creative_context
        Removed value: -{
        -  "default": null,
        -  "description": "Required for photoshoot proposals and brief rewrites. Summarize the shoot-level creative approach that guided garment combos, avatars, prompts, and pipeline steps. By default prefer one cohesive art direction across the photoshoot, e.g. 'urban summer editorial', 'standard grey e-commerce', or 'sporty studio catalog'. Per-look prompts may differ for garment details, pose, framing, or avatar, but should feel part of the same shoot unless the user explicitly asks for multiple art directions, split concepts, A/B routes, or varied campaign directions. The assistant should explain this art direction to the user after proposing the brief and ask if they want changes.",
        -  "type": "string"
        -}
      • removedInput schema / properties / execute_immediately
        Removed value: -{
        -  "default": false,
        -  "description": "Set true only when the user explicitly asks to prepare/create/generate/run the photoshoot without another review step. When true, Uwear persists the brief, confirms it, and executes it directly if credits and validation allow; otherwise it falls back to the editable BriefProposal.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / looks
        Added value: +{
        +  "description": "The looks to shoot, each one outfit worn in the shoot, with ids from read_shoot_board.",
        +  "items": {
        +    "$ref": "#/$defs/LookInput"
        +  },
        +  "maxItems": 50,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / recipe
        Added value: +{
        +  "$ref": "#/$defs/RecipeSpec",
        +  "default": null,
        +  "description": "The shots and steps the user described (views, crops, edits, upscale, video): Uwear builds them as a new automation. Not with recipe_workflow_id."
        +}
      • addedInput schema / properties / recipe_workflow_id
        Added value: +{
        +  "default": null,
        +  "description": "An automation from read_shoot_board's brief_inputs.automations that every look runs through as is (only when it matches what the user asked for). Not with recipe. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it.",
        +  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "default": "",
        +  "description": "The shoot's name, only in the user's own words; otherwise leave it out.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "commands"
        -]New value: +[
        +  "looks",
        +  "board_id"
        +]
    • Changedpropose_montage1 field changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
    • Removedpropose_outfits
    • Addedread_shoot_board
    • Changedrequest_user_context1 field changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
    • Addedsave_art_direction
    • Removedsave_generated_avatar
    • Changedsave_reference_file_from_chat_file53 fields changed
      • removedInput schema / $defs / OpenAIFile
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "download_url": {
        -      "type": "string"
        -    },
        -    "file_id": {
        -      "type": "string"
        -    },
        -    "file_name": {
        -      "type": "string"
        -    },
        -    "mime_type": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "download_url",
        -    "file_id"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • removedInput schema / properties / image_file_1 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_1 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_1 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_1 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_1 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_10 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_10 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_10 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_10 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_10 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_2 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_2 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_2 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_2 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_2 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_3 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_3 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_3 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_3 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_3 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_4 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_4 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_4 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_4 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_4 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_5 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_5 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_5 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_5 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_5 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_6 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_6 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_6 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_6 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_6 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_7 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_7 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_7 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_7 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_7 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_8 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_8 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_8 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_8 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_8 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_9 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_9 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_9 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_9 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_9 / type
        Added value: +"object"
      • addedInput schema / required
        Added value: +[]
    • Removedsave_template
    • Addedset_generation_result_favorite
    • Addedshow_in_shoot_board
    • Removedsubmit_uwear_feedback
    • Removedupdate_art_direction
    • Changedupdate_brief22 fields changed
      • removedInput schema / $defs / GenerationCommand
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "Versioned command shared by REST, Agent, MCP, jobs, and briefs.\n\nThe nested ``input`` is intentionally the API's public intent model. A\nfield added there therefore appears automatically in this command's JSON\nschema, serialization, and persisted brief representation.",
        -  "properties": {
        -    "input": {
        -      "$ref": "#/$defs/GenerationIntent"
        -    },
        -    "schema_version": {
        -      "const": 2,
        -      "type": "integer"
        -    },
        -    "source": {
        -      "default": null,
        -      "discriminator": {
        -        "propertyName": "type"
        -      },
        -      "oneOf": [
        -        {
        -          "properties": {
        -            "generation_result_id": {
        -              "minimum": 1,
        -              "type": "integer"
        -            },
        -            "type": {
        -              "const": "generation_result",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "generation_result_id"
        -          ],
        -          "type": "object"
        -        },
        -        {
        -          "properties": {
        -            "type": {
        -              "const": "uploaded_file",
        -              "type": "string"
        -            },
        -            "uploaded_file_id": {
        -              "minimum": 1,
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "uploaded_file_id"
        -          ],
        -          "type": "object"
        -        },
        -        {
        -          "properties": {
        -            "image_url": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "type": {
        -              "const": "public_url",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "image_url"
        -          ],
        -          "type": "object"
        -        },
        -        {
        -          "description": "Durable identity for a source produced by an earlier pipeline step.",
        -          "properties": {
        -            "output_index": {
        -              "minimum": 0,
        -              "type": "integer"
        -            },
        -            "post_claim_reference": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "step_index": {
        -              "minimum": 0,
        -              "type": "integer"
        -            },
        -            "type": {
        -              "const": "pipeline_step",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "post_claim_reference",
        -            "step_index",
        -            "output_index"
        -          ],
        -          "type": "object"
        -        }
        -      ],
        -      "properties": {
        -        "generation_result_id": {
        -          "minimum": 1,
        -          "type": "integer"
        -        },
        -        "image_url": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "output_index": {
        -          "minimum": 0,
        -          "type": "integer"
        -        },
        -        "post_claim_reference": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "step_index": {
        -          "minimum": 0,
        -          "type": "integer"
        -        },
        -        "type": {
        -          "enum": [
        -            "generation_result",
        -            "uploaded_file",
        -            "public_url",
        -            "pipeline_step"
        -          ],
        -          "type": "string"
        -        },
        -        "uploaded_file_id": {
        -          "minimum": 1,
        -          "type": "integer"
        -        }
        -      },
        -      "type": "object"
        -    }
        -  },
        -  "required": [
        -    "schema_version",
        -    "input"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / GenerationIntent
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "Caller-owned model-generation intent shared by every public adapter.\n\nAuthentication-derived identity deliberately does not belong here. REST,\nAgent, MCP, batch, and integrations all submit this exact contract; the\ncommand planner combines it with server-owned execution context later. MCP omits webhook callback configuration, which remains API-only.",
        -  "properties": {
        -    "alignment": {
        -      "default": null,
        -      "enum": [
        -        "left",
        -        "center",
        -        "right",
        -        "top",
        -        "bottom"
        -      ],
        -      "type": "string"
        -    },
        -    "art_direction_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "aspect_ratio": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "audio_ref_urls": {
        -      "default": null,
        -      "description": "Public audio URLs supplied as model references. Only models that declare a positive max_reference_audio capability accept them.",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "avatar_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "backdrop_mode": {
        -      "default": null,
        -      "description": "Canonical Backdrop mode for new generation requests.",
        -      "enum": [
        -        "transparent",
        -        "solid",
        -        "image"
        -      ],
        -      "type": "string"
        -    },
        -    "background_image_url": {
        -      "default": null,
        -      "description": "Canonical Backdrop background image URL.",
        -      "type": "string"
        -    },
        -    "camera": {
        -      "default": "",
        -      "type": "string"
        -    },
        -    "camera_edit_id": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "children": {
        -      "default": null,
        -      "description": "Nested generation requests to run after this generation completes. Every child must provide model_slug.",
        -      "items": {
        -        "$ref": "#/$defs/GenerationIntent"
        -      },
        -      "type": "array"
        -    },
        -    "clothing_item_ids": {
        -      "default": null,
        -      "items": {
        -        "type": "integer"
        -      },
        -      "type": "array"
        -    },
        -    "color_hex": {
        -      "default": null,
        -      "description": "Canonical Backdrop solid or fallback color.",
        -      "type": "string"
        -    },
        -    "do_qa": {
        -      "default": null,
        -      "description": "When true, enqueue QA after result storage and gate acceptance on QA.",
        -      "type": "boolean"
        -    },
        -    "duration": {
        -      "default": null,
        -      "type": "integer"
        -    },
        -    "enhance_user_prompt": {
        -      "default": null,
        -      "deprecated": true,
        -      "description": "Deprecated REST compatibility alias. true is normalized at command preparation to the legacy prompt-enhancement ArtDirection ID; false has no effect. Prefer art_direction_id. Removal requires 90 consecutive days without production use; usage was last observed on 2026-07-26.",
        -      "type": "boolean",
        -      "ui": {
        -        "editable": false,
        -        "visibility": [
        -          "rest"
        -        ]
        -      }
        -    },
        -    "extra_params": {
        -      "additionalProperties": true,
        -      "default": null,
        -      "description": "Model-specific extension parameters. Backdrop controls are not accepted here; use backdrop_mode, color_hex, and background_image_url.",
        -      "type": "object"
        -    },
        -    "generate_audio": {
        -      "default": false,
        -      "description": "Include audio in the delivered video. False delivers a file with no audio stream; fixed-audio providers are muted after generation, without reducing native-generation credits.",
        -      "type": "boolean"
        -    },
        -    "generation_result_parent_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "image_url": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "img_ref_urls": {
        -      "default": null,
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "last_frame_attachment": {
        -      "$ref": "#/$defs/GenerationReferenceAttachmentInput",
        -      "default": null,
        -      "description": "Durable reference to the photo the clip closes on, resolved to a URL at dispatch. The durable form of last_frame_url, for callers that hold an id rather than a link — a workflow wiring a step's output into a later step's last frame cannot know the URL when the graph is authored."
        -    },
        -    "last_frame_url": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "location_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "max_qa_retries": {
        -      "default": null,
        -      "description": "Maximum QA-triggered retry generations after the initial attempt.",
        -      "maximum": 5,
        -      "minimum": 0,
        -      "type": "integer"
        -    },
        -    "model_slug": {
        -      "description": "Active AI model slug. Required for every generation command.",
        -      "minLength": 1,
        -      "type": "string"
        -    },
        -    "negative_prompt": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "num_images": {
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "outfit_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "prompt": {
        -      "default": "",
        -      "description": "Scene brief for this shot: setting, lighting, mood, camera/framing, pose — 2-5 compact positive sentences. Without art_direction_id this prompt reaches the image model as-is and is the entire creative direction: carry the shoot's world, lighting, and atmosphere here. With art_direction_id, the saved direction carries reusable style; add only per-shot intent. Supplied garment/avatar/reference images carry product appearance: refer to them semantically ('the supplied jacket'), never by image number — the backend appends the numbered reference map at dispatch. Styling intent (fit, tuck, drape, opening state) belongs here when it matters; re-described garment construction, product-fidelity warnings, and negative 'do not ...' blocks do not — with good references they degrade output. Say what to show, not what to avoid. Video commands: describe motion and camera movement. Video does not inherit the source generation's ArtDirection; omit art_direction_id to use only the source frame and this prompt. May be empty for upscale; generation routes validate separately.",
        -      "type": "string"
        -    },
        -    "reference_attachments": {
        -      "default": null,
        -      "items": {
        -        "$ref": "#/$defs/GenerationReferenceAttachmentInput"
        -      },
        -      "type": "array"
        -    },
        -    "resolution": {
        -      "default": null,
        -      "description": "Model-defined output resolution. Legacy image tiers are normalized to 1K, 2K, or 4K; video and exact pixel presets retain their model-defined casing.",
        -      "maxLength": 32,
        -      "minLength": 2,
        -      "type": "string"
        -    },
        -    "seed": {
        -      "default": null,
        -      "type": "integer"
        -    },
        -    "tag_ids": {
        -      "default": null,
        -      "items": {
        -        "type": "integer"
        -      },
        -      "type": "array"
        -    },
        -    "target_resolution": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "upscale_factor": {
        -      "default": null,
        -      "type": "number"
        -    },
        -    "use_case": {
        -      "default": null,
        -      "type": "string"
        -    },
        -    "video_ref_urls": {
        -      "default": null,
        -      "description": "Public video URLs supplied as model references. Only models that declare a positive max_reference_videos capability accept them.",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "num_images",
        -    "model_slug"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / $defs / GenerationReferenceAttachmentInput
        Removed value: -{
        -  "properties": {
        -    "avatar_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "clothing_item_asset_id": {
        -      "default": null,
        -      "description": "Exact durable clothing asset reference. Provide with clothing_item_id; preferred over the deprecated side selector for repeated detail assets.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "clothing_item_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "generation_result_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "location_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "outfit_id": {
        -      "default": null,
        -      "description": "Outfit reference. The generation uses the front image of every garment in the outfit, as if each were attached as clothing_item.",
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    "side": {
        -      "default": null,
        -      "enum": [
        -        "front",
        -        "back"
        -      ],
        -      "type": "string"
        -    },
        -    "type": {
        -      "enum": [
        -        "uploaded_file",
        -        "generation_result",
        -        "location",
        -        "avatar",
        -        "clothing_item",
        -        "outfit"
        -      ],
        -      "type": "string"
        -    },
        -    "uploaded_file_id": {
        -      "default": null,
        -      "minimum": 1,
        -      "type": "integer"
        -    }
        -  },
        -  "required": [
        -    "type"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / $defs / LookInput
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One look: one outfit worn in the shoot, with who wears it and where.",
        +  "properties": {
        +    "clothing_ids": {
        +      "description": "Clothing worn together.",
        +      "items": {
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "maxItems": 4,
        +      "type": "array"
        +    },
        +    "key": {
        +      "default": null,
        +      "description": "update_brief: an existing look's key, to keep that look.",
        +      "pattern": "^look_\\d{2,3}$",
        +      "type": "string"
        +    },
        +    "label": {
        +      "default": "",
        +      "description": "The look's name, e.g. 'Linen summer set'.",
        +      "maxLength": 120,
        +      "type": "string"
        +    },
        +    "location_id": {
        +      "default": null,
        +      "description": "Where the look is shot.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "model_id": {
        +      "default": null,
        +      "description": "The Model who wears the look.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "outfit_id": {
        +      "default": null,
        +      "description": "A saved outfit.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "reference_ids": {
        +      "description": "Reference photos (uploaded file ids from the board's References).",
        +      "items": {
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "maxItems": 50,
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / $defs / RecipeSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The recipe a demand asks for: its shots and their steps.",
        +  "properties": {
        +    "image_model": {
        +      "default": null,
        +      "description": "A listed image model's slug, only when the user named it.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
        +      "maxLength": 80,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "shots": {
        +      "description": "One shot per view, in order.",
        +      "items": {
        +        "$ref": "#/$defs/ShotSpec"
        +      },
        +      "maxItems": 8,
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "video_model": {
        +      "default": null,
        +      "description": "A listed video model's slug, only when the user named it.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "shots"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / ShotSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One photo of each look, from one camera.",
        +  "properties": {
        +    "camera": {
        +      "description": "The view, from the camera list.",
        +      "enum": [
        +        "auto",
        +        "full_body_front",
        +        "full_body_back",
        +        "full_body_side",
        +        "upper_body_front",
        +        "upper_body_back",
        +        "upper_body_side",
        +        "lower_body_front",
        +        "lower_body_back",
        +        "lower_body_side",
        +        "clothing_detail_front",
        +        "clothing_detail_back",
        +        "clothing_detail_side"
        +      ],
        +      "type": "string"
        +    },
        +    "then": {
        +      "description": "Steps on this shot's photo, in order (a video ends the chain).",
        +      "items": {
        +        "$ref": "#/$defs/StepSpec"
        +      },
        +      "maxItems": 4,
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "camera"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / $defs / StepSpec
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One step on a shot's photo (or on the step before it).",
        +  "properties": {
        +    "camera_edit_id": {
        +      "default": null,
        +      "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
        +      "enum": [
        +        "camera_edit",
        +        "edit",
        +        "upscale",
        +        "video",
        +        "remove_background"
        +      ],
        +      "type": "string"
        +    },
        +    "prompt": {
        +      "default": null,
        +      "description": "edit: the change; video: the motion (optional).",
        +      "maxLength": 1000,
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / description
        Removed value: -"Input schema for updating a visible brief without immediate execution."
      • addedInput schema / properties / art_direction_id
        Added value: +{
        +  "default": null,
        +  "description": "A new art direction for the whole shoot (omit: kept). Changing it never changes the automation. For a new look and feel, call save_art_direction first and pass its id.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • addedInput schema / properties / brief_id
        Added value: +{
        +  "description": "The brief being revised: the board's brief_id from read_shoot_board.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / commands
        Removed value: -{
        -  "description": "Canonical generation commands. Each command contains the MCP-safe GenerationIntent fields and a durable source reference. Write each input.prompt as a compact positive scene description (setting, lighting, mood, camera, pose — for video, motion and camera movement); without art_direction_id the prompt is the entire creative direction, so give it the full scene. The attached garment/avatar/reference images carry product appearance, so never pad prompts with restated garment construction details, product-fidelity warnings, or negative 'do not' instruction blocks; styling intent (fit, tuck, drape) is fine. For video commands, attach available full back or side garment assets that the camera may reveal through input.reference_attachments when capacity permits. Do not combine reference_attachments with img_ref_urls; uploaded garment assets are not attached automatically. Webhook callback configuration is API-only.",
        -  "items": {
        -    "$ref": "#/$defs/GenerationCommand"
        -  },
        -  "minItems": 1,
        -  "type": "array"
        -}
      • removedInput schema / properties / creative_context
        Removed value: -{
        -  "default": null,
        -  "description": "Required for photoshoot proposals and brief rewrites. Summarize the shoot-level creative approach that guided garment combos, avatars, prompts, and pipeline steps. By default prefer one cohesive art direction across the photoshoot, e.g. 'urban summer editorial', 'standard grey e-commerce', or 'sporty studio catalog'. Per-look prompts may differ for garment details, pose, framing, or avatar, but should feel part of the same shoot unless the user explicitly asks for multiple art directions, split concepts, A/B routes, or varied campaign directions. The assistant should explain this art direction to the user after proposing the brief and ask if they want changes.",
        -  "type": "string"
        -}
      • addedInput schema / properties / image_model
        Added value: +{
        +  "default": null,
        +  "description": "A listed image model's slug the user asked for (\"use GPT Image\"): the shoot's AI model, every shot and edit of every look runs on it; the automation is unchanged. Not with recipe (name it in recipe.image_model).",
        +  "type": "string"
        +}
      • addedInput schema / properties / looks
        Added value: +{
        +  "description": "The complete new look list (not a diff); an unchanged look keeps its key.",
        +  "items": {
        +    "$ref": "#/$defs/LookInput"
        +  },
        +  "maxItems": 50,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / recipe
        Added value: +{
        +  "$ref": "#/$defs/RecipeSpec",
        +  "default": null,
        +  "description": "The complete new shots and steps, built as a new automation for the looks below (e.g. the old shots plus a side view). Not with recipe_workflow_id."
        +}
      • addedInput schema / properties / recipe_look_keys
        Added value: +{
        +  "default": null,
        +  "description": "The looks (keys you send) that move to recipe / recipe_workflow_id; omit for every look.",
        +  "items": {
        +    "pattern": "^look_\\d{2,3}$",
        +    "type": "string"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / recipe_workflow_id
        Added value: +{
        +  "default": null,
        +  "description": "An automation from read_shoot_board's brief_inputs.automations for the looks below. Not with recipe.",
        +  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "default": null,
        +  "description": "A new name for the shoot, only the user's own words (omit: kept).",
        +  "maxLength": 80,
        +  "type": "string"
        +}
      • addedInput schema / properties / video_model
        Added value: +{
        +  "default": null,
        +  "description": "A listed video model's slug the user asked for: the shoot's videos run on it. Not with recipe (name it in recipe.video_model).",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "commands"
        -]New value: +[
        +  "brief_id",
        +  "looks",
        +  "board_id"
        +]
    • Removedupdate_garment
    • Changedupdate_montage_proposal2 fields changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[]
    • Removedupdate_preferences
    • Changedupload_avatar_from_chat_file53 fields changed
      • removedInput schema / $defs / OpenAIFile
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "download_url": {
        -      "type": "string"
        -    },
        -    "file_id": {
        -      "type": "string"
        -    },
        -    "file_name": {
        -      "type": "string"
        -    },
        -    "mime_type": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "download_url",
        -    "file_id"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • removedInput schema / properties / image_file_1 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_1 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_1 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_1 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_1 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_10 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_10 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_10 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_10 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_10 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_2 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_2 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_2 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_2 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_2 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_3 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_3 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_3 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_3 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_3 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_4 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_4 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_4 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_4 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_4 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_5 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_5 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_5 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_5 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_5 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_6 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_6 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_6 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_6 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_6 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_7 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_7 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_7 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_7 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_7 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_8 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_8 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_8 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_8 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_8 / type
        Added value: +"object"
      • removedInput schema / properties / image_file_9 / $ref
        Removed value: -"#/$defs/OpenAIFile"
      • addedInput schema / properties / image_file_9 / additionalProperties
        Added value: +false
      • addedInput schema / properties / image_file_9 / properties
        Added value: +{
        +  "download_url": {
        +    "type": "string"
        +  },
        +  "file_id": {
        +    "type": "string"
        +  },
        +  "file_name": {
        +    "type": "string"
        +  },
        +  "mime_type": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / image_file_9 / required
        Added value: +[
        +  "download_url",
        +  "file_id"
        +]
      • addedInput schema / properties / image_file_9 / type
        Added value: +"object"
      • addedInput schema / required
        Added value: +[]
    • Removedupload_garment_from_chat_file
    • Changedupload_garment_from_public_url2 fields changed
      • addedInput schema / properties / board_id
        Added value: +{
        +  "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[]
    • Addeduwear_settings_read
    • Addeduwear_settings_update
    • Removedview_image
  15. 3 tool updates
    • Changedpropose_brief2 fields changed
      • addedInput schema / $defs / GenerationReferenceAttachmentInput / properties / outfit_id
        Added value: +{
        +  "default": null,
        +  "description": "Outfit reference. The generation uses the front image of every garment in the outfit, as if each were attached as clothing_item.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / $defs / GenerationReferenceAttachmentInput / properties / type / enum
        Previous value: -[
        -  "uploaded_file",
        -  "generation_result",
        -  "location",
        -  "avatar",
        -  "clothing_item"
        -]New value: +[
        +  "uploaded_file",
        +  "generation_result",
        +  "location",
        +  "avatar",
        +  "clothing_item",
        +  "outfit"
        +]
    • Changedsave_template2 fields changed
      • addedInput schema / $defs / GenerationReferenceAttachmentInput / properties / outfit_id
        Added value: +{
        +  "default": null,
        +  "description": "Outfit reference. The generation uses the front image of every garment in the outfit, as if each were attached as clothing_item.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / $defs / GenerationReferenceAttachmentInput / properties / type / enum
        Previous value: -[
        -  "uploaded_file",
        -  "generation_result",
        -  "location",
        -  "avatar",
        -  "clothing_item"
        -]New value: +[
        +  "uploaded_file",
        +  "generation_result",
        +  "location",
        +  "avatar",
        +  "clothing_item",
        +  "outfit"
        +]
    • Changedupdate_brief2 fields changed
      • addedInput schema / $defs / GenerationReferenceAttachmentInput / properties / outfit_id
        Added value: +{
        +  "default": null,
        +  "description": "Outfit reference. The generation uses the front image of every garment in the outfit, as if each were attached as clothing_item.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / $defs / GenerationReferenceAttachmentInput / properties / type / enum
        Previous value: -[
        -  "uploaded_file",
        -  "generation_result",
        -  "location",
        -  "avatar",
        -  "clothing_item"
        -]New value: +[
        +  "uploaded_file",
        +  "generation_result",
        +  "location",
        +  "avatar",
        +  "clothing_item",
        +  "outfit"
        +]
  16. 4 tool updates
    • Changedlist_garments5 fields changed
      • addedInput schema / properties / body_zone
        Added value: +{
        +  "default": null,
        +  "description": "Filter to categories in any of these body zones; OR with category when both are given.",
        +  "items": {
        +    "enum": [
        +      "upper_body",
        +      "lower_body",
        +      "full_body",
        +      "footwear",
        +      "accessory",
        +      "other"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / category / description
        Previous value: -"Filter to garments in any of these canonical categories"New value: +"Filter to garments in any of these canonical categories; OR with body_zone when both are given."
      • addedInput schema / properties / category / items / enum
        Added value: +[
        +  "activewear",
        +  "baby_and_childrens_clothing",
        +  "blouses",
        +  "bodysuits",
        +  "cardigans",
        +  "corset_tops",
        +  "hoodies",
        +  "overshirts",
        +  "polos",
        +  "shirts",
        +  "sweaters",
        +  "sweatshirts",
        +  "t_shirts",
        +  "tank_tops",
        +  "tunics",
        +  "dresses",
        +  "lingerie",
        +  "maternity_clothing",
        +  "mens_undergarments",
        +  "one_pieces",
        +  "outerwear",
        +  "outfit_sets",
        +  "pants",
        +  "shorts",
        +  "skirts",
        +  "skorts",
        +  "sleepwear_and_loungewear",
        +  "socks",
        +  "suits",
        +  "swimwear",
        +  "traditional_and_ceremonial_clothing",
        +  "uniforms_and_workwear",
        +  "wedding_and_bridal_party_dresses",
        +  "clothing_accessories",
        +  "costumes_and_accessories",
        +  "handbag_and_wallet_accessories",
        +  "handbags_wallets_and_cases",
        +  "jewelry",
        +  "shoe_accessories",
        +  "shoes",
        +  "other"
        +]
      • addedInput schema / properties / exclude_clothing_item_ids
        Added value: +{
        +  "default": null,
        +  "description": "Exclude these garment IDs, for example the attached garment.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • addedInput schema / properties / include_uncategorized
        Added value: +{
        +  "default": false,
        +  "description": "Also include garments with no category when category and/or body_zone filters are used.",
        +  "type": "boolean"
        +}
    • Changedsearch_uwear_library3 fields changed
      • addedInput schema / properties / exclude_clothing_item_ids
        Added value: +{
        +  "default": null,
        +  "description": "Exclude these garment IDs after ranking and before the result limit; other item types are unaffected.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Hybrid retrieval query. Handles exact names/SKUs/IDs and natural-language visual or attribute intent."New value: +"Short keyword query: 2 to 5 words, one concept per call, or an exact name/SKU/ID. Every word must match for lexical results, so long sentences can return no lexical matches. Describing a garment finds that garment, not pieces to pair with it."
      • changedInput schema / properties / refresh_index / description
        Previous value: -"Force-refresh missing or stale index rows for currently visible library items before searching. Leave false for normal MCP use; search refreshes once automatically only when no accessible match is found."New value: +"Deprecated compatibility input. No index refresh is performed, even when true. Search uses the maintained index and current lexical metadata. Leave false."
    • Changedupdate_garment1 field changed
      • addedInput schema / properties / category / enum
        Added value: +[
        +  "activewear",
        +  "baby_and_childrens_clothing",
        +  "blouses",
        +  "bodysuits",
        +  "cardigans",
        +  "corset_tops",
        +  "hoodies",
        +  "overshirts",
        +  "polos",
        +  "shirts",
        +  "sweaters",
        +  "sweatshirts",
        +  "t_shirts",
        +  "tank_tops",
        +  "tunics",
        +  "dresses",
        +  "lingerie",
        +  "maternity_clothing",
        +  "mens_undergarments",
        +  "one_pieces",
        +  "outerwear",
        +  "outfit_sets",
        +  "pants",
        +  "shorts",
        +  "skirts",
        +  "skorts",
        +  "sleepwear_and_loungewear",
        +  "socks",
        +  "suits",
        +  "swimwear",
        +  "traditional_and_ceremonial_clothing",
        +  "uniforms_and_workwear",
        +  "wedding_and_bridal_party_dresses",
        +  "clothing_accessories",
        +  "costumes_and_accessories",
        +  "handbag_and_wallet_accessories",
        +  "handbags_wallets_and_cases",
        +  "jewelry",
        +  "shoe_accessories",
        +  "shoes",
        +  "other"
        +]
    • Changedview_image2 fields changed
      • addedInput schema / properties / attachment_id
        Added value: +{
        +  "default": null,
        +  "description": "ID of the workspace record to view. Supply together with attachment_type.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / attachment_type
        Added value: +{
        +  "default": null,
        +  "description": "Type of an attached workspace record. Supply together with attachment_id, without another image source.",
        +  "enum": [
        +    "uploaded_file",
        +    "generation_result",
        +    "clothing_item",
        +    "outfit"
        +  ],
        +  "type": "string"
        +}
  17. 6 tool updates
    • Removedcreate_credit_checkout_session
    • Removedmcp_create_credit_checkout_session
    • Changedmcp_generate_clip1 field changed
      • changedInput schema / properties / generate_audio / description
        Previous value: -"Whether to generate audio with the video"New value: +"Include audio in the delivered video. False delivers a silent file; fixed-audio providers are muted after generation at the same credits."
    • Changedpropose_brief1 field changed
      • addedInput schema / $defs / GenerationIntent / properties / generate_audio / description
        Added value: +"Include audio in the delivered video. False delivers a file with no audio stream; fixed-audio providers are muted after generation, without reducing native-generation credits."
    • Changedsave_template1 field changed
      • addedInput schema / $defs / GenerationIntent / properties / generate_audio / description
        Added value: +"Include audio in the delivered video. False delivers a file with no audio stream; fixed-audio providers are muted after generation, without reducing native-generation credits."
    • Changedupdate_brief1 field changed
      • addedInput schema / $defs / GenerationIntent / properties / generate_audio / description
        Added value: +"Include audio in the delivered video. False delivers a file with no audio stream; fixed-audio providers are muted after generation, without reducing native-generation credits."

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources