Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,070Paid calls: 1,528Letters: 13Defects: 1,322counted 3 min ago
teppi

Server definition

Hash
sha256:ae8b4c0a876c372f9655f2ad6f8e7f8c5b2f641604791b5acc602bbe50f4a46e
What it is
What a remote MCP server returned when asked what it offers: 66 tools

The blob, as servednamed by its sha256

{ "instructions": "Uwear is the photoshoot MCP server. Every model-based operation uses canonical GenerationCommand objects. Each commands[].input is the exact REST GenerationIntent contract and requires a concrete model_slug; use list_models to discover valid models. For normal garment/PDP briefs, send use_case='generate'. Never send feature_name. For ordinary saved photoshoot preferences, leave model fields unset and save durable intent such as camera/framing, aspect ratio, resolution, prompt style, brand guidance, or other non-approval defaults. Stored preferences never authorize paid execution. Use a generation-preset template for a reusable concrete shoot setup, including an exact model slug when reproducibility is intended. Use a batch-workflow template for an ordered repeatable multi-shot flow. System templates named `Demo — …` are worked examples of the canonical command language; read one with `get_template` before authoring a first brief or workflow. Gather the shoot inputs, then either show a confirmable brief or run it directly when the user explicitly asks to generate without another review step. If the user says 'prepare the photoshoot and run it', 'create and run', 'generate it now', or similar, call propose_brief with execute_immediately=true; Uwear will persist, confirm, and execute the brief directly if credits and validation allow. When a BriefProposal is visible and the user says 'Confirm', 'confirm', 'confirm the brief', 'approve it', 'looks good', 'yes run', 'run it', 'start', or 'generate', call confirm_brief with execute=true for the visible/latest brief ID. Do not say you cannot execute confirmation from this environment. Do not call a second execution tool, do not answer that the user must click Run in the UI, and never route Uwear photoshoot execution to the host app's native image-generation tool. If the user already named selectors such as a tag, saved ArtDirection, location, outfit, natural-language asset description, or numeric IDs, resolve those selectors with search_uwear_library and read tools before opening the picker, without opening the picker first. For example, for 'generate pictures using my clothes tagged summer26 using art direction summer beach', call list_tags to find summer26, then get_items_by_tag or list_garments(tag_ids=[...]) to get garment IDs, then call search_uwear_library(query='summer beach', item_types=['art_direction']) or use the ArtDirection lookup tools: list_art_directions to inspect candidates and get_art_direction when full saved markdown is needed. If there is a clear saved ArtDirection match, use its art_direction_id; if there is no clear match, use the user's words as creative_context and per-look prompt text instead of an art_direction_id. Then call propose_brief with canonical commands whose input includes clothing_item_ids, art_direction_id when matched, and the exact generation fields; also include creative_context and execute_immediately=true when the user asked to run/generate. Ask a chat clarification only when a selector is missing or ambiguous. If the user has not provided selectors or specific garment/outfit IDs and the host renders MCP app UI, call request_user_context with expected_types including clothing and/or outfits; include models only when the user asks for a specific or consistent person. The MCP app will load the gallery and Shoot Board for the user, and the board context persists for this MCP session. Tell the user to add assets to the Shoot Board and press Confirm context; never write 'drag into chat' or ask the user to use the chat as the drop target. If the host does not render MCP app UI, use list_garments, list_outfits, list_avatars, and related read tools to find candidate numeric IDs, ask the user to choose in chat when needed, then put explicit clothing_item_ids or outfit_id in each canonical command input. If the user has no garments or outfits, do not create an empty photoshoot brief and do not keep reopening an empty picker; tell them to use the Upload button in the Uwear app's Clothing tab, or to attach garment or product images in chat, then use the garment upload path that matches the source: chat attachment, public URL, or client-local file before reopening request_user_context. For garment chat attachments, call upload_garment_from_chat_file with actual ChatGPT files in top-level image_file_1, image_file_2, etc. and garments[] items that reference those exact field names from assets[] entries with asset_kind full/detail and asset_view front/back/side, plus name/description/gender metadata. Exactly one full front is required; each full view is unique; detail views can repeat. This explicit reference is how garment images are paired; do not rely on item order. For garment/product public URLs, call upload_garment_from_public_url with assets[] entries using asset_kind/asset_view plus asset_url. For local filesystem garment images on a capable host such as Codex, first call prepare_local_garment_upload with filenames, MIME types, and exact byte sizes. Keep local paths on the client, upload each file using its returned HTTP target, then call finish_local_garment_upload with the returned upload handles and garment classifications. Do not use the local-file tools for ChatGPT attachments or existing public URLs. For avatar and reference-file chat attachments, use the matching upload tools with batched metadata and their documented file fields. Do not pass a bare file_... ID; Uwear cannot fetch opaque host file IDs without the download_url. Do not inline base64 in MCP upload tools. To change an existing garment's item-level description or images, call update_garment with description and/or assets[]; assets[] patches images. Provided front/back assets replace those singleton roles, provided side/detail assets are added, and omitted existing assets are preserved. For saved garments that should become one outfit, call create_outfit_from_garment_ids after the garment IDs exist. Use image_url only for HTTP(S) URLs. Never pass /mnt/data, sandbox:, file://, or local file paths as image_url. Use the user's existing Uwear credits for creative actions. Explain insufficient credits or unavailable entitlements factually. Do not offer credit purchases, subscription plans, upgrades, or links to checkout or transactional billing pages. When the user explicitly asks to send, submit, or report a Uwear bug or feature request, call submit_uwear_feedback with the approved summary. If the user only describes a problem or idea, summarize it and ask for confirmation before calling the tool. Never submit feedback automatically because an error occurred, and never include the full conversation, credentials, secrets, raw provider payloads, or private URLs. Avatars/models are optional: if the user does not need a specific or consistent person, continue without a saved avatar. A saved avatar has one identity anchor (`upper_body_front`, a bust) plus optional `full_body_front`, `full_body_side`, `full_body_back`, `detail_eyes`, and `detail_skin` references; legacy design-sheet avatars remain valid. `generate_avatar` defaults to the bust. For a generated draft, generate the bust first, use its completed result URL in `identity_reference_urls` while generating each wanted view, then call `save_generated_avatar` once with the bust result and all chosen `additional_result_ids`. Traits (`age_range`, `build`, `height_cm`) are optional user-given facts: never infer, guess, or default them. Use `upload_avatar_from_chat_file` for an attached person photo; it becomes the bust anchor. Use `create_avatar_from_references` for public image URLs, owned workspace `uploaded_file_id` values, generated draft results, or a mix. Use `add_avatar_reference` to fill or replace one slot on an existing avatar. Use `build_avatar_prompt` only when the user wants help inventing or expanding the person description; when their wording is intentional, pass it directly to `generate_avatar`. Photoshoot means image generation via BriefProposal; do not route photoshoot, lookbook, product shoot, or outfit shoot requests to montage/video sequence tools. Montage tools are available only when the user explicitly asks for a video montage, stitched clip sequence, reel, or final video export; do not call montage tools merely because context contains images or generations. Choose a concrete active model_slug from list_models for every command; never pass model='auto'. Use 1 image per look for the first brief draft unless the user explicitly asks for multiple images/variations or a named saved workflow clearly specifies another count. Treat selected Shoot Board assets as styling inputs, not a flat ID list. Treat garment names, titles, filenames, and SKUs strictly as identifiers for finding, selecting, organizing, and displaying items. Keep them unchanged for search and UI, but never infer or copy color, material, construction, fit, gender, season, or any other visual or product attribute from identifier text into `creative_context` or `commands[].input.prompt`. Product attributes may come only from the user's explicit request, a persisted garment description, explicit typed gender or target metadata, or visual evidence from garment assets. An attribute that also appears in an identifier is usable only when independently supported by one of those trusted sources; selecting or repeating the identifier alone is not evidence. Gender-like words in an identifier are not typed gender or target metadata. If evidence is missing or uncertain, say “the supplied garment” and ask generation to preserve its visible appearance. Focus authored prompts on scene, lighting, framing, pose, and mood. Use trusted descriptions, typed metadata, and visual evidence to assemble coherent outfits and choose a compatible avatar or setting like a professional fashion photographer would. Use propose_outfits when the user wants Uwear to suggest styled combinations from selected garments; save a proposed combination with create_outfit_from_garment_ids only after the user chooses it. Use list_locations when the user wants a saved setting, and create_location only when they provide a public location image to save. For a one-off background, keep the requested setting in creative_context and the per-look prompt. Do not randomly alternate avatars across looks when the garments imply a better wearer or styling logic. When the user asks to modify, rewrite, add steps to, or show an adjusted brief, call update_brief with the complete replacement commands list so the BriefProposal UI refreshes. Edit only commands[].input and preserve every unchanged API field, durable source, clothing_item_ids, avatar_id, aspect_ratio, resolution, camera, and reference_attachments. Do not answer with a text-only brief when the user asks for the Uwear brief UI. For every video command, attach available full back or side garment assets that the camera may reveal through `input.reference_attachments` using their exact `clothing_item_asset_id`; having the asset uploaded on the clothing item does not attach it to the video. Never combine `reference_attachments` with `img_ref_urls`. If `propose_brief` or `update_brief` returns a `video_garment_view_not_attached` warning, explain its exact assets, node, capacity, and fidelity risk, then follow its remediation without exceeding remaining capacity or mixing the mutually exclusive reference modes. For photoshoot briefs, choose the shoot-level creative_context before writing prompts. Write every per-look prompt as a compact positive scene description covering setting, lighting, mood, camera, and pose in 2-5 sentences; video prompts describe motion and camera movement instead. When a command has no art_direction_id, its prompt reaches the image model as-is and is the entire creative direction, so carry the shoot's full world, lighting, and mood in it, aligned with creative_context; with an art_direction_id the saved direction carries the reusable style and the prompt only adds per-shot intent. The attached garment, avatar, and reference images already carry product appearance: refer to them semantically, never by image number (the backend appends the numbered reference map at dispatch), keep styling intent such as fit, tuck, drape, or opening state when it matters, and never restate garment construction details or add product-fidelity warnings or negative 'do not replace/redesign' instruction blocks; with good visual references those lists only pollute the prompt. Say what the image should show, not what to avoid. When the user names or describes an art direction, first use search_uwear_library with item_types=['art_direction'] or the ArtDirection lookup tools: list_art_directions to find candidates, then get_art_direction when full saved markdown is needed. Use a clear saved match via art_direction_id; do not invent style prompt text before checking saved ArtDirections; only fall back to prompt/creative_context text when no clear match exists, and only create/save a new ArtDirection when the user explicitly asks for a reusable saved direction. By default use one cohesive art direction across the shoot. The per-look prompts may differ for garment details, pose, framing, or avatar, but they should share the same setting/mood/lighting language unless the user explicitly asks for multiple art directions, split concepts, A/B creative routes, or varied campaign directions. MCP propose_brief/update_brief will reject generation briefs that omit creative_context. ArtDirection authoring is conversational skill behavior. For the detailed playbook, read the uwear://skills/creative resource when your MCP host supports resources. Help the user define reusable future shoot rules, then call author_art_direction with save=true once enough signal exists. This queues an asynchronous job; call get_art_direction_authoring_job with the returned job_id until status is done or failed. list_art_directions returns compact summaries; use get_art_direction when you need the full markdown before editing or reusing one. Saved ArtDirections can be used by art_direction_id in generation, edit, and video briefs. Video never inherits the source generation's ArtDirection: omit art_direction_id to suppress ArtDirection prompt building and use only the approved source frame plus the motion prompt. After saving, suggest a small test generation brief using the saved art_direction_id. After propose_brief or update_brief returns, your chat reply must explain the chosen art direction before listing model, camera, aspect ratio, resolution, image count, or credits. When the user asks to QA, quality-check, validate, review, approve/reject, inspect for defects, or assess generated outputs, use the official generation-result QA workflow: identify the relevant numeric generation_result_ids, call queue_generation_result_qa, then call read_generation_result_qa for the same IDs and summarize the structured QA status, decision, and issues. Do not substitute view_image as the primary QA mechanism; view_image is only supplemental manual inspection or a fallback when no generation_result_id exists. If get_generation_results returns generation_result_ids, use those exact IDs for QA. Queued or requeued QA costs 1 credit per generation result; reading QA results is free. Generation result reads attach up to four bounded, protocol-native ImageContent preview blocks when available. Each block is labeled as a display preview or low-resolution fallback; it is not the original result. When the host surfaces those blocks, use them directly and do not re-embed preview_url or other remote URLs as Markdown. preview_url remains the structured display-link fallback for clients that do not surface native image content; it deterministically selects display_url before thumbnail_url. url/download_url are the original result links. For Video results, the native block and poster_url/thumbnail_url are posters while url/download_url are the original video links. When checking generation progress, use get_generation_status and respect its status_guidance; status can remain Created while a job is queued or preparing, so avoid tight polling loops. Do not call get_brief with 0, placeholder IDs, or guessed IDs; get_brief is only for a real persisted brief ID supplied by the user or returned by propose_brief/update_brief, and only to reload an unchanged brief. When the host supports the MCP app picker, do not call list_garments, list_avatars, list_outfits, get_generation_results, or mcp_list_files merely to show a picker before request_user_context.", "tools": [ { "description": "Fill or replace one reference slot on an existing owned avatar/model from an owned workspace file, an owned generation result, or a public image URL. Creator-linked slots keep their source guard.", "inputSchema": { "additionalProperties": false, "description": "Fill one slot from exactly one workspace file, generation, or URL.", "oneOf": [ { "required": [ "uploaded_file_id" ] }, { "required": [ "generation_result_id" ] }, { "required": [ "image_url" ] } ], "properties": { "avatar_id": { "description": "Owned avatar to update.", "exclusiveMinimum": 0, "type": "integer" }, "generation_result_id": { "default": null, "description": "Owned image result ID. Use exactly one source field.", "exclusiveMinimum": 0, "type": "integer" }, "image_url": { "default": null, "description": "Public HTTP(S) image URL. Use exactly one source field.", "maxLength": 4096, "minLength": 1, "type": "string" }, "slot": { "description": "Reference slot to fill or replace.", "enum": [ "upper_body_front", "full_body_front", "full_body_side", "full_body_back", "detail_eyes", "detail_skin" ], "type": "string" }, "uploaded_file_id": { "default": null, "description": "Owned workspace file ID. Use exactly one source field.", "exclusiveMinimum": 0, "type": "integer" } }, "required": [ "avatar_id", "slot" ], "type": "object" }, "name": "add_avatar_reference", "outputSchema": null }, { "description": "Remove or replace an image background through Uwear's canonical free backdrop generation path. Provide exactly one foreground source: generation_result_id, clothing_item_asset_id, or a public HTTPS image_url. Use backdrop_mode transparent, solid with color_hex, or image with background_image_url. Returns generation_id; poll get_generation_status, then fetch get_generation_results.", "inputSchema": { "additionalProperties": false, "description": "Input schema for the free canonical backdrop generation capability.", "properties": { "backdrop_mode": { "description": "transparent removes the background, solid uses color_hex, and image uses background_image_url.", "enum": [ "transparent", "solid", "image" ], "type": "string" }, "background_image_url": { "default": null, "description": "Required for image mode; public HTTPS replacement background.", "minLength": 1, "type": "string" }, "clothing_item_asset_id": { "default": null, "description": "Exact owned garment asset foreground; provide exactly one source. Find asset IDs with get_garment or list_garments.", "minimum": 1, "type": "integer" }, "color_hex": { "default": null, "description": "Required for solid mode, for example #FFFFFF.", "type": "string" }, "generation_result_id": { "default": null, "description": "Existing generation result foreground; provide exactly one source.", "minimum": 1, "type": "integer" }, "image_url": { "default": null, "description": "Public HTTPS foreground image URL; provide exactly one source.", "minLength": 1, "type": "string" } }, "required": [ "backdrop_mode" ], "type": "object" }, "name": "apply_backdrop", "outputSchema": null }, { "description": "Queue the conversation for asynchronous ArtDirection authoring using Uwear's prompt system. Use save=true when the user wants to create, build, or save a reusable ArtDirection. Use save=false when the user explicitly wants an unsaved draft or brainstorming pass. This returns a job ID; call get_art_direction_authoring_job until status is done or failed.", "inputSchema": { "$defs": { "ArtDirectionAuthoringSourceInput": { "properties": { "image_url": { "default": null, "maxLength": 2048, "type": "string" }, "reference_image_attachment": { "$ref": "#/$defs/ArtDirectionReferenceImage", "default": null }, "source_type": { "$ref": "#/$defs/ArtDirectionAuthoringSourceType" }, "text": { "default": null, "maxLength": 50000, "type": "string" }, "uploaded_file_id": { "default": null, "minimum": 1, "type": "integer" }, "url": { "default": null, "maxLength": 2048, "type": "string" } }, "required": [ "source_type" ], "type": "object" }, "ArtDirectionAuthoringSourceType": { "enum": [ "text", "image_url", "reference_image_attachment", "public_url", "uploaded_file", "website_crawl" ], "type": "string" }, "ArtDirectionReferenceImage": { "description": "Authoring-only visual reference attached to an ArtDirection.\n\nThese references help regenerate or iterate the markdown document; they are\nnot passed to fashion generation requests just because the ArtDirection is\nselected.", "properties": { "source_id": { "description": "ID of the referenced asset.", "minimum": 1, "type": "integer" }, "source_type": { "$ref": "#/$defs/ArtDirectionReferenceImageSourceType", "description": "Asset kind used only for ArtDirection authoring context." } }, "required": [ "source_type", "source_id" ], "type": "object" }, "ArtDirectionReferenceImageSourceType": { "enum": [ "uploaded_file", "generation_result", "clothing_item", "avatar", "location" ], "type": "string" } }, "description": "Input schema for drafting an ArtDirection from text and reference images.", "properties": { "image_urls": { "description": "Draft-only reference image URLs to analyze into the ArtDirection. For saved ArtDirections, first save/select assets and pass reference_image_attachments.", "items": { "type": "string" }, "type": "array" }, "name": { "default": null, "description": "Optional requested ArtDirection name", "maxLength": 200, "minLength": 1, "type": "string" }, "reference_image_attachments": { "description": "Persistent authoring references as asset IDs. Use for save=true so the user can iterate the ArtDirection later. These are not generation-time references.", "items": { "$ref": "#/$defs/ArtDirectionReferenceImage" }, "type": "array" }, "save": { "default": false, "description": "Set true when the user wants to create, build, or save a reusable ArtDirection. Set false when the user explicitly wants an unsaved draft or brainstorming pass.", "type": "boolean" }, "sources": { "description": "Supported authoring sources such as text, public URLs, image URLs, uploaded files, or durable reference image attachments", "items": { "$ref": "#/$defs/ArtDirectionAuthoringSourceInput" }, "maxItems": 50, "type": "array" }, "user_text": { "default": "", "description": "Conversation text to compile into ArtDirection markdown", "type": "string" } }, "type": "object" }, "name": "author_art_direction", "outputSchema": null }, { "description": "Build a highly detailed prompt for generating a unique reusable avatar/model. Use this when the user wants help describing a person before image generation. If the user's prompt is already intentional and specific, Uwear can skip this and pass the user's wording directly to generate_avatar.", "inputSchema": { "description": "Input schema for building a reusable avatar/model generation prompt.", "properties": { "aspect_ratio": { "default": null, "description": "Optional aspect ratio for context, e.g. 9:16", "type": "string" }, "camera": { "default": null, "description": "Optional camera key for context, e.g. midshot", "type": "string" }, "camera_label": { "default": null, "description": "Optional human-readable camera label", "type": "string" }, "model_slug": { "default": null, "description": "Optional image model slug for context", "type": "string" }, "user_text": { "default": "", "description": "User's rough description of the person/model. Leave empty when the user wants the backend to invent a unique avatar prompt.", "type": "string" } }, "type": "object" }, "name": "build_avatar_prompt", "outputSchema": null }, { "description": "Call this to approve and idempotently execute a visible persisted Uwear brief. In MCP, a one-word 'Confirm' or phrases like 'looks good', 'run it', 'start', or 'generate' mean execute=true unless the user explicitly says to approve without starting. Use the visible/latest BriefProposal brief_id. Repeated calls return or resume the same durable execution.", "inputSchema": { "description": "Confirm and optionally execute an immutable canonical-command brief.", "properties": { "brief_id": { "description": "ID of the persisted brief to confirm", "exclusiveMinimum": 0, "type": "integer" }, "execute": { "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" } }, "required": [ "brief_id" ], "type": "object" }, "name": "confirm_brief", "outputSchema": null }, { "description": "Copy one generation-preset Template into a contract-typed, detached Production Workflow Generate-node config. The result does not update a Workflow and carries no live Template dependency; insert it through the canonical workflow version authoring tools.", "inputSchema": { "additionalProperties": false, "description": "Build a detached Workflow Generate config from a generation preset.", "properties": { "contract_version": { "default": null, "description": "Workflow contract to target; omit to use the current authoring contract", "maxLength": 128, "minLength": 1, "type": "string" }, "template_id": { "description": "Generation Template ID", "minimum": 1, "type": "integer" } }, "required": [ "template_id" ], "type": "object" }, "name": "copy_template_to_generate_node_config", "outputSchema": null }, { "description": "Create a company ArtDirection markdown document. Use author_art_direction first when the user provides rough creative text or reference images. Use this direct writer only for already-structured markdown that follows the Variation Controls parser contract.", "inputSchema": { "$defs": { "ArtDirectionReferenceImage": { "description": "Authoring-only visual reference attached to an ArtDirection.\n\nThese references help regenerate or iterate the markdown document; they are\nnot passed to fashion generation requests just because the ArtDirection is\nselected.", "properties": { "source_id": { "description": "ID of the referenced asset.", "minimum": 1, "type": "integer" }, "source_type": { "$ref": "#/$defs/ArtDirectionReferenceImageSourceType", "description": "Asset kind used only for ArtDirection authoring context." } }, "required": [ "source_type", "source_id" ], "type": "object" }, "ArtDirectionReferenceImageSourceType": { "enum": [ "uploaded_file", "generation_result", "clothing_item", "avatar", "location" ], "type": "string" } }, "description": "Input schema for creating a company ArtDirection.", "properties": { "content_markdown": { "description": "Complete ArtDirection markdown document. Prefer author_art_direction for rough briefs. If writing directly, every reusable alternative that should rotate across generations must live under `## Variation Controls` as `###` controls with `A. Option` lines; do not leave selectable worlds, pose families, or shot-role plans only in prose.", "maxLength": 50000, "minLength": 1, "type": "string" }, "name": { "description": "Name for the ArtDirection", "maxLength": 200, "minLength": 1, "type": "string" }, "reference_image_attachments": { "description": "Authoring reference image attachments to keep with the ArtDirection. These are for iterating the markdown only, not generation-time references.", "items": { "$ref": "#/$defs/ArtDirectionReferenceImage" }, "type": "array" } }, "required": [ "name", "content_markdown" ], "type": "object" }, "name": "create_art_direction", "outputSchema": null }, { "description": "Create one reusable avatar/model from an ordered set of generated avatar views, owned workspace files, and public image URLs. Each reference fills one durable slot. Traits are optional user-provided facts and are never inferred.", "inputSchema": { "$defs": { "AvatarReferenceInput": { "additionalProperties": false, "description": "One slot source: exactly one workspace file, generation, or URL.", "oneOf": [ { "required": [ "uploaded_file_id" ] }, { "required": [ "generation_result_id" ] }, { "required": [ "image_url" ] } ], "properties": { "generation_result_id": { "default": null, "description": "Owned completed avatar-creator result ID used as this reference source.", "exclusiveMinimum": 0, "type": "integer" }, "image_url": { "default": null, "description": "Public HTTP(S) image URL used as this reference source.", "maxLength": 4096, "minLength": 1, "type": "string" }, "slot": { "default": null, "description": "Reference slot. Generation results can derive this from avatar_creator.view; the first URL or workspace file defaults to upper_body_front.", "enum": [ "upper_body_front", "full_body_front", "full_body_side", "full_body_back", "detail_eyes", "detail_skin" ], "type": "string" }, "uploaded_file_id": { "default": null, "description": "Owned workspace file ID used as this reference source.", "exclusiveMinimum": 0, "type": "integer" } }, "type": "object" } }, "additionalProperties": false, "description": "Create one avatar from generated, workspace, or URL references.", "properties": { "age_range": { "default": null, "description": "Optional concrete age or age range. Never inferred.", "maxLength": 20, "type": "string" }, "build": { "default": null, "description": "Optional concrete physical build. Never inferred.", "maxLength": 100, "type": "string" }, "height_cm": { "default": null, "description": "Optional height in centimeters. Never inferred.", "maximum": 220, "minimum": 40, "type": "integer" }, "name": { "maxLength": 120, "minLength": 1, "type": "string" }, "references": { "description": "Ordered reference sources for the new avatar.", "items": { "$ref": "#/$defs/AvatarReferenceInput" }, "maxItems": 6, "minItems": 1, "type": "array" } }, "required": [ "name", "references" ], "type": "object" }, "name": "create_avatar_from_references", "outputSchema": null }, { "description": "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.", "inputSchema": { "description": "Input schema for creating a reusable location/scene reference.", "properties": { "description": { "default": null, "description": "Optional location description. If omitted, the system analyzes the image.", "type": "string" }, "image_url": { "description": "URL of the location/reference image", "type": "string" }, "name": { "description": "Name for the reusable location/scene reference", "minLength": 1, "type": "string" }, "source_metadata": { "additionalProperties": { "type": "string" }, "default": null, "description": "Optional provenance metadata for the source image", "type": "object" }, "tag_ids": { "default": null, "description": "Optional tag IDs to assign after creating the location", "items": { "type": "integer" }, "type": "array" }, "thumbnail_url": { "default": null, "description": "Optional thumbnail URL", "type": "string" } }, "required": [ "name", "image_url" ], "type": "object" }, "name": "create_location", "outputSchema": null }, { "description": "Create an outfit from existing garment IDs. Pairs saved garments together into a saved outfit without uploading new images.", "inputSchema": { "description": "Input schema for creating an outfit from existing clothing item IDs.", "properties": { "clothing_item_ids": { "description": "IDs of clothing items to combine into an outfit", "items": { "type": "integer" }, "minItems": 1, "type": "array" }, "is_active": { "default": false, "description": "Whether the outfit should be immediately active", "type": "boolean" }, "name": { "default": null, "description": "Optional human-readable outfit name", "maxLength": 100, "type": "string" } }, "required": [ "clothing_item_ids" ], "type": "object" }, "name": "create_outfit_from_garment_ids", "outputSchema": null }, { "description": "Create a new tag for organizing assets (garments, models, outfits, files, results, locations). Requires an active company workspace.", "inputSchema": { "description": "Input schema for creating a tag.", "properties": { "color": { "default": null, "description": "Optional hex color, e.g. '#22C55E'", "type": "string" }, "name": { "description": "Tag name (unique within the company)", "maxLength": 100, "minLength": 1, "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "create_tag", "outputSchema": null }, { "description": "Permanently delete a library template. Owner-only templates must be deleted through their owning resource.", "inputSchema": { "additionalProperties": false, "description": "Input schema for deleting one company template.", "properties": { "template_id": { "description": "Template ID", "minimum": 1, "type": "integer" } }, "required": [ "template_id" ], "type": "object" }, "name": "delete_template", "outputSchema": null }, { "description": "Duplicate a system or company ArtDirection into an editable company copy.", "inputSchema": { "description": "Input schema for duplicating a system or company ArtDirection.", "properties": { "art_direction_id": { "description": "The ArtDirection ID to duplicate", "minimum": 1, "type": "integer" }, "name": { "default": null, "description": "Optional name for the copy", "maxLength": 200, "minLength": 1, "type": "string" } }, "required": [ "art_direction_id" ], "type": "object" }, "name": "duplicate_art_direction", "outputSchema": null }, { "description": "Estimate credit cost for an operation.", "inputSchema": { "description": "Input schema for estimating operation cost.", "properties": { "duration": { "default": null, "description": "Video duration in seconds (video only, e.g. 4, 5, 6, 8, 10)", "type": "integer" }, "generate_audio": { "default": false, "description": "Whether to generate audio (video only, doubles cost for most models)", "type": "boolean" }, "model": { "default": null, "description": "Specific model to use", "type": "string" }, "num_items": { "default": 1, "description": "Number of items/images", "minimum": 1, "type": "integer" }, "operation": { "description": "Operation: generate, edit, upscale, video", "type": "string" }, "resolution": { "default": null, "description": "Output resolution when supported by the selected image or video model", "type": "string" } }, "required": [ "operation" ], "type": "object" }, "name": "estimate_cost", "outputSchema": null }, { "description": "Second step only for local garment images already prepared with prepare_local_garment_upload and uploaded to every returned target. Classify each upload_handle as a full/detail front/back/side asset. Do not use this for ChatGPT attachments or arbitrary public URLs.", "inputSchema": { "additionalProperties": false, "description": "Finish garments from owned direct-upload handles.", "properties": { "garments": { "description": "Garments assembled from owned upload handles returned by prepare_local_garment_upload", "items": { "additionalProperties": false, "description": "One garment assembled from directly uploaded local assets.", "properties": { "assets": { "description": "Uploaded garment assets. Exactly one full front is required; full front/back/side views are unique and detail views can repeat.", "items": { "additionalProperties": false, "description": "One classified garment asset previously prepared and uploaded directly.", "properties": { "asset_kind": { "default": null, "description": "Asset kind: full garment view or detail crop.", "enum": [ "full", "detail" ], "type": "string" }, "asset_role": { "default": null, "deprecated": true, "description": "Deprecated role-only adapter. Prefer asset_kind and asset_view.", "enum": [ "front", "back", "side", "detail" ], "type": "string" }, "asset_view": { "default": null, "description": "Visible garment view. New detail uploads require front, back, or side.", "enum": [ "front", "back", "side", "unspecified" ], "type": "string" }, "upload_handle": { "description": "Owned upload handle returned by prepare_local_garment_upload", "minLength": 1, "type": "string" } }, "required": [ "upload_handle" ], "type": "object" }, "minItems": 1, "type": "array" }, "description": { "default": null, "description": "Optional item-level garment description hint", "type": "string" }, "gender": { "default": null, "description": "Target gender: male, female, unisex", "type": "string" }, "name": { "default": null, "description": "Name for the garment. If omitted, derived from the front image filename.", "type": "string" }, "processing_mode": { "default": null, "description": "Optional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal.", "type": "string" } }, "required": [ "assets" ], "type": "object" }, "maxItems": 10, "minItems": 1, "type": "array" } }, "required": [ "garments" ], "type": "object" }, "name": "finish_local_garment_upload", "outputSchema": null }, { "description": "Generate reusable avatar/model references through the same creator path as the Uwear app. The default view is upper_body_front, a clean bust identity anchor. For a draft multi-view avatar, generate the bust first, pass its result URL in identity_reference_urls when generating each slot view, then save the chosen results together with save_generated_avatar. Traits are optional user-given facts and are never guessed. If the user wants help writing the person description, call build_avatar_prompt first only for that purpose; if the user's wording is already intentional, pass it directly here.", "inputSchema": { "additionalProperties": false, "description": "Input schema for generating reusable avatar/model candidates.", "properties": { "age_range": { "default": null, "description": "Optional concrete age or age range. Never inferred.", "maxLength": 20, "type": "string" }, "avatar_id": { "default": null, "description": "Optional existing avatar whose anchor fixes identity for a slot view. Not required when identity_reference_urls are supplied.", "exclusiveMinimum": 0, "type": "integer" }, "build": { "default": null, "description": "Optional concrete physical build. Never inferred.", "maxLength": 100, "type": "string" }, "expression": { "default": null, "description": "Exact expression instruction for a supported reference view. Replaces the configured neutral expression default.", "maxLength": 500, "type": "string" }, "height_cm": { "default": null, "description": "Optional height in centimeters. Never inferred.", "maximum": 220, "minimum": 40, "type": "integer" }, "identity_reference_urls": { "default": null, "description": "Person-image URLs that fix identity for a slot view. In a draft flow, pass the generated bust URL here before the avatar has been saved.", "items": { "type": "string" }, "maxItems": 5, "type": "array" }, "model": { "default": null, "description": "Optional image model slug or display name. Defaults to the cheapest active image generation model available to the account.", "type": "string" }, "name": { "default": null, "description": "Optional name to carry with the avatar generation", "type": "string" }, "num_images": { "default": 1, "description": "Number of avatar candidate images to generate", "maximum": 4, "minimum": 1, "type": "integer" }, "prompt": { "description": "Description of the person to render as a reusable avatar reference", "minLength": 3, "type": "string" }, "view": { "default": "upper_body_front", "description": "Reference view to generate. Defaults to the upper-body identity anchor.", "enum": [ "upper_body_front", "full_body_front", "full_body_side", "full_body_back", "detail_eyes", "detail_skin" ], "type": "string" } }, "required": [ "prompt" ], "type": "object" }, "name": "generate_avatar", "outputSchema": null }, { "description": "Get a selectable ArtDirection by ID.", "inputSchema": { "description": "Input schema for getting an ArtDirection.", "properties": { "art_direction_id": { "description": "The ArtDirection ID to retrieve", "minimum": 1, "type": "integer" } }, "required": [ "art_direction_id" ], "type": "object" }, "name": "get_art_direction", "outputSchema": null }, { "description": "Read an asynchronous ArtDirection authoring job. Poll the job ID returned by author_art_direction or iterate_art_direction until status is done or failed. A done job includes the authored markdown and, when save=true, the saved art_direction_id. Iteration jobs also expose their source ID, expected revision, and apply outcome. A failed job includes per-source status and safe failure reason.", "inputSchema": { "description": "Input schema for reading an asynchronous ArtDirection authoring job.", "properties": { "job_id": { "description": "ArtDirection authoring job ID returned by author_art_direction", "minimum": 1, "type": "integer" } }, "required": [ "job_id" ], "type": "object" }, "name": "get_art_direction_authoring_job", "outputSchema": null }, { "description": "Load an existing persisted brief unchanged by a real positive brief_id. Only use when the user supplied that brief_id or after propose_brief/update_brief returned it and the user wants to re-open the same brief. Never use brief_id=0, a placeholder, or a guessed ID. Never use this to start a new photoshoot. When the user asks to modify, rewrite, add steps to, or show an adjusted brief, call update_brief with the complete updated brief instead of looping on get_brief.", "inputSchema": { "description": "Input schema for loading a persisted brief for UI rehydration.", "properties": { "brief_id": { "description": "Real persisted brief ID to load unchanged. Do not use 0, guessed IDs, or this tool for editing a visible brief.", "exclusiveMinimum": 0, "type": "integer" } }, "required": [ "brief_id" ], "type": "object" }, "name": "get_brief", "outputSchema": null }, { "description": "Return the profile ID and active company ID used by this authenticated MCP connection. Use this before a paid operation when a release or audit must prove the connection is scoped to the intended Uwear account.", "inputSchema": { "properties": {}, "required": [], "type": "object" }, "name": "get_connection_identity", "outputSchema": null }, { "description": "Get a specific garment by ID.", "inputSchema": { "description": "Input schema for getting a specific garment.", "properties": { "garment_id": { "description": "The garment ID to retrieve", "type": "integer" } }, "required": [ "garment_id" ], "type": "object" }, "name": "get_garment", "outputSchema": null }, { "description": "Look up generation results by exact IDs, filters, or hybrid image/name/SKU search. Returns labeled native ImageContent previews; use them directly and never Markdown-embed result URLs. They are display previews, not originals: url/download_url are originals, preview_url is the fallback link, and poster_url/thumbnail_url is a video poster. Every result includes generation_result_id and the response includes generation_result_ids; use those exact integers for queue_generation_result_qa/read_generation_result_qa or as durable generation_result command.source values in canonical edit, upscale, and video commands. Confirmation-gated clients use propose_brief(commands=[...], execute_immediately=true) when the user asked to run now, update_brief for a complete command replacement, or confirm_brief(execute=true) for a visible brief. Pass generation_result_id to fetch one result or generation_id to list a job's results. Returns raw payload when available so prior prompts can be recovered. Use start_date/end_date for requests like 'last week'.", "inputSchema": { "description": "Input schema for listing generation results.", "properties": { "art_direction_ids": { "default": null, "description": "Filter results to images generated with these art directions", "items": { "type": "integer" }, "type": "array" }, "avatar_ids": { "default": null, "description": "Filter results to images generated with these avatars", "items": { "type": "integer" }, "type": "array" }, "clothing_item_ids": { "default": null, "description": "Filter results to images generated with these clothing items", "items": { "type": "integer" }, "type": "array" }, "decision": { "default": null, "description": "Filter by the unified result verdict.", "enum": [ "approved", "rejected", "undecided" ], "type": "string" }, "decision_source": { "default": null, "description": "Filter by the verdict source.", "enum": [ "auto", "human" ], "type": "string" }, "end_date": { "default": null, "description": "Filter results created on or before this ISO date/datetime, e.g. 2026-04-27.", "type": "string" }, "generation_id": { "default": null, "description": "Filter by parent generation ID (lists all result images from one generation job)", "type": "integer" }, "generation_result_id": { "default": null, "description": "Look 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.", "type": "integer" }, "kind": { "default": null, "description": "Filter by type: 'Image', 'Edit', 'Upscale', 'Video'", "type": "string" }, "limit": { "default": 20, "description": "Number of items per page", "maximum": 100, "minimum": 1, "type": "integer" }, "location_ids": { "default": null, "description": "Filter results to images generated with these locations", "items": { "type": "integer" }, "type": "array" }, "model_ids": { "default": null, "description": "Filter results to images generated with these AI models", "items": { "type": "integer" }, "type": "array" }, "outfit_ids": { "default": null, "description": "Filter results to images generated with these outfits", "items": { "type": "integer" }, "type": "array" }, "page": { "default": 1, "description": "Page number for pagination", "minimum": 1, "type": "integer" }, "qa_statuses": { "default": null, "description": "Filter by QA statuses, e.g. pending, processing, completed, error.", "items": { "type": "string" }, "type": "array" }, "query": { "default": null, "description": "Hybrid search across generated image content, originating item names, and SKUs.", "minLength": 2, "type": "string" }, "start_date": { "default": null, "description": "Filter results created on or after this ISO date/datetime, e.g. 2026-04-20.", "type": "string" }, "tag_ids": { "default": null, "description": "Filter by tag IDs (results must have at least one)", "items": { "type": "integer" }, "type": "array" } }, "type": "object" }, "name": "get_generation_results", "outputSchema": null }, { "description": "Check generation job status. Completed results may include labeled native ImageContent previews; use them directly and never Markdown-embed result URLs. They are display previews, not originals: url/download_url are originals, preview_url is the fallback link, and poster_url/thumbnail_url is a video poster. Returns status, raw payload, settings, avatar_id, model_id, model_slug, use_case, net credits_charged, credits_refunded, estimated_processing_seconds, and status_guidance. Failed jobs also return a safe error_message and error_type (user, transient, or provider). Status can remain Created while queued/preparing; avoid tight polling loops. UI 'Gemini Pro' maps to model_slug nano-banana-pro or nano_banana_pro_clothing.", "inputSchema": { "description": "Input schema for checking generation status.", "properties": { "generation_id": { "description": "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.", "type": "integer" } }, "required": [ "generation_id" ], "type": "object" }, "name": "get_generation_status", "outputSchema": null }, { "description": "Get all item IDs tagged with a specific tag, grouped by type. Use after list_tags for no-UI MCP requests like 'use my clothes tagged summer26'; then pass the resulting clothing_item IDs as garment_ids to propose_brief instead of opening request_user_context.", "inputSchema": { "description": "Input schema for querying items by tag across entity types.", "properties": { "item_types": { "default": null, "description": "Filter to specific types: 'clothing_item', 'avatar', 'outfit', 'generation_result', 'location'. Omit to get all.", "items": { "type": "string" }, "type": "array" }, "tag_id": { "description": "Tag ID to look up", "type": "integer" } }, "required": [ "tag_id" ], "type": "object" }, "name": "get_items_by_tag", "outputSchema": null }, { "description": "Get a reusable location/scene reference by ID.", "inputSchema": { "description": "Input schema for getting a specific reusable location.", "properties": { "location_id": { "description": "The location ID to retrieve", "type": "integer" } }, "required": [ "location_id" ], "type": "object" }, "name": "get_location", "outputSchema": null }, { "description": "Get one saved outfit by ID, including its member garments.", "inputSchema": { "additionalProperties": false, "description": "Input schema for reading one outfit.", "properties": { "outfit_id": { "description": "ID of the outfit to retrieve", "minimum": 1, "type": "integer" } }, "required": [ "outfit_id" ], "type": "object" }, "name": "get_outfit", "outputSchema": null }, { "description": "Load one canonical company template by ID or public t-xxxx share code. Pass expected_template_kind when the caller requires a generation_preset or batch_workflow.", "inputSchema": { "$defs": { "TemplateKind": { "description": "generation_preset is writable; batch_workflow is retained read-only history.", "enum": [ "generation_preset", "batch_workflow" ], "type": "string" } }, "additionalProperties": false, "description": "Input schema for loading one company template.", "properties": { "expected_template_kind": { "$ref": "#/$defs/TemplateKind", "default": null, "description": "Optional expected kind. A mismatch returns both expected and actual kinds." }, "share_code": { "default": null, "description": "Public t-xxxx share code", "pattern": "^t-[a-z0-9]{4}$", "type": "string" }, "template_id": { "default": null, "description": "Template ID", "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "get_template", "outputSchema": null }, { "description": "Get user's current credit balance.", "inputSchema": { "properties": {}, "required": [], "type": "object" }, "name": "get_user_credits", "outputSchema": null }, { "description": "Queue feedback-driven revision of an existing ArtDirection without resending its markdown. Existing authoring references are included automatically. Use save=false for a reviewable draft, or save=true to update the same company ArtDirection with stale-edit protection. System ArtDirections support drafts only. Poll get_art_direction_authoring_job for the result.", "inputSchema": { "$defs": { "ArtDirectionAuthoringSourceInput": { "properties": { "image_url": { "default": null, "maxLength": 2048, "type": "string" }, "reference_image_attachment": { "$ref": "#/$defs/ArtDirectionReferenceImage", "default": null }, "source_type": { "$ref": "#/$defs/ArtDirectionAuthoringSourceType" }, "text": { "default": null, "maxLength": 50000, "type": "string" }, "uploaded_file_id": { "default": null, "minimum": 1, "type": "integer" }, "url": { "default": null, "maxLength": 2048, "type": "string" } }, "required": [ "source_type" ], "type": "object" }, "ArtDirectionAuthoringSourceType": { "enum": [ "text", "image_url", "reference_image_attachment", "public_url", "uploaded_file", "website_crawl" ], "type": "string" }, "ArtDirectionReferenceImage": { "description": "Authoring-only visual reference attached to an ArtDirection.\n\nThese references help regenerate or iterate the markdown document; they are\nnot passed to fashion generation requests just because the ArtDirection is\nselected.", "properties": { "source_id": { "description": "ID of the referenced asset.", "minimum": 1, "type": "integer" }, "source_type": { "$ref": "#/$defs/ArtDirectionReferenceImageSourceType", "description": "Asset kind used only for ArtDirection authoring context." } }, "required": [ "source_type", "source_id" ], "type": "object" }, "ArtDirectionReferenceImageSourceType": { "enum": [ "uploaded_file", "generation_result", "clothing_item", "avatar", "location" ], "type": "string" } }, "description": "Input schema for revising an existing ArtDirection from feedback.", "properties": { "art_direction_id": { "description": "Existing ArtDirection ID to revise", "minimum": 1, "type": "integer" }, "feedback": { "description": "What the ArtDirection author should preserve, change, add, or remove", "maxLength": 50000, "minLength": 1, "type": "string" }, "image_urls": { "description": "Draft-only new visual sources; use persistent attachments when save=true", "items": { "type": "string" }, "type": "array" }, "name": { "default": null, "description": "Optional rename request", "maxLength": 200, "minLength": 1, "type": "string" }, "reference_image_attachments": { "description": "New persistent authoring references to add alongside existing references", "items": { "$ref": "#/$defs/ArtDirectionReferenceImage" }, "type": "array" }, "save": { "default": false, "description": "False returns an unsaved revision draft; true updates this same company ArtDirection", "type": "boolean" }, "sources": { "description": "Optional new supported authoring sources such as text, public URLs, or uploaded files", "items": { "$ref": "#/$defs/ArtDirectionAuthoringSourceInput" }, "type": "array" } }, "required": [ "art_direction_id", "feedback" ], "type": "object" }, "name": "iterate_art_direction", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "description": "Input schema for listing available ArtDirections.", "properties": { "limit": { "default": 20, "description": "Number of compact ArtDirection summaries per page", "maximum": 100, "minimum": 1, "type": "integer" }, "page": { "default": 1, "description": "Page number for pagination", "minimum": 1, "type": "integer" }, "query": { "default": null, "description": "Hybrid search across saved ArtDirection names and creative content.", "minLength": 2, "type": "string" } }, "type": "object" }, "name": "list_art_directions", "outputSchema": null }, { "description": "List the user's avatars: the reusable people who wear the garments, called 'models' or 'mannequins' in fashion terms (not the AI engines — for those, use list_models). Supports structured filters or query for hybrid name/metadata/image-attribute search. Set include_image_url=true when the avatar image itself is needed.", "inputSchema": { "additionalProperties": false, "description": "Input schema for listing avatars.", "properties": { "avatar_ids": { "default": null, "description": "Filter to specific avatar IDs", "items": { "type": "integer" }, "type": "array" }, "end_date": { "default": null, "description": "Filter: created on or before this date (ISO format)", "type": "string" }, "include_image_url": { "default": false, "description": "Set true when you need to inspect or reuse the avatar/model image URL.", "type": "boolean" }, "limit": { "default": 10, "description": "Number of items per page", "maximum": 100, "minimum": 1, "type": "integer" }, "page": { "default": 1, "description": "Page number for pagination", "minimum": 1, "type": "integer" }, "query": { "default": null, "description": "Hybrid search across avatar/model names, metadata, and visual attributes.", "minLength": 2, "type": "string" }, "sort": { "default": null, "description": "Sort order: 'field:direction', e.g. 'created_at:desc'. Default: created_at:desc", "type": "string" }, "start_date": { "default": null, "description": "Filter: created on or after this date (ISO format)", "type": "string" }, "tag_ids": { "default": null, "description": "Filter to avatars with any of these tags", "items": { "type": "integer" }, "type": "array" } }, "type": "object" }, "name": "list_avatars", "outputSchema": null }, { "description": "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. Garments may have no category. A category or body_zone filter excludes them unless include_uncategorized is true.", "inputSchema": { "additionalProperties": false, "description": "Input schema for listing garments.", "properties": { "body_zone": { "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" }, "category": { "default": null, "description": "Filter to garments in any of these canonical categories; OR with body_zone when both are given.", "items": { "enum": [ "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" ], "type": "string" }, "type": "array" }, "clothing_item_ids": { "default": null, "description": "Filter to specific garment IDs", "items": { "type": "integer" }, "type": "array" }, "end_date": { "default": null, "description": "Filter: created on or before this date (ISO format)", "type": "string" }, "exclude_clothing_item_ids": { "default": null, "description": "Exclude these garment IDs, for example the attached garment.", "items": { "type": "integer" }, "maxItems": 100, "type": "array" }, "include_image_url": { "default": false, "description": "Set true when the garment image itself is needed for visual display or reuse.", "type": "boolean" }, "include_uncategorized": { "default": false, "description": "Also include garments with no category when category and/or body_zone filters are used.", "type": "boolean" }, "limit": { "default": 10, "description": "Number of items per page", "maximum": 100, "minimum": 1, "type": "integer" }, "page": { "default": 1, "description": "Page number for pagination", "minimum": 1, "type": "integer" }, "query": { "default": null, "description": "Hybrid search across garment names, SKUs, metadata, and visual attributes.", "minLength": 2, "type": "string" }, "sort": { "default": null, "description": "Sort order: 'field:direction', e.g. 'created_at:desc', 'clothing_item_name:asc'. Default: created_at:desc", "type": "string" }, "start_date": { "default": null, "description": "Filter: created on or after this date (ISO format, e.g. '2025-06-01')", "type": "string" }, "tag_ids": { "default": null, "description": "Filter to garments with any of these tags", "items": { "type": "integer" }, "type": "array" } }, "type": "object" }, "name": "list_garments", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "description": "Input schema for listing reusable location/scene references.", "properties": { "end_date": { "default": null, "description": "Filter: created on or before this date (ISO format)", "type": "string" }, "include_image_url": { "default": false, "description": "Set true when the location/reference image URL is needed for inspection or reuse.", "type": "boolean" }, "limit": { "default": 10, "description": "Number of items per page", "maximum": 100, "minimum": 1, "type": "integer" }, "location_ids": { "default": null, "description": "Filter to specific location IDs", "items": { "type": "integer" }, "type": "array" }, "page": { "default": 1, "description": "Page number for pagination", "minimum": 1, "type": "integer" }, "query": { "default": null, "description": "Hybrid search across location names, metadata, and visual attributes.", "minLength": 2, "type": "string" }, "sort": { "default": null, "description": "Sort order: 'field:direction', e.g. 'created_at:desc', 'location_name:asc'. Default: created_at:desc", "type": "string" }, "start_date": { "default": null, "description": "Filter: created on or after this date (ISO format)", "type": "string" }, "tag_ids": { "default": null, "description": "Filter to locations with any of these tags", "items": { "type": "integer" }, "type": "array" } }, "type": "object" }, "name": "list_locations", "outputSchema": null }, { "description": "List available AI generation models (image, video, edit, upscale engines) by type, with credit costs, capability limits, and model-specific production guidance. These are the AI models that render photoshoots — not the human models/avatars; for those, use list_avatars.", "inputSchema": { "description": "Input schema for listing available models by type.", "properties": { "model_type": { "description": "Type: generation, edit, upscale, video, backdrop", "type": "string" } }, "required": [ "model_type" ], "type": "object" }, "name": "list_models", "outputSchema": null }, { "description": "List user's outfits (saved garment combinations). Filter by garment IDs, active status, date range, or query against contained garments.", "inputSchema": { "additionalProperties": false, "description": "Input schema for listing outfits.", "properties": { "clothing_item_ids": { "default": null, "description": "Filter to outfits containing any of these garments", "items": { "type": "integer" }, "type": "array" }, "end_date": { "default": null, "description": "Filter: created on or before this date (ISO format)", "type": "string" }, "is_active": { "default": null, "description": "Filter by status: 'true', 'false', or 'both' (default: both)", "type": "string" }, "limit": { "default": 10, "description": "Number of items per page", "maximum": 100, "minimum": 1, "type": "integer" }, "outfit_ids": { "default": null, "description": "Filter to specific outfit IDs", "items": { "type": "integer" }, "type": "array" }, "page": { "default": 1, "description": "Page number for pagination", "minimum": 1, "type": "integer" }, "query": { "default": null, "description": "Search outfit names and contained garments.", "minLength": 2, "type": "string" }, "sort": { "default": null, "description": "Sort: 'field:direction'. Use 'latest_generation_at:desc' to surface recently generated outfits. Default: created_at:desc", "type": "string" }, "source": { "default": null, "description": "Filter by outfit source.", "enum": [ "manual", "auto", "proposed" ], "type": "string" }, "start_date": { "default": null, "description": "Filter: created on or after this date (ISO format)", "type": "string" }, "tag_ids": { "default": null, "description": "Filter to outfits with any of these tags", "items": { "type": "integer" }, "type": "array" } }, "type": "object" }, "name": "list_outfits", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "description": "Input schema for listing available tags.", "properties": {}, "type": "object" }, "name": "list_tags", "outputSchema": null }, { "description": "List canonical company templates, optionally filtered by kind, scope, command use case, or public t-xxxx share code. 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.", "inputSchema": { "$defs": { "CatalogScope": { "enum": [ "library", "owner_only" ], "type": "string" }, "TemplateKind": { "description": "generation_preset is writable; batch_workflow is retained read-only history.", "enum": [ "generation_preset", "batch_workflow" ], "type": "string" } }, "additionalProperties": false, "description": "Input schema for listing company templates.", "properties": { "catalog_scope": { "$ref": "#/$defs/CatalogScope", "default": null, "description": "Filter by library or owner_only. Owner-only templates are hidden unless explicitly requested." }, "items_per_page": { "default": 50, "description": "Number of templates per page", "maximum": 100, "minimum": 1, "type": "integer" }, "page": { "default": 1, "description": "Page number for pagination", "minimum": 1, "type": "integer" }, "share_code": { "default": null, "description": "Return the template assigned this public t-xxxx share code", "pattern": "^t-[a-z0-9]{4}$", "type": "string" }, "template_kind": { "$ref": "#/$defs/TemplateKind", "default": null, "description": "Filter generation presets or read-only historical batch_workflow records" }, "use_case": { "default": null, "description": "Filter by a use_case present in any stored command", "minLength": 1, "type": "string" } }, "type": "object" }, "name": "list_templates", "outputSchema": null }, { "description": "App-only: append items to the session-scoped Uwear Shoot Board.", "inputSchema": { "properties": { "context_items": { "description": "Shoot Board items to append to the current list", "items": { "properties": { "id": { "oneOf": [ { "type": "integer" }, { "type": "string" } ] }, "isVideo": { "type": "boolean" }, "key": { "type": "string" }, "mediaUrl": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "posterUrl": { "type": [ "string", "null" ] }, "refs": { "type": "object" }, "schemaVersion": { "type": "integer" }, "thumbnailUrl": { "type": [ "string", "null" ] }, "type": { "enum": [ "clothing", "models", "outfits", "generations", "files", "locations" ], "type": "string" } }, "required": [ "id", "type" ], "type": "object" }, "type": "array" } }, "required": [ "context_items" ], "type": "object" }, "name": "mcp_add_context", "outputSchema": null }, { "description": "App-only: clear all session context items, or only one context type.", "inputSchema": { "properties": { "type": { "description": "Context type to remove; omit to clear the entire Shoot Board", "enum": [ "clothing", "models", "outfits", "generations", "file", "files", "location", "locations" ], "type": "string" } }, "required": [], "type": "object" }, "name": "mcp_clear_context", "outputSchema": null }, { "description": "App-only: export the user-confirmed montage clips as a stitched video. Spends credits, so it is hidden from host LLMs; the MCP iframe calls this after the user presses Export on the MontageProposal card. Returns the generation_id to poll via get_generation_status.", "inputSchema": { "properties": { "aspect_ratio": { "description": "Output video aspect ratio in W:H format", "type": "string" }, "base_resolution": { "description": "Output base resolution in pixels", "minimum": 1, "type": "integer" }, "clips": { "description": "Ordered generation-result clips to stitch into the montage", "items": { "properties": { "generation_result_id": { "minimum": 1, "type": "integer" }, "in_point": { "type": [ "number", "null" ] }, "muted": { "type": [ "boolean", "null" ] }, "order": { "minimum": 0, "type": "integer" }, "out_point": { "type": [ "number", "null" ] }, "speed": { "type": [ "number", "null" ] } }, "required": [ "generation_result_id", "order" ], "type": "object" }, "minItems": 1, "type": "array" }, "fit_mode": { "description": "How each clip fits the output frame: contain or cover", "type": "string" } }, "required": [ "clips", "aspect_ratio", "base_resolution", "fit_mode" ], "type": "object" }, "name": "mcp_export_montage", "outputSchema": null }, { "description": "App-only: queue an image-to-video generation for a montage clip. Spends credits, so it is hidden from host LLMs; the montage editor calls this when the user presses Generate on a draft clip. Returns the generation_id to poll via get_generation_status.", "inputSchema": { "properties": { "duration": { "description": "Video duration in seconds; defaults to 5", "minimum": 1, "type": [ "integer", "null" ] }, "generate_audio": { "description": "Include audio in the delivered video. False delivers a silent file; fixed-audio providers are muted after generation at the same credits.", "type": [ "boolean", "null" ] }, "generation_result_id": { "description": "Existing generation result ID to use as the source image; provide exactly one source", "minimum": 1, "type": [ "integer", "null" ] }, "image_url": { "description": "HTTPS source image URL; provide exactly one source", "type": [ "string", "null" ] }, "last_frame_url": { "description": "Optional final-frame image URL for supported video models", "type": [ "string", "null" ] }, "model": { "description": "Video model slug or supported model name", "type": "string" }, "prompt": { "description": "Optional motion prompt for the video clip", "type": [ "string", "null" ] }, "resolution": { "description": "Optional output resolution; defaults to 480p", "type": [ "string", "null" ] }, "uploaded_file_id": { "description": "Uploaded file ID to use as the source image; provide exactly one source", "minimum": 1, "type": [ "integer", "null" ] } }, "required": [ "model" ], "type": "object" }, "name": "mcp_generate_clip", "outputSchema": null }, { "description": "App-only: hydrate the session-scoped Uwear Shoot Board.", "inputSchema": { "properties": {}, "required": [], "type": "object" }, "name": "mcp_get_context", "outputSchema": null }, { "description": "App-only: list uploaded files for the Uwear MCP workspace files tab.", "inputSchema": { "properties": { "limit": { "description": "Maximum number of uploaded files per page", "maximum": 100, "minimum": 1, "type": "integer" }, "page": { "description": "Page number for uploaded file results", "minimum": 1, "type": "integer" } }, "required": [], "type": "object" }, "name": "mcp_list_files", "outputSchema": null }, { "description": "App-only: replace the session-scoped Uwear Shoot Board items.", "inputSchema": { "properties": { "context_items": { "description": "Shoot Board items that replace the current list when context_state is omitted", "items": { "properties": { "id": { "oneOf": [ { "type": "integer" }, { "type": "string" } ] }, "isVideo": { "type": "boolean" }, "key": { "type": "string" }, "mediaUrl": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "posterUrl": { "type": [ "string", "null" ] }, "refs": { "type": "object" }, "schemaVersion": { "type": "integer" }, "thumbnailUrl": { "type": [ "string", "null" ] }, "type": { "enum": [ "clothing", "models", "outfits", "generations", "files", "locations" ], "type": "string" } }, "required": [ "id", "type" ], "type": "object" }, "type": "array" }, "context_state": { "description": "Complete Shoot Board state to sanitize and persist; takes precedence over context_items", "properties": { "draftSelectionKeys": { "items": { "type": "string" }, "type": "array" }, "items": { "items": { "properties": { "id": { "oneOf": [ { "type": "integer" }, { "type": "string" } ] }, "isVideo": { "type": "boolean" }, "key": { "type": "string" }, "mediaUrl": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "posterUrl": { "type": [ "string", "null" ] }, "refs": { "type": "object" }, "schemaVersion": { "type": "integer" }, "thumbnailUrl": { "type": [ "string", "null" ] }, "type": { "enum": [ "clothing", "models", "outfits", "generations", "files", "locations" ], "type": "string" } }, "required": [ "id", "type" ], "type": "object" }, "type": "array" }, "pendingRequest": { "type": [ "object", "null" ] }, "revision": { "type": "integer" }, "schemaVersion": { "type": "integer" }, "updatedAt": { "type": "string" } }, "type": "object" } }, "required": [], "type": "object" }, "name": "mcp_replace_context", "outputSchema": null }, { "description": "App-only: save a user-edited image from the shared ImageDetail retouch editor as a child generation result. Hidden from host LLMs; the MCP iframe calls this after the user presses Save.", "inputSchema": { "properties": { "file_name": { "description": "Optional filename for the saved retouched image", "type": [ "string", "null" ] }, "image_base64": { "description": "Retouched image encoded as base64 or an image data URL", "type": "string" }, "mime_type": { "description": "Optional image MIME type; inferred from a data URL or defaults to image/png", "type": [ "string", "null" ] }, "operations": { "description": "Optional retouch operation metadata stored with the child result" }, "parent_generation_result_id": { "description": "Generation result ID of the original image", "minimum": 1, "type": "integer" } }, "required": [ "parent_generation_result_id", "image_base64" ], "type": "object" }, "name": "mcp_save_retouch", "outputSchema": null }, { "description": "First step for garment images on the host's local filesystem, such as files in ~/Downloads. Use only when the host can read those local files and perform the returned direct multipart HTTP uploads, such as Codex. Include every returned form field and send the file bytes under the returned file_field. Never send a local path to Uwear. Do not use this for ChatGPT attachments or existing public URLs. After every upload succeeds, call finish_local_garment_upload with the returned upload handles.", "inputSchema": { "additionalProperties": false, "description": "Create direct-upload targets for client-local garment images.", "properties": { "files": { "description": "Local image metadata in a stable order. The local paths never leave the client.", "items": { "additionalProperties": false, "description": "Metadata for one client-local image that will be uploaded directly.", "properties": { "content_length": { "description": "Exact local image size in bytes; maximum 25 MB", "exclusiveMinimum": 0, "maximum": 26214400, "type": "integer" }, "content_type": { "description": "Image MIME type used by the direct upload", "enum": [ "image/jpeg", "image/png", "image/webp", "image/avif", "image/gif", "image/bmp", "image/tiff" ], "type": "string" }, "file_name": { "description": "Local image filename only; never include its filesystem path", "maxLength": 255, "minLength": 1, "type": "string" } }, "required": [ "file_name", "content_type", "content_length" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" } }, "required": [ "files" ], "type": "object" }, "name": "prepare_local_garment_upload", "outputSchema": null }, { "description": "Create a Uwear BriefProposal from canonical generation commands. Every commands[].input is the MCP-safe GenerationIntent fields; commands and immutable plans are persisted without translation. Supply a concrete model_slug for generate, edit, upscale, and video. Use durable command.source IDs for uploaded files or generation results, and reference_attachments for additional references. For video, attach available full back or side garment assets that the camera may reveal when capacity permits; having the asset uploaded is not enough. If the response contains video_garment_view_not_attached, explain its exact assets, node, and capacity, then follow its remediation. Never mix reference_attachments with img_ref_urls or append recommendations beyond remaining capacity. Set execute_immediately=true only when the user explicitly asks to run now. Include creative_context for photoshoots and explain the art direction after proposing. For changes to a visible brief, call update_brief with the complete replacement command list. Webhook callback configuration is API-only.", "inputSchema": { "$defs": { "GenerationCommand": { "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" }, "GenerationIntent": { "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" }, "GenerationReferenceAttachmentInput": { "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" } }, "description": "Propose a brief made exclusively of canonical generation commands.", "properties": { "commands": { "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" }, "creative_context": { "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" }, "execute_immediately": { "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" } }, "required": [ "commands" ], "type": "object" }, "name": "propose_brief", "outputSchema": null }, { "description": "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.", "inputSchema": { "$defs": { "MontageItemInput": { "description": "A single item in a montage proposal. Either an existing video or an image to generate video from.", "properties": { "duration": { "default": null, "description": "Exact generated video duration in seconds for image items. If omitted, target_duration can be used instead.", "type": "integer" }, "end_time": { "default": null, "description": "Optional trim end time in seconds for this clip", "exclusiveMinimum": 0, "type": "number" }, "generate_audio": { "default": false, "description": "Generate audio with the video", "type": "boolean" }, "image_result_id": { "default": null, "description": "ID of image GenerationResult to use as first frame (required when type='image')", "type": "integer" }, "image_url": { "default": null, "description": "URL of image to use as first frame (alternative to image_result_id)", "type": "string" }, "last_frame_url": { "default": null, "description": "URL of last frame image for first-to-last video generation", "type": "string" }, "muted": { "default": false, "description": "Mute audio for this item", "type": "boolean" }, "prompt": { "default": null, "description": "Per-image motion prompt for video generation. Make it specific to this image and the requested movement, camera motion, vibe, and pacing.", "type": "string" }, "speed": { "default": 1, "description": "Playback speed multiplier (0.25-4.0)", "maximum": 4, "minimum": 0.25, "type": "number" }, "start_time": { "default": null, "description": "Optional trim start time in seconds for this clip", "minimum": 0, "type": "number" }, "target_duration": { "default": null, "description": "Desired final clip length in seconds. For existing videos, this trims from the start by default. For image items, this becomes the generated video duration.", "exclusiveMinimum": 0, "type": "number" }, "type": { "description": "'video' for existing video, 'image' for an image that needs video generation first", "enum": [ "video", "image" ], "type": "string" }, "video_model": { "default": null, "description": "Video model slug (required when type='image'). Use list_models(model_type='video') to see options.", "type": "string" }, "video_result_id": { "default": null, "description": "ID of video GenerationResult (required when type='video')", "type": "integer" } }, "required": [ "type" ], "type": "object" } }, "description": "Input schema for proposing a montage (mix of existing videos and images to generate).", "properties": { "aspect_ratio": { "default": "9:16", "description": "Output aspect ratio (e.g. '9:16', '16:9', '1:1')", "type": "string" }, "base_resolution": { "default": 1080, "description": "Output resolution height in pixels", "maximum": 4320, "minimum": 360, "type": "integer" }, "items": { "description": "Ordered list of montage items. Each is either an existing video or an image needing video generation. Min 1, max 10.", "items": { "$ref": "#/$defs/MontageItemInput" }, "maxItems": 10, "minItems": 1, "type": "array" } }, "required": [ "items" ], "type": "object" }, "name": "propose_montage", "outputSchema": null }, { "description": "Use Uwear's outfit proposer to create styled outfit combinations from selected garments. Returns candidate titles, clothing_item_ids, and short rationales; call create_outfit_from_garment_ids only after the user chooses a proposal to save.", "inputSchema": { "description": "Input schema for proposing outfit combinations from selected garments.", "properties": { "clothing_item_ids": { "description": "Accessible clothing item IDs to combine into outfit proposals", "items": { "type": "integer" }, "maxItems": 100, "minItems": 1, "type": "array" }, "instructions": { "default": null, "description": "Optional styling brief, occasion, season, constraints, or vibe", "maxLength": 2000, "type": "string" }, "max_outfits": { "default": 6, "description": "Maximum number of outfit proposals to return", "maximum": 24, "minimum": 1, "type": "integer" } }, "required": [ "clothing_item_ids" ], "type": "object" }, "name": "propose_outfits", "outputSchema": null }, { "description": "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. Queued or requeued QA costs 1 credit per generation result; already-completed QA rows are not charged again. 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.", "inputSchema": { "description": "Input schema for queueing QA on existing generation results.", "properties": { "generation_result_ids": { "description": "Generation result IDs to QA. Queued or requeued QA costs 1 credit per result.", "items": { "type": "integer" }, "maxItems": 50, "minItems": 1, "type": "array" }, "max_qa_retries": { "default": 0, "description": "Maximum QA-triggered retry generations to allow. Retry generations can cost additional generation credits.", "maximum": 5, "minimum": 0, "type": "integer" } }, "required": [ "generation_result_ids" ], "type": "object" }, "name": "queue_generation_result_qa", "outputSchema": null }, { "description": "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.", "inputSchema": { "description": "Input schema for reading QA rows for generation results.", "properties": { "generation_result_ids": { "description": "Generation result IDs to read QA for", "items": { "type": "integer" }, "maxItems": 50, "minItems": 1, "type": "array" } }, "required": [ "generation_result_ids" ], "type": "object" }, "name": "read_generation_result_qa", "outputSchema": null }, { "description": "FIRST tool to call for a new photoshoot only when the user has not supplied garment/outfit IDs or textual selectors such as tag names, saved ArtDirection names, location names, or outfit names. Opens the MCP app/gallery so the user can choose assets, add them to the Shoot Board, and press Confirm context. BLOCKS until the user confirms their selection. Do not use this when a no-UI path can resolve the request with list_tags/get_items_by_tag/list_garments or the ArtDirection lookup tools. Do not tell the user to drag assets into chat. If the user has no garments/outfits, ask them to attach garment/product images and use upload_garment_from_chat_file, upload_garment_from_public_url, or create_outfit_from_garment_ids before trying to create a brief. Do not request models when inventory shows avatars=0. Avatar/model is optional; only ask for one when the user wants a specific or consistent person. If they want a model and have none, ask for a person photo and use upload_avatar_from_chat_file, or use generate_avatar if they want Uwear to create a reusable model.", "inputSchema": { "additionalProperties": false, "description": "Input schema for requesting user-selected items from the MCP app/gallery.", "properties": { "expected_types": { "description": "Accepted item types (match panel tabs): 'clothing', 'models', 'outfits', 'generations', 'files'. Legacy 'file' is accepted as an alias for 'files'.", "items": { "type": "string" }, "type": "array" }, "min_items": { "default": 1, "description": "Minimum number of items the user must provide", "type": "integer" }, "prompt": { "description": "Instruction shown to the user, e.g. 'Select the clothing items you want to use and add them to the Shoot Board'", "type": "string" } }, "required": [ "prompt", "expected_types" ], "type": "object" }, "name": "request_user_context", "outputSchema": null }, { "description": "Save completed generate_avatar image results as one reusable avatar/model. Pass the identity-anchor result as generation_result_id and optional view results as additional_result_ids; each result fills the slot recorded in its avatar_creator.view metadata. Use only after generation finishes and the user chooses the candidates. Normal text-to-image results are not eligible.", "inputSchema": { "description": "Input schema for saving a completed avatar generation result.", "properties": { "additional_result_ids": { "default": null, "description": "Other completed generate_avatar result IDs to save into their own avatar_creator.view slots in the same avatar.", "items": { "type": "integer" }, "maxItems": 5, "type": "array" }, "generation_result_id": { "description": "Completed image result ID returned by generate_avatar. Normal text-to-image results are not eligible because they do not contain reopenable avatar-creator inputs.", "exclusiveMinimum": 0, "type": "integer" }, "name": { "description": "Name for the saved avatar/model", "type": "string" } }, "required": [ "generation_result_id", "name" ], "type": "object" }, "name": "save_generated_avatar", "outputSchema": null }, { "description": "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 garments or avatars.", "inputSchema": { "$defs": { "OpenAIFile": { "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" }, "ReferenceChatFileUploadItem": { "description": "One reference file upload item for chat-file batch upload.", "properties": { "file_name": { "default": null, "description": "Display name for the saved reference file", "type": "string" }, "image_url": { "default": null, "description": "Resolved download URL. Used by the Uwear app when recovering a chat file ID.", "type": "string" }, "mime_type": { "default": null, "description": "MIME/content type, e.g. image/png", "type": "string" }, "name": { "default": null, "description": "Alternate display name for the saved reference file", "type": "string" } }, "type": "object" } }, "description": "Input schema for saving reference files from chat file references.", "properties": { "file_name": { "default": null, "description": "Single recovered display name", "type": "string" }, "files": { "default": null, "description": "Reference file metadata in the same order as image_file_1, image_file_2, etc. No base64.", "items": { "$ref": "#/$defs/ReferenceChatFileUploadItem" }, "maxItems": 10, "type": "array" }, "image_file_1": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_10": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_2": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_3": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_4": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_5": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_6": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_7": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_8": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_9": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_url": { "default": null, "description": "Single resolved download URL used by automatic opaque-file recovery.", "type": "string" }, "mime_type": { "default": null, "description": "Single recovered MIME/content type, e.g. image/png", "type": "string" } }, "type": "object" }, "name": "save_reference_file_from_chat_file", "outputSchema": null }, { "description": "Create a canonical company template, or replace one by passing template_id with expected_revision. Send typed GenerationCommand objects; updates are complete replacements. This persists the template and does not generate images. Templates are single-generation presets. Use Production Workflows in the Automation workspace for reusable multi-step generation. Legacy batch Templates are read-only history and cannot be created, edited, or imported.", "inputSchema": { "$defs": { "CatalogScope": { "enum": [ "library", "owner_only" ], "type": "string" }, "GenerationCommand": { "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" }, "GenerationIntent": { "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" }, "GenerationReferenceAttachmentInput": { "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" }, "TemplateKind": { "description": "generation_preset is writable; batch_workflow is retained read-only history.", "enum": [ "generation_preset", "batch_workflow" ], "type": "string" }, "TemplatePayload": { "additionalProperties": false, "properties": { "commands": { "items": { "$ref": "#/$defs/GenerationCommand" }, "minItems": 1, "type": "array" }, "pairing_policy": { "const": "one_workflow_per_row", "default": null, "type": "string" }, "payload_schema_version": { "const": 1, "type": "integer" } }, "required": [ "payload_schema_version", "commands" ], "type": "object" } }, "additionalProperties": false, "description": "Create a template or fully replace one at an expected revision.", "properties": { "catalog_scope": { "$ref": "#/$defs/CatalogScope", "default": "library", "description": "Template catalog scope: library or owner_only" }, "description": { "default": null, "description": "Optional sentence explaining when to use the template", "type": "string" }, "expected_revision": { "default": null, "description": "Current revision when replacing an existing template; omit for create", "minimum": 1, "type": "integer" }, "name": { "description": "Template name", "maxLength": 200, "minLength": 1, "type": "string" }, "payload": { "$ref": "#/$defs/TemplatePayload", "description": "Versioned template payload containing canonical generation commands" }, "template_id": { "default": null, "description": "Template ID when replacing an existing template", "minimum": 1, "type": "integer" }, "template_kind": { "$ref": "#/$defs/TemplateKind", "description": "Template kind: generation_preset. Legacy batch_workflow writes are retired." } }, "required": [ "name", "template_kind", "payload" ], "type": "object" }, "name": "save_template", "outputSchema": null }, { "description": "Universal hybrid retrieval across the user's visible Uwear library: garments, avatars/models, locations, ArtDirections, uploaded files, and generation results. This is a finder, not a recommender. Use short keyword queries (2 to 5 words), one concept per call, or an exact name/SKU/ID. Every word must match for lexical results; long sentences can return no lexical matches. A query describing one garment finds that garment, not complementary garments. Vector results stay close to the best match. Use this before opening the picker, e.g. 'SKU 42', 'urban art direction', 'summer denim', or 'studio model'. For saved outfits, retrieve matching garments first, then call list_outfits with clothing_item_ids or propose_outfits from the garment IDs. Returns stable typed IDs, ids_by_type, detail_tool/detail_arguments, and selection hints; for saved ArtDirections, use the returned art_direction_id in briefs. This combines current lexical metadata with maintained vector retrieval. Interactive searches do not refresh the index. indexed_count is always 0 here; it is not index coverage.", "inputSchema": { "additionalProperties": false, "description": "Input schema for universal hybrid library search.", "properties": { "exclude_clothing_item_ids": { "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" }, "item_types": { "default": null, "description": "Optional item types to search. Omit to search clothing, avatars/models, locations, art directions, uploaded files, and generation results.", "items": { "enum": [ "clothing_item", "avatar", "location", "art_direction", "uploaded_file", "generation_result" ], "type": "string" }, "type": "array" }, "limit": { "default": 10, "description": "Maximum number of hybrid matches to return", "maximum": 50, "minimum": 1, "type": "integer" }, "query": { "description": "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.", "minLength": 2, "type": "string" }, "refresh_index": { "default": false, "description": "Deprecated compatibility input. No index refresh is performed, even when true. Search uses the maintained index and current lexical metadata. Leave false.", "type": "boolean" } }, "required": [ "query" ], "type": "object" }, "name": "search_uwear_library", "outputSchema": null }, { "description": "Submit a bug report or feature request to Uwear and return a private receipt. This creates a support record and can notify Uwear staff. Call it only when the user explicitly asks to submit, send, or report feedback, or after they confirm the exact summary. Never submit automatically because an error occurred, and never include the full conversation, credentials, secrets, raw provider payloads, or private URLs.", "inputSchema": { "additionalProperties": false, "description": "Input schema for confirmed product feedback submissions.", "properties": { "feedback_type": { "description": "Use bug_report for broken behavior or feature_request for an idea or improvement.", "enum": [ "bug_report", "feature_request" ], "type": "string" }, "message": { "description": "The report the user explicitly approved. Include useful reproduction details, but never add secrets, credentials, full conversation history, raw provider payloads, or private URLs.", "maxLength": 10000, "minLength": 1, "type": "string" }, "related_generation_id": { "default": null, "description": "Optional Uwear generation ID directly related to the report.", "minimum": 1, "type": "integer" }, "related_generation_result_id": { "default": null, "description": "Optional Uwear generation-result ID directly related to the report.", "minimum": 1, "type": "integer" }, "request_id": { "description": "Stable unique ID for this submission. Reuse the same value only when retrying the same report.", "maxLength": 128, "minLength": 8, "type": "string" }, "subject": { "default": null, "description": "Short summary of the confirmed report.", "maxLength": 200, "minLength": 1, "type": "string" } }, "required": [ "request_id", "feedback_type", "message" ], "type": "object" }, "name": "submit_uwear_feedback", "outputSchema": null }, { "description": "Update a company ArtDirection. System ArtDirections are read-only. When changing markdown directly, preserve the Variation Controls parser contract: reusable alternatives must be under `## Variation Controls`, not only in prose.", "inputSchema": { "$defs": { "ArtDirectionReferenceImage": { "description": "Authoring-only visual reference attached to an ArtDirection.\n\nThese references help regenerate or iterate the markdown document; they are\nnot passed to fashion generation requests just because the ArtDirection is\nselected.", "properties": { "source_id": { "description": "ID of the referenced asset.", "minimum": 1, "type": "integer" }, "source_type": { "$ref": "#/$defs/ArtDirectionReferenceImageSourceType", "description": "Asset kind used only for ArtDirection authoring context." } }, "required": [ "source_type", "source_id" ], "type": "object" }, "ArtDirectionReferenceImageSourceType": { "enum": [ "uploaded_file", "generation_result", "clothing_item", "avatar", "location" ], "type": "string" } }, "description": "Input schema for updating a company ArtDirection.", "properties": { "art_direction_id": { "description": "The ArtDirection ID to update", "minimum": 1, "type": "integer" }, "content_markdown": { "default": null, "description": "Updated complete ArtDirection markdown. If editing directly, every reusable alternative that should rotate across generations must live under `## Variation Controls` as `###` controls with `A. Option` lines; do not leave selectable worlds, pose families, or shot-role plans only in prose.", "maxLength": 50000, "minLength": 1, "type": "string" }, "name": { "default": null, "description": "Updated ArtDirection name", "maxLength": 200, "minLength": 1, "type": "string" }, "reference_image_attachments": { "default": null, "description": "Replacement authoring reference image attachments. These are for iterating the markdown only, not generation-time references.", "items": { "$ref": "#/$defs/ArtDirectionReferenceImage" }, "type": "array" } }, "required": [ "art_direction_id" ], "type": "object" }, "name": "update_art_direction", "outputSchema": null }, { "description": "Replace the visible Uwear BriefProposal with a complete canonical command list. Edit commands[].input directly using the MCP-safe GenerationIntent fields and preserve every unchanged field and durable source. This is replacement state, not a partial diff. For video_garment_view_not_attached warnings, follow the capacity-aware remediation: never mix reference_attachments with img_ref_urls or append recommendations beyond remaining capacity. Include updated creative_context for photoshoot rewrites and explain the changed art direction. Webhook callback configuration is API-only.", "inputSchema": { "$defs": { "GenerationCommand": { "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" }, "GenerationIntent": { "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" }, "GenerationReferenceAttachmentInput": { "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" } }, "description": "Input schema for updating a visible brief without immediate execution.", "properties": { "commands": { "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" }, "creative_context": { "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" } }, "required": [ "commands" ], "type": "object" }, "name": "update_brief", "outputSchema": null }, { "description": "Update a garment's metadata or patch its product photos. Send image changes through assets[] with front/back/side/detail roles. Provided front/back assets replace those singleton roles; provided side/detail assets are added. Omitted existing assets are preserved.", "inputSchema": { "$defs": { "OpenAIFile": { "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" }, "UpdateGarmentAssetInput": { "description": "One classified garment asset patch.", "properties": { "asset_kind": { "default": null, "description": "Asset kind: full garment view or detail crop.", "enum": [ "full", "detail" ], "type": "string" }, "asset_role": { "default": null, "deprecated": true, "description": "Deprecated role-only adapter. Prefer asset_kind and asset_view.", "enum": [ "front", "back", "side", "detail" ], "type": "string" }, "asset_url": { "default": null, "description": "Public HTTP(S) image URL for this asset", "type": "string" }, "asset_view": { "default": null, "description": "Visible garment view. New detail uploads require front, back, or side.", "enum": [ "front", "back", "side", "unspecified" ], "type": "string" }, "file_name": { "default": null, "description": "Original file name for this asset", "type": "string" }, "image_file": { "default": null, "description": "MCP host file object, or the name of a generic top-level file param such as image_file_1." }, "mime_type": { "default": null, "description": "MIME/content type for this asset, e.g. image/png", "type": "string" } }, "type": "object" } }, "description": "Input schema for updating garment metadata and images.", "properties": { "assets": { "default": null, "description": "Asset patch for garment product photos. A provided full front/back/side replaces that unique view; provided detail assets are added. Omitted existing assets are preserved.", "items": { "$ref": "#/$defs/UpdateGarmentAssetInput" }, "type": "array" }, "category": { "default": null, "description": "Updated canonical garment category", "enum": [ "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" ], "type": "string" }, "clothing_item_id": { "description": "The garment ID to update", "type": "integer" }, "description": { "default": null, "description": "Updated item-level garment description, or a hint to use when patching images", "type": "string" }, "gender": { "default": null, "description": "Updated target gender: male, female, or unisex", "type": "string" }, "image_file_1": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_10": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_11": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_12": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_13": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_14": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_15": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_16": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_17": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_18": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_19": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_2": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_20": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_3": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_4": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_5": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_6": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_7": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_8": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "image_file_9": { "$ref": "#/$defs/OpenAIFile", "description": "Generic top-level MCP file object for assets[].image_file references" }, "name": { "default": null, "description": "Updated garment name", "minLength": 1, "type": "string" } }, "required": [ "clothing_item_id" ], "type": "object" }, "name": "update_garment", "outputSchema": null }, { "description": "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.", "inputSchema": { "$defs": { "MontagePatchOpInput": { "description": "A typed montage patch operation applied in order.", "properties": { "apply_to_all": { "default": false, "description": "Apply this operation to every clip in the current montage proposal.", "type": "boolean" }, "aspect_ratio": { "default": null, "description": "Aspect ratio value for set_aspect_ratio.", "type": "string" }, "base_resolution": { "default": null, "description": "Resolution value for set_base_resolution.", "maximum": 4320, "minimum": 360, "type": "integer" }, "clip_number": { "default": null, "description": "1-based clip number target.", "minimum": 1, "type": "integer" }, "clip_numbers": { "default": null, "description": "Optional list of 1-based clip numbers to target together.", "items": { "type": "integer" }, "type": "array" }, "end_time": { "default": null, "description": "Trim end time in seconds for set_trim_range.", "exclusiveMinimum": 0, "type": "number" }, "generate_audio": { "default": null, "description": "Generate-audio value for set_generate_audio.", "type": "boolean" }, "last_frame_url": { "default": null, "description": "Last-frame URL for set_last_frame.", "type": "string" }, "muted": { "default": null, "description": "Muted value for set_muted.", "type": "boolean" }, "op": { "description": "Patch operation to apply to the montage proposal.", "enum": [ "remove", "clear_trim", "set_duration", "set_trim_range", "set_speed", "set_muted", "set_prompt", "set_video_model", "set_generate_audio", "set_last_frame", "set_aspect_ratio", "set_base_resolution" ], "type": "string" }, "prompt": { "default": null, "description": "Motion prompt for set_prompt.", "type": "string" }, "speed": { "default": null, "description": "Playback speed multiplier for set_speed.", "maximum": 4, "minimum": 0.25, "type": "number" }, "start_time": { "default": null, "description": "Trim start time in seconds for set_trim_range.", "minimum": 0, "type": "number" }, "target_duration": { "default": null, "description": "Desired final clip length in seconds for set_duration.", "exclusiveMinimum": 0, "type": "number" }, "video_model": { "default": null, "description": "Video model for set_video_model.", "type": "string" } }, "required": [ "op" ], "type": "object" } }, "description": "Patch the latest montage proposal shown in the UI.", "properties": { "apply_to_all": { "default": false, "description": "Apply changes to every clip in the current montage proposal.", "type": "boolean" }, "aspect_ratio": { "default": null, "description": "Update the montage output aspect ratio.", "type": "string" }, "base_resolution": { "default": null, "description": "Update the montage output resolution height.", "maximum": 4320, "minimum": 360, "type": "integer" }, "clear_trim": { "default": false, "description": "For video clips, remove trim bounds and restore the full clip length in the proposal.", "type": "boolean" }, "clip_number": { "default": null, "description": "1-based clip number to update. Omit when apply_to_all=true.", "minimum": 1, "type": "integer" }, "clip_numbers": { "default": null, "description": "Optional list of 1-based clip numbers to update together.", "items": { "type": "integer" }, "type": "array" }, "end_time": { "default": null, "description": "Trim end time in seconds for legacy trim-range updates.", "exclusiveMinimum": 0, "type": "number" }, "generate_audio": { "default": null, "description": "Enable or disable generated audio for image-to-video montage items.", "type": "boolean" }, "last_frame_url": { "default": null, "description": "Optional last-frame URL for image-to-video montage items.", "type": "string" }, "muted": { "default": null, "description": "Mute or unmute the selected clip(s).", "type": "boolean" }, "operations": { "default": null, "description": "Ordered montage patch operations. Preferred over the legacy flat fields below.", "items": { "$ref": "#/$defs/MontagePatchOpInput" }, "type": "array" }, "prompt": { "default": null, "description": "Update the motion prompt for image-to-video montage items.", "type": "string" }, "remove": { "default": false, "description": "Remove the selected clip(s) from the proposal.", "type": "boolean" }, "speed": { "default": null, "description": "Playback speed multiplier.", "maximum": 4, "minimum": 0.25, "type": "number" }, "start_time": { "default": null, "description": "Trim start time in seconds for legacy trim-range updates.", "minimum": 0, "type": "number" }, "target_duration": { "default": null, "description": "Desired final clip length in seconds.", "exclusiveMinimum": 0, "type": "number" }, "video_model": { "default": null, "description": "Update the video model for image-to-video montage items.", "type": "string" } }, "type": "object" }, "name": "update_montage_proposal", "outputSchema": null }, { "description": "Update durable user preferences, photoshoot processes, or add a prompt. Treat all model fields as explicit model pins: leave model fields unset for normal backend defaults unless the user deliberately selected a specific model. The preferred way to save how a user generates is a template (save_template): a generation-preset template for reusable concrete single-shoot settings, a batch-workflow template for an ordered repeatable multi-shot flow — see the `Demo — …` system templates for worked examples. Use preferences for durable raw-text guidance that is not a concrete shoot setup.", "inputSchema": { "description": "Input schema for updating user preferences.", "properties": { "add_prompt": { "additionalProperties": true, "default": null, "description": "Prompt to save: {text, category, is_favorite}", "type": "object" }, "preferences": { "additionalProperties": true, "default": null, "description": "Preference key-value updates. Model fields (default_model, default_edit_model, default_upscale_model, default_video_model, and process-level model) are explicit pins only; leave them unset for backend defaults. Prefer a generation-preset template for reproducible concrete shoot settings and a batch-workflow template for an ordered multi-shot flow. Other fields include default_aspect_ratio, preferred_camera, default_resolution, photoshoot_processes, etc. Processes format: [{name, model, camera, aspect_ratio, resolution, prompt, num_images, pipeline: [{type, editModel, editPrompt, ...}], is_default}]", "type": "object" } }, "type": "object" }, "name": "update_preferences", "outputSchema": null }, { "description": "Batch upload reusable avatars/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 generate_avatar followed by save_generated_avatar for Uwear-created avatars. Use only when the user explicitly wants a specific or consistent person.", "inputSchema": { "$defs": { "AvatarChatFileUploadItem": { "additionalProperties": false, "description": "One avatar/model upload item for chat-file batch upload.", "properties": { "age_range": { "default": null, "description": "Optional concrete age or age range. Never inferred.", "maxLength": 20, "type": "string" }, "build": { "default": null, "description": "Optional concrete physical build. Never inferred.", "maxLength": 100, "type": "string" }, "description": { "additionalProperties": true, "default": null, "description": "Avatar metadata: {gender, age, body, ethnicity, hair_color, etc.}", "type": "object" }, "file_name": { "default": null, "description": "Original file name", "type": "string" }, "height_cm": { "default": null, "description": "Optional height in centimeters. Never inferred.", "maximum": 220, "minimum": 40, "type": "integer" }, "image_url": { "default": null, "description": "Resolved download URL. Used by the Uwear app when recovering a chat file ID.", "type": "string" }, "mime_type": { "default": null, "description": "MIME/content type, e.g. image/png", "type": "string" }, "name": { "description": "Name for the avatar/model", "type": "string" } }, "required": [ "name" ], "type": "object" }, "OpenAIFile": { "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" } }, "additionalProperties": false, "description": "Input schema for uploading avatars/models from chat file references.", "properties": { "age_range": { "default": null, "description": "Optional concrete age or age range. Never inferred.", "maxLength": 20, "type": "string" }, "avatars": { "default": null, "description": "Avatar/model metadata in the same order as image_file_1, image_file_2, etc. No base64.", "items": { "$ref": "#/$defs/AvatarChatFileUploadItem" }, "maxItems": 10, "type": "array" }, "build": { "default": null, "description": "Optional concrete physical build. Never inferred.", "maxLength": 100, "type": "string" }, "description": { "additionalProperties": true, "default": null, "description": "Single recovered avatar metadata", "type": "object" }, "file_name": { "default": null, "description": "Single recovered original file name", "type": "string" }, "height_cm": { "default": null, "description": "Optional height in centimeters. Never inferred.", "maximum": 220, "minimum": 40, "type": "integer" }, "image_file_1": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_10": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_2": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_3": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_4": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_5": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_6": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_7": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_8": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_9": { "$ref": "#/$defs/OpenAIFile", "description": "Host-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_url": { "default": null, "description": "Single resolved download URL used by automatic opaque-file recovery.", "type": "string" }, "mime_type": { "default": null, "description": "Single recovered MIME/content type, e.g. image/png", "type": "string" }, "name": { "default": null, "description": "Single recovered avatar/model name", "type": "string" } }, "type": "object" }, "name": "upload_avatar_from_chat_file", "outputSchema": null }, { "description": "Batch upload garments from ChatGPT attachments. Defaults to background removal; pass processing_mode='none' to store original images as-is. Pass actual file objects only in top-level image_file_1, image_file_2, etc. Prefer garments[].assets with {asset_kind: full|detail, asset_view: front|back|side, image_file: 'image_file_N'}; exactly one full front is required, every full view is unique, and detail views can repeat. Do not rely on array position to pair assets; every asset must reference its exact top-level field name. No image_url here; use upload_garment_from_public_url for URLs. For local filesystem files, use prepare_local_garment_upload instead. No base64 and no local paths.", "inputSchema": { "$defs": { "GarmentChatFileAssetInput": { "description": "One classified garment asset for chat-file upload.", "properties": { "asset_kind": { "default": null, "description": "Asset kind: full garment view or detail crop.", "enum": [ "full", "detail" ], "type": "string" }, "asset_role": { "default": null, "deprecated": true, "description": "Deprecated role-only adapter. Prefer asset_kind and asset_view.", "enum": [ "front", "back", "side", "detail" ], "type": "string" }, "asset_view": { "default": null, "description": "Visible garment view. New detail uploads require front, back, or side.", "enum": [ "front", "back", "side", "unspecified" ], "type": "string" }, "file_name": { "default": null, "description": "Original file name for this asset", "type": "string" }, "image_file": { "description": "Name of the top-level ChatGPT file param for this asset, e.g. image_file_1.", "type": "string" }, "mime_type": { "default": null, "description": "MIME/content type for this asset, e.g. image/png", "type": "string" } }, "required": [ "image_file" ], "type": "object" }, "GarmentChatFileUploadItem": { "description": "One garment upload item for chat-file batch upload.", "properties": { "assets": { "default": null, "description": "Full garment asset set. Each asset references a top-level image_file_N field and declares asset_kind/asset_view. Exactly one full front is required; full front/back/side are unique and detail views can repeat.", "items": { "$ref": "#/$defs/GarmentChatFileAssetInput" }, "type": "array" }, "back_image_file": { "default": null, "description": "Legacy shortcut: optional top-level ChatGPT file param for the back image.", "type": "string" }, "description": { "default": null, "description": "Optional item-level garment description hint", "type": "string" }, "detail_image_files": { "default": null, "description": "Legacy shortcut: optional top-level ChatGPT file params for detail images.", "items": { "type": "string" }, "type": "array" }, "file_name": { "default": null, "description": "Original file name", "type": "string" }, "gender": { "default": null, "description": "Target gender: male, female, unisex", "type": "string" }, "image_file": { "default": null, "description": "Legacy shortcut: top-level ChatGPT file param for the front image, e.g. image_file_1.", "type": "string" }, "mime_type": { "default": null, "description": "MIME/content type, e.g. image/png", "type": "string" }, "name": { "default": null, "description": "Name for the garment. If omitted, derived from the image filename.", "type": "string" }, "processing_mode": { "default": null, "description": "Optional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal.", "type": "string" }, "side_image_file": { "default": null, "description": "Legacy shortcut: optional top-level ChatGPT file param for the side image.", "type": "string" } }, "type": "object" }, "OpenAIFile": { "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" } }, "description": "Input schema for uploading garments from chat file references.", "properties": { "garments": { "description": "Garment metadata. Put files in top-level image_file_1..image_file_20 and reference those exact field names inside each garment. No base64.", "items": { "$ref": "#/$defs/GarmentChatFileUploadItem" }, "maxItems": 10, "minItems": 1, "type": "array" }, "image_file_1": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_10": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_11": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_12": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_13": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_14": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_15": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_16": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_17": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_18": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_19": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_2": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_20": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_3": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_4": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_5": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_6": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_7": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_8": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." }, "image_file_9": { "$ref": "#/$defs/OpenAIFile", "description": "Top-level ChatGPT file attachment. In garments[], reference this exact field name from assets[].image_file, e.g. image_file='image_file_1'. Do not rely on item order." } }, "required": [ "garments" ], "type": "object" }, "name": "upload_garment_from_chat_file", "outputSchema": null }, { "description": "Queue a recoverable batch upload from public HTTP(S) image URLs and return an operation immediately. Retry with the exact same arguments to read the stable operation state; retries do not create another upload. Defaults to background removal; pass processing_mode='none' to store original images as-is. 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. For ChatGPT attachments, use upload_garment_from_chat_file instead. For local filesystem files, use prepare_local_garment_upload instead. No base64, chat file objects, or local paths.", "inputSchema": { "$defs": { "GarmentPublicUrlAssetInput": { "description": "One classified garment asset for public URL upload.", "properties": { "asset_kind": { "default": null, "description": "Asset kind: full garment view or detail crop.", "enum": [ "full", "detail" ], "type": "string" }, "asset_role": { "default": null, "deprecated": true, "description": "Deprecated role-only adapter. Prefer asset_kind and asset_view.", "enum": [ "front", "back", "side", "detail" ], "type": "string" }, "asset_url": { "default": null, "description": "Public HTTP(S) image URL for this asset", "type": "string" }, "asset_view": { "default": null, "description": "Visible garment view. New detail uploads require front, back, or side.", "enum": [ "front", "back", "side", "unspecified" ], "type": "string" }, "file_name": { "default": null, "description": "Original file name for this asset", "type": "string" }, "image_url": { "default": null, "description": "Alias for asset_url", "type": "string" }, "mime_type": { "default": null, "description": "MIME/content type for this asset, e.g. image/png", "type": "string" } }, "type": "object" }, "GarmentPublicUrlUploadItem": { "description": "One garment upload item for public URL batch upload.", "properties": { "assets": { "default": null, "description": "Full garment asset set using asset_kind/asset_view. Exactly one full front is required; full views are unique and detail views can repeat.", "items": { "$ref": "#/$defs/GarmentPublicUrlAssetInput" }, "type": "array" }, "back_image_url": { "default": null, "description": "Legacy shortcut: optional public HTTP(S) back image URL", "type": "string" }, "description": { "default": null, "description": "Optional item-level garment description hint", "type": "string" }, "detail_image_urls": { "default": null, "description": "Legacy shortcut: optional public HTTP(S) detail image URLs", "items": { "type": "string" }, "type": "array" }, "file_name": { "default": null, "description": "Original file name", "type": "string" }, "gender": { "default": null, "description": "Target gender: male, female, unisex", "type": "string" }, "image_url": { "default": null, "description": "Legacy shortcut: public HTTP(S) front image URL", "type": "string" }, "mime_type": { "default": null, "description": "MIME/content type, e.g. image/png", "type": "string" }, "name": { "default": null, "description": "Name for the garment. If omitted, derived from the image filename.", "type": "string" }, "processing_mode": { "default": null, "description": "Optional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal.", "type": "string" }, "side_image_url": { "default": null, "description": "Legacy shortcut: optional public HTTP(S) side image URL", "type": "string" } }, "type": "object" } }, "description": "Input schema for uploading garments from public URLs.", "properties": { "assets": { "default": null, "description": "Single garment full asset set. Use asset_kind/asset_view. Exactly one full front is required; full views are unique and detail views can repeat.", "items": { "$ref": "#/$defs/GarmentPublicUrlAssetInput" }, "type": "array" }, "back_image_url": { "default": null, "description": "Single optional public HTTP(S) back image URL", "type": "string" }, "description": { "default": null, "description": "Single item-level garment description hint", "type": "string" }, "detail_image_urls": { "default": null, "description": "Single optional public HTTP(S) detail image URLs", "items": { "type": "string" }, "type": "array" }, "file_name": { "default": null, "description": "Single original file name", "type": "string" }, "garments": { "default": null, "description": "Garments to upload from public HTTP(S) URLs. No chat file objects and no base64.", "items": { "$ref": "#/$defs/GarmentPublicUrlUploadItem" }, "maxItems": 50, "type": "array" }, "gender": { "default": null, "description": "Single garment gender: male, female, unisex", "type": "string" }, "image_url": { "default": null, "description": "Single public HTTP(S) front image URL", "type": "string" }, "mime_type": { "default": null, "description": "Single MIME/content type, e.g. image/png", "type": "string" }, "name": { "default": null, "description": "Single garment name", "type": "string" }, "processing_mode": { "default": null, "description": "Optional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal.", "type": "string" }, "side_image_url": { "default": null, "description": "Single optional public HTTP(S) side image URL", "type": "string" } }, "type": "object" }, "name": "upload_garment_from_public_url", "outputSchema": null }, { "description": "Analyze any image using AI vision for manual inspection, debugging, visual description, or supplemental critique. Provide exactly one source: attachment_type together with attachment_id for a workspace record, generation_result_id for a Shoot Board generation, uploaded_file_id for a Files item, or image_url for a public HTTPS image. Do not use this as the primary QA mechanism when the user asks to QA, quality-check, validate, review, approve/reject, or assess generated results; for QA requests use queue_generation_result_qa first, then read_generation_result_qa.", "inputSchema": { "additionalProperties": false, "description": "Input schema for viewing and analyzing any image using AI vision.", "properties": { "attachment_id": { "default": null, "description": "ID of the workspace record to view. Supply together with attachment_type.", "minimum": 1, "type": "integer" }, "attachment_type": { "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" }, "generation_result_id": { "default": null, "description": "ID of an existing generation result to analyze. Preferred for Shoot Board generation items because the server resolves the HTTPS image URL.", "minimum": 1, "type": "integer" }, "image_url": { "default": null, "description": "Public HTTPS image URL to analyze. Optional if generation_result_id or uploaded_file_id is provided.", "type": "string" }, "question": { "description": "What to analyze: e.g. 'Is this a flat lay or worn on a model?', 'Does this need background removal?', 'Describe the garment details'. Do not use this as the primary tool for generation-result QA; use queue_generation_result_qa and read_generation_result_qa for QA requests.", "maxLength": 4000, "minLength": 1, "type": "string" }, "uploaded_file_id": { "default": null, "description": "ID of an uploaded file to analyze. Use for items from the Files library.", "minimum": 1, "type": "integer" } }, "required": [ "question" ], "type": "object" }, "name": "view_image", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:ae8b4c0a876c372f9655f2ad6f8e7f8c5b2f641604791b5acc602bbe50f4a46e | sha256sum