Compose Preview Catalogs

io.github.yschimke由 GitHub 账号 yschimke 发布v3.159.0更新于 Nov 11, 2026

Browse, inspect and render Jetpack Compose Material 3 and Wear component catalogs.

发布方自己的服务:Routepot

已验证Streamable HTTP可网页运行效率与工作流开发者工具媒体与设计

概览

AI 生成的概览

托管的 Jetpack Compose 预览目录:让助手列出、渲染、对比和查看 Material 3 与 Wear 组件预览,并编辑 UI Builder 设计。

可以做什么
  • 列出托管目录、其中的预览与数据产品,并查看服务器状态
  • 渲染单个预览或设备与覆盖项组合矩阵,输出语义、PNG 或 SVG,并列出可识别的设备 id
  • 按 testTag 对比预览,读取预览的渲染历史、差异与历史渲染
  • 搜索目录组件,并创建、读取、校验、导出和替换 UI Builder 设计
  • 共享、重命名、移入回收站与恢复设计,并管理其与 issue、PR、讨论串的关联
  • 读取、发表、解决、确认和回应设计评论串
适用场景
当助手需要在没有本地构建的情况下查看或对比 Compose Material 3 / Wear 组件预览时使用;也适合团队把 UI Builder 设计托管在该服务上,并希望由代理来编辑、导出或参与讨论的场景。
运行要求
远程 Streamable HTTP 端点 preview.coo.ee,无需本地运行时。读取已发布预览需要 preview 授权,按需渲染和数据产品需要 live 授权,通过 request_access 与 poll_access 获取。获得的令牌放在 X-Compose-Preview-Token 请求头中,无法设置请求头时作为各工具的 token 参数传入。
安装前请注意
该令牌是凭据,不要写入共享记录,只通过请求头或工具参数传递。许多工具会修改权威状态:创建、替换、移动、重命名、删除和共享设计,发表评论以及设置关联;ui_builder_set_links 会整体替换关联记录。删除仅在约一天内可恢复。渲染与导出通道每个服务器最多四个并发请求,频繁使用可能被限流。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Compose Preview Catalogs,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.yschimke%2Fcompose-preview/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "compose-preview-catalogs": {
      "type": "http",
      "url": "https://preview.coo.ee/mcp"
    }
  }
}

README

Compose Preview Server

The server behind compose-preview serve: catalog hosting, live render sessions, the playground, and the browser viewer surfaces. Its history was extracted from yschimke/compose-ai-tools; the CLI remains there and launches this repository's distribution.

What this repository ships

Archives on each GitHub release, and nothing on Maven Central.

AssetWhat it is
compose-preview-server-<v>.tar.gzthe server: catalog hosting, the HTTP routes, the playground, the viewer surfaces. What compose-preview serve, browse and ui-builder launch
compose-preview-viewer.htmlthe portable MCP App viewer; yschimke/compose-preview-mcp re-publishes it with the local MCP server
compose-preview-mcp-<v>.tar.gza bridge, not this repository's build: compose-preview-mcp's newest distribution re-attached under this release's name, for CLIs older than compose-ai-tools#5929 that still fetch it from here

The Compose/Wasm frontend is not an asset of these releases. It is built and released by yschimke/compose-ui-builder as compose-preview-ui-builder-web-<v>.zip on that repository's own releases, and this build resolves it from there — the server archive carries an unpacked copy either way, and the standalone zip is for serving the editor yourself or pointing an existing serve at with --ui-builder-dir.

Nothing here is a Maven coordinate. Six modules used to publish — compose-preview-serve, compose-preview-mcp, and four more that existed on Central only because the first one's POM named them — and the arrangement cost more than it bought. A project dependency reaches a published POM as a coordinate, so adding one to :server meant publishing the dependency too; getting that wrong shipped compose-preview-server:ui-builder-export-jvm:unspecified in 3.1.0 and an unresolvable compose-preview-serve from 3.3.0 through 3.8.0. Six releases nobody could resolve, for transitives nobody wanted.

The one library consumer was compose-ai-tools' :cli, which compiled two wire-drift tests against compose-preview-serve. Those tests launch the distribution now (compose-ai-tools#5436) — the artifact serve runs anyway, so they check the wire that actually ships. Released coordinates up to and including 3.24.0 stay resolvable on Central; there simply will not be new ones.

render-host exists because rendering a packed bundle and reading a preview timeline out of git open no sockets, and a caller doing only that should not link ktor-server-*, jmdns and kotlin-reflect to do it. It is published from compose-ai-tools, not from here: that is where everything it depends on lives, and offline behaviour belongs in that layer (#180). It used to be this repository's :render-host module, publishing as compose-preview-render-host; that coordinate stays resolvable at its final 2.x for anyone pinned to it, and the new one is on compose-ai-tools' version line. The measured before/after and the transitives it deliberately cannot drop are recorded in its build file there, and checkRenderHostIsServerFree moved with it.

The UI builder is a second repository — yschimke/compose-ui-builder — and :server consumes it as releases. Its :ui-builder-runtime owns authoritative persistent design state, exact catalog validation and revision-pinned export orchestration there; :server supplies HTTP/authentication and adapts its narrow render request onto the render host. The runtime therefore has no Ktor, daemon/render-host, MCP or Compose UI dependency, while the offline render host has no UI-builder protocol or service edge. Three jars and a BOM come from Maven Central at composeai-ui-builder in gradle/libs.versions.toml, and the editor archive from that repository's GitHub release; -PcomposeUiBuilderDir swaps all four for a checkout when working on both at once.

The build is intentionally repository-independent. Compose Preview implementation artifacts resolve from Maven Central at the version in gradle/libs.versions.toml; wire contracts resolve separately from compose-preview-contracts. There is no mavenLocal() repository and no shared version catalog outside this repository. A composite build is opt-in only — -PlocalBuilds=tools,daemon,contracts for the upstreams, -PcomposeUiBuilderDir for the UI builder — and for unreleased contract or generator changes an explicit local dependency manifest selects artifacts compiled from local checkouts. Leaving those options unset retains the released dependency graph.

Java

Run the distribution on Java 17 or newer. The UI builder's PNG/SVG export needs Java 21.

The two numbers are one difference, and it is worth stating plainly rather than leaving to be inferred from build files. The server itself, mcp serve, and every artifact this repository publishes target Java 17, because compose-ai-tools' CLI compiles against them on a 17 toolchain and its serve / mcp serve commands launch this distribution's start script as a separate process, resolving java from JAVA_HOME/PATH. Only the UI builder's renderer is above that floor: the design it rasterizes is drawn by a Compose preview compiled for Java 21, packaged into the render bundle, and unpacked into a daemon that runs on the server's own JVM.

On an older JVM the server still starts and everything else works; the UI builder loses PNG and SVG export and says so at startup, naming the version it found and the one it needs. Point JAVA_HOME at a Java 21 JDK to get it back, or pass --ui-builder-state-dir none to run without the UI builder at all. The published container image (deploy/image/Dockerfile) is built on Temurin 21 and clears both.

Both floors are declared once, as java-server and java-ui-builder in gradle/libs.versions.toml, which is also where the reasoning lives. :server:checkServerJvmFloor fails the build if anything above java-server reaches the distribution's classpath, and the render bundle carries java-ui-builder as data so the startup message cannot drift from the bytes it describes.

Renovate retains each Java 17/21 lane and the Temurin 21 image on its selected major while allowing maintenance updates. The rationale, evidence from the Java 25 proposal, and requirements for adopting a newer runtime are documented in Java version policy.

Build

./gradlew check needs one JDK: 17. The UI builder's frontend lane compiles at 21 in its own repository, and the only lane here that still wants both JDKs is visual-harness, which builds that repository's Wasm distributions from a checkout. Gradle finds a 21 installed anywhere it already scans (/usr/lib/jvm, SDKMAN, asdf, jabba); if it cannot, the failure is No matching toolchains found for requested specification: {languageVersion=21} and the fix is to install one, not to lower the target.

shell
./gradlew check ktfmtCheckAllnpm --prefix serve-web cinpm --prefix serve-web run verify

The independently installable visual harness lives in preview-harness/. The experimental Compose/Wasm frontend lives in wasm-ui/. The UI builder itself — editor, renderer, artwork and the Jetcaster fixtures — lives in yschimke/compose-ui-builder; this build resolves its editor archive, runtime and export from that repository's releases, and the harness builds the renderer and fixture distributions from a checkout of it. The server distribution packages the editor at /ui-builder/; the existing catalog-scoped /wasm/<system>/ preview application remains a distinct feature and route. The editor route opens an interactive Wasm editor around the frozen Jetcaster design; clean benchmark modes remain available to the independent visual harness. The editor mounts an exact retained renderer runtime under /ui-builder/runtime/<runtimeId>/ in a sandboxed iframe and receives measured node/slot geometry without placing editor overlays in the Compose tree. Catalog runtimes retain a small commit-pinned source descriptor after their catalog generation is swept, so an older design revision can recover its exact runtime after a restart. The compressed archive shares the bounded catalog blob pool; expanded historical trees are process-local leases with an inactivity timeout and a hard count ceiling rather than an unbounded second artifact store.

The Remote Compose authoring extension is behind the default-off compile-time option -PuiBuilderRemoteCompose=true. It spans two repositories — the MCP adapter's half is generated here, and the server's half is baked into the UI-builder export at its build time, so enabling the server half means building against a UI-builder checkout with the option (-PcomposeUiBuilderDir=…). See feature scope and verification.

After a restart, configured catalogs keep their home-page cards while they load. With --catalog-cache-dir on a persistent volume, each card can show its last successful hero thumbnail with a small “Loading catalog…” label. The thumbnail is scoped to the catalog's configured repository and branch. Opening a pending catalog promotes it ahead of the remaining startup fetches; the fetch already running finishes first. The loading page retries automatically until the catalog is available.

Agent plugins

Experimental public Remote Compose component previews can be hosted from operator-installed immutable bundles, with anonymous HTML/unfurls, descriptor discovery and an optional Livery viewer. Livery's livery-server library owns these routes; this host supplies configuration and policy. This consumer uses the published Livery 0.8.0 library from Maven Central. See component publication hosting for installation, configuration, cache/withdrawal behavior and the separate private-editor boundary.

Start at https://preview.coo.ee/start/ (or https://ui.coo.ee/start to design a new screen). A coding agent installs one plugin, compose-preview from yschimke/compose-agent-plugins; it carries the compose-preview and compose-ui-builder skills, the local MCP server and this server's hosted catalog endpoint. In Claude Code:

text
/plugin marketplace add yschimke/compose-agent-plugins/plugin install compose-preview@compose-agent-plugins

A host with no shell or Java (Claude chat, Cowork, ChatGPT) uses the compose-catalogs plugin or the hosted MCP URL https://preview.coo.ee/mcp instead, never both. Other hosts are in the host setup notes; moving from the old marketplace is migration from compose-ag-plugin.

Remote catalog MCP

The server can expose every hosted catalog through one aggregate Streamable HTTP MCP endpoint at /mcp. Enable it with --agent-grants --catalog-mcp; published resources require a short-lived preview grant, while made-to-order renders and structured data products require a live grant. The endpoint is separate from the stateful UI-builder authoring MCP surface, but both use the same authenticated user approval and revocation flow. See the catalog MCP design and setup guide.

Local daemon MCP

The local stdio MCP server agents and editor plugins use, compose-preview-mcp, moved to yschimke/compose-preview-mcp with its history and releases there on its own version line. compose-preview mcp serve fetches it from that repository's releases. Its tools, the design_open editor app and the .rc viewer are documented there (docs/LOCAL_MCP.md). This repository keeps the MCP App pages the hosted /mcp serves (mcp-app/compose-preview-viewer.html, mcp-app/preview-library.html); compose-preview-mcp copies them from each release by tag.

On a phone

The pages work on phones, and the site installs as an app with a share target: a screenshot shared to it opens the bug report with the image attached. serve --lan prints a QR code for opening a laptop's server on a phone. A plain-http LAN address is not a secure context, so installing the app, Web Share and the clipboard need HTTPS or adb reverse. See Compose Preview on a phone.

Spatial and WebXR previews

A portable bundle can publish an XR preview as a version-one SpatialScene document and its panel textures:

text
previews/<preview-id>.spatial/scene.jsonpreviews/<preview-id>.spatial/<panel>.png

The viewer opens these scenes in an orbitable Three.js/WebGL stage and offers Enter VR when the browser exposes an immersive-vr WebXR session. WebXR requires a secure context, so a headset must reach the server over HTTPS (localhost remains suitable for desktop WebGL development). Uploaded bundles may carry JSON scene documents and PNG/JPEG/WebP textures only; all assets are served from the scene's same-origin /spatial/ route.

Build and run the standalone distribution with:

shell
./gradlew :server:distTartar -xzf server/build/distributions/compose-preview-server-*.tar.gz./compose-preview-server-*/bin/compose-preview-server help

The binary has five commands, and help lists them:

CommandWhat it does
serveHost previews — fetched bundles, published catalogs, or a local module's @Preview functions with --module / --discover.
uiBuild this project's previews and open the Compose UI builder against them.
playgroundserve with the snippet compile lane admitted.
designRender, export or read a UI-builder design from a server that is already up. The one command that does not serve.
help [command]The command list, or one command's options.

Flags may still be passed with no command in front of them: compose-preview-server --module app is exactly compose-preview-server serve --module app, and stays supported.

A local module's page (serve --module / --discover, and compose-preview browse) has a rebuild button: after an edit it asks the build host for :<module>:composePreviewCompile and shows the result without restarting the server. When only the classes changed, the running daemon swaps them in and its cached renders are dropped; when the daemon's classpath or the preview set changed, the session restarts on the new build. A failed build leaves the last good renders on screen. The same POST /{session}/rebuild serves Bazel workspaces, whose build host answers the compile with a rebuild of the module's targets.

browse also rebuilds on save (--no-watch turns it off; serve opts in with --watch). It watches a Gradle module's project directory, skipping build/ and tool state, or a Bazel module's source directories, and rebuilds once a burst of saves has gone quiet. Open pages follow GET /{session}/reload, a long poll: new renders replace the images in place, a restart reloads the page, and a failed build shows stale: with the reason while the last good renders stay. A Gradle edit outside the module (a sibling module, a shared build script) is not watched; press rebuild.

ui needs a build host — the compose-preview binary — because discovering and building a local Gradle project is work this server asks for over a pipe rather than doing itself. The builder's palette is a packaged design-system catalog; what ui adds is the project, by pointing --ui-builder-components at the module's discovered components.json so the Compose export generates call sites for your composables. From a checkout with the CLI installed:

shell
compose-preview-server ui --module app

design is the client half of that lane, and the one command here that starts no server: it talks to one that is already up — a local serve, or a deployment — and writes a design's pixels or its generated source to a file, which is what a session otherwise re-invents as a curl into /mcp, a jq to unwrap the envelope and a base64 -d (#529):

shell
export COMPOSE_PREVIEW_TOKEN=...          # or let the command ask a human to approve a grantcompose-preview-server design list --server https://preview.example.comcompose-preview-server design status --workspace . --summarycompose-preview-server design render spotify-wear-widget -o cover.pngcompose-preview-server design export spotify-wear-widget -o Widget.ktcompose-preview-server design get spotify-wear-widget > design.json

The credential is read from $COMPOSE_PREVIEW_TOKEN (or the older $COMPOSE_PREVIEW_UI_BUILDER_TOKEN that scripts/ui-builder/design-sync.mjs reads), never from a flag. With neither set — or after a restart has dropped the grant — the command runs the server's own device-code flow: it prints an approval link and a code, waits for a human, and carries on. A refused export prints the generator's own diagnostics to stderr and exits non-zero, writing nothing, so it composes in CI.

design status is the bounded SessionStart probe: it reads the checkout's ui-builder/designs/index.json, totals unacknowledged comments on server-home designs, and compares each tracked temporary copy with the server's current document. It never starts an authorization flow, never follows a tracked server URL to another origin, and --summary prints one redacted line (or nothing when there is nothing to act on). --json emits the versioned status envelope.

--local is the half of that command which needs no server at all: it runs the same generator, compiler and render daemon a server would, here, against a catalog bundle on disk — and says why a frame is missing rather than only that it is, which the wire reply cannot (#551). That is what makes a broken host debuggable: design get captures its document (a read, not the render lane under suspicion) and the file replays anywhere.

shell
compose-preview-server design get spotify-wear-widget --server https://preview.example.com > doc.jsoncompose-preview-server design render --document doc.json --local \  --catalog wear-m3.bundle --assets ./assets -o replay.pngcompose-preview-server design export --document doc.json --local   # the generated Kotlin, no server

A local render prints the classpath it resolved, the daemon opener it built and the compiler's own diagnostics; --components <catalog>=<components.json> names the record a record-driven catalog's call sites are proven against, exactly as serve --ui-builder-components does.

Browser clients can read a catalog's published starting documents with GET /api/ui-builder/v1/catalogs/{system}/templates. It requires UI-builder read access and respects the host's catalog restrictions. The shared CatalogTemplateDocumentsV1 response includes a schema version, the complete catalogPin (system, revision, capability digest and runtime), and a templates map keyed by template id. Chooser order comes from the catalog's ordered metadata, rather than the document map. A catalog refresh that has not yet aligned the documents with the served capability returns 409; clients should retry and retain their last matching set. Responses use Cache-Control: no-store; an offline editor explicitly stores validated documents under the complete catalog pin in its browser store.

A signed-in person can browse every design the service permits them to read at /ui-builder/designs. The page separates owned designs from designs shared by somebody else, shows the exact service reason when one cannot open, and lets an owner manage sharing inline. It is actor-scoped and has no connection to the all-designs operator surface at /admin/ui-builder.

/ui-builder/projects groups multiple design files, shared JSON resources and collaborators into an app workspace. Projects can load commit-pinned .uid files from GitHub and propose reviewed edits as a pull request while displaying each design's canonical home; see UI_BUILDER_HOSTED_PROJECTS.md.

A served catalog's own composables can also be offered inside the builder's catalogs as a component pack (--ui-builder-packs confetti-mobile=mobile,confetti-wear=wear), switched on by an author from the editor's settings; see docs/design/UI_BUILDER_COMPONENT_PACKS.md.

Releases attach that distribution to the GitHub release, then publish the reusable ghcr.io/yschimke/compose-preview-host image. Start your own instance with deploy/example, an independent Compose example with persistent state and optional HTTPS, and grow into the full-featured stack in deploy/image when you need rollouts, auto-updates or a large host. Deploying your own covers what this repository ships and what belongs in your own deployment configuration.

Releasing

One lane in release.yml: build compose-preview-server-<v>.tar.gz and attach it, with compose-preview-viewer.html, to the GitHub release, then build the compose-preview-host image.

The GitHub release stays a draft until that lane has succeeded, so a failed build never leaves a tag whose assets do not exist.

There used to be a second, skippable Maven lane, with a release:no-maven label and a publish_maven workflow input to turn it off. Both are gone with the publication — every release is now what that label used to ask for.

Repository boundary

checkServeModuleBoundary walks the resolved runtime classpath, transitives included. It rejects project dependencies, renderer/daemon implementations, the Gradle plugin, and any unregistered ee.schimke.composeai coordinate. Update its positive allowlist only when a reviewed dependency floor change is intentional.

The source package remains ee.schimke.composeai.cli.serve for binary/source continuity. A package rename is independent of repository ownership and is not part of the extraction.

来源:README.md,提交 90c4d30

工具

71

request_access

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).

输入参数labelscopettlSecondscapabilities

poll_access

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.

输入参数urlModerequestId必填waitSecondsdeviceSecret必填

status

Report readiness, the aggregate catalog set, and which host this is: `origin`, the canonical origin designs here are homed at, and `originAliases`, other hostnames that reach this same server.

输入参数token

catalog_list_projects

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'.

输入参数token

catalog_library

Preview Catalogs

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.

输入参数tokenprojectId

ui_builder_open

UI Builder

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.

输入参数tokenagentNameagentModel

catalog_list_previews

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.

输入参数limitquerytokenoffsetcatalog必填

catalog_render_preview

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).

输入参数uritokencatalogobserveoverridespreviewId

catalog_render_matrix

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.

输入参数uriaxes必填tokencatalogobserveoverridespreviewId

catalog_list_devices

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.

输入参数token

catalog_diff_semantics

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.

输入参数uriother必填tokencatalogoverridespreviewIdotherOverrides

catalog_history_list

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.

输入参数uritokencatalogpreviewId

catalog_history_diff

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.

输入参数tourifromtokencatalogpreviewId

catalog_history_read

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.

输入参数uriblobtokencommitcatalogpreviewId

ui_builder_list_catalogs

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.

输入参数fulltokenagentNameagentModelcomponentIds

ui_builder_search_components

Find catalog components by id, display name, Compose symbol, role or trait, e.g. `TextField`, `text field`, `OutlinedTextField`, `Button`, `Card`. Case, spaces, hyphens, underscores, slashes and camelCase are ignored, and the components the query names come first: an exact name, then a prefix, then a name containing it, then role and traits. 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.

输入参数query必填tokencatalogagentNameagentModelcatalogSystemId

ui_builder_list_designs

List the UI-builder designs on this server, newest first, with the cursor to continue.

输入参数limittokencursoragentNameagentModel

ui_builder_get_design

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. `home`, at the top of the reply, is where the design is canonical (`{kind: server, url, designId}` or `{kind: repo, path}`): edit it there. It is absent when none is recorded (a design made before homes existed, or on a host with no public origin), and then the canonical home cannot be verified. 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.

输入参数tokendesignId必填revisionagentNameagentModelincludeCatalog

ui_builder_preview_catalog_recovery

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.

输入参数tokendesignId必填agentNameagentModel

ui_builder_await_design

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.

输入参数tokendesignId必填agentNameagentModelwaitSecondsafterSequence必填includeCatalog

ui_builder_create_design

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.

输入参数titletokendesignId必填documentagentNameagentModelvisibilityfromDesignIdincludeCatalog

ui_builder_apply

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.

输入参数tokenclientIddesignId必填agentNameagentModeloperations必填operationId必填baseRevision必填

ui_builder_move_design_home

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.

输入参数tokendryRundesignId必填agentNameagentModelsourceHome必填targetHome必填operationId必填baseRevision必填

ui_builder_replace_design_document

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.

输入参数tokendryRundesignId必填document必填agentNameagentModeloperationId必填baseRevision必填

ui_builder_export

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.

输入参数tokenformatdesignId必填revisionagentNameagentModel

ui_builder_validate

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.

输入参数tokendesignIddocumentagentNameagentModeloperationsbaseRevision

ui_builder_put_asset

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.

输入参数tokenassetKey必填designId必填agentNameagentModelimageBase64必填

ui_builder_design_access

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".

输入参数tokendesignId必填agentNameagentModel

ui_builder_share_design

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.

输入参数roletokenrevokeactorIddesignId必填agentNameagentModelvisibility

ui_builder_rename_design

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.

输入参数title必填tokendesignId必填agentNameagentModel

ui_builder_delete_design

Delete a design: it moves to the trash with its history, access list, overlay and discussion, and is gone from every listing and tool until ui_builder_restore_design brings it back, which works until `restorableUntilEpochMillis` in the reply (a day). After that it is purged for good. Only the owner may delete, or an agent acting for the owner: on a design it created itself under its current grant, or on any of the owner's designs when the approver also ticked `ui-builder-destructive` — never an editor, a viewer, or anybody merely holding a write grant. Without that capability a session can clean up the designs it made and nobody else's; ask for it with request_access when you are asked to delete existing designs. A trashed id cannot be reused until it is restored or purged. Not the released envelope: the contract has no delete, so the reply names the design and its restore deadline.

输入参数tokendesignId必填agentNameagentModel

ui_builder_list_trash

The designs in the trash that you could restore — ones you deleted, or ones you own — most recently deleted first, each with who deleted it and its `restorableUntilEpochMillis`. Use it to undo a ui_builder_delete_design you regret, or to check what a cleanup removed. Takes no arguments.

输入参数tokenagentNameagentModel

ui_builder_restore_design

Bring a deleted design back out of the trash exactly as it was: the same revision, history, access list, overlay and discussion. Allowed to whoever could have deleted it, until its `restorableUntilEpochMillis`; after that it is not found. The reply is the design's listing entry.

输入参数tokendesignId必填agentNameagentModel

ui_builder_list_comments

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.

输入参数tokendesignId必填agentNameagentModel

ui_builder_post_comment

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.

输入参数xybody必填tokenmarkIdnodeIddesignId必填threadIdagentNameagentModeldisplayName

ui_builder_resolve_comment_thread

Close a comment thread once it is answered, or reopen one by passing `resolved: false`. The resolution is attributed to you and is reversible.

输入参数tokendesignId必填resolvedthreadId必填agentNameagentModel

ui_builder_acknowledge_comment

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.

输入参数tokendesignId必填threadIdagentNameagentModel

ui_builder_react_to_comment

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.

输入参数ontokendesignId必填reaction必填agentNamecommentId必填agentModel

ui_builder_await_comments

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.

输入参数tokendesignId必填agentNameagentModelwaitSecondsafterSequence必填

ui_builder_render_native

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.

输入参数tokendesignId必填revisionagentNameagentModel

ui_builder_view

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. With no `renderer`, a non-empty `selection` is drawn on the native frame when the host has a lane and the caller the capability, and otherwise on the export with a note saying why it is not outlined. A node with no box is reported in `notes`, never drawn at a guessed position. Not an McpResponseEnvelopeV1.

输入参数tokeninlineincludedesignId必填rendererrevisionviewportagentNameselectionagentModel

ui_builder_check_design

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, in both the light and the dark theme when a colour follows the theme (the finding names the theme that fails), and reported as a warning, never an error. `hostLogic` checks a design's host logic would run (it loads, exports `init` and `onAction`, and `init` answers what the design can hold); a design without host logic passes it for free. `guidelines` runs only when named: a model judges the design against the Android design guides (developer.android.com) for its platform and reports each broken rule as a warning or note with its source. It uses this host's shared model key, so it runs only for the accounts the operator enabled and is reported as skipped for everyone else; with `rendered: true` the visual rules are judged on the native render too.

输入参数tokenchecksdesignIddocumentrenderedrevisionagentNameagentModeloperationsbaseRevision

ui_builder_simulate_action

Run a stored design's host logic — the JavaScript in its `hostLogic` that stands in for the host feeding it, answering host actions by setting host inputs — headless, without a browser: `init`, then each of `actions` in order, as the editor's canvas runs it. Each action is `{"name": …, "value": …}`, exactly what a design's host action sends (a value is text, a whole number or a decimal; omit it for none). Returns `summary` first, then `ok` and `steps`: for `init` and each action, the program's private `state`, every host input's `values` as the canvas would draw them, which inputs the step `set`, and the `error` when its answer could not be used. A failing step keeps the values before it and the next action is still sent; a program that overruns its budget stops the run (`stopped`). Use it to show the logic works (a calculator shows 3 after `1 + 2 =`) and to find which key breaks it. Nothing is saved. At most 200 actions.

输入参数tokenactionsdesignId必填revisionagentNameagentModel

ui_builder_guidelines_prompt

Read the exact prompt a design-guidelines model is given for a design, before anybody spends a key on it: the rules for the design's platform (Android design guidance from developer.android.com, each with its source), the fixed system prompt, the user message with the design tree and Compose source, the JSON schema the verdicts must follow, a sentence on where each part comes from, and the pictures as image blocks — a Wear screen on its device (and unrolled when it scrolls), a Wear widget in the Samsung and Pixel Watch containers, a phone or tablet design at phone and tablet size. It spends no key. Judge it with your own model, then record the verdicts with ui_builder_record_guidelines so the editor and other agents see them. `rendered: false` leaves out the pictures and source (and the visual rules), and needs only read access; otherwise it needs the ui-builder-export capability.

输入参数tokendesignId必填renderedrevisionagentNameagentModel

ui_builder_get_guidelines

Read a design's latest design-guidelines result, whoever ran it — a person in the editor on their own key, ui_builder_check_design on this host's key, or an agent that recorded verdicts with ui_builder_record_guidelines. Returns the record (model, revision, rules asked, verdicts, `ranBy`), the findings it implies, and `stale: true` when the design has changed since it was checked.

输入参数tokendesignId必填agentNameagentModel

ui_builder_record_guidelines

Record your own model's verdicts on ui_builder_guidelines_prompt as the design's latest design-guidelines result, so the editor's Issues panel and other agents show them. Pass the `revision` and rule ids the prompt asked (`rules.asked[].id`), and one verdict per rule you answered: `pass`, `fail` or `not_applicable`, with `confidence` 0..1, the `nodeIds` it is about and a one-sentence `reason`. `ranBy` is taken from your credential. Returns what ui_builder_get_guidelines returns.

输入参数asked必填model必填tokendesignId必填revision必填verdicts必填agentNameagentModelrulesVersion

ui_builder_render_design_matrix

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, widget_small_round, widget_small_squircle, widget_small_rectangular, widget_large_round, widget_large_squircle, widget_large_rectangular) or as {widthDp, heightDp, label?, round?}; or a `formFactor` (phone, foldable, tablet, wear, tv, widget, 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, and for a Wear widget (a `widget-container-*` root) its own container in each widget host: Samsung round, Pixel Watch squircle and rectangular, at the container's frame. Widget host cells are drawn natively in that host when the caller holds ui-builder-export and the host has a native lane (`renderer: "native"`); otherwise by the editor's export, masked to the host's outline. 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.

输入参数tokeninlinethemesdevicesdesignId必填revisionagentNameagentModelfontScalesformFactor

ui_builder_record_decision

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.

输入参数notetokenverdict必填designId必填revision必填agentNameagentModeldecisionIddisplayName

ui_builder_await_decision

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.

输入参数fromtokendesignId必填revisionagentNameagentModelwaitSecondsafterSequence

ui_builder_set_implementation

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.

输入参数prtokenstatusdesignId必填revisionagentNameagentModelpreviewMatch

ui_builder_implementation_status

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.

输入参数tokendesignId必填revisionagentNameagentModelincludeExport

ui_builder_find_design_for_pr

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.

输入参数pr必填tokenagentNameagentModel

ui_builder_set_reference

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.

输入参数namecleartokendensitydesignId必填agentNamesourceUrlagentModelimageBase64

ui_builder_compare_reference

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.

输入参数fittokennodeIdsdesignId必填rendererrevisionagentNameagentModeldifferences

ui_builder_list_revisions

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.

输入参数limittokenbeforedesignId必填agentNameagentModel

ui_builder_diff_designs

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.

输入参数a必填btokenagentNameagentModel

ui_builder_restore_revision

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.

输入参数tokendryRundesignId必填revision必填agentNameagentModeloperationIdbaseRevision必填

ui_builder_fork_design

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.

输入参数titletokendesignId必填revisionagentNameagentModelnewDesignId

ui_builder_branch_design

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.

输入参数name必填tokenbranchIddesignId必填revisionagentNameagentModel

ui_builder_list_branches

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.

输入参数tokenstatusdesignId必填agentNameagentModel

ui_builder_merge_branch

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: it reports `merged: false` and `wouldMerge` (true when every command would land) and writes nothing. 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.

输入参数tokendryRunbranchId必填agentNameagentModelskipOperationIds

ui_builder_archive_branch

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.

输入参数tokenbranchId必填agentNameagentModel

ui_builder_compare_branches

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.

输入参数tokendeviceinlinedesignId必填agentNamebranchIdsagentModel

ui_builder_pick_branch

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.

输入参数tokeninlinemessagedesignId必填agentNamebranchIdsagentModel

catalog_list_data_products

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'.

输入参数uritokencatalogpreviewId

catalog_get_preview_data

Fetch the merged accessibility or annotation product for a preview. This lane requires live grant scope.

输入参数urikind必填tokencatalogoverridespreviewId

list-all-documentation

Storybook-MCP-compatible alias that lists every preview as a story.

输入参数token

get-documentation-for-story

Storybook-MCP-compatible preview metadata lookup.

输入参数idtokenstoryId

preview-stories

Storybook-MCP-compatible rendering of one or more story ids. Requires live scope.

输入参数ididstokenobservestoryIdstoryIdsoverrides

版本历史

30
  1. v3.159.0最新Nov 11, 2026
  2. v3.158.0Nov 8, 2026
  3. v3.156.0Nov 6, 2026
  4. v3.155.0Nov 3, 2026
  5. v3.153.0Oct 31, 2026
  6. v3.152.0Oct 30, 2026
  7. v3.151.0Oct 29, 2026
  8. v3.150.0Oct 25, 2026
  9. v3.148.0Oct 24, 2026
  10. v3.147.0Oct 22, 2026
  11. v3.146.0Oct 20, 2026
  12. v3.145.0Oct 19, 2026
  13. v3.143.0Oct 18, 2026
  14. v3.141.0Oct 16, 2026
  15. v3.139.0Oct 15, 2026
  16. v3.138.0Oct 14, 2026
  17. v3.135.0Oct 13, 2026
  18. v3.129.0Oct 12, 2026
  19. v3.122.0Oct 11, 2026
  20. v3.117.0Oct 10, 2026
  21. v3.113.0Oct 9, 2026
  22. v3.110.0Oct 8, 2026
  23. v3.106.0Oct 7, 2026
  24. v3.104.0Oct 6, 2026
  25. v3.103.0Oct 5, 2026
  26. v3.100.0Oct 4, 2026
  27. v3.97.0Oct 3, 2026
  28. v3.91.0Oct 2, 2026
  29. v3.90.0Oct 1, 2026
  30. v3.88.0Oct 1, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Compose 集成