在 MCP 中理解根 (Roots)

根是 MCP 中的一个概念,用于定义服务器操作的边界。它们为客户端提供了一种通知服务器相关资源及其位置的方式。

什么是根 (Roots)?

根是客户端建议服务器应关注的 URI。当客户端连接到服务器时,它会声明服务器应该处理哪些根。根主要用于文件系统路径,但也可以是任何有效的 URI,包括 HTTP URL。

例如,根可以是:

  1. file:///home/user/projects/myapp
  2. https://api.example.com/v1

为什么使用根?

根有几个重要的作用:

  1. 指导:它们通知服务器相关的资源和位置
  2. 清晰:根明确了哪些资源是工作区的一部分
  3. 组织:多个根让你可以同时处理不同的资源

根是如何工作的?

当客户端支持根时,它会:

  1. 在连接时声明 roots 功能
  2. 提供建议的根列表给服务器
  3. 当根发生变化时,通知服务器(如果支持)

虽然根是信息性的,不是强制执行的,但服务器应当:

  1. 尊重提供的根
  2. 使用根 URI 来定位和访问资源
  3. 优先在根的边界内进行操作

常见的用例

根通常用于定义:

  • 项目目录
  • 仓库位置
  • API 端点
  • 配置位置
  • 资源边界

最佳实践

在使用根时:

  1. 仅建议必要的资源
  2. 使用清晰、描述性的根名称
  3. 监控根的可访问性
  4. 优雅地处理根的变化

示例

以下是一个典型的 MCP 客户端如何暴露根的示例:

  1. {
  2. "roots": [
  3. {
  4. "uri": "file:///home/user/projects/frontend",
  5. "name": "前端仓库"
  6. },
  7. {
  8. "uri": "https://api.example.com/v1",
  9. "name": "API 端点"
  10. }
  11. ]
  12. }

这个配置建议服务器同时关注一个本地仓库和一个 API 端点,并保持它们在逻辑上的分离。