【MCP协议】客户端特性:根目录

84 阅读3分钟

模型上下文协议(MCP)为客户端向服务器暴露文件系统“根目录”提供了一种标准化方式。根目录定义了服务器在文件系统中的操作边界,使其能够明确可访问的目录和文件范围。支持该协议的客户端可应服务器请求提供根目录列表,并在列表变更时向服务器发送通知。

用户交互模型

在MCP协议中,根目录通常通过工作区或项目配置界面进行暴露。

例如,具体实现可提供工作区/项目选择器,允许用户指定服务器应有权访问的目录和文件。该功能还可与版本控制系统或项目文件的自动工作区检测功能结合使用。

不过,具体实现可自由采用任何适合自身需求的界面模式来暴露根目录——协议本身并不强制规定特定的用户交互模型。

能力声明

支持根目录功能的客户端必须在初始化时声明roots能力项:

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

其中listChanged字段用于声明当根目录列表变更时,客户端是否会发送通知。

协议消息

根目录获取

服务器可通过发送 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"
      }
    ]
  }
}

根目录列表变更通知

当根目录列表发生变更时,支持listChanged功能的客户端必须发送如下通知:

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

消息流程

mcp_root.png

数据类型

根目录(Root)

根定义包含以下内容:

  • uri:根的唯一标识符。在当前规范中,它必须是一个 file:// URI。
  • name:可选的人类可读名称,用于显示用途。

不同用例的根示例:

项目目录

{
  "uri": "file:///home/user/projects/myproject",
  "name": "My Project"
}

多个仓库

[  {    "uri""file:///home/user/repos/frontend",    "name""Frontend Repository"  },  {    "uri""file:///home/user/repos/backend",    "name""Backend Repository"  }]

异常处理

客户端应针对常见错误情况返回标准的 JSON-RPC 错误:

  • 客户端不支持根(roots):-32601(方法未找到)
  • 内部错误:-32603

错误示例:

{
  "jsonrpc": "2.0",
  "id"1,
  "error": {
    "code": -32601,
    "message""Roots not supported",
    "data": {
      "reason": "Client does not have roots capability"
    }
  }
}

安全注意事项

客户端必须:

  • 仅暴露具有适当权限的根目录
  • 验证所有根 URI,防止路径遍历攻击
  • 实施适当的访问控制
  • 监控根目录的可访问性

服务器应当:

  • 处理根目录不可用的情况
  • 在操作过程中遵守根目录边界
  • 根据提供的根目录验证所有路径

实现指南

客户端应当:

  • 在向服务器公开根目录前,先征得用户同意
  • 提供清晰的根目录管理界面
  • 在公开前验证根目录的可访问性
  • 监控根目录的变更

服务器应当:

  • 在使用前检查是否支持根目录功能
  • 妥善处理根目录列表的变更
  • 在操作中严格遵守根目录边界
  • 合理缓存根目录信息