- Python (MCP) Filesystem Server
Python (MCP) Filesystem Server
Python (MCP) Filesystem Server
This repository contains a robust Python-based Model Context Protocol (MCP) Filesystem Server. It enables AI models and applications to securely interact with the host system's file directories through a defined set of tools, allowing for operations like reading, writing, moving, and listing files and directories.
The server is built upon the fastmcp library and adheres to the Model Context Protocol, providing a standardized way for AI tools to manage and access files within specified boundaries.
It's inspired by this example typescript implementation.
Features
- Secure Directory Access: All file operations are strictly confined to a predefined list of allowed directories, preventing unauthorized access to other parts of the filesystem.
- Comprehensive File Operations:
read_file: Read the complete contents of a single text file.read_multiple_files: Efficiently read content from multiple files, returning results with clear path references.write_file: Create new files or overwrite existing ones with specified content.edit_file: Apply line-based edits to text files, with an option for a dry run to preview changes as a Git-style diff.create_directory: Create new directories, including nested structures, or ensure their existence.list_directory: Get a detailed listing of files and subdirectories within a given path.directory_tree: Generate a recursive JSON tree structure of files and directories for a clear hierarchical view.move_file: Move or rename files and directories.search_files: Recursively search for files and directories matching a pattern, with optional exclusion patterns.get_file_info: Retrieve detailed metadata (size, timestamps, permissions) about files or directories.
- Dynamic Allowed Directories: Configurable via command-line arguments to specify exactly which directories the server can access.
- Robust Logging: Integrates comprehensive logging with support for different log levels and output to both
stderr(for MCP compliance) and an optional rotating log file. - Error Handling: Provides detailed error messages for common issues like access denied, file not found, or permission errors.
- Line Ending Normalization: Handles
\r\nand\nline endings consistently foredit_fileoperations. - Symlink Protection: Validates the real path of symlinks to prevent escaping allowed directories.
Getting Started
Prerequisites
- Python 3.8+: The server is developed and tested with modern Python versions.
fastmcplibrary: This server uses thefastmcplibrary for MCP protocol handling. You'll need to install it.
Installation
-
Clone the repository:
git clone https://github.com/hypercat/PyMCP-FS.git cd PyMCP-FS -
Initialize project with
uv:uv pip install -r pyproject.toml
Usage
Running the MCP Server (main.py)
The MCP server expects a list of allowed directories as command-line arguments. It will only operate within these specified paths.
python3 main.py -d /path/to/allowed/dir1 /path/to/another/allowed/dir2 --log-level INFO --log-file mcp_server.log
Arguments:
-d,--directories: (Required) One or more paths to directories that the server is allowed to access. You can specify multiple directories.--log-file: (Optional) Path to a file where server logs will be written. Logs will rotate to prevent excessive file size.--log-level: (Optional) Minimum logging level to output. Choices areDEBUG,INFO,WARNING,ERROR. Default isINFO.
Example:
To allow the server access to your home directory's projects folder and a temporary data folder:
uv run main.py -d ~/projects /tmp/data --log-level DEBUG --log-file mcp_debug.log
Once running, the server will listen for MCP messages on its standard input (stdin) and respond on its standard output (stdout).
Testing the Server with test_mcp_server.py
The test_mcp_server.py script is a utility for verifying the server's initialization and basic functionality. It launches the main.py server as a subprocess, sends an initialize MCP message, and captures the server's output and logs.
uv run test_mcp_server.py
This script will:
- Create a temporary directory (
~/mcp_test) and a test file within it. - Launch
main.pyas a subprocess, granting it access to the temporary directory. - Send a standard MCP
initializerequest to the server. - Monitor the server's output (
stdout,stderr) for responses and errors. - Print the server's debug log (
mcp_debug.log) for detailed insights. - Clean up the temporary test files and directories.
Interpreting the Test Output:
Response: {"jsonrpc": "2.0", "result": {}, "id": 1}: This indicates a successful MCPinitializeresponse from your server, confirming it's correctly handling the initial handshake.STDOUT/STDERR: Any direct print statements or uncaught exceptions frommain.pywill appear here. This is your first stop for runtime errors.=== DEBUG LOG CONTENTS ===: Provides detailed logs from the server process itself. Look for messages indicating successful tool registration, path validation, and any errors during file operations.
Troubleshooting
If you encounter issues, here's a checklist:
- Check Command Line Arguments: Ensure you are providing at least one allowed directory to
main.py. The server will not start without them. fastmcpInstallation: Verify that thefastmcplibrary is correctly installed (pip install fastmcp).- Permissions: Make sure the user running the server has read/write permissions for the specified allowed directories and the log file path.
- Examine Logs (
mcp_debug.log): The log file (especially with--log-level DEBUG) provides the most detailed information about what the server is doing and where it might be failing. - MCP Protocol Adherence: Ensure your client is sending well-formed JSON-RPC 2.0 messages according to the MCP specification. The server expects messages on
stdinand responds onstdout. - Path Validation Errors: If you see "Access denied" errors, double-check that the requested paths fall strictly within the configured allowed directories. Remember that symlink targets are also validated.
edit_fileMatch Issues: Ifedit_filereports that it "Could not find exact match," verify that theoldTextin your edit operation exactly matches the content in the file, including whitespace and line endings.
Extending the Server
This server provides a solid foundation for filesystem interaction. You can extend its capabilities by:
- Adding More Tools: Implement new
@mcp.tool()functions for other filesystem operations (e.g.,copy_file,delete_file,checksum_file). - Integrating with Other Systems: Modify tools to interact with cloud storage, databases, or version control systems, while still presenting a filesystem-like interface.
- Customizing Validation: Enhance the
validate_pathfunction with more complex access control rules if needed.