{"catalogSchemaVersion":1,"release":{"id":"3.0.0+mcp.2026-10-05.1","name":"SeamUI","applicationVersion":"3.0.0","protocolVersion":"2026-07-28","capabilityContractVersion":"2026-10-05.1"},"registry":{"submission":"not-submitted","review":"no-review-recorded","approval":"no-approval-recorded","label":"Not submitted. No registry review or approval is recorded."},"endpointPath":"/api/mcp","setupPath":"/mcp","recipesPath":"/mcp/recipes","availability":{"transportEnabled":true,"admissionEnabled":true},"qualification":{"state":"pending","supportedHosts":[]},"tools":[{"name":"catalog.models","title":"List models","description":"List active SeamUI model routes, what each can do (uses: text-to-image, image-edit, text-to-video, animate-image, first-last-frame, video-edit, ...), their input slots and safe limits.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"none","output":"ModelRouteContract","owner":"lib/shared/models/asset-model-registry.ts","useCaseIds":["SC-01","SC-12"],"entitlement":"workspace-access"}},{"name":"workspace.context.read","title":"Read Workspace context","description":"Read fresh operational context for the connected Workspace.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"workspaceId","output":"WorkspaceContextSummary","owner":"lib/server/use-cases/content/workspace-context.ts","useCaseIds":["SC-04"],"entitlement":"workspace-access"}},{"name":"account.workspaces.list","title":"List my Workspaces","description":"List every Workspace of the connected SeamUI account, with the User's role, the plan, the member count and the number of images, videos and Assets. Read only: actions apply only to the current Workspace.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"none","output":"McpAccountWorkspace[]","owner":"lib/server/mcp/account-workspaces.ts","useCaseIds":["SC-04"],"entitlement":"workspace-access"}},{"name":"projects.list","title":"List Projects","description":"List Projects in the connected Workspace.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"cursor":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":100}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"ProjectPageQuery","output":"SafeProject[]","owner":"lib/server/use-cases/content/project-queries.ts","useCaseIds":["SC-05"],"entitlement":"workspace-access"}},{"name":"projects.read","title":"Read a Project","description":"Read one Project from the connected Workspace.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"workspaceId, slug","output":"Project","owner":"lib/server/use-cases/content/project-queries.ts","useCaseIds":["SC-05"],"entitlement":"none"}},{"name":"assets.list","title":"List images and videos","description":"Find images and videos, newest first, to resolve \"this image\" or \"my last video\". Lists safe Asset metadata, including orphaned Assets, in the connected Workspace. A created Asset carries url, its public permanent media URL.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"cursor":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":100},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["image","video"]},"status":{"type":"string","minLength":1,"maxLength":32}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"AssetPageQuery","output":"GeneratedAsset[]","owner":"lib/server/use-cases/content/asset-queries.ts","useCaseIds":["SC-05"],"entitlement":"workspace-access"}},{"name":"assets.read","title":"Read an Asset","description":"Read safe metadata for one Asset in the connected Workspace, including url, its public permanent media URL once created.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["assetId"],"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"assetId","output":"SafeAsset","owner":"lib/server/use-cases/content/asset-queries.ts","useCaseIds":["SC-05"],"entitlement":"workspace-access"}},{"name":"assets.generation.read","title":"Read how an Asset was made","description":"Read the prompt, model, settings and reference files that produced one image or video, to show them, regenerate it, or make a variation. reuse holds ready arguments for images.generate or videos.generate. status not_generated means a trim, merge, frame, background or resize derivative: read its sourceAssetIds instead. status expired means the plan's history retention removed the prompt.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["assetId"],"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"assetId","output":"McpAssetGeneration","owner":"lib/server/mcp/asset-generation.ts","useCaseIds":["SC-06"],"entitlement":"workspace-access"}},{"name":"references.list","title":"List stored reference files","description":"List reusable reference identities already stored in the Workspace. To add a new file, use references.upload or references.import.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"cursor":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":100},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"reference","input":"workspaceId, projectId | null, limit","output":"ReferenceLibraryItem[] | VideoSourceAsset[]","owner":"lib/server/use-cases/content/reference-queries.ts","useCaseIds":["SC-05","SC-19"],"entitlement":"workspace-access"}},{"name":"assets.handoff","title":"Open in SeamUI","description":"Open a Project or Asset in the SeamUI app. Creates an authenticated SeamUI Dashboard link to one Project. For an Asset, the link opens the Project that contains it.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"assetId | projectId","output":"DashboardHandoffLink","owner":"lib/shared/use-cases/projections.ts","useCaseIds":["SC-07"],"entitlement":"workspace-access"}},{"name":"assets.content","title":"Read media bytes","description":"Return authenticated media bytes, for Hosts that need the bytes themselves rather than the public url. Images return MCP image content; videos return a poster or embedded file bytes. Originals above 8 MB require chunks. Pass objectVersion and objectEtag from the first chunk on every subsequent read, and assemble bytes by offset after checking each SHA-256.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"representation":{"type":"string","enum":["preview","poster","original","chunk"]},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"length":{"type":"integer","minimum":1,"maximum":1000000},"objectVersion":{"type":"string","minLength":1,"maxLength":256},"objectEtag":{"type":"string","minLength":1,"maxLength":128}},"required":["assetId","representation"],"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"assetId, representation, offset, length","output":"MCP image or embedded blob resource with safe media metadata","owner":"lib/server/mcp/media-content.ts","useCaseIds":["SC-05","SC-07"],"entitlement":"workspace-access"}},{"name":"actions.result","title":"Recover an action result","description":"Recover one operation by actionId, or by capability and the original idempotencyKey after response loss. Returns durable admission state, Asset IDs and available results, with the public media url of each created Asset. Do not resubmit generation after an uncertain response.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"actionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"capability":{"type":"string"},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"confirmation":"none","contract":{"kind":"status","input":"actionId","output":"SafeActionResult | not_recorded","owner":"lib/server/mcp/read-service.ts","useCaseIds":["SC-21"],"entitlement":"workspace-access"}},{"name":"projects.create","title":"Create a Project","description":"Create one Project. The shared slug policy tries the initial slug then suffixes -1 through -99. Keep actionId, also the stable Project ID. Missing evidence never permits automatic resubmission.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"name":{"type":"string","minLength":2,"maxLength":32},"description":{"type":"string","maxLength":250}},"required":["name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"write","input":"createProjectSchema","output":"CreateProjectResult","owner":"lib/server/use-cases/content/project-management.ts","useCaseIds":["SC-08","SC-11"],"entitlement":"none"}},{"name":"projects.update","title":"Update a Project","description":"Rename a Project, change its description, or change its provider preference. Keep actionId and use actions.result instead of repeating an uncertain change.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"mode":{"type":"string","const":"details"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":32},"description":{"type":"string","maxLength":250}},"required":["mode","projectId","name"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"preference"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"provider":{"type":"string","enum":["default","kie"]}},"required":["mode","projectId","provider"],"additionalProperties":false}]},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"write","input":"projectId, name, description | ProviderChoice","output":"void","owner":"lib/server/use-cases/content/project-management.ts","useCaseIds":["SC-08","SC-11"],"entitlement":"none"}},{"name":"assets.rename","title":"Rename an Asset","description":"Rename an image or video. Keep actionId and use actions.result instead of repeating an uncertain change.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":32}},"required":["assetId","name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"write","input":"assetId, name","output":"MutationResult","owner":"lib/server/use-cases/content/asset-organization.ts","useCaseIds":["SC-09","SC-11"],"entitlement":"workspace-access"}},{"name":"assets.move","title":"Move Assets to a Project","description":"Atomically move one or more images or videos to another Project. Keep actionId and use actions.result instead of repeating an uncertain change.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"assetIds":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"targetProjectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["assetIds","targetProjectId"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"write","input":"assetIds, targetProjectId","output":"MutationResult","owner":"lib/server/use-cases/content/asset-organization.ts","useCaseIds":["SC-09","SC-11"],"entitlement":"workspace-access"}},{"name":"prompts.read","title":"List saved prompts","description":"List the saved prompts of the Workspace prompt library, for images and videos. It does not hold the prompt that produced a given Asset.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"cursor":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":100},"kind":{"type":"string","enum":["image","video","all"]}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"confirmation":"none","contract":{"kind":"read","input":"workspaceId, kind","output":"PromptLibraryEntry[]","owner":"lib/server/use-cases/content/prompt-library.ts","useCaseIds":["SC-10"],"entitlement":"none"}},{"name":"prompts.write","title":"Save a prompt","description":"Save a new prompt to the Workspace prompt library, or update a saved one, for images or videos. Keep actionId and use actions.result instead of repeating an uncertain write.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"mode":{"type":"string","const":"create"},"kind":{"type":"string","enum":["image","video"]},"values":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["mode","kind","values"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"update"},"kind":{"type":"string","enum":["image","video"]},"promptId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"values":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["mode","kind","promptId","values"],"additionalProperties":false}]},"annotations":{"readOnlyHint":false,"destructiveHint":true},"confirmation":"connection-delegation","contract":{"kind":"write","input":"promptLibraryInputSchema | videoPromptLibraryInputSchema","output":"MutationResult","owner":"lib/server/use-cases/content/prompt-library.ts","useCaseIds":["SC-10","SC-11"],"entitlement":"none"}},{"name":"references.upload","title":"Upload a reference file","description":"Get an upload link for one local reference file (image, video or audio) when you can run a shell command. Declare its exact mediaKind, mime, size in bytes and lowercase hex SHA-256 (for example from `shasum -a 256`). Then run the returned command within 15 minutes: the link accepts only that exact file, POSTed raw, and answers with source={type:reference-source,id} and url, the public file. Put that source as {kind:stored,source} in images.generate references or a videos.generate attachment. Limits: image jpeg/png/webp up to 2 MB (resize larger photos first), video mp4/quicktime up to 10 MB, audio mpeg/wav up to 5 MB. The same file always gives the same ID. Use the source in a generation within 24 hours: an unused source is then deleted. If your sandbox blocks the SeamUI host (HTTP 403 host_not_allowed), follow ifHostBlocked instead of retrying. Never paste file bytes or base64 into a tool call.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"mediaKind":{"type":"string","enum":["image","video","audio"]},"name":{"type":"string","minLength":1,"maxLength":255},"mime":{"type":"string","minLength":3,"maxLength":100},"size":{"type":"integer","minimum":1,"maximum":10485760},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"}},"required":["mediaKind","name","mime","size","sha256"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"confirmation":"connection-delegation","contract":{"kind":"write","input":"mediaKind, name, mime, size, sha256","output":"McpReferenceUploadLink, then the stored reference-source identity from the link","owner":"lib/server/mcp/reference-media.ts","useCaseIds":["SC-19"],"entitlement":"workspace-access"}},{"name":"references.import","title":"Import a reference from a URL","description":"Store one public https image, video or audio file as a reference, from its URL. A SeamUI media url returned by another tool is reused without copying. Set mediaKind when the server does not send a media Content-Type. Returns source and url. Put source as {kind:stored,source} in images.generate references or a videos.generate attachment. Same limits as references.upload. Use references.upload instead for a local file.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"url":{"type":"string","maxLength":2048,"format":"uri"},"mediaKind":{"type":"string","enum":["image","video","audio"]},"name":{"type":"string","minLength":1,"maxLength":255}},"required":["url"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"confirmation":"connection-delegation","contract":{"kind":"write","input":"url, mediaKind?, name?","output":"Stored asset or reference-source identity","owner":"lib/server/mcp/reference-media.ts","useCaseIds":["SC-19"],"entitlement":"workspace-access"}},{"name":"images.generate","title":"Generate or edit images","description":"MANDATORY: before anything that creates 4 images or videos or more in total (several calls, parallel calls, retries, lists, CSV rows), tell the User the exact count, say it bills their own provider account, and wait for an explicit yes. No yes, no call. Set requestTotal to that total on every call. SeamUI refuses, and starts nothing, without the costConfirmation code its refusal gives. Create images from a prompt, or edit, restyle or make variations of an existing image by passing it as a reference (route uses include image-edit in catalog.models). Image count: by default one call generates imageCount images (1 to 10) from the single prompt in form.prompts. When the catalog.models route lists imagesPerRequestedImage, each requested image returns that many (withReference once a reference image is attached), and all of them are billed: count them in requestTotal. To try several prompts with the same model, settings and references (variations of a prompt, one image each), put up to 10 prompts in form.prompts and set form.onePromptOneImage to true: one image per prompt, imageCount is ignored. Several prompts without onePromptOneImage are refused. Past 500 images per Workspace in one rolling hour, the call is refused, nothing starts, and the refusal explains how to continue: ask the User, then resend with its hourlyLimitConfirmation code. Supply form.provider, form.model and form.prompts; omitted settings use the shown defaults. Stored source IDs are accepted: get one for a local or online file with references.upload or references.import. Keep actionId and read status instead of repeating uncertain work. Each created Asset carries url, its public permanent media URL, to display, download or reuse the file.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"projectId":{"type":"string","minLength":1,"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"form":{"type":"object","properties":{"provider":{"type":"string","enum":["default","kie"]},"model":{"type":"string","enum":["gpt-image-2.5-flare","gpt-image-2.5-sunburst","gpt-image-2","gpt-image-1.5","gpt-image-1","gpt-image-1-mini","gemini-nano-banana-2.1","gemini-3.1-flash-image-preview","gemini-3-pro-image-preview","gemini-2.5-flash-image","flux-2-pro","flux-2-max","flux-3","flux-kontext-pro","flux-kontext-max","grok-imagine-image-quality","grok-imagine-image","qwen"]},"prompts":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1,"maxLength":32000}},"onePromptOneImage":{"default":false,"type":"boolean"},"imageCount":{"default":1,"type":"integer","minimum":1,"maximum":10},"dimensions":{"default":"1024x1024","type":"string"},"background":{"default":"auto","type":"string","enum":["auto","transparent","opaque"]},"moderation":{"default":"auto","type":"string","enum":["auto","low"]},"outputFormat":{"default":"png","type":"string","enum":["png","jpeg","webp"]},"outputCompression":{"default":100,"type":"integer","minimum":0,"maximum":100},"quality":{"default":"auto","type":"string","enum":["auto","max","xhigh","high","medium","low","hd","standard"]},"style":{"default":"vivid","type":"string","enum":["vivid","natural"]},"inputFidelity":{"default":"high","type":"string","enum":["low","high"]},"aspectRatio":{"default":"1:1","type":"string","enum":["auto","1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9","9:21","1:4","4:1","1:8","8:1","2:1","1:2","19.5:9","9:19.5","20:9","9:20","5:2"]},"seed":{"type":"integer","minimum":0,"maximum":9007199254740991},"safetyTolerance":{"default":2,"type":"integer","minimum":0,"maximum":6},"enableTranslation":{"default":true,"type":"boolean"},"promptUpsampling":{"default":false,"type":"boolean"},"uploadCn":{"default":false,"type":"boolean"},"nsfwChecker":{"default":false,"type":"boolean"},"enablePro":{"default":false,"type":"boolean"},"disablePup":{"default":false,"type":"boolean"},"thinkingLevel":{"default":"minimal","type":"string"},"watermark":{"default":"","type":"string"},"resolution":{"default":"1K","type":"string","enum":["512","1K","2K","4K","1k","2k"]}},"required":["provider","model","prompts"],"additionalProperties":false},"references":{"maxItems":64,"type":"array","items":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","const":"upload"},"mime":{"type":"string"},"size":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sha256":{"type":"string","minLength":64,"maxLength":64,"pattern":"^[0-9a-f]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["kind","mime","size","sha256","width","height"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"stored"},"source":{"type":"object","properties":{"type":{"type":"string","enum":["asset","reference-source"]},"id":{"type":"string","minLength":1,"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["type","id"],"additionalProperties":false}},"required":["kind","source"],"additionalProperties":false}]}},"mask":{"anyOf":[{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","const":"upload"},"mime":{"type":"string"},"size":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sha256":{"type":"string","minLength":64,"maxLength":64,"pattern":"^[0-9a-f]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["kind","mime","size","sha256","width","height"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"stored"},"source":{"type":"object","properties":{"type":{"type":"string","enum":["asset","reference-source"]},"id":{"type":"string","minLength":1,"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["type","id"],"additionalProperties":false}},"required":["kind","source"],"additionalProperties":false}]},{"type":"null"}]},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"requestTotal":{"description":"Required. Total images and videos the User's whole request creates, over every call, retry and parallel call. At 4 or more, ask the User first.","type":"integer","minimum":1,"maximum":1000},"costConfirmation":{"description":"Only the code from a cost_confirmation_required refusal, sent after the User said yes.","type":"string","pattern":"^[A-Za-z0-9_-]{1,512}$"},"hourlyLimitConfirmation":{"description":"Only the code from an hourly_image_limit refusal, sent after the User said yes.","type":"string","pattern":"^[A-Za-z0-9_-]{1,512}$"}},"required":["projectId","form","references","mask","idempotencyKey","requestTotal"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"generation","input":"ImageGenerationRequest","output":"PreparedImageGeneration","owner":"lib/shared/use-cases/generation/image-generation.ts","useCaseIds":["SC-12","SC-13","SC-19","SC-20"],"entitlement":"workspace-access"}},{"name":"videos.generate","title":"Generate or animate a video","description":"MANDATORY: before anything that creates 4 images or videos or more in total (several calls, parallel calls, retries, lists, CSV rows), tell the User the exact count, say it bills their own provider account, and wait for an explicit yes. No yes, no call. Set requestTotal to that total on every call. SeamUI refuses, and starts nothing, without the costConfirmation code its refusal gives. Each call creates 1 video: clips, shots of one merged video and model edits all count. Create a video from text, animate an image (image to video), go from a first to a last frame, or restyle a video with a model: pick the route in catalog.models by its uses. Ordered stored source IDs are accepted: get one for a local or online file with references.upload or references.import. Segments of one composed video are ordinary sequential calls. Keep actionId and read actions.result instead of resending uncertain work. Each created Asset carries url, its public permanent media URL, to display, download or reuse the file.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"input":{"type":"object","properties":{"model":{"type":"string"},"provider":{"type":"string","enum":["default","kie"]},"prompt":{"type":"string","maxLength":64000},"filledSlotKeys":{"maxItems":32,"type":"array","items":{"type":"string"}},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["model","provider","prompt","filledSlotKeys","settings"],"additionalProperties":false},"attachments":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"minItems":1,"maxItems":64,"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"stored"},"name":{"type":"string","minLength":1,"maxLength":255},"source":{"type":"object","properties":{"type":{"type":"string","enum":["asset","reference-source"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["type","id"],"additionalProperties":false}},"required":["kind","name","source"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"upload"},"name":{"type":"string","minLength":1,"maxLength":255},"mime":{"type":"string","minLength":1,"maxLength":100},"size":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"durationSeconds":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}]},"width":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"height":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["kind","name","mime","size","sha256","durationSeconds","width","height"],"additionalProperties":false}]}}},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"requestTotal":{"description":"Required. Total images and videos the User's whole request creates, over every call, retry and parallel call. At 4 or more, ask the User first.","type":"integer","minimum":1,"maximum":1000},"costConfirmation":{"description":"Only the code from a cost_confirmation_required refusal, sent after the User said yes.","type":"string","pattern":"^[A-Za-z0-9_-]{1,512}$"}},"required":["projectId","input","attachments","idempotencyKey","requestTotal"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"generation","input":"VideoGenerationRequest","output":"PreparedVideoGeneration","owner":"lib/shared/use-cases/generation/video-generation.ts","useCaseIds":["SC-12","SC-14","SC-19","SC-20"],"entitlement":"workspace-access"}},{"name":"images.transform","title":"Remove background or resize an image","description":"MANDATORY: before anything that creates 4 images or videos or more in total (several calls, parallel calls, retries, lists, CSV rows), tell the User the exact count, say it bills their own provider account, and wait for an explicit yes. No yes, no call. Set requestTotal to that total on every call. SeamUI refuses, and starts nothing, without the costConfirmation code its refusal gives. Each call creates 1 image. Remove the background or cut out a subject (remove_background), change the background color (update_background), or resize an image to new dimensions (resize). Upscaling, crop and deletion are not supported. The source version and exact settings remain sealed in an idempotent action. Each output counts toward the hourly image limit of images.generate. The created derivative carries url, its public permanent media URL.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"command":{"description":"Shared command without clientRequestId: schemaVersion=1, sourceAssetId=UUID, outputPolicy={createDerivative:true,preserveSource:true}, operation. resize: target={width,height,presetId:null|string}, fit=contain, aspectRatio=preserve, crop=false, upscaleSourcePixels=false, resampling=high_quality, padding={color:#RRGGBB}, output={formatPolicy:preserve_source_when_supported_else_png}. remove_background: utilitySelection={mode:auto}|{mode:explicit,utilityId}, dimensions={policy:preserve_source_exactly}, output={format:png}, acknowledgedContourRisk:boolean. update_background: background={kind:custom_solid,color:#RRGGBB} or shared preset, intermediateAssetPolicy=temporary_not_visible, output={formatPolicy:preserve_source_when_supported_else_png}, transparencyPolicy=skip_removal and acknowledgedContourRisk=false, or remove_if_needed with segmentationUtilitySelection and acknowledgedContourRisk. Unknown fields are refused.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"requestTotal":{"description":"Required. Total images and videos the User's whole request creates, over every call, retry and parallel call. At 4 or more, ask the User first.","type":"integer","minimum":1,"maximum":1000},"costConfirmation":{"description":"Only the code from a cost_confirmation_required refusal, sent after the User said yes.","type":"string","pattern":"^[A-Za-z0-9_-]{1,512}$"},"hourlyLimitConfirmation":{"description":"Only the code from an hourly_image_limit refusal, sent after the User said yes.","type":"string","pattern":"^[A-Za-z0-9_-]{1,512}$"}},"required":["command","idempotencyKey","requestTotal"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"transformation","input":"imageTransformationCommandSchema","output":"PreparedImageTransformation","owner":"lib/shared/use-cases/transformations/image-transformation.ts","useCaseIds":["SC-17"],"entitlement":"workspace-access"}},{"name":"videos.edit","title":"Merge or trim videos","description":"Merge, combine, join or stitch 2 to 8 videos end to end in the given order (op merge), or trim, cut or shorten one video (op trim). No provider call and no generation cost. Keep actionId and read actions.result; never automatically resend uncertain work.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"trim"},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"startSec":{"type":"number","minimum":0},"endSec":{"type":"number","exclusiveMinimum":0},"audio":{"type":"boolean"},"name":{"type":"string","maxLength":120}},"required":["op","idempotencyKey","assetId","startSec","endSec","audio"],"additionalProperties":false},{"type":"object","properties":{"op":{"type":"string","const":"merge"},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"assetIds":{"minItems":2,"maxItems":8,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"audio":{"type":"boolean"},"name":{"type":"string","maxLength":120}},"required":["op","idempotencyKey","assetIds","audio"],"additionalProperties":false}]},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"transformation","input":"EditVideoRequest","output":"PreparedVideoEdit","owner":"lib/shared/use-cases/transformations/video-edit.ts","useCaseIds":["SC-18"],"entitlement":"workspace-access"}},{"name":"videos.extract-frame","title":"Extract a video frame","description":"Save the first or last frame of a video as an image Asset: a still, a thumbnail, or the start image of the next shot. Keep actionId for actions.result; never automatically resend uncertain work.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"position":{"type":"string","enum":["first","last"]},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}},"required":["assetId","position","idempotencyKey"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"confirmation":"connection-delegation","contract":{"kind":"transformation","input":"FrameExtractionRequest","output":"PreparedFrameExtraction","owner":"lib/shared/use-cases/transformations/video-edit.ts","useCaseIds":["SC-18"],"entitlement":"workspace-access"}},{"name":"assets.status","title":"Check generation status","description":"Read bounded durable Asset status, safe failures, reported/calculated/unknown costs and, once created, the public media url. Follow the returned polling guidance (2 seconds minimum, backoff to 30 seconds, stop at terminal or unverified state). Never resubmit missing work. This read never dispatches or polls a provider.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"assetIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"preparedIntent":{"type":"string","minLength":1,"maxLength":1400000}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"confirmation":"none","contract":{"kind":"status","input":"reconcileRequestSchema","output":"AssetStatusProjection","owner":"lib/server/use-cases/status/reconcile-project-assets.ts","useCaseIds":["SC-23"],"entitlement":"none"}}],"implementedCapabilities":[{"id":"catalog.models","summary":"Discover active model routes, slots, settings, limits and transformation utilities.","runtimeEnabled":true},{"id":"workspace.context.read","summary":"Connected Workspace name, limits, usage and provider-key presence booleans.","runtimeEnabled":true},{"id":"account.workspaces.list","summary":"List every Workspace of the connected account with role, plan, member, image and video counts.","runtimeEnabled":true},{"id":"projects.list","summary":"List a bounded, deterministic page of Projects in the connected Workspace.","runtimeEnabled":true},{"id":"projects.read","summary":"Read one Project or the first Project of the Workspace.","runtimeEnabled":true},{"id":"assets.list","summary":"Bounded, deterministic Asset pages by Project or Workspace, orphaned Assets included by workspace_id.","runtimeEnabled":true},{"id":"assets.read","summary":"Read one safe Asset projection from the connected Workspace.","runtimeEnabled":true},{"id":"assets.generation.read","summary":"Read the prompt, settings and stored references that produced one Asset, with ready reuse arguments.","runtimeEnabled":true},{"id":"references.list","summary":"List reusable reference images and video source Assets of the Workspace.","runtimeEnabled":true},{"id":"assets.handoff","summary":"Authenticated Dashboard handoff link for an authorized Project or Asset.","runtimeEnabled":true},{"id":"assets.content","summary":"Authenticated image preview or original bytes, and video poster, original or bounded chunks.","runtimeEnabled":true},{"id":"actions.result","summary":"Read one completed safe action result for this active MCP Connection.","runtimeEnabled":true},{"id":"projects.create","summary":"Create a Project with slug collision handling and creator attribution.","runtimeEnabled":true,"mandatoryForLaunch":true,"state":"runtime-enabled-qualification-pending","prerequisites":["owner-applied-atomic-project-writer-correction","concurrency-replay-rollback-qualification"]},{"id":"projects.update","summary":"Rename or describe a Project, and change its generation route preference.","runtimeEnabled":true},{"id":"assets.rename","summary":"Rename one Asset.","runtimeEnabled":true},{"id":"assets.move","summary":"Move one or many Assets to another Project of the same Workspace, atomically.","runtimeEnabled":true},{"id":"prompts.read","summary":"List image and video prompt library entries of the Workspace.","runtimeEnabled":true},{"id":"prompts.write","summary":"Create or update an image or video prompt entry with actor attribution.","runtimeEnabled":true},{"id":"references.upload","summary":"Issue a sealed, single-file upload link that stores one reference image, video or audio file.","runtimeEnabled":true},{"id":"references.import","summary":"Store one public https image, video or audio file as a reference, or reuse a SeamUI media URL.","runtimeEnabled":true},{"id":"images.generate","summary":"Prepare and dispatch image generation with ordered references, mask and exact output count.","runtimeEnabled":true},{"id":"videos.generate","summary":"Prepare and dispatch video generation with typed ordered slots and upload bounds.","runtimeEnabled":true},{"id":"images.transform","summary":"Remove background, update background, or resize (never crop) an authorized image.","runtimeEnabled":true},{"id":"videos.edit","summary":"Trim one video or merge 2 to 8 ordered videos into a derived Asset.","runtimeEnabled":true},{"id":"videos.extract-frame","summary":"Extract the first or last frame of an authorized video as an image Asset.","runtimeEnabled":true},{"id":"assets.status","summary":"Durable Asset status by grouped IDs, pending until an authoritative terminal state.","runtimeEnabled":true}],"plannedCapabilities":[{"id":"assets.source.resolve","summary":"Resolve a reusable source Asset and its generation lineage by stable ID.","mandatoryForLaunch":false,"state":"implementation-pending"}],"exclusions":[{"id":"batches.prepare","summary":"Validate a CSV batch and register its rows with the Worker.","disposition":"excluded"},{"id":"batches.progress","summary":"Batch progress, safe row errors and terminal batch status.","disposition":"excluded"},{"id":"batches.dispatch-queue","summary":"Dashboard queue that dispatches registered batch rows through server-owned claims.","disposition":"excluded"},{"id":"images.crop","summary":"Crop is not an existing transformation: the resize command fixes crop to false.","disposition":"unavailable"},{"id":"projects.delete","summary":"Delete a Project, including an empty one.","disposition":"excluded"},{"id":"assets.delete","summary":"Soft-delete one or many Assets, including failed-card dismissal and batch discard.","disposition":"excluded"},{"id":"prompts.delete","summary":"Delete an image or video prompt entry.","disposition":"excluded"},{"id":"maintenance.content-cleanup","summary":"Scheduled cleanup of old deleted, failed and reference media. Cron only, never a user capability.","disposition":"excluded"},{"id":"exclusion.provider-keys","summary":"Read, add, replace or delete provider key values.","disposition":"excluded"},{"id":"exclusion.members","summary":"Member management and role changes.","disposition":"excluded"},{"id":"exclusion.workspace-lifecycle","summary":"Workspace creation, naming and switching. Listing the account's Workspaces is the read-only account.workspaces.list.","disposition":"excluded"},{"id":"exclusion.billing","summary":"Billing, checkout, plan redemption and billing data.","disposition":"excluded"},{"id":"exclusion.mcp-connection-control","summary":"SeamUI-only OAuth consent, Workspace binding, cancellation and Connection revocation. The setup tool only links to the authenticated page.","disposition":"excluded"},{"id":"exclusion.account","summary":"Global account, profile and onboarding operations.","disposition":"excluded"},{"id":"exclusion.inspirations","summary":"Inspiration browsing, suggestions and community submissions.","disposition":"excluded"},{"id":"exclusion.issue-reporting","summary":"Issue reporting and contact forms.","disposition":"excluded"},{"id":"exclusion.admin","summary":"Super-admin operations.","disposition":"excluded"},{"id":"exclusion.public-free-tools","summary":"Public SEO free tools and lead capture; a separate product, not a BYOK Workspace capability.","disposition":"excluded"},{"id":"exclusion.agent-workflow","summary":"Mission or agent workflow persistence; SeamUI schedules no workflow.","disposition":"excluded"}],"safety":{"workspaceBinding":"one-workspace-per-connection","ordinaryActions":"granted-with-oauth-consent-revocable","automaticResubmission":false,"polling":{"intervalsMs":[2000,4000,8000,16000,30000],"maxReadsPerWait":5,"maxWaitMs":60000,"stopOn":["terminal","unknown","unresolved","unavailable","expired","wait-budget-exhausted"]},"errorPolicy":"seamui-owned-copy-no-provider-details-or-target-disclosure"},"recipes":[{"id":"finite-agent-batch","title":"Generate a finite batch of images or videos","summary":"Run many independent images or videos as ordinary direct calls, one idempotent action per item, then check each result.","tools":["catalog.models","projects.list","images.generate","videos.generate","actions.result","assets.status"],"confirmation":"revocable-connection-delegation","continuation":"each-item-is-an-idempotent-action","steps":[{"instruction":"Count the whole batch first: imageCount images per images.generate call, or one per prompt with onePromptOneImage, times imagesPerRequestedImage when the catalog route lists it, and one per videos.generate call. At 4 images or videos or more, give the User the count, say it bills their own provider account, and wait for an explicit yes before the first call. Send that count as requestTotal on every call. SeamUI refuses from 4 and starts nothing until the agent resends with the costConfirmation code its refusal gives; send that code with every call of the batch. Past 500 images per Workspace in one rolling hour, SeamUI refuses again: ask the User, then resend the same call with its hourlyLimitConfirmation code. Each confirmation allows 500 more."},{"tool":"catalog.models","instruction":"Choose one current route per item, with supported settings and limits."},{"tool":"projects.list","instruction":"Choose an actual returned Project ID in the connected Workspace."},{"tool":"images.generate","instruction":"For each image item, call images.generate with that projectId, its own prompt and settings, and its own new idempotencyKey. Build the list yourself, for example one call per row of a table the User gave you. Prompts that share the same model, settings and references can go in one call with onePromptOneImage: one image per prompt. Keep every key and returned actionId."},{"tool":"videos.generate","instruction":"For each video item, call videos.generate with its exact input and its own new idempotencyKey. Independent videos may run in parallel. Keep every key and returned actionId."},{"tool":"actions.result","instruction":"After response loss, recover one item through actions.result with its capability and original idempotencyKey. Never resend an item whose delivery is unknown."},{"tool":"assets.status","instruction":"Read the returned actual assetIds in groups of up to 100. Follow returned polling guidance: wait at least 2 seconds, back off through 4, 8, 16 and 30 seconds, and stop after five reads or 60 seconds, whichever comes first. Report created, failed, pending and unknown items separately, with the url of each created item."}],"runtimeEnabled":true,"documentationPath":"/mcp/recipes#finite-agent-batch"},{"id":"finite-continuous-video","title":"Build a finite sequence of connected video segments","summary":"Create each segment from an actual frame and optionally merge them under one revocable Connection delegation.","tools":["catalog.models","projects.list","videos.generate","actions.result","assets.status","videos.extract-frame","videos.edit","assets.content"],"confirmation":"revocable-connection-delegation","continuation":"each-step-is-a-new-idempotent-action","steps":[{"tool":"catalog.models","instruction":"Choose current video routes, supported source slots, settings and limits, and a finite segment count from 1 to 8. This is one composed final video, not a batch of independent final videos. At 4 segments or more, give the User the count, say each segment bills their own provider account, and wait for an explicit yes before the first segment. Send the segment count as requestTotal on every segment call, with the costConfirmation code SeamUI gives."},{"tool":"projects.list","instruction":"Choose an actual returned Project ID in the connected Workspace."},{"tool":"videos.generate","instruction":"Generate the first segment with that projectId, input.model, input.provider, input.prompt, input.filledSlotKeys, input.settings, exact named stored attachments and a new idempotencyKey. Keep the key and returned actionId. After response loss, recover through actions.result with the key and videos.generate capability. To use a local or online file as an input, first store it with references.upload or references.import and bind the returned source as kind=stored."},{"tool":"assets.status","instruction":"Read the returned actual assetIds. Follow returned polling guidance: wait at least 2 seconds, back off through 4, 8, 16 and 30 seconds, and stop after five reads or 60 seconds, whichever comes first. Proceed only when one verified created video supplies its actual Asset ID. Stop on failed, unresolved, unknown or unavailable evidence. No automatic resend."},{"tool":"videos.extract-frame","instruction":"If another segment remains, call {assetId: the actual created video ID, position: last, idempotencyKey: a new key}. Retain this extraction's key and actionId."},{"tool":"assets.status","instruction":"Read the extraction's actual Asset ID within the same five-read or 60-second budget and polling backoff. Continue only with its verified created image Asset ID. Stop on terminal failure or any unknown or unavailable evidence."},{"tool":"videos.generate","instruction":"For the next segment, bind that actual image ID in a supported slot using kind=stored and source={type:asset,id:the returned image ID}. Give each new operation a new idempotencyKey, and keep that key across transport retries. Repeat only to the finite segment count and retain created video IDs in order."},{"tool":"videos.edit","instruction":"Optionally call {op:merge,assetIds:the 2 to 8 actual created video IDs in order,audio:the chosen boolean,name:the optional exact name,idempotencyKey:a new key}. The merge does not count toward the confirmation. A one-segment sequence needs no merge."},{"tool":"assets.status","instruction":"Verify the merge's returned Asset ID within the same bounded wait, or keep the verified segment if no merge was requested. Unknown delivery stops the sequence. If the budget ends, report current state and retain identifiers for a later authorized status check; do not repeat the action automatically."},{"tool":"assets.content","instruction":"Give the User the final video's url and posterUrl from assets.status: they are its public permanent media URLs. Only when the Host needs the bytes themselves, request the poster and metadata, then an inline original when accepted by the size bound; otherwise request consecutive authenticated chunks with nextOffset, objectVersion and objectEtag, verifying each SHA-256 and the total length."}],"runtimeEnabled":true,"documentationPath":"/mcp/recipes#finite-continuous-video"},{"id":"reuse-generation","title":"Regenerate or vary an existing image or video","summary":"Read the prompt, settings and references that produced an Asset, then run the same generation again with the User's changes.","tools":["assets.list","assets.generation.read","images.generate","videos.generate","assets.status"],"confirmation":"revocable-connection-delegation","continuation":"each-generation-is-a-new-idempotent-action","steps":[{"tool":"assets.list","instruction":"Find the Asset the User means, newest first, filtered by type or Project."},{"tool":"assets.generation.read","instruction":"Read its generation. On status not_generated, read the generation of its sourceAssetIds instead. On expired, say the prompt is no longer kept. Show the prompt and references when the User only asked what made it."},{"tool":"images.generate","instruction":"When reuse.tool is images.generate, call it with reuse.arguments, the User's changes to the prompt, settings or references, an actual projectId when it is null, and a new idempotencyKey. leftOut counts references that are no longer stored."},{"tool":"videos.generate","instruction":"When reuse.tool is videos.generate, do the same with its input and named stored attachments. Without reuse, pick a current route from catalog.models and bind the reusable references yourself."},{"tool":"assets.status","instruction":"Read the returned assetIds with the usual polling guidance and give the User the url of each created Asset. Never resend uncertain work."}],"runtimeEnabled":true,"documentationPath":"/mcp/recipes#reuse-generation"}]}