ai
  • index
  • 1.首页
  • 2.介绍
  • 3.架构概览
  • 4.服务器概念
  • 5.客户端概念
  • 6.版本控制
  • 7.连接到远程MCP服务器
  • 8.连接到本地MCP服务器
  • json_rpc
  • 9.构建一个MCP服务器
  • 10.检查员
  • 11.构建一个MCP客户端
  • 14.架构
  • 15.基础协议概述
  • 16.生命周期
  • 17.传输
  • 18.授权
  • 19.安全最佳实践
  • 20.取消
  • 21.Ping
  • 22.进展
  • 23.Roots
  • 24.采样
  • 25.启发
  • 26.服务器特性
  • 27.提示词
  • 28.资源
  • 29.工具
  • 30.完成
  • 31.日志记录
  • 32.分页
  • 33.架构参考
  • URI模板
  • 12.实现
  • http.server
  • 动态客户端注册协议
  • 受保护资源元数据
  • 授权服务器元数据
  • JWKS
  • PKCE
  • PyJWT
  • secrets
  • watchfiles
  • 实现authorization
  • 实现cancel
  • 实现completion
  • 实现logging
  • 实现pagination
  • 实现process
  • 实现transport
  • psutil
  • pytz
  • zoneinfo
  • contextlib
  • Starlette
  • mcp.1.starter
  • mcp.2.Resource
  • mcp.3.structured_output
  • mcp.4.prompts
  • mcp.5.context
  • mcp.6.streamable
  • mcp.7.lowlevel
  • mcp.8.Completion
  • mcp.9.Elicitation
  • mcp.10.oauth
  • mcp.11.integration
  • mcp.12.best
  • mysql-mcp
  • databases
  • uvicorn
  • asynccontextmanager
  • AsyncExitStack
  • streamable
  • aiohttp
  • publish
  • email
  • schedule
  • twine
  • 1.教学文档总览
  • 2.教师使用指南
  • 3.教学系统快速参考
  • 4.新生入门指南
  • 5.学生使用指南
  • 1.Roots概述
  • 2.核心概念
    • 2.1 什么是根源功能?
    • 2.2 工作原理
  • 3.用户交互模型
    • 3.1 界面设计
  • 4.功能声明
    • 4.1 能力声明
  • 5.协议消息
    • 5.1 列出根节点
      • 5.1.1 请求
      • 5.1.2 响应
    • 5.2 根列表变更通知
  • 6.消息流程
    • 6.1 典型交互流程
    • 6.2 流程说明
  • 7.数据类型
    • 7.1 根(Root)定义
      • 7.1.1 必需字段
      • 7.1.2 可选字段
    • 7.2 使用场景示例
      • 7.2.1 项目目录
      • 7.2.2 多个代码库
  • 8.错误处理
    • 8.1 标准错误码
      • 8.1.1 常见错误类型
      • 8.1.2 错误响应示例
    • 8.2 错误处理最佳实践
  • 9.安全考量
    • 9.1 客户端安全要求
      • 9.1.1 访问控制
      • 9.1.2 路径验证
    • 9.2 服务器安全要求
      • 9.2.1 边界尊重
      • 9.2.2 权限验证
  • 10.实现指南
    • 10.1 客户端实现建议
      • 10.1.1 用户界面
      • 10.1.2 验证机制
    • 10.2 服务器实现建议
      • 10.2.1 能力检查
      • 10.2.2 缓存策略
  • 11.最佳实践
    • 11.1 根目录管理
    • 11.2 变更通知
    • 11.3 错误处理
    • 11.4 性能优化
  • 12.使用场景
    • 12.1 开发环境
    • 12.2 生产环境
  • 13.代码实现示例
    • 13.1 Python 实现示例
    • 13.2 JavaScript 实现示例
  • 14.高级功能
    • 14.1 动态根目录管理
    • 14.2 权限验证
  • 15.代码实现示例
    • 15.1 Python 实现示例
    • 15.2 JavaScript 实现示例
  • 16.总结

1.Roots概述 #

Model Context Protocol (MCP) 的根源(Roots)功能为客户端提供了一种标准化方式,用于向服务器暴露文件系统的"根目录"。根目录定义了服务器在文件系统中的操作边界,使其能够明确可访问的目录和文件范围。

2.核心概念 #

2.1 什么是根源功能? #

根源功能是MCP协议中的一个重要组件,用于:

  • 定义访问边界:明确服务器可以访问的文件系统范围
  • 提供安全控制:限制服务器只能访问指定的目录
  • 支持多项目:允许同时管理多个项目或代码库
  • 动态更新:支持根目录列表的实时变更通知

2.2 工作原理 #

  1. 客户端在初始化时声明支持roots能力
  2. 服务器请求获取可用的根目录列表
  3. 客户端返回当前可访问的根目录信息
  4. 客户端在根目录变更时主动通知服务器

3.用户交互模型 #

3.1 界面设计 #

MCP中的Roots通常通过工作区或项目配置界面暴露。实现方案可以提供一个工作区/项目选择器,允许用户选择服务器应有权访问的目录和文件。

3.1.1 常见实现方式:

  • 工作区选择器界面
  • 项目文件中的自动工作区检测
  • 版本控制系统集成
  • 手动配置界面

3.1.2 重要说明: 协议本身并未强制规定任何特定的用户交互模型,具体实现可以自由选择适合其需求的任何接口模式。

4.功能声明 #

4.1 能力声明 #

支持roots的客户端必须在初始化期间声明roots能力:

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

参数说明:

  • listChanged:表示客户端在根列表变更时是否会发出通知
    • true:支持变更通知
    • false:不支持变更通知

5.协议消息 #

5.1 列出根节点 #

5.1.1 请求 #

服务器发送roots/list请求来获取根目录列表:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "roots/list"
}

5.1.2 响应 #

客户端返回当前可用的根目录列表:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "roots": [
      {
        "uri": "file:///home/user/projects/myproject",
        "name": "My Project"
      }
    ]
  }
}

5.2 根列表变更通知 #

当根节点发生变更时,支持listChanged的客户端必须发送通知:

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

6.消息流程 #

6.1 典型交互流程 #

服务器 → 客户端:根目录/列表请求
客户端 → 服务器:可用根节点列表
客户端 → 服务器:根列表变更通知(当发生变更时)
服务器 → 客户端:根目录/列表请求(获取更新)
客户端 → 服务器:更新后的根节点列表

6.2 流程说明 #

  1. 发现阶段:服务器请求获取可用的根目录
  2. 响应阶段:客户端返回当前可访问的根目录列表
  3. 变更阶段:当根目录发生变化时,客户端主动通知服务器
  4. 更新阶段:服务器重新请求获取最新的根目录列表

7.数据类型 #

7.1 根(Root)定义 #

一个根定义包含以下字段:

7.1.1 必需字段 #

  • uri:根节点的唯一标识符
    • 必须是file://格式的URI
    • 用于唯一标识根目录位置

7.1.2 可选字段 #

  • name:用于显示的人类可读名称
    • 便于用户识别和管理
    • 可以包含项目名称、描述等信息

7.2 使用场景示例 #

7.2.1 项目目录 #

单个项目目录的根定义:

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

7.2.2 多个代码库 #

管理多个代码库的根定义:

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

8.错误处理 #

8.1 标准错误码 #

客户端应该返回标准JSON-RPC错误以处理常见故障情况:

8.1.1 常见错误类型 #

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

8.1.2 错误响应示例 #

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

8.2 错误处理最佳实践 #

  1. 优雅降级:当不支持roots功能时,提供清晰的错误信息
  2. 详细说明:在错误响应中包含具体的失败原因
  3. 用户友好:提供可理解的错误消息

9.安全考量 #

9.1 客户端安全要求 #

客户端必须实施以下安全措施:

9.1.1 访问控制 #

  • 仅向具有适当权限的用户公开根目录
  • 验证所有根URI以防止路径遍历攻击
  • 实施适当的访问控制机制
  • 监控root访问权限

9.1.2 路径验证 #

  • 确保所有URI都是有效的文件路径
  • 防止访问系统关键目录
  • 验证路径的合法性

9.2 服务器安全要求 #

服务器应该遵循以下安全原则:

9.2.1 边界尊重 #

  • 在操作过程中严格尊重根边界
  • 验证所有路径是否符合提供的根目录
  • 处理根节点不可用的情况

9.2.2 权限验证 #

  • 确保所有操作都在允许的范围内
  • 验证文件访问权限
  • 实施适当的错误处理

10.实现指南 #

10.1 客户端实现建议 #

客户端应该实施以下功能:

10.1.1 用户界面 #

  • 在向服务器暴露根目录前,需先征得用户同意
  • 为根管理提供清晰的用户界面
  • 支持动态添加和移除根目录

10.1.2 验证机制 #

  • 在对外公开前验证根目录的可访问性
  • 监控root权限变更
  • 提供根目录状态的可视化显示

10.2 服务器实现建议 #

服务器应该实施以下功能:

10.2.1 能力检查 #

  • 使用前检查root权限能力
  • 优雅处理根列表变更
  • 在操作中严格尊重根边界

10.2.2 缓存策略 #

  • 适当缓存根信息以提高性能
  • 在根列表变更时及时更新缓存
  • 实现高效的根目录查找机制

11.最佳实践 #

11.1 根目录管理 #

  • 最小权限原则:只暴露必要的目录
  • 用户控制:让用户完全控制哪些目录可以被访问
  • 清晰命名:使用有意义的根目录名称

11.2 变更通知 #

  • 及时通知:在根目录变更时立即发送通知
  • 批量处理:避免过于频繁的变更通知
  • 状态同步:确保服务器和客户端的根目录状态一致

11.3 错误处理 #

  • 详细日志:记录所有根目录相关的操作
  • 用户反馈:向用户提供清晰的错误信息
  • 恢复机制:提供根目录访问失败时的恢复选项

11.4 性能优化 #

  • 缓存策略:合理缓存根目录信息
  • 批量操作:支持批量根目录操作
  • 异步处理:对于大量根目录的处理使用异步方式

12.使用场景 #

12.1 开发环境 #

  • 多项目开发:同时管理多个项目目录
  • 代码库管理:管理不同的代码仓库
  • 工作区切换:在不同工作区之间快速切换

12.2 生产环境 #

  • 安全隔离:确保服务器只能访问指定的目录
  • 权限控制:精确控制文件系统访问权限
  • 审计跟踪:记录所有根目录访问操作

13.代码实现示例 #

13.1 Python 实现示例 #

# 导入json模块,用于数据序列化和打印
import json
# 导入os模块,用于处理路径和文件名
import os
# 从typing模块导入类型注解
from typing import List, Dict, Optional
# 从pathlib模块导入Path类,用于路径操作
from pathlib import Path

# 定义根目录管理类
class MCPRootsManager:
    # 构造函数,初始化根目录列表和变更支持标志
    def __init__(self):
        # 存储根目录信息的列表,每个元素是字典
        self.roots: List[Dict[str, str]] = []
        # 是否支持根目录列表变更通知
        self.list_changed_support = True

    # 添加根目录的方法,参数为uri和可选的名称
    def add_root(self, uri: str, name: Optional[str] = None) -> bool:
        """添加根目录"""
        # 验证URI的有效性
        if not self._validate_uri(uri):
            return False

        # 检查该URI是否已存在于根目录列表中
        for root in self.roots:
            if root["uri"] == uri:
                return False

        # 构造根目录信息字典
        root_info = {
            "uri": uri,
            "name": name or os.path.basename(uri)
        }

        # 将根目录信息添加到列表中
        self.roots.append(root_info)
        return True

    # 移除根目录的方法,参数为uri
    def remove_root(self, uri: str) -> bool:
        """移除根目录"""
        # 遍历根目录列表,查找匹配的uri
        for i, root in enumerate(self.roots):
            if root["uri"] == uri:
                # 删除对应的根目录
                del self.roots[i]
                return True
        return False

    # 获取所有根目录的方法
    def get_roots(self) -> List[Dict[str, str]]:
        """获取所有根目录"""
        # 返回根目录列表的副本
        return self.roots.copy()

    # 验证URI有效性的方法
    def _validate_uri(self, uri: str) -> bool:
        """验证URI的有效性"""
        # 检查URI是否以"file://"开头
        if not uri.startswith("file://"):
            return False

        # 提取路径部分,去掉"file://"前缀
        path = uri[7:]  # 移除 "file://" 前缀

        # 检查路径是否存在且是目录
        try:
            path_obj = Path(path)
            return path_obj.exists() and path_obj.is_dir()
        except Exception:
            return False

    # 检查给定路径是否在允许的根目录范围内
    def is_path_allowed(self, path: str) -> bool:
        """检查路径是否在允许的根目录范围内"""
        # 遍历所有根目录,检查路径前缀
        for root in self.roots:
            root_path = root["uri"][7:]  # 移除 "file://" 前缀
            if path.startswith(root_path):
                return True
        return False

    # 获取能力声明的方法
    def get_capabilities(self) -> Dict:
        """获取能力声明"""
        # 返回支持的能力字典
        return {
            "roots": {
                "listChanged": self.list_changed_support
            }
        }

# 使用示例
# 创建根目录管理器实例
roots_manager = MCPRootsManager()

# 添加根目录,指定URI和名称
roots_manager.add_root("file:///home/user/projects/myproject", "My Project")
roots_manager.add_root("file:///home/user/repos/frontend", "Frontend Repository")

# 获取根目录列表
roots = roots_manager.get_roots()
# 以格式化的方式打印根目录列表
print(json.dumps(roots, indent=2))

# 检查某个路径是否被允许访问
allowed = roots_manager.is_path_allowed("/home/user/projects/myproject/src/main.py")
# 打印检查结果
print(f"Path allowed: {allowed}")

13.2 JavaScript 实现示例 #

// 定义根目录管理类
class MCPRootsManager {
    // 构造函数,初始化根目录数组和变更通知支持标志
    constructor() {
        // 存储所有根目录信息的数组
        this.roots = [];
        // 是否支持根目录变更通知
        this.listChangedSupport = true;
    }

    // 添加根目录方法,参数为uri和可选名称
    addRoot(uri, name = null) {
        // 校验URI是否合法
        if (!this.validateUri(uri)) {
            return false;
        }

        // 检查该URI是否已存在于根目录列表中
        if (this.roots.some(root => root.uri === uri)) {
            return false;
        }

        // 构造根目录信息对象
        const rootInfo = {
            uri: uri,
            // 如果未指定名称,则使用basename
            name: name || this.getBasename(uri)
        };

        // 将根目录信息添加到roots数组
        this.roots.push(rootInfo);
        return true;
    }

    // 移除根目录方法,参数为uri
    removeRoot(uri) {
        // 查找指定uri的根目录索引
        const index = this.roots.findIndex(root => root.uri === uri);
        // 如果找到则移除并返回true
        if (index !== -1) {
            this.roots.splice(index, 1);
            return true;
        }
        // 未找到则返回false
        return false;
    }

    // 获取所有根目录列表的方法
    getRoots() {
        // 返回roots数组的浅拷贝
        return [...this.roots];
    }

    // 校验URI是否合法的方法
    validateUri(uri) {
        // 必须以"file://"开头
        if (!uri.startsWith('file://')) {
            return false;
        }

        // 实际实现中应检查文件系统,这里简化处理直接返回true
        return true;
    }

    // 检查给定路径是否在允许的根目录范围内
    isPathAllowed(path) {
        // 遍历所有根目录,判断路径是否以根目录路径为前缀
        return this.roots.some(root => {
            // 移除"file://"前缀,得到实际路径
            const rootPath = root.uri.substring(7);
            // 检查path是否以rootPath开头
            return path.startsWith(rootPath);
        });
    }

    // 获取能力声明的方法
    getCapabilities() {
        // 返回支持的能力对象
        return {
            roots: {
                listChanged: this.listChangedSupport
            }
        };
    }

    // 获取URI的basename(最后一级目录或文件名)
    getBasename(uri) {
        // 移除"file://"前缀
        const path = uri.substring(7);
        // 以"/"分割并取最后一项
        return path.split('/').pop();
    }
}

// 使用示例

// 创建根目录管理器实例
const rootsManager = new MCPRootsManager();

// 添加根目录,指定URI和名称
rootsManager.addRoot('file:///home/user/projects/myproject', 'My Project');
rootsManager.addRoot('file:///home/user/repos/frontend', 'Frontend Repository');

// 获取根目录列表
const roots = rootsManager.getRoots();
// 以格式化的方式打印根目录列表
console.log(JSON.stringify(roots, null, 2));

// 检查某个路径是否被允许访问
const allowed = rootsManager.isPathAllowed('/home/user/projects/myproject/src/main.js');
// 打印检查结果
console.log(`Path allowed: ${allowed}`);

14.高级功能 #

14.1 动态根目录管理 #

# 定义动态根目录管理器类,继承自MCPRootsManager
class DynamicRootsManager(MCPRootsManager):
    # 构造函数,初始化父类并创建监控器列表
    def __init__(self):
        super().__init__()
        self.watchers = []

    # 监控指定目录的变化
    def watch_directory(self, directory: str):
        """监控目录变化"""
        # 这里应实现文件系统监控逻辑
        pass

    # 根目录变更时的回调方法
    def on_roots_changed(self):
        """根目录变更时的回调"""
        # 构造根目录变更通知消息
        notification = {
            "jsonrpc": "2.0",
            "method": "notifications/roots/list_changed"
        }
        # 返回通知消息
        return notification

14.2 权限验证 #

# 定义安全根目录管理器,继承自MCPRootsManager
class SecureRootsManager(MCPRootsManager):
    # 构造函数,初始化父类并创建权限字典
    def __init__(self):
        super().__init__()
        self.permissions = {}

    # 设置指定URI的权限
    def set_permissions(self, uri: str, permissions: Dict):
        """设置根目录权限"""
        self.permissions[uri] = permissions

    # 检查某个URI是否有指定操作的权限
    def check_permission(self, uri: str, operation: str) -> bool:
        """检查操作权限"""
        # 如果该URI没有设置权限,返回False
        if uri not in self.permissions:
            return False
        # 返回该操作的权限值,默认为False
        return self.permissions[uri].get(operation, False)

15.代码实现示例 #

15.1 Python 实现示例 #

# 导入json模块,用于序列化和打印数据
import json
# 导入os模块,用于处理路径和文件名
import os
# 从typing模块导入类型注解
from typing import List, Dict, Optional
# 从pathlib模块导入Path类,用于路径操作
from pathlib import Path

# 定义根目录管理类
class MCPRootsManager:
    # 构造函数,初始化根目录列表和变更支持标志
    def __init__(self):
        # 存储根目录信息的列表,每个元素是字典
        self.roots: List[Dict[str, str]] = []
        # 是否支持根目录列表变更通知
        self.list_changed_support = True

    # 添加根目录的方法,参数为uri和可选的名称
    def add_root(self, uri: str, name: Optional[str] = None) -> bool:
        """添加根目录"""
        # 验证URI的有效性
        if not self._validate_uri(uri):
            return False

        # 检查该URI是否已存在于根目录列表中
        for root in self.roots:
            if root["uri"] == uri:
                return False

        # 构造根目录信息字典
        root_info = {
            "uri": uri,
            "name": name or os.path.basename(uri)
        }

        # 将根目录信息添加到列表中
        self.roots.append(root_info)
        return True

    # 移除根目录的方法,参数为uri
    def remove_root(self, uri: str) -> bool:
        """移除根目录"""
        # 遍历根目录列表,查找匹配的uri
        for i, root in enumerate(self.roots):
            if root["uri"] == uri:
                # 删除对应的根目录
                del self.roots[i]
                return True
        return False

    # 获取所有根目录的方法
    def get_roots(self) -> List[Dict[str, str]]:
        """获取所有根目录"""
        # 返回根目录列表的副本
        return self.roots.copy()

    # 验证URI有效性的方法
    def _validate_uri(self, uri: str) -> bool:
        """验证URI的有效性"""
        # 必须以"file://"开头
        if not uri.startswith("file://"):
            return False

        # 提取路径部分,移除"file://"前缀
        path = uri[7:]

        # 检查路径是否存在且是目录
        try:
            path_obj = Path(path)
            return path_obj.exists() and path_obj.is_dir()
        except Exception:
            return False

    # 检查给定路径是否在允许的根目录范围内
    def is_path_allowed(self, path: str) -> bool:
        """检查路径是否在允许的根目录范围内"""
        # 遍历所有根目录,检查路径前缀
        for root in self.roots:
            root_path = root["uri"][7:]  # 移除 "file://" 前缀
            if path.startswith(root_path):
                return True
        return False

    # 获取能力声明的方法
    def get_capabilities(self) -> Dict:
        """获取能力声明"""
        # 返回支持的能力字典
        return {
            "roots": {
                "listChanged": self.list_changed_support
            }
        }

# 使用示例
# 创建根目录管理器实例
roots_manager = MCPRootsManager()

# 添加根目录,指定URI和名称
roots_manager.add_root("file:///home/user/projects/myproject", "My Project")
roots_manager.add_root("file:///home/user/repos/frontend", "Frontend Repository")

# 获取根目录列表
roots = roots_manager.get_roots()
# 以格式化的方式打印根目录列表
print(json.dumps(roots, indent=2))

# 检查某个路径是否被允许访问
allowed = roots_manager.is_path_allowed("/home/user/projects/myproject/src/main.py")
# 打印检查结果
print(f"Path allowed: {allowed}")

15.2 JavaScript 实现示例 #

// 定义根目录管理类
class MCPRootsManager {
    // 构造函数,初始化根目录数组和变更通知支持标志
    constructor() {
        // 存储所有根目录信息的数组
        this.roots = [];
        // 是否支持根目录变更通知
        this.listChangedSupport = true;
    }

    // 添加根目录方法,参数为uri和可选名称
    addRoot(uri, name = null) {
        // 校验URI是否合法
        if (!this.validateUri(uri)) {
            return false;
        }

        // 检查该URI是否已存在于根目录列表中
        if (this.roots.some(root => root.uri === uri)) {
            return false;
        }

        // 构造根目录信息对象
        const rootInfo = {
            uri: uri,
            // 如果未指定名称,则使用basename
            name: name || this.getBasename(uri)
        };

        // 将根目录信息添加到roots数组
        this.roots.push(rootInfo);
        return true;
    }

    // 移除根目录方法,参数为uri
    removeRoot(uri) {
        // 查找指定uri的根目录索引
        const index = this.roots.findIndex(root => root.uri === uri);
        // 如果找到则移除并返回true
        if (index !== -1) {
            this.roots.splice(index, 1);
            return true;
        }
        // 未找到则返回false
        return false;
    }

    // 获取所有根目录列表的方法
    getRoots() {
        // 返回roots数组的浅拷贝
        return [...this.roots];
    }

    // 校验URI是否合法(这里只检查前缀)
    validateUri(uri) {
        // 必须以'file://'开头
        if (!uri.startsWith('file://')) {
            return false;
        }

        // 实际实现中应检查文件系统,这里简化处理
        return true;
    }

    // 检查给定路径是否在允许的根目录范围内
    isPathAllowed(path) {
        // 遍历所有根目录,检查路径前缀
        return this.roots.some(root => {
            // 移除"file://"前缀
            const rootPath = root.uri.substring(7);
            // 检查路径是否以根目录为前缀
            return path.startsWith(rootPath);
        });
    }

    // 获取能力声明的方法
    getCapabilities() {
        // 返回支持的能力字典
        return {
            roots: {
                listChanged: this.listChangedSupport
            }
        };
    }

    // 获取URI的basename(最后一级目录或文件名)
    getBasename(uri) {
        // 移除"file://"前缀
        const path = uri.substring(7);
        // 以'/'分割并取最后一项
        return path.split('/').pop();
    }
}

// 使用示例
// 创建根目录管理器实例
const rootsManager = new MCPRootsManager();

// 添加根目录,指定URI和名称
rootsManager.addRoot('file:///home/user/projects/myproject', 'My Project');
rootsManager.addRoot('file:///home/user/repos/frontend', 'Frontend Repository');

// 获取根目录列表
const roots = rootsManager.getRoots();
// 以格式化的方式打印根目录列表
console.log(JSON.stringify(roots, null, 2));

// 检查某个路径是否被允许访问
const allowed = rootsManager.isPathAllowed('/home/user/projects/myproject/src/main.js');
// 打印检查结果
console.log(`Path allowed: ${allowed}`);

16.总结 #

MCP的根源功能为文件系统访问提供了强大而安全的控制机制。通过合理实施根目录管理、安全控制和变更通知,可以构建出高效、安全的文件系统访问系统。

记住,根源功能是MCP协议的重要组成部分,正确实现可以大大提升系统的安全性和可用性。通过遵循本文档中的最佳实践和实现指南,您可以构建出可靠、安全的根源管理系统。

访问验证

请输入访问令牌

Token不正确,请重新输入