2.6 MCP 客户端特性:根 / 采样
MCP 为客户端的实现,提供了两个特性:
- 根(Roots)
- 采样(Sampling)
基于这两个特性,客户端可以为服务器提供文件系统访问控制和大模型代理服务。
2.6.1 什么是根
MCP 为客户端提供了一种标准方式,使其能够向服务器暴露文件系统的“根”。根定义了服务器在文件系统中可以操作的边界,使它们能够理解自己有权访问哪些目录和文件。服务器可以从支持的客户端请求根列表,并在该列表发生变化时接收通知。
MCP 中的根通常通过工作区或项目配置界面暴露。例如,主机可以提供工作区 / 项目选择器,允许用户选择服务器应有权访问的目录和文件,也可以通过版本控制系统或打开的文件自动检测工作区。
根本质上是一种针对文件系统的访问控制机制。
MCP 客户端根特性的设计,主要从以下几方面考虑。
-
安全边界控制。让服务器只访问被明确允许的目录和文件,从而限制服务器对文件系统的访问范围,防止服务器访问敏感或未授权的文件。
-
最小权限原则。服务器只有需要操作文件系统时,才向客户端申请根列表,减少权限过大带来的安全风险。
-
用户控制和透明度。服务器需要操作文件系统时,向客户端申请根列表,由用户选择同意或拒绝,操作过程对用户透明。
-
多项目隔离。服务器在操作不同项目时申请不同的根列表,实现多项目隔离。
2.6.2 根交互示例
- 客户端声明根特性
支持根特性的 MCP 客户端,需要在客户端定义时声明此项能力。
{ "capabilities": { "roots": { "listChanged": true } }}"listChanged": true 表示客户端支持在根发生变化时发送通知。
- 服务器获取根列表
服务器需要操作文件系统时,向客户端请求根列表,请求示例如下:
{ "jsonrpc": "2.0", "id": 1, "method": "roots/list"}客户端收到请求后,返回根列表,响应示例如下:
{ "jsonrpc": "2.0", "id": 1, "result": { "roots": [ { "uri": "file:///home/user/projects/myproject", "name": "My Project" } ] }}- 客户端发送根变更通知
客户端在根发生变化时,向服务器发送通知,通知示例如下:
{ "jsonrpc": "2.0", "method": "notifications/roots/list_changed"}服务器在接到通知后,应该重新请求客户端获取根列表。
- 根交互示例
服务器与客户端关于根的交互示例如图所示:
2.6.3 什么是采样
MCP 为服务器提供了一种标准方式,通过客户端请求大模型采样(补全或生成内容)。此流程允许客户端保持对模型访问、选择和权限的控制,同时使服务器能够利用大模型的能力,而无需在服务器设置大模型的 API 密钥。
采样的本质是客户端为服务器调用大模型提供代理服务。
MCP 客户端采样特性的设计,主要从以下几方面考虑。
-
控制权分离与安全性。由客户端控制大模型的访问、选择和权限,服务器只关注功能实现,无需关注大模型的接入问题。大模型 apikey 由客户端统一管理,提高安全性。
-
实现智能代理行为。服务器可以在处理复杂任务时通过客户端代理,动态调用大模型能力。
-
灵活的模型选择机制。采样允许服务器建议特定模型,由客户端做最终决定。
-
多模态支持。采样支持文本、音频和图像交互,为复杂的 AI 应用场景提供基础。
2.6.4 采样交互示例
- 客户端声明采样特性
支持采样特性的 MCP 客户端,需要在客户端定义时声明此项能力。
{ "capabilities": { "sampling": {} }}- 服务器获取采样结果
服务器在运行过程中,需要用到大模型能力时,向客户端请求采样,请求示例如下:
{ "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" }}- 采样交互示例
服务器与客户端关于采样的交互示例如图所示: