MCP 核心概念
深入理解 MCP 的架构设计和核心概念。
分层架构
MCP 由两个核心层组成:
数据层
数据层实现基于 JSON-RPC 2.0 的交换协议,定义消息结构和语义。这一层包括:
- 生命周期管理:处理客户端和服务器之间的连接初始化、能力协商和连接终止
- 服务器原语:服务器向客户端提供的核心功能,包括工具、资源和提示
- 客户端原语:服务器可以向客户端请求的功能,包括采样、用户交互和日志
- 工具功能:支持实时更新的通知、长时间操作的进度跟踪等
传输层
传输层管理客户端和服务器之间的通信通道和认证。MCP 支持两种传输机制:
STDIO 传输:使用标准输入/输出流在同一台机器上进行直接进程通信,没有网络开销,性能最优。
Streamable HTTP 传输:使用 HTTP POST 进行客户端到服务器的消息传递,可选 Server-Sent Events 实现流式能力。支持远程服务器通信,可使用 OAuth、Bearer Token 等 HTTP 认证方法。
传输层的选择取决于部署场景:
| 场景 | 推荐传输 | 原因 |
|---|---|---|
| 本地开发工具 | STDIO | 无网络开销,性能最优 |
| 远程 API 服务 | HTTP | 支持远程访问和认证 |
| 企业级部署 | HTTP | 支持负载均衡和安全认证 |
协议基础
MCP 基于 JSON-RPC 2.0 消息格式,建立有状态的连接,支持服务端和客户端能力协商。
消息格式
MCP 所有消息都遵循 JSON-RPC 2.0 格式:
// 请求消息
{
"jsonrpc": "2.0",
"id": "unique-request-id",
"method": "tools/list",
"params": {
// 方法参数
}
}
// 响应消息
{
"jsonrpc": "2.0",
"id": "unique-request-id",
"result": {
// 返回结果
}
}
// 错误响应
{
"jsonrpc": "2.0",
"id": "unique-request-id",
"error": {
"code": -32600,
"message": "Invalid Request"
}
}
三大核心功能
1. Tools(工具)
工具是 AI 模型可以调用的函数。每个工具都有:
- 名称:唯一标识符
- 描述:说明工具用途
- 输入模式:参数定义
from mcp.types import Tool
Tool(
name="get_weather",
description="获取指定城市的天气信息",
inputSchema={
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
)
工具调用流程:
1. 客户端调用 tools/list 获取可用工具
2. LLM 决定使用哪个工具及其参数
3. 客户端调用 tools/call 执行工具
4. 服务器执行并返回结果
5. LLM 根据结果生成响应
2. Resources(资源)
资源是服务器向客户端提供的上下文数据,可以是:
- 文件内容
- 数据库查询结果
- API 响应
- 任意二进制数据
from mcp.types import Resource
Resource(
uri="file:///project/README.md",
name="项目说明文件",
description="项目的 README 文档",
mimeType="text/markdown"
)
资源列表:
@server.list_resources()
async def list_resources():
return [
Resource(
uri="config://app/settings",
name="应用设置",
description="当前应用配置"
)
]
3. Prompts(提示)
预定义的提示模板,用于标准化常见工作流:
from mcp.types import Prompt
Prompt(
name="review_code",
description="代码审查助手",
arguments=[
PromptArgument(
name="file",
description="要审查的文件路径",
required=True
)
]
)
客户端原语
客户端原语是服务器可以向客户端请求的功能,允许服务器与用户交互或使用 LLM 能力。
1. Sampling(采样)
采样允许服务器请求 LLM 进行推理,实现递归 LLM 交互和代理行为。这对于需要在服务器端使用语言模型但希望保持模型无关性的场景非常有用。
# 服务器请求 LLM 采样
result = await session.send_sampling_request(
messages=[
{"role": "user", "content": "分析这段代码..."}
],
max_tokens=1000
)
2. Elicitation(用户交互)
Elicitation 允许服务器向用户请求额外信息或确认。这在需要用户确认敏感操作或获取更多信息时非常有用。
# 服务器请求用户输入
result = await session.send_elicitation_request(
message="是否允许删除此文件?",
requestedSchema={
"type": "object",
"properties": {
"confirm": { "type": "boolean" }
}
}
)
3. Logging(日志)
日志功能允许服务器向客户端发送日志消息,用于调试和监控。
# 服务器发送日志
await session.send_log(
level="info",
message="工具执行完成"
)
生命周期
MCP 是有状态的协议,需要生命周期管理。生命周期管理的目的是协商客户端和服务器都支持的功能。
连接初始化
初始化过程分为三个步骤:
- 客户端发送初始化请求:包含客户端能力和协议版本
- 服务器响应:返回服务器能力和协议版本
- 客户端发送初始化完成通知:确认连接建立
初始化请求示例:
{
"jsonrpc": "2.0",
"id": "init-1",
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": {},
"resources": { "subscribe": true },
"elicitation": {}
},
"clientInfo": {
"name": "my-app",
"version": "1.0.0"
}
}
}
初始化响应示例:
{
"jsonrpc": "2.0",
"id": "init-1",
"result": {
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": { "listChanged": true },
"resources": { "subscribe": true, "listChanged": true },
"prompts": {}
},
"serverInfo": {
"name": "mcp-server",
"version": "1.0.0"
}
}
}
会话管理
连接是有状态的,服务器可以主动发送通知:
- 日志通知:服务器日志输出
- 资源变更通知:资源内容发生变化
- 工具列表变更通知:可用工具发生变化
连接关闭
正常关闭流程:
// 客户端发送关闭请求
{
"jsonrpc": "2.0",
"id": "shutdown-1",
"method": "shutdown"
}
// 服务器响应
{
"jsonrpc": "2.0",
"id": "shutdown-1",
"result": {}
}
// 客户端发送退出通知
{
"jsonrpc": "2.0",
"method": "notifications/exit"
}
能力协商
MCP 支持服务端和客户端能力协商,允许双方声明支持的功能:
客户端能力
client_capabilities = {
"tools": {}, # 支持工具调用
"resources": {
"subscribe": True # 支持资源订阅
},
"sampling": {} # 支持采样
}
服务器能力
server_capabilities = {
"tools": {
"listChanged": True # 工具列表可能变化
},
"resources": {
"subscribe": True,
"listChanged": True
},
"prompts": {},
"logging": {}
}
安全原则
MCP 强调安全性,以下是核心安全原则:
1. 用户授权
- 主机必须在暴露用户数据前获得明确同意
- 用户必须能够审查和授权所有操作
- 用户应该控制:是否允许采样、实际发送的提示、服务器可见的结果
2. 工具安全
工具代表任意代码执行,需要谨慎处理:
- 不信任服务器提供的工具描述
- 实施适当的访问控制
- 提供清晰的 UI 展示工具执行情况
- 敏感操作需要用户确认
3. 数据保护
- 不在未经用户同意的情况下传输数据
- 实现适当的数据保护措施
- 验证所有工具输入
- 实施速率限制
4. 采样控制
- 用户必须明确批准任何 LLM 采样请求
- 协议有意限制服务器对提示的可见性
通知系统
MCP 支持实时通知,使服务器能够在发生变化时主动通知客户端,而无需客户端显式请求。通知是单向的 JSON-RPC 消息,不期望响应。
工具列表变更通知
当服务器的可用工具发生变化时,服务器可以发送通知:
{
"jsonrpc": "2.0",
"method": "notifications/tools/list_changed"
}
客户端收到此通知后,通常会重新请求工具列表以获取最新信息。
资源变更通知
当资源内容发生变化时,服务器可以通知已订阅的客户端:
{
"jsonrpc": "2.0",
"method": "notifications/resources/updated",
"params": {
"uri": "file:///project/config.json"
}
}
日志通知
服务器可以向客户端发送日志消息:
{
"jsonrpc": "2.0",
"method": "notifications/message",
"params": {
"level": "info",
"logger": "weather-server",
"data": "天气数据获取成功"
}
}