Back to MCP directory
publicPublicdnsLocal runtime

fs-mcp-server

一个基于Model Context Protocol的安全文件系统操作服务器,提供标准化接口进行文件管理、内容搜索和编辑等功能,所有操作限制在配置的允许目录内以确保安全性。

article

README

🚀 文件系统服务器工具文档

这个文件系统服务器工具提供了一系列用于管理文件和目录的操作。它支持多种功能,包括列出文件内容、读取文件、搜索文件、编辑文件以及列出允许访问的目录等,能有效提升文件管理效率。

🚀 快速开始

此文件系统服务器工具可在Linux、macOS和Windows系统上运行,下面为你详细介绍在不同系统上的安装和运行步骤。

Linux系统

# 先下载可执行文件
wget https://example.com/fs-mcp-server_linux

# 给予执行权限
chmod +x fs-mcp-server_linux

# 运行服务器
./fs-mcp-server_linux

macOS系统

# 下载并解压
tar -xvf fs-mcp-server_macos.tar.gz

# 运行服务器
./fs-mcp-server_macos

Windows系统

# 下载可执行文件
# 双击文件运行

✨ 主要特性

  • 跨平台支持:适用于Linux、macOS和Windows。
  • 强大的权限控制:通过配置允许访问的目录,确保操作的安全性。
  • 高效的操作性能:优化了文件操作的速度,适合处理大量数据。
  • 灵活的配置选项:可以通过命令行参数或配置文件自定义行为。

📦 安装指南

配置允许访问的目录

在服务器启动前,需要配置允许访问的目录。可以通过以下命令列出允许访问的目录:

# 列出允许访问的目录
./fs-mcp-server_linux --list-allowed-dirs

# 添加新的允许访问目录
./fs-mcp-server_linux --add-allowed-dir /path/to/directory

# 除不再需要的目录
./fs-mcp-server_linux --remove-allowed-dir /path/to/directory

💻 使用示例

客户端集成示例

以下是一个使用Rust语言的客户端调用服务器工具的示例:

use mcp_client::{ClientBuilder, transport::StdioTransport};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<()> {
    // 服务器可执行文件路径
    let server_path = "path/to/fs-mcp-server";
    
    // 创建并连接到服务器
    let (transport, mut receiver) = StdioTransport::new(server_path, vec![]);
    
    let client = ClientBuilder::new("fs-client", "0.1.0")
        .with_transport(transport)
        .build()?;
    
    // 启动消息处理
    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!("处理消息时出错: {}", e);
            }
        }
    });
    
    // 初始化客户端
    let init_result = client.initialize().await?;
    println!("连接到服务器:{} v{}", init_result.server_info.name, init_result.server_info.version);
    
    // 列出所有允许访问的目录
    let allowed_dirs_result = client.call_tool("list_allowed_dirs", &json!({})).await?;
    println!("允许访问的目录: {:?}", allowed_dirs_result);
    
    // 列出指定目录的内容
    let list_dir_result = client.call_tool("list_dir", &json!({"path": "/your/directory/path"})).await?;
    println!("目录内容: {:?}", list_dir_result);
    
    // 读取文件内容
    let read_file_result = client.call_tool("read_file", &json!({"file_path": "/path/to/file.txt"})).await?;
    println!("文件内容: {}", String::from_utf8(read_file_result).unwrap());
    
    // 搜索文件
    let search_result = client.call_tool("search_files", &json!({
        "pattern": "*.txt",
        "directories": ["/path/to/search"]
    })).await?;
    println!("搜索结果: {:?}", search_result);
    
    // 编辑文件内容
    let edit_file_result = client.call_tool("edit_file", &json!({
        "file_path": "/path/to/file.txt",
        "content": "新的文件内容"
    })).await?;
    println!("编辑文件完成: {}", edit_file_result);
    
    Ok(())
}

代码示例

列出允许访问的目录

fn list_allowed_dirs() -> Vec<String> {
    // 读取配置文件,获取允许访问的目录列表
    let config = read_config();
    config.allowed_dirs.clone()
}

读取文件内容

fn read_file(file_path: &str) -> Option<Vec<u8>> {
    match fs::read(file_path) {
        Ok(content) => Some(content),
        Err(e) => {
            eprintln!("无法读取文件:{}", e);
            None
        }
    }
}

搜索文件

fn search_files(pattern: &str, directories: Vec<&str>) -> Vec<String> {
    let mut results = Vec::new();
    
    for dir in directories {
        if Path::exists(dir) && Path::is_dir(dir) {
            for entry in fs::read_dir(dir).unwrap() {
                let entry_path = entry.path().to_str().unwrap();
                if entry_path.ends_with(pattern) {
                    results.push(entry_path.to_string());
                }
            }
        }
    }
    
    results
}

编辑文件内容

fn edit_file(file_path: &str, content: String) -> bool {
    match fs::write(file_path, content) {
        Ok(_) => true,
        Err(e) => {
            eprintln!("无法写入文件:{}", e);
            false
        }
    }
}

📚 详细文档

项目结构

.
├── README.md               # 项目说明文档
├── LICENSE                # 许可证文件
├── Cargo.toml              # Rust项目的依赖管理文件
├── src/
│   ├── main.rs            # 服务器入口程序
│   └── lib.rs             # 核心功能实现
└── scripts/               # 脚本目录,包含各种工具脚本

构建说明

Linux系统

# 克隆项目仓库
git clone https://github.com/your-username/fs-mcp-server.git

# 进入项目目录
cd fs-mcp-server

# 使用Rust构建
cargo build --release

macOS系统

# 克隆项目仓库
git clone https://github.com/your-username/fs-mcp-server.git

# 进入项目目录
cd fs-mcp-server

# 使用Rust构建
cargo build --release

Windows系统

# 设置 Rust 环境变量
# 克隆项目仓库并进入目录后运行
cargo build --release

📄 许可证

本项目使用MIT许可证,具体条款请查看LICENSE文件。

💡 贡献指南

欢迎社区贡献!如果有任何问题或建议,请提交Issues到GitHub仓库。

help

Runtime guide

cloud

Hosted runtime

Hosted servers run from a provider-managed environment. You usually connect the MCP client to the hosted endpoint or follow the provider's authorization flow, without keeping a local process alive

  1. Open provider connection page
  2. Authorize or copy endpoint
  3. Connect from your MCP client
terminal

Local runtime / other methods

Local servers run on your own machine or infrastructure. You normally copy the server_config into your MCP client, install the required package, and provide env variables from env_schema when needed

  1. Copy server_config
  2. Install required package
  3. Fill env variables and restart client