🔥 个人主页:铁皮哥(欢迎关注)
📌 作者简介:28届校招生,后端开发/Agent 方向在学
📚 学习内容:Java、Python、计算机视觉、大语言模型、Agent开发
📝 专栏内容:从零开始的Claude Code零代码生活(持续更新中)
不只背八股,更想搞懂为什么这样设计


前言

提到 Agent,我们很容易想到 ReAct、Tool Calling、多轮规划 这些能力。

它看起来像是一个会思考、会行动的智能助手,能理解任务,能调用工具,也能根据结果继续推理。

但当 Agent 真正进入复杂场景后,问题就不再只是:

模型能不能想明白?

而是变成了:

想明白之后,能不能稳定地连接外部世界?

因为 Agent 不可能永远单打独斗。
它需要访问外部工具、读取数据资源,也可能需要和其他 Agent 协作完成任务。

这时候,通信协议 的价值就出现了。

这篇文章就简单聊聊三个常见概念:

协议 关注点
MCP Agent 如何连接工具和资源
A2A Agent 之间如何协作
ANP 大量 Agent 如何被发现和连接

一、为什么 Agent 需要通信协议

1.1 从单个 Agent 到复杂系统

一个最简单的 Agent,可以只连接一两个工具。

比如给它一个搜索工具,它就可以查资料;给它一个文件读取工具,它就可以总结文档;给它一个代码执行环境,它就可以帮我们验证一段程序。

在这种情况下,开发者知道 Agent 能调用哪些工具,也知道每个工具需要什么参数、会返回什么结果。整个流程虽然不一定优雅,但至少可控。

可是当 Agent 要处理的任务越来越复杂,它面对的外部环境就不再这么简单了。

比如一个“论文调研 Agent”,可能需要先联网搜索相关论文,再读取本地 PDF,接着从笔记软件里找历史记录,还可能调用代码环境复现实验结果,最后再把内容整理成一份报告。

这时候,它是在和一组工具、一批数据源、多个服务进行交互。

再往前一步,如果这个任务不是一个 Agent 独立完成,而是交给多个 Agent 分工处理,情况会更复杂。一个 Agent 负责资料检索,一个 Agent 负责代码分析,一个 Agent 负责内容总结,另一个 Agent 负责最终排版。它们之间需要传递上下文、同步任务状态、交换中间结果。

到了这个阶段,Agent 系统关注的问题就发生了变化。

最开始我们关心的是:

这个 Agent 能不能完成任务?

后来我们更关心的是:

这些 Agent 和工具能不能稳定、标准、可扩展地协作?

前者更多是模型能力问题,后者则是系统连接问题。

而通信协议要解决的,正是后面这个问题。

1.2 如果没有协议,会发生什么

可以想象一个没有统一协议的 Agent 系统。

开发者想让 Agent 访问本地文件,就写一套文件读取工具;想让它查询数据库,就再写一套数据库工具;想让它调用 GitHub,就继续封装 GitHub API;想让它访问浏览器、搜索引擎、内部系统,就不断增加新的适配逻辑。

一开始这看起来没什么问题,甚至很直接。

但随着工具越来越多,问题会迅速堆起来。

不同工具的参数格式不一样,返回结果不一样,错误信息不一样,权限控制方式也不一样。Agent 想要理解这些工具,就需要依赖开发者提前写好的描述和适配逻辑。工具一多,这些描述、参数、返回值和异常处理就会变得越来越难维护。

更麻烦的是,不同平台之间还可能互不兼容。

在一个框架里写好的工具,换到另一个 Agent 平台里可能不能直接用;一个服务已经封装过一次,接入另一个客户端时又要重新封装;一个 Agent 想把任务交给另一个 Agent,也需要重新约定消息格式和交互流程。

最后,系统会慢慢变成一堆胶水代码

表面上看,Agent 的能力越来越多;但实际上,每增加一个能力,系统复杂度也在增加。开发者要花大量精力处理工具适配、格式转换、错误兜底和上下文传递,而不是专注于任务本身。

这也是为什么 Agent 系统发展到一定阶段后,通信协议会变得重要。

协议的作用,就是把原本分散、临时、各写各的交互方式,变成一套更统一的规则。

它让 Agent 不必关心每个工具背后的具体实现,只需要知道这个工具暴露了什么能力、需要什么参数、会返回什么结果。它也让不同 Agent 之间可以按照统一格式传递任务和结果,而不是每次协作都重新设计一套消息结构。

当系统还很小时,协议看起来可能有点“多余”;但当工具、资源、Agent 数量不断增加时,没有协议才是真正难以维护的地方。

1.3 Agent 通信协议到底“协议”在哪

所谓通信协议,并不是一个很玄的概念。

它本质上是在约定:两个系统之间应该如何理解彼此。

就像 HTTP 约定了浏览器和服务器之间如何发送请求、返回响应;数据库协议约定了客户端如何连接数据库、提交查询、接收结果;RPC 框架约定了服务之间如何调用方法、传递参数、处理异常。

Agent 通信协议也是类似的思路。

只不过在 Agent 场景下,通信对象变得更加丰富。它可能是 Agent 和工具之间的通信,也可能是 Agent 和数据资源之间的通信,还可能是 Agent 和 Agent 之间的通信。

因此,一个 Agent 通信协议通常需要回答几个问题。

首先是:对方是谁?

Agent 需要知道自己正在连接的是一个工具、一个资源服务,还是另一个 Agent。不同对象的交互方式不同,能提供的能力也不同。

其次是:对方能做什么?

一个工具可能能读取文件,一个服务可能能查询数据库,一个 Agent 可能擅长代码分析或资料总结。协议需要提供一种能力描述方式,让 Agent 能够理解对方暴露了哪些能力。

然后是:应该如何发起请求?

当 Agent 决定调用某个能力时,需要知道请求格式是什么,参数应该怎么传,哪些字段是必需的,哪些字段是可选的。

接下来是:结果如何返回?

调用完成后,对方需要用一种稳定的格式返回结果。成功时返回什么,失败时返回什么,任务进行中又该如何表示,这些都需要约定。

最后还有一个很现实的问题:权限和安全如何处理?

Agent 能连接外部工具,就意味着它可能访问文件、数据库、网页、代码仓库,甚至业务系统。如果没有权限边界,Agent 的能力越强,风险也越大。所以通信协议不仅要考虑“怎么连上”,还要考虑“哪些能力可以被谁调用”。

它的目标也不是让所有 Agent 都变成同一种形态,而是让不同工具、不同服务、不同 Agent 之间,有机会用一种更标准的方式互相理解。

二、MCP、A2A、ANP 分别在解决什么问题

2.1 MCP:让 Agent 更方便地连接工具和资源

MCP,全称是 Model Context Protocol

它强调的是 Model 和 Context 之间的连接。这里的 Context 不只是聊天上下文,也可以理解为模型执行任务时需要接触到的外部信息、工具和资源。

一个 Agent 想要真正完成任务,往往不能只依赖模型内部知识。它可能需要读取本地文件,查询数据库,访问 GitHub 仓库,调用搜索工具,甚至连接公司内部系统。

MCP 的思路,就是把这些外部能力通过统一的协议暴露出来。

它可以把文件系统、数据库、搜索服务、代码仓库等能力封装成一个个 MCP Server。Agent 所在的客户端不需要关心这些能力背后的具体实现,只需要通过 MCP 协议去发现能力、理解参数、发起调用、接收结果。

一个典型的 MCP 结构里,可以理解为三个角色:

角色 可以怎么理解
MCP Host 运行 Agent 的宿主应用,比如桌面客户端、IDE、Agent 平台
MCP Client Host 内部负责和 MCP Server 通信的组件
MCP Server 暴露工具、资源和能力的一端,比如文件系统、数据库、GitHub 服务

举个例子,一个写作 Agent 想完成一篇技术文章。

它可能需要先读取本地资料,再查找项目代码,接着搜索相关文档,最后整理成文章。如果这些能力都通过 MCP Server 暴露出来,那么 Agent 就可以用相对统一的方式调用它们,而不需要为每个工具写一套完全不同的适配逻辑。

这也是 MCP 最核心的价值:让 Agent 连接外部工具和上下文资源这件事变得标准化。

在这里插入图片描述

2.2 A2A:让 Agent 和 Agent 之间可以协作

A2A 要解决的问题是:当一个任务不是由单个 Agent 独立完成,而是需要多个 Agent 分工协作时,这些 Agent 之间应该如何通信?

很多复杂任务天然就适合拆分。

比如我们想分析一个开源项目。一个 Agent 可以负责阅读 README 和官方文档,一个 Agent 可以负责分析代码目录结构,一个 Agent 可以负责查看 issue 和 PR,另一个 Agent 可以负责把前面几个 Agent 的结果整理成最终报告。

如果没有统一的通信方式,多 Agent 协作很容易变成一堆临时约定的消息格式。

今天这个 Agent 返回一个 JSON,明天另一个 Agent 返回一段自然语言,后天又有一个 Agent 通过某个自定义字段表示任务状态。系统越复杂,协作成本越高。

A2A 的意义,就在于为 Agent 之间的协作提供一套更标准的方式。

它围绕任务协作建立一套完整的交互过程。比如一个 Agent 如何声明自己的能力,另一个 Agent 如何发现它,如何向它发起任务请求,如何追踪任务状态,如何获取最终结果,以及如何处理长任务和异步返回。

MCP 调用工具通常是被动的。Agent 给它参数,它执行,然后返回结果。比如读取文件、查询数据库、调用搜索接口,这些行为更像一次函数调用。

但另一个 Agent 不完全是工具。它可能有自己的目标理解、任务规划、上下文管理和执行过程。它接到任务后,不一定马上返回结果,可能还要进一步拆解、调用自己的工具,甚至再请求其他 Agent 协作。

所以,Agent 和 Agent 之间的通信,比 Agent 调用工具更复杂。

A2A 试图处理的,正是这种更高层次的协作关系。

在这里插入图片描述

2.3 ANP:让 Agent 在网络中被发现和连接

MCP 和 A2A 分别解决了工具连接和 Agent 协作的问题。继续往更大的范围看,还会出现另一个问题:如果网络中有非常多 Agent,它们应该如何被发现和连接?

这就是 ANP 想讨论的方向。

ANP 就是 Agent Network Protocol,关注的是 Agent 网络中的身份、发现、连接和互操作问题。

在单个应用里,我们可以手动配置几个工具,也可以手动指定几个 Agent 互相协作。但如果未来 Agent 的数量变得很多,分布在不同平台、不同组织、不同网络环境里,手动配置就不现实了。

这时候,一个 Agent 想完成任务,可能会遇到这样的问题:

我怎么知道网络里有哪些 Agent?
哪个 Agent 擅长我当前这个任务?
我应该如何联系它?
它的身份是否可信?
它返回的结果能不能被我理解?

这些问题已经超出了单次工具调用或两个 Agent 之间的简单协作,更接近“网络层面”的问题。

可以类比传统互联网里的服务发现。

在一个大型系统中,服务之间不是靠人工记住所有地址来通信,而是需要注册、发现、路由、鉴权等机制。Agent 网络也是类似的。如果网络中有大量 Agent,那么就需要一种方式描述它们是谁、能做什么、在哪里、如何通信,以及是否可信。

ANP 关注的正是这些问题。
在这里插入图片描述

写在文后

期待您的一键三连!如果有什么问题或建议欢迎在评论区交流!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐