Node.js server implementing Model Context Protocol (MCP) for filesystem operations.
The server uses a flexible directory access control system. Directories can be specified via command-line arguments or dynamically via Roots.
Specify Allowed directories when starting the server:
mcp-server-filesystem /path/to/dir1 /path/to/dir2
MCP clients that support Roots can dynamically update the Allowed directories.
Roots notified by Client to Server, completely replace any server-side Allowed directories when provided.
Important: If server starts without command-line arguments AND client doesn’t support roots protocol (or provides empty roots), the server will throw an error during initialization.
This is the recommended method, as this enables runtime directory updates via roots/list_changed notifications without server restart, providing a more flexible and modern integration experience.
The server’s directory access control follows this flow:
initialize request with capabilitiescapabilities.roots)roots/listnotifications/roots/list_changedlist_allowed_directories tool to see current directoriesNote: The server will only allow operations within directories specified either via args or via Roots.
path (string)head (number, optional): First N linestail (number, optional): Last N lineshead and tail simultaneouslypath (string)paths (string[])path (string): File locationcontent (string): File contentpath (string): File to editedits (array): List of edit operations
oldText (string): Text to search for (can be substring)newText (string): Text to replace withdryRun (boolean): Preview changes without applying (default: false)path (string)path (string)path (string): Directory path to listsortBy (string, optional): Sort entries by “name” or “size” (default: “name”)source (string)destination (string)path (string): Starting directorypattern (string): Search patternexcludePatterns (string[]): Exclude any patterns.path (string): Starting directoryexcludePatterns (string[]): Exclude any patterns. Glob formats are supported.name (string): File/directory nametype (‘file’ |
‘directory’): Entry type |
children (array): Present only for directories
path (string)This server sets MCP ToolAnnotations on each tool so clients can:
The mapping for filesystem tools is:
| Tool | readOnlyHint | idempotentHint | destructiveHint | Notes |
|---|---|---|---|---|
read_text_file |
true |
– | – | Pure read |
read_media_file |
true |
– | – | Pure read |
read_multiple_files |
true |
– | – | Pure read |
list_directory |
true |
– | – | Pure read |
list_directory_with_sizes |
true |
– | – | Pure read |
directory_tree |
true |
– | – | Pure read |
search_files |
true |
– | – | Pure read |
get_file_info |
true |
– | – | Pure read |
list_allowed_directories |
true |
– | – | Pure read |
create_directory |
false |
true |
false |
Re‑creating the same dir is a no‑op |
write_file |
false |
true |
true |
Overwrites existing files |
edit_file |
false |
false |
true |
Re‑applying edits can fail or double‑apply |
move_file |
false |
false |
true |
Deletes source file |
Note:
idempotentHintanddestructiveHintare meaningful only whenreadOnlyHintisfalse, as defined by the MCP spec.
Add this to your claude_desktop_config.json:
Note: you can provide sandboxed directories to the server by mounting them to /projects. Adding the ro flag will make the directory readonly by the server.
Note: all directories must be mounted to /projects by default.
{
"mcpServers": {
"filesystem": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop",
"--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro",
"--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt",
"mcp/filesystem",
"/projects"
]
}
}
}
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/username/Desktop",
"/path/to/other/allowed/dir"
]
}
}
}
For quick installation, click the installation buttons below…
For manual installation, you can configure the MCP server using one of these methods:
Method 1: User Configuration (Recommended)
Add the configuration to your user-level MCP configuration file. Open the Command Palette (Ctrl + Shift + P) and run MCP: Open User Configuration. This will open your user mcp.json file where you can add the server configuration.
Method 2: Workspace Configuration
Alternatively, you can add the configuration to a file called .vscode/mcp.json in your workspace. This will allow you to share the configuration with others.
For more details about MCP configuration in VS Code, see the official VS Code MCP documentation.
You can provide sandboxed directories to the server by mounting them to /projects. Adding the ro flag will make the directory readonly by the server.
Note: all directories must be mounted to /projects by default.
{
"servers": {
"filesystem": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--mount", "type=bind,src=${workspaceFolder},dst=/projects/workspace",
"mcp/filesystem",
"/projects"
]
}
}
}
{
"servers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"${workspaceFolder}"
]
}
}
}
Docker build:
docker build -t mcp/filesystem -f src/filesystem/Dockerfile .
This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.