コンテンツにスキップ

A2A プロトコル完全ガイド:2026 年の Google オープンソース AI エージェント通信標準

A2A Protocol カバーアート

公開日:2026 年 3 月 · バージョン:v0.3.0 · ライセンス:Apache 2.0 · メンテナー:Google + Linux Foundation

2025 年 4 月、Google は A2A(Agent2Agent)プロトコル を正式にオープンソース化しました。これは、AI エージェント間の相互運用性(インターオペラビリティ)問題を解決することを目的としたオープン標準です。2026 年における AI エージェント(AI Agent)の爆発的成長に伴い、異なるフレームワークや異なる企業によって開発されたエージェント同士がいかに通信・協働できるかが、重要な課題となっています。こうした背景から登場した A2A プロトコルは、「AI エージェント時代の HTTP」と称されています。

A2A プロトコルの核心的な目標は、異なるフレームワーク(例:Google ADK、LangGraph、BeeAI など)上で構築された AI エージェントが、それぞれの内部状態・メモリ・ツール実装を外部に露呈することなく、安全かつ効率的に通信・協働できるようにすることです。この設計思想は、MCP(Model Context Protocol)と補完関係にあります:MCP はエージェントと外部ツールとの接続を可能にし、A2A はエージェント同士の相互接続を可能にします

なぜ A2A プロトコルが必要なのか?

AI エージェントの「バベルの塔」問題

2026 年の AI 開発エコシステムには、多数のエージェントフレームワークおよびプラットフォームが存在します:

  • Google ADK — Google 公式のエージェント開発フレームワーク
  • LangGraph — LangChain が提供するグラフベースのエージェントフレームワーク
  • CrewAI — タスク編成に特化したマルチエージェントフレームワーク
  • AutoGen — Microsoft がオープンソース化したマルチエージェント対話フレームワーク
  • Goose — Block 社がオープンソース化したネイティブエージェント
  • OpenClaw — 急成長中のオープンソースエージェントプラットフォーム

これらのフレームワークはそれぞれ独立して進化しており、エージェント同士が直接通信することはできません。たとえば、データ分析に特化した LangGraph エージェントと、レポート生成に特化した CrewAI エージェントが存在しても、それらが「データを分析してレポートを生成する」というタスクを共同で遂行できないという状況を想像してください。

A2A の解決策

A2A プロトコルは、通信インターフェースを標準化することで、エージェントが以下のことを可能にします:

  1. 互いの能力を発見する — 「エージェントカード(Agent Cards)」を通じて機能を宣言
  2. インタラクション方式を交渉する — テキスト、フォーム、メディアなど複数のモダリティをサポート
  3. 長時間実行タスクを安全に協働する — ストリーミングおよび非同期通信をサポート
  4. 内部のプライバシーを維持する — メモリ、ツール、独自ロジックを外部に公開する必要がない

A2A vs MCP:何が異なるのか?

特徴 A2A プロトコル MCP(Model Context Protocol)
目的 エージェント ↔ エージェント間通信 エージェント ↔ ツール/データソース間接続
適用シーン マルチエージェントによる協働編成 単一エージェントの機能拡張
通信方式 HTTP 上の JSON-RPC 2.0 stdio/HTTP 上の JSON-RPC 2.0
発見メカニズム Agent Cards MCP Server Registry
代表的なユースケース データ分析エージェント + レポート生成エージェント エージェント + GitHub/データベース/ファイルシステム
補完関係 エージェント間の「HTTP」 エージェントとツール間の「USB」

ベストプラクティス:現代の AI システムでは、A2A と MCP を併用することが推奨されます。例えば、A2A を用いたコーディネーションエージェントが、MCP を介してローカルツールに接続しつつ、同時に他の専門エージェントを A2A 経由で呼び出すといった使い方が可能です。

主要な概念

1. Agent Card(エージェントカード)

すべての A2A 対応エージェントは、自らの能力を宣言する「エージェントカード」を提供しなければなりません:

{
  "name": "数据分析代理",
  "description": "专门处理 CSV/Excel 数据分析任务",
  "url": "https://agents.example.com/data-analyzer",
  "version": "1.0.0",
  "capabilities": {
    "inputFormats": ["text/csv", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
    "outputFormats": ["application/json", "text/markdown"],
    "skills": ["统计分析", "数据可视化", "异常检测"]
  },
  "authentication": {
    "type": "bearer",
    "required": true
  }
}

2. 通信モード

A2A は以下の 3 種類の通信モードをサポートします:

  • 同期型リクエスト/レスポンス — 速やかなタスクに適しています
  • ストリーミングレスポンス(SSE) — 長時間実行タスク向け。進行状況をリアルタイムで返却
  • 非同期プッシュ通知 — 処理時間が長いタスク向け。完了後にコールバックを実行

3. タスク状態遷移図

[新建] → [进行中] → [完成/失败/取消]
           ↓
      [需要输入] → [继续]

クイックスタート

システム要件

  • Python:3.10+
  • Node.js:18+(オプション:JS SDK 使用時)
  • Go:1.21+(オプション:Go SDK 使用時)
  • Java:17+(オプション:Java SDK 使用時)
  • .NET:8.0+(オプション:.NET SDK 使用時)

SDK のインストール

Python SDK(推奨)

# A2A Python SDK のインストール
pip install a2a-sdk

# インストール確認
python -c "import a2a; print(a2a.__version__)"

Node.js SDK

npm install @a2a-js/sdk

Go SDK

```go
go get github.com/a2aproject/a2a-go

Java SDK(Maven)

<dependency>
  <groupId>org.a2a</groupId>
  <artifactId>a2a-sdk</artifactId>
  <version>0.3.0</version>
</dependency>

.NET SDK

dotnet add package A2A

実践ケース:マルチエージェント協調システムの構築

シナリオの説明

「コンテンツ作成ワークフロー」を構築すると仮定します。このワークフローには、以下の3つの専門エージェントが関与します。

  1. リサーチエージェント — 情報の検索および整理
  2. ライティングエージェント — リサーチ結果に基づいた記事の執筆
  3. レビューエージェント — 文法および事実の正確性の確認

ステップ 1:リサーチエージェントサーバーの作成

# research_agent.py
from a2a.server import A2AServer
from a2a.types import AgentCard, Task, TaskStatus

class ResearchAgent:
    def __init__(self):
        self.card = AgentCard(
            name="リサーチエージェント",
            description="ネットワーク上の情報を検索・整理する",
            version="1.0.0",
            capabilities={
                "skills": ["Web検索", "情報抽出", "要約生成"],
                "inputFormats": ["text/plain"],
                "outputFormats": ["application/json"]
            }
        )

    async def execute(self, task: Task):
        """リサーチタスクの実行"""
        query = task.input.text
        # 検索ツールの呼び出し(実際のプロジェクトでは web_search または Serper API を統合)
        results = await self.search_web(query)

        return Task(
            id=task.id,
            status=TaskStatus.COMPLETED,
            output={
                "summary": results.summary,
                "sources": results.sources,
                "key_points": results.key_points
            }
        )

    async def search_web(self, query: str):
        # 検索ロジックの実装
        pass

# サーバーの起動
server = A2AServer(
    agent=ResearchAgent(),
    host="0.0.0.0",
    port=8080
)
server.run()

ステップ 2:ライティングエージェントクライアントの作成

# writing_agent.py
from a2a.client import A2AClient
from a2a.types import Task, TaskRequest

class WritingAgent:
    def __init__(self):
        self.research_client = A2AClient(
            agent_url="http://localhost:8080",
            api_key="your-api-key"
        )

    async def write_article(self, topic: str):
        # ステップ 1:リサーチエージェントに情報を収集するよう依頼
        research_task = TaskRequest(
            input={"text": f"トピック:{topic}。主要な事実、データ出典、関連する引用を提供すること"},
            mode="streaming"  # リアルタイムの進捗を取得するためストリーミングモードを使用
        )

        research_result = await self.research_client.execute(research_task)

        # ステップ 2:リサーチ結果に基づいて記事を執筆
        article = await self.generate_article(
            topic=topic,
            research_data=research_result.output
        )

        return article

    async def generate_article(self, topic: str, research_data: dict):
        # LLM を用いた記事生成処理
        pass

# 使用例
async def main():
    writer = WritingAgent()
    article = await writer.write_article("A2A プロトコルの詳細解説")
    print(article)

import asyncio
asyncio.run(main())

ステップ 3:完全なワークフローのオーケストレーション

# workflow_orchestrator.py
from a2a.client import A2AClient
from a2a.types import Task, TaskRequest

class ContentWorkflow:
    def __init__(self):
        self.research_agent = A2AClient("http://localhost:8080")
        self.writing_agent = A2AClient("http://localhost:8081")
        self.review_agent = A2AClient("http://localhost:8082")

    async def execute_workflow(self, topic: str):
        print(f"📝 コンテンツ作成ワークフローを開始:{topic}")

        # フェーズ 1:リサーチ
    print("🔍 ステージ 1:情報収集中...")
    research_task = TaskRequest(
        input={"text": topic},
        mode="sync"
    )
    research_result = await self.research_agent.execute(research_task)
    print(f"✅ 研究完了。{len(research_result.output['sources'])}件の情報ソースを特定しました")

    # ステージ 2:ライティング
    print("✍️  ステージ 2:記事作成中...")
    writing_task = TaskRequest(
        input={
            "topic": topic,
            "research_data": research_result.output
        },
        mode="streaming"
    )
    async for chunk in self.writing_agent.execute_stream(writing_task):
        print(f"📝 ライティング進捗:{chunk.progress}%")

    draft = chunk.output
    print(f"✅ 下書き完了。文字数:{len(draft['content'])}字")

    # ステージ 3:校閲
    print("🔎 ステージ 3:品質チェック...")
    review_task = TaskRequest(
        input={
            "content": draft['content'],
            "check_types": ["grammar", "facts", "citations"]
        },
        mode="sync"
    )
    review_result = await self.review_agent.execute(review_task)

    print("✅ ワークフロー完了!")
    return {
        "final_content": review_result.output['revised_content'],
        "quality_score": review_result.output['quality_score'],
        "suggestions": review_result.output['suggestions']
    }

ワークフロー実行

async def main(): workflow = ContentWorkflow() result = await workflow.execute_workflow("2026年のAIエージェントのトレンド") print("\n📄 最終記事:") print(result['final_content'])

asyncio.run(main())


## 高度な機能

### 1. ストリーミング応答処理

```python
async def handle_streaming_task(client: A2AClient, task: TaskRequest):
    async for event in client.execute_stream(task):
        if event.type == "progress":
            print(f"進捗:{event.data['progress']}%")
        elif event.type == "partial_output":
            print(f"部分出力:{event.data['content']}")
        elif event.type == "completed":
            print(f"タスク完了!最終出力:{event.data['output']}")

2. エラー処理と再試行

from a2a.exceptions import AgentUnavailable, TaskFailed

async def execute_with_retry(client: A2AClient, task: TaskRequest, max_retries=3):
    for attempt in range(max_retries):
        try:
            return await client.execute(task)
        except AgentUnavailable:
            if attempt == max_retries - 1:
                raise
            await asyncio.sleep(2 ** attempt)  # 指数バックオフ
        except TaskFailed as e:
            print(f"タスク失敗:{e.message}")
            raise

3. 認証とセキュリティ

# Bearer Token認証の使用
client = A2AClient(
    agent_url="https://agents.example.com/analyzer",
    api_key="your-secret-key",
    auth_type="bearer"
)

# OAuth 2.0の使用
from a2a.auth import OAuth2Provider

oauth = OAuth2Provider(
    client_id="your-client-id",
    client_secret="your-client-secret",
    token_url="https://auth.example.com/oauth/token"
)
client = A2AClient(
    agent_url="https://agents.example.com/analyzer",
    auth_provider=oauth
)

A2Aエコシステムツール

公式リソース

  • GitHubリポジトリ:https://github.com/a2aproject/A2A
  • プロトコル仕様: https://a2a-protocol.org/latest/specification/
  • ドキュメントサイト: https://a2a-protocol.org
  • サンプルコード: https://github.com/a2aproject/a2a-samples
  • 無料オンライン講座: https://goo.gle/dlai-a2a(Google Cloud および IBM Research 共同提供)

コミュニティツール

ツール 説明 リンク
A2A Inspector Agent Card のデバッグおよび検査 pip install a2a-inspector
A2A Gateway エージェントゲートウェイおよびロードバランシング https://github.com/a2aproject/a2a-gateway
A2A Registry エージェントの発見およびサービス登録 https://github.com/a2aproject/a2a-registry

ベストプラクティス

✅ 推奨される実践

  1. 能力を明確に宣言する — Agent Card 内で、エージェントの機能と制限を詳細に記述する
  2. ストリーミング通信を活用する — 5 秒を超える実行時間が必要なタスクには、優先的にストリーミングモードを採用する
  3. エレガントなフォールバックを実装する — 依存するエージェントが利用不可の場合に、代替手段を提供する
  4. インタラクションログを記録する — エージェント間通信のデバッグおよび監査を容易にするため
  5. タイムアウト制限を設定する — 無限待機を回避するため、30–60 秒のタイムアウトを推奨

❌ 避けるべき落とし穴

  1. 単一エージェントへの過度な依存 — 冗長性および代替手段を設計する
  2. 認証の無視 — 本番環境では必ず認証を有効化する
  3. 機密データの露出 — Agent Card 内に内部実装の詳細を漏洩させない
  4. 長時間実行タスクの同期ブロッキング — 長時間タスクは非同期またはストリーミングモードで処理する

OpenClaw との統合

OpenClaw を用いて AI アシスタントを開発している場合、以下のように A2A を統合できます:

# OpenClaw スキル内で A2A エージェントを呼び出す
from a2a.client import A2AClient

async def a2a_research_task(query: str):
    """外部研究エージェントを呼び出す"""
    client = A2AClient("http://research-agent:8080")
    result = await client.execute({
        "input": {"text": query},
        "mode": "sync"
    })
    return result.output

# OpenClaw スキルとして登録
# skills/a2a-integration/SKILL.md で定義

今後の展望

A2A プロトコルは現在、Linux Foundation がホストしており、Google が主要な貢献者です。2026 年の開発ロードマップは以下の通りです:

  • v0.4.0(2026 年第 2 四半期) — マルチモーダル対応の追加(画像、音声)
  • v0.5.0(2026 年第 3 四半期) — エージェントマーケットにおける発見メカニズムの導入
  • v1.0.0(2026 年第 4 四半期) — 正式安定版リリース、後方互換性保証

今後、より多くの企業およびプロジェクトが A2A エコシステムに参画することで、今日の Web と同様にオープンかつ相互運用可能な、真に相互接続された AI エージェントネットワークの実現が期待されます。

まとめ

A2A プロトコルは、AI エージェントの進化における次の段階を象徴しています:孤立した単一エージェントから、協調動作するエージェントネットワークへ。開発者にとって、今こそ A2A を学び、採用する最適なタイミングです:

  • オープンソース・無料 — Apache 2.0 ライセンスで、使用制限なし
  • マルチ言語対応 — Python、JavaScript、Go、Java、.NET
  • 大手企業による支援 — Google が開発主体、Linux Foundation がホスト
  • 充実したエコシステム — 豊富な SDK、包括的なドキュメント、実用的なサンプル
  • 将来を見据えた設計 — MCP と補完関係にあり、将来のマルチエージェントシステムに向けた設計

今すぐ始めましょう:最新のコードおよびドキュメントは https://github.com/a2aproject/A2A から入手可能。また、Google 提供の無料オンライン講座で A2A プロトコルを体系的に学習できます。


参考資料

  1. A2A Protocol 公式リポジトリ
  2. A2A プロトコル仕様書
  3. Google 公式ブログ:A2A プロトコルの発表
  4. A2A 無料オンライン講座
  5. A2A サンプルコードリポジトリ