MCP vs A2A:2026年版 AIエージェントプロトコル完全ガイド
2026年にAIエージェントを使った開発をしていると、2つの略語を頻繁に耳にするはずです。MCPとA2A。そして、この2つについて真逆の意見が飛び交っています。「MCPはAIのUSB-Cだ」「A2AがMCPを置き換える」「両方必要だ」「どちらもまだプロダクションには早い」。
実際はこうです。2つはまったく異なる問題を解決するものです。 この区別を混同することが、今のAIエンジニアリングで最もよくあるミスです。MCPはエージェントとツールの会話方法、A2Aはエージェント同士の会話方法を扱います。ここを間違えると、アーキテクチャ全体がかみ合わなくなります。
この記事では、両プロトコルをゼロから解きほぐします。アーキテクチャ、メッセージフロー、実コード、実戦的な実装パターンまで。読み終える頃には、どう組み合わせるか、いつどちらを使うかが明確になっているはずです。
誰も考えなかった2つの問題
MCPとA2Aが登場する前は、AIのツール連携はすべてワンオフの手作りでした。ClaudeをDBに繋ぎたい?カスタムコード。GPTをSlackに繋ぎたい?別のカスタムコード。2つのAIエージェントを協調させたい?幸運を祈ります。毎回ゼロから構築するしかなかったんです。
これが2つの異なる連携地獄を生みました。
課題1:ツール連携(MCPで解決)
AIプロバイダーごとに外部ツールの接続方法が違いました。OpenAIはfunction calling、Anthropicはtool use、Googleはfunction declarations。JSONスキーマも、レスポンス形式も、エラーハンドリングも全部別。Claude用にPostgresコネクタを作っても、GPTでは大幅に書き直しが必要でした。
課題2:エージェント間の協調(A2Aで解決)
マルチエージェントシステムを構築し始めると、エージェント同士が互いを発見し、能力を確認し、タスクを委任する標準的な方法がありませんでした。「リサーチエージェント」と「ライティングエージェント」がいても、調整はすべてアプリケーションコードでの手作業。一方を入れ替えたら?オーケストレーション層を丸ごと書き直しです。
MCPとA2Aは、この2つの異なる問題に対する専用の解答です。この分離を理解することが、すべての出発点です。
MCP:Model Context Protocol 徹底解説
MCPとは何か
MCP(Model Context Protocol)は、Anthropicが開発し2025年12月にLinux FoundationのAAIF(Agentic AI Foundation)に寄贈したプロトコルです。AIエージェントが外部ツール、データソース、サービスに接続する方法を標準化します。AIの頭脳と手の間の標準インターフェースと考えてください。
2026年2月時点で、MCP SDKのダウンロードは月間9,700万回(Python + TypeScript合計)を超え、Anthropic、OpenAI、Google、Microsoft、Amazonのメジャープロバイダーすべてが採用しています。
アーキテクチャ
MCPはJSON-RPC 2.0をワイヤーフォーマットとするクライアント-サーバーアーキテクチャです:
┌─────────────────────┐ JSON-RPC 2.0 ┌──────────────────┐
│ │ ◄──────────────────► │ │
│ MCPクライアント │ (stdio, SSE, │ MCPサーバー │
│ (AIエージェント) │ HTTP Streaming) │ (ツール提供者) │
│ │ │ │
│ ┌───────────────┐ │ │ ┌────────────┐ │
│ │ Claude/GPT/ │ │ リクエスト: │ │ Resources │ │
│ │ Gemini/ローカル│──┼──► tools/call ────────►│ │ (データ) │ │
│ │ │ │ │ ├────────────┤ │
│ │ │◄─┼── 結果/エラー ◄───────│ │ Tools │ │
│ └───────────────┘ │ │ │ (アクション) │ │
│ │ │ ├────────────┤ │
│ │ │ │ Prompts │ │
│ │ │ │ (テンプレート)│ │
│ │ │ ├────────────┤ │
│ │ │ │ Sampling │ │
│ │ │ │ (LLM呼び出し)│ │
│ │ │ └────────────┘ │
└─────────────────────┘ └──────────────────┘
MCPサーバーが公開する4種類の機能:
- Resources:読み取り専用データソース(ファイル、DBレコード、APIレスポンス)
- Tools:実行可能なアクション(クエリ実行、メール送信、ファイル作成)
- Prompts:構造化された引数を持つ再利用可能なプロンプトテンプレート
- Sampling:クライアントにLLM呼び出しを要求する機能(逆方向)
MCPサーバーの構築
DBクエリ機能を提供する実践的なMCPサーバーをTypeScriptで構築してみましょう:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import postgres from "postgres"; const sql = postgres(process.env.DATABASE_URL!); const server = new McpServer({ name: "postgres-explorer", version: "1.0.0", }); // Resource: 利用可能なテーブル一覧 server.resource( "tables", "postgres://tables", async (uri) => { const tables = await sql` SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' `; return { contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(tables, null, 2), }], }; } ); // Tool: 読み取り専用クエリの実行 server.tool( "query", "Execute a read-only SQL query against the database", { sql: z.string().describe("The SQL query to execute (SELECT only)"), }, async ({ sql: query }) => { // セキュリティ:SELECTのみ許可 if (!query.trim().toUpperCase().startsWith("SELECT")) { return { content: [{ type: "text", text: "Error: Only SELECT queries allowed" }], isError: true, }; } const result = await sql.unsafe(query); return { content: [{ type: "text", text: JSON.stringify(result, null, 2), }], }; } ); // Tool: テーブルスキーマの取得 server.tool( "describe-table", "Get the schema of a specific table", { tableName: z.string().describe("Name of the table to describe"), }, async ({ tableName }) => { const columns = await sql` SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = ${tableName} AND table_schema = 'public' ORDER BY ordinal_position `; return { content: [{ type: "text", text: JSON.stringify(columns, null, 2), }], }; } ); // Prompt: 分析プロンプトの生成 server.prompt( "analyze-table", "Generate a prompt to analyze data in a specific table", { tableName: z.string().describe("Table to analyze"), focus: z.string().optional().describe("Specific aspect to focus on"), }, async ({ tableName, focus }) => ({ messages: [{ role: "user", content: { type: "text", text: `Analyze the "${tableName}" table in our PostgreSQL database.${ focus ? ` Focus specifically on: ${focus}.` : "" } Start by examining the schema, then run queries to understand the data distribution, identify patterns, and surface any anomalies.`, }, }], }) ); // サーバー起動 const transport = new StdioServerTransport(); await server.connect(transport);
このサーバー1つで、Claude Desktop、VS Code Copilot、Cursorなど、MCP対応クライアントすべてでそのまま使えます。修正不要です。
トランスポート
MCPは3種類のトランスポートをサポートしています:
| トランスポート | ユースケース | 動作方式 |
|---|---|---|
| stdio | ローカルツール、CLI、デスクトップ | サブプロセスとして実行、stdin/stdoutでメッセージ交換 |
| SSE (Server-Sent Events) | リモートサーバー、Web | SSEによるサーバー→クライアントストリーミング |
| Streamable HTTP | 本番API、クラウド | 双方向ストリーミング対応HTTP(最新) |
ローカル開発ではstdioが最も一般的です。Claude Desktopなどのツールは、MCPサーバーを子プロセスとして起動します。本番環境では、Streamable HTTPが標準になりつつあります。
2026年のMCPエコシステム
エコシステムは爆発的に拡大しています。2026年3月時点:
- 公開レジストリに5,800以上のMCPサーバー
- GitHub、Slack、PostgreSQL、Google Drive、Stripe、AWS、Jira、Linear、Notionの公式サーバー
- Claude Desktop、VS Code、Cursor、Windsurf、Zed、JetBrains IDEにネイティブMCPサポート
- コード実行サポート:MCPサーバーがデータをフィルタリング・加工してからLLMに送信可能 → トークン消費を大幅に削減
「一度書けばどこでも使える」という約束が、本当に機能しています。今日構築したPostgres MCPサーバーは、すべてのメジャーAIクライアントで動作します。
A2A:Agent-to-Agent Protocol 徹底解説
A2Aとは何か
A2A(Agent-to-Agent)は、Googleが2025年4月に開発し、同年6月にLinux Foundationに寄贈したプロトコルです。AIエージェント同士がフレームワークやベンダーに関係なく、互いを発見し、通信し、協働する方法を標準化します。AIエージェント版のHTTPと考えてください。
急速に普及しました。IBMのAgent Communication Protocol(ACP)が2025年8月にA2Aに合流し、2025年12月にはLinux Foundationが**AAIF(Agentic AI Foundation)**を設立。OpenAI、Anthropic、Google、Microsoft、AWS、Blockの6社が共同創設者として参加し、A2AとMCPの共同ガバナンス体制が整いました。2026年2月時点で100社以上が支持を表明し、3層AIプロトコルスタック(MCPがツール、A2Aがエージェント、WebMCPがWebアクセス)がコンセンサスアーキテクチャとして定着しつつあります。
アーキテクチャ
A2AはJSON-over-HTTPによるクライアント-リモートアーキテクチャです:
┌─────────────────────┐ HTTP/JSON ┌──────────────────┐
│ │ ◄────────────────────► │ │
│ クライアントAgent │ │ リモートAgent │
│ (オーケストレータ) │ │ (スペシャリスト) │
│ │ 1. 発見 │ │
│ 「これを頼みたい」 │ ──► GET /agent.json ────►│ Agent Card │
│ │ ◄── 能力一覧 ◄──────────│ (JSONマニフェスト)│
│ │ │ │
│ │ 2. タスクライフサイクル │ │
│ │ ──► tasks/send ──────────►│ タスク処理 │
│ │ ◄── ステータス更新 ◄──────│ (非同期可) │
│ │ │ │
│ │ 3. ストリーミング │ │
│ │ ──► tasks/sendSubscribe ─►│ リアルタイム │
│ │ ◄── SSEイベント ◄────────│ 進捗 │
│ │ │ │
│ │ 4. アーティファクト │ │
│ │ ◄── 成果物 ◄────────────│ 成果物 │
└─────────────────────┘ └──────────────────┘
コアコンセプト:
- Agent Card:エージェントの能力を記述するJSONマニフェスト(
/.well-known/agent.jsonに配置)。認証要件や対応機能も含む - Tasks:エージェント間の作業単位。状態:
submitted、working、input-required、completed、failed、canceled - Messages:タスク内の通信。テキスト、ファイル、データの各Partを含む
- Artifacts:完了タスクの成果物・出力
- Streaming:長時間タスク向けSSEリアルタイム更新
Agent Cards:発見メカニズム
Agent Cardは、エージェントが自身の能力を公開する方法です。既知のURLに配置されます:
{ "name": "Code Review Agent", "description": "セキュリティ分析、パフォーマンスプロファイリング、スタイルチェックを含む自動コードレビュー", "url": "https://code-review.example.com", "version": "2.1.0", "capabilities": { "streaming": true, "pushNotifications": true, "stateTransitionHistory": true }, "authentication": { "schemes": ["Bearer"], "credentials": "OAuth 2.0 token required" }, "defaultInputModes": ["text/plain", "application/json"], "defaultOutputModes": ["text/plain", "application/json"], "skills": [ { "id": "security-review", "name": "セキュリティ脆弱性スキャン", "description": "OWASP Top 10脆弱性、依存関係リスク、シークレット漏洩をスキャン", "tags": ["security", "OWASP", "vulnerability"], "examples": [ "このPRのセキュリティ脆弱性をレビューしてください", "認証モジュールのインジェクションリスクをスキャンしてください" ] }, { "id": "performance-review", "name": "パフォーマンス分析", "description": "N+1クエリ、メモリリーク、不要な再レンダリング、バンドルサイズへの影響を分析", "tags": ["performance", "optimization", "memory"], "examples": [ "このコンポーネントのパフォーマンス問題をチェックしてください", "このサービスのデータベースクエリパターンを分析してください" ] } ] }
強力な点は、クライアントエージェントがリモートエージェントの能力をプログラマティックに発見し、適切かどうかを判断し、事前設定なしにタスクを委任できることです。
タスクライフサイクル
コードで見る完全なA2Aインタラクション:
// クライアントエージェント:Code Review Agentにタスク送信 const response = await fetch("https://code-review.example.com/tasks/send", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer <token>", }, body: JSON.stringify({ jsonrpc: "2.0", method: "tasks/send", id: "task-001", params: { id: "review-pr-42", message: { role: "user", parts: [ { type: "text", text: "PR #42のセキュリティ脆弱性をチェックしてください。認証フローを変更し、新しいOAuthプロバイダーを追加するPRです。", }, { type: "data", data: { repository: "acme/backend", prNumber: 42, diffUrl: "https://github.com/acme/backend/pull/42.diff", }, }, ], }, }, }), }); const result = await response.json(); // result.result.status.state === "completed" // result.result.artifactsにレビュー結果が含まれる
長時間タスクにはストリーミングを使用:
// SSEでタスク進捗をストリーミング const eventSource = new EventSource( "https://code-review.example.com/tasks/sendSubscribe", { method: "POST", body: JSON.stringify({ jsonrpc: "2.0", method: "tasks/sendSubscribe", params: { id: "review-pr-42", message: { role: "user", parts: [{ type: "text", text: "コードベース全体の詳細レビュー" }], }, }, }), } ); eventSource.addEventListener("message", (event) => { const update = JSON.parse(event.data); switch (update.result.status.state) { case "working": console.log("エージェント作業中:", update.result.status.message); break; case "input-required": // リモートエージェントが追加情報を要求 console.log("エージェントが入力を要求:", update.result.status.message); break; case "completed": console.log("レビュー完了:", update.result.artifacts); eventSource.close(); break; } });
A2A vs 直接API呼び出し
「他のエージェントのAPIを直接呼べばいいのでは?」と思うかもしれません。答えは、標準化とコンポーザビリティです:
| 観点 | 直接API呼び出し | A2Aプロトコル |
|---|---|---|
| 発見 | 手動設定 | Agent Cardsで自動 |
| タスク追跡 | 自前で構築 | ビルトインのステートマシン |
| 非同期処理 | カスタムWebhook | 標準化されたプッシュ通知 |
| ストリーミング | カスタム実装 | 定義済みフォーマットのSSE |
| エージェント交換 | 連携を書き直し | URLを変更、インターフェース維持 |
| マルチモーダル | API毎にカスタム | 標準Partsシステム |
3層プロトコルスタック
ここですべてが繋がります。2026年AIシステムのコンセンサスアーキテクチャは3層スタックです:
┌──────────────────────────────────────────────────────────┐
│ アプリケーション │
├──────────────────────────────────────────────────────────┤
│ │
│ Layer 3: A2A(エージェント ↔ エージェント) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ リサーチ │◄──►│ プランニング│◄──►│ 実行 │ │
│ │ Agent │ │ Agent │ │ Agent │ │
│ └─────┬────┘ └─────┬────┘ └─────┬────┘ │
│ │ │ │ │
│ Layer 2: MCP(エージェント ↔ ツール) │
│ ┌─────┴────┐ ┌─────┴────┐ ┌─────┴────┐ │
│ │ Bing │ │ Calendar │ │ GitHub │ │
│ │ Search │ │ API │ │ Actions │ │
│ │ Server │ │ Server │ │ Server │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ Layer 1: WebMCP(エージェント ↔ Web) │
│ ┌──────────────────────────────────────────┐ │
│ │ エージェント向けの構造化Webアクセス │ │
│ │ (llms.txt, エージェント用サイトマップ) │ │
│ └──────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────┘
Layer 1、WebMCP:構造化Webアクセスです。サイトがllms.txtをはじめ機械可読コンテンツを公開する仕組みで、まだ初期段階ですが急速に拡大中です。
Layer 2、MCP:エージェントがツールを使うレイヤーです。Postgresエクスプローラー、GitHub連携、Slackコネクタ。これらはすべてMCPサーバーとして動きます。
Layer 3、A2A:エージェント同士が会話するレイヤーです。リサーチエージェントがプランニングエージェントの力を借りたいとき、A2Aがコーディネートします。各エージェントは自分のMCPツール接続を維持しつつ、仲間とはA2Aで通信する構造です。
実例:自動PRレビューパイプライン
リアルなシナリオで全体像を見てみましょう。中規模チームの自動PRレビューパイプラインです:
// オーケストレータ:A2Aを使ってPRレビューパイプラインを調整 import { A2AClient } from "@a2a/client"; class PRReviewOrchestrator { private securityAgent = new A2AClient("https://security-agent.internal"); private perfAgent = new A2AClient("https://perf-agent.internal"); private styleAgent = new A2AClient("https://style-agent.internal"); async reviewPR(prUrl: string, diff: string): Promise<ReviewResult> { // ステップ1:エージェントの能力を発見 const [secCard, perfCard, styleCard] = await Promise.all([ this.securityAgent.getAgentCard(), this.perfAgent.getAgentCard(), this.styleAgent.getAgentCard(), ]); // ステップ2:全エージェントにA2Aで並列タスク送信 const [secResult, perfResult, styleResult] = await Promise.all([ this.securityAgent.sendTask({ id: `sec-${Date.now()}`, message: { role: "user", parts: [ { type: "text", text: `セキュリティレビュー: ${prUrl}` }, { type: "data", data: { diff } }, ], }, }), this.perfAgent.sendTask({ id: `perf-${Date.now()}`, message: { role: "user", parts: [ { type: "text", text: `パフォーマンス分析: ${prUrl}` }, { type: "data", data: { diff } }, ], }, }), this.styleAgent.sendTask({ id: `style-${Date.now()}`, message: { role: "user", parts: [ { type: "text", text: `スタイルチェック: ${prUrl}` }, { type: "data", data: { diff } }, ], }, }), ]); // 各エージェントは内部でMCPを使ってアクセス: // - GitHub MCPサーバー(ファイルのフルコンテキスト取得) // - SonarQube MCPサーバー(セキュリティエージェント) // - Lighthouse MCPサーバー(パフォーマンスエージェント) // - ESLint MCPサーバー(スタイルエージェント) return this.synthesizeResults(secResult, perfResult, styleResult); } }
この構成では:
- A2Aがオーケストレータ ↔ スペシャリストエージェント間の通信を担当
- MCPが各スペシャリストエージェントのツールアクセスを担当(GitHub、SonarQubeなど)
- オーケストレータはツールの詳細を知る必要がありません。A2Aで委任するだけです
正面比較
| 項目 | MCP | A2A |
|---|---|---|
| 開発元 | Anthropic(2024年11月) | Google(2025年4月) |
| 管理団体 | Linux Foundation AAIF | Linux Foundation AAIF |
| 目的 | エージェント ↔ ツール連携 | エージェント ↔ エージェント通信 |
| アーキテクチャ | クライアント-サーバー | クライアント-リモート |
| ワイヤーフォーマット | JSON-RPC 2.0 | JSON-RPC 2.0 over HTTP |
| 発見方式 | 設定ベース | Agent Cards (agent.json) |
| トランスポート | stdio, SSE, Streamable HTTP | HTTP, SSE, Webhook |
| 認証 | サーバー依存 | OAuth 2.0 / Bearerトークン |
| ステートフル? | セッションベース | タスクベースのステートマシン |
| ストリーミング | トランスポートレベル | 定義済みイベントのSSE |
| 中核単位 | ツール呼び出し / リソース読み取り | タスクライフサイクル |
| SDKダウンロード | 約9,700万/月(2026年2月) | 急速に成長中 |
| エコシステム | 5,800+公開サーバー | 100+企業が採用 |
| 最適な場面 | 「このエージェントにXツールへのアクセスを与えたい」 | 「エージェントAからBに委任したい」 |
重なる部分と重ならない部分
「これはMCPにすべき?A2Aにすべき?」と迷うグレーゾーンがあります。判断フレームワークはこちら:
MCPを使うべきケース:
- 決定論的ツールを公開する場合(DB、API、ファイルシステム)
- やり取りがリクエスト-レスポンスの場合(関数呼び出し→結果取得)
- 「サーバー」側に独自の知性や意思決定がない場合
- 幅広いAIクライアントとの互換性が必要な場合
A2Aを使うべきケース:
- リモートシステムが独自のAI推論能力を持つ場合
- タスクが長時間に及ぶ、または双方向の交渉が必要な場合
- リモートシステムに自律的な判断を求める場合
- エージェントの発見と能力マッチングが必要な場合
重なるゾーン:
文書を要約するサービスがあるとします。MCPツールでしょうか、A2Aエージェントでしょうか?
- 固定関数(入力:文書 → 出力:要約)なら、MCPサーバー
- コンテキストに応じてどう要約するか判断し、確認質問をし、他のサービスと連携するなら、A2Aエージェント
判断基準はシンプルです:MCPはツール向け、A2Aは対等な仲間向け。
セキュリティ
両プロトコルにはそれぞれ異なるセキュリティ面があります:
MCPのセキュリティ
MCPは意図的に**認証方式に非依存(auth-agnostic)**です。プロトコル自体は認証方法を規定しません:
// MCPサーバー実装者がアクセス制御を実装する責任がある const server = new McpServer({ name: "enterprise-db", version: "1.0.0", }); // 自前でアクセス制御を実装する必要がある server.tool("query", "Run a database query", { sql: z.string() }, async ({ sql }, { authContext }) => { // ユーザーの権限を検証 if (!authContext?.permissions?.includes("db:read")) { return { content: [{ type: "text", text: "Unauthorized" }], isError: true }; } // クエリ自体を検証 const sanitized = await validateAndSanitize(sql); // ... } );
MCPセキュリティの主な懸念:
- ツールポイズニング:悪意あるMCPサーバーがLLMの挙動を操作するデータを返す可能性
- 過剰な権限付与:MCPサーバーが広範なアクセス権を持つことが多い(DB全体、ファイルシステム全体)
- サプライチェーンリスク:公開レジストリからMCPサーバーをインストールするのは、npmパッケージを入れるのと同じです。何をするものなのか、必ず確認してください
- ツール経由のプロンプトインジェクション:MCPツールが返すデータに注入された命令が含まれる可能性
A2Aのセキュリティ
A2Aは境界を越える通信用に設計されているため、ビルトインのセキュリティプリミティブがより充実しています:
{ "authentication": { "schemes": ["Bearer"], "credentials": "OAuth 2.0 via https://auth.example.com" } }
A2Aセキュリティの主な懸念:
- エージェントなりすまし:持っていない能力を持っていると主張するエージェント
- タスクデータ漏洩:信頼境界を越えてエージェント間で受け渡される機密データ
- 連鎖攻撃:侵害されたエージェントがA2Aを使ってネットワーク内の他のエージェントを攻撃
- 監査証跡:エージェント間のすべてのアクションが追跡可能かつログ記録されていることの確保
統合セキュリティベストプラクティス
両プロトコルを使用する本番システム向け:
- 最小権限の原則:各MCPサーバーは最低限必要なツールのみ公開
- A2A用mTLS:エージェントがネットワーク間で通信する場合はmTLSを使用
- あらゆる箇所で入力検証:MCPツールやA2Aエージェントからのデータを検証なしに信頼しない
- 監査ログ:すべてのMCPツール呼び出しとA2Aタスクをログ記録
- レート制限:両プロトコルに濫用防止のレート制限
- サンドボックス化:MCPサーバーを隔離環境で実行(コンテナ、VM)
プロダクション向け実装パターン
パターン1:ゲートウェイエージェント
最も一般的なパターン。ゲートウェイエージェントがユーザーインタラクションを処理し、A2Aで専門エージェントに委任:
ユーザー ──► ゲートウェイAgent ──A2A──► スペシャリストAgent A
──A2A──► スペシャリストAgent B
──A2A──► スペシャリストAgent C
各スペシャリストはMCPで自身のツールにアクセス
使用場面:顧客対応アプリ、チャットボット、社内生産性ツール。
パターン2:パイプライン
エージェントが直列に繋がり、処理結果を順次渡す:
入力 ──► Agent 1 ──A2A──► Agent 2 ──A2A──► Agent 3 ──► 出力
│ │ │
MCP MCP MCP
│ │ │
データソース 変換ツール 出力ツール
使用場面:データ処理パイプライン、ドキュメントワークフロー、コンプライアンスチェック。
パターン3:メッシュ
エージェント同士が動的なニーズに応じてP2Pで通信:
Agent A ◄──A2A──► Agent B
▲ ▲
│ │
A2A A2A
│ │
▼ ▼
Agent C ◄──A2A──► Agent D
使用場面:複雑なリサーチタスク、自律システム、作業分配が予測不可能な場合。
パターン4:MCPのみ(A2A不要)
過度に複雑にしないこと。1つのエージェントにツールが必要なだけなら、MCPだけで十分です:
単一Agent ──MCP──► ツールサーバー 1
──MCP──► ツールサーバー 2
──MCP──► ツールサーバー 3
使用場面:ほとんどのシングルエージェントアプリ。Cursor + MCPサーバー、Claude Desktop + ツール、VS Code + Copilot。
よくある間違い
間違い1:MCPで十分なのにA2Aを使う
「エージェント」と呼んでいても実態がLLM呼び出しをラップした決定論的関数なら、A2Aは不要です。薄いMCPサーバーの方がシンプルで、速く、ポータブルです。
レッドフラグ:「エージェント」が同じ入力に対して常に同じ出力を返す。それはツールであってエージェントではありません。MCPを使いましょう。
間違い2:MCPサーバーのセキュリティを軽視
MCPサーバーはアプリケーションの権限で実行されます。無制限のデータベースMCPサーバーは、起こるべくして起こる事故です。常にスコープを限定し、入力を検証してください。
間違い3:独自プロトコルを構築
2026年にエージェント通信用のカスタムHTTPエンドポイントを書いているなら、技術的負債を積み上げています。両方とも成熟したSDK、成長するエコシステム、業界での採用実績があります。使いましょう。
間違い4:2つを混同する
「MCPサーバーで複数エージェントをコーディネートしています」...それ、違います。エージェントをコーディネートするならA2Aの出番です。MCPサーバーはエージェントにツールを公開するもの。エージェントのオーケストレーションは守備範囲外なんです。
間違い5:時期尚早なマルチエージェントアーキテクチャ
すべてのシステムが複数エージェントを必要とするわけではありません。まず1エージェント + MCPツールで始めましょう。A2Aはエージェントの自律性と専門化が本当に必要な場面で追加します。マルチエージェントシステムはデバッグが難しく、運用コストが高く、レスポンスが遅くなります。
AAIFの存在
両プロトコルは2025年12月に設立されたLinux Foundationの**AAIF(Agentic AI Foundation)**の傘下にあります。共同創設者はOpenAI、Anthropic、Google、Microsoft、AWS、Blockの6社です。これが重要な理由:
- 中立的ガバナンス:AnthropicもGoogleも単独で仕様をコントロールしない
- 収束圧力:2つのプロトコルが共に進化する。より緊密な統合ポイントが期待される
- エンタープライズの信頼:ファウンデーションガバナンスにより両プロトコルがエンタープライズ採用に安全
- コミュニティ主導:機能提案はオープンRFCプロセスを経る
AAIFはWebMCP(第3のレイヤー)も監督しています。ここは要注目です。3層スタックは急速に固まりつつあります。
今後の展望
両プロトコルは急速に進化中です。それぞれのRFCプロセスでの提案に基づくと:
MCPロードマップ:
- OAuth 2.1ビルトイン:auth-agnosticからファーストクラスのOAuthサポートへ
- ツールチェイニング:ツール呼び出しのシーケンスをアトミック操作として定義
- セキュリティモデル強化:標準化された権限システムとサンドボックスガイドライン
- WebMCP統合:Web上のコンテンツとの深い連携
A2Aロードマップ:
- エージェントレジストリ:組織を越えてエージェントを発見する集中型ディレクトリ
- コントラクトネゴシエーション:タスク実行前にエージェントがSLAと品質制約に同意
- マルチパーティタスク:2つ以上のエージェントが1つのタスクに参加
- エンタープライズコンプライアンスフック:SOC2、GDPR、HIPAA対応の監査証跡フォーマット
まとめ
MCPとA2Aを競合として見るのはやめましょう。同じスタックのレイヤーです:
MCPはエージェントに手を与える。A2Aはエージェントに仲間を与える。
ツールアクセスが必要な単一エージェントを構築するなら、MCPから始めてください。成熟しており、広くサポートされ、膨大なプリビルトサーバーのエコシステムがあります。
専門エージェント同士が互いを発見し、タスクを委任し、協働するマルチエージェントシステムを構築するなら、A2Aを重ねてください。
エンタープライズシステムを構築するなら、両方を使いましょう。AAIFのガバナンスの傘の下で。
2026年に犯せる最悪のミスは、またカスタム連携レイヤーを作ることです。標準は存在します。SDKはプロダクションレベルです。エコシステムは指数関数的に成長しています。
スタックの上に構築し、速くシップし、本当に重要な問題に取り組みましょう。
関連ツールを見る
Pockitの無料開発者ツールを試してみましょう