1. 什么是根? #
根(Roots)定义了 MCP 服务器在文件系统中的操作边界。客户端向服务器暴露「可访问的目录」,服务器据此知道能读写哪些路径。
协议版本:2025-11-25
| 通俗理解 | 说明 |
|---|---|
| 工作区/项目目录 | 像 VS Code 的「打开文件夹」:用户选择目录,服务器只能访问这些目录 |
| 客户端提供 | 根由客户端维护,服务器通过 roots/list 请求获取 |
| 安全边界 | 防止服务器访问用户未授权的路径 |
2. 本章你将学到 #
- 根的作用与用户交互方式
- 能力声明与协议消息
- 根的数据结构(URI、name)
- 错误处理、安全与实现建议
3. 典型场景 #
用户用 VS Code 打开项目 ~/projects/myapp,并连接文件系统 MCP 服务器。VS Code(客户端)将 file:///home/user/projects/myapp 作为根暴露给服务器,服务器只能在该目录及其子目录内读写文件。
4. 能力 #
客户端必须在初始化时声明 roots 能力:
{
"capabilities": {
"roots": {
"listChanged": true
}
}
}| 字段 | 说明 |
|---|---|
listChanged |
为 true 时,根列表变化时客户端必须发送 notifications/roots/list_changed |
5. 协议消息 #
5.1 列出根(roots/list) #
服务器发送请求获取根列表:
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "roots/list"
}响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"roots": [
{
"uri": "file:///home/user/projects/myproject",
"name": "My Project"
}
]
}
}5.2 根列表变更通知 #
当根列表变化时(如用户切换工作区),客户端发送:
{
"jsonrpc": "2.0",
"method": "notifications/roots/list_changed"
}服务器收到后应重新调用 roots/list 获取更新后的列表。
6. 流程示意 #
sequenceDiagram
participant S as 服务器
participant C as 客户端
S->>C: roots/list
C-->>S: 根列表
Note over C: 用户切换工作区
C-->>S: notifications/roots/list_changed
S->>C: roots/list
C-->>S: 更新后的根列表
7. 数据结构 #
每个根包含:
| 字段 | 要求 | 说明 |
|---|---|---|
uri |
必须 | 根的唯一标识,当前必须为 file:// URI |
name |
可选 | 人类可读名称,用于 UI 展示 |
示例:单项目
{
"uri": "file:///home/user/projects/myproject",
"name": "My Project"
}示例:多仓库
[
{ "uri": "file:///home/user/repos/frontend", "name": "Frontend" },
{ "uri": "file:///home/user/repos/backend", "name": "Backend" }
]8. 错误处理 #
| 情况 | 错误码 |
|---|---|
| 客户端不支持根 | -32601(方法未找到) |
| 内部错误 | -32603 |
示例:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32601,
"message": "Roots not supported",
"data": { "reason": "Client does not have roots capability" }
}
}9. 安全与实现 #
9.1 客户端 #
| 要求 | 说明 |
|---|---|
| 权限 | 仅在权限适当的情况下暴露根 |
| 路径验证 | 验证所有根 URI,防止路径遍历 |
| 访问控制 | 实施适当的访问控制 |
| 用户同意 | 暴露前应当提示用户同意 |
| 可访问性 | 暴露前验证根可访问,并监控变化 |
9.2 服务器 #
| 要求 | 说明 |
|---|---|
| 能力检查 | 使用前应当检查根能力 |
| 遵守边界 | 在操作中必须遵守根边界 |
| 路径验证 | 根据提供的根验证所有路径 |
| 根不可用 | 应当妥善处理根变为不可用的情况 |