跳到主要内容

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
)
]
)

生命周期

连接初始化

  1. 客户端初始化:发送 initialize 请求,包含客户端能力
  2. 服务器响应:返回服务器能力和协议版本
  3. 初始化确认:客户端发送 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. 数据保护

  • 不在未经用户同意的情况下传输数据
  • 实现适当的数据保护措施

进一步学习