About Python (MCP) Filesystem Server
Python (MCP) Filesystem Server is a Python server that lets MCP clients operate on files within configured directories. Its tools cover common file and directory tasks, with resolved-path checks to enforce the access boundary.
Key features
- 01Restrict access to configured directories
- 02Read one or multiple text files
- 03Write and edit files with diff preview
- 04Create and list directories
- 05Search paths and inspect metadata
- 06Move files without overwriting
Use cases
- 01Read project files for an AI workflow
- 02Apply and preview text-file edits
- 03Browse a directory tree within allowed paths
- 04Search files and inspect their metadata
MCP support
Implements an MCP server using `fastmcp` and communicates over stdio. It exposes filesystem tools to MCP clients, confined to directories supplied at startup.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEPython (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 UTF-8 text file. Files that are not valid UTF-8, such as binaries, are reported as an error rather than returned as mojibake.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. Refuses to overwrite an existing destination.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. On Linux the reported creation time is the inode change time, which is all the platform exposes.
- 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. - Path Canonicalization: Requested paths and allowed directories are both fully resolved before the containment check, so symlinks,
..segments and Windows 8.3 short names can neither escape the allowed tree nor cause a legitimate path inside it to be rejected.
Getting Started
Prerequisites
- Python 3.10+: Matches
requires-pythoninpyproject.toml. CI covers 3.10, 3.12 and 3.13 on both Linux and Windows. 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 -
Install dependencies with
uv:uv syncThis installs from
uv.lock, so you get the same versions CI tests against. Pass--no-devto skip the test tooling.
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).
Running the tests
The suite covers path validation and confinement, the file operation helpers, the MCP tool functions, and server startup.
uv sync
uv run pytest
tests/test_path_confinement.py covers the allowed-directory boundary
specifically, including the sibling-prefix and aliased-directory cases.
test_mcp_server.py doubles as an integration check and a debugging aid. It
launches main.py as a subprocess, performs the MCP initialize handshake
over stdio, and asserts on the response. Run it on its own to see the whole
exchange printed:
uv run test_mcp_server.py
CI runs the full suite on Linux and Windows across Python 3.10, 3.12 and 3.13. A pull request cannot be merged unless every job passes.
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. - Dependencies: Verify the environment is in sync with the lockfile (
uv sync). - 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. Paths are compared after full resolution, so a symlink is judged by its target, not by where the link sits.
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.
Security
Every file operation is confined to the directories passed via --directories.
Requested paths and allowed directories are both fully resolved before the
containment check, so symlinks, .. segments and Windows 8.3 short names
cannot be used to step outside the allowed tree.
That confinement is the security property this project cares about. If you find a way around it, please report it privately rather than opening an issue. See SECURITY.md for the reporting channel and scope.
The boundary is only ever as tight as what you allow. Pointing the server at a
sensitive directory, or at /, grants the connected model exactly that access.
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.
License
Released under the BSD Zero Clause License (0BSD), the most permissive license approved by the Open Source Initiative. You may use, modify and redistribute this software for any purpose, with no obligation to preserve a copyright notice or to ship the license text.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.