Agent2Agent 与 MCP 的实战组合
介绍如何结合 A2A 和 MCP 实现多智能体协作。这是构建复杂智能体系统时的关键技术。
介绍如何结合 A2A 和 MCP 实现多智能体协作。这是构建复杂智能体系统时的关键技术。
继续 A2A 和 MCP 系列的博客,本文聚焦于它们的结合实现。我们之前已经探讨了 A2A 和 MCP 的介绍及各自的独立实现。现在,我们将它们整合到一个统一的完整设置中。
Model Context Protocol(MCP)是一套规则集合,定义了 MCP 客户端与 MCP 服务器之间的通信应该如何被管理,以便有效利用第三方服务。
Agent-to-Agent Protocol(A2A)是一种开放协议,允许 agent 跨越不同的生态系统、框架或组织进行互操作。它支持一个动态的多 agent 环境,其中 agent 可以互相通信、发现彼此,并自主协作。
我已经为 AI 社区开发了一个 A2A 注册表,欢迎查看并在你的网络中分享。
你可能在各种博客中看到过 A2A 和 MCP 的独立实现,但很少有资源涵盖它们的结合使用。本博客旨在弥补这一空白,并引导你通过实践集成这两种协议。
在深入实际实现之前,重要的是理解 A2A 和 MCP 在结合设置中如何协同工作的基本流程。
在这个设置中,我们从一个主机 agent 开始,这是一个部署在我们自有基础设施内的 agent。这个 agent 配置为与其自己的 MCP 服务器通信,使其能够访问所需的第三方服务。
另一方面,我们有部署在外部基础设施上的远程 agent。这些 agent 可以通过 A2A 协议被发现,通常通过 /.well-known/agent.json 端点。主机 agent 使用这个 URL 来查找和与远程 agent 建立通信。
就像主机 agent 一样,远程 agent 也根据它们的特定需求配置了自己的 MCP 服务器。这个设置允许不同环境中的 agent 彼此发现和通信,同时仍然利用各自的 MCP 服务器与服务交互。
这个实现的目标是构建一个系统,能够通过动态检索来响应关于公司的自然语言查询:
与其硬编码 API 调用不同,我们将利用 A2A 和 MCP 协议来使 AI agent 能够按需发出这些请求。
例如,当被问到:
"告诉我关于苹果公司的股票和公司在做什么"
系统将:
接下来,我们将介绍使这个系统生效所需的组件。
为了访问实时信息,该项目定义了两个 MCP 服务器,它们包装公开 API。这些服务器充当 agent 与外部服务之间的桥梁,将 agent 请求转换为 API 调用,并以结构化格式返回数据。
每个 MCP 服务器与特定的外部数据提供商交互。通过遵守 MCP 标准,这些服务器允许任何 agent 使用它们,而无需直接处理低级 API 集成。在这个系统中,我们定义两个 MCP 服务器,一个用于网络搜索,另一个用于财务数据。一旦配置,这些服务器独立运行并处理 agent 请求。
路径:mcp_server/sse/search_server.py
路径:mcp_server/stdio/search_server.py
Agent 的设计具有明确的专业化分工。一个中央规划 agent 处理传入的用户查询,识别需要什么子信息,然后将任务委托给其他 agent。例如,一个 agent 可能执行网络搜索,而另一个专注于财务分析。这些 agent 与各自的 MCP 服务器通信以获取数据。
主机 Agent
搜索报告 Agent
股票报告 Agent
随着架构和组件的就位,让我们深入实际实现。
在我们开始编码之前,请确保满足以下先决条件。
如果你使用的是 Gemini API 的免费层,你需要更新整个项目中的模型名称。将 gemini-2.5-pro-exp-03-25 替换为可用的免费层模型,如 gemini-2.0-flash。
相应地更新以下文件:
注意:在这个特定的实现中,我们不会使用 Google 搜索 agent。但是,如果你计划包含它,你需要一个 Serper API 密钥,可以从 serper.dev 获取。
要开始实现,请按照以下步骤操作:
git clone https://github.com/Tsadoq/a2a-mcp-tutorial.git
在项目的根文件夹中,创建一个 .env 文件并添加以下环境变量:
FINNHUB_API_KEY=<your_api_key>
GOOGLE_API_KEY=<your_api_key>
SERPER_DEV_API_KEY=<your_api_key> # Required only if you plan to use the Google Search agent
使用以下命令运行股票 MCP 服务器:
uv run mcp_server/sse/stocks_server.py
这个服务器提供两个工具:
这个 MCP 服务器主要由股票报告 Agent 使用来收集财务数据。
uv run a2a_servers/agent_servers/stock_report_agent_server.py
这个 agent 将在 http://0.0.0.0:10000 上可用,并通过 /.well-known/agent.json 端点暴露其功能。其配置如下所示:
{
"name": "stock_report_agent",
"description": "An agent that provides US stock prices and info.",
"url": "http://0.0.0.0:10000",
"version": "1.0.0",
"capabilities": {
"streaming": false,
"pushNotifications": false,
"stateTransitionHistory": true
},
"defaultInputModes": [
"text"
],
"defaultOutputModes": [
"text"
],
"skills": [
{
"id": "SKILL_STOCK_REPORT",
"name": "stock_report",
"description": "Provides stock prices and info."
}
]
}
这个 agent 通过 return_sse_mcp_tools_stocks 函数获得对股票 MCP 服务器中定义的工具的访问权限。这个函数连接到 MCP 服务器(在端口 8181 上运行,如之前启动的那样)来检索可用的工具。
即使我们在这个实现中没有积极使用 Google 搜索 Agent,它仍然需要运行。主机 Agent 要求所有配置的 agent 在其初始化之前都是活跃的。
运行以下命令:
uv run mcp_server/sse/stocks_server.py
uv run a2a_servers/agent_servers/google_search_agent_server.py
uv run a2a_servers/agent_servers/host_agent_server.py
这是中央协调 agent。它接收用户查询,将其分解为子任务,并将这些任务委托给相关的 agent(例如,股票报告 Agent 和 Google 搜索 Agent)。
要向系统发送查询,请启动本地 A2A 客户端:
uv run a2a_servers/host_agent_server.py
这个脚本充当 A2A 客户端,向主机 Agent 发送用户查询,我们在之前的步骤中初始化了它。
完整过程可以可视化如下:
User (Query)
↓
run_from_local_client.py (A2A Client)
↓
Host Agent (plans the task)
├──> Stock Report Agent → MCP Stock Server → FinnHub API
└──> Google Search Agent → MCP Search Server → Serper.dev
↓
Host Agent compiles and sends final report
主机 Agent 部署在我们的基础设施上,通过 A2A 客户端本地访问。
股票报告 Agent 和 Google 搜索 Agent 在概念上被视为远程 agent。理想情况下,它们会部署在各自的远程域上,并通过 /.well-known/agent.json 端点访问。
但是,对于这个本地实现,我们通过在同一台机器(localhost)的不同端口上部署所有 agent 来模拟这个环境。
现在一切都已启动并运行,让我们使用本地客户端尝试几个查询。
Enter your query: what agents do you have access to ?
Answer:
I have access to the following agents:
- google_search_agent: An agent that handles search queries and can read pages online.
- stock_report_agent: An agent that provides US stock prices and info.
在这种情况下,主机 Agent 直接使用其发现能力来响应。没有任务被发送给远程 agent。
注意:A2A 客户端一次只能处理一个请求,所以你需要为每个查询手动重新运行它。
Enter your query: which symbol is used to retrieve stock details of Apple company ?
Answer:
AAPL is the symbol used to retrieve stock details of Apple Inc. I used the stock_report_agent to get this information.
Enter your query: What is the current stock value of APPL ?
Answer:
The current stock price of AAPL is 195.27, with a change of -6.09 and a percentage change of -3.0244. The day's high was 197.7, and the day's low was 193.46. The day's open price was 193.665, and the previous close price was 201.36.
这个结果与实时数据相匹配,如下所示:
你可以在运行股票 MCP 服务器和股票报告 Agent 的终端窗口中观察请求和响应日志。
你也可以通过启用 Google 搜索 Agent 来尝试结合查询。这允许主机 Agent 将任务委托给多个 agent 并聚合更丰富的、上下文相关的响应。
这个演示说明了 AI agent 如何可以通过使用 A2A 和 MCP 协议进行实时数据检索而得到增强。通过模块化职责并允许 agent 独立查询相关数据,我们创建了一个可扩展、可互操作的系统。
结合 A2A(Agent-to-Agent)和 MCP(Model Context Protocol)为 agent 协作、委托任务和动态获取实时数据提供了一种强大的方式。这个架构不仅简化了连接到第三方服务的过程,还构建了一个灵活且可扩展的系统,其中 agent 可以在不同的领域中推理、规划和行动。
这个博客演示了如何从头开始设置这样一个系统,并展示了实时功能的实际应用。从股票价格查询到规划多 agent 工作流,这是一个坚实的基础,可以在其上构建和扩展。
如果你发现这很有帮助,别忘了分享并关注更多 agent 驱动的见解。有想法或工作流在心中?加入下方评论中的讨论,或在 Twitter 或 LinkedIn 上联系。
源代码致谢:Matteo Villosio
图表致谢:Git Diagram