AIエージェント連携のプロトコル「A2A」とは？公式サンプルで使い方を解説

<!-- 以下本文 -->
# はじめに
レアゾン・ホールディングスでエンジニアをやっている森です。

この記事では、AIエージェント間の連携技術として注目されている**Agent2Agent (A2A)** について解説します。新しい技術は実際に試してみることで、その活用方法が見えてくるものです。そこで、公式のサンプルコードを実行し、その動作を確認してみました。この記事を通して、皆さんのA2Aに対する理解が深まれば幸いです。

![a2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061235/0f68fca6-1b96-4e68-b40e-72deb847f3b1.png)

:::note warn
この記事は、A2Aが発表されてから約1ヶ月後に投稿されたものです。最新バージョンでは仕様が変更されている可能性があります。
:::

:::note
A2A周りのリポジトリに変更があったため、2025年6月18日に公式サンプルの実行部分を一部修正しました。
:::

# A2Aとは
## 概要
2025年4月9日、Googleは **Agent2Agent（A2A）** というエージェント同士の相互連携のためのオープンプロトコルを発表しました。
A2Aにより、AIエージェント同士がコミュニケーションを取り、安全に情報交換し、様々な企業プラットフォーム上やアプリケーション上でアクションを調整できるようになります。
すでに主要なサービスがこのプロトコルへの支持を表明しています。
> with support and contributions from more than 50 technology partners like Atlassian, Box, Cohere, Intuit, Langchain, MongoDB, PayPal, Salesforce, SAP, ServiceNow, UKG and Workday; and leading service providers including Accenture, BCG, Capgemini, Cognizant, Deloitte, HCLTech, Infosys, KPMG, McKinsey, PwC, TCS, and Wipro.

https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/

https://cloud.google.com/blog/ja/products/ai-machine-learning/a2a-a-new-era-of-agent-interoperability

https://github.com/google-a2a/A2A

また、A2A発表の1ヶ月後に、MicrosoftがA2Aへの対応を表明しました。A2AはAI Agent通信のデファクトスタンダードになる可能性が高そうですね！

https://www.microsoft.com/en-us/microsoft-cloud/blog/2025/05/07/empowering-multi-agent-apps-with-the-open-agent2agent-a2a-protocol/


## MCPとの違い
- MCP (Model Context Protocol): 主にツールやAPIに対する1対1の通信（communication）を扱い、関数の呼び出しやドキュメントの取得などを目的とします
- A2A (Agent2Agent): Agent間の通信であり、専門的なタスクを、その分野に特化したAgentへ委任できます

![a2a_mcp_readme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061235/a4e1e8e7-a4f3-4235-88f9-8d6afb43afa2.png)
参照: [Google - Open standards for connectiong Agents](https://google.github.io/A2A/#/?id=open-standards-for-connecting-agents)

# A2Aの環境構築とサンプル実行
https://github.com/google-a2a/a2a-samples

## 1. uvのインストール
[uv](https://docs.astral.sh/uv/)はPythonパッケージとプロジェクト管理ツールです。[^1]
[^1]:筆者はpipenv → poetry → ryeと色々彷徨っていましたが、uvに落ち着きそうです。

インストール手順は公式ドキュメントを参照してください:

https://docs.astral.sh/uv/#installation

```bash
# macOS and Linux
curl -LsSf <https://astral.sh/uv/install.sh> | sh

# shellの自動補完機能が必要な場合
echo 'eval "$(uv generate-shell-completion bash)"' >> ~/.bashrc
```

## 2. A2Aリポジトリのクローン

```bash
git clone git@github.com:google-a2a/a2a-samples.git
cd a2a-samples
```

## 3. 公式サンプルの実行
公式サンプルを実行して、A2Aの動作を確認します。
まずは、GeminiのAPI keyを発行してください。手順はこちらを参考にしてください。

https://ai.google.dev/aistudio?hl=ja

- A2A Serverと通信するA2A Client (host agent) の起動

```bash
cd demo/ui

# localhost:12000 に公開
uv run main.py
```

以下の表示が出力されたら、先ほど発行したGeminiのAPI Keyを入力してください。

![スクリーンショット 2025-06-18 18.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061235/8e88e1e1-2930-4436-bd4f-dd7887d51d56.png)



- 為替換算Agent (LangGraph - currency conversion agent) の起動

```bash
cd samples/python/agents/langgraph

echo "GOOGLE_API_KEY=<ここに先ほど発行したGeminiのAPI keyを入力>" > .env

# localhost:10000 に公開
uv run app
```

今回は、この２つのAgentを使って、現在の為替レートを取得し、1ドルを他の通貨に換算する処理を、複数回のやり取り (multi-turn)で行います。

### 為替換算Agentがない場合
まず、為替換算Agent（Currency Agent）を登録せずに試してみます。
`localhost:12000` にアクセスし、Conversation画面から「1ドルの為替レートは？」と質問します。

![スクリーンショット 2025-04-20 213335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061235/9b0c42bb-d1ec-4995-aa04-7f2cb8d8743f.png)

host agentとの対話ではGeminiが使用されており、この時点ではWeb上のリアルタイム情報(`live exchange rates`) にアクセスできないため、回答できません。

### 為替換算Agentの登録
次に、localhost:12000 のUIから為替換算Agent（Currency Agent）を登録します。左側の「Remote Agents」セクションで設定します。
このエージェントはLangGraphで記述されており、為替に関する質問を受け取ると、https://frankfurter.dev/ のAPIを呼び出すActionを実行するようシステムプロンプトで指示されています。

![スクリーンショット 2025-04-20 213508.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061235/0613a83b-8c18-46a0-ad1f-b0b097e29fbb.png)

以下がCurrency Agentのシステムプロンプトです。従来型の汎用的な生成AIとは異なり、「唯一の目的 (sole purpose)」を設定することで、特定の専門タスクを実行するAgentとして機能します。エラー処理や完了ステータスの設定なども定義されています。

https://github.com/google/A2A/blob/main/samples/python/agents/langgraph/agent.py

```plaintext
SYSTEM_INSTRUCTION = (
    "You are a specialized assistant for currency conversions. "
    "Your sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. "
    "If the user asks about anything other than currency conversion or exchange rates, "
    "politely state that you cannot help with that topic and can only assist with currency-related queries. "
    "Do not attempt to answer unrelated questions or use tools for other purposes."
    "Set response status to input_required if the user needs to provide more information."
    "Set response status to error if there is an error while processing the request."
    "Set response status to completed if the request is complete."
)
```

<details><summary>日本語訳</summary>

```plaintext
あなたは為替換算の専門アシスタントです。
あなたの唯一の目的は、『get_exchange_rate』 ツールを使って為替レートに関する質問に答えることです。
もしユーザーが通貨変換や為替レート以外のことを尋ねてきた場合、そのトピックについては助けることができず、
通貨関連の問い合わせにしか答えることができないことを丁寧に述べてください。
関係のない質問に答えようとしたり、他の目的のためにツールを使用したりしないでください。
ユーザーがより多くの情報を提供する必要がある場合は、応答ステータスを input_required に設定する。
リクエストの処理中にエラーが発生した場合は、応答ステータスをエラーに設定する。
リクエストが完了した場合は、応答ステータスを完了に設定する。
```
</details>

### 為替換算Agent (Currency Agent) を追加した場合
Currency Agentを登録した後、先ほどと同じ質問「1ドルの為替レートは？」を入力します。

![スクリーンショット 2025-04-20 214121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061235/fe672606-476d-42fc-bed9-fcdda58cf342.png)

最初の質問では、multi-turn（複数回のやり取り）の動作を確認するため、あえて変換先の通貨を指定しませんでした。
その結果、A2A ServerのHost Agentが、どの通貨に換算したいかをUserに尋ね返します。
Userが「JPY」と入力すると、Host Agentはドルから円への換算タスクをCurrency Agentに送信します。

全体の流れは以下のようになります。
1. **user**が質問文（1ドルの為替レートは？）を入力
2. **host agent**は情報が不足している（どの通貨への換算か不明）と判断し、**user**に追加情報を要求する
3. **user**が追加情報（JPY, 円）を入力 (追加情報が得られない場合は、再質問)
4. **host_agent**が**Currency Agent**に「1ドルから円への為替レートを回答するタスク」を送信
5. **Currency Agent** が為替APIを呼び出してドル円相場を取得
6. **Currency Agent**が取得した結果を整形し、host_agentにタスク完了とともに回答を送信
7. **host_agent**が**Currency Agent**から受信した回答を**user**に表示

```mermaid
sequenceDiagram
    participant Client as A2A Client
    participant Server as A2A Server
    participant Agent as LangGraph Agent
    participant API as Frankfurter API

    Client->>Server: Send task with currency query
    Server->>Agent: Forward query to currency agent

    alt Complete Information
        Agent->>API: Call get_exchange_rate tool
        API->>Agent: Return exchange rate data
        Agent->>Server: Process data & return result
        Server->>Client: Respond with currency information
    else Incomplete Information
        Agent->>Server: Request additional input
        Server->>Client: Set state to "input-required"
        Client->>Server: Send additional information
        Server->>Agent: Forward additional info
        Agent->>API: Call get_exchange_rate tool
        API->>Agent: Return exchange rate data
        Agent->>Server: Process data & return result
        Server->>Client: Respond with currency information
    end

    alt With Streaming
        Note over Client,Server: Real-time status updates
        Server->>Client: "Looking up exchange rates..."
        Server->>Client: "Processing exchange rates..."
        Server->>Client: Final result
    end
```
参照: [公式README.mdのシーケンス図](https://github.com/google/A2A/blob/main/samples/python/agents/langgraph/README.md)

下記がイベントリストの一覧です。（記事投稿時点では、時系列になっていないため少し見づらいです）

![スクリーンショット 2025-04-20 214157_cover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061235/3c25954f-bfa3-4cca-a6bb-f480cbeb4a20.png)

# おわりに

今回はA2Aの公式サンプルを実行し、その動作の流れを確認しました。host_agentがユーザーとの対話やタスクの振り分けを行う秘書役、個々のAgentが特定の作業を担当する専門家、というような役割分担になっていると理解できそうです。

将来的には、例えば店舗ごとに商品情報検索や購入機能を持つAgentが存在し、host_agentを通じて商品のレコメンドやQ&amp;Aを行うといった活用も考えられそうです。Webサイトを持たず、Agentを介してサービスを提供する「Agent型店舗」のような新しい形態も登場するかもしれませんね！

#### 余談
- host_agentとCurrency AgentをDocker Composeで起動しようと試みましたが、コンテナ間のネットワーク接続設定や、デモUIからAgentを指定する仕組みの影響か、Agent登録は成功してもチャットでの連携が正常に動作しませんでした。
- もしDockerでのA2Aに成功された方がいらっしゃいましたら、コメントで共有いただけると幸いです:bow_tone1:

<!-- フッター -->

<hr>

### **▼採用情報**<br>
レアゾン・ホールディングスは、「世界一の企業へ」というビジョンを掲げ、「新しい"当たり前"を作り続ける」というミッションを推進しています。

現在、エンジニア採用を積極的に行っておりますので、ご興味をお持ちいただけましたら、ぜひ下記リンクからご応募ください。

https://recruit.reazon.jp/