Skip to content

根路径

了解 MCP 中的根

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

一、什么是 Roots?

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

例如,根可以是:

plaintext
file:///home/user/projects/myapp     ##本地文件夹路径
https://api.example.com/v1           ##远程baseURL

二、为什么使用 Roots?

根有几个重要用途:

  1. 指导:它们会通知服务器相关资源和位置
  2. 清晰:根清楚地表明哪些资源是您的工作空间的一部分
  3. 组织:多个根允许您同时使用不同的资源

特别注释

roots也是比较坑爹的命名啊,《模型上下文协议中文网》需要做特别附注。

划重点

这是向客户端提供的能力,用于告诉服务端应该持有的运行边界。

本地文件场景

面向本地功能的MCP服务可能提供了增删改查本地文件的功能,但是作为一个通用服务,一般不写死目标很好理解吧,也就意味着将指定目标的职责留给客户端来运行时指定。这样既 灵活可扩展,又 保证安全性,防止 MCP 访问不应操作的资源。

远程Url场景

比如你为你家通用业务系统开发了对应的MCP服务,但是业务系统的请求地址一般不写死很好理解吧:

  • 需要考虑域名过期、域名备案过期等非常规事件
  • 需要考虑水平弹性等基本云服务形态
  • 区分开发环境、测试环境、生产环境也是常规操作
  • 区分API版本也是常规操作
重新划重点

Root的本质是“申明目标区域”的配置,因为正常服务端不应该写死配置。所以,Roots用于支持MCP服务端向MCP客户端提供配置的自由度。换句话说,如果MCP服务的业务逻辑就是完全写死的,那你也不需要使用根。

三、常见用例

附注:理解了特别注释,你应该可以很明确的理解以下主流场景了

root通常用于定义:

  • 项目目录
  • 存储库位置
  • API 终端节点
  • 配置位置
  • 资源边界

四、Roots 的工作原理

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

  1. 在连接期间声明功能roots
  2. 向服务器提供建议的根列表
  3. 当根更改时通知服务器(如果支持)

虽然根是信息性的,而不是严格执行的,但服务器应该:

  1. 尊重提供的根
  2. 使用根 URI 查找和访问资源
  3. 确定根边界内的作优先级

最佳实践

使用root时:

  1. 仅建议必要的资源
  2. 对根使用清晰的描述性名称
  3. 监控 root 可访问性
  4. 正常处理根更改

范例

以下是典型的 MCP 客户端如何指定根:

json
{
  "roots": [
    {
      "uri": "file:///home/user/projects/frontend",    //告诉MCP服务,你别部署错了前端项目
      "name": "Frontend Repository"
    },
    {
      "uri": "https://api.example.com/v1",     //告诉MCP服务,你别调用错了地址
      "name": "API Endpoint"
    }
  ]
}

此配置表明客户端提供了2个根,建议服务器同时关注本地存储库和 API 终端节点,同时保持它们在逻辑上分开。

《模型上下文协议中文网》附注。

当 MCP服务被调用来执行任务时,虽然说不严格,但正常应该确保自身请求操作 不会超出 Root 的限制。例如:

允许的操作

  • readFile("file:///home/user/projects/frontend/index.html")
  • fetch("https://api.example.com/v1/users")

被拒绝的操作

  • readFile("file:///etc/passwd")(超出 Root)
  • fetch("https://malicious.com/attack")(超出 Root)