AI Agent与MCP协议
摘要
本文深入解析AI Agent、Function Calling和MCP协议的关系。AI Agent是能够持续思考和调用工具解决问题的智能程序,Function Calling让大模型具备调用外部工具的能力,而MCP协议则标准化了工具接入方式,解决了工具复用困难和冗余开发问题。文章详细介绍了ReAct架构、基于提示词和API的Function Calling实现方式,以及MCP的核心架构、传输协议和实际应用场景,帮助读者理解AI工具调用的技术演进。
本文深入解析AI Agent、Function Calling和MCP协议的关系。AI Agent是能够持续思考和调用工具解决问题的智能程序,Function Calling让大模型具备调用外部工具的能力,而MCP协议则标准化了工具接入方式,解决了工具复用困难和冗余开发问题。文章详细介绍了ReAct架构、基于提示词和API的Function Calling实现方式,以及MCP的核心架构、传输协议和实际应用场景,帮助读者理解AI工具调用的技术演进。
简单来理解就是:能够利用大语言模型的推理决策能力以及各种外部工具,解决问题的一种系统或应用
Agent的图标一般是一个机器人🤖,这就很贴切,大模型就像是霍金,头脑发达但是四肢残废,而通过给他装上手脚(各种工具),就可以自己做事了
AI Agent:就是一种可以 可以持续思考 和 可以持续调用工具 直至实现用户目标的一种智能程序
Cursor,Cline插件、Manus都可以看成一个Agent,他们有模型可以调用,还有文件读写、外部搜索、我们自定义的一些MCP Tools这些工具可以调用,帮助我们完成写代码的问题。


ReAct 即 Reasoning推理 和 Acting调用工具能力
Reason Only就是模型只负责推理,没有访问外部工具的能力,导致AI知识受限于模型训练的知识库大小。
Act Only就是模型只能调用工具,但不具备推理能力。
ReAct就是将推理能力和调用工具能力相结合的一种架构(这就能构成一个最简单的Agent雏形了)
广义的 Function Calling 是指让大模型能够调用外部工具的一种技术实现,就是ReAct中Acting部分:先向大模型提供可用函数(可用工具)的列表及说明,由大模型在对话过程中智能判断是否需要调用函数,并自动生成调用所需的参数,最终用文字返回符合约定格式的函数调用请求。
狭义的 Function Calling 特指大模型提供商在模型内部与 API 层面做了支持的一种能力,它最早由 OpenAI 引入 (2023年7月20号发布):
tools 参数)
ReAct是2022年10月才提出的,当时就是使用提示词工程来实现的函数调用。
使用提示词约束AI的返回值,然后使用特定解析方法来获取函数调用请求,在ReAct作者的Demo程序中,就是暴力的使用split('\nAction')来获取函数调用请求


使用DeepSeek来完成最简单的调用
基于上面可能出现的问题,所以厂商对模型进行微调、强化学习等等...在大模型API层面就是多了一个tools/functions参数来描述一组函数

应用向大模型 API 传入用户原始输入、函数描述和其他上下文信息,获取调用指令。函数描述包括函数名称、用途说明、参数结构等。
模型会智能判断是否需要调用函数,选择合适的函数,并基于上下文自动生成结构化的调用指令(函数名 + 参数)
具体的格式由大模型厂商规定,需要查看其官方文档,例如:
应用接收到模型返回的调用指令后,解析调用指令,得到函数名称和参数,执行对应的方法(如调用天气查询函数),并获取结果。
应用将函数执行结果 + 其他上下文信息(包括用户原始输入)传给模型,模型判断此时已有足够的信息回答问题,不再需要调用函数了,于是直接生成最终结果,例如:“广州今天35度,暴雨,建议在室内活动”。
当前每新增一个工具(函数),开发者就需要在应用中做两处人工适配
a. 在api接口中补充工具描述
b. 补充具体工具(函数)代码
环境问题导致 copy 的代码不一定能跑;
很多企业不提供可供 copy 的源码;
跨语言的代码 copy 了没用。
如果是你会怎么解决以上问题?(假设现在完全没有 MCP 协议)
→ 冗余开发、复用困难问题基本都是由 copy 代码带来的,怎么才能用上别人的方法,但又不用 copy 别人的代码?
→ 接入工具、复用工具对开发者来说最理想的方式是什么?
→ 当前的非理想状态是什么?
→ 从非理想状态到理想状态必须满足什么条件?
→ 本地服务式接入场景
→ 远程服务式接入场景
工具与AI 应用必须解耦合。
工具与AI 应用之间的交互必须标准化。
a. AI 应用和工具服务的通信协议需要统一(本地进程间的通信协议 / 远程服务调用的协议)
b. AI 应用和工具服务的接口定义需要统一(需要提供哪些接口、接口需包含哪些参数)
c. AI 应用和工具服务的数据交换格式需要统一(接口的请求 / 响应格式等)
d. AI 应用接入工具的配置内容需要进行标准化定义
e. 所有工具服务必须提供标准化的接入方式,以支持通过标准化配置即可加载工具
f. 所有 AI 应用内部需实现标准化的工具加载调用逻辑,以支持通过标准化配置即可加载工具

总结下来就一句话:
计算机科学领域的任何问题都可以通过增加一个中间层来解决
--- David Wheeler
我们应该设计一种架构,将工具层和AI应用解耦,并将两者之间的交互标准化
MCP is an open protocol that standardizes how applications provide context to large language models (LLMs). Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools. MCP enables you build agents and complex workflows on top of LLMs and connects your models with the world. [1]
MCP 是一个开放协议,用于标准化应用程序向大语言模型(LLM)提供上下文的方式。你可以把 MCP 想象成 AI 应用的 USB-C 接口——正如 USB-C 提供了一种将设备连接到各种外设和配件的标准化方式一样,MCP 提供了一种将 AI 模型连接到不同数据源和工具的标准化方式。借助 MCP,你可以在 LLM 之上构建智能体和复杂工作流,并将你的模型与外部世界相连接。
MCP就是一个协议,规定了AI应用 如何发现 和 调用工具(函数)
MCP只是让大模型 更好的 使用工具的一个协议,难听点讲就是有他没他Agent都能干活,只是有了它Agent干活更好更方便
MCP follows a client-server architecture where an MCP host — an AI application like Claude Code or Claude Desktop — establishes connections to one or more MCP servers. The MCP host accomplishes this by creating one MCP client for each MCP server. Each MCP client maintains a dedicated one-to-one connection with its corresponding MCP server.The key participants in the MCP architecture are:
For example: Visual Studio Code acts as an MCP host. When Visual Studio Code establishes a connection to an MCP server, such as the Sentry MCP server, the Visual Studio Code runtime instantiates an MCP client object that maintains the connection to the Sentry MCP server. When Visual Studio Code subsequently connects to another MCP server, such as the local filesystem server, the Visual Studio Code runtime instantiates an additional MCP client object to maintain this connection, hence maintaining a one-to-one relationship of MCP clients to MCP servers.Note that MCP server refers to the program that serves context data, regardless of where it runs. MCP servers can execute locally or remotely. For example, when Claude Desktop launches the filesystem server, the server runs locally on the same machine because it uses the STDIO transport. This is commonly referred to as a “local” MCP server. The official runs on the Sentry platform, and uses the Streamable HTTP transport. This is commonly referred to as a “remote” MCP server. [
MCP遵循客户端-服务器架构,其中 MCP Host——Claude Code 或 Claude Desktop 等AI应用程序——与一个或多个MCP Server 建立连接。MCP 主机通过为每个 MCP Server 创建一个 MCP Client 来实现这一目标。每个 MCP Client 都与相应的 MCP Server 保持专用的一对一连接。MCP架构的主要组成者是:
个人理解:
MCP Host:就是上面所说的各种AI应用
MCP Client:就是MCP Host中实例化的一个对象,作用就是维护Host和Server之间的联系,与MCP Server一对一的关系,当然也可以一对多,但是Anthropic最后选择的是一对一的关系,方便管理
MCP Server:叫MCP服务或者MCP工具集比较合适,内部会有多个tool,给Host提供工具描述(当然也有resource、prompt等,但是用的不多)和执行具体的tool
例如:Visual Studio Code 充当 MCP Host。当 Visual Studio Code 建立与MCP Server(如Sentry MCP服务器)的连接时,Visual Studio Code 运行时实例化了维护与Sentry MCP Server连接的MCP Client对象。当Visual Studio Code 随后连接到另一个MCP Server时,例如本地文件系统服务器,Visual Studio Code 运行时实例化一个额外的MCP Client对象来维护此连接,从而保持MCP Client与MCP Client的一对一关系。

MCP supports two transport mechanisms:
The transport layer abstracts communication details from the protocol layer, enabling the same JSON-RPC 2.0 message format across all transport mechanisms.[ 3]
Stdio 传输本质上是本地进程间通信(IPC)的一种形式,它最常用的底层机制就是管道(pipe)。
什么是 stdio?
printf、scanf、cin、cout、read、write 都是通过这些接口和外界交换数据的。什么是管道(pipe)?
总结:什么是 Stdio 传输 ?
所谓 Stdio 传输,就是通过标准输入和标准输出这两个数据流来传输数据、通过管道来连接两个进程的标准输入/输出接口,使得一个进程的输出直接传给另一个进程输入,实现进程间数据传输(本质上是一个基于字节流的全双工通信通道)
stdio 是接口,管道是连接这接口的通道。
为什么在这么多本地进程间通信的方式中选了 Stdio 传输?
因为它简单,MCP Host 和 MCP Server之间只是传输一些简单的JSON,没必要搞多么复杂的通信方式
客户端通过 HTTP POST 向服务端发请求,服务端通过 SSE 通道返回响应结果。
text/event-stream 作为响应类型,源源不断地往里写数据。为什么在这么多远程服务调用的协议中选了 HTTP + SSE?
Why Notifications Matter
This notification system is crucial for several reasons:
This notification pattern extends beyond tools to other MCP primitives, enabling comprehensive real-time synchronization between clients and servers. [4]
HTTP + SSE 传输方案的升级版,目前正在逐步取代原有的 HTTP + SSE 传输方案
为什么 HTTP + SSE 要升级成 Streamable HTTP ?
Content-Type: text/event-stream 只支持文本格式;Streamable HTTP 的Content-Type支持任意格式,如 JSON、HTML、二进制等,更适合 AI 场景(可能要传 JSON + 音频 + 图片)——No,因为无论哪种传输方式,都只是把各种工具的不同接入方式统一起来,对外暴露一种协议的接口而已。
自己实现一种协议,只要能传输JSON数据也行


基于本地服务式接入(Stdio传输方式)
远程服务式接入(基于SSE协议)
Function Calling的出现让AI有了操控外部工具的能力,而MCP制定了一个统一的标准,可以让应用更好、更易用的进行工具调用
两者根本不在一个层次,也不存在谁取代谁的关系
