こんにちは。SCSKの島村です。
皆さんは「A2UI(Agent-to-User Interface)」をご存じでしょうか??
A2UIとは2025年12月にGoogleが公開した、AIエージェントがリッチなUIを安全に生成するためのオープンプロトコルです。
A2A(Agent-to-Agent)やADK(Agent Development Kit)と並んで、Googleのエージェントエコシステムを構成する重要な技術のひとつですが、まだまだ情報が少なく、「名前は聞いたことあるけど、実際何ができるの?」という方も多いのではないでしょうか。
本記事では、『A2UI(Agent-to-User Interface)』について調査・整理した内容をご紹介します。
具体的には、以下のような疑問に答えていきます。
最後までお付き合いいただけますと幸いです。
– AIエージェント開発に興味があるエンジニア
– Google Cloud / Gemini Enterprise / ADKを利用している方
– A2A、ADK、MCP などの関連技術を追いかけている方
A2UIとは
一言でいうと、、、、
A2UI(Agent-to-User Interface)は、AIエージェントがリッチなUIを安全に生成するためのオープンプロトコルです。
エージェントはHTMLやJavaScriptを直接生成するのではなく、あらかじめ定義されたUIコンポーネントのカタログから「何を表示したいか」を宣言的に記述します。実際の描画はクライアント側が行います。
なぜ今、A2UIなのか??
AIエージェントの開発が急速に進む中、ひとつ見過ごされがちな問題があります。
A2UI の設計哲学 – 3つの柱
A2UIの設計は、以下の3つの原則に基づいています。
- Security First(セキュリティ最優先)
A2UIは実行可能コードではなく、宣言型のデータ形式です。
従来、リモートエージェントからUIを受け取る場合はHTMLやJavaScriptをiframeでサンドボックス化する方法が一般的でしたが、XSSやUIインジェクションのリスクがありました。
A2UIでは、クライアント側が「信頼できるコンポーネントのカタログ」を持ち、エージェントはそのカタログの範囲内でしかUIを指定できません。カタログにないコンポーネントは無視されるため、任意コード実行のリスクを排除できます。 - LLM-Friendly(LLMに最適化)
UIはフラットなJSONリストで表現され、LLMがインクリメンタルに生成しやすい構造になっています。
完璧なJSONを一発で出す必要はなく、ストリーミングで逐次的にUIを組み立てられます(プログレッシブレンダリング)。 - Framework-Agnostic(フレームワーク非依存)
A2UIはUI構造と実装を分離しています。同じA2UI JSONペイロードが、Lit、React、Angular、Flutter、SwiftUIなど異なるフレームワークで同じようにレンダリングできます。エージェント側はクライアントが何を使っているか知る必要がありません。

エージェントはこの18個の「部品」を組み合わせてUIを構成します。
重要なのは、同じ18個のプリミティブから、プロンプトの意図に応じて全く異なるUIが動的に生成されるという点です。
A2UIは「エージェントにUIを描かせる仕組み」ではありません。「エージェントが安全にUIと会話するための言語」を定義しています。
- エージェントは「何を表示したいか」だけを記述する
- 「どう表示するか」はクライアントが決める
- 信頼境界を越えても安全(宣言型データ、カタログ制約)
- LLMがストリーミングで生成しやすい構造
A2AとA2UIの違い
A2AとA2UI。名前が似ていて混同しがちですが、役割は全く異なります。
類似技術との比較(MCP Appsとのとの違い)
A2UIと近い文脈で語られることが多いのが「MCP Apps」だと思います。両者の違いを簡単に整理できればと思います。
*(What is the Model Context Protocol (MCP)? – Model Context Protocol)
MCP Apps はその上で、ツールがインタラクティブなUIリソース(`ui://` URI)を宣言し、ホスト側がHTMLをサンドボックス(iframe等)内にレンダリングする仕組みを提供します。
MCP AppsもA2UIも、「エージェントの応答をテキストだけでなくUIとして提供する」という同じ方向性を持っています。
ただし、「誰がUIの主導権を握るか」という点で設計思想が大きく異なります。
一言で言うと
- 外部エージェント(別組織、別サーバー)をUIに安全に組み込みたい
- マルチエージェント環境で統一的なUIルック&フィールが必要
- クライアント側でUIの最終的な見た目を制御したい
- エージェントとUIを同じチームで密に設計している
- 高度なレイアウトや独自表現を素早く試したい
- 信頼境界を気にしなくてよい環境(社内ツール等)
実際にA2UIを触ってみる
3ステージでA2UIを触っていければと思います。実際に「テキスト応答→A2UI JSON→リッチUI」の変化を体験してみようと思います。
<Stage 1>: テキスト応答の標準エージェント
from google.adk.agents import Agent from .restaurants import search_restaurants, make_reservation root_agent = Agent( model="gemini-3.5-flash", name="restaurant_assistant", description="レストラン予約をサポートするアシスタント。", instruction=( """ あなたはレストラン予約アシスタントです。 ユーザーがレストランを探している場合は search_restaurants ツールで検索し、"結果をわかりやすく日本語で説明してください。 ユーザーが予約を希望した場合は make_reservation ツールで予約を実行してください。 """ ), tools=[search_restaurants, make_reservation], )
<Stage 2>: A2UI JSON を生成するエージェント
from google.adk.agents import Agent
from a2ui.schema.manager import A2uiSchemaManager
from a2ui.basic_catalog.provider import BasicCatalog
from .restaurants import search_restaurants, make_reservation
schema_manager = A2uiSchemaManager( version="0.8", catalogs=[BasicCatalog.get_config("0.8")], )
instruction = schema_manager.generate_system_prompt(
role_description=( """
あなたはレストラン予約アシスタントです。
ユーザーがレストランを探している場合は search_restaurants ツールで検索し、ユーザーが予約を希望した場合は make_reservation ツールで予約を実行してください。
すべて日本語で応答してください。""" ),
workflow_description=( """
1. ユーザーの希望(ジャンル、エリア、日時、人数)を確認する
2. search_restaurants で候補を検索する
3. 結果をリッチUIで表示する(カード形式、画像・評価・空き状況付き)
4. ユーザーが選択したら make_reservation で予約する
5. 予約確認をカード形式で表示する""" ),
ui_description=( """
レストラン候補は Card コンポーネントで表示し、各カードに Image(店舗写真)、
Text(店名・説明)、Icon(星評価)、Button(予約する・地図を見る)を含める。
予約確認は Card にまとめて表示する。Respond ONLY with the A2UI JSON array. Do NOT include any text outside the JSON.""" ),
include_schema=True, include_examples=True, )
root_agent = Agent( model="gemini-2.5-flash", name="restaurant_assistant",
description="レストラン予約をサポートするA2UIアシスタント。", instruction=instruction, tools=[search_restaurants, make_reservation], )
<Stage 3>: リッチUIレンダリング
*今回はFastAPI + JavaScript で簡易的なカスタムフロントエンドを作成しました。
– コンポーネントIDをキーにフラットリストから再帰的にDOM要素を構築
– 18個のプリミティブそれぞれに対応するHTML/CSSマッピングを定義
まとめ
やってみて分かったこと
- 導入は簡単: SDK(a2ui-agent-sdk)がA2UIカタログ全体をシステムプロンプトとして生成してくれる
- ロジック変更不要: ツールやビジネスロジックはそのまま。出力形式だけが変わる
- UIは動的: 同じ18プリミティブから、LLMが文脈に応じて最適なUIを選択
- 効果は明確: テキスト7往復が、UI1〜2画面に短縮される
一報で、LLMの出力安定性という意味ではA2UI JSONの生成品質はLLMに依存することも確認できました。
– プロンプトの書き方でUIの質が大きく変わる(`ui_description` の設計が重要)
– たまに不正なJSONが出力されることもある(`a2ui_utils.py` でフォールバック処理が必要)
最後まで読んでいただき、ありがとうございました!!!







