根路径
了解 MCP 中的根
根是 MCP 中的一个概念,用于定义服务器可以运行的边界。它们为客户端提供了一种将相关资源及其位置通知服务器的方法。
一、什么是 Roots?
root是客户端建议服务器应该关注的 URI。当客户端连接到服务器时,它会声明服务器应该使用哪些根。虽然 root 主要用于文件系统路径,但 root 可以是任何有效的 URI,包括 HTTP URL。
例如,根可以是:
file:///home/user/projects/myapp ##本地文件夹路径
https://api.example.com/v1 ##远程baseURL
二、为什么使用 Roots?
根有几个重要用途:
- 指导:它们会通知服务器相关资源和位置
- 清晰:根清楚地表明哪些资源是您的工作空间的一部分
- 组织:多个根允许您同时使用不同的资源
特别注释
roots也是比较坑爹的命名啊,《模型上下文协议中文网》需要做特别附注。
划重点
这是向客户端提供的能力,用于告诉服务端应该持有的运行边界。
本地文件场景
面向本地功能的MCP服务可能提供了增删改查本地文件的功能,但是作为一个通用服务,一般不写死目标很好理解吧,也就意味着将指定目标的职责留给客户端来运行时指定。这样既 灵活可扩展,又 保证安全性,防止 MCP 访问不应操作的资源。
远程Url场景
比如你为你家通用业务系统开发了对应的MCP服务,但是业务系统的请求地址一般不写死很好理解吧:
- 需要考虑域名过期、域名备案过期等非常规事件
- 需要考虑水平弹性等基本云服务形态
- 区分开发环境、测试环境、生产环境也是常规操作
- 区分API版本也是常规操作
重新划重点
Root的本质是“申明目标区域”的配置,因为正常服务端不应该写死配置。所以,Roots用于支持MCP服务端向MCP客户端提供配置的自由度。换句话说,如果MCP服务的业务逻辑就是完全写死的,那你也不需要使用根。
三、常见用例
附注:理解了特别注释,你应该可以很明确的理解以下主流场景了
root通常用于定义:
- 项目目录
- 存储库位置
- API 终端节点
- 配置位置
- 资源边界
四、Roots 的工作原理
当客户端支持 root 时,它会:
- 在连接期间声明功能
roots
- 向服务器提供建议的根列表
- 当根更改时通知服务器(如果支持)
虽然根是信息性的,而不是严格执行的,但服务器应该:
- 尊重提供的根
- 使用根 URI 查找和访问资源
- 确定根边界内的作优先级
最佳实践
使用root时:
- 仅建议必要的资源
- 对根使用清晰的描述性名称
- 监控 root 可访问性
- 正常处理根更改
范例
以下是典型的 MCP 客户端如何指定根:
{
"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)