A2UI 1.0 は、Google が2026年11月11日に公開した、AIエージェントが文字の代わりに画面で答えるためのオープンなプロトコルの初の安定版だ。 エージェントは「どの部品をどう並べ、どんなデータを入れるか」をJSONで送る。受け取ったアプリは、自分のReactやFlutter、SwiftUIの部品で描く。下は、npmのReactレンダラーで公式サンプルを手元で描き、届いたメッセージの順に画面ができていく様子を撮ったものだ。

A2UI のメッセージが届く順に画面ができる様子。1 createSurface で画面の枠を作り、2 updateDataModel でレストランのデータを送り、3 と 4 の updateComponents で一覧の部品を送ると名前と住所が並ぶ。5 で4件目のデータを足し、6 で Book now のボタンが付く

30秒でわかる A2UI 1.0

  • ・何か:エージェントの返事を「画面」にするための、プロトコル・レンダラー・Agent SDK のセット。Apache-2.0。GitHub のスターは約1.7万(2026年11月14日)
  • ・何を解決する:3つの商品を比べる、計画を直して承認する、といった場面で文章の壁にならない
  • ・何を代替する:エージェントに HTML や JS を書かせて iframe で出す方法。A2UI はコードではなくデータを送り、アプリが登録した部品しか使えない
  • ・描ける先:React・Angular・Lit(Web)、Flutter、SwiftUI。Jetpack Compose は 0.9.1 まで

エージェントの作り方の全体像は AIエージェントフレームワーク比較2026|LangGraph・CrewAI・Dify等9種をStar数・実コードで検証 で整理している。A2UI は、その返事を画面にする部分を受け持つ。

A2UI とは:エージェントがデータで画面を返すプロトコル

DATA, NOT CODE何を代替するか

エージェントはコードではなくデータで画面を返す

コードを返す

HTML・JS を生成して iframe などで描く

  • 何でも描けるが、実行してよいか審査が要る
  • 見た目はエージェント次第
  • スマホのネイティブ画面には載せにくい

A2UI

部品の並びとデータを JSON で送る

  • アプリが登録した部品だけを使える
  • 描くのはアプリ自身の部品(React・Flutter・SwiftUI…)
  • クライアントでコードを実行しない
出典: a2ui-project/a2ui README・a2ui.org(2026-11-14時点)

A2UI の中心は「カタログ」だ。アプリの開発者が、エージェントに使わせてよい部品(Text、Button、Card、DateTimeInput など)と関数を登録する。エージェントはその中からしか選べない。README は、カード番号や個人情報を扱えないようにする信頼の境界を、厳密なスキーマと「実行できるコードでなく検証済みのデータ」で守ると説明している。

HOW IT WORKS画面が届くまで

モデルが書き、SDK が検証し、アプリの部品で描く

  1. 推論

    モデルが A2UI Express などの形式で、画面とデータを書く

  2. Agent SDK

    出力を検証し、マクロを展開して A2UI メッセージにする

  3. 転送

    createSurface・updateComponents・updateDataModel を順に送る

  4. レンダラー

    カタログに登録した部品だけで、ネイティブに描く

出典: a2ui-project/a2ui README の Architecture(2026-11-14時点)

送るメッセージは主に3種類で、上の GIF の順番どおりに届く。

メッセージ 役割
createSurface 画面の枠(surface)を作り、使うカタログを決める
updateComponents 部品の並び。部品は ID で親子を指す平らな一覧で、少しずつ送れる
updateDataModel 部品に入れるデータ。部品は @path でデータの場所を指す

部品とデータを分けて送るので、エージェントは画面の骨組みを先に出し、データを後から流し込める。データの一部だけを差し替えることもできる。

A2UI 1.0 の変更点

WHAT'S NEW IN 1.01.0 で変わったこと

初の安定版。双方向の関数呼び出しが入った

  1. 1.双方向の関数呼び出し

    画面からエージェントの関数を呼び、空き状況などをその場で確かめる

  2. 2.カタログを混ぜられる

    1つの画面に、複数のカタログの部品を並べられる

  3. 3.アクセシビリティと拡張

    ARIA の live 領域などと、任意のメタデータを載せる枠

  4. 4.Agent SDK が3言語に

    Python に加えて TypeScript と Dart。推論の形式も差し替えられる

出典: Google Developers Blog(2026-11-11)・v1.0 Evolution Guide

0.9 から移る人は、Google の移行ガイド(v1.0 Evolution Guide)を読む。大きな変更は次のとおりだ。

項目 0.9 1.0
関数の呼び出し なし callAgentFunction(画面→エージェント)と callRendererFunction(エージェント→画面)
カタログ 1画面に1つ 複数を混ぜられる。部品ごとに @catalogId を指定できる
データの参照の書き方 "path" "@path"。@ で始まるキーを予約した
テーマ theme・primaryColor を送れた 削除。見た目はアプリ側が決める
呼び名 client / server renderer / agent

移行ガイドは、"path": を一括で "@path": に置き換えないよう警告している。@ を付けるのはデータの参照と関数の呼び出しの位置だけで、updateDataModel の path などはそのままだ。

どんな事に使えるか:公式の例と導入企業

Google の発表は、体調を崩した朝の例を挙げている。医師の予約、会議の移動、チームへの連絡など6つのアプリにまたがる用事を、文章のやりとりでなく1つの画面にまとめ、タップで直して確定させる。公式サンプルには、予約、注文、配送状況、予定、タスクなどの画面がある。npm の React レンダラーで、そのうち6つを手元で描いた。

A2UI の公式サンプルを React レンダラーで描いた画面。フライトの状況(ウィーンからニューヨーク、定刻)、コーヒーの注文(品目と合計、購入ボタン)、レストランのカード(写真・評価・距離)、配送の状況(注文から配達まで)、予定の詳細(参加と辞退のボタン)、タスクのカード(期限の日時)

同じメッセージでも、描くアプリが変われば見た目も変わる。下は、CopilotKit が公開している A2UI Composer のギャラリーで、上と同じフライトとコーヒーの注文のサンプルが、別のスタイルで描かれている。

A2UI Composer のギャラリー画面。Flight Status、Chat Message、Recipe Card、Email Compose、Coffee Order、Contact Card のサンプルが、角の丸いカードのスタイルで並んでいる

発表で名前が挙がった利用例は次のとおりだ。

企業・製品 使い方
Atlassian(Jira) エージェントが作業の続きに要る情報を、作業項目の中のカードでチームに聞く
Alation 指標のカードやグラフのフィードを、自社アプリと Claude の会話の中で同じ配置で出す
ByteDance(Lynx) 自社のクロスプラットフォームの仕組み Lynx 向けのレンダラーを公開(0.9 対応、1.0 に対応中)
Google(Gemini Notebook) スライドを作る前に、形式と重点を聞くカードと確認のカードを出す

Gemini は自社で登録したエージェントの A2UI の返事を描けるが、対応は 0.9.1 までで、Gemini Enterprise の 1.0 対応は作業中だ。

A2UI を React で試す:手元で確かめたこと

2026年11月14日に、Vite と React 19 の新しいアプリに npm の @a2ui/react と @a2ui/web_core(どちらも 0.15.0)を入れ、リポジトリの v1.0 の公式サンプル(catalogs/basic/v1/examples)を描いた。

npm install @a2ui/react @a2ui/web_core @a2ui/markdown-it

React では、メッセージを処理する MessageProcessor に v1.0 の基本カタログを渡し、できた画面を A2uiSurface で描く。ボタンが押されたときの action は、第2引数の関数で受け取れる。

import { MessageProcessor } from "@a2ui/web_core"
import { basicCatalog } from "@a2ui/web_core/catalogs/basic/v1"
import { A2uiSurface } from "@a2ui/react"

const processor = new MessageProcessor([basicCatalog], (action) => {
  console.log(action) // エージェントへ返す
})
processor.processMessages(messages)

messages には、エージェントから届いた v1.0 のメッセージを順に入れる。最小の形は次のとおりで、見出しと本文の2行が出る。部品の text は文字を直接書かず、@path でデータの場所を指している。

[
  { "version": "1.0", "createSurface": { "surfaceId": "main",
    "catalogId": "https://a2ui.org/specification/v1_0/catalogs/basic/catalog.json" } },
  { "version": "1.0", "updateComponents": { "surfaceId": "main", "components": [
    { "id": "root", "component": "Column", "children": ["title", "body"] },
    { "id": "title", "component": "Text", "text": { "@path": "/title" } },
    { "id": "body", "component": "Text", "text": { "@path": "/body" } } ] } },
  { "version": "1.0", "updateDataModel": { "surfaceId": "main", "path": "/",
    "value": { "title": "Hello from A2UI!", "body": "データを差し替えると表示も変わる" } } }
]

コーヒーの注文のサンプルで「Purchase」を押すと、次の action が届いた。エージェントは、どの画面のどの部品が押されたかを受け取る。

コーヒーの注文の画面で Purchase を押したときに、アプリがエージェントへ返す action。name は purchase、surfaceId は gallery-coffee-order、sourceComponentId は purchase_btn、timestamp と空の context が入っている

エージェントが危ない内容を送ってきた場合も試した。

エージェントが送ってきた updateComponents の2つの試し。1つ目はカタログにない Script という部品で、外部の JS を指定したが、何も描かれず script 要素は作られなかった。2つ目は Text に img タグと onerror を入れたが、タグは文字として表示され、img 要素は作られなかった
試したこと 結果
公式サンプル9件を描く 8件は描けた。login-form は @checks が認識されず検証エラー
カタログにない Script 部品を送る 何も描かれず、script 要素も作られなかった。エラーは返らなかった
Text に <img onerror> を入れる タグは文字として表示され、img 要素は作られなかった
ボタンを押す name・surfaceId・sourceComponentId を含む action が届いた

気をつけたい点が2つある。1つは、仕様とパッケージの版のずれだ。リポジトリは2026年11月10日に @ で始まるキーへの変更を入れたが、npm の 0.15.0 は11月2日の公開で、@checks を使う最新のサンプルを受け付けなかった。もう1つは、カタログにない部品が静かに無視されることだ。危ないものは描かれないが、エージェントの間違いにも気づきにくい。このほか、アイコンは Material Symbols のフォントを、Markdown は @a2ui/markdown-it を自分で読み込まないと、文字のまま出る。

コーディングエージェントに A2UI を扱わせるには、npx skills add a2ui-project/a2ui でスキルを入れられる(本記事では試していない)。

A2UI と MCP Apps・ほかの生成UIとの違い

  A2UI MCP Apps エージェントに HTML を書かせる
送るもの 部品の並びとデータ(JSON) MCP サーバーが配る UI のリソース HTML・JS
描く部品 アプリが登録したネイティブの部品 ホストが iframe などで描く 何でも
スマホのネイティブ画面 Flutter・SwiftUI・Jetpack Compose 主に Web 載せにくい
関係 MCP Apps の中でも動く A2UI を中に入れられる —

Google は、A2UI の Web と Flutter のレンダラーが MCP Apps の中で動き、Claude や Gemini のような MCP Apps 対応のアシスタントに A2UI の画面を出せると説明している。対立する仕組みではなく、組み合わせて使う前提だ。

React で生成 UI を作る別の道としては、AG-UI を中心にした CopilotKit完全ガイド|React/Angularで作るAIエージェント & AG-UI Protocol解説 がある。CopilotKit は A2UI の Composer と Playground も公開している。エージェントの実行を見張る側は CopilotKit OpenBotとは|AG-UIエージェントに専用ブラウザと監査を与える基盤の使い方 で扱った。LLM に部品を選ばせる設計は、Vercel の json-renderとは|VercelのUI生成OSSをJev連携まで実測、LLMに書かせず選ばせる設計 も近い。

向いているのは、同じエージェントの返事を Web とスマホの両方に、自社のデザインのまま出したい場合だ。Web だけで、見た目にこだわらないなら、まずは MCP Apps や既存の生成 UI のライブラリのほうが手早い。

参照ソース

・A2UI 1.0: Build delightful, fast, reliable, agentic experiences(Google Developers Blog・2026-11-11)
・a2ui-project/a2ui(GitHub)
・A2UI v1.0 の仕様(a2ui.org)
・v1.0 Evolution Guide(a2ui.org)
・A2UI Quickstart(a2ui.org)
・A2UI Composer(CopilotKit)