摘要
在 AI 应用爆发式增长的今天,如何让大语言模型高效、安全地连接外部工具和数据源,成为了开发者面临的核心挑战。模型上下文协议(Model Context Protocol,MCP)作为 Anthropic 于 2024 年底推出的开放标准,正在成为解决这一问题的关键方案。本文将从技术架构、协议原理、工程实践三个维度,深入剖析 MCP 协议的设计思想与实现细节。
一、为什么需要 MCP?
1.1 碎片化的工具集成困境
在 MCP 出现之前,AI 开发者面临着一个典型的 N × M 集成陷阱 :如果你想让 NNN 个大模型(如 Claude、GPT、Llama)连接到 MMM 个数据源或工具(如 GitHub、Slack、SQL 数据库),理论上需要编写并维护 N×MN \times MN×M 个不同的集成接口。
这种碎片化带来的问题包括:
- 重复开发:每个工具都需要单独适配,尽管认证、请求、响应解析的逻辑高度相似
- 契约不稳定:不同模型的 Function Calling 接口和 Prompt 格式各不相同
- 上下文割裂:A 工具查到的认证信息,B 工具无法直接复用
用一个数学公式来表达这种复杂度:
Ctraditional=N×MC_{traditional} = N \times MCtraditional=N×M
其中 CCC 表示集成成本,NNN 为模型数量,MMM 为工具数量。
1.2 MCP 的解决思路
MCP 的核心设计目标是:让任何 AI 模型能够用同一种方式,连接任何外部工具和数据源。
通过引入统一的协议层,MCP 将集成复杂度从乘法降为加法:
CMCP=N+MC_{MCP} = N + MCMCP=N+M
这意味着:每个模型只需实现一次 MCP 客户端,每个工具只需实现一次 MCP 服务器,即可实现任意组合的互联互通。
二、MCP核心架构
2.1 客户端-主机-服务器模型
MCP 协议架构是经典的**客户端-主机-服务器(Client-Host-Server)**模型,包含三个核心角色:
| 角色 | 职责 | 示例 |
|---|---|---|
| Host(主机) | AI 应用的运行环境,负责整体调度和安全策略 | Claude Desktop、Cursor、自定义 Agent |
| Client(客户端) | 嵌入在 Host 中,管理与 Server 的连接和会话 | MCP 客户端实例 |
| Server(服务器) | 对外暴露工具和数据源 | GitHub Server、SQL Server |
这种架构的关键设计原则是关注点分离:
- Host 只负责 AI 推理和用户交互
- Client 只负责通信协议
- Server 只负责具体工具的实现

2.2 协议层与传输层
MCP 的架构分为两个层次:
协议层(Protocol Layer) 处理消息帧、请求/响应链接和高级通信模式。核心类包括:
typescript
class Protocol<Request, Notification, Result> {
// 处理请求-响应模式
// 处理通知模式
}
传输层(Transport Layer) 处理客户端和服务器之间的实际通信,支持多种传输机制:
- Stdio 传输:使用标准输入/输出进行通信,适用于本地进程
- HTTP + SSE 传输:使用 Server-Sent Events 进行服务器到客户端的消息推送,使用 HTTP POST 进行客户端到服务器的消息发送
对于个人开发者和小型团队,Stdio 模式是最简单的启动方式------不需要任何额外配置,Python 或 Node.js 脚本直接就能跑起来。
2.3 消息格式:JSON-RPC 2.0
MCP 的所有通信消息都采用 JSON-RPC 2.0 格式。这是一个轻量级的远程调用协议,格式简单,解析容易。
MCP 定义了四种消息类型:
| 消息类型 | 描述 | 是否包含 ID |
|---|---|---|
| 请求(Request) | 期望获得响应的消息 | 是 |
| 结果(Result) | 对请求的成功响应 | 是 |
| 错误(Error) | 表示请求失败 | 是 |
| 通知(Notification) | 不需要响应的单向消息 | 否 |
请求消息的结构如下:
json
{
"jsonrpc": "2.0",
"id": "request-123",
"method": "tools/call",
"params": {
"name": "weather_current",
"arguments": {
"location": "San Francisco"
}
}
}
这种格式的好处是:它跟具体模型无关。不管你用的是 Claude、GPT 还是 DeepSeek,只要它们能发送 JSON-RPC 请求,就能和 MCP Server 通信。
三、核心原语:Tools、Resources、Prompts
MCP 协议定义了三种核心原语(Primitive),分别对应不同的能力:
3.1 Tools(工具)
Tools 是 Agent 可以调用的函数,是"主动"的------Agent 决定何时调用。
每个 Tool 包含以下关键字段:
- name:工具的唯一标识符
- title:人类可读的显示名称
- description:详细说明工具的功能和使用场景
- inputSchema:JSON Schema 格式的输入参数定义
json
{
"name": "weather_current",
"title": "获取当前天气",
"description": "获取指定位置的当前天气信息",
"inputSchema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
},
"units": {
"type": "string",
"enum": ["metric", "imperial"],
"default": "metric"
}
},
"required": ["location"]
}
}
3.2 Resources(资源)
Resources 是 MCP Server 暴露的数据源,是"被动"的------Agent 按需读取。
资源可以是静态的(如一个 Markdown 文件),也可以是动态的(如实时读取的日志流)。MCP 支持订阅模式,当底层数据发生变化时,Server 会通过 JSON-RPC 通知主动推送更新。
3.3 Prompts(提示模板)
Prompts 是预定义的 Prompt 片段,可以复用。
例如,一个专门用于"金融审计"的 MCP Server 可以提供一套标准的 Prompt 模板。当用户选择该模板时,模型会自动获得必要的背景知识引导,从而大幅降低由于提示词质量差导致的幻觉。
3.4 三种原语的对比
| 原语 | 控制方 | 用途 | 类比 |
|---|---|---|---|
| Tools | 模型控制 | 执行动作 | 函数调用 |
| Resources | 应用控制 | 读取数据 | 文件读取 |
| Prompts | 用户控制 | 交互模板 | 快捷指令 |
四、能力协商与生命周期管理
4.1 初始化握手
MCP 会话的生命周期始于能力协商握手 。客户端发送 initialize 请求,双方交换关键信息:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {
"elicitation": {},
"roots": {"listChanged": true}
},
"clientInfo": {
"name": "my-ai-app",
"version": "1.0.0"
}
}
}
初始化的核心目的包括:
- 协议版本协商:确保双方使用兼容的协议版本
- 能力发现:声明各自支持的功能特性
- 身份交换:提供调试和兼容性所需的信息
4.2 能力声明
服务器在响应中声明其支持的能力:
json
{
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": {"listChanged": true},
"resources": {"subscribe": true, "listChanged": true},
"prompts": {"listChanged": true}
},
"serverInfo": {
"name": "weather-server",
"version": "2.1.0"
}
}
能力协商的数学表达可以理解为:
Capabilitiessession=Capabilitiesclient∩CapabilitiesserverCapabilities_{session} = Capabilities_{client} \cap Capabilities_{server}Capabilitiessession=Capabilitiesclient∩Capabilitiesserver
只有双方都声明支持的能力,才能在会话中使用。
4.3 工作流程
MCP的核心工作流程是一个客户端-服务器协作的闭环,整体分为7个阶段:
1)初始化连接:主机应用启动后,MCP Client与MCP Server建立连接。一个主机可以同时连多个Server,每个Server负责不同的工具和资源。
2)获取工具列表:Client 从Server拉取可用的工具清单,包括每个工具的名称、参数、用途描述。这一步相当于"能力注册",让模型知道手里有哪些牌可以打。
3)构造Function Calling请求:用户输入问题后,Client把工具描述和用户问题一起打包发给LLM。传输格式是结构化的Function Calling,告诉模型"你现在能调用这些函数"。
4)模型智能决策:LLM根据上下文和工具信息,判断是否需要调用外部工具、调用哪个、传什么参数。比如用户问天气,模型就会选择getWeather工具并填入城市参数。
5)工具调用执行:如果模型决定调用工具,Client把调用请求转发给Server,Server负责实际执行一一跑脚本、查数据库、调API,然后把结果返回。
6)结果整合:工具执行结果传回LLM,模型把这个结果和原始问题、对话上下文糅在一起,生成最终的自然语言回答。
7)用户响应输出:Client把模型生成的回答展示给用户,完成一次完整的人机协作。
五、传输层详解
5.1 Stdio 传输
Stdio 传输适用于本地进程通信:
- MCP Server 作为子进程启动
- 通过 stdin/stdout 和 Client 通信
- 部署简单,延迟极低
- 只能本地使用,无法跨机器调用
python
# 启动 MCP Server 子进程
process = subprocess.Popen(
["python", "weather_server.py"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE
)
5.2 HTTP + SSE 传输
SSE 传输适用于远程服务:
-
MCP Server 作为独立的网络服务运行
-
Client 通过 HTTP 请求建立长连接
-
Server 通过 SSE 推送事件
-
适合生产环境
Client Server
| |
|-- POST /mcp/message --------->| (客户端到服务器)
|<-- SSE /mcp/sse --------------| (服务器到客户端)
| |
5.3 传输层对比
| 特性 | Stdio | HTTP + SSE |
|---|---|---|
| 适用场景 | 本地集成 | 远程服务 |
| 部署复杂度 | 低 | 中 |
| 跨机器支持 | 否 | 是 |
| 延迟 | 极低 | 取决于网络 |
| 安全性 | 进程隔离 | 需要额外认证 |
六、工程实践:构建 MCP 服务器
6.1 服务器开发要点
根据 MCP 协议定义,Server 可以提供三种能力:
- Tools:可调用的函数
- Resources:可读取的数据源
- Prompts:预定义的提示模板
一个典型的 MCP Server 实现框架:
python
from mcp import Server, Tool
server = Server("weather-server")
@server.tool("weather_current")
async def get_current_weather(location: str, units: str = "metric"):
"""获取指定位置的当前天气"""
# 实现天气查询逻辑
return {"temperature": 22, "conditions": "sunny"}
@server.resource("weather://forecast/{city}")
async def get_forecast(city: str):
"""获取天气预报"""
# 实现预报查询逻辑
return forecast_data
6.2 客户端集成流程
客户端的核心工作流程包括:
- 依赖管理:使用 AsyncExitStack 管理异步上下文
- 环境变量配置:通过 dotenv 加载配置,避免硬编码敏感信息
- 动态工具发现 :调用
session.list_tools()获取可用工具 - 工具调用闭环 :当大模型返回
finish_reason == "tool_calls"时,自动解析参数并调用工具
python
async def process_query(session, query):
# 动态发现工具
tools = await session.list_tools()
# 转换为 OpenAI Function Calling 格式
tools_schema = convert_to_openai_format(tools)
# 调用大模型
response = await llm.chat(query, tools=tools_schema)
# 处理工具调用
if response.finish_reason == "tool_calls":
result = await session.call_tool(
response.tool_name,
response.tool_arguments
)
# 将结果追加到上下文,再次请求大模型
return await llm.chat(query, tool_result=result)
七、MCP 与其他协议的对比
7.1 协议层次定位
MCP 在 AI 协议生态中的定位可以用以下层次图表示:
| 层次 | 协议 | 用途 |
|---|---|---|
| 代理间通信 | A2A、ACP | Agent 之间的协商与协作 |
| 上下文提供 | MCP | Agent 访问工具和数据 |
| 服务接口 | OpenAPI、GraphQL | 传统 API 规范 |
| 传输层 | HTTP、gRPC | 底层通信 |
MCP 专注于代理如何访问工具和数据,而不涉及代理之间的对话。
7.2 MCP vs 传统 Function Calling
| 维度 | Function Calling | MCP |
|---|---|---|
| 集成方式 | 每个工具单独适配 | 标准化协议 |
| 工具发现 | 静态配置 | 动态发现 |
| 跨模型兼容 | 依赖模型实现 | 模型无关 |
| 上下文共享 | 有限 | 完整支持 |
| 开发效率 | 低 | 高 |
7.3 MCP与Skills有什么区别?分别适用于什么场景?
(1),MCP给Agent提供"工具",Skills给Agent提供"方法论" ,两者解决的是完全不同层面的问题。
MCP全称Model Context Protocol,是一套标准化的工具调用协议 ,让AI Agent 能调用外部服务 。查数据库、调API 。
读文件系统,都是通过MCP来实现的。它解决的是Agent"能不能做"的问题。
(2),Skills是一套指令文档,告诉Agent遇到某类任务应该怎么做、按什么顺序做、要注意什么。它解决的是Agent"会不会做"和"做得好不好"的问题。
MCP相当于给厨师配了一套厨具,锅碗瓢盆、烤箱微波炉;Skils相当于给厨师一本菜谱,红烧肉先焯水再上色,火候多大放多少料。光有工具不知道怎么用,做不出好菜;光有菜谱没有工具,也做不了饭。

(3),两者的协作关系
实际的Agent系统中,MCP和Skills通常是配合使用的。看一个典型场景:
用户说:"帮我创建一个MCP Server"
Agent的处理流程是这样的:
首先系统识别出这是一个"创建MCP Server"的任务,加载对应的Skil。然后Agent 读取Skill中定义的标准流程,包括创建项目结构、写Server 代码、配置Transport、注册 Tools等步骤。在执行过程中,Agent 通过 MCP协议调用文件系统工具来创建文件、调用终端工具来安装依赖。

(4)Skills与RAG
RAG侧重于"检索知识来回答问题",检索粒度是知识片段Chunk,产出的是信息。
Skils侧重于"加载流程来指导行动",加载粒度是完整的操作文档,产出的是行为。
在Agent系统中,两者可能同时存在:Skill告诉Agent 怎么处理文档问答任务,RAG负责在执行过程中检索具体知识。
八、在Spring AI框架中如何集成MCP?
SpringAI集成MCP有两种角色,方向完全不同:
1)作为 MCP Client:你的Spring Boot 应用是AI Agent 的大脑,通过 MCP协议连接外部的 MCP Server 来获取工具能力。比如让AI助手能查数据库、操作文件、调用第三方API。
2)作为 MCP Server:你有现成的Java 业务系统,想把里面的能力暴露给Claude Desktop 或其他AI Agent 调用。
Spring Boot应用启动一个MCP Server端点,等着别人来连。

具体集成步骤:
引入spring-ai-mcp-client-spring-boot-starter 或 spring-ai-mcp-server-spring-boot-starter 依赖。
Client 角色在配置文件里声明要连的Server 地址;Server角色用@Tool注解标记方法,通过 description 描述功能,框架自动注册到MCP服务中。
九、MCP协议安全性设计包括哪些层面?
MCP协议的安全性设计围绕三层防护 展开:用户控制层、隔离沙箱层、传输验证层。
1)用户同意和控制
所有工具、资源、提示的访问都必须经过用户授权。Host应用负责权限管理,在调用敏感操作前弹窗让用户确认。用户得清楚知道哪些数据会交给模型、每个工具能干什么,授权前心里有数。
2)隔离与沙箱机制
工具调用被封装在MCP Server内部,模型压根碰不到原始敏感数据。Server充当中间层,即使模型被prompt注入攻击,攻击者也拿不到数据库密码、APIKey这些凭证。沙箱机制还能限制工具的执行环境,防止恶意代码跑飞。
3)加密传输与来源验证
MCP内置请求验证机制,只有通过身份校验的请求才能访问资源。SSE模式走HTTPS,数据全程加密;Stdio模式虽然是本地通信,但进程间也有隔离保护。
**
**
十、总结
MCP 协议通过标准化的客户端-服务器架构、统一的 JSON-RPC 消息格式、以及 Tools/Resources/Prompts 三种核心原语,成功解决了 AI 工具集成中的碎片化问题。
其核心价值可以概括为:
MCP=标准化协议+动态发现+模型无关性\text{MCP} = \text{标准化协议} + \text{动态发现} + \text{模型无关性}MCP=标准化协议+动态发现+模型无关性
随着 MCP 生态的不断发展,越来越多的开发者和企业正在加入这一标准。正如 HTTP 标准化了浏览器和网站之间的通信,MCP 正在标准化 AI 代理与外部世界的交互方式。
对于开发者而言,现在正是学习和采用 MCP 的最佳时机。无论是构建自己的 MCP Server,还是将现有工具接入 MCP 生态,都将为 AI 应用的开发带来显著的效率提升。

参考资料
- Red Hat. 什么是模型上下文协议(MCP)?
- MCP Java SDK. Overview
- 李洪亮. 深入理解 MCP 协议:从原理到工程实践. 腾讯云开发者社区
- MCP 中文文档. 核心架构
- 从API到Agent:MCP协议如何成为AI互联互通的新基础设施
- MCP Specification. Architecture
- MCP 协议详解:Anthropic 推出的 Model Context Protocol 将如何统一 AI 工具生态?
- MCP Specification. 基础协议
- Elastic. MCP 概述和新兴用例
- MCP Documentation. Architecture overview
