Skip to main content
Glama

MCP File Server

by undici77
README.md9.12 kB
# 📂 MCP File Server **MCP File Server** is a secure, sandboxed file server providing controlled access to filesystem operations via the **Model Control Protocol (MCP)**. It supports reading, writing, listing, creating, and deleting files and directories within a configurable working directory while enforcing strict security checks. ## Table of Contents - [Features](#features) - [Installation & Quick Start](#installation--quick-start) - [Command‑Line Options](#commandline-options) - [Integration with LM Studio](#integration-with-lm-studio) - [MCP API Overview](#mcp-api-overview) - [`initialize`](#initialize) - [`tools/list`](#toolslist) - [`tools/call`](#toolscall) - [Available Tools](#available-tools) - [read_file](#read_file) - [write_file](#write_file) - [list_files](#list_files) - [create_directory](#create_directory) - [delete_file](#delete_file) - [delete_directory](#delete_directory) - [search_in_file](#search_in_file) - [Security Features](#security-features) ## 🎯 Features - **Sandboxed operations** – all paths are confined to a user‑specified working directory. - **Path traversal protection**, file‑size limits, and blocked extensions. - Binary support via Base64 encoding for safe transport of non‑text data. - Simple line‑delimited JSON‑RPC protocol suitable for stdin/stdout integration. - Ready‑to‑use with **LM Studio** through a minimal `mcp.json` configuration. ## 📦 Installation & Quick Start ```bash # Clone the repository (if not already done) git clone https://github.com/undici77/MCPFileServer.git cd MCPFileServer # Run the startup script – it creates a virtual environment, # installs dependencies, and starts the server. ./run.sh -d /path/to/working/directory ``` The script will: - Verify that Python 3 is available. - Create a `.venv` virtual environment (if missing). - Install required packages (`aiofiles`). - Start `main.py` with the supplied working directory. > 📌 **Tip:** Ensure the script has execution permission: > `chmod +x run.sh` ## ⚙️ Command‑Line Options | Option | Description | |--------|-------------| | `-d`, `--directory` | Path to the **working directory**. If omitted, the server uses the current process directory. The directory must exist and be readable/writable. | ## 🤝 Integration with LM Studio Add an entry for the file server in your project's `mcp.json`: ```json { "mcpServers": { "file-server": { "command": "/absolute/path/to/MCPFileServer/run.sh", "args": [ "-d", "/absolute/path/to/working/directory" ], "env": { "WORKING_DIR": "." } } } } ``` - Replace the paths with absolute locations on your machine. - Ensure `run.sh` is executable (`chmod +x run.sh`) and dependencies are installed. ## 📡 MCP API Overview All communication follows **JSON‑RPC 2.0** over stdin/stdout. ### `initialize` Sent by the client to obtain server capabilities. ```json { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {} } ``` The server responds with protocol version, capabilities, and its name/version. ### `tools/list` Retrieves a machine‑readable list of supported tools. ```json { "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} } ``` The response contains an array of tool definitions (name, description, input schema). ### `tools/call` Invokes a specific tool. ```json { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "<tool_name>", "arguments": { … } } } ``` > **Note:** The key for the tool name is `**name**`, not `tool`. This matches the server implementation. ## 🛠️ Available Tools | Tool | Description | |------|-------------| | `read_file` | Read a file’s contents (text or binary). | | `write_file` | Write text or Base64‑encoded binary data to a file. | | `list_files` | List files and directories with optional filtering. | | `create_directory` | Create a new sub‑directory (parents created as needed). | | `delete_file` | Delete a single file. | | `delete_directory` | Remove a directory; optionally force deletion of non‑empty trees. | | `search_in_file` | Search for a string in a file or recursively in a directory, returning contextual excerpts. | ### read_file Read the contents of a file inside the working directory. **Parameters** | Name | Type | Required | Description | |--------|---------|----------|-------------| | `path` | string | ✅ | Relative path to the target file. | | `binary` | boolean | ❌ (default: `false`) | Set to `true` to read the file as binary; the result is Base64‑encoded. | **Example** ```json { "method": "tools/call", "params": { "name": "read_file", "arguments": { "path": "example.txt", "binary": false } } } ``` ### write_file Write content to a file (creating intermediate directories if needed). **Parameters** | Name | Type | Required | Description | |--------|---------|----------|-------------| | `path` | string | ✅ | Relative path of the target file. | | `content` | string | ✅ | Text to write, or Base64‑encoded binary data when `binary=true`. | | `binary` | boolean | ❌ (default: `false`) | Set to `true` to treat `content` as Base64‑encoded binary. | **Example** ```json { "method": "tools/call", "params": { "name": "write_file", "arguments": { "path": "output.txt", "content": "Hello, world!", "binary": false } } } ``` ### list_files List files and directories under the working directory. **Parameters** | Name | Type | Required | Description | |------|------|----------|-------------| | `extensions` | array of strings | ❌ | Filter by file extensions (e.g., `[".py", ".txt"]`). If omitted, all files are listed. | | `recursive` | boolean | ❌ (default: `true`) | Search sub‑directories recursively when `true`. | | `show_empty_dirs` | boolean | ❌ (default: `true`) | Include directories that contain no matching files. | **Example** ```json { "method": "tools/call", "params": { "name": "list_files", "arguments": { "extensions": [".py", ".txt"], "recursive": true, "show_empty_dirs": false } } } ``` The response lists entries prefixed with `DIR:` or `FILE:` and includes a summary line. ### create_directory Create a new directory (including any missing parent directories). **Parameters** | Name | Type | Required | Description | |------|------|----------|-------------| | `path` | string | ✅ | Relative path of the directory to create. | **Example** ```json { "method": "tools/call", "params": { "name": "create_directory", "arguments": { "path": "new_folder/subfolder" } } } ``` ### delete_file Delete a file inside the working directory. **Parameters** | Name | Type | Required | Description | |------|------|----------|-------------| | `path` | string | ✅ | Relative path of the file to delete. | **Example** ```json { "method": "tools/call", "params": { "name": "delete_file", "arguments": { "path": "temp.txt" } } } ``` ### delete_directory Delete a directory, optionally forcing removal of its contents. **Parameters** | Name | Type | Required | Description | |------|------|----------|-------------| | `path` | string | ✅ | Relative path of the directory to delete. | | `force` | boolean | ❌ (default: `false`) | When `true`, deletes non‑empty directories recursively. | **Example** ```json { "method": "tools/call", "params": { "name": "delete_directory", "arguments": { "path": "old_folder", "force": true } } } ``` ### search_in_file Search for a string in a file or recursively in all files within a directory, returning contextual excerpts. **Parameters** | Name | Type | Required | Description | |------|------|----------|-------------| | `path` | string | ✅ | Relative path to a file **or** directory. | | `search_string` | string | ✅ | Text to search for. | | `context_lines` | integer | ❌ (default: `3`) | Number of lines before and after each match to include. | | `case_sensitive` | boolean | ❌ (default: `false`) | Perform a case‑sensitive search when `true`. | | `max_matches` | integer | ❌ (default: `50`) | Maximum matches returned per file. | **Example** ```json { "method": "tools/call", "params": { "name": "search_in_file", "arguments": { "path": "log.txt", "search_string": "ERROR", "context_lines": 2, "case_sensitive": false, "max_matches": 10 } } } ``` The response contains formatted excerpts with line numbers and a summary of total matches. --- ## 🔐 Security Features - **Path traversal protection** – all paths are resolved against the working directory; attempts to escape result in an error. - **Blocked extensions & sensitive filenames** – files such as `.exe`, `.bat`, `passwd`, etc., are rejected. - **File‑size limits** – reads/writes exceeding `100 MiB` (`MAX_FILE_SIZE`) are denied. - **Null byte and dangerous pattern checks** – prevent malformed input attacks. --- *© 2025 Undici77 – All rights reserved.*

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/undici77/MCPFileServer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server