文件系统MCP服务器
用于文件系统操作的安全模型上下文协议(MCP)服务器实现。
概述
文件系统MCP服务器提供了一个标准化的接口,用于通过模型上下文协议与本地文件系统进行交互。它允许客户端以安全和可控的方式执行常见的文件操作,如列出目录、读取文件和搜索文件内容。
特性
服务器提供以下MCP工具:
- 列表:列出包含元数据的文件和目录
- 读:使用各种编码选项读取文件内容
- 写:创建或更新包含内容的文件
- 创建目录:创建目录
- 删除:删除文件或目录
- 复制:复制文件或目录
- 移动:移动或重命名文件或目录
- 信息:获取详细的文件/目录信息
- 搜索:搜索文件内容(类似grep的功能)
- list_allowed_dirs:列出服务器上配置的所有允许的目录
- 编辑:对文件进行部分编辑,而不重写整个内容
为了安全起见,所有操作都限制在可配置的允许目录中。
安全
所有文件系统操作都限制在一组可配置的允许目录中。服务器验证路径以防止目录遍历攻击和其他安全问题。访问允许目录之外的文件的操作将被拒绝,并显示相应的错误消息。
路径要求
提供给服务器的所有文件和目录路径必须指定为 完全绝对路径。这些路径必须位于配置的允许访问的目录之一中。
安装
先决条件:
- Rust工具链(1.70.0或更高版本)
- 货物包装经理
要构建服务器,请执行以下操作:
cargo build --release用法
运行服务器
# Run with current directory as the allowed directory
./target/release/fs-mcp-server
# Specify allowed directories (comma-separated)
./target/release/fs-mcp-server --allowed-dirs /path/to/dir1,/path/to/dir2
# Use a configuration file listing allowed directories
./target/release/fs-mcp-server --config-file /path/to/config.txt
# Set maximum file size
./target/release/fs-mcp-server --max-file-size 5242880 # 5MB配置文件
您可以在配置文件中指定允许的目录,每行一个目录:
# This is a comment
/path/to/directory1
/path/to/directory2
/another/path环境变量
可以使用以下环境变量配置服务器:
FS_ALLOWED_DIRS:以逗号分隔的文件系统操作允许目录列表FS_CONFIG_FILE:列出允许目录的配置文件的路径FS_MAX_FILE_SIZE:读取操作的最大文件大小(以字节为单位)FS_REQUEST_TIMEOUT:请求超时(秒)FS_LOG_LEVEL:日志级别(错误、警告、信息、调试、跟踪)FS_LOG_FILE:日志文件路径
例子:
FS_ALLOWED_DIRS=/data,/home/user/docs FS_LOG_LEVEL=debug ./target/release/fs-mcp-server协议工具
服务器提供以下MCP工具:
列表
列出指定路径下的文件和目录。
参数:
path:列出文件的目录的完整路径pattern:用于过滤文件的可选glob模式(默认值:“\*”)recursive:是否递归列出文件(默认值:false)include_hidden:是否包含隐藏文件(默认值:false)metadata:是否包含文件元数据(默认值:true)
读
读取支持不同编码和部分读取的文件内容。
参数:
path:要读取的文件的完整路径encoding:文件编码(utf8、base64、二进制)(默认:utf8)start_line:部分读取的起始行(0索引)end_line:部分读取的结束行(包括)max_size:要读取的最大字节数(默认值:1MB)
搜索
在文件内容中搜索匹配的模式(类似grep的功能)。
参数:
root_path:从中开始搜索的根目录的完整路径pattern:要在文件中搜索的文本模式regex:是否将模式视为正则表达式(默认值:false)file_pattern:可选的glob模式,用于过滤要搜索的文件(默认值:“\*”)recursive:是否递归搜索目录(默认值:true)case_sensitive:搜索是否应区分大小写(默认值:false)max_results:要返回的最大结果数(默认值:100)max_file_size:要搜索的最大文件大小(默认值:10MB)context_lines:要包含的上下文行数(默认值:0)timeout_secs:搜索的最长时间(默认值:30秒)
编辑
对文件执行部分编辑,而无需重写整个内容。
参数:
path:要编辑的文件的完整路径operations:要执行的编辑操作列表(按顺序)
- 更换操作: - type:“替换” - find:要查找的文本(完全匹配) - replace:插入文本作为替换 - occurrence:要替换哪个事件(从0开始,全部为-1)(默认值:0) - case_sensitive:搜索是否区分大小写(默认值:true) - 插入操作: - type:“插入” - position:要插入的字符位置(从0开始) - content:要插入的文本 - 删除操作: - type:“删除” - start:起始字符位置(从0开始,包括0) - end:结束字符位置(从0开始,不包括) - 更换线路操作: - type:“replace_lines” - start_line:起始行号(从0开始,包括0) - end_line:结束行号(从0开始,包括0) - content:插入文本作为替换
create_if_missing:如果文件不存在,则创建该文件(默认值:false)backup:在编辑之前创建原始文件的备份(默认值:false)
例子:
{
"path": "/path/to/file.txt",
"operations": [
{
"type": "replace",
"find": "hello",
"replace": "hello world",
"occurrence": 0,
"case_sensitive": true
},
{
"type": "insert",
"position": 100,
"content": "new text at position 100"
},
{
"type": "replace_lines",
"start_line": 5,
"end_line": 7,
"content": "new line 6\nnew line 7\nnew line 8"
}
],
"backup": true
}list_allowed_dirs
列出服务器已配置为允许访问的所有目录。
参数:
- 无
客户端集成
要将此服务器与MCP客户端一起使用:
- 导入适用于您语言的MCP客户端库
- 使用stdio传输连接到服务器
- 使用MCP协议调用可用工具
示例客户端代码(使用Rust MCP客户端):
use mcp_client::{ClientBuilder, transport::StdioTransport};
use serde_json::json;
#[tokio::main]
async fn main() -> Result {
// Path to the server executable
let server_path = "path/to/fs-mcp-server";
// Create and connect to server
let (transport, mut receiver) = StdioTransport::new(server_path, vec![]);
let client = ClientBuilder::new("fs-client", "0.1.0")
.with_transport(transport)
.build()?;
// Start message handling
let client_for_handler = client.clone();
tokio::spawn(async move {
while let Some(message) = receiver.recv().await {
if let Err(e) = client_for_handler.handle_message(message).await {
eprintln!("Error handling message: {}", e);
}
}
});
// Initialize the client
let init_result = client.initialize().await?;
println!("Connected to: {} v{}", init_result.server_info.name, init_result.server_info.version);
// List all allowed directories
let allowed_dirs_result = client.call_tool("list_allowed_dirs", &json!({})).await?;
println!("Allowed directories: {:?}", allowed_dirs_result);
// List files in a directory
let list_result = client.call_tool("list", &json!({
"path": "/path/to/directory"
})).await?;
// Process result
println!("List result: {:?}", list_result);
// Edit a file by replacing text
let edit_result = client.call_tool("edit", &json!({
"path": "/path/to/file.txt",
"operations": [
{
"type": "replace",
"find": "TODO",
"replace": "DONE",
"occurrence": -1
}
],
"backup": true
})).await?;
// Process result
println!("Edit result: {:?}", edit_result);
// Shutdown
client.shutdown().await?;
Ok(())
}发展
项目结构
src/main.rs:服务器入口点和初始化src/tools/:工具实现(列表、读取、搜索、编辑等)src/utils/:实用功能(路径验证等)
添加新工具
要添加新的文件系统工具,请执行以下操作:
- 在中创建新文件
src/tools/为您的工具 - 实现工具的模式并执行功能
- 将该工具添加到中的服务器构建器
build_server()在main.rs中
为不同平台构建
# Build for Linux
cargo build --release --target x86_64-unknown-linux-gnu
# Build for macOS
cargo build --release --target x86_64-apple-darwin
# Build for Windows
cargo build --release --target x86_64-pc-windows-msvc许可证
麻省理工学院
