MCP和A2A协议的最小化实践

本章我们将通过MCP和A2A协议的最小化调用流程,来说下MCP协议和A2A协议的使用方式。

不过在此之前,我们先说下,在没有MCP和A2A之前,我们如何使用大模型

首先是RAG工程,虽然大模型具有大量的知识,且推理能力非常之强,但是在现实世界之中,数据仍然在不断地更新,而且很多数据也只存在于企业内部。这时候就需要使用RAG作为检索增强生成上场的时刻。

RAG支持将LLM和外部数据源相结合,利用向量的相似程度,来检索数据,识别用户查询相关信息,从而加入到上下文中,并根据上下文信息进行响应。

其增强了LLM对于知识的使用能力,但是其没有增强大模型的行动能力,也就是大模型只能进行简单的问答,没有办法帮助用户进行操作,也就是进行实际的方案执行。

因此Agent模型应运而生,利用COT思考链或者诸如Function Calling的方式将LLM和工具集成进来。

其让大模型支持使用工具,并采用如下的链路进行工具使用

1.理解需求,规划方案 –> 2.依次调用工具 –> 3.获取工具结果 –> 4.反复思考,反复执行2和3步骤 –> 5.呈现结果。

利用诸如Function Calling或者Anthropic的Tool Use,实现了大模型调用工具的方案。

现在,业界由上面的两个协议发展出了MCP协议。

其支持AI去连接不同工具,提供了一个标准的诸如Type-C的接口,不同工具以相同方式和LLM进行集成。

现在Agent可以一方面使用RAG,且RAG支持使用SessionMessage协议和工具发现机制,让其无缝接入多源数据检索。且提供了标准化的工具调用接口和结果回传格式,在Agent中还可以支持接入多种工具。

这里我们以Cursor+DuckDB为例,说下如何使用MCP

Cursor是一个标准的MCP Client,其驱动Claude或者其他模型进行模型交互。

而DuckDB是一个线上的数据库,其暴露了相关MCP交互的JSON,并准备了一个online的MCP Server。方便我们以最简化的方式演示MCP Server

这里我们直接进行演示,首先我们在知道了DuckDB是做什么的,之后就可以进入Github中查看https://github.com/motherduckdb/mcp-server-motherduck,其提供了MCP配置说明。

{

“mcpServers”: {

“mcp-server-motherduck”: {

“command”: “uvx”,

“args”: [

“mcp-server-motherduck”,

“–db-path”,

“md:”,

“–motherduck-token”,

“<YOUR_READ_SCALING_TOKEN_HERE>”,

“–saas-mode”

]

}

}

}

在获取到这个JSON样本之后,就可以在Cursor的客户端,通过选择MCP进行配置

复制并配置到mcp.json文件中

{

“mcpServers”: {

“mcp-server-motherduck”: {

“command”: “uvx”,

“args”: [

“mcp-server-motherduck”,

“–db-path”,

“md:”,

“–motherduck-token”,

“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRvaHVhbmdqaWFAZ21haWwuY29tIiwic2Vzc2lvbiI6InRvaHVhbmdqaWEuZ21haWwuY29tIiwicGF0IjoiLUFvRmlRcE9xREZNb05sVFdwZzJha28yMDNnc0tkM3VyMXhBeHRKS3phZyIsInVzZXJJZCI6ImU0ZmUwZTYxLTgxMDEtNDdlZC05OGNhLTJmNGQ2MjZkYTUxYyIsImlzcyI6Im1kX3BhdCIsInJlYWRPbmx5IjpmYWxzZSwidG9rZW5UeXBlIjoicmVhZF93cml0ZSIsImlhdCI6MTc0Nzc0MTUxOX0.kmAvQ2AllpYo9UdotsqaysLHfe_yU51EeOpXYd85bkc”

]

}

}

}

之后,将数据提前上传到云端,就可以通过Cursor进行使用了

在对话页面之中 通过输入文本进行对话

调用mother dock来进行数据分析,查找年度的图书销量

这就是一个简单的MCP协议的使用和测试。

那么进入到第二part

这一部分,我们会说如何让不同供应商和不同框架下的Agent彼此进行通信协作。这一全新协议就是Google的Agent-to-Agent协议。

Agent2Agent是为了让不同平台,不同厂商,不同操作层上的Agent可以动态发现,调用并协同完成复杂任务。

在A2A协议内部,存在着五大核心设计原则,

分别是拥抱Agent能力,

允许Agent互成黑盒,无需向着对方暴露隐私

基于现有的标准,

基于现在的HTTP,SSE,JSON-RPC 技术上哦古剑

企业级安全,

内置授权机制

多模态无差别,

支持文本,音频,视频等交互形式

长任务支持,

支持长时间的长任务需求,可以实时反馈状态。

在此过程中,A2A定义多个不同的角色

  1. 用户 最终用户,来使用Agent完成任务
  2. 客户端 代表用户向着远程Agent发送请求
  3. 远程Agent,作为A2A服务器的黑盒Agent

在这一点,MCP和A2A协议有一定的不同,即远程也是一个具有一定决策功能的Agent

而且远程接收方,可能不支持是一个单一Agent,而是一个智能体组。这个智能体组可以基于LangGraph框架实现,诸如AutoGen或者CrewAI框架实现。

那么我们看下A2A协议内部交互时的核心对象

主要由Agent Card、 Task、 Artifact、 Message四部分构成

对于Agent Card,这是Agent 的名片

每一个支持A2A的远程Agent需要发布一个JSON格式的Agent Card,描述这个Agent的能力和认证机制,Client可以通过这些信息选择最合适的Agent完成任务。

{

“name”: “Google Maps Agent”,

“description”: “Plan routes, remember places, and generate directions”,

“url”: “https://maps-agent.google.com”,

“provider”: {

“organization”: “Google”,

“url”: “https://google.com”

},

“version”: “1.0.0”,

“authentication”: {

“schemes”: “OAuth2”

},

“defaultInputModes”: [“text/plain”],

“defaultOutputModes”: [“text/plain”, “application/html”],

“capabilities”: {

“streaming”: true,

“pushNotifications”: false

},

“skills”: [

{

“id”: “route-planner”,

“name”: “Route planning”,

“description”: “Helps plan routing between two locations”,

“tags”: [“maps”, “routing”, “navigation”],

“examples”: [

“plan my route from Sunnyvale to Mountain View”,

“what’s the commute time from Sunnyvale to San Francisco at 9AM”

],

“outputModes”: [“application/html”, “video/mp4”]

}

]

}

上面就是谷歌地图的Agent的Card

其次是Task

代表着一个任务,内部包含着状态,历史记录和结果。

对于状态,包含 submitted,working,input-required, completed,canceled, failed,unknown

Artifact

是指的远程的Agent返回的结果,可以包含多个部分,比如文本,图像

Message

用于Client和Remote Agent

包含指令,状态更新等内容,也可以包含多个parts,传递不同的类型内容。

具体的流程为

  1. 能力发现,每个Agent通过Agent Card,在Server上注册自己
  2. 任务管理,客户端通过task,驱动Agent,完成一个task
  3. 消息协作,双方互发消息,携带上下文,用户指令和中间产物,也就是传递多个parts
  4. 状态同步,同步双方状态,确保用户查看最新状态

这里以一个查找候选人的场景为例

  1. 首先用户在界面下向自己的Agent发起查找候选人的请求
  2. 然后Client端的Agent根据Card获取到诸如简历搜索Agent,技能筛选Agent等多个Agent
  3. 处理完成返回名单交由Client Agent汇总展示

就目前来说,A2A作为Google推出的当家花旦,也是在和多个不同公司一同,共建A2A生态,未来预计将在开源社区中逐步完善落地。

总结一下,我们简单说了下A2A和MCP的内部详情和基本使用。

通过这种架构,最终实现了相互协同。实现了Agent和工具的交互,Agent和Agent 的交互。