采样
协议版本: 2025-11-25
模型上下文协议(MCP)为服务器通过客户端从语言模型请求 LLM 采样("补全"或"生成")提供了标准化方式。此流程允许客户端保持对模型访问、选择和权限的控制,同时使服务器能够利用 AI 能力——无需服务器 API 密钥。服务器可以请求文本、音频或基于图像的交互,并可以选择在其提示中包含来自 MCP 服务器的上下文。
1 用户交互模型
MCP 中的采样允许服务器通过启用 LLM 调用嵌套在其他 MCP 服务器功能中来实现代理行为。
实现可以通过任何适合其需求的界面模式公开采样——协议本身不强制要求任何特定的用户交互模型。
为了信任与安全以及安全性,应该始终有一个人在循环中,有能力拒绝采样请求。
应用程序应该:
- 提供使审查采样请求变得简单直观的 UI
- 允许用户在发送之前查看和编辑提示
- 在交付之前呈现生成的响应以供审查
2 采样中的工具
服务器可以通过在其采样请求中提供 tools 数组和可选的 toolChoice 配置来请求客户端的 LLM 在采样期间使用工具。这使服务器能够实现代理行为,其中 LLM 可以调用工具、接收结果并继续对话——所有这些都在单个采样请求流程中完成。
客户端必须通过 sampling.tools 能力声明对工具使用的支持才能接收启用工具的采样请求。服务器禁止向未通过 sampling.tools 能力声明支持工具使用的客户端发送启用工具的采样请求。
3 能力
支持采样的客户端必须在初始化期间声明 sampling 能力:
基本采样:
{
"capabilities": {
"sampling": {}
}
}带工具使用支持:
{
"capabilities": {
"sampling": {
"tools": {}
}
}
}带上下文包含支持(软弃用):
{
"capabilities": {
"sampling": {
"context": {}
}
}
}includeContext 参数值 "thisServer" 和 "allServers" 已软弃用。服务器应该避免使用这些值。
4 协议消息
4.1 创建消息
要请求语言模型生成,服务器发送 sampling/createMessage 请求:
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "sampling/createMessage",
"params": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "What is the capital of France?"
}
}
],
"modelPreferences": {
"hints": [
{
"name": "claude-3-sonnet"
}
],
"intelligencePriority": 0.8,
"speedPriority": 0.5
},
"systemPrompt": "You are a helpful assistant.",
"maxTokens": 100
}
}响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"role": "assistant",
"content": {
"type": "text",
"text": "The capital of France is Paris."
},
"model": "claude-3-sonnet-20240307",
"stopReason": "endTurn"
}
}4.2 带工具的采样
服务器可以在请求中包含 tools 和可选的 toolChoice 以进行具有工具使用能力的 LLM 生成。
4.3 多轮工具循环
在收到来自 LLM 的工具使用请求后,服务器通常:
- 执行请求的工具使用
- 发送附加了工具结果的新采样请求
- 接收 LLM 的响应(可能包含新的工具使用)
- 根据需要重复多次
5 消息内容约束
5.1 工具结果消息
当用户消息包含工具结果(type: "tool_result")时,它必须仅包含工具结果。
5.2 工具使用和结果平衡
在采样中使用工具时,每个包含 ToolUseContent 块的助手消息必须后跟一个完全由 ToolResultContent 块组成的用户消息。
6 跨 API 兼容性
采样规范被设计为可跨多个 LLM 提供商 API(Claude、OpenAI、Gemini 等)工作。
6.1 消息角色
MCP 使用两个角色:"user" 和 "assistant"。
6.2 工具选择模式
{mode: "auto"}:模型决定是否使用工具(默认){mode: "required"}:模型在完成之前必须使用至少一个工具{mode: "none"}:模型禁止使用任何工具
6.3 并行工具使用
MCP 允许模型并行进行多个工具使用请求。
7 消息流程
8 数据类型
8.1 消息
采样消息可以包含:
8.1.1 文本内容
{
"type": "text",
"text": "The message content"
}8.1.2 图像内容
{
"type": "image",
"data": "base64-encoded-image-data",
"mimeType": "image/jpeg"
}8.1.3 音频内容
{
"type": "audio",
"data": "base64-encoded-audio-data",
"mimeType": "audio/wav"
}8.2 模型偏好
MCP 中的模型选择需要仔细抽象,因为服务器和客户端可能使用具有不同模型产品的不同 AI 提供商。
8.2.1 能力优先级
服务器通过三个归一化优先级值(0-1)表达其需求:
costPriority:最小化成本有多重要?speedPriority:低延迟有多重要?intelligencePriority:高级能力有多重要?
8.2.2 模型提示
虽然优先级有助于根据特征选择模型,但 hints 允许服务器建议特定模型或模型系列。
9 错误处理
客户端应该为常见故障情况返回错误:
- 用户拒绝采样请求:
-1 - 请求中缺少工具结果:
-32602(无效参数) - 工具结果与其他内容混合:
-32602(无效参数)
10 安全注意事项
- 客户端应该实施用户批准控制
- 双方应该验证消息内容
- 客户端应该尊重模型偏好提示
- 客户端应该实施速率限制
- 双方必须适当处理敏感数据
当在采样中使用工具时,需要额外的安全考虑:
- 服务器必须确保在回复
stopReason: "toolUse"时,每个ToolUseContent项都有一个具有匹配toolUseId的ToolResultContent项响应 - 双方应该为工具循环实施迭代限制