Multi-Agent Task Assistant with A2A & MCP-inspired Architecture について
このPython製マルチエージェントタスクアシスタントは、Streamlitのインターフェースで記事作成とウェブ調査を処理します。独自のA2A連携と、テキスト生成、模擬検索、Google Cloud Storage向けのMCP風ツールサーバーを組み合わせています。
主な機能
- 01専門エージェントへの作業委任
- 02記事の作成とGoogle Cloud Storageへの保存
- 03模擬ウェブ調査結果の要約
- 04入力タスクの検証と翻訳
- 05ステータス更新を伴う非同期処理
- 06独自のA2Aプロトコルによるエージェント連携
活用シーン
- 01記事を作成してクラウドストレージに保存
- 02トピックを調査して生成された情報を要約
- 03検証済みタスクをワーカーエージェントに割り当て
- 04インターフェースで非同期タスクの進捗を確認
MCP 対応
MCP風のHTTPリクエスト/レスポンス方式で、テキスト生成、模擬ウェブ検索、Google Cloud Storage操作のツールサーバーを利用します。READMEでは標準MCP実装ではなく、MCP風のツール構成として説明されています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
A2A と MCP に着想を得たアーキテクチャによるマルチエージェントタスクアシスタント
このプロジェクトでは、記事の草稿作成やウェブ調査などのタスク向けに設計されたマルチエージェントシステムを紹介します。エージェント間の連携には、独自のエージェント間(A2A)通信プロトコルを採用し、外部ツールサーバーとの連携には、Model Context Protocol(MCP)に着想を得たアーキテクチャを採用しています。このシステムは、Python、Langchain、Anthropic LLM、FastAPI、Docker を使用して構築されています。
概要
Task Assistant では、特定のトピックに関する記事の草稿作成や、ウェブ調査を依頼できます。ユーザーの入力はまず「Supervisor LLM」によって検証・処理されます。検証済みのタスクは Task Manager Agent が管理し、専門エージェントである Article Draft Agent と Researcher Agent にサブタスクを割り当てます。これらのエージェントは、専用の「MCP Tool Servers」を通じて、LLM によるテキスト生成、ウェブ検索、クラウドストレージなどの外部機能を利用します。ユーザーインターフェースには Streamlit アプリケーションを使用しています。
- 各言語で入力された内容を英語に出力する仕様に変更されています。
重要:Google Cloud 認証(google_credentials.json)
Cloud Storage MCP Server が Google Cloud Storage と連携するには、サービスアカウントを設定し、その JSON キーを用意する必要があります。
- サービスアカウントの作成: Google Cloud Platform(GCP)プロジェクトで、新しいサービスアカウントを作成します。
- 権限の付与: 対象の GCS バケットからの読み取りと書き込みを許可するために、必要なロール/権限をこのサービスアカウントに割り当てます(たとえば「Storage Object Admin」、または特定のバケットに対する「Storage Object Creator」と「Storage Object Viewer」のような、より限定的な権限)。
- JSON キーの生成: このサービスアカウントの JSON キーを作成し、ダウンロードします。
- キーの配置と名前の変更: ダウンロードした JSON キーファイルをこのプロジェクトのルートディレクトリに配置し、名前を
google_credentials.jsonに変更します。
⚠️ セキュリティに関する注意: この google_credentials.json ファイルには機密性の高い認証情報が含まれています。バージョン管理システムに絶対にコミットしないでください(まだ追加されていない場合は、.gitignore ファイルに追加してください)。docker-compose.yml ファイルでは、このファイルをプロジェクトのルートから cloud-storage-mcp サービスにマウントするよう設定されています。
システムアーキテクチャ
機能
- 記事の草稿作成: 指定されたトピックとスタイルに基づいて記事の草稿を生成し、Google Cloud Storage に保存して、公開 URL を提供します。
- ウェブ調査: トピックに関する模擬的なウェブ調査を行い、調査結果を要約したリストを返します。
- Supervisor LLM による入力検証: ユーザーの入力はエージェントに割り当てられる前に LLM によって前処理され、安全性が検証され、英語に翻訳されます。
- エージェント間(A2A)通信: エージェントがタスクを割り当て、ステータスの更新を送信し、結果を返すための独自プロトコルです。
- Model Context Protocol(MCP)に着想を得たツール機能: 専門サーバーが、MCP に似たリクエスト/レスポンス方式を通じて、LLM による生成、Cloud Storage、Web Search などのツールを公開します。
- 非同期タスク処理: タスクは非同期で処理され、UI はステータスの更新をポーリングします。
- マイクロサービスアーキテクチャ: 各コンポーネントは Docker を使用してコンテナ化され、Docker Compose でオーケストレーションされます。
LLM モデルの使用
このプロジェクトでは、さまざまな機能に複数の Anthropic Claude モデルを活用しています。
-
スーパーバイザー LLM(入力の検証と処理):
- モデル:
claude-3-7-sonnet-20250219 - コンポーネント: Streamlit UI(
ui/streamlit/app.py)から直接呼び出されます。 - 目的: タスクを割り当てる前に、ユーザー入力(トピック、スタイル)を検証、サニタイズ、有害なコンテンツの確認、言語の特定、英語への翻訳を行います。
- モデル:
-
記事ドラフトエージェント(中核となるエージェントのロジック):
- モデル:
claude-3-haiku-20240307 - コンポーネント:
agents/article_draft/main.py - 目的: Langchain エージェントの意思決定プロセス(使用するツールの決定、操作の順序、ツールの出力に基づく最終回答の作成など)を担います。
- モデル:
-
リサーチャーエージェント(中核となるエージェントのロジック):
- モデル:
claude-3-haiku-20240307 - コンポーネント:
agents/researcher/main.py - 目的: リサーチタスクにおける Langchain エージェントの意思決定と、
search_webツールで得られた調査結果の要約を担います。
- モデル:
-
クリエイティブ LLM MCP サーバー(テキスト生成ツール):
- モデル:
claude-3-5-sonnet-20241022 - コンポーネント:
mcp_servers/creative_llm/main.py - 目的:
Article Draft Agentが記事コンテンツの作成に使用するgenerate_textツールを提供します。
- モデル:
-
ウェブ検索 MCP サーバー(シミュレートされたウェブ検索ツール):
- モデル:
claude-3-haiku-20240307 - コンポーネント:
mcp_servers/web_search/main.py - 目的:
Researcher Agentがクエリに基づくシミュレートされた検索結果の生成に使用するsearch_webツールを提供します。
- モデル:
注:Task Manager Agent と Cloud Storage MCP Server は、中核となる処理で LLM を直接使用しません。
アーキテクチャ
システムは、次の主要なコンポーネントで構成されています。
- Streamlit UI(
streamlit-ui): ユーザーがタスクを送信し、結果を確認するためのウェブインターフェースです。Supervisor LLM の呼び出しも行います。 - Supervisor LLM(外部呼び出し): UI から直接呼び出され、ユーザー入力の検証、サニタイズ、翻訳を行う Anthropic Claude モデルです。
- Task Manager エージェント(
task-manager):- UI から検証済みのタスクを受け取ります。
- A2A プロトコルを使用して、適切なワーカーエージェントにタスクを割り当てます。
- タスクのステータスを追跡し、UI に更新情報を提供します。
- A2A プロトコルを介してワーカーエージェントから結果を受け取ります。
- ワーカーエージェント:
- Article Draft エージェント(
article-draft-agent): 記事コンテンツの生成(Creative LLM MCP サーバーを使用)とアップロード(Cloud Storage MCP サーバーを使用)を担当する Langchain エージェントです。 - Researcher エージェント(
researcher): 調査(Web Search MCP サーバーを使用)を担当する Langchain エージェントです。
- Article Draft エージェント(
- MCP ツールサーバー:
- Creative LLM MCP サーバー(
creative-llm-mcp): Anthropic LLM を利用するgenerate_textツールを提供します。 - Cloud Storage MCP サーバー(
cloud-storage-mcp): Google Cloud Storage 用のupload_file、download_file、delete_fileツールを提供します。 - Web Search MCP サーバー(
web-search-mcp): Anthropic LLM を使用してウェブ検索結果をシミュレートするsearch_webツールを提供します。
- Creative LLM MCP サーバー(
- 通信プロトコル:
- カスタム A2A プロトコル:
protocols/messages.pyで定義されています(例:A2AMessage、A2APayloadAssignTask)。HTTP 経由で Task Manager とワーカーエージェント間の通信に使用されます。 - MCP に着想を得たカスタムプロトコル:
protocols/messages.pyで定義されています(例:MCPToolCall、MCPToolResult)。Langchain ツールが(tools/mcp_tool_adapter.pyを介して)HTTP 経由で MCP ツールサーバーと通信するために使用されます。
- カスタム A2A プロトコル:
概要フロー(記事タスクの例):
- ユーザーが Streamlit UI から記事のトピックやスタイルを送信します。
- UI が入力の検証と処理のために Supervisor LLM を呼び出します。
- 承認された場合、UI は
task-managerエージェントにリクエストを送信します。 task-managerは「write_article_draft」タスクをarticle-draft-agentに割り当てます(A2A)。article-draft-agentはgenerate_text_toolを使用します。- ツールは
creative-llm-mcpサーバー(MCP)を呼び出し、記事コンテンツを生成します。
- ツールは
- 続いて、
article-draft-agentはupload_file_toolを使用します。- ツールは
cloud-storage-mcpサーバー(MCP)を呼び出し、コンテンツをアップロードして公開 URL を取得します。
- ツールは
article-draft-agentは公開 URL をtask-managerに返します(A2A)。- UI は
task-managerにステータスをポーリングし、URL を取得してコンテンツを読み込み、表示します。
使用されている主要なテクノロジー
- Python 3.9
- フレームワークとライブラリ:
- FastAPI:エージェントと MCP サーバーの API の構築に使用します。
- Uvicorn:FastAPI 用の ASGI サーバーです。
- Langchain と Langchain-Anthropic:LLM を利用するエージェントとツールの構築に使用します。
- Anthropic Python SDK:Supervisor LLM と LLM ツールに使用します。
- Pydantic:プロトコルのデータ検証と設定管理に使用します。
- Streamlit:ユーザーインターフェースに使用します。
- Requests:HTTP 通信に使用します。
- Google Cloud Storage SDK(
google-cloud-storage):ファイルストレージに使用します。
- コンテナ化:
- Docker
- Docker Compose
- クラウドサービス:
- Anthropic API(Claude モデル)
- Google Cloud Storage
プロジェクト構成
├── agents/
│ ├── article_draft/
│ │ ├── Dockerfile
│ │ └── main.py
│ ├── researcher/
│ │ ├── Dockerfile
│ │ └── main.py
│ └── task_manager/
│ ├── Dockerfile
│ └── main.py
├── mcp_servers/
│ ├── cloud_storage/
│ │ ├── Dockerfile
│ │ └── main.py
│ ├── creative_llm/
│ │ ├── Dockerfile
│ │ ├── main.py
│ └── web_search/
│ ├── Dockerfile
│ └── main.py
├── protocols/
│ └── messages.py # Pydantic models for A2A and MCP communication
├── tools/
│ ├── generate_text_tool.py
│ ├── mcp_tool_adapter.py # Client for calling MCP tool servers
│ ├── research_tool.py
│ └── upload_file_tool.py
├── ui/
│ └── streamlit/
│ ├── Dockerfile
│ ├── app.py
│ └── requirements.txt
├── .env # For API keys and environment variables (create this)
├── config.py # Internal service URLs
├── docker-compose.yml # Docker Compose orchestration
└── google_credentials.json # Google Cloud service account key (create this)
前提条件
- Docker と Docker Compose がインストールされていること。
- Anthropic API キーがあること。
- 以下を備えた Google Cloud プロジェクトがあること:
- Google Cloud Storage API が有効になっていること。
- GCS バケットが作成されていること。
- GCS バケットへの書き込み権限を持つサービスアカウントキー(
google_credentials.json)があること。
プロジェクトのセットアップと実行
-
リポジトリのクローン(例):
git clone https://github.com/ogulcanakca/article-assistant cd article-assistant -
.envファイルの作成: プロジェクトのルートに.envファイルを作成し、認証情報と設定を追加します。ANTHROPIC_API_KEY="sk-ant-..." GOOGLE_API_KEY="AIzaSy..." # 他のGoogleサービスで必要な場合。サービスアカウントを使用してGCSのみを利用する場合は省略できます GOOGLE_CLOUD_PROJECT="your-gcp-project-id" CLOUD_STORAGE_BUCKET_NAME="your-gcs-bucket-name" # article_draft_agentで使用CLOUD_STORAGE_BUCKET_NAMEは、記事の保存先となるGCSバケットの名前です。
-
Google Cloud 認証情報の追加: ダウンロードした Google Cloud サービスアカウントのキー ファイルをプロジェクトのルートに置き、
google_credentials.jsonという名前を付けます。このファイルはdocker-compose.ymlによってcloud-storage-mcpサービスにマウントされます。 -
各サービスの
requirements.txtの作成: 各サービスのディレクトリ(agents/*、mcp_servers/*、ui/streamlit)に、それぞれの Python 依存関係を記載したrequirements.txtファイルがあることを確認します。例:agents/article_draft/requirements.txt:fastapi uvicorn langchain langchain-anthropic requests # pydanticは通常、FastAPI/Langchainの推移的依存関係ですmcp_servers/cloud_storage/requirements.txt:fastapi uvicorn google-cloud-storage requestsui/streamlit/requirements.txt:streamlit requests anthropic
(各
main.pyファイルで実際にインポートされている内容に応じて、これらのリストを調整してください。) -
Docker Compose でのビルドと実行: プロジェクトのルートディレクトリから、次を実行します。
docker-compose up --build -
UI へのアクセス: サービスが起動したら、Web ブラウザーを開いて次の URL にアクセスします。
http://localhost:8501 -
サービスの停止:
docker-compose down
注意事項
web-search-mcpサーバーは現在、LLM を使ってWeb検索結果をシミュレートしています。実際のライブ検索は実行しません。- 必要な環境変数(特に API キーと GCS バケット名)が
.envファイルに正しく設定され、docker-compose.ymlで各サービスに渡されていることを確認してください。 .env内のGOOGLE_API_KEYは、他の Google サービスを API キーで直接使用する場合に備えて記載しています。Google Cloud Storage では、cloud-storage-mcpサービスの主な認証方法としてgoogle_credentials.jsonのサービスアカウントが使用されます。
タスク 1 とタスク 2 の例

コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。