Skip to content

采样

协议版本: 2025-11-25

模型上下文协议(MCP)为服务器通过客户端从语言模型请求 LLM 采样("补全"或"生成")提供了标准化方式。此流程允许客户端保持对模型访问、选择和权限的控制,同时使服务器能够利用 AI 能力——无需服务器 API 密钥。服务器可以请求文本、音频或基于图像的交互,并可以选择在其提示中包含来自 MCP 服务器的上下文。

1 用户交互模型

MCP 中的采样允许服务器通过启用 LLM 调用嵌套在其他 MCP 服务器功能中来实现代理行为。

实现可以通过任何适合其需求的界面模式公开采样——协议本身不强制要求任何特定的用户交互模型。

为了信任与安全以及安全性,应该始终有一个人在循环中,有能力拒绝采样请求。

应用程序应该

  • 提供使审查采样请求变得简单直观的 UI
  • 允许用户在发送之前查看和编辑提示
  • 在交付之前呈现生成的响应以供审查

2 采样中的工具

服务器可以通过在其采样请求中提供 tools 数组和可选的 toolChoice 配置来请求客户端的 LLM 在采样期间使用工具。这使服务器能够实现代理行为,其中 LLM 可以调用工具、接收结果并继续对话——所有这些都在单个采样请求流程中完成。

客户端必须通过 sampling.tools 能力声明对工具使用的支持才能接收启用工具的采样请求。服务器禁止向未通过 sampling.tools 能力声明支持工具使用的客户端发送启用工具的采样请求。

3 能力

支持采样的客户端必须初始化期间声明 sampling 能力:

基本采样:

json
{
  "capabilities": {
    "sampling": {}
  }
}

带工具使用支持:

json
{
  "capabilities": {
    "sampling": {
      "tools": {}
    }
  }
}

带上下文包含支持(软弃用):

json
{
  "capabilities": {
    "sampling": {
      "context": {}
    }
  }
}

includeContext 参数值 "thisServer""allServers" 已软弃用。服务器应该避免使用这些值。

4 协议消息

4.1 创建消息

要请求语言模型生成,服务器发送 sampling/createMessage 请求:

请求:

json
{
  "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
  }
}

响应:

json
{
  "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 的工具使用请求后,服务器通常:

  1. 执行请求的工具使用
  2. 发送附加了工具结果的新采样请求
  3. 接收 LLM 的响应(可能包含新的工具使用)
  4. 根据需要重复多次

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 文本内容

json
{
  "type": "text",
  "text": "The message content"
}

8.1.2 图像内容

json
{
  "type": "image",
  "data": "base64-encoded-image-data",
  "mimeType": "image/jpeg"
}

8.1.3 音频内容

json
{
  "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 安全注意事项

  1. 客户端应该实施用户批准控制
  2. 双方应该验证消息内容
  3. 客户端应该尊重模型偏好提示
  4. 客户端应该实施速率限制
  5. 双方必须适当处理敏感数据

当在采样中使用工具时,需要额外的安全考虑:

  1. 服务器必须确保在回复 stopReason: "toolUse" 时,每个 ToolUseContent 项都有一个具有匹配 toolUseIdToolResultContent 项响应
  2. 双方应该为工具循环实施迭代限制