大家好,我是凡人

在近一年中AI智能体的发展就像坐着火箭,各行业的企业在实际业务应用中都在不断融入AI智能体(Agent)来提质增效。

在不久前,就连我这个身处13线小城市的打工人,也和公司建议准备搭一个本地化模型的AI数据分析的智能体,不过就在搭建过程中出现一件麻烦事儿,社区版的dify自带插件太少了,自己写插件复杂又需要调试,工期根本不够,就在我焦头烂额的时候,突然就想起了前段时间爆火的MCP和A2A服务,但一下子对它俩到底怎么用却忘了个干净。

下面咱就一起了解一下MCP和A2A,到底怎么用、用在什么地方以及他们到底有什么区别?最后我在给大家推荐几个高质量的MCP服务网站,让你的智能体如虎添翼。

图片

一、MCP

Model Context Protocol (MCP) 是一个在2024年11月由Anthropic推出的开源协议,它标准化了大型语言模型(LLM)与外部数据源和工具之间的连接方式。

MCP的出现彻底改变了AI与外部系统交互的方式,使得AI不仅能够生成文本,还能执行数据库查询、发送邮件、管理项目和自动化工作流等任务。

图片

MCP是一个开放标准,它允许开发者在他们的数据源和AI工具之间建立安全的双向连接。

它被设计为LLM与外部工具或数据源之间的通用适配器,定义了连接语言模型与外部工具和数据源的通用协议(基于JSON-RPC)。

图片

MCP的灵感来源于语言服务器协议(LSP),后者是IDE与特定语言工具通信的标准。

与LSP类似,MCP通过采用标准化接口,将模型和工具的集成复杂性从M×N减少到M+N,解决了每个新语言模型(M)都需要自定义连接器和提示以与每个企业工具(N)接口的问题。

图片

要明白MCP就得懂得这三个概念

模型控制:Tools由服务器暴露给客户端,代表LLM可以调用的动态操作。

  • Tools(工具):由服务器暴露给客户端的可执行功能,代表LLM可以调用的动态操作,可以修改状态或与外部系统交互。

应用程序控制:Resources由客户端应用程序决定如何使用。

  • Resources(资源):由服务器暴露给客户端的数据和内容,可以被读取并用作LLM交互的上下文。

用户控制:Prompts由服务器暴露给客户端,目的是供用户使用。

  • Prompts(提示):由服务器定义的预设模板和工作流,用于标准化LLM交互。

图片

MCP其实就是为AI应用专门打造的"TYPE-C接口",它标准化了应用程序向大型语言模型(LLM)提供上下文的方式。通过MCP,AI模型可以像程序员调用函数一样使用各种工具,将工具和数据源连接到AI系统中。

二、什么事A2A?

随着越来越多的企业开始使用自主智能体,让这些智能体在不同系统和平台间协作变得至关重要,但这些智能体通常是孤立运行,没有办法高效协作,形成了所谓的"智能体孤岛"问题

为了解决这一困难,谷歌于今年4月9日正式发布了 Agent2Agent (A2A) 协议,直接开源,就是为了实现不同AI智能体之间的互操作性。

A2A协议为Agent提供了一种标准的交互方式,使它们能够相互协作,无论底层框架或供应商是什么。谷歌认为,这个协议将对支持多智能体通信至关重要,因为它为智能体提供了一个共同的语言,无论它们是基于什么框架或供应商构建的。

A2A_banner.png

所以A2A就是智能体之间的沟通渠道,就好像通用语言一样让所有智能体都能听懂。

A2A协议的核心概念

A2A协议定义了一套清晰的客户端-服务器交互模型。一个"客户端"智能体(发起请求方)与一个"远程"智能体(A2A服务器,处理请求方)通过一系列任务和消息进行通信。以下是A2A协议的核心概念:

  1. Agent Card:这是一个公开的元数据文件(通常位于/.well-known/agent.json),描述智能体的能力、技能、端点URL和认证要求。客户端使用它进行发现。

  2. A2A Server:一个智能体公开的HTTP端点,实现A2A协议方法(定义在json规范中)。它接收请求并管理任务执行。

  3. A2A Client:一个消费A2A服务的应用程序或另一个智能体。它向A2A服务器的URL发送请求(如tasks/send)。

  4. Task:工作中的中心单元。客户端通过发送消息(tasks/send或tasks/sendSubscribe)来启动任务。任务具有唯一ID,并经历各种状态(已提交、处理中、需要输入、已完成、失败、已取消)。

  5. Message:表示客户端(角色:"user")和智能体(角色:"agent")之间的通信轮次。消息包含Parts。

  6. Part:Message或Artifact中的基本内容单元。它可以是TextPart、FilePart(带有内联字节或URI)或DataPart(用于结构化JSON,例如表单)。

  7. Artifact:表示智能体在任务过程中生成的输出(例如,生成的文件、最终的结构化数据)。Artifacts也包含Parts。

  8. Streaming:对于长时间运行的任务,支持streaming能力的服务器可以使用tasks/sendSubscribe。客户端接收包含TaskStatusUpdateEvent或TaskArtifactUpdateEvent消息的服务器发送事件(SSE),提供实时进度。

  9. Push Notifications:支持pushNotifications的服务器可以主动将任务更新发送到客户端提供的 webhook URL,通过tasks/pushNotification/set配置。

A2A_announce.png

A2A协议的典型工作流程包括以下步骤

  1. 发现:客户端从服务器的知名URL获取Agent Card。

  2. 初始化:客户端发送tasks/send或tasks/sendSubscribe请求,包含初始用户消息和唯一任务ID。

  3. 处理

    • 流式处理:服务器发送SSE事件(状态更新、Artifacts)随着任务的进展。

    • 非流式处理:服务器同步处理任务并在响应中返回最终Task对象。

  4. 交互(可选):如果任务进入需要输入的状态,客户端使用相同任务ID通过tasks/send或tasks/sendSubscribe发送后续消息。

  5. 完成:任务最终达到终端状态(已完成、失败、已取消)。

a2a_demo_arch.png

三、两种区别在哪?

1、区别

协议 核心关注点 交互模式 应用场景 抽象层次
MCP 模型与工具的连接 函数调用、结构化输入输出 工具集成、API调用、资源访问 低级别(具体功能)
A2A 代理与代理的协作 对话式、长时间运行的任务 多代理协作、复杂任务分解、服务发现 高级别(意图和能力)

2、两者优缺点

协议 优势 挑战
MCP 结构明确,执行可预测;与现有API框架集成简单;降低了AI与工具连接的复杂性- 性能开销相对较小。 灵活性有限,需要明确定义每个工具;不适合处理高度动态或未知的任务- 难以表达复杂的协作需求。
A2A 支持动态发现和即兴协作;适合处理开放式、复杂的任务;更接近人类团队协作的自然模式;可扩展性强,可以轻松添加新代理。 状态一致性管理复杂;安全性和访问控制挑战;推理开销较大;部分故障处理机制尚不成熟。

3、两者互补才能高效

尽管MCP和A2A关注不同的方面,但它们是互补而非竞争。在实际应用中,它们往往需要结合后使用才高效:

  1. MCP提供了代理获取工具的标准方式,使AI模型能够与外部工具和数据源交互。

  2. A2A提供了代理间协作的标准方式,使不同的AI代理能够协同工作,共同完成复杂任务。

  3. 使用MCP连接AI与各种工具和数据源。

  4. 使用A2A实现多代理间的协作和任务委派。

四、怎么搭建自己的MCP?

这里我们用Cursor来搭建自己的MCP,Cursor支持MCP协议,允许用户将Cursor连接到外部系统和数据源,从而将Cursor与现有的工具和基础设施集成,而不仅仅是处理代码的本身。

第1步:设置项目

创建一个新的项目文件夹,并在其中初始化一个新的Node.js项目:

mkdir my-mcp-servercd 
my-mcp-server
npm init -y

第2步:安装依赖

安装必要的依赖项:

npm install mcp-server

第3步:创建index.js

创建一个名为index.js的文件,并添加以下代码:


const { createServer } =require('mcp-server');
// 创建一个简单的工具
const server=createServer({
  tools: {
      hello: {
            description: "A simple tool that says hello",
            input: {
                 type: "object",
                 properties: {    
                     name: { description: "The name to say hello to" }        
                 }      
             },      
             asyncrun({ name }) {    
                 return { result: `Hello, ${name}!` };
             }    
       }  
}});

server.listen();

图片

第4步:将MCP服务器添加到Cursor

  1. 打开Cursor并在左侧边栏中点击"Settings"。

  2. 导航到"Features" > "MCP"。

图片

   3. 点击"Add new global MCP server"。

   4. 选择"Command"类型。

   5. 在"Command"字段中输入:node index.js。

   6. 保存设置。

图片

第5步:在Chat中使用MCP工具

  1. 打开Cursor的Chat界面

  2. 输入:Use hello with name="World"

  3. 你将看到工具调用的批准请求

  4. 点击"Approve",然后等待结果

图片

使用ADK连接MCP和A2A的步骤

  1. 安装ADK:需要安装Google Agent Development Kit。这是连接MCP和A2A的基础。

  2. 配置MCP服务器:配置MCP服务器,使其能够与AI模型通信。MCP服务器是应用程序和AI模型之间的桥梁,它负责处理应用程序的请求,并将其转换为AI模型可以理解的格式。

  3. 创建A2A代理:使用ADK创建A2A代理。A2A代理是负责与其他AI代理通信的组件。它使用A2A协议与其他代理交换消息。

  4. 集成MCP服务器到A2A代理:将配置好的MCP服务器集成到A2A代理中。这样,A2A代理就可以通过MCP服务器与AI模型通信。

  5. 实现通信逻辑:实现A2A代理之间的通信逻辑。这包括定义消息格式、处理消息、执行任务等。通过这些步骤,我们可以实现通过A2A协议连接两个MCP的目标。接下来,我们将提供一个简单的示例,帮助读者更好地理解这个过程。

简单示例:通过A2A连接两个MCP

我们用两个AI代理连接两个MCP,两个代理将通过A2A协议进行通信,实现一个简单的任务:代理1将从用户那里获取一个查询,然后将这个查询发送给代理2,代理2将使用其MCP连接来回答这个问题。

# 安装必要的库pip install google-agent-development-kitpip install anthropic-mcp
# 导入必要的库
from google_agent_development_kit import A2AAgent
from anthropic_mcp import MCPClient

# 创建第一个MCP客户端
mcp_client_1 = MCPClient(
    model_name="gpt-3.5-turbo",
    api_key="your_api_key_1"
)

# 创建第二个MCP客户端
mcp_client_2 = MCPClient(
    model_name="gpt-3.5-turbo",
    api_key="your_api_key_2"
)

# 定义A2A代理类
class A2AConnector(A2AAgent):
    def __init__(self, mcp_client):
        super().__init__()
        self.mcp_client = mcp_client
    async def on_message(self, message):
        # 处理接收到的消息
        if message["role"] == "user":
            # 使用MCP客户端处理用户的消息
            response = await self.mcp_client.process_message(message["content"])
            # 如果需要,将响应发送给另一个代理
            if self.id == "agent_1":
                # 发送消息给agent_2
                await self.send_message(
                    recipient_id="agent_2",
                    content=response
                )
            else:
                # 处理agent_2的响应并发送给用户
                final_response = f"Final Answer: {response}"
                await self.send_response(final_response)

# 创建两个A2A代理
agent_1 = A2AConnector(mcp_client_1)
agent_2 = A2AConnector(mcp_client_2)

# 设置代理ID
agent_1.id = "agent_1"
agent_2.id = "agent_2"

# 连接代理
agent_1.connect()
agent_2.connect()

# 模拟用户消息
user_message = "What is the capital of France?"
agent_1.receive_message(
    message={
        "role": "user",
        "content": user_message
    }
)

五、5个高质量MCP网站

1、MCPSet :https://www.mcpset.cn/,严选的高价值 MCP 收录站点。

图片

2、shareMCP :https://sharemcp.cn/,是最大的 MCP 服务器和客户端集合,提供全面的 MCP 资源和搜索功能,是发现和探索 MCP 服务的官方资源平台。

图片

3、MCP.so :https://mcp.so/,不仅是完整的 MCP Server,还可以找到好用的 MCP Client。

图片

4、Smithery :https://smithery.ai/,已收录了 2211 个 MCP Servers,还会提供安装命令和 GitHub 仓库链接。

图片

5、PulseMCP :https://www.pulsemcp.com/,收集了 1704 个 MCP Servers,还整理了 MCP Clients,也会每周更新 MCP 的相关新闻。

图片

最后为了让大家能更快的提升大家AI方面的知识,我特别为粉丝准备了免费领取价值99的,3天的体验破解卡为你开启AI的学习之旅。

图片

 


清华大学全五版的《DeepSeek教程》完整的文档需要的朋友,关注我私信:deepseek 即可获得。

怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐