使用说明
文件系统MCP服务器
安全、高性能 模型上下文协议 (MCP)服务器,为Crush和OpenCode等AI编码代理提供对本地文件系统的安全访问。内置Go,具有目录沙盒、符号链接攻击防御和原子写入功能,因此您可以放心地让AI代理在您控制的范围内读取、写入和管理文件。
特性
- 17个文件系统工具 用于全面的文件操作
- 缺省安全:仅在明确允许的目录中操作
- Symlink攻击防御:解析符号链接并验证目标
- 流媒体支持:大文件的内存高效处理
- 原子写入:使用带重命名的临时文件进行安全的文件操作
- 跨平台:适用于Linux、macOS和Windows
- AI代理优化:行范围支持和动态格式化,实现高效的代码导航
安装
预构建的二进制文件可在 GitHub发布 页面。
Docker(推荐)
运行服务器最简单的方法是使用Docker:
docker pull portertech/filesystem-mcp-server
看 Docker使用 配置示例部分。
去安装
go install github.com/portertech/filesystem-mcp-server/cmd/filesystem@latest
从源代码构建
git clone https://github.com/portertech/filesystem-mcp-server.git
cd filesystem-mcp-server
make build
用法
# Start server with allowed directories
filesystem /path/to/allowed/dir1 /path/to/allowed/dir2
# Enable verbose logging
filesystem -verbose /path/to/dir
# Show version
filesystem -version
# List allowed directories
filesystem -list /path/to/dir
可用工具
read_text_file
使用可选的部分读取和行号读取文本文件的内容。
参数:
path(必填):要读取的文件的路径head(可选):从开始读取的行数tail(可选):从末尾开始读取的行数start_line(可选):起始行号(从1开始,含1)end_line(可选):结束行号(从1开始,含1)line_numbers(可选):在输出中包含行号(默认值:false)
备注:
start_line/end_line不能与head/tail- 使用
start_line/end_line始终包含行号(针对AI代理使用进行了优化) - 行号宽度根据总行数动态调整
例子:
// Read specific line range (lines 50-100)
{"path": "/path/to/file.go", "start_line": 50, "end_line": 100}
// Read from line 200 to end of file
{"path": "/path/to/file.go", "start_line": 200}
// Read first 20 lines with line numbers
{"path": "/path/to/file.go", "head": 20, "line_numbers": true}
// Read last 10 lines with line numbers
{"path": "/path/to/file.go", "tail": 10, "line_numbers": true}
退货:文件内容为文本,可选择前缀为行号
read_file
读取文件的完整内容。 弃用:使用 read_text_file 相反。
参数:
path(必填):要读取的文件的路径
退货:文件内容为文本
read_multiple_files
同时读取多个文件。单个文件的读取失败不会停止整个操作。
参数:
paths(必需):要读取的文件路径数组format(可选):输出格式-text或json(默认值:文本)
退货:文件内容及其路径的数组
read_media_file
读取媒体文件并将其内容作为base64编码数据返回。
参数:
path(必填):媒体文件的路径
退货:MIME类型的Base64编码文件数据
write_file
使用原子写入(临时文件+重命名)创建或覆盖具有新内容的文件。
参数:
path(必填):要写入的文件的路径content(必填):要写入文件的内容
退货:成功确认
edit_file
使用git样式的diff输出对文本文件应用查找/替换编辑。支持精确匹配和空白归一化行匹配。
参数:
path(必填):要编辑的文件的路径edits(必填):编辑操作数组,每个操作包含:oldText:要搜索的文本(精确匹配或空格标准化匹配)newText:要替换的文本requireUnique(可选):只需要一个匹配项(默认值:true)occurrence(可选):当存在多个事件时,替换哪个事件(1-索引)
dryRun(可选):预览更改而不应用(默认值:false)
退货:Git风格差异显示所做的更改
copy_file
将文件复制到新位置。使用流媒体高效处理大文件。
参数:
source(必需):源文件的路径destination(必需):目标文件的路径overwrite(可选):覆盖现有目标文件(默认值:false)
退货:成功确认
move_file
移动或重命名文件或目录。
参数:
source(必填):当前路径destination(必填):新路径
退货:成功确认
delete_file
删除文件。
参数:
path(必填):要删除的文件的路径
退货:成功确认
delete_directory
删除目录。无法删除允许的根目录。
参数:
path(必填):要删除的目录的路径recursive(可选):递归删除内容(默认值:false)
退货:成功确认
create_directory
创建一个目录,包括任何必要的父目录。
参数:
path(必需):要创建的目录的路径
退货:成功确认
list_directory
列出目录的内容 [FILE] 和 [DIR] 前缀。
参数:
path(必填):要列出的目录的路径format(可选):输出格式-text或json(默认值:文本)
退货:带有类型指示符的目录条目数组
list_directory_with_sizes
列出目录内容,包括文件大小和可选排序。
参数:
path(必填):要列出的目录的路径sortBy(可选):排序字段-name,size,或modified(默认值:name)order(可选):排序顺序-asc或desc(默认值:asc)format(可选):输出格式-text或json(默认值:文本)
退货:包含名称、类型、大小和修改时间的条目数组
directory_tree
以JSON格式获取文件和目录的递归树视图。
参数:
path(必需):根目录的路径excludePatterns(可选):要排除的glob模式数组
退货:JSON结构 name, type,以及 children 对于每个条目
search_files
递归搜索与glob模式匹配的文件。
参数:
path(必填):搜索的起始目录pattern(必填):要匹配的球形图案(例如。,*.go,**/*.json)excludePatterns(可选):要排除的模式数组format(可选):输出格式-text或json(默认值:文本)
退货:匹配文件路径数组
get_file_info
获取有关文件或目录的详细元数据。
参数:
path(必填):文件或目录的路径
退货:元数据包括:
size:大小(字节)created:创建时间戳modified:上次修改时间戳accessed:上次访问时间戳isDirectory:路径是否为目录isFile:路径是否为文件permissions:Unix权限字符串
list_allowed_directories
列出服务器有权访问的所有目录。
参数:无
退货:允许的目录路径数组
工具注释
此服务器设置 MCP工具注释 在每个工具上帮助客户了解工具行为:
| 工具 | 只读提示 | 幂等提示 | 解构提示 | 注释 |
|---|---|---|---|---|
read_text_file |
true |
– | – | 纯阅读 |
read_file |
true |
– | – | 纯读(已弃用) |
read_multiple_files |
true |
– | – | 纯阅读 |
read_media_file |
true |
– | – | 纯阅读 |
list_directory |
true |
– | – | 纯阅读 |
list_directory_with_sizes |
true |
– | – | 纯阅读 |
directory_tree |
true |
– | – | 纯阅读 |
search_files |
true |
– | – | 纯阅读 |
get_file_info |
true |
– | – | 纯阅读 |
list_allowed_directories |
true |
– | – | 纯阅读 |
create_directory |
– | true |
– | 重新创建现有目录是不可行的 |
write_file |
– | true |
true |
覆盖现有文件 |
edit_file |
– | – | true |
重新应用编辑可能会失败或重复应用 |
copy_file |
– | – | true |
可能会覆盖目标 |
move_file |
– | – | true |
源已删除 |
delete_file |
– | – | true |
永久删除文件 |
delete_directory |
– | – | true |
永久删除目录 |
备注:
–表示未设置提示(被客户端视为未知/未指定)。
配置
克劳德桌面版
增添 ~/Library/Application Support/Claude/claude_desktop_config.json:
使用Docker(推荐)
{
"mcpServers": {
"filesystem": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/Users/username/Documents:/Users/username/Documents",
"-v", "/Users/username/Projects:/Users/username/Projects",
"portertech/filesystem-mcp-server",
"/Users/username/Documents", "/Users/username/Projects"
]
}
}
}
使用二进制
{
"mcpServers": {
"filesystem": {
"command": "/path/to/filesystem",
"args": [
"/Users/username/Documents",
"/Users/username/Projects"
]
}
}
}
Docker使用
在Docker中运行服务器通过容器隔离提供了额外的安全层,将代理的访问权限限制在仅装载的目录上。镜像卷装载中的主机路径(例如。, -v /path:/path 而不是 -v /path:/data)因此,AI代理会看到您在对话中引用的相同路径。
# Run with mounted directories
docker run -i \
-v /path/to/dir:/path/to/dir \
portertech/filesystem-mcp-server /path/to/dir
# Multiple directories
docker run -i \
-v /home/user/projects:/home/user/projects \
-v /home/user/documents:/home/user/documents \
portertech/filesystem-mcp-server /home/user/projects /home/user/documents
# Build locally (optional)
docker build -t filesystem-mcp-server .
安全
- 路径验证:所有路径都根据允许的目录进行验证
- Symlink分辨率:Symlinks已解析并验证
- 空字节拒绝:拒绝包含空字节的路径
- 防止父级遍历:
..序列不能转义允许的目录 - 原子写入:文件写入使用临时文件来防止损坏
- 删除保护:无法删除允许的根目录
Symlink处理
Symlinks在所有工具中都得到了一致的处理,以平衡可用性和安全性。当符号链接解析为允许目录中的路径时,服务器支持符号链接,同时防止基于符号链接的攻击。
按操作类型划分的行为
| 操作 | Symlink行为 | 基本原理 |
|---|---|---|
| 阅读 | 如果目标在允许的目录内,请遵循 | 安全-在访问之前验证目标路径 |
| 写入/编辑 | 拒绝符号链接 | 防止TOCTU(检查时间-使用时间)攻击 |
| 删除 | 拒绝符号链接 | 防止意外删除符号链接目标 |
| 创建目录 | 拒绝路径中的符号链接 | 防止通过符号链接路径创建目录 |
| 遍历 (搜索,树) | 递归期间跳过符号链接 | 防止无限循环和目录转义 |
工具特定行为
| 工具 | 根路径 | 遍历期间 |
|---|---|---|
read_text_file |
遵循符号链接 | 不适用 |
read_file |
遵循符号链接 | 不适用 |
read_multiple_files |
遵循符号链接 | 不适用 |
read_media_file |
遵循符号链接 | 不适用 |
write_file |
拒绝符号链接 | 不适用 |
edit_file |
拒绝符号链接 | 不适用 |
copy_file |
来源:如下,目的地:拒绝 | 不适用 |
move_file |
来源:如下,目的地:拒绝 | 不适用 |
delete_file |
拒绝符号链接 | 不适用 |
delete_directory |
拒绝符号链接 | 如果目录包含符号链接,则拒绝 |
create_directory |
拒绝路径中的符号链接 | N/A |
list_directory |
跟随符号链接 | 将符号链接显示为条目 |
list_directory_with_sizes |
跟随符号链接 | 将符号链接显示为条目 |
directory_tree |
跟随符号链接 | 跳过符号链接条目 |
search_files |
跟随符号链接 | 跳过符号链接的文件/目录 |
get_file_info |
遵循符号链接 | 不适用 |
安全注意事项
-
TOCTOU预防:写入操作拒绝符号链接,以防止在验证和实际写入之间交换符号链接的竞争情况。
-
原子写入:文件写入使用临时文件+重命名模式
O_EXCL用于防止对临时文件进行符号链接攻击的标志。 -
横向安全:在递归操作期间,跳过符号链接以防止:
- 循环符号链接的无限循环
- 通过符号链接将允许的目录转义到父路径
- 访问允许目录之外的文件
-
允许的目录解析:允许的目录本身通过以下方式解析
filepath.EvalSymlinks启动时,符号链接允许目录正常工作。
发展
# Run tests
make test
# Run linter
make lint
# Format code
make fmt
# Build binary
make build
许可证
麻省理工学院
