关于 Python (MCP) Filesystem Server
Python (MCP) Filesystem Server 是 Python 服务,让 MCP 客户端在配置的目录内操作文件。工具覆盖常见文件和目录任务,并通过解析路径检查来限制访问范围。
主要功能
- 01限制在配置目录内访问
- 02读取单个或多个文本文件
- 03写入和编辑并预览差异
- 04创建和列出目录
- 05搜索路径并查看元数据
- 06移动文件且不覆盖目标
适用场景
- 01为 AI 工作流读取项目文件
- 02编辑文本文件并预览改动
- 03浏览允许目录中的目录树
- 04搜索文件并查看其元数据
MCP 相关
使用 `fastmcp` 实现 MCP 服务,通过标准输入输出通信。它向 MCP 客户端提供文件系统工具,并将操作限制在启动时指定的目录内。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Python(MCP)文件系统服务
此仓库包含一个健壮的 Python 版 Model Context Protocol(MCP)文件系统服务。它使 AI 模型和应用程序能够通过一组定义好的工具,安全地与主机系统的文件目录交互,执行读取、写入、移动和列出文件及目录等操作。
此服务基于 fastmcp 库构建,并遵循 Model Context Protocol,为 AI 工具在指定边界内管理和访问文件提供标准化方式。
它的灵感来自这个 TypeScript 示例实现。
功能
- 安全的目录访问: 所有文件操作都严格限制在预先指定的允许目录列表中,防止未经授权地访问文件系统的其他部分。
- 全面的文件操作:
read_file:读取单个 UTF-8 文本文件的完整内容。对于二进制文件等无效 UTF-8 文件,会报告错误,而不会返回乱码。read_multiple_files:高效读取多个文件的内容,并返回带有清晰路径引用的结果。write_file:创建新文件,或使用指定内容覆盖现有文件。edit_file:对文本文件应用基于行的编辑,并可通过 Git 风格的差异预览更改。create_directory:创建新目录(包括嵌套目录),或确保目录存在。list_directory:获取指定路径下文件和子目录的详细列表。directory_tree:递归生成文件和目录的 JSON 树状结构,清晰展示层级关系。move_file:移动或重命名文件和目录。若目标位置已存在,则拒绝覆盖。search_files:递归搜索与模式匹配的文件和目录,并可指定排除模式。get_file_info:获取文件或目录的详细元数据(大小、时间戳、权限)。在 Linux 上,报告的创建时间是 inode 更改时间,这是该平台唯一提供的时间信息。
- 动态配置允许的目录: 可通过命令行参数配置服务能够访问的具体目录。
- 健壮的日志记录: 集成全面的日志记录功能,支持不同日志级别,并可输出到
stderr(符合 MCP 要求)以及可选的轮换日志文件。 - 错误处理: 针对访问被拒绝、文件不存在或权限错误等常见问题,提供详细的错误消息。
- 换行符规范化: 在
edit_file操作中一致处理\r\n和\n换行符。 - 路径规范化: 在检查路径是否位于允许范围内之前,会解析请求路径和允许的目录。因此,符号链接、
..路径段和 Windows 8.3 短文件名既无法逃出允许的目录树,也不会导致其中合法的路径被错误拒绝。
开始使用
前置条件
- Python 3.10+:与
pyproject.toml中的requires-python一致。CI 会在 Linux 和 Windows 上测试 3.10、3.12 和 3.13。 fastmcp库:此服务使用fastmcp库处理 MCP 协议。你需要安装该库。
安装
-
克隆仓库:
git clone https://github.com/hypercat/PyMCP-FS.git cd PyMCP-FS -
使用
uv安装依赖:uv sync此命令会根据
uv.lock安装,因此你获得的版本与 CI 测试所用版本相同。添加--no-dev可跳过测试工具的安装。
用法
运行 MCP 服务(main.py)
MCP 服务需要通过命令行参数接收允许访问的目录列表。它只会在指定路径范围内运行。
python3 main.py -d /path/to/allowed/dir1 /path/to/another/allowed/dir2 --log-level INFO --log-file mcp_server.log
参数:
-d、--directories:(必填) 服务允许访问的一个或多个目录路径。可以指定多个目录。--log-file:(可选) 用于写入服务日志的文件路径。日志会轮转,以防文件过大。--log-level:(可选) 要输出的最低日志级别。可选值为DEBUG、INFO、WARNING、ERROR。默认为INFO。
示例:
若要允许服务访问主目录下的 projects 文件夹和一个临时 data 文件夹:
uv run main.py -d ~/projects /tmp/data --log-level DEBUG --log-file mcp_debug.log
服务启动后,会通过标准输入(stdin)接收 MCP 消息,并通过标准输出(stdout)进行响应。
运行测试
测试套件涵盖路径验证与限制、文件操作辅助函数、 MCP 工具函数和服务启动。
uv sync
uv run pytest
tests/test_path_confinement.py 专门测试允许目录边界,
包括同级目录前缀和别名目录的情况。
test_mcp_server.py 既是集成检查,也是调试辅助工具。它会将
main.py 作为子进程启动,通过标准输入/输出执行 MCP initialize 握手,
并验证响应。单独运行该测试,即可查看完整的交互过程:
uv run test_mcp_server.py
CI 会在 Linux 和 Windows 上,使用 Python 3.10、3.12 和 3.13 运行完整测试套件。 只有所有任务均通过,拉取请求才能合并。
故障排除
如果遇到问题,请按以下清单检查:
- 检查命令行参数:确保为
main.py提供至少一个允许访问的目录。否则服务无法启动。 - 依赖项:确认环境与锁文件保持同步(
uv sync)。 - 权限:确保运行服务的用户对指定的允许访问目录和日志文件路径拥有读写权限。
- 检查日志(
mcp_debug.log):日志文件(尤其是使用--log-level DEBUG时)会详细记录服务的运行情况以及可能发生故障的位置。 - 遵循 MCP 协议:确保客户端按照 MCP 规范发送格式正确的 JSON-RPC 2.0 消息。服务通过
stdin接收消息,并通过stdout进行响应。 - 路径验证错误:如果看到“Access denied”错误,请确认请求的路径严格位于配置的允许访问目录内。路径会在完全解析后进行比较,因此符号链接会按其目标判断,而不是按链接所在位置判断。
edit_file匹配问题:如果edit_file报告“Could not find exact match”,请确认编辑操作中的oldText与文件内容完全一致,包括空白字符和换行符。
安全
所有文件操作都被限制在通过 --directories 传入的目录内。
进行包含性检查前,请求路径和允许访问的目录都会被完全解析,因此无法利用符号链接、.. 路径段或 Windows 8.3 短文件名越出允许的目录树。
本项目关注的安全属性就是这种路径限制。如果你发现绕过此限制的方法,请私下报告,而不要提交 issue。报告渠道和范围请参阅 SECURITY.md。
安全边界的严格程度取决于你允许访问的范围。将服务指向敏感目录或 /,就意味着连接的模型获得对该目录的全部访问权限。
扩展服务
此服务为文件系统交互提供了坚实的基础。你可以通过以下方式扩展其功能:
- 添加更多工具:为其他文件系统操作实现新的
@mcp.tool()函数(例如copy_file、delete_file、checksum_file)。 - 与其他系统集成:修改工具以与云存储、数据库或版本控制系统交互,同时仍提供类似文件系统的接口。
- 自定义验证:如有需要,可为
validate_path函数添加更复杂的访问控制规则。
许可证
根据 BSD Zero Clause License(0BSD)发布,这是 Open Source Initiative 批准的最宽松许可证。你可以出于任何目的使用、修改和再分发此软件,无需保留版权声明或附带许可证文本。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。