MCP 介绍与实践
传统交互下,大模型面临着如下问题:
Function Calling 允许模型在生成文本回复的同时,输出结构化的 JSON 对象,声明可以被外部工具或 API 调用的函数,可以通过这些函数,来扩展大模型的能力。
各个大模型厂商的 function calling 标准和功能可能都不太一样。

MCP(Model Context Protocol,模型上下文协议)是在 2024 年 11 月底由 Anthropic 发布,旨在构建一个开放的标准,让大型语言模型(LLM)与外部数据源和工具之间的交互更加统一和高效。面对当前 AI 模型因数据孤岛问题而无法充分发挥潜力的挑战,MCP 的推出为解决这一问题提供了新的思路。通过 MCP,AI 应用能够安全地访问和操作本地及远程的数据,从而搭建起 AI 应用与各种资源之间的桥梁。可以把 MCP 想像为一个 USB 接口,让 AI 应用能够更高效地利用各种数据资源,进一步释放其潜力。


MCP 协议采用 B/S 架构,主要由 MCP Client 和 MCP Server 构成,二者之间保持 1:1 连接的关系,通过 MCP 规定的请求和返回的 JSON 结构进行通信。
图中指的是一个需要借助 MCP 的主机上面可能存在多个 MCP Client - MCP Server 的连接。
其中,MCP Server 根据数据源的位置不同,分为本地的 MCP Server 以及远程的 MCP Server,二者在 MCP 中分别规定使用标准 IO 以及使用 HTTP SSE 来进行通信。
MCP 实际上就是将 Function Calling 的过程标准化了,因为之前的 Function Calling,各家模型可能都不太相同,有的可能只是一个简单的调用然后返回结果后喂给 AI,有的可能也会将调用哪些 tools 的决策交给大模型,以及各种交互的数据结构、接口的规范都不太相同,所以,需要一个标准化的协议将大模型与数据、tools 能力之间的行为进行一个标准化,避免重复造轮子。

graph LR
subgraph"MCP Host"
H[Host]
C1[Client 1]
C2[Client 2]
C3[Client 3]
H --> C1
H --> C2
H --> C3
end
subgraph"Servers"
S1[Server 1]
S2[Server 2]
S3[Server 3]
C1 --> S1
C2 --> S2
C3 --> S3
end
MCP Host 是运行 LLM 应用的宿主进程,负责:
每个 MCP Host 可以运行多个 MCP Client 实例,形成 1:N 的关系。
MCP Client 负责与 MCP Server 进行通信,以获取 MCP Server 提供的所有 Tools 并告知大模型,同时当大模型产生决策后,由 MCP Client 来告诉 MCP Server 应该调用哪些 tools,同时拿到 MCP Server 调用 tools 的返回键结果。
MCP Server 是实际负责资源整合、tools 调用的角色,在收到 MCP Client 需要调用 tools 或者获取某项资源的时候,MCP 会去执行对应的函数或者功能或者 api。
MCP Server 有两种类型,本地的 MCP Server,以及远程的 MCP Server,其中,MCP 协议规定本地的 MCP Server 与 MCP Client 之间采用标准 IO 通信,而远程的 MCP Server 与 MCP Client 之间采用 HTTP 进行通信。

MCP 规定了传输 MCP Client 与 MCP Server 之间传输的消息格式(JSON)、具体方式,并默认给出了两种标准传输实现:
MCP 中的工具允许服务器公开可执行函数,这些函数可由客户端调用,并由 LLM 用于执行,工具的关键包括:

资源表示 MCP 服务器希望提供给客户端的任何类型的数据,例如:
提示(Prompt)使服务器能够定义可重用的提示模板和工作流,客户端可以轻松地向用户和 LLM 显示这些模板和工作流。它们提供了一种强大的方法来标准化和共享常见的 LLM 交互,如:
你是一位精通多语言的专业翻译专家,具备以下能力:
1. 精确理解源语言的文化背景、习语、专业术语和上下文。
2. 在保留原文含义的同时,用地道的目标语言表达,而不是逐字翻译。
3. 维持原文的语气、风格和专业术语。
4. 特别关注技术文档、法律文本和文学作品的专业术语和行业表达方式。
5. 尊重不同语言的语法结构差异,采用最自然的目标语言表达方式。
6. 能够自动识别输入文本的语言。
请按照以下步骤完成任务:
1. 自动识别输入文本的源语言。
2. 根据源语言和目标语言,精确翻译文本内容,确保保留原文的含义、语气和风格。
3. 特别关注技术术语、法律条款或文学表达,确保翻译结果符合目标语言的行业标准。
4. 避免逐字翻译,采用最自然的目标语言表达方式。
5. 输出翻译结果时,不要包含任何额外的解释或 XML 标签
现在,目标语言为{language}
这就是一个典型的翻译 Prompt,其中的 language 变量,是动态拼接后再给 LLM 的。
简单来说采样就是在服务器需要使用 LLM 能力的时候,允许服务器向客户端发起请求,在客户端审核、甚至是修改过后,得到 LLM 的响应。
Roots 实际上就是通过规定一些列的 URI,当客户端连接到服务端的时候,会声明服务器应该使用哪些资源,如:
{
"roots": [
{
"uri": "file:///home/user/projects/frontend",
"name": "Frontend Repository"
},
{
"uri": "https://api.example.com/v1",
"name": "API Endpoint"
}
]
}
目前市面上的 MCP Host 有很多:
拿 Cline 举例,具体步骤为:




目前主流的实现 MCP 主要有两种方式:
基于 System Prompt,其实就是告诉大模型什么是 MCP、MCP 的相关概念以及整个 MCP 协议的内容,然后再告诉大模型现在连接的 MCP Server 有哪些 tools,这些 tools 分别有什么功能,哪些入参,返回值是什么,然后让大模型决定一下调用哪些 tools。
看的出来,System Prompt 的方式很烧 Token!
而基于 Function Calling,相当于直接借助有 Function Calling 的能力的大模型,做了个对于 MCP 协议的适配,直接用大模型的 Function Calling 机制。
接下来,我们基于 Function Calling 的方式简单实现一个 demo:


这里附上这个简单的 demo:
fastmcp
openai-agents
openai
pydantic
pydantic-settings
googlesearch-python
beautifulsoup4
MCP 的出现,促进了 AI 生态的统一,未来,应该会陆续看到各大公司的 MCP 平台,如阿里最近出的百炼,以及市面上各种 mcp server 提供方如 mcp.so、smithery.ai 等等。
Google 在 Anthropic 提出 MCP 后,又提出了 AI 界的一大协议,A2A 协议,这个协议关注于各个 Agent 之间发现、协作,可以与 MCP 协议互补,如借助 MCP 构建垂直业务的细分领域的 Agent,然后通过 A2A 协议来协同各个细分领域的 Agent,从而实现垂直领域的通用 Agent。
目前,MCP 已经有了一系列的应用案例,如 AI 几句话操作 blender 实现 3D 建模:

未来,MCP 将会促进在各个场景下的 AI 落地应用。