导航菜单

  • 1.什么是MCP
  • 2.架构概览
  • 3.理解MCP服务器
  • 4.理解MCP客户端
  • 5.版本控制
  • 6.连接本地MCP服务器
  • 7.连接远程MCP服务器
  • 8.构建MCP服务器
  • 9.构建MCP客户端
  • 10.SDKs
  • 11.理解MCP中的授权
  • 12.安全最佳实践
  • 13.MCP Inspector
  • 14.规范
  • 15.关键变更
  • 16.架构
  • 17.基础协议概述
  • 18.生命周期
  • 19.传输
  • 20.授权
  • 21.取消
  • 22.Ping
  • 23.进度
  • 24.任务
  • 25.根
  • 26.采样
  • 27.引导
  • 29.提示
  • 30.资源
  • 31.工具
  • 32.补全
  • 33.日志
  • 34.分页
  • 35.模式参考
  • Keycloak
  • 28.服务器功能
  • 1. 什么是根?
  • 2. 本章你将学到
  • 3. 典型场景
  • 4. 能力
  • 5. 协议消息
    • 5.1 列出根(roots/list)
    • 5.2 根列表变更通知
  • 6. 流程示意
  • 7. 数据结构
  • 8. 错误处理
  • 9. 安全与实现
    • 9.1 客户端
    • 9.2 服务器

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 服务器 #

要求 说明
能力检查 使用前应当检查根能力
遵守边界 在操作中必须遵守根边界
路径验证 根据提供的根验证所有路径
根不可用 应当妥善处理根变为不可用的情况
← 上一节 24.任务 下一节 26.采样 →

访问验证

请输入访问令牌

Token不正确,请重新输入