Skip to content

Research note

A2UI explained for frontend engineers

How Google's declarative agent UI spec lets LLMs propose native component trees across trust boundaries — without executing generated code.

Series · Part 5 of 6

LLM Interface Protocols

A factual map of the protocols, specs, and transport layers teams use to turn LLM responses into structured, trusted product interfaces — from output contracts and streaming to AG-UI, A2UI, and MCP Apps.

  1. 1 The protocol landscape for LLM interfaces
  2. 2 Output contracts: structured outputs and tool calling
  3. 3 Streaming protocols: from tokens to UI messages
  4. 4 AG-UI explained for frontend engineers
  5. 5 A2UI explained for frontend engineers
  6. 6 MCP Apps explained for frontend engineers

An agent on another company’s server cannot safely inject React into your app. Sending HTML in an iframe works, but it rarely matches your design system, accessibility baseline, or security review.

A2UI — short for Agent-to-User Interface — is Google’s open answer: agents send declarative component descriptions as data. Your client validates them against a component catalog and renders with native widgets.

Key idea

A2UI is a UI payload protocol, not a transport. Messages can ride over A2A, AG-UI, REST, or other channels. The client always owns rendering and security.

The problem A2UI targets

Google’s A2UI announcement frames the scenario clearly. In a multi-agent mesh, the agent doing useful work is often remote — different server, different vendor, different trust zone. It cannot touch your view layer. Historically, cross-boundary UI meant sandboxed HTML/JS in iframes: heavy, visually disjoint, security-sensitive.

A2UI instead transmits UI that is safe like data, expressive like code — a flat, incrementally updateable JSON structure describing surfaces, components, and data bindings.

Core concepts

From a2ui.org and the specification:

ConceptMeaning
SurfaceA renderable UI region the agent creates or updates (createSurface in v0.9+)
ComponentA node in a tree — Text, Button, TextField, Card, etc. from a catalog
Adjacency listFlat component list with ID references — LLM-friendly, streamable
Data bindingSeparates structure from values so agents can update data without rebuilding the tree
CatalogClient-defined set of allowed components; agents cannot request arbitrary types
Client-side functionsUser actions (clicks, submits) routed back to the agent as structured events
flowchart LR
  A["Remote agent"] -->|"A2UI JSON"| T["Transport A2A / AG-UI"]
  T --> C["Client validator"]
  C --> R["Native renderer"]
  R --> U["Branded UI"]
  U -->|"action events"| A

Specification versions (as of 2026)

The A2UI spec index tracks:

VersionStatusNotes
v0.8LegacyStructured-output-first baseline
v0.9StablePrompt-first shift, createSurface, custom catalogs
v0.9.1Currentapplication/a2ui+json MIME type
v1.0CandidateactionResponse RPC, action IDs, surfaceProperties

The project is Apache 2.0, originated by Google with contributions from CopilotKit and the open community, with active development on GitHub.

Security model: catalog-bound rendering

A2UI’s security story is allowlisting, not sandboxing:

  1. The client publishes a catalog of trusted component types.
  2. The agent may only reference types in that catalog.
  3. The renderer maps abstract types to real implementations — your Button, not a model’s <button onclick=...>.

This aligns with trusted rendering and component catalog patterns from Interface Lab’s foundation series. The LLM fills a contract; it does not author executable UI.

LLM-friendly design choices

A2UI optimizes for how models actually generate:

The restaurant finder quickstart demonstrates end-to-end flow: user message → agent emits A2UI → Lit/Angular/Flutter renderer → user action → agent updates surface.

Renderers and transports

Client renderers listed on a2ui.org:

Transports:

A2UI vs MCP Apps vs platform ChatKit

Google’s ecosystem post draws explicit comparisons (source):

ApproachMechanismTradeoff
A2UIDeclarative native component blueprintBest brand/accessibility fit; requires renderer work
MCP Appsui:// HTML/JS resource in sandboxed iframeBest cross-host interoperability; weaker native feel
OpenAI ChatKitIntegrated OpenAI ecosystem widgetsOptimized for OpenAI surfaces; less portable

None replaces the others outright. An enterprise orchestrator on AG-UI might render orchestrator UI via A2UI while a plugged-in MCP tool returns an MCP App dashboard in an iframe.

Minimal example (illustrative shape)

Exact field names vary by spec version; the mental model is a stream of messages:

{
  "createSurface": {
    "surfaceId": "booking",
    "catalogId": "com.example.app/v1"
  }
}
{
  "updateComponents": {
    "surfaceId": "booking",
    "components": [
      { "id": "title", "component": "Text", "text": "Reserve a table" },
      { "id": "date", "component": "DateInput", "label": "Date" },
      { "id": "submit", "component": "Button", "label": "Check availability", "action": "check_slots" }
    ]
  }
}

Your renderer walks the adjacency list, mounts native components, and routes action events back to the agent. The agent responds with updated A2UI — not with imperative DOM instructions.

When to adopt A2UI

Strong fit:

Weaker fit:

Product implication

A2UI makes generative UI portable without making it uncontrolled. Users see interfaces that feel native because they are native — composed from your components, styled by your tokens, tested by your QA.

For frontend leads, A2UI is the difference between “the agent team ships iframe demos” and “we own one renderer contract across web and mobile.”

What to watch next

The last major open UI extension in the tool layer is MCP Apps — interactive ui:// resources for MCP hosts like Claude, ChatGPT, and VS Code.

References:

Previous
MCP Apps explained for frontend engineers
Next
AG-UI explained for frontend engineers