Every A2UI surface is driven by a catalog — a JSON Schema file that declares exactly which components, functions, and theme properties an agent may use when building a surface. The catalog acts as a shared contract: the agent reads it to know what it can generate, and the client uses it to validate incoming messages and resolve component implementations. Because the catalog is just a JSON Schema file, it can live at any stable URL and is loaded at build or deploy time — not at runtime.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/a2ui-project/a2ui/llms.txt
Use this file to discover all available pages before exploring further.
What Is a Catalog?
A catalog is a JSON object conforming to the following schema. ThecatalogId field is the only required property:
components is a component type name (e.g., "Text", "Button"), and its value is a JSON Schema object describing that component’s properties. The agent validates its output against this schema before sending; the client validates incoming messages against its locally-known copy.
The Basic Catalog
To help developers start quickly, the A2UI team publishes a general-purpose Basic Catalog containing a curated set of layout, display, and input components with open-source renderer implementations:Minimal Catalog Example
The following catalog defines a single component,HelloWorldBanner:
createSurface and updateComponents messages must strictly conform to it:
Catalog Negotiation
Because a client may support multiple catalogs and an agent may be capable of generating several, they perform a negotiation handshake to agree on which catalog to use for each surface.Step 1 — Agent advertises supported catalogs (optional)
The agent may publish its supported catalogs in its A2A Agent Card. This is informational and not required:Step 2 — Client sends supported catalogs (required)
On every request, the client includes an ordered list ofsupportedCatalogIds in the message metadata. This tells the agent exactly what the client can render right now:
Step 3 — Agent selects a catalog
When the agent creates a new surface, it picks the best match from the client’s list and locks that choice for the lifetime of the surface. If no compatible catalog is found, the agent does not send a UI:The
catalogId URI is a stable identifier, not a URL the agent or client fetches at runtime. Both sides must have the catalog definition available at build or deploy time.Extending the Basic Catalog
You do not have to build a catalog from scratch. You can import components from the basic catalog and add your own on top.Extending with all basic components
Cherry-picking a single component
Catalogs must be standalone (no unresolved external
$ref links) when deployed to agents and clients. Author catalogs modularly during development, then run the register-catalogs.js linking script — integrated into Xcode Build Phases and Gradle tasks — to bundle all references into a single self-contained file.Versioning
Catalog definitions are typically built into client and agent binaries at compile time, so any mismatch between what an agent generates and what the client can render can silently break a UI. Versioning prevents this.The catalogId as a version vector
The convention is to embed the version directly in the catalog URI:| Change Type | URI Example |
|---|---|
| Current 1.x line | https://example.com/catalogs/my-app/v1/catalog.json |
| Breaking v2 | https://example.com/catalogs/my-app/v2/catalog.json |
Breaking vs. non-breaking changes
| Category | Examples | Required Action |
|---|---|---|
| Breaking (major bump) | Adding/removing a container component; changing a field type; adding a required property without a default | Increment major version in URI |
| Non-breaking | Adding a leaf (non-container) component; adding an optional property; removing a property; updating descriptions | No version bump needed |
Graceful degradation
Clients must not crash when they encounter unknown components or properties. Instead they should:- Render a text fallback or a generic “Not Supported” placeholder for unknown components.
- Silently ignore unknown properties on known components.
- Report validation failures back to the agent via the
VALIDATION_FAILEDerror event so the agent can self-correct:
Zero-downtime migration
To upgrade from v1 to v2 without breaking active agents:- Update the client to include both
v2andv1insupportedCatalogIds(v2 first as the preference). - Deploy the updated agent built with the v2 schema — it selects v2 when clients support it.
- Older agents continue to match v1 from the client’s list and keep working until they are rebuilt.
Message Reference
createSurface, updateComponents, and all A2UI message types.
Component Reference
All basic catalog components with full property documentation.
Data Binding
Binding component properties to data model paths reactively.
Transports
Deliver A2UI messages over A2A, AG-UI, WebSockets, and REST.