使用说明
📂 MCP文件服务器
MCP文件服务器 是一个安全的沙盒文件服务器,通过 模型控制协议(MCP)。它支持在可配置的工作目录中读取、写入、列出、创建和删除文件和目录,同时执行严格的安全检查。Git操作也可用于工作目录中的存储库。
目录
🎯 特性
- 沙盒操作 –所有路径都限制在用户指定的工作目录中。
- 路径遍历保护、文件大小限制和阻止的扩展名。
- 通过Base64编码提供二进制支持,用于安全传输非文本数据。
- 工作目录中存储库的Git操作(状态、日志、分支、提交/推送/拉取)。
- 适用于stdin/stdout集成的简单行分隔JSON-RPC协议。
- 即用型 LM 工作室 通过最小
mcp.json配置。
📦 安装和快速启动
# Clone the repository (if not already done)
git clone https://github.com/undici77/MCPFileServer.git
cd MCPFileServer
# Ensure git is installed on your system (required for git operations)
git --version
# Run the startup script – it creates a virtual environment,
# installs dependencies, and starts the server.
./run.sh -d /path/to/working/directory
脚本将:
- 验证Python 3 可用。
- 创建一个
.venv虚拟环境(如果缺失)。 - 安装所需的软件包(
aiofiles). - 开始
main.py使用提供的工作目录。
📌 Git操作注意事项:git操作使用Python的
subprocess调用系统gitCLI。Git必须在PATH中安装并可用。📌 提示: 确保脚本具有执行权限:
chmod +x run.sh
⚙️ 命令行选项
| 选项 | 描述 |
|---|---|
-d, --directory |
通往 工作目录。如果省略,服务器将使用当前进程目录。目录必须存在并且可读/写。 |
🤝 与LM集成 工作室
在项目中为文件服务器添加条目 mcp.json:
{
"mcpServers": {
"file-server": {
"command": "/absolute/path/to/MCPFileServer/run.sh",
"args": [
"-d",
"/absolute/path/to/working/directory"
],
"env": {
"WORKING_DIR": "."
}
}
}
}
- 将路径替换为机器上的绝对位置。
- 确保
run.sh可执行(chmod +x run.sh)并且安装了依赖项。
📡 MCP API概述
所有通信如下 JSON-RPC 2.0 通过stdin/stdout。
initialize
由客户端发送以获取服务器功能。
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {}
}
服务器以协议版本、功能及其名称/版本进行响应。
tools/list
检索支持的工具的机器可读列表。
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}
响应包含一系列工具定义(名称、描述、输入模式)。
tools/call
调用特定工具。
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "<tool_name>",
"arguments": { … }
}
}
注: 工具名称的关键字是
**name**,不tool。这与服务器实现相匹配。
🛠️ 可用工具
文件操作
| 工具 | 说明 |
|---|---|
read_file |
读取文件的内容(文本或二进制)。 |
write_file |
将文本或Base64编码的二进制数据写入文件。 |
list_files |
列出具有可选筛选功能的文件和目录 |
create_directory |
创建一个新的子目录(根据需要创建父目录)。 |
delete_file |
删除单个文件。 |
delete_directory |
删除目录;可选择强制删除非空树。 |
search_in_file |
在文件中或目录中递归搜索字符串,返回上下文摘录。 |
read_file
读取工作目录中文件的内容。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
path |
string | ✅ | 目标文件的相对路径。 |
binary |
boolean | ❌ (默认值: false) |
设置为 true 将文件读取为二进制文件;结果是Base64编码。 |
示例
{
"method": "tools/call",
"params": {
"name": "read_file",
"arguments": {
"path": "example.txt",
"binary": false
}
}
}
write_file
将内容写入文件(如果需要,创建中间目录)。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
path |
string | ✅ | 目标文件的相对路径。 |
content |
string | ✅ | 要写入的文本或Base64编码的二进制数据 binary=true. |
binary |
boolean | ❌ (默认值: false) |
设置为 true 对待 content 作为Base64编码的二进制文件。 |
示例
{
"method": "tools/call",
"params": {
"name": "write_file",
"arguments": {
"path": "output.txt",
"content": "Hello, world!",
"binary": false
}
}
}
列表文件
列出工作目录下的文件和目录。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
extensions |
字符串数组 | ❌ | 按文件扩展名过滤(例如。, [".py", ".txt"]).如果省略,则列出所有文件。 |
recursive |
boolean | ❌ (默认值: true) |
在以下情况下递归搜索子目录 true. |
show_empty_dirs |
boolean | ❌ (默认值: true) |
包括不包含匹配文件的目录。 |
示例
{
"method": "tools/call",
"params": {
"name": "list_files",
"arguments": {
"extensions": [".py", ".txt"],
"recursive": true,
"show_empty_dirs": false
}
}
}
create_directory
创建一个新目录(包括任何缺失的父目录)。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
path |
string | ✅ | 要创建的目录的相对路径。 |
示例
{
"method": "tools/call",
"params": {
"name": "create_directory",
"arguments": { "path": "new_folder/subfolder" }
}
}
删除文件
删除工作目录中的文件。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
path |
string | ✅ | 要删除的文件的相对路径。 |
示例
{
"method": "tools/call",
"params": {
"name": "delete_file",
"arguments": { "path": "temp.txt" }
}
}
delete_directory
删除目录,可选择强制删除其内容。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
path |
string | ✅ | 要删除的目录的相对路径。 |
force |
boolean | ❌ (默认值: false) |
何时 true,递归删除非空目录。 |
示例
{
"method": "tools/call",
"params": {
"name": "delete_directory",
"arguments": { "path": "old_folder", "force": true }
}
}
search_in_file
在文件中搜索字符串,或在目录中的所有文件中递归搜索字符串,返回上下文摘录。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
path |
string | ✅ | 文件的相对路径 或 目录。 |
search_string |
string | ✅ | 要搜索的文本。 |
context_lines |
整数 | ❌ (默认值: 3) |
每场比赛前后要包含的行数。 |
case_sensitive |
boolean | ❌ (默认值: false) |
在以下情况下执行区分大小写的搜索 true. |
max_matches |
整数 | ❌ (默认值: 50) |
每个文件返回的最大匹配项数。 |
示例
{
"method": "tools/call",
"params": {
"name": "search_in_file",
"arguments": {
"path": "log.txt",
"search_string": "ERROR",
"context_lines": 2,
"case_sensitive": false,
"max_matches": 10
}
}
}
Git操作
默认情况下,所有git操作都在工作目录上工作。要在嵌套存储库上操作,请使用 repo_path 参数。
| 工具 | 说明 |
|---|---|
git_status |
显示工作树状态。 |
git_log |
显示提交日志历史记录。 |
git_checkout |
切换到其他分支或提交。 |
git_branch_create |
创建一个新分支。 |
git_branch_delete |
删除分支。 |
git_branch_list |
列出存储库中的所有分支。 |
git_add |
将文件内容添加到暂存区。 |
git_commit |
将更改记录到存储库中。 |
git_push |
将更改推送到远程存储库。 |
git_pull |
从远程存储库获取并与之集成。 |
git_diff |
显示提交、提交和工作树之间的变化。 |
git_clone |
将存储库克隆到新目录中。 |
git_submodule_add |
向存储库添加子模块。 |
git_submodule_update |
更新现有子模块。 |
git_submodule_list |
列出存储库中的所有子模块。 |
注: 所有git工具都支持可选 repo_path 用于在子目录中的存储库上操作的参数(例如。, "repo_path": "vendor/my-repo").如果省略,操作将直接针对工作目录。
git_status
显示工作树状态。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
short |
boolean | ❌ (默认值: true) |
使用短格式输出。 |
repo_path |
string | ❌ | 相对于工作目录的存储库路径(如果省略,则使用工作目录)。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_status",
"arguments": {
"short": true,
"repo_path": "vendor/my-repo"
}
}
}
git_log
显示提交日志历史记录。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
max_count |
整数 | ❌ (默认值: 20) |
要显示的最大提交数。 |
oneline |
boolean | ❌ (默认值: true) |
显示紧凑的单行格式。 |
repo_path |
string | ❌ | 相对于工作目录的存储库路径(如果省略,则使用工作目录)。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_log",
"arguments": {
"max_count": 10,
"oneline": true,
"repo_path": "vendor/my-repo"
}
}
}
git_checkout
切换到其他分支或提交。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
branch |
string | ✅ | 分支名称或提交哈希到签出。 |
repo_path |
string | ❌ | 相对于工作目录的存储库路径(如果省略,则使用工作目录)。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_checkout",
"arguments": {
"branch": "main",
"repo_path": "vendor/my-repo"
}
}
}
git_branch_create
创建一个新分支。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
branch |
string | ✅ | 新分支的名称。 |
start_point |
string | ❌ | 新分支的起点(分支或提交)。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_branch_create",
"arguments": {
"branch": "feature/new-ui",
"start_point": "main"
}
}
}
git_branch_delete
删除分支。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
branch |
string | ✅ | 要删除的分支的名称。 |
force |
boolean | ❌ (默认值: false) |
即使分支有未合并的更改,也要强制删除。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_branch_delete",
"arguments": {
"branch": "old-branch",
"force": true
}
}
}
git_branch_list
列出存储库中的所有分支。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
all |
boolean | ❌ (默认值: false) |
列出本地和远程分支。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_branch_list",
"arguments": { "all": true }
}
}
git_add
将文件内容添加到暂存区。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
paths |
字符串数组 | ✅ | 要添加的文件路径列表。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_add",
"arguments": {
"paths": ["src/main.py", "tests/test_main.py"]
}
}
}
git_提交
将更改记录到存储库中。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
message |
string | ✅ | 提交消息。 |
all |
boolean | ❌ (默认值: false) |
自动暂存所有修改和删除的文件。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_commit",
"arguments": {
"message": "Add new feature",
"all": true
}
}
}
git_push
将更改推送到远程存储库。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
remote |
string | ❌ (默认值: origin) |
远程存储库名称。 |
branch |
string | ❌ | 要推送的分支(默认为当前分支)。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_push",
"arguments": {
"remote": "origin",
"branch": "main"
}
}
}
git_pull
从远程存储库获取并与之集成。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
remote |
string | ❌ (默认值: origin) |
远程存储库名称。 |
branch |
string | ❌ | 要提取的分支(默认为当前分支)。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_pull",
"arguments": {
"remote": "origin",
"branch": "main"
}
}
}
使用 git_diff
显示提交、提交和工作树之间的变化。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
path |
string | ❌ | 显示差异的特定文件或目录。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_diff",
"arguments": {
"path": "src/main.py"
}
}
}
git_clone
将存储库克隆到新目录中。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
url |
string | ✅ | 要克隆的存储库的URL(HTTPS或SSH)。 |
path |
string | ✅ | 将克隆存储库的目录名称(相对于工作目录)。 |
branch |
string | ❌ | 克隆后要结账的具体分支。 |
recursive |
boolean | ❌ (默认值: false) |
递归克隆子模块。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_clone",
"arguments": {
"url": "https://github.com/owner/repo.git",
"path": "vendor/repo",
"branch": "main"
}
}
}
git_submodule_add
向存储库添加子模块。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
url |
string | ✅ | 要添加为子模块的存储库的URL。 |
path |
string | ✅ | 放置子模块的路径。 |
name |
string | ❌ | 子模块的名称(可选,默认为路径)。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_submodule_add",
"arguments": {
"url": "https://github.com/owner/lib.git",
"path": "vendor/lib"
}
}
}
git_submodule_update
更新现有子模块。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
init |
boolean | ❌ (默认值: true) |
更新前初始化子模块。 |
recursive |
boolean | ❌ (默认值: true) |
递归更新子模块。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_submodule_update",
"arguments": {
"init": true,
"recursive": true
}
}
}
git_submodule_list
列出存储库中的所有子模块。 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
summary |
boolean | ❌ (默认值: true) |
显示子模块状态摘要。 |
示例
{
"method": "tools/call",
"params": {
"name": "git_submodule_list",
"arguments": { "summary": true }
}
}
🔐 安全功能
- 路径遍历保护 –根据工作目录解析所有路径;试图逃逸会导致错误。
- 阻止扩展名和敏感文件名 –文件,如
.exe,.bat,passwd等等,都被拒绝了。 - 文件大小限制 –读/写超过
100 MiB(MAX_FILE_SIZE)被拒绝。 - 空字节和危险模式检查 –防止格式错误的输入攻击。
- Git命令验证 -验证分支名称和路径以防止注入攻击。
©2025 Undici77-保留所有权利。