MCP を使用した ADK エージェントを A2A フレームワークに変換する方法
Neeraj Agrawal
Solution Acceleration Architect
Ashwini Kumar
Solution Acceleration Architect
【Next Tokyo ’25】
【Next Tokyo】120 以上のセッションをアーカイブ公開中。話題の Gemini、生成 AI、AI エージェントなどの Google Cloud のアップデートや顧客事例をチェックしましょう。
視聴はこちら※この投稿は米国時間 2025 年 7 月 3 日に、Google Cloud blog に投稿されたものの抄訳です。
AI エージェントの進化により、複雑なタスクを実行できる高性能な特化型モデルが誕生しています。Google Agent Development Kit(ADK)は、言語モデルベースのアプリケーションの構築と管理を簡素化するためのツールキットです。デベロッパーは、このツールキットを利用することで、通常は Model Context Protocol(MCP)を介した、ウェブ スクレイピングなどのタスク向けのツールを備えるエージェントを簡単に構築できます。しかし、その可能性を最大限に引き出すには、これらのエージェントに連携機能が必要です。Agent-to-Agent(A2A)フレームワークは、異なるエージェントが互いを検出し、互いの機能を理解して、安全にやり取りできるようにする標準化された通信プロトコルであり、この相互運用性の標準となります。
このガイドでは、MCP ツールを使用するスタンドアロンの ADK エージェントを、A2A に完全に対応したコンポーネントに変換し、より大規模なマルチエージェント エコシステムの一部とする手順を詳しく説明します。ここでは、例として、実際にウェブ コンテンツをスクレイピングするように設計された MultiURLBrowser エージェントを使用します。
ステップ 1: コアエージェントとその MCP ツールを定義する(agent.py)
エージェントの基盤が、そのコアロジックであることは変わりません。重要な点は、ADK LlmAgent を適切に初期化し、外部ツールと接続するようにその MCPToolset を構成することです。
agent.py の _build_agent メソッドで、LLM とそのツールを指定します。MCPToolset は firecrawl-mcp ツールを起動するように構成されており、環境変数を通じて必要な API キーを渡します。
ステップ 2: パブリック ID を確立する(__main__.py)
作成したエージェントが他のエージェントから検出され、理解されるようにするには、パブリック ID が必要です。そのためには、__main__.py ファイルの AgentSkill と AgentCard を使用します。このファイルは、A2A サーバーのエントリ ポイントとしても機能します。
1. AgentSkill の定義: このオブジェクトは、エージェントの機能を宣言する役割を果たします。このオブジェクトには、一意の ID、人が読める形式の名前、説明、例が含まれています。
2. AgentCard の定義: エージェントの主要な検出用メタデータです。これには、エージェントの名前、URL、バージョン、そして最も重要となる、エージェントが有するスキルのリストが含まれています。
ステップ 3: A2A タスク マネージャーを実装する(task_manager.py)
AgentTaskManager は、A2A フレームワークとエージェントのロジックをつなぐ役割を果たし、AgentExecutor インターフェースを実装します。このインターフェースには、execute メソッドと cancel メソッドが必要です。
リクエストを受信すると、execute メソッドが A2A サーバーによってトリガーされます。このメソッドはタスクのライフサイクルを管理し、エージェントを呼び出し、EventQueue と TaskUpdater を介してステータスの更新と結果をサーバーにストリーミングします。
ステップ 4: エージェントの呼び出しメソッドを作成する(agent.py)
invoke メソッドは、エージェントのコア ADK ロジックへのエントリ ポイントです。AgentTaskManager によって呼び出され、ADK Runner を実行します。ランナーがクエリを処理すると、この非同期ジェネレータがイベントを生成し、進行状況の更新と最終的なレスポンスをストリーミングできるようになります。
すべてのコンポーネントが正しく構成されたため、MultiURLBrowser エージェントが完全に動作する A2A エージェントになりました。このエージェントは、クライアントからコンテンツのスクレイピング リクエストが送信されると、タスクを処理して最終結果を返します。
A2A に対応するエージェントが完成したら、それらのエージェントにサブタスクを委任する「オーケストレーター エージェント」を作成できます。これにより、複雑なマルチステップのワークフローを完了できます。
ステップ 1: 利用可能なエージェントを特定する
オーケストレーターは、まず他のエージェントが利用可能かどうかを把握する必要があります。このためには、既知のレジストリ エンドポイントに対してクエリを実行し、登録されているすべてのエージェントの AgentCard を一覧表示します。
ステップ 2: 他のエージェントをツールとして呼び出す
オーケストレーターは、a2a.client を使用して他のエージェントとやり取りします。call_agent 関数は、SendMessageRequest を構築してターゲット エージェントにディスパッチする方法を示します。
ステップ 3: オーケストレーターの LLM を構成する
最後に、検出のための関数と委任のための関数をツールとして使用できるようにオーケストレーターの LlmAgent を構成します。これらのツールを使用してユーザーのリクエストを分類し、他のエージェントと連携する方法を LLM に指示するシステム命令を指定します。
この手順で、A2A に対応した特化型エージェントと、それらを活用する高性能なオーケストレーターの両方を作成し、堅牢かつ協調的なマルチエージェント システムを構築できます。
このアーキテクチャの真の力は、オーケストレーター エージェントを実行するときによくわかります。LLM は、オーケストレーターの指示に従ってユーザーの複雑なリクエストを正しく解釈し、特定の機能に特化したツールを使用して他のエージェントと連携します。
使ってみる
このガイドでは、スタンドアロンの ADK / MCP エージェントを A2A に対応したコンポーネントに変換する方法について詳しく説明し、こうしたエージェントを管理するオーケストレーターを構築する方法を紹介しました。すべての例のソースコード全体(公式ドキュメントを含む)は、以下のリンクから入手できます。
ー ソリューション アクセラレーション アーキテクト、Neeraj Agrawal
ー ソリューション アクセラレーション アーキテクト、Ashwini Kumar