コンテンツに移動
デベロッパー

Google ADK、MCP、Cloud Run を使用して専門家向けコンテンツ用のマルチ エージェント システムを構築する - パート 1

2026年4月9日
https://storage.googleapis.com/gweb-cloudblog-publish/images/devsignalheroimage.max-2500x2500.png
Shir Meir Lador

Head of AI Engineering, Google Cloud Developer Relations

※この投稿は米国時間 2026 年 3 月 19 日に、Google Cloud blog に投稿されたものの抄訳です。

私のチームのミッションは、コードの作成から Google Cloud で安全な AI ワークロードを実行するまで、デベロッパーの取り組みを加速させることです。デベロッパーの成功を支援するため、Google はデベロッパーが最も切実に求めている質問を特定し、簡単に実装できるわかりやすいソリューションを提供するデモを構築することに重点を置いています。

最近、新しい Developer Knowledge MCP サーバーがリリースされたとき、私にはひらめきが湧きました。そこで、Google Agent Development Kit(ADK)を使用して設計されたマルチエージェント システムである Dev Signal を構築し、Reddit から技術的な質問を特定し、公式ドキュメントを使用して調査し、詳細な技術ブログ記事の下書きを作成しました。Dev Signal には、Nano Banana Pro を使用したカスタム ビジュアルも備わっています。エージェントが私の好みのスタイルやブログ記事の書き方を記憶できるように、長期記憶レイヤも統合しました。

コーディング アシスタントである Gemini CLI をデベロッパー ナレッジ MCP サーバーに接続することで、このシステム全体をわずか 2 日で構築して Google Cloud Run にデプロイしました。

ここでは、長期記憶を備えた複雑なマルチ エージェント システムを設計する方法、ローカルおよびリモートの MCP サーバーを利用してツールを標準化する方法、安全な Cloud Run デプロイのための詳細な Terraform スクリプトを作成する方法など、さまざまな方法をご紹介します。

今すぐコードを見てご自分のペースで調べる場合は、こちらからリポジトリをクローニングできます。

Video Thumbnail

学習内容

4 回に分けてお届けするこのブログシリーズでは、このプロジェクトをどのように実現したのか、その手順を段階的にご紹介します。各ブログ投稿では、Dev Signal の構築とデプロイの過程を説明します。

  • パート 1: エージェント機能を構築するためのツール  – まず、プロジェクト環境をセットアップし、Model Context Protocol(MCP)を使用してエージェントにツールを装備します。トレンドの発見に Reddit を、技術的なグラウンディングに Google Cloud ドキュメントを、画像生成にカスタム Nano Banana Pro ツールを使用する方法を学びます。

  • パート 2: 長期記憶を備えたマルチ エージェント アーキテクチャ – ルート オーケストレーターと専門エージェント チームを実装して、システムの「頭脳」を構築します。また、Vertex AI Memory Bank を統合することで、エージェントがセッション全体でユーザーの好みを学習して保持できるようになります。

  • パート 3: エージェントをローカルでテストする – クラウドに移行する前に、エージェントのコンポーネントを同期し、ワークステーションでエージェントのパフォーマンスを検証します。専用のテストランナーを使用して、検出、調査、マルチモーダル作成のライフサイクル全体をシミュレートします。特に、ローカル エージェントをクラウドベースの Vertex AI Memory Bank に直接接続して、長期記憶の永続性を検証することに重点を置きます。

  • パート 4: Cloud Run へのデプロイと本番環境への移行 – 最後に、再現可能なインフラストラクチャを実現するため、Terraform を使用して Google Cloud Run にサービスをデプロイします。また、高品質で安全な本番環境システムに必要な次のステップについても説明します。

Dev Signal の概要

Dev Signal は、ノイズをフィルタして価値を生み出すように設計されたインテリジェントなモニタリング エージェントです。Dev Signal は次のように動作します。

  1. 発見: Reddit を調査して、エンゲージメントの高い技術的な質問を見つけます。

  2. グラウンディング: 正確性を確保するために、Google Cloud の公式ドキュメントを使用して回答を調査します。

  3. 作成: 調査結果に基づいて、プロフェッショナルな技術ブログ投稿の下書きを作成します。

  4. マルチモーダル生成: これらの投稿のカスタム インフォグラフィック ヘッダーを生成します。

  5. 長期記憶: Vertex AI Memory Bank を使用して、さまざまなセッションにわたってフィードバックを記憶します。

前提条件

始める前に、以下がインストールされていることを確認してください。

Python 3.12 以降

  • uv(Python パッケージ管理システム): curl -LsSf https://astral.sh/uv/install.sh | sh

  • Google Cloud SDKgcloud CLI)(インストールおよび認証済み)

  • Terraform(Iinfrastructure as Code 用)

  • Node.js と npm(Reddit MCP ツールに必要)

次も必要です。

プロジェクトのセットアップ

Dev Signal システムは、Remigiusz Samborski 氏と Vlad Kolesnikov 氏による Agent Factory のエピソードで説明されている自動化されたアーキテクト ワークフローに従って、まず Agent Starter Pack を実行して構築されました。この基盤により、エージェント ロジック、サーバーコード、ユーティリティ、ツール間の関心を分離するために使用される、プロジェクトのモジュール式ディレクトリ構造が用意されました。

Starter Pack は、プロフェッショナルなインフラストラクチャ、CI / CD パイプライン、オブザーバビリティ ツールの作成を数秒で自動化するため、強力な出発点となります。これにより、基盤となるプラットフォームのセキュリティとスケーラビリティを確保しながら、エージェント独自のインテリジェンスに十分集中できるようになります。Gemini CLIAntigravity の AI アシスタンスを使用して、生成されたボイラープレートを基に構築することで、開発プロセスが大幅に加速されます。

Agent Starter Pack のアーキテクチャの概要:

https://storage.googleapis.com/gweb-cloudblog-publish/images/agentstarterpack.max-2200x2200.png

1. プロジェクトを初期化する

プロジェクト用の新しいディレクトリを作成し、初期化します。ここでは、非常に高速な Python パッケージ管理システムである uv を使用します。

読み込んでいます...

2. フォルダ構造

このプロジェクトは次の構造に従います。これらのファイルにデータを段階的に入力していきます。

読み込んでいます...

3. 依存関係を定義する

必要な依存関係を使用して pyproject.toml を更新します。エージェント フレームワークには google-adk を、モデルのインタラクションには google-genai を使用します。

読み込んでいます...

uv sync を実行してすべてインストールします。

エージェント コード用の新しいディレクトリを作成します。

読み込んでいます...

エージェント機能の構築: MCP ツール

エージェントは外部とやり取りする必要があります。これを標準化するために、Model Context Protocol(MCP)を使用します。Model Context Protocol(MCP)は、AI エージェントを外部のデータやツールに接続するための普遍的な基準です。カスタム API ラッパーを記述する代わりに、標準の MCP サーバーを使用します。これにより、共通のインターフェースを使用して、API(Reddit)、ナレッジベース(Google Cloud ドキュメント)、さらにはローカル スクリプト(Nano Banana Pro を使用した画像生成)にも接続できます。エージェント ツール用の新しいディレクトリを作成します。

読み込んでいます...

ツールの構成

ツールセットは dev_signal_agent/tools/mcp_config.py で定義します。

このファイルでは、3 つの主要なツールの接続パラメータを定義します。

  • Reddit: ローカル stdio サブプロセス経由で接続されます。

  • デベロッパー ナレッジ: リモート HTTP エンドポイント経由で接続されます。

  • Nano Banana: ローカル stdio サブプロセス(Google のカスタム Python スクリプト)経由で接続されます。

Reddit 検索(発見ツール)

Reddit MCP サーバー は Reddit API へのブリッジとして機能し、複雑な API ラッパーを記述しなくても、トレンドとなっている投稿をエージェントが発見してエンゲージメントを分析できるようにします。移植性を確保するために、コードでは「検索またはフェッチ」戦略が使用されています。まずローカル インストールをチェックし、見つからない場合は npx を使用してサーバーをオンデマンドでダウンロードして実行します。

ネットワーク接続の代わりに、エージェントはサーバーをローカル サブプロセスとして起動し、標準入出力(stdio)を介して通信します。Google ADK 内の McpToolset クラスは、これらの接続を標準化する普遍的なラッパーとして機能し、エージェントが共通のインターフェースを使用して、コミュニティ リソースからカスタム スクリプト(Nano Banana 画像生成ツールなど)まで、さまざまなツールとやり取りできるようにします。環境変数を介して API 認証情報を安全に渡すことで、システムはこれらの「プラグ アンド プレイ」モジュールが AI と外部プラットフォーム間のシームレスなブリッジとして機能することを保証します。

次のコードを dev_signal_agent/tools/mcp_config.py に貼り付けます。

lang-py
読み込んでいます...

Google Cloud ドキュメント(ナレッジツール)

Developer Knowledge MCP サーバーは、エージェントが Google Cloud の公式ドキュメントのコーパス全体を検索できるようにすることで、エージェントのグラウンディングを提供します。これは、ローカルの Reddit サーバーとは異なり、Google がホストするマネージド サービスであり、インターネット経由でリモート エンドポイントとしてアクセスされます。セマンティック クエリ用の google_developer_documentation_search や、完全なマークダウン コンテンツを取得するための google_developer_documentation_fetch などの特殊なツールが公開されており、エージェントが技術的な主張を行うたびに、最新の確かな事実によって裏付けられるようになっています。

注: Gemini CLIAntigravity などのコーディング アシスタント ツールをデベロッパー ナレッジ MCP サーバーに接続して、最新の便利な Google Cloud ドキュメントをアシスタントに提供することもできます。このブログ記事を書くときも使っています。

接続するために、エージェントは McpToolset クラスと StreamableHTTPConnectionParams を使用し、ローカル プロセスを起動する代わりにウェブ URL を指定します。リクエスト ヘッダーで渡される DK_API_KEYAPI キーを作成)を使用して安全に認証し、エージェントが単一の標準化されたインターフェースを通じて、公式ドキュメント、コミュニティの感情、より広範なウェブ コンテキスト全体で「包括的な調査スイープ」を実行できるようにします。

次のコードを dev_signal_agent/tools/mcp_config.py に貼り付けます。

lang-py
読み込んでいます...

画像生成ツール(Nano Banana MCP)

Reddit とドキュメントには外部 MCP サーバーを使用しましたが、特定の Python ロジックをラップする独自のカスタム MCP サーバーを構築することもできます。この例では、Gemini 3 Pro Image(Nano Banana Pro とも呼ばれます)を搭載した画像生成ツールを作成します。これは、任意の Python 関数を、任意のエージェントが理解できるツールに標準化できることを示しています。

画像生成の仕組み:

  • FastMCP: fastmcp ライブラリを使用してサーバーの作成を大幅に簡素化し、数行のコードで Python 関数をツールとして登録できるようにします。

  • Gemini のインテグレーション: サーバーは Google GenAI SDK を使用して gemini-3-pro-image-preview モデルを呼び出し、エージェントの説明的なプロンプトを未加工の画像バイトに変換します。

  • GCS へのアップロードとホスティング: エージェント インターフェースでは通常、画像を表示するために URL が必要となるため、サーバーは生成されたバイトを Google Cloud Storage(GCS)に自動的にアップロードし、公開リンクを返します。

このローカルツールを接続するには、StdioConnectionParams を使用します。これは、サーバーが標準入出力を介して通信するローカル サブプロセスとして実行されるためです。この転送方法は、サーバーのエントリポイントで定義する transport="stdio" 構成に直接一致し、カスタムのローカル スクリプトのシームレスな接続を保証します。

次のコードは、dev_signal_agent/tools/mcp_config.py で MCP 接続を定義します。uv run を使用して、すべての依存関係が正しくインストールされている、隔離された環境でサーバーが起動するようにします。

次のコードを dev_signal_agent/tools/mcp_config.py に貼り付けます。

lang-py
読み込んでいます...

Nano Banana Pro サーバー ロジックの実装

次に、このサーバーの実際のロジックを実装します。この実装は、Remigiusz Samborski 氏による Agent Factory デモのコードに基づいています。Remi の元のコードには、MCP サーバーを Cloud Run にデプロイする手順が記載されていますが、ここでは開発とテストを迅速に行うために、ローカル サブプロセスとして実行します。

まず、新しいサーバー用のディレクトリを作成します。

読み込んでいます...

サーバー エントリポイント(main.py

このファイルは、MCP サーバーを初期化して起動する「頭脳」として機能します。

  • FastMCP の初期化: FastMCP ライブラリを使用して、「MediaGenerators」という名前のサーバーを作成し、generate_image 関数をツールとして登録します。

  • 安全なロギング: _initialize_console_logging 関数が重要な役割を果たします。この関数はすべてのログを sys.stderr に強制的に出力します。これは、MCP の「stdio」転送がエージェントとツールの間の通信に sys.stdout を使用するためです。stdout に送信される標準ログは、そのプロトコルを破損させます。

  • 実行: mcp.run(transport="stdio") 行は、サーバーをローカル サブプロセスとして起動し、標準入力経由でエージェントからのリクエストをリッスンできるようにします。

次のコードを dev_signal_agent/tools/nano_banana_mcp/main.py に貼り付けます。

lang-py
読み込んでいます...

生成ロジック(nano_banana_pro.py)

ここでは、Gemini を使用して実際に画像が生成されます。

  • GenAI クライアント: Google の生成モデルとやり取りするために、genai.Client() を初期化します。

  • モデルの選択: 具体的には gemini-3-pro-image-preview モデルを対象とします。response_modalities を「IMAGE」に設定して、テキストだけでなくピクセルも必要であることをモデルに伝えます。

  • 堅牢性: コードには、一時的な生成エラーを処理するための MAX_RETRIES ループ(5 に設定)が含まれており、エージェントが有効な画像を複数回取得できるようにしています。

  • バイト処理: モデルが画像を生成すると、未加工のインライン データとして届きます。これらのバイトを抽出し、ヘルパーを呼び出してクラウドに移動します。

  • URI 変換: 最後に、内部の gs:// パスを、ブラウザからアクセス可能な https:// URL に置き換え、ユーザーが実際に画像を見られるようにします。

次のコードを dev_signal_agent/tools/nano_banana_mcp/nano_banana_pro.py に貼り付けます。

lang-py
読み込んでいます...

GCS アップロード ヘルパー(storage_utils.py)

エージェントは画像を表示するためにリンクを必要とするため、このユーティリティは Google Cloud Storage(GCS)でホスティングを処理します。

  • バケットの動的な選択: 環境変数でバケット名を探し、AI_ASSETS_BUCKET から LOGS_BUCKET_NAME にフォールバックして、データの保存場所が常に確保されるようにします。

  • 一意のファイル名: 未加工の画像データの MD5 ハッシュを使用して、一意のファイル名を作成します。これにより、ファイル名の競合を防ぐことができ、同じ画像の重複アップロードを回避する簡単な方法として機能します。

  • クラウド アップロード: blob.upload_from_string メソッドは、未加工の画像バイトを GCS バケットに直接 push します。

次のコードを dev_signal_agent/tools/nano_banana_mcp/storage_utils.py に貼り付けます。

lang-py
読み込んでいます...

データモデル(media_models.py

このファイルにより、データが厳格な構造(スキーマ)に従うことが保証されます。

  • 構造化された出力: Pydantic BaseModel を使用することで、ツールが常に uri(リンク)とオプションの error メッセージを含む一貫した JSON オブジェクトを返すことを保証します。これにより、AI エージェントがツールの結果を理解して処理することがはるかに容易になります。

次のコードを dev_signal_agent/tools/nano_banana_mcp/media_models.py に貼り付けます。

lang-py
読み込んでいます...

ツールの依存関係(requirements.txt)

コードの実行には uv を使用しますが、requirements.txt ファイルは、Nano Banana サーバーが機能するために uv がインストールする必要がある特定の依存関係を定義するため、依然として不可欠です。これにより、隔離された環境をサーバーの起動前にセットアップするために必要な「材料」が提供されます。

このファイルには、このツールに必要な 3 つのコアライブラリがリストされています。

  • google-cloud-storage: 生成された画像をクラウドでホストするために使用されます。

  • google-genai: Gemini 3 Pro の画像生成のロジックを提供します。

  • fastmcp: Python スクリプトを標準化された MCP ツールに変えるフレームワークです。

次のコードを dev_signal_agent/tools/nano_banana_mcp/requirements.txt に貼り付けます。

読み込んでいます...

まとめ

シリーズのパート 1 では、Model Context Protocol(MCP)を通じて外部統合を標準化することにより、エージェントのコア機能を確立することに焦点を当てました。高速な依存関係管理のために uv を使用してプロジェクトを初期化し、トレンド発見のための Reddit、技術的なグラウンディングのための Google Cloud ドキュメント、マルチモーダル画像生成のためのカスタム「Nano Banana」MCP サーバーという 3 つの重要なツールセットを構成しました。Google ADK の McpToolset を利用することで、複雑な API ロジックをシンプルなプラグ アンド プレイ モジュールに抽象化し、ツールが共通のインターフェースを共有してインテリジェンスから統合を切り離せるようにしました。

技術的基盤について詳しく確認するには、Developer Knowledge MCP サーバーでナレッジ グラウンディングの詳細を確認するか、Google ADK GitHub リポジトリでフレームワークのコア機能について調べることができます。

ツールセットが完全に構成され、使用できる状態になったので、パート 2 に進みましょう。パート 2 では、マルチ エージェント アーキテクチャを構築し、Vertex AI Memory Bank を統合してこれらの機能をオーケストレートします。さらに詳しく調べる場合は、GitHub リポジトリでシリーズ全体の詳細なコードを確認できます。

この記事に対して、レビューとフィードバックを提供してくださった Remigiusz Samborski 氏に心より感謝いたします。

このようなコンテンツをさらにご覧になりたい場合は、LinkedInX で私をフォローしてください。

- AI / プロダクト / DevRel 責任者、Shir Meir Lador

投稿先