a2ui-compose · v1.0.0 · 2026-08-22 · sha256 d6750d93bb78ee31
a2ui-compose v1.0.0A
Immutable. This exact content is served forever at /api/v1/blob/d6750d93bb78ee31.
---
name: a2ui-compose
description: Compose an A2UI payload (typed atom blocks) and render it into real HTML — a chart, dashboard, status board, decision tree, or any structured UI, once the right atoms are already known (see the a2ui-catalog skill for picking them). Use when asked to SHOW something rather than describe it, and the host can display HTML or open a link. Not for connecting a new agent/host to the MCP server itself (see a2ui-mcp).
license: MIT
metadata:
author: a2uicatalog
version: "1.0.0"
---
# Composing and rendering an A2UI payload
## The payload shape
```json
{
"title": "Weekly numbers",
"theme": "light",
"blocks": [
{ "type": "heading", "text": "This week" },
{ "type": "stat_card", "value": "1,234", "label": "Daily users", "delta": "+12%" }
]
}
```
`blocks` is an ordered array of atoms (the "blocks dialect"). A v1.0 `createSurface`
envelope (templates + dataModel bindings) is also accepted wherever a payload is taken —
`theme` is `light`, `dark`, or `terminal` (the catalog's own dark/monospace brand skin).
## Render, by host capability
- **MCP Apps-capable host** (renders inline in the conversation, no URL, no size
ceiling): `render_surface(payload)`.
- **Any other MCP host**: `preview_url(payload)` — a shareable link on the shared demo
renderer (rate-limited: 10 calls per client per 7 days).
- **No rate limit, your own deployment**: `make_surface_url(payload, renderer_url)` —
renders against a renderer YOU deployed (see the self-hosting quickstart below), or
omit `renderer_url` for the encoded-fragment + BYO guidance.
- **Protocol-free, no MCP client at all**: `POST https://a2uicatalog.ai/api/render` with
the payload as the JSON body — returns a complete self-contained HTML page. Same
guards, same 50-requests/day-per-IP limit as the MCP tools above. `POST
/api/render/batch` does up to 25 payloads in one call with PARTIAL SUCCESS semantics
(one malformed payload doesn't fail the batch).
## Failure modes worth knowing before they surprise you
- **Preview-stage or unpublished atoms** aren't an error — they render as a visible
"not published here" notice rather than being silently dropped, and are named in the
`X-A2UI-Unpublished` response header.
- **Atoms that need a render-time server fetch** (`data_source`, `firestore_read`,
`doc_ai_summary`, `multi_doc_ai_brief`, `gemini_handoff`) are refused with 400 on the
public renderer — deploy your own renderer for those (see below).
- **Limits**: 256 KB body, 300 blocks, 12 levels of nesting on `/api/render`. An
oversized or over-nested payload is a 400, not a silent truncation — check the error
body for which limit was hit.
- **A surface query param** (`?surface=web|mcp-apps|google-apps-script-web|google-meet-stage`)
applies that surface's declared compatibility policy: atoms marked `degraded_on` still
render (named in `X-A2UI-Degraded`); atoms marked `incompatible_on` are replaced with a
visible callout (named in `X-A2UI-Incompatible`) rather than rendering something wrong.
`pdf`, `email` and `google-chat` are refused with 400 here — this endpoint emits HTML,
and answering half-honestly about portability on those surfaces is worse than refusing.
## Self-hosting for unlimited rendering
The shared demo renderer and `/api/render` are both rate-limited by design. Deploy your
own Google Apps Script renderer in four commands, at no cost beyond a Google account, and
every subsequent `make_surface_url` call targets it instead — unmetered:
```bash
git clone https://github.com/a2uicatalog/a2ui
cd a2ui/apps-script-surface/gas-schema-renderer
clasp login && clasp create --type webapp && clasp push && clasp deploy
```
## Reference
| Document | URL |
|---|---|
| OpenAPI specification | https://a2uicatalog.ai/openapi.json |
| Full atom vocabulary | https://a2uicatalog.ai/spec.json |
| Self-host guide | https://a2uicatalog.ai/renderer |
Free, MIT licensed, no signup. Independent, unofficial project — not affiliated with,
endorsed by, or sponsored by Google or Anthropic. A2UI is Google's protocol; MCP is
Anthropic's. Source: https://github.com/a2uicatalog/a2ui