Skip to content

2.6 MCP 客户端特性:根 / 采样

MCP 为客户端的实现,提供了两个特性:

  • 根(Roots)
  • 采样(Sampling)

基于这两个特性,客户端可以为服务器提供文件系统访问控制和大模型代理服务。

2.6.1 什么是根

MCP 为客户端提供了一种标准方式,使其能够向服务器暴露文件系统的“根”。根定义了服务器在文件系统中可以操作的边界,使它们能够理解自己有权访问哪些目录和文件。服务器可以从支持的客户端请求根列表,并在该列表发生变化时接收通知。

MCP 中的根通常通过工作区或项目配置界面暴露。例如,主机可以提供工作区 / 项目选择器,允许用户选择服务器应有权访问的目录和文件,也可以通过版本控制系统或打开的文件自动检测工作区。

根本质上是一种针对文件系统的访问控制机制。

MCP 客户端根特性的设计,主要从以下几方面考虑。

  1. 安全边界控制。让服务器只访问被明确允许的目录和文件,从而限制服务器对文件系统的访问范围,防止服务器访问敏感或未授权的文件。

  2. 最小权限原则。服务器只有需要操作文件系统时,才向客户端申请根列表,减少权限过大带来的安全风险。

  3. 用户控制和透明度。服务器需要操作文件系统时,向客户端申请根列表,由用户选择同意或拒绝,操作过程对用户透明。

  4. 多项目隔离。服务器在操作不同项目时申请不同的根列表,实现多项目隔离。

2.6.2 根交互示例

  1. 客户端声明根特性

支持根特性的 MCP 客户端,需要在客户端定义时声明此项能力。

{
"capabilities": {
"roots": {
"listChanged": true
}
}
}

"listChanged": true 表示客户端支持在根发生变化时发送通知。

  1. 服务器获取根列表

服务器需要操作文件系统时,向客户端请求根列表,请求示例如下:

{
"jsonrpc": "2.0",
"id": 1,
"method": "roots/list"
}

客户端收到请求后,返回根列表,响应示例如下:

{
"jsonrpc": "2.0",
"id": 1,
"result": {
"roots": [
{
"uri": "file:///home/user/projects/myproject",
"name": "My Project"
}
]
}
}
  1. 客户端发送根变更通知

客户端在根发生变化时,向服务器发送通知,通知示例如下:

{
"jsonrpc": "2.0",
"method": "notifications/roots/list_changed"
}

服务器在接到通知后,应该重新请求客户端获取根列表。

  1. 根交互示例

服务器与客户端关于根的交互示例如图所示:

2.6.3 什么是采样

MCP 为服务器提供了一种标准方式,通过客户端请求大模型采样(补全或生成内容)。此流程允许客户端保持对模型访问、选择和权限的控制,同时使服务器能够利用大模型的能力,而无需在服务器设置大模型的 API 密钥。

采样的本质是客户端为服务器调用大模型提供代理服务。

MCP 客户端采样特性的设计,主要从以下几方面考虑。

  1. 控制权分离与安全性。由客户端控制大模型的访问、选择和权限,服务器只关注功能实现,无需关注大模型的接入问题。大模型 apikey 由客户端统一管理,提高安全性。

  2. 实现智能代理行为。服务器可以在处理复杂任务时通过客户端代理,动态调用大模型能力。

  3. 灵活的模型选择机制。采样允许服务器建议特定模型,由客户端做最终决定。

  4. 多模态支持。采样支持文本、音频和图像交互,为复杂的 AI 应用场景提供基础。

2.6.4 采样交互示例

  1. 客户端声明采样特性

支持采样特性的 MCP 客户端,需要在客户端定义时声明此项能力。

{
"capabilities": {
"sampling": {}
}
}
  1. 服务器获取采样结果

服务器在运行过程中,需要用到大模型能力时,向客户端请求采样,请求示例如下:

{
"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"
}
}
  1. 采样交互示例

服务器与客户端关于采样的交互示例如图所示: