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

Server definition

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

The blob, as servednamed by its sha256

{ "instructions": "This endpoint exposes every hosted Compose Preview catalog. Use catalog_list_projects to discover catalog ids. Reading published previews needs preview access; made-to-order renders and data products need live access. With no credential, call request_access, show the human its approveUrl and userCode, then poll_access (which waits for the decision) until it answers approved. Send the token it returns as the X-Compose-Preview-Token header if you control your own headers; if you cannot set them — an MCP client fixes its headers when it connects — pass the token as the 'token' argument of each gated tool instead, and access approved during this session works in it. Your client did not declare URL elicitation: omit urlMode and show approveUrl and userCode in chat. A UI-builder document's `home` is canonical: edit that original, and never re-import it as a second design or move, save back, or discard it without the human explicitly choosing. Keep design discussion at that home: read and acknowledge its pending comments and post design-specific findings there; an external issue or pull-request link supplements but never replaces that discussion.", "tools": [ { "description": "Compare two previews' semantics by testTag: which tags are only in one side, which moved, and which changed occupancy count. Identity is the authored testTag, not a positional ref, so a tag that stops resolving is reported rather than silently retargeted at different pixels. Requires live grant scope.", "inputSchema": { "anyOf": [ { "required": [ "uri" ] }, { "required": [ "catalog", "previewId" ] } ], "properties": { "catalog": { "type": "string" }, "other": { "properties": { "catalog": { "type": "string" }, "previewId": { "type": "string" }, "uri": { "type": "string" } }, "type": "object" }, "otherOverrides": { "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "type": "object" }, "overrides": { "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "type": "object" }, "previewId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "required": [ "other" ], "type": "object" }, "name": "catalog_diff_semantics", "outputSchema": { "type": "object" } }, { "description": "Fetch the merged accessibility or annotation product for a preview. This lane requires live grant scope.", "inputSchema": { "anyOf": [ { "required": [ "uri" ] }, { "required": [ "catalog", "previewId" ] } ], "properties": { "catalog": { "type": "string" }, "kind": { "type": "string" }, "overrides": { "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "type": "object" }, "previewId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "required": [ "kind" ], "type": "object" }, "name": "catalog_get_preview_data", "outputSchema": { "type": "object" } }, { "description": "Compare two of a preview's recorded renders. Defaults to the two newest — did the last publish move this preview? A metadata comparison: the timeline's versions are already collapsed distinct renders, so whether the bytes changed is answered without fetching either image. Reports `unstable` so a difference on a nondeterministic preview is not mistaken for a real change.", "inputSchema": { "anyOf": [ { "required": [ "uri" ] }, { "required": [ "catalog", "previewId" ] } ], "properties": { "catalog": { "type": "string" }, "from": { "type": "string" }, "previewId": { "type": "string" }, "to": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "type": "object" }, "name": "catalog_history_diff", "outputSchema": { "type": "object" } }, { "description": "The render timeline for one preview: which versions of its rendered bytes exist, when each appeared, and whether the preview is unstable (re-renders differently on every publish) rather than genuinely changing. Where this server holds the timeline it is returned inline; where the catalog is published from a delivery branch the manifest lives on that branch and this reports where to fetch it.", "inputSchema": { "anyOf": [ { "required": [ "uri" ] }, { "required": [ "catalog", "previewId" ] } ], "properties": { "catalog": { "type": "string" }, "previewId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "type": "object" }, "name": "catalog_history_list", "outputSchema": { "type": "object" } }, { "description": "Fetch one historical render's pixels through this server, by `commit` or `blob` (a prefix is enough). Use when an agent cannot reach the delivery branch itself, or wants the bytes rather than the timeline.", "inputSchema": { "anyOf": [ { "required": [ "uri" ] }, { "required": [ "catalog", "previewId" ] } ], "properties": { "blob": { "type": "string" }, "catalog": { "type": "string" }, "commit": { "type": "string" }, "previewId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "type": "object" }, "name": "catalog_history_read", "outputSchema": { "type": "object" } }, { "description": "Open the hosted preview catalog browser app. With no arguments it lists every catalog with its preview count only; pass projectId to list one catalog's previews. To find previews without the app, call catalog_list_projects, then catalog_list_previews with a catalog id. Also opens from the ChatGPT/Codex sidebar.", "inputSchema": { "properties": { "projectId": { "description": "A catalog id from catalog_list_projects whose previews to list.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "catalog_library", "outputSchema": { "type": "object" } }, { "description": "List the structured data-product kinds of one catalog, optionally one preview. Name the catalog with 'catalog' (ids from catalog_list_projects) or a preview 'uri'.", "inputSchema": { "anyOf": [ { "required": [ "catalog" ] }, { "required": [ "uri" ] } ], "properties": { "catalog": { "type": "string" }, "previewId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "type": "object" }, "name": "catalog_list_data_products", "outputSchema": { "additionalProperties": false, "properties": { "dataProducts": { "items": { "type": "object" }, "type": "array" } }, "required": [ "dataProducts" ], "type": "object" } }, { "description": "List the `@Preview(device = ...)` ids this server's render lane recognises, with each one's dp size and density. The `device` override takes one of these ids; an unrecognised name renders the default frame rather than failing, so check here instead of guessing.", "inputSchema": { "properties": { "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "catalog_list_devices", "outputSchema": { "type": "object" } }, { "description": "List the Compose previews and published metadata of one hosted catalog. 'catalog' is required (ids from catalog_list_projects). Pass 'query' (a component name such as EdgeButton) to narrow by id or label; results are paged (100 by default, 'offset'/'limit' for more). This server holds published library catalogs only: previews of the project you are editing come from the local compose-preview-mcp server, not from here.", "inputSchema": { "properties": { "catalog": { "description": "A catalog id from catalog_list_projects.", "type": "string" }, "limit": { "maximum": 500, "minimum": 1, "type": "integer" }, "offset": { "minimum": 0, "type": "integer" }, "query": { "description": "Case-insensitive substring of a preview id or label, such as a component name.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "catalog" ], "type": "object" }, "name": "catalog_list_previews", "outputSchema": { "type": "object" } }, { "description": "List every remote catalog with its stable id and preview count. Call this first: catalog_list_previews and catalog_list_data_products take one of these ids as 'catalog'.", "inputSchema": { "properties": { "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "catalog_list_projects", "outputSchema": { "type": "object" } }, { "description": "Render one preview across the cross-product of the given override axes in a single call, returning a hash/size observation per cell (observe=png adds the pixels). Prefer this over a catalog_render_preview per combination: the cells share one catalog lease and are reported together, so comparing axes costs one round trip instead of N. Capped at 24 cells. Requires live grant scope.", "inputSchema": { "anyOf": [ { "required": [ "uri" ] }, { "required": [ "catalog", "previewId" ] } ], "properties": { "axes": { "additionalProperties": { "items": { "type": [ "string", "number", "boolean" ] }, "minItems": 1, "type": "array" }, "type": "object" }, "catalog": { "type": "string" }, "observe": { "enum": [ "png", "hash" ], "type": "string" }, "overrides": { "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "type": "object" }, "previewId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "required": [ "axes" ], "type": "object" }, "name": "catalog_render_matrix", "outputSchema": { "type": "object" } }, { "description": "Render one preview. Like local compose-ai-tools, the default semantics observation is token-frugal; request observe=png for pixels, observe=svg for the compose/figma-svg vector export as SVG source, or observe=scroll-png / observe=scroll-svg for the full-page capture of a scrollable screen rather than the viewport crop. Overrides, other observations and fresh renders require live grant scope; without it, a call with no overrides returns the published snapshot (as resources/read does).", "inputSchema": { "anyOf": [ { "required": [ "uri" ] }, { "required": [ "catalog", "previewId" ] } ], "properties": { "catalog": { "type": "string" }, "observe": { "enum": [ "png", "svg", "scroll-png", "scroll-svg", "semantics", "hash" ], "type": "string" }, "overrides": { "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "type": "object" }, "previewId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "uri": { "type": "string" } }, "type": "object" }, "name": "catalog_render_preview", "outputSchema": { "properties": { "imageUrl": { "description": "Short-lived signed https URL of the rendered PNG, on a host with a public origin.", "type": "string" } }, "type": "object" } }, { "description": "Storybook-MCP-compatible preview metadata lookup.", "inputSchema": { "anyOf": [ { "required": [ "storyId" ] }, { "required": [ "id" ] } ], "properties": { "id": { "type": "string" }, "storyId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "get-documentation-for-story", "outputSchema": { "type": "object" } }, { "description": "Storybook-MCP-compatible alias that lists every preview as a story.", "inputSchema": { "properties": { "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "list-all-documentation", "outputSchema": { "type": "object" } }, { "description": "Collect the outcome of a request_access, proving possession of its deviceSecret. It HOLDS THE CALL OPEN and answers the moment the human decides — one call instead of a dozen, since each poll here costs a whole round trip through you. It waits 8 seconds by default; pass waitSeconds (up to 30) if your client tolerates a longer call. Pass urlMode=true when the client supports URL elicitation: while the request is pending this returns the standard -32042 URL-elicitation-required error, and retrying the same call after the browser decision returns the outcome. A wait that times out answers status=pending, and you simply call again. Then approved (with the token) or denied/expired. Use the token on every later call: as the X-Compose-Preview-Token header where you control headers, and otherwise as each gated tool's 'token' argument — which is what an MCP client reaching this flow mid-session needs, since its headers were fixed when it connected.", "inputSchema": { "properties": { "deviceSecret": { "type": "string" }, "requestId": { "type": "string" }, "urlMode": { "description": "Use the protocol-standard URL elicitation UI while this request is pending.", "type": "boolean" }, "waitSeconds": { "maximum": 30, "minimum": 0, "type": "integer" } }, "required": [ "requestId", "deviceSecret" ], "type": "object" }, "name": "poll_access", "outputSchema": { "type": "object" } }, { "description": "Storybook-MCP-compatible rendering of one or more story ids. Requires live scope.", "inputSchema": { "anyOf": [ { "required": [ "storyIds" ] }, { "required": [ "storyId" ] }, { "required": [ "ids" ] }, { "required": [ "id" ] } ], "properties": { "id": { "type": "string" }, "ids": { "items": { "type": "string" }, "type": "array" }, "observe": { "enum": [ "png", "svg", "scroll-png", "scroll-svg", "semantics", "hash" ], "type": "string" }, "overrides": { "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "type": "object" }, "storyId": { "type": "string" }, "storyIds": { "items": { "type": "string" }, "type": "array" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "preview-stories", "outputSchema": { "additionalProperties": false, "properties": { "observations": { "items": { "type": "object" }, "type": "array" } }, "required": [ "observations" ], "type": "object" } }, { "description": "Ask a human for access to this server. Returns an approveUrl and a userCode: show BOTH to the person you are working with, ask them to open the link and check that the code on the page matches, then call poll_access. When the client supports URL elicitation, call poll_access with urlMode=true instead of pasting the link into chat; clients without it keep this complete text fallback. The link grants nothing by itself — keep the deviceSecret this returns, it is what collects the token. Use this when a call answered 'authorization_required', or when your token stopped working (a server restart drops every grant).", "inputSchema": { "properties": { "capabilities": { "items": { "type": "string" }, "type": "array" }, "label": { "type": "string" }, "scope": { "enum": [ "preview", "live", "playground" ], "type": "string" }, "ttlSeconds": { "type": "integer" } }, "type": "object" }, "name": "request_access", "outputSchema": { "type": "object" } }, { "description": "Report readiness and the aggregate catalog set.", "inputSchema": { "properties": { "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "status", "outputSchema": { "type": "object" } }, { "description": "Say that you have read a comment thread — which is **not** the same as resolving it. Resolving claims the question is settled; acknowledging claims only that you have seen it, which is the honest thing to say while you are still working on what it asked for. Omit `threadId` to acknowledge the whole discussion, which is what you mean after reading it with ui_builder_list_comments. Acknowledgement is per actor, so a thread you have read is still waiting for the other people in the design, and it is what clears the `comments` block the server puts on your ui_builder_apply, ui_builder_get_design, ui_builder_export and ui_builder_put_asset replies.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "threadId": { "description": "One thread. Omit for every thread on the design.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_acknowledge_comment", "outputSchema": { "type": "object" } }, { "description": "Apply design mutations — insertNode, setProperty, deleteNode, moveNode and the rest of DesignMutationV1 — as one operation. `baseRevision` is the revision you read; the outcome reports conflicts or rejected edits. This is how an agent adds a scaffold, fills its slots and sets modifiers. Use `setStateVariable` with `name` and `declaration` to add or edit state, `removeStateVariable` with `name` to remove unused state, and `setEventBinding` with `nodeId`, `event` and an ordered `actions` array to edit behavior. An empty actions array removes the event handler. `removeNodeProperty` (or a setProperty whose value is `{\"type\":\"null\"}`) unsets the property — the way back after trying one — and is refused, naming the node and the field, when the catalog requires it. When somebody has commented on the design and you have not acknowledged it, the outcome carries a `comments` block naming the threads waiting on you; read it, because it is somebody talking about what you are editing.", "inputSchema": { "additionalProperties": false, "properties": { "baseRevision": { "description": "The revision these mutations were written against.", "type": "integer" }, "clientId": { "type": "string" }, "designId": { "type": "string" }, "operationId": { "description": "Your id for this operation; makes a retry idempotent.", "type": "string" }, "operations": { "description": "DesignMutationV1 objects. State example: {\"type\":\"setStateVariable\",\"name\":\"expanded\",\"declaration\":{\"type\":\"value\",\"valueType\":\"bool\",\"initialValue\":false,\"nullable\":false,\"persistence\":\"preview\"}}. Event example: {\"type\":\"setEventBinding\",\"nodeId\":\"button\",\"event\":\"click\",\"actions\":[{\"type\":\"toggle\",\"variable\":\"expanded\"}]}. Declare state before binding it in the batch.", "items": { "type": "object" }, "type": "array" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "operationId", "baseRevision", "operations" ], "type": "object" }, "name": "ui_builder_apply", "outputSchema": { "type": "object" } }, { "description": "Close a branch without merging it: it stays readable and listed, and can no longer be edited or merged. Needs write access to the parent, or to have made the branch.", "inputSchema": { "additionalProperties": false, "properties": { "branchId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "branchId" ], "type": "object" }, "name": "ui_builder_archive_branch", "outputSchema": { "additionalProperties": false, "properties": { "branch": { "additionalProperties": false, "properties": { "branchId": { "type": "string" }, "closedAtEpochMillis": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "closedByActorId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "commandCount": { "type": "integer" }, "createdAtEpochMillis": { "type": "integer" }, "forkDocumentHash": { "type": "string" }, "forkRevision": { "type": "integer" }, "headRevision": { "type": "integer" }, "mergedAtParentRevision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "name": { "type": "string" }, "ownerActorId": { "type": "string" }, "parentDesignId": { "type": "string" }, "status": { "type": "string" }, "summary": { "type": "string" }, "supersededByBranchId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "branchId", "parentDesignId", "name", "ownerActorId", "status", "forkRevision", "forkDocumentHash", "headRevision", "commandCount", "createdAtEpochMillis", "summary" ], "type": "object" }, "schema": { "const": "compose-preview/ui-builder-branch/v1", "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "branch", "summary" ], "type": "object" } }, { "description": "Wait for the discussion to move past `afterSequence` and return it, rather than polling for it. Returns as soon as anybody — a designer in the browser or another agent — posts, resolves or deletes; returns a `timedOut` reply if nothing happens within `waitSeconds`, which you answer by calling again with the same cursor. This is how you hold a conversation about a design: post, wait, read, act.", "inputSchema": { "additionalProperties": false, "properties": { "afterSequence": { "description": "The `sequence` you last saw. 0 for anything at all.", "type": "integer" }, "designId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "waitSeconds": { "description": "Up to 120. Defaults to 25.", "type": "integer" } }, "required": [ "designId", "afterSequence" ], "type": "object" }, "name": "ui_builder_await_comments", "outputSchema": { "type": "object" } }, { "description": "Wait for somebody to approve or reject a design, rather than asking again whether they have. Returns as soon as a decision lands after `afterSequence` — by default only a person's (`from: \"human\"`), on any revision unless you name one — or a `timedOut` reply after `waitSeconds`. Every reply carries `latest` (the newest matching verdict, new or not) and `approved`, so `waitSeconds: 0` is a cheap, idempotent poll for a routine that can only check back later; quote the reply's `sequence` as the next `afterSequence`. People record theirs over the design's `decisions` HTTP route.", "inputSchema": { "additionalProperties": false, "properties": { "afterSequence": { "description": "The `sequence` you last saw. 0 for anything at all.", "type": "integer" }, "designId": { "type": "string" }, "from": { "description": "Whose decisions count. Defaults to human.", "enum": [ "human", "anyone" ], "type": "string" }, "revision": { "description": "Only decisions on this revision.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "waitSeconds": { "description": "Up to 120. Defaults to 25; 0 checks without blocking.", "type": "integer" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_await_decision", "outputSchema": { "additionalProperties": false, "properties": { "approved": { "type": "boolean" }, "decisions": { "items": { "additionalProperties": false, "properties": { "decidedAtEpochMillis": { "type": "integer" }, "decidedBy": { "type": "string" }, "deciderKind": { "type": "string" }, "decisionId": { "type": "string" }, "displayName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "sequence": { "type": "integer" }, "verdict": { "type": "string" } }, "required": [ "decisionId", "sequence", "revision", "verdict", "decidedBy", "deciderKind", "decidedAtEpochMillis" ], "type": "object" }, "type": "array" }, "designId": { "type": "string" }, "latest": { "anyOf": [ { "additionalProperties": false, "properties": { "decidedAtEpochMillis": { "type": "integer" }, "decidedBy": { "type": "string" }, "deciderKind": { "type": "string" }, "decisionId": { "type": "string" }, "displayName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "sequence": { "type": "integer" }, "verdict": { "type": "string" } }, "required": [ "decisionId", "sequence", "revision", "verdict", "decidedBy", "deciderKind", "decidedAtEpochMillis" ], "type": "object" }, { "type": "null" } ] }, "schema": { "const": "compose-preview/ui-builder-decision/v1", "type": "string" }, "sequence": { "type": "integer" }, "summary": { "type": "string" }, "timedOut": { "type": "boolean" } }, "required": [ "schema", "summary", "designId", "timedOut", "sequence", "approved" ], "type": "object" } }, { "description": "Wait for somebody else to change a design and return what they changed, rather than asking again whether they have. Returns the moment a designer in the browser or another agent commits an edit, as the same update frame the browser's own live socket receives; returns a `timedOut` reply if nothing happens within `waitSeconds`, which you answer by calling again with the same cursor. Quote as `afterSequence` the `throughSequence` of the delta you last received, or the `lastSequence` of the last snapshot; a cursor the server no longer retains is answered with a whole snapshot instead of the operations you missed. `waitSeconds: 0` checks without blocking. Nothing is lost between calls — the cursor is replayed when you call again — so somebody merely looking at the design does not wake you, and only a committed change does.", "inputSchema": { "additionalProperties": false, "properties": { "afterSequence": { "description": "The `lastSequence` you last saw, from ui_builder_get_design or a previous wait.", "type": "integer" }, "designId": { "type": "string" }, "includeCatalog": { "description": "When the reply is a whole snapshot, embed the pinned catalog in it. Defaults to false.", "type": "boolean" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "waitSeconds": { "description": "Up to 120. Defaults to 25.", "type": "integer" } }, "required": [ "designId", "afterSequence" ], "type": "object" }, "name": "ui_builder_await_design", "outputSchema": { "type": "object" } }, { "description": "Fork a design at a revision into a **branch** to explore an alternative, or to change it without trampling somebody editing it live. A branch is a design with its own id: edit it with ui_builder_apply, look at it with ui_builder_view or ui_builder_get_design, compare it with ui_builder_diff_designs, then bring it back with ui_builder_merge_branch or drop it with ui_builder_archive_branch. Branch N times from the same revision to try N alternatives: merging one archives the others. Branches of a branch are refused; so are asset uploads, restores and document replacements on a branch. Needs write access to the design.", "inputSchema": { "additionalProperties": false, "properties": { "branchId": { "description": "The branch's design id. Defaults to one minted from the parent's; naming one makes a retry idempotent.", "type": "string" }, "designId": { "description": "The design to branch.", "type": "string" }, "name": { "description": "What this alternative is, e.g. `compact header`.", "type": "string" }, "revision": { "description": "A retained revision to fork at. Omit for the current one.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "name" ], "type": "object" }, "name": "ui_builder_branch_design", "outputSchema": { "additionalProperties": false, "properties": { "branch": { "additionalProperties": false, "properties": { "branchId": { "type": "string" }, "closedAtEpochMillis": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "closedByActorId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "commandCount": { "type": "integer" }, "createdAtEpochMillis": { "type": "integer" }, "forkDocumentHash": { "type": "string" }, "forkRevision": { "type": "integer" }, "headRevision": { "type": "integer" }, "mergedAtParentRevision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "name": { "type": "string" }, "ownerActorId": { "type": "string" }, "parentDesignId": { "type": "string" }, "status": { "type": "string" }, "summary": { "type": "string" }, "supersededByBranchId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "branchId", "parentDesignId", "name", "ownerActorId", "status", "forkRevision", "forkDocumentHash", "headRevision", "commandCount", "createdAtEpochMillis", "summary" ], "type": "object" }, "schema": { "const": "compose-preview/ui-builder-branch/v1", "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "branch", "summary" ], "type": "object" } }, { "description": "Check a design before you show it to anybody — one call instead of validate, view and an accessibility pass. Runs `schema` (document shape), `catalog` (the pinned catalog's validation, the mutation reducer and the Compose export gate — what ui_builder_validate runs) and `a11y`: controls with no label, icons and pictures with no `contentDescription`, touch targets under 48dp, text and icon contrast under WCAG 4.5:1 / 3:1, and text in a fixed height that clips at 200% font scale. Check a stored design (`designId`, optionally a past `revision`), a whole `document`, or `operations` applied to a scratch copy of `designId` exactly as ui_builder_apply would — nothing is saved. Returns `summary` first, then `ok`, the counts, and `findings` with the `nodeId` each is about, so you can fix them with ui_builder_apply and check again. `rendered: true` measures touch targets on a native render where the host has one (needs the ui-builder-export capability). Contrast against theme roles is resolved with the Material 3 baseline scheme and reported as a warning, never an error.", "inputSchema": { "additionalProperties": false, "properties": { "baseRevision": { "description": "The revision `operations` were written against; a stale one is a warning.", "type": "integer" }, "checks": { "description": "Which checks to run. Defaults to all three.", "items": { "enum": [ "schema", "catalog", "a11y" ], "type": "string" }, "type": "array" }, "designId": { "description": "A stored design to check, or to check `operations` against.", "type": "string" }, "document": { "description": "A whole DesignDocumentV1 to check instead of a stored design.", "type": "object" }, "operations": { "description": "DesignMutationV1 objects to apply to a scratch copy of `designId` and check — a dry run.", "items": { "type": "object" }, "type": "array" }, "rendered": { "description": "Measure touch targets on a native render. Defaults to false.", "type": "boolean" }, "revision": { "description": "A past revision of `designId`. Omit for the current one.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "ui_builder_check_design", "outputSchema": { "additionalProperties": false, "properties": { "checks": { "items": { "type": "string" }, "type": "array" }, "designId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "dryRun": { "type": "boolean" }, "errors": { "type": "integer" }, "findings": { "items": { "additionalProperties": false, "properties": { "check": { "type": "string" }, "code": { "type": "string" }, "field": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "measured": { "anyOf": [ { "additionalProperties": false, "properties": { "height": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "ratio": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "required": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "width": { "anyOf": [ { "type": "number" }, { "type": "null" } ] } }, "type": "object" }, { "type": "null" } ] }, "message": { "type": "string" }, "nodeId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "operationIndex": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "severity": { "type": "string" } }, "required": [ "severity", "check", "code", "message" ], "type": "object" }, "type": "array" }, "ok": { "type": "boolean" }, "revision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "schema": { "const": "compose-preview/ui-builder-design-check/v1", "type": "string" }, "skipped": { "items": { "additionalProperties": false, "properties": { "check": { "type": "string" }, "reason": { "type": "string" } }, "required": [ "check", "reason" ], "type": "object" }, "type": "array" }, "summary": { "type": "string" }, "truncated": { "type": "integer" }, "warnings": { "type": "integer" } }, "required": [ "schema", "ok", "summary", "checks", "errors", "warnings", "findings" ], "type": "object" } }, { "description": "Put a design's alternatives side by side in one call: the parent's head and each open branch (or the `branchIds` named) rendered into ONE picture — a short-lived signed https link, numbered by caption — plus, per branch, what it changes against the parent at its fork (counts and a few lines, as ui_builder_diff_designs reports them). Show the person the picture and the numbered list, then ask with ui_builder_pick_branch; merge the choice with ui_builder_merge_branch. Writes nothing. Read access to the design.", "inputSchema": { "additionalProperties": false, "properties": { "branchIds": { "description": "Only these branches of the design, in this order. Defaults to every open branch, oldest first.", "items": { "type": "string" }, "type": "array" }, "designId": { "description": "The parent design.", "type": "string" }, "device": { "anyOf": [ { "type": "string" }, { "additionalProperties": false, "properties": { "heightDp": { "type": "integer" }, "widthDp": { "type": "integer" } }, "required": [ "widthDp", "heightDp" ], "type": "object" } ], "description": "Render every picture at this device instead of each design's own size: a preset id (phone_small, phone, phone_landscape, foldable_folded, foldable_unfolded, tablet_portrait, tablet_landscape, wear_small_round, wear_large_round, wear_square, tv_1080p) or {\"widthDp\",\"heightDp\"}. Nothing is saved." }, "inline": { "description": "Also return the picture as an image block. Defaults to false: the signed link.", "type": "boolean" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_compare_branches", "outputSchema": { "additionalProperties": false, "properties": { "branches": { "items": { "additionalProperties": false, "properties": { "branchId": { "type": "string" }, "commandCount": { "type": "integer" }, "diff": { "additionalProperties": false, "properties": { "baseRevision": { "type": "integer" }, "counts": { "additionalProperties": false, "properties": { "added": { "type": "integer" }, "changed": { "type": "integer" }, "document": { "type": "integer" }, "moved": { "type": "integer" }, "removed": { "type": "integer" } }, "required": [ "added", "removed", "moved", "changed", "document" ], "type": "object" }, "headline": { "type": "string" }, "identical": { "type": "boolean" }, "summary": { "type": "string" }, "truncated": { "type": "boolean" } }, "required": [ "baseRevision", "identical", "headline", "counts", "summary" ], "type": "object" }, "forkRevision": { "type": "integer" }, "headRevision": { "type": "integer" }, "name": { "type": "string" }, "number": { "type": "integer" }, "parentMovedSinceFork": { "type": "boolean" }, "status": { "type": "string" }, "tile": { "additionalProperties": false, "properties": { "height": { "type": "integer" }, "problem": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "rendered": { "type": "boolean" }, "width": { "type": "integer" }, "x": { "type": "integer" }, "y": { "type": "integer" } }, "required": [ "x", "y", "width", "height", "rendered" ], "type": "object" } }, "required": [ "number", "branchId", "name", "status", "forkRevision", "headRevision", "commandCount", "parentMovedSinceFork", "diff", "tile" ], "type": "object" }, "type": "array" }, "columns": { "type": "integer" }, "designId": { "type": "string" }, "device": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "image": { "anyOf": [ { "additionalProperties": false, "properties": { "expiresAtEpochSeconds": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "heightPx": { "type": "integer" }, "mediaType": { "type": "string" }, "scale": { "type": "number" }, "sha256": { "type": "string" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthPx": { "type": "integer" } }, "required": [ "widthPx", "heightPx", "scale", "sha256" ], "type": "object" }, { "type": "null" } ] }, "imageBase64": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "parent": { "anyOf": [ { "additionalProperties": false, "properties": { "height": { "type": "integer" }, "problem": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "rendered": { "type": "boolean" }, "width": { "type": "integer" }, "x": { "type": "integer" }, "y": { "type": "integer" } }, "required": [ "x", "y", "width", "height", "rendered" ], "type": "object" }, { "type": "null" } ] }, "parentRevision": { "type": "integer" }, "rows": { "type": "integer" }, "schema": { "const": "compose-preview/ui-builder-branch-comparison/v1", "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "designId", "parentRevision", "summary" ], "type": "object" } }, { "description": "Measure a design against its reference overlay (attach one with ui_builder_set_reference). Returns what the picture is against the frame and whether a pixel comparison means anything (`facts.pixelComparable` — a 328×56 dp crop stretched over a screen is not comparable until measured at its `actual` size); with `differences`, the share of pixels that differ and up to eight regions in dp, each with the layer it falls in; and for each of `nodeIds`, where that layer sits in the reference — from a box drawn over it in the editor, or a search of the reference's pixels, which for text also reads the font size — with the `alignment` that would make it agree (move, size, font size) and the exact `operations` to pass to ui_builder_apply. Nothing is written: apply the operations you agree with, then compare again and look with ui_builder_view. Layer matching needs node boxes, so `nodeIds` measures the native render (an export grant); differences alone use the PNG export. Treat `confident: false` as a hint to check, not an edit to make.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "differences": { "description": "Measure where the frame differs. Defaults to true.", "type": "boolean" }, "fit": { "description": "How the picture is placed: contained and centred, across the width from the top, or at its own size from the top-left. Defaults to the fit the picture calls for (facts.recommendedFit).", "enum": [ "contain", "width", "actual" ], "type": "string" }, "nodeIds": { "description": "Layers to match against the reference, each with a proposed alignment.", "items": { "type": "string" }, "type": "array" }, "renderer": { "description": "Which render to measure. Defaults to native when nodeIds is given, export otherwise.", "enum": [ "export", "native" ], "type": "string" }, "revision": { "description": "Measure this revision. Defaults to the current one.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_compare_reference", "outputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "differences": { "anyOf": [ { "additionalProperties": false, "properties": { "coverage": { "type": "number" }, "mismatch": { "type": "number" }, "regions": { "items": { "additionalProperties": false, "properties": { "heightDp": { "type": "integer" }, "mismatch": { "type": "number" }, "nodeId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthDp": { "type": "integer" }, "xDp": { "type": "integer" }, "yDp": { "type": "integer" } }, "required": [ "xDp", "yDp", "widthDp", "heightDp", "mismatch" ], "type": "object" }, "type": "array" } }, "required": [ "mismatch", "coverage", "regions" ], "type": "object" }, { "type": "null" } ] }, "differencesMessage": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "facts": { "additionalProperties": false, "properties": { "advice": { "type": "string" }, "density": { "type": "number" }, "densityBucket": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "densitySource": { "type": "string" }, "designDensity": { "type": "number" }, "fit": { "type": "string" }, "frameHeightDp": { "type": "integer" }, "frameWidthDp": { "type": "integer" }, "heightDp": { "type": "integer" }, "heightPx": { "type": "integer" }, "kind": { "type": "string" }, "pixelComparable": { "type": "boolean" }, "recommendedFit": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthDp": { "type": "integer" }, "widthPx": { "type": "integer" } }, "required": [ "widthPx", "heightPx", "density", "densitySource", "widthDp", "heightDp", "frameWidthDp", "frameHeightDp", "designDensity", "kind", "fit", "pixelComparable", "advice" ], "type": "object" }, "layers": { "items": { "additionalProperties": false, "properties": { "alignment": { "anyOf": [ { "additionalProperties": false, "properties": { "fontSizeSp": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "heightDp": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "moveXDp": { "type": "integer" }, "moveYDp": { "type": "integer" }, "summary": { "type": "string" }, "widthDp": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] } }, "required": [ "summary" ], "type": "object" }, { "type": "null" } ] }, "alreadyAligned": { "type": "boolean" }, "confident": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ] }, "current": { "anyOf": [ { "additionalProperties": false, "properties": { "heightDp": { "type": "number" }, "widthDp": { "type": "number" }, "xDp": { "type": "number" }, "yDp": { "type": "number" } }, "required": [ "xDp", "yDp", "widthDp", "heightDp" ], "type": "object" }, { "type": "null" } ] }, "fontSizeSource": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "nodeId": { "type": "string" }, "operations": { "items": { "type": "object" }, "type": "array" }, "source": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "target": { "anyOf": [ { "additionalProperties": false, "properties": { "heightDp": { "type": "number" }, "widthDp": { "type": "number" }, "xDp": { "type": "number" }, "yDp": { "type": "number" } }, "required": [ "xDp", "yDp", "widthDp", "heightDp" ], "type": "object" }, { "type": "null" } ] }, "textScale": { "anyOf": [ { "type": "number" }, { "type": "null" } ] } }, "required": [ "nodeId" ], "type": "object" }, "type": "array" }, "notes": { "items": { "type": "string" }, "type": "array" }, "reference": { "additionalProperties": false, "properties": { "heightPx": { "type": "integer" }, "mediaType": { "type": "string" }, "name": { "type": "string" }, "sourceUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthPx": { "type": "integer" } }, "required": [ "name", "mediaType", "widthPx", "heightPx" ], "type": "object" }, "renderer": { "type": "string" }, "revision": { "type": "integer" }, "schema": { "const": "compose-ui-builder-reference-comparison/v1", "type": "string" } }, "required": [ "schema", "designId", "revision", "renderer", "reference", "facts" ], "type": "object" } }, { "description": "Create a design, either from a whole `document` you supply or by copying an existing design named by `fromDesignId`. Copying is usually right: a document's `catalogPin` must match a catalog revision this server serves, and a copy carries one that does. A `document` whose `home` is an existing design on this server is refused with a `compose-preview-decision/v1` choice to put to the person — or, when your client supports form elicitation on this connection, the person is asked in a form and the call acts on their answer.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "description": "The id for the new design.", "type": "string" }, "document": { "description": "A whole DesignDocumentV1.", "type": "object" }, "fromDesignId": { "description": "Copy this design's document instead.", "type": "string" }, "includeCatalog": { "description": "Embed the pinned catalog in the returned snapshot. Defaults to false.", "type": "boolean" }, "title": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "visibility": { "default": "private", "description": "Private by default. Public allows anyone with the link to view; editing still requires explicit access.", "enum": [ "private", "public" ], "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_create_design", "outputSchema": { "type": "object" } }, { "description": "Delete a design you own, with its history, access list, overlay and discussion. Only the owner may — not an editor, not a viewer, and not anybody merely holding a write grant on this server — so a session can clean up the designs it made and cannot reach anybody else's; an agent acting under an approved grant owns what it created as the person who approved it. There is no undo. Not the released envelope: the contract has no delete, so the reply names the design that is gone.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_delete_design", "outputSchema": { "type": "object" } }, { "description": "Read who can open a design: its owner, and every actor it has been shared with, each with the role and the actions that grant carries. Only the owner may ask — this is the answer to \"who else is in here\" and to \"what is the id I must name when sharing\".", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_design_access", "outputSchema": { "type": "object" } }, { "description": "Compare two designs, or two retained revisions of one: nodes added, removed and moved, and properties, modifiers and other fields changed, each with its node id and path (`root/slot[index]/node`), plus changed document fields (title, environment, state). Works across a design and its fork. `b` defaults to the current revision of `a`'s design. Values are the protocol's own JSON, ready to send back through ui_builder_apply. Read access to both.", "inputSchema": { "additionalProperties": false, "properties": { "a": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "revision": { "description": "A retained revision. Omit for the current one.", "type": "integer" } }, "required": [ "designId" ], "type": "object" }, "b": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "revision": { "description": "A retained revision. Omit for the current one.", "type": "integer" } }, "required": [ "designId" ], "type": "object" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "a" ], "type": "object" }, "name": "ui_builder_diff_designs", "outputSchema": { "additionalProperties": false, "properties": { "a": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "documentDigest": { "type": "string" }, "revision": { "type": "integer" }, "title": { "type": "string" } }, "required": [ "designId", "revision", "title", "documentDigest" ], "type": "object" }, "b": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "documentDigest": { "type": "string" }, "revision": { "type": "integer" }, "title": { "type": "string" } }, "required": [ "designId", "revision", "title", "documentDigest" ], "type": "object" }, "counts": { "additionalProperties": false, "properties": { "added": { "type": "integer" }, "changed": { "type": "integer" }, "document": { "type": "integer" }, "moved": { "type": "integer" }, "removed": { "type": "integer" } }, "required": [ "added", "removed", "moved", "changed", "document" ], "type": "object" }, "document": { "items": { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "identical": { "type": "boolean" }, "nodes": { "items": { "additionalProperties": false, "properties": { "beforePath": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "change": { "type": "string" }, "componentId": { "type": "string" }, "fields": { "items": { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "from": { "anyOf": [ { "additionalProperties": false, "properties": { "index": { "type": "integer" }, "parentId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "slot": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "index" ], "type": "object" }, { "type": "null" } ] }, "modifiers": { "anyOf": [ { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, { "type": "null" } ] }, "nodeId": { "type": "string" }, "path": { "type": "string" }, "properties": { "items": { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "to": { "anyOf": [ { "additionalProperties": false, "properties": { "index": { "type": "integer" }, "parentId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "slot": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "index" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "nodeId", "change", "componentId", "path" ], "type": "object" }, "type": "array" }, "schema": { "const": "compose-preview/ui-builder-design-diff/v1", "type": "string" }, "summary": { "type": "string" }, "truncated": { "type": "boolean" } }, "required": [ "schema", "a", "b", "identical", "summary", "counts" ], "type": "object" } }, { "description": "Export a design. `compose` returns the Kotlin the generator writes, or — when the design holds something it cannot express — diagnostics naming each reason. This is the same gate the browser's code pane shows, so an agent and a designer get the same answer about the same design.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "format": { "description": "Defaults to compose. Available formats: compose, svg, png, bundle. Check the catalog exportCapabilities.", "type": "string" }, "revision": { "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_export", "outputSchema": { "type": "object" } }, { "description": "From a pull request back to the design(s) it implements: every design you can read whose implementation record or links name `pr`, with the implementation status and revision. Then call ui_builder_implementation_status for what the design expects.", "inputSchema": { "additionalProperties": false, "properties": { "pr": { "description": "The pull request URL, exactly as recorded.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "pr" ], "type": "object" }, "name": "ui_builder_find_design_for_pr", "outputSchema": { "additionalProperties": false, "properties": { "designs": { "items": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "revision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "designId" ], "type": "object" }, "type": "array" }, "pr": { "type": "string" }, "schema": { "const": "compose-preview/ui-builder-pr-designs/v1", "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "summary", "pr", "designs" ], "type": "object" } }, { "description": "Make a new design from one revision of another — yours to edit, owned by you, with its parent recorded: the fork's `forkedFrom` (design, revision, document digest) and the parent's `forks` both show in ui_builder_get_links. A fork is not a branch: it never inherits the parent's canonical home and nothing flows back on its own, so tell the person it exists and bring a chosen change back with ui_builder_apply on the parent. Needs write access on this server and read access to the parent.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "description": "The design to fork.", "type": "string" }, "newDesignId": { "description": "The fork's id. Defaults to one derived from the parent; an id already taken is refused.", "type": "string" }, "revision": { "description": "A retained revision. Omit for the current one.", "type": "integer" }, "title": { "description": "The fork's title. Defaults to the parent's, marked with the revision.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_fork_design", "outputSchema": { "additionalProperties": false, "properties": { "ancestryRecorded": { "type": "boolean" }, "designId": { "type": "string" }, "forkedFrom": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "documentDigest": { "type": "string" }, "revision": { "type": "integer" } }, "required": [ "designId", "revision", "documentDigest" ], "type": "object" }, "home": { "anyOf": [ { "oneOf": [ { "additionalProperties": false, "properties": { "kind": { "const": "repo" }, "path": { "type": "string" } }, "required": [ "kind", "path" ], "type": "object" }, { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "kind": { "const": "server" }, "url": { "type": "string" } }, "required": [ "kind", "url", "designId" ], "type": "object" } ] }, { "type": "null" } ] }, "revision": { "type": "integer" }, "schema": { "const": "compose-preview/ui-builder-forked/v1", "type": "string" }, "summary": { "type": "string" }, "title": { "type": "string" } }, "required": [ "schema", "designId", "title", "revision", "forkedFrom", "ancestryRecorded", "summary" ], "type": "object" } }, { "description": "Read one design: its whole document — nodes, slots, properties, modifiers, state variables and catalog pin — plus the revision to quote as `baseRevision` when editing it. The catalog the design pins is left out unless `includeCatalog` is true: it is the same for every design on the pin, ui_builder_list_catalogs serves it, and it is most of the bytes. On hosts with design discussions, `unacknowledgedComments` is the number of comment threads this actor has not acknowledged; a nonzero count also carries the bounded `comments` notice.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "includeCatalog": { "description": "Embed the pinned catalog's whole CatalogCapabilityV1 in the snapshot, as the released shape does. Defaults to false.", "type": "boolean" }, "revision": { "description": "A past revision. Omit for the current one.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_get_design", "outputSchema": { "type": "object" } }, { "description": "Read what a design is **for**: the `issue` it was drawn for, the `reference` frame in the design tool it reproduces, the `pr` that implemented it, the `thread` it is being discussed in, and the `previous` design it continues. Start a session on somebody else's design here — it is the brief, and it is what ui_builder_get_design cannot tell you. Every field is optional; a reply with none of them means nobody has said yet. The record is kept beside the design and is never part of it: no node holds it, no export sees it, and writing one does not move the revision. Ancestry rides along where there is some: `forkedFrom` / `forks` for a fork made with ui_builder_fork_design, and `branchOf` / `branches` for a design branch and its parent.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_get_links", "outputSchema": { "type": "object" } }, { "description": "Everything the code side needs to implement a design, in one call: the revision, its links (issue, reference, PR, thread), the implementation PR with its status and whether its previews were found to match, the latest verdict on this revision, and the Compose export with the generator's diagnostics. `summary` says in one line whether the PR implements this revision and whether it was approved. `includeExport: false` leaves the Kotlin out and needs only read access; with it the call needs the ui-builder-export capability.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "includeExport": { "description": "Include the Compose export. Defaults to true.", "type": "boolean" }, "revision": { "description": "A past revision. Omit for the current one.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_implementation_status", "outputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "export": { "anyOf": [ { "additionalProperties": false, "properties": { "diagnostics": { "items": { "type": "string" }, "type": "array" }, "format": { "type": "string" }, "ok": { "type": "boolean" }, "source": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "format", "ok" ], "type": "object" }, { "type": "null" } ] }, "implementation": { "anyOf": [ { "additionalProperties": false, "properties": { "pr": { "type": "string" }, "previewMatch": { "anyOf": [ { "additionalProperties": false, "properties": { "evidence": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "status": { "type": "string" } }, "required": [ "status" ], "type": "object" }, { "type": "null" } ] }, "revision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "status": { "type": "string" }, "updatedAtEpochMillis": { "type": "integer" }, "updatedBy": { "type": "string" } }, "required": [ "pr", "status", "updatedBy" ], "type": "object" }, { "type": "null" } ] }, "implementsRevision": { "type": "boolean" }, "latestDecision": { "anyOf": [ { "additionalProperties": false, "properties": { "decidedAtEpochMillis": { "type": "integer" }, "decidedBy": { "type": "string" }, "deciderKind": { "type": "string" }, "decisionId": { "type": "string" }, "displayName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "sequence": { "type": "integer" }, "verdict": { "type": "string" } }, "required": [ "decisionId", "sequence", "revision", "verdict", "decidedBy", "deciderKind", "decidedAtEpochMillis" ], "type": "object" }, { "type": "null" } ] }, "links": { "anyOf": [ { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "issue": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "pr": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "previous": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "reference": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "schemaVersion": { "type": "integer" }, "thread": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "updatedAtEpochMillis": { "type": "integer" } }, "type": "object" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "schema": { "const": "compose-preview/ui-builder-implementation/v1", "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "summary", "designId", "revision", "implementsRevision" ], "type": "object" } }, { "description": "A design's branches, newest first: each one's id, name, owner, status (open, merged, archived), fork revision, head revision and the number of commands a merge would replay; for a merged one the parent revision it landed at, for an archived sibling the branch whose merge superseded it. Read access to the design.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "description": "The parent design.", "type": "string" }, "status": { "description": "Only branches in this state. Defaults to all.", "enum": [ "open", "merged", "archived", "all" ], "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_list_branches", "outputSchema": { "additionalProperties": false, "properties": { "branches": { "items": { "additionalProperties": false, "properties": { "branchId": { "type": "string" }, "closedAtEpochMillis": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "closedByActorId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "commandCount": { "type": "integer" }, "createdAtEpochMillis": { "type": "integer" }, "forkDocumentHash": { "type": "string" }, "forkRevision": { "type": "integer" }, "headRevision": { "type": "integer" }, "mergedAtParentRevision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "name": { "type": "string" }, "ownerActorId": { "type": "string" }, "parentDesignId": { "type": "string" }, "status": { "type": "string" }, "summary": { "type": "string" }, "supersededByBranchId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "branchId", "parentDesignId", "name", "ownerActorId", "status", "forkRevision", "forkDocumentHash", "headRevision", "commandCount", "createdAtEpochMillis", "summary" ], "type": "object" }, "type": "array" }, "designId": { "type": "string" }, "schema": { "const": "compose-preview/ui-builder-branches/v1", "type": "string" }, "status": { "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "designId", "status", "branches", "summary" ], "type": "object" } }, { "description": "List the component catalogs a UI-builder design can pin to. Start here: a design's `catalogPin` must name a revision this server actually serves, and each catalog's `catalogPin` here is exactly that. By default a summary of what authoring needs, a few KB rather than the whole capability: per component its id, role, traits, `slots` as `name[min..max]:accepted|roles` and `properties` as `name:type`, with `!` when required and `=a|b` listing the allowed values; per catalog its export formats and the modifier vocabulary. `full: true` returns the released CatalogsResponseV1 envelope with adapter status, parity and export notes per component; `componentIds` narrows either to the components you are about to use.", "inputSchema": { "additionalProperties": false, "properties": { "componentIds": { "description": "Only these components. Omit for all of them.", "items": { "type": "string" }, "type": "array" }, "full": { "description": "The whole CatalogCapabilityV1 per catalog, as the released envelope. Defaults to false.", "type": "boolean" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "ui_builder_list_catalogs", "outputSchema": { "type": "object" } }, { "description": "Read the discussion on a design: every thread, where each is pinned — a markup stroke, a design node, or a point on the frame — whether it is resolved, and every reply under it. `sequence` rises on each change and is the cursor to quote to ui_builder_await_comments. Comments are kept beside the design and are never part of it: no node holds them and no export sees them. Each thread carries `acknowledgedBy`, so you can see what you have already caught up with; say you have read the rest with ui_builder_acknowledge_comment.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_list_comments", "outputSchema": { "type": "object" } }, { "description": "List the UI-builder designs on this server, newest first, with the cursor to continue.", "inputSchema": { "additionalProperties": false, "properties": { "cursor": { "description": "Continue a previous page.", "type": "string" }, "limit": { "description": "Designs per page. Defaults to 50.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "ui_builder_list_designs", "outputSchema": { "type": "object" } }, { "description": "A design's retained revisions, newest first: each one's number, who made it, when, the operation that produced it (`setProperty ×2, insertNode`, `undo`, `restored r3`) and its document digest. `retention` says how far back the history still reaches — older revisions are gone, and get, diff, restore and fork stop at that floor. Page with `before`. Read access.", "inputSchema": { "additionalProperties": false, "properties": { "before": { "description": "Only revisions older than this one; pass the previous reply's `nextBefore`.", "type": "integer" }, "designId": { "type": "string" }, "limit": { "description": "Revisions per page. Defaults to 20.", "maximum": 128, "minimum": 1, "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_list_revisions", "outputSchema": { "additionalProperties": false, "properties": { "currentRevision": { "type": "integer" }, "designId": { "type": "string" }, "nextBefore": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "retention": { "additionalProperties": false, "properties": { "maximumRevisionBytes": { "type": "integer" }, "maximumRevisions": { "type": "integer" }, "minimumRevisions": { "type": "integer" }, "note": { "type": "string" }, "oldestRetainedRevision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "retainedOperations": { "type": "integer" }, "retainedRevisions": { "type": "integer" } }, "required": [ "retainedRevisions", "maximumRevisions", "minimumRevisions", "maximumRevisionBytes", "retainedOperations", "note" ], "type": "object" }, "revisions": { "items": { "additionalProperties": false, "properties": { "actorId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "current": { "type": "boolean" }, "documentDigest": { "type": "string" }, "nodes": { "type": "integer" }, "operation": { "anyOf": [ { "additionalProperties": false, "properties": { "clientId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "kind": { "type": "string" }, "mutations": { "items": { "type": "string" }, "type": "array" }, "operationId": { "type": "string" }, "restoredRevision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "summary": { "type": "string" } }, "required": [ "operationId", "kind", "summary" ], "type": "object" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "sequence": { "type": "integer" }, "summary": { "type": "string" }, "updatedAtEpochMillis": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] } }, "required": [ "revision", "sequence", "current", "documentDigest", "nodes", "summary" ], "type": "object" }, "type": "array" }, "schema": { "const": "compose-preview/ui-builder-revisions/v1", "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "designId", "currentRevision", "revisions", "retention", "summary" ], "type": "object" } }, { "description": "Replay a branch's edits onto its parent's current revision through the same reducer every edit goes through — all or nothing. The reply reports every command: `applied` with the revision it landed at and any `STALE_*` notice of what it overwrote, or `refused` with the rejection code that stopped the run (nothing is then written), plus `skippedOperationIds` and how many were never tried. Run `dryRun: true` first. Resolve a refusal by passing that command's id in `skipOperationIds` (skip an undo with what it undoes), or branch again from the parent. On success the branch is merged and its open siblings — branches forked at the same revision — are archived. Needs write access to the parent.", "inputSchema": { "additionalProperties": false, "properties": { "branchId": { "type": "string" }, "dryRun": { "description": "Replay and report without writing anything. Defaults to false.", "type": "boolean" }, "skipOperationIds": { "description": "Logged commands to leave out of the replay.", "items": { "type": "string" }, "type": "array" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "branchId" ], "type": "object" }, "name": "ui_builder_merge_branch", "outputSchema": { "additionalProperties": false, "properties": { "archivedSiblingIds": { "items": { "type": "string" }, "type": "array" }, "branchId": { "type": "string" }, "commands": { "items": { "additionalProperties": false, "properties": { "actorId": { "type": "string" }, "baseRevision": { "type": "integer" }, "code": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "committedRevision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "conflicts": { "items": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "explanation": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "field": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "nodeId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "overwrittenRevision": { "type": "integer" } }, "required": [ "code", "overwrittenRevision" ], "type": "object" }, "type": "array" }, "field": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "nodeId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "operationId": { "type": "string" }, "status": { "type": "string" } }, "required": [ "operationId", "actorId", "status", "baseRevision" ], "type": "object" }, "type": "array" }, "dryRun": { "type": "boolean" }, "forkRevision": { "type": "integer" }, "merged": { "type": "boolean" }, "parentDesignId": { "type": "string" }, "parentRevisionAfter": { "type": "integer" }, "parentRevisionBefore": { "type": "integer" }, "remaining": { "type": "integer" }, "schema": { "const": "compose-preview/ui-builder-branch-merge/v1", "type": "string" }, "skippedOperationIds": { "items": { "type": "string" }, "type": "array" }, "summary": { "type": "string" } }, "required": [ "schema", "branchId", "parentDesignId", "dryRun", "merged", "forkRevision", "parentRevisionBefore", "parentRevisionAfter", "commands", "remaining", "summary" ], "type": "object" } }, { "description": "Move a design's canonical home between this server and a repository checkout. This changes real authoritative state: quote the exact `baseRevision` and current `sourceHome` from ui_builder_get_design, provide a stable `operationId`, and name the new `targetHome`. The old server record remains as a retained copy pointing at the new home. The reply is an idempotent operation outcome with the new revision; a stale revision or changed source home is refused rather than overwriting a concurrent move. Unless the person already chose this move, call first with `dryRun: true`: it changes nothing and returns the choices to put to them — or, when your client supports form elicitation on this connection, asks them in a form and, if they choose to move, returns this move's outcome.", "inputSchema": { "additionalProperties": false, "properties": { "baseRevision": { "description": "The exact current revision read from the design.", "type": "integer" }, "designId": { "type": "string" }, "dryRun": { "description": "Validate and return the person's choices without changing anything.", "type": "boolean" }, "operationId": { "description": "Your stable id; makes a retry idempotent.", "type": "string" }, "sourceHome": { "anyOf": [ { "type": "null" }, { "oneOf": [ { "additionalProperties": false, "properties": { "designId": { "minLength": 1, "type": "string" }, "kind": { "const": "server" }, "url": { "minLength": 1, "type": "string" } }, "required": [ "kind", "url", "designId" ], "type": "object" }, { "additionalProperties": false, "properties": { "kind": { "const": "repo" }, "path": { "minLength": 1, "type": "string" } }, "required": [ "kind", "path" ], "type": "object" } ] } ], "description": "The exact current DesignHomeV1, or null when the design is unhomed." }, "targetHome": { "oneOf": [ { "additionalProperties": false, "properties": { "designId": { "minLength": 1, "type": "string" }, "kind": { "const": "server" }, "url": { "minLength": 1, "type": "string" } }, "required": [ "kind", "url", "designId" ], "type": "object" }, { "additionalProperties": false, "properties": { "kind": { "const": "repo" }, "path": { "minLength": 1, "type": "string" } }, "required": [ "kind", "path" ], "type": "object" } ] }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "operationId", "baseRevision", "sourceHome", "targetHome" ], "type": "object" }, "name": "ui_builder_move_design_home", "outputSchema": { "type": "object" } }, { "description": "Open the UI Builder's design list: pick a design to see it as the editor draws it. Takes no arguments. Also opens from the ChatGPT/Codex sidebar, and a deep link to /design/<id> opens one design.", "inputSchema": { "properties": { "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "ui_builder_open", "outputSchema": { "type": "object" } }, { "description": "Ask the person which alternative (open branch) of a design to keep, and return their choice. In ChatGPT or Codex it is a thumbnail picker, one option per branch; with plain form elicitation it is a single-choice form; otherwise — and in chat tools like Slack — it returns a numbered list and one picture for YOU to post, and the person replies with a number. It never waits on a client that cannot answer. `outcome` is `chosen` (with `branchId`), `declined`, `ask-in-chat` or `no-branches`. Writes nothing: merge the chosen branch with ui_builder_merge_branch (dryRun first). Read access to the design.", "inputSchema": { "additionalProperties": false, "properties": { "branchIds": { "description": "Only these open branches, in this order. Defaults to every open branch, oldest first.", "items": { "type": "string" }, "type": "array" }, "designId": { "description": "The parent design.", "type": "string" }, "inline": { "description": "With a numbered list, also return its picture as an image block.", "type": "boolean" }, "message": { "description": "The question to put to the person. Defaults to asking which alternative to keep.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_pick_branch", "outputSchema": { "additionalProperties": false, "properties": { "branchId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "designId": { "type": "string" }, "image": { "anyOf": [ { "additionalProperties": false, "properties": { "expiresAtEpochSeconds": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "heightPx": { "type": "integer" }, "mediaType": { "type": "string" }, "scale": { "type": "number" }, "sha256": { "type": "string" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthPx": { "type": "integer" } }, "required": [ "widthPx", "heightPx", "scale", "sha256" ], "type": "object" }, { "type": "null" } ] }, "imageBase64": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "options": { "items": { "additionalProperties": false, "properties": { "branchId": { "type": "string" }, "changes": { "type": "string" }, "commandCount": { "type": "integer" }, "headRevision": { "type": "integer" }, "name": { "type": "string" }, "number": { "type": "integer" } }, "required": [ "number", "branchId", "name", "headRevision", "commandCount", "changes" ], "type": "object" }, "type": "array" }, "outcome": { "type": "string" }, "schema": { "const": "compose-preview/ui-builder-branch-pick/v1", "type": "string" }, "summary": { "type": "string" }, "via": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "schema", "designId", "outcome", "summary" ], "type": "object" } }, { "description": "Say something on a design — a reply into `threadId`, or a new thread when it is omitted. Pin a new thread with `markId` (a stroke on the reference overlay), `nodeId` (a node in the design), or `x`/`y` in frame fractions, so the person reading it can see what you meant. The comment is attributed to your own grant; you cannot post as somebody else.", "inputSchema": { "additionalProperties": false, "properties": { "body": { "type": "string" }, "designId": { "type": "string" }, "displayName": { "description": "The name to show beside your actor id.", "type": "string" }, "markId": { "description": "Pin to a markup stroke on the reference.", "type": "string" }, "nodeId": { "description": "Pin to a design node.", "type": "string" }, "threadId": { "description": "Reply into this thread. Omit to start one.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "x": { "description": "Pin to a point on the frame, 0..1 across.", "type": "number" }, "y": { "description": "Pin to a point on the frame, 0..1 down.", "type": "number" } }, "required": [ "designId", "body" ], "type": "object" }, "name": "ui_builder_post_comment", "outputSchema": { "type": "object" } }, { "description": "Dry-run recovery of a design whose stored catalog pin no longer resolves. The server selects the exact currently served pin for the same catalog system and returns a CatalogUpgradePreviewV1 with changes, issues and the hashes required by a later `upgradeCatalog` mutation through ui_builder_apply. This call never writes.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_preview_catalog_recovery", "outputSchema": { "type": "object" } }, { "description": "Put a picture behind an `assetKey`, so an `asset/image` node naming that key draws it instead of a placeholder. Send the PNG, JPEG, GIF or WebP bytes base64-encoded in `imageBase64`; the server stores them by content digest and pins {mediaType, contentDigest, source: uploaded} into the design's `assets` map under the key. This moves the design's revision, and the reply carries the new one to quote as `baseRevision`. Idempotent by content — the same bytes under the same key change nothing. Put the picture first, then insert the `asset/image` node with ui_builder_apply: the reducer refuses a key that is neither pinned in the design nor in the catalog's own registry. A pinned key whose bytes a lane cannot show renders as a visible placeholder, never as an error.", "inputSchema": { "additionalProperties": false, "properties": { "assetKey": { "description": "1 to 64 characters of letters, digits, '.', '_' or '-'; what the node's assetKey property names.", "type": "string" }, "designId": { "type": "string" }, "imageBase64": { "description": "The image bytes, base64. At most 1 MiB decoded.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "assetKey", "imageBase64" ], "type": "object" }, "name": "ui_builder_put_asset", "outputSchema": { "type": "object" } }, { "description": "React to one comment with an emoji, or take the reaction back with `on: false`. The lightest thing you can say: 👀 on a comment you have just picked up, 👍 on a fix somebody made, where a reply would be noise in a thread a person has to read. `commentId` is the `id` of a comment inside a thread, from ui_builder_list_comments. Reacting also acknowledges that thread for you, so it counts as the lightest acknowledgement; it says nothing about whether the question is settled.", "inputSchema": { "additionalProperties": false, "properties": { "commentId": { "description": "The comment to react to, from its thread's `comments`.", "type": "string" }, "designId": { "type": "string" }, "on": { "description": "False takes your reaction back. Defaults to true.", "type": "boolean" }, "reaction": { "description": "One emoji, at most 24 characters.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "commentId", "reaction" ], "type": "object" }, "name": "ui_builder_react_to_comment", "outputSchema": { "type": "object" } }, { "description": "Record a review verdict — `approve` or `reject` — on one revision of a design, with an optional note. Kept beside the design, like comments: it never moves the revision. Recorded as an agent's decision, so a person waiting with ui_builder_await_decision's default `from: \"human\"` is not answered by it. Pass your own `decisionId` to make a retry idempotent.", "inputSchema": { "additionalProperties": false, "properties": { "decisionId": { "description": "Your id for this decision; makes a retry idempotent.", "type": "string" }, "designId": { "type": "string" }, "displayName": { "type": "string" }, "note": { "description": "Why, in a sentence or two.", "type": "string" }, "revision": { "description": "The revision the verdict is about.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "verdict": { "enum": [ "approve", "reject" ], "type": "string" } }, "required": [ "designId", "revision", "verdict" ], "type": "object" }, "name": "ui_builder_record_decision", "outputSchema": { "additionalProperties": false, "properties": { "approved": { "type": "boolean" }, "decisions": { "items": { "additionalProperties": false, "properties": { "decidedAtEpochMillis": { "type": "integer" }, "decidedBy": { "type": "string" }, "deciderKind": { "type": "string" }, "decisionId": { "type": "string" }, "displayName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "sequence": { "type": "integer" }, "verdict": { "type": "string" } }, "required": [ "decisionId", "sequence", "revision", "verdict", "decidedBy", "deciderKind", "decidedAtEpochMillis" ], "type": "object" }, "type": "array" }, "designId": { "type": "string" }, "latest": { "anyOf": [ { "additionalProperties": false, "properties": { "decidedAtEpochMillis": { "type": "integer" }, "decidedBy": { "type": "string" }, "deciderKind": { "type": "string" }, "decisionId": { "type": "string" }, "displayName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "sequence": { "type": "integer" }, "verdict": { "type": "string" } }, "required": [ "decisionId", "sequence", "revision", "verdict", "decidedBy", "deciderKind", "decidedAtEpochMillis" ], "type": "object" }, { "type": "null" } ] }, "schema": { "const": "compose-preview/ui-builder-decision/v1", "type": "string" }, "sequence": { "type": "integer" }, "summary": { "type": "string" }, "timedOut": { "type": "boolean" } }, "required": [ "schema", "summary", "designId", "timedOut", "sequence", "approved" ], "type": "object" } }, { "description": "Give a design a new title. The title is the one thing about a design nothing else could change: it is set at creation, shown in every listing and the editor, and not part of any mutation. Anybody who may write the design may rename it. The revision does not move — a title is not design content — so `baseRevision` is not needed and an edit in flight is unaffected. Not the released envelope: the contract has no rename, so the reply is the design's listing entry with its new title.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "title": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "title" ], "type": "object" }, "name": "ui_builder_rename_design", "outputSchema": { "type": "object" } }, { "description": "See one design on several devices in ONE picture: a contact sheet with a captioned cell per device × theme × font scale, plus each cell's device, size and box on the sheet. Nothing is saved — the design's environment is swapped on a scratch copy for each cell. Name `devices` by preset (phone_small, phone, phone_landscape, foldable_folded, foldable_unfolded, tablet_portrait, tablet_landscape, wear_small_round, wear_large_round, wear_square, tv_1080p) or as {widthDp, heightDp, label?, round?}; or a `formFactor` (phone, foldable, tablet, wear, tv, adaptive) for its default set; with neither you get the design's own form factor — phone, foldable and tablet for a mobile catalog, the round watches for Wear. Add `themes: [\"light\",\"dark\"]` and `fontScales: [1, 2]` to cross them; at most 16 cells. The sheet is a short-lived signed https link kept under 3.5 MB, so a chat surface can show it inline; `inline: true` puts the bytes in the reply as well.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "devices": { "description": "Devices to draw. Omit for the form factor's defaults.", "items": { "anyOf": [ { "enum": [ "phone_small", "phone", "phone_landscape", "foldable_folded", "foldable_unfolded", "tablet_portrait", "tablet_landscape", "wear_small_round", "wear_large_round", "wear_square", "tv_1080p" ], "type": "string" }, { "additionalProperties": false, "properties": { "formFactor": { "type": "string" }, "heightDp": { "maximum": 4096, "minimum": 1, "type": "integer" }, "id": { "type": "string" }, "label": { "type": "string" }, "round": { "type": "boolean" }, "widthDp": { "maximum": 4096, "minimum": 1, "type": "integer" } }, "required": [ "widthDp", "heightDp" ], "type": "object" } ] }, "type": "array" }, "fontScales": { "description": "Defaults to the design's own font scale.", "items": { "maximum": 3, "minimum": 0.5, "type": "number" }, "type": "array" }, "formFactor": { "description": "A default device set, instead of `devices`.", "enum": [ "phone", "foldable", "tablet", "wear", "tv", "adaptive" ], "type": "string" }, "inline": { "description": "Also return the PNG as an image block. Defaults to false; a host with no public origin always does.", "type": "boolean" }, "revision": { "description": "A past revision. Omit for the current one.", "type": "integer" }, "themes": { "description": "Defaults to the design's own theme.", "items": { "enum": [ "light", "dark" ], "type": "string" }, "type": "array" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_render_design_matrix", "outputSchema": { "additionalProperties": false, "properties": { "cells": { "items": { "additionalProperties": false, "properties": { "device": { "type": "string" }, "fontScale": { "type": "number" }, "formFactor": { "type": "string" }, "height": { "type": "integer" }, "heightDp": { "type": "integer" }, "index": { "type": "integer" }, "label": { "type": "string" }, "problem": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "rendered": { "type": "boolean" }, "round": { "type": "boolean" }, "theme": { "type": "string" }, "width": { "type": "integer" }, "widthDp": { "type": "integer" }, "x": { "type": "integer" }, "y": { "type": "integer" } }, "required": [ "index", "device", "label", "formFactor", "widthDp", "heightDp", "theme", "fontScale", "x", "y", "width", "height", "rendered" ], "type": "object" }, "type": "array" }, "columns": { "type": "integer" }, "designId": { "type": "string" }, "image": { "additionalProperties": false, "properties": { "expiresAtEpochSeconds": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "heightPx": { "type": "integer" }, "mediaType": { "type": "string" }, "scale": { "type": "number" }, "sha256": { "type": "string" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthPx": { "type": "integer" } }, "required": [ "widthPx", "heightPx", "scale", "sha256" ], "type": "object" }, "imageBase64": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "rows": { "type": "integer" }, "schema": { "const": "compose-preview/ui-builder-design-matrix/v1", "type": "string" }, "summary": { "type": "string" } }, "required": [ "schema", "summary", "designId", "revision", "columns", "rows", "image", "cells" ], "type": "object" } }, { "description": "Compile a design and render it with real Compose on this host, rather than in the browser's Wasm canvas — the way to see what a design looks like on Android. Returns the first frame, the token the live frame stream is opened with, and the design node ids the render is tagged with, so `catalog_get_preview_data` can report each node's bounds and a client can put selectable regions over the image. This host has a native render lane. The reply is not an McpResponseEnvelopeV1: the released contract defines no request type for a native render.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "revision": { "description": "A past revision. Omit for the current one.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_render_native", "outputSchema": { "type": "object" } }, { "description": "Replace one stored design from a complete DesignDocumentV1 copy — the authoritative save-back and re-import operation. The document must name the same design and the same canonical home you read from ui_builder_get_design; `baseRevision` must still be current. The runtime validates the complete document and quotas, preserves server-owned identity, access and creation time, retains the old revision, and broadcasts a whole snapshot. Retry with the same `operationId`; never invent a new id after a lost response. Unless the person already chose to save back or re-import onto this home, call first with `dryRun: true`: it changes nothing and returns the choices to put to them — or, when your client supports form elicitation on this connection, asks them in a form and returns the outcome of the write they chose.", "inputSchema": { "additionalProperties": false, "properties": { "baseRevision": { "description": "The exact current revision being replaced.", "type": "integer" }, "designId": { "type": "string" }, "document": { "description": "The complete replacement DesignDocumentV1, including the existing home.", "type": "object" }, "dryRun": { "description": "Validate and return the person's choices without changing anything.", "type": "boolean" }, "operationId": { "description": "Your stable id; makes a retry idempotent.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "operationId", "baseRevision", "document" ], "type": "object" }, "name": "ui_builder_replace_design_document", "outputSchema": { "type": "object" } }, { "description": "Close a comment thread once it is answered, or reopen one by passing `resolved: false`. The resolution is attributed to you and is reversible.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "resolved": { "description": "Defaults to true.", "type": "boolean" }, "threadId": { "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "threadId" ], "type": "object" }, "name": "ui_builder_resolve_comment_thread", "outputSchema": { "type": "object" } }, { "description": "Make a retained revision the design's current content again, **forward**: it is committed as a new revision and nothing after it is lost, so a restore is undone by restoring again. `baseRevision` must be the current revision (a restore that raced an edit is refused as stale). `dryRun: true` writes nothing and returns the diff the restore would apply. Needs write access to the design.", "inputSchema": { "additionalProperties": false, "properties": { "baseRevision": { "description": "The design's current revision, from ui_builder_get_design or ui_builder_list_revisions.", "type": "integer" }, "designId": { "type": "string" }, "dryRun": { "description": "Return the diff without restoring. Defaults to false.", "type": "boolean" }, "operationId": { "description": "Makes a retry idempotent. Defaults to a fresh id.", "type": "string" }, "revision": { "description": "The retained revision to restore.", "type": "integer" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId", "revision", "baseRevision" ], "type": "object" }, "name": "ui_builder_restore_revision", "outputSchema": { "additionalProperties": false, "properties": { "applied": { "type": "boolean" }, "baseRevision": { "type": "integer" }, "committedRevision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "currentRevision": { "type": "integer" }, "designId": { "type": "string" }, "diff": { "additionalProperties": false, "properties": { "a": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "documentDigest": { "type": "string" }, "revision": { "type": "integer" }, "title": { "type": "string" } }, "required": [ "designId", "revision", "title", "documentDigest" ], "type": "object" }, "b": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "documentDigest": { "type": "string" }, "revision": { "type": "integer" }, "title": { "type": "string" } }, "required": [ "designId", "revision", "title", "documentDigest" ], "type": "object" }, "counts": { "additionalProperties": false, "properties": { "added": { "type": "integer" }, "changed": { "type": "integer" }, "document": { "type": "integer" }, "moved": { "type": "integer" }, "removed": { "type": "integer" } }, "required": [ "added", "removed", "moved", "changed", "document" ], "type": "object" }, "document": { "items": { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "identical": { "type": "boolean" }, "nodes": { "items": { "additionalProperties": false, "properties": { "beforePath": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "change": { "type": "string" }, "componentId": { "type": "string" }, "fields": { "items": { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "from": { "anyOf": [ { "additionalProperties": false, "properties": { "index": { "type": "integer" }, "parentId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "slot": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "index" ], "type": "object" }, { "type": "null" } ] }, "modifiers": { "anyOf": [ { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, { "type": "null" } ] }, "nodeId": { "type": "string" }, "path": { "type": "string" }, "properties": { "items": { "additionalProperties": false, "properties": { "after": { "anyOf": [ {}, { "type": "null" } ] }, "before": { "anyOf": [ {}, { "type": "null" } ] }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "to": { "anyOf": [ { "additionalProperties": false, "properties": { "index": { "type": "integer" }, "parentId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "slot": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "index" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "nodeId", "change", "componentId", "path" ], "type": "object" }, "type": "array" }, "schema": { "type": "string" }, "summary": { "type": "string" }, "truncated": { "type": "boolean" } }, "required": [ "a", "b", "identical", "summary", "counts" ], "type": "object" }, "documentDigest": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "dryRun": { "type": "boolean" }, "operationId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "revision": { "type": "integer" }, "schema": { "const": "compose-preview/ui-builder-restore/v1", "type": "string" }, "stale": { "type": "boolean" }, "summary": { "type": "string" } }, "required": [ "schema", "designId", "revision", "baseRevision", "currentRevision", "dryRun", "applied", "stale", "diff", "summary" ], "type": "object" } }, { "description": "Find catalog components by name, role or trait (case-insensitive substring), e.g. `TextField`, `Button`, `Card`. Returns the same summary as ui_builder_list_catalogs (id, role, traits, slots, properties, and the catalog pin) for only the matches, so you don't pay for the whole catalog.", "inputSchema": { "additionalProperties": false, "properties": { "catalog": { "description": "Only this catalog system id. Omit to search every catalog.", "type": "string" }, "query": { "description": "Text to look for in a component's id, role or traits.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "ui_builder_search_components", "outputSchema": { "type": "object" } }, { "description": "Record the pull request that implements a design: its URL, its `status` (draft, open, merged, closed), the design `revision` it implements, and — once you have compared the PR's rendered previews with the design — `previewMatch` {status: match|mismatch|unknown, evidence: a URL to the comparison, note}. Replaces the whole record; pass only `designId` to clear it. Writing the same record again changes nothing and wakes nobody. Needs write access to the design.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "pr": { "description": "The pull request URL.", "type": "string" }, "previewMatch": { "additionalProperties": false, "properties": { "evidence": { "type": "string" }, "note": { "type": "string" }, "status": { "enum": [ "match", "mismatch", "unknown" ], "type": "string" } }, "required": [ "status" ], "type": "object" }, "revision": { "description": "The design revision the PR implements.", "type": "integer" }, "status": { "description": "Defaults to open.", "enum": [ "draft", "open", "merged", "closed" ], "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_set_implementation", "outputSchema": { "type": "object" } }, { "description": "Say what a design is for. **Replaces the whole record**: send every link you want kept, and omit one to clear it — so read ui_builder_get_links first if you are adding to what is already there. `issue`, `reference`, `pr` and `thread` are absolute http or https URLs, at most 2 KB each; `previous` is a design id on this host, not a URL. Anything else is refused with the reason. Sending an empty record clears it. Record the `pr` when you open one for a design you built here: it is what lets the next session, and the person who filed the issue, find one from the other.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "issue": { "description": "The tracker issue this design is for.", "type": "string" }, "pr": { "description": "The pull request that implemented it.", "type": "string" }, "previous": { "description": "The design id on this host that this one continues.", "type": "string" }, "reference": { "description": "The frame in the design tool it reproduces.", "type": "string" }, "thread": { "description": "A permalink to a discussion held elsewhere, such as a chat thread. It does not replace this server's comments for a server-homed design: keep that discussion on the design.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_set_links", "outputSchema": { "type": "object" } }, { "description": "Attach the picture a design is being built against — a Figma frame, a screenshot of a shipped screen, a mock — as its reference overlay, or `clear` it. The same overlay the browser editor's Frame, density and reference panel shows, so a person opening the design sees what you attached. Kept beside the design and never part of it: no node holds it, no export sees it, the revision does not move. Send PNG, JPEG, WebP or SVG bytes in `imageBase64`. For a Figma frame, fetch the picture with your Figma tools (a screenshot of the node) and pass the frame's URL as `sourceUrl`; this host fetches nothing itself. State the export scale as `density` (2 for a Figma 2x export) or in the name (`[email protected]`): without it a screen-shaped picture is read across the frame's width and anything else at the design's own density. The reply says what the picture is against the frame — size in dp, density, whether it is a screen or a region — and whether pixel comparison means anything. Marks drawn in the editor are kept; the alignment is reset, as a new picture in the editor does. A user-supplied image is stored on this host: say so, and attach it only with their permission.", "inputSchema": { "additionalProperties": false, "properties": { "clear": { "description": "Remove the reference, its marks and pieces instead.", "type": "boolean" }, "density": { "description": "The picture's pixels per dp, e.g. 2 for a 2x export, 2.625 for a Pixel screenshot.", "type": "number" }, "designId": { "type": "string" }, "imageBase64": { "description": "The picture, base64. PNG, JPEG, WebP or SVG; at most the host's reference size limit.", "type": "string" }, "name": { "description": "What the editor calls it. An `@2x` suffix declares the density.", "type": "string" }, "sourceUrl": { "description": "Where it came from, such as the Figma frame URL. Provenance only; never fetched.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_set_reference", "outputSchema": { "additionalProperties": false, "properties": { "attached": { "type": "boolean" }, "designId": { "type": "string" }, "facts": { "anyOf": [ { "additionalProperties": false, "properties": { "advice": { "type": "string" }, "density": { "type": "number" }, "densityBucket": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "densitySource": { "type": "string" }, "designDensity": { "type": "number" }, "fit": { "type": "string" }, "frameHeightDp": { "type": "integer" }, "frameWidthDp": { "type": "integer" }, "heightDp": { "type": "integer" }, "heightPx": { "type": "integer" }, "kind": { "type": "string" }, "pixelComparable": { "type": "boolean" }, "recommendedFit": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthDp": { "type": "integer" }, "widthPx": { "type": "integer" } }, "required": [ "widthPx", "heightPx", "density", "densitySource", "widthDp", "heightDp", "frameWidthDp", "frameHeightDp", "designDensity", "kind", "fit", "pixelComparable", "advice" ], "type": "object" }, { "type": "null" } ] }, "notes": { "items": { "type": "string" }, "type": "array" }, "reference": { "anyOf": [ { "additionalProperties": false, "properties": { "heightPx": { "type": "integer" }, "mediaType": { "type": "string" }, "name": { "type": "string" }, "sourceUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthPx": { "type": "integer" } }, "required": [ "name", "mediaType", "widthPx", "heightPx" ], "type": "object" }, { "type": "null" } ] }, "schema": { "const": "compose-ui-builder-reference-attached/v1", "type": "string" } }, "required": [ "schema", "designId", "attached" ], "type": "object" } }, { "description": "Share a design with somebody else, or take that sharing back. `actorId` is the other party's actor id as this server spells it — `github:<login>` for a signed-in person, `operator` for the token holder, `agent:<fingerprint>` for another agent's grant; ui_builder_design_access lists the ones a design already carries. A `viewer` may read and export, an `editor` may also change the design, and neither may share it on. Only the design's owner may share it, and an agent acting under an approved grant shares as the person who approved that grant. Pass visibility instead of actorId to choose private or public (read only). Private keeps existing invited collaborators.", "inputSchema": { "additionalProperties": false, "properties": { "actorId": { "description": "Who to share with, e.g. github:octocat.", "type": "string" }, "designId": { "type": "string" }, "revoke": { "description": "Take this actor's access away instead.", "type": "boolean" }, "role": { "description": "editor or viewer. Defaults to viewer.", "type": "string" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "visibility": { "description": "Change visibility instead of an actor grant. Public is read only. Private keeps invited collaborators.", "enum": [ "private", "public" ], "type": "string" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_share_design", "outputSchema": { "type": "object" } }, { "description": "Check a design without saving it: a whole `document`, a stored design by `designId`, or `operations` against a stored design exactly as ui_builder_apply would apply them. Runs the same checks the real call does — document shape, catalog pin, the catalog's own validation, the mutation reducer — and then the Compose export gate, which is the list the editor's problems panel shows. Returns `{valid, problems:[{severity, source, code, message, nodeId?, field?, operationIndex?}]}`; `valid` is false exactly when a problem is an error. Nothing is written, no revision moves and nobody watching the design is notified. The shapes are published as the resources compose-preview://schemas/ui-builder-document-v1.json and compose-preview://schemas/design-mutation-v1.json.", "inputSchema": { "additionalProperties": false, "properties": { "baseRevision": { "description": "The revision the operations were written against; a stale one is reported as a warning.", "type": "integer" }, "designId": { "description": "A stored design to check, or to check `operations` against.", "type": "string" }, "document": { "description": "A whole DesignDocumentV1 to check.", "type": "object" }, "operations": { "description": "DesignMutationV1 objects to check against `designId`'s current document, as ui_builder_apply takes them.", "items": { "type": "object" }, "type": "array" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" } }, "type": "object" }, "name": "ui_builder_validate", "outputSchema": { "additionalProperties": false, "properties": { "designId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "problems": { "items": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "field": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "message": { "type": "string" }, "nodeId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "operationIndex": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "severity": { "type": "string" }, "source": { "type": "string" } }, "required": [ "source", "code", "message" ], "type": "object" }, "type": "array" }, "revision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "schema": { "const": "compose-preview/ui-builder-validation/v1", "type": "string" }, "valid": { "type": "boolean" } }, "required": [ "schema", "valid", "problems" ], "type": "object" } }, { "description": "See a design the way a person in the editor sees it: a PNG of the canvas with the overlays drawn on — the `selection` outline, the `reference` picture when one is attached, the discussion's `comments` pins, and the layout `bounds` — and beside it JSON with the revision, each visible node's id and box, each pin's thread and position, all in the returned image's pixels. The picture is a short-lived signed https link by default; `inline: true` puts the bytes in the reply as well. The frame is the PNG export (`renderer: \"export\"`, the editor's own renderer), which reports no node boxes; `renderer: \"native\"` draws real Compose on a host with a native render lane, reports every node's box so the selection can be outlined, and needs the ui-builder-export capability. A node with no box is reported, never drawn at a guessed position. Not an McpResponseEnvelopeV1.", "inputSchema": { "additionalProperties": false, "properties": { "designId": { "type": "string" }, "include": { "description": "Overlays to draw. Defaults to comments, reference, selection; [] draws the bare frame.", "items": { "enum": [ "reference", "bounds", "selection", "comments" ], "type": "string" }, "type": "array" }, "inline": { "description": "Also return the PNG as an image block. Defaults to false; a host with no public origin always does.", "type": "boolean" }, "renderer": { "description": "Defaults to export.", "enum": [ "export", "native" ], "type": "string" }, "revision": { "description": "A past revision. Omit for the current one.", "type": "integer" }, "selection": { "description": "Node ids to show as selected.", "items": { "type": "string" }, "type": "array" }, "token": { "description": "A grant token from poll_access, when you cannot set the X-Compose-Preview-Token header yourself — an MCP client fixes its headers at connect time, so this is how a token approved during this session is used in it. Prefer the header where you control it.", "type": "string" }, "viewport": { "additionalProperties": false, "description": "Fit the picture inside this many pixels, keeping its aspect ratio. Omit for the render's own size.", "properties": { "height": { "maximum": 4096, "minimum": 1, "type": "integer" }, "width": { "maximum": 4096, "minimum": 1, "type": "integer" } }, "required": [ "width", "height" ], "type": "object" } }, "required": [ "designId" ], "type": "object" }, "name": "ui_builder_view", "outputSchema": { "additionalProperties": false, "properties": { "boundsUnavailable": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "comments": { "items": { "additionalProperties": false, "properties": { "anchor": { "type": "string" }, "author": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "comments": { "type": "integer" }, "firstComment": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "markId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "nodeId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "number": { "type": "integer" }, "placed": { "type": "boolean" }, "resolved": { "type": "boolean" }, "threadId": { "type": "string" }, "x": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "y": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] } }, "required": [ "threadId", "number", "resolved", "anchor", "placed", "comments" ], "type": "object" }, "type": "array" }, "designId": { "type": "string" }, "frame": { "additionalProperties": false, "properties": { "density": { "type": "number" }, "heightDp": { "type": "integer" }, "renderHeightPx": { "type": "integer" }, "renderWidthPx": { "type": "integer" }, "widthDp": { "type": "integer" } }, "required": [ "widthDp", "heightDp", "density", "renderWidthPx", "renderHeightPx" ], "type": "object" }, "image": { "additionalProperties": false, "properties": { "expiresAtEpochSeconds": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "heightPx": { "type": "integer" }, "mediaType": { "type": "string" }, "scale": { "type": "number" }, "sha256": { "type": "string" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "widthPx": { "type": "integer" } }, "required": [ "widthPx", "heightPx", "scale", "sha256" ], "type": "object" }, "imageBase64": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "include": { "items": { "type": "string" }, "type": "array" }, "nodes": { "items": { "additionalProperties": false, "properties": { "componentId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "height": { "type": "integer" }, "nodeId": { "type": "string" }, "selected": { "type": "boolean" }, "width": { "type": "integer" }, "x": { "type": "integer" }, "y": { "type": "integer" } }, "required": [ "nodeId", "x", "y", "width", "height" ], "type": "object" }, "type": "array" }, "notes": { "items": { "type": "string" }, "type": "array" }, "reference": { "anyOf": [ { "additionalProperties": false, "properties": { "drawn": { "type": "boolean" }, "mode": { "type": "string" }, "opacityPercent": { "type": "integer" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "visible": { "type": "boolean" } }, "required": [ "drawn", "visible", "mode", "opacityPercent" ], "type": "object" }, { "type": "null" } ] }, "renderer": { "type": "string" }, "revision": { "type": "integer" }, "schema": { "const": "compose-preview/ui-builder-view/v1", "type": "string" }, "selection": { "items": { "type": "string" }, "type": "array" } }, "required": [ "schema", "designId", "revision", "renderer", "include", "selection", "image", "frame" ], "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:d43ecd93f96882d8cd8d5cb412e70b8abbed944120f74b4beb541e69066395be | sha256sum