MCP 核心概念
深入理解 MCP 的架构设计和核心概念。
协议基础
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
)
]
)
生命周期
连接初始化
- 客户端初始化:发送
initialize请求,包含客户端能力 - 服务器响应:返回服务器能力和协议版本
- 初始化确认:客户端发送
initialized通知
# 客户端初始化
{
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": {},
"resources": {}
},
"clientInfo": {
"name": "my-app",
"version": "1.0.0"
}
}
}
# 服务器响应
{
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": {},
"resources": {},
"prompts": {}
},
"serverInfo": {
"name": "mcp-server",
"version": "1.0.0"
}
}
}
会话管理
连接是有状态的,服务器可以主动发送通知:
- 日志通知:服务器日志输出
- 提示通知:用户输入请求
- 采样通知:服务器请求 LLM 推理
连接关闭
{
"method": "shutdown"
}
// 等待响应后关闭连接
能力协商
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. 数据保护
- 不在未经用户同意的情况下传输数据
- 实现适当的数据保护措施