关于 Multi-Agent Task Assistant with A2A & MCP-inspired Architecture
这个 Python 多 Agent 任务助手通过 Streamlit 界面处理文章撰写和网络研究。它结合自定义 A2A 协调机制,以及用于文本生成、模拟搜索和 Google Cloud Storage 的 MCP 式工具服务。
主要功能
- 01将工作分派给专用 Agent
- 02撰写文章并存入 Google Cloud Storage
- 03返回模拟网络研究的摘要
- 04验证并翻译提交的任务
- 05异步处理任务并更新状态
- 06通过自定义 A2A 协议协调 Agent
适用场景
- 01撰写文章并保存到云存储
- 02研究主题并汇总生成的发现
- 03将验证后的用户任务分配给工作 Agent
- 04在界面中跟踪异步任务进度
MCP 相关
通过 MCP 式 HTTP 请求与响应模式使用工具服务,提供文本生成、模拟网络搜索和 Google Cloud Storage 操作。README 将其描述为 MCP 式工具,而非标准 MCP 实现。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
基于 A2A 和 MCP 的多 Agent 任务助手
本项目展示了一个多 Agent 系统,旨在处理文章起草和网络研究等任务。它采用自定义的 Agent-to-Agent(A2A)通信协议来协调各 Agent,并采用受模型上下文协议(MCP)启发的架构来与外部工具服务交互。系统使用 Python、Langchain、Anthropic 大模型、FastAPI 和 Docker 构建。
概览
任务助手允许用户请求起草特定主题的文章或开展网络研究。用户输入首先由“Supervisor LLM”验证和处理。验证通过的任务随后由 Task Manager Agent 管理,它会将子任务分配给专门的 Agent:Article Draft Agent 和 Researcher Agent。这些 Agent 通过专用的“MCP 工具服务”使用外部能力(如大模型文本生成、网络搜索和云存储)。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 输入验证: 在将用户输入分配给 Agent 之前,由大模型对其进行预处理、安全性验证,并翻译成英语。
- Agent-to-Agent(A2A)通信: 自定义协议,供 Agent 分配任务、发送状态更新和返回结果。
- 受模型上下文协议(MCP)启发的工具机制: 专门的服务通过类似 MCP 的请求/响应模式提供工具(大模型生成、Cloud Storage、Web Search)。
- 异步任务处理: 任务以异步方式处理,界面会轮询状态更新。
- 微服务架构: 使用 Docker 将组件容器化,并通过 Docker Compose 进行编排。
LLM 模型用法
本项目使用多个 Anthropic Claude 模型来实现不同功能:
-
监督 LLM(输入验证与处理):
- 模型:
claude-3-7-sonnet-20250219 - 组件: 由 Streamlit UI(
ui/streamlit/app.py)直接调用。 - 用途: 在分配任务前验证、清理用户输入(主题、风格)、检查其中是否包含有害内容、识别语言并将其翻译成英语。
- 模型:
-
文章起草 Agent(核心 Agent 逻辑):
- 模型:
claude-3-haiku-20240307 - 组件:
agents/article_draft/main.py - 用途: 驱动 Langchain Agent 的决策过程(例如,确定要使用哪个工具、如何安排操作顺序,以及根据工具输出撰写最终回复)。
- 模型:
-
研究 Agent(核心 Agent 逻辑):
- 模型:
claude-3-haiku-20240307 - 组件:
agents/researcher/main.py - 用途: 驱动 Langchain Agent 执行研究任务,并总结
search_web工具的搜索结果。
- 模型:
-
创意 LLM MCP 服务(文本生成工具):
- 模型:
claude-3-5-sonnet-20241022 - 组件:
mcp_servers/creative_llm/main.py - 用途: 提供
generate_text工具,供文章起草 Agent用于生成文章内容。
- 模型:
-
网页搜索 MCP 服务(模拟网页搜索工具):
- 模型:
claude-3-haiku-20240307 - 组件:
mcp_servers/web_search/main.py - 用途: 提供
search_web工具,供研究 Agent根据查询生成模拟搜索结果。
- 模型:
注意:任务管理 Agent 和 云存储 MCP 服务 的核心操作不会直接使用 LLM。
架构
系统由以下关键组件组成:
- Streamlit UI(
streamlit-ui): 用户提交任务和查看结果的 Web 界面。它还会调用 Supervisor 大模型。 - Supervisor 大模型(外部调用): 由 UI 直接调用的 Anthropic Claude 模型,用于验证、清理和翻译用户输入。
- 任务管理器 Agent(
task-manager):- 接收 UI 传来的已验证任务。
- 使用 A2A 协议将任务分配给相应的工作 Agent。
- 跟踪任务状态并向 UI 提供更新。
- 通过 A2A 协议接收工作 Agent 返回的结果。
- 工作 Agent:
- 文章草稿 Agent(
article-draft-agent): 一个 Langchain Agent,负责生成文章内容(使用 Creative LLM MCP 服务),并上传内容(使用 Cloud Storage MCP 服务)。 - 研究员 Agent(
researcher): 一个 Langchain Agent,负责开展研究(使用 Web Search MCP 服务)。
- 文章草稿 Agent(
- MCP 工具服务:
- Creative LLM MCP 服务(
creative-llm-mcp): 提供由 Anthropic 大模型驱动的generate_text工具。 - Cloud Storage MCP 服务(
cloud-storage-mcp): 为 Google Cloud Storage 提供upload_file、download_file和delete_file工具。 - Web Search MCP 服务(
web-search-mcp): 提供search_web工具,使用 Anthropic 大模型模拟网络搜索结果。
- Creative LLM MCP 服务(
- 通信协议:
- 自定义 A2A 协议: 定义于
protocols/messages.py(例如A2AMessage、A2APayloadAssignTask),用于任务管理器与工作 Agent 之间通过 HTTP 通信。 - 受 MCP 启发的自定义协议: 定义于
protocols/messages.py(例如MCPToolCall、MCPToolResult),由 Langchain 工具通过tools/mcp_tool_adapter.py使用,以通过 HTTP 与 MCP 工具服务通信。
- 自定义 A2A 协议: 定义于
高级流程(文章任务示例):
- 用户通过 Streamlit UI 提交文章主题/风格。
- UI 调用 Supervisor 大模型来验证和处理输入。
- 如果获批,UI 会向
task-managerAgent 发送请求。 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:用于构建 Agent 和 MCP 服务 API。
- Uvicorn:FastAPI 的 ASGI 服务端。
- Langchain 与 Langchain-Anthropic:用于构建由大模型驱动的 Agent 和工具。
- Anthropic Python SDK:用于 Supervisor 大模型和大模型工具。
- 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..." # If needed by any other Google service, otherwise can be omitted if only GCS is used via service account GOOGLE_CLOUD_PROJECT="your-gcp-project-id" CLOUD_STORAGE_BUCKET_NAME="your-gcs-bucket-name" # Used by article_draft_agentCLOUD_STORAGE_BUCKET_NAME是用于存储文章的 GCS 存储桶名称。
-
添加 Google Cloud 凭据: 将下载的 Google Cloud 服务账号密钥文件放在项目根目录中,并命名为
google_credentials.json。docker-compose.yml会将此文件挂载到cloud-storage-mcp服务中。 -
为每个服务创建
requirements.txt: 确保每个服务目录(agents/*、mcp_servers/*、ui/streamlit)都有自己的requirements.txt文件,其中列出相应的 Python 依赖项。例如:agents/article_draft/requirements.txt:fastapi uvicorn langchain langchain-anthropic requests # pydantic is usually a transitive dependency of FastAPI/Langchainmcp_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 浏览器并访问:
http://localhost:8501 -
停止服务:
docker-compose down
注意事项
web-search-mcp服务目前使用大模型模拟网络搜索结果,不会执行实时网络搜索。- 确保在
.env文件中正确设置所有必要的环境变量(尤其是 API 密钥和 GCS 存储桶名称),并通过docker-compose.yml将其传递给相应的服务。 .env中的GOOGLE_API_KEY仅为完整起见而列出,以备其他 Google 服务直接使用 API 密钥。对于 Google Cloud Storage,cloud-storage-mcp服务主要使用google_credentials.json服务账号进行身份验证。
任务 1 和任务 2 示例

评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。