j0hanz/filesystem-context-mcp-server

๐Ÿ“‚ File Systems
0 Views
0 Installs

๐Ÿ“‡ ๐Ÿ  - Read-only MCP server for secure filesystem exploration, searching, and analysis with symlink protection.

Quick Install

One-Click IDE Configuration
claude_desktop_config.json
{
  "mcpServers": {
    "j0hanz-filesystem-context-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "j0hanz-filesystem-context-mcp-server"
      ]
    }
  }
}
Or

Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.

Documentation Overview

Filesystem MCP Server

npm version License: MIT

Install in VS Code Install in VS Code Insiders Install in Visual Studio

Add to LM Studio Install in Cursor

Secure filesystem MCP server for reading, writing, searching, diffing, and patching files.

Table of Contents

Overview

A secure, production-ready Model Context Protocol server that gives AI assistants controlled access to the local filesystem. All operations are sandboxed to explicitly allowed directories with path traversal prevention, sensitive file blocking, and optional Bearer token authentication.

Supports stdio (default) and Node Streamable HTTP transport. HTTP sessions are implemented with isolated per-session server state. The HTTP transport is stateful by default and currently non-resumable; it does not persist an event store for Last-Event-ID replay.

Key Features

  • 18 filesystem tools โ€” read, write, search, diff, patch, hash, and bulk operations with structured output schemas
  • Security-first โ€” path validation, symlink escape prevention, sensitive file denylist, localhost-only CORS, Host header validation for loopback HTTP binds, optional API key auth
  • Dual transport โ€” stdio for local use, Node Streamable HTTP for networked/multi-session deployments
  • Structured output โ€” all tools return typed outputSchema / structuredContent for reliable LLM parsing
  • Self-documenting โ€” 6 built-in resources (internal://instructions, internal://tool-catalog, etc.) and 4 built-in prompts (get-help, compare-files, analyze-path, get-tool-help)

Requirements

  • Node.js >= 24

Quick Start

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}

Docker

docker run -i --rm -v /path/to/project:/workspace:ro ghcr.io/j0hanz/filesystem-mcp /workspace

Or using Docker Compose:

services:
  filesystem-mcp:
    build: .
    stdin_open: true
    volumes:
      - ./:/projects/workspace:ro
    command: ['/projects/workspace']

CLI Usage

filesystem-mcp [options] [allowedDirs...]

Arguments:
  allowedDirs              Directories the server can access

Options:
  --allow-cwd              Allow the current working directory as an additional root
  --port <number>          Enable HTTP transport on the given port
  -v, --version            Display server version
  -h, --help               Display help

Examples:
  $ npx @j0hanz/filesystem-mcp@latest /path/to/project
  $ npx @j0hanz/filesystem-mcp@latest --allow-cwd
  $ npx @j0hanz/filesystem-mcp@latest --port 3000 /path/to/project

Client Configuration

Install in VS Code

Install in VS Code

Add to .vscode/mcp.json:

{
  "servers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}

Or install via CLI:

code --add-mcp '{"name":"filesystem","command":"npx","args":["-y","@j0hanz/filesystem-mcp@latest"]}'
Install in VS Code Insiders

Install in VS Code Insiders

Add to .vscode/mcp.json:

{
  "servers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}

Or install via CLI:

code-insiders --add-mcp '{"name":"filesystem","command":"npx","args":["-y","@j0hanz/filesystem-mcp@latest"]}'
Install in Cursor

Install in Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Visual Studio

Install in Visual Studio

Add to <SOLUTIONDIR>.mcp.json or %USERPROFILE%\.mcp.json:

{
  "servers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Goose

Add to ~/.config/goose/config.yaml:

extensions:
  filesystem:
    name: Filesystem MCP
    cmd: npx
    args:
      - -y
      - '@j0hanz/filesystem-mcp@latest'
    enabled: true
    type: stdio
Add to LM Studio

Add to LM Studio

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Claude Code
claude mcp add filesystem-mcp -- npx -y @j0hanz/filesystem-mcp@latest

Or add a project-scoped .mcp.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Amp
amp mcp add filesystem-mcp -- npx -y @j0hanz/filesystem-mcp@latest

Or add to settings.json:

{
  "amp.mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Cline

Add to cline_mcp_settings.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Codex
codex mcp add filesystem -- npx -y @j0hanz/filesystem-mcp@latest

Or add to ~/.codex/config.toml (or .codex/config.toml in a trusted project):

[mcp_servers.filesystem]
command = "npx"
args = ["-y", "@j0hanz/filesystem-mcp@latest"]
Install in GitHub Copilot Coding Agent

Add this JSON in your repository's GitHub Copilot coding agent MCP configuration:

{
  "mcpServers": {
    "filesystem": {
      "type": "local",
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"],
      "tools": ["*"]
    }
  }
}
Install in Warp
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Kiro

Add to .kiro/settings/mcp.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Gemini CLI

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Zed

Add to ~/.config/zed/settings.json:

{
  "context_servers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"],
      "env": {}
    }
  }
}
Install in Augment

Add to VS Code settings.json under augment.advanced:

{
  "augment.advanced": {
    "mcpServers": [
      {
        "id": "filesystem",
        "command": "npx",
        "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
      }
    ]
  }
}
Install in Roo Code
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}
Install in Kilo Code
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@j0hanz/filesystem-mcp@latest"]
    }
  }
}

โ†‘ Back to top

Use Cases

Explore and Understand a Codebase

Discover project structure and navigate unfamiliar repositories. Start with roots to see allowed directories, use tree for an overview, find to locate files by pattern, and read or read_many to inspect contents.

Relevant tools: roots, ls, find, tree, read, read_many, stat

Search Across Files

Locate specific code patterns, function definitions, or configuration values across a project. Use grep for content search with regex support and find for file name matching.

Relevant tools: grep, find

Edit and Refactor Code

Make precise, targeted edits to source files. Use edit for surgical replacements with dry-run preview, or search_and_replace for bulk changes across multiple files matching a glob pattern.

Relevant tools: edit, search_and_replace, write

Diff and Patch Workflow

Compare file versions and apply patches. Generate a unified diff with diff_files, preview with apply_patch(dryRun: true), then apply. Supports both single-file and multi-file patches (best-effort per file with per-file results[]).

Relevant tools: diff_files, apply_patch

File Management

Create directories, move/rename files, delete files, and verify file integrity via SHA-256 hashing.

Relevant tools: mkdir, mv, rm, calculate_hash, write

Architecture

[MCP Client]
    |
    | Transport: stdio (default) or Node Streamable HTTP (--port)
    v
[MCP Server: filesystem-mcp]
    | Entry: src/index.ts -> src/server/bootstrap.ts
    |
    +-- initialize / initialized
    |
    +-- tools/call โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    |   +-- [roots]             โ€” List allowed workspace roots
    |   +-- [ls]                โ€” List directory contents
    |   +-- [find]              โ€” Find files by glob
    |   +-- [tree]              โ€” Render directory tree
    |   +-- [read]              โ€” Read file contents
    |   +-- [read_many]         โ€” Read multiple files
    |   +-- [stat]              โ€” Get file metadata
    |   +-- [stat_many]         โ€” Get multiple file metadata
    |   +-- [grep]              โ€” Search file contents
    |   +-- [mkdir]             โ€” Create directory
    |   +-- [write]             โ€” Write file
    |   +-- [edit]              โ€” Edit file (string replacements)
    |   +-- [mv]                โ€” Move/rename file
    |   +-- [rm]                โ€” Delete file
    |   +-- [calculate_hash]    โ€” SHA-256 hash
    |   +-- [diff_files]        โ€” Unified diff
    |   +-- [apply_patch]       โ€” Apply unified patch
    |   +-- [search_and_replace]โ€” Bulk search & replace
    |
    +-- resources/read โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    |   +-- internal://instructions
    |   +-- internal://tool-catalog
    |   +-- internal://workflows
    |   +-- internal://tool-info/{name}
    |   +-- filesystem-mcp://result/{id}
    |   +-- filesystem-mcp://metrics
    |
    +-- prompts/get โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    |   +-- get-help (optional topic argument)
    |   +-- compare-files (original, modified)
    |   +-- analyze-path (path)
    |   +-- get-tool-help (name)
    |
    +-- Capabilities: logging, resources, tools, prompts, completions, tasks

Request Lifecycle

[Client] -- initialize {protocolVersion, capabilities} --> [Server]
[Server] -- {protocolVersion, capabilities, serverInfo} --> [Client]
[Client] -- notifications/initialized --> [Server]
[Client] -- tools/call {name, arguments} --> [Server]
[Server] -- validate(inputSchema) --> [Handler]
[Handler] -- {content: [{type, text}], structuredContent?, isError?} --> [Client]

MCP Surface

Tools

roots ยท ls ยท find ยท tree ยท read ยท read_many ยท stat ยท stat_many ยท grep ยท mkdir ยท write ยท edit ยท mv ยท rm ยท calculate_hash ยท diff_files ยท apply_patch ยท search_and_replace

roots

List allowed workspace roots. Call first โ€” all other tools are scoped to these directories.

No parameters.


ls

List immediate directory contents: name, path, type, size, modified date.

ParameterTypeRequiredDescription
pathstringnoBase directory (default: root)
includeHiddenbooleannoInclude dotfiles. Default: false
includeIgnoredbooleannoInclude ignored items (node_modules, .git). Default: false
maxDepthintegernoMax recursion depth (1-50) when pattern is provided
maxEntriesintegernoMax entries before truncation. Default: 20000, Max: 20000
sortByenumnoname | size | modified | type. Default: name
patternstringnoRelative glob filter (e.g. **/*.ts). Absolute paths and .. are rejected
includeSymlinkTargetsbooleannoResolve symlink targets. Default: false
cursorstringnoPagination cursor from a previous response

find

Find files by glob pattern. Returns matching files with metadata.

ParameterTypeRequiredDescription
pathstringnoBase directory (default: root)
patternstringyesRelative glob pattern (e.g. **/*.ts). Absolute paths and .. are rejected
maxResultsintegernoMax results (1-10000). Default: 100
includeIgnoredbooleannoInclude ignored items. Default: false
includeHiddenbooleannoInclude dotfiles. Default: false
sortByenumnopath | name | size | modified. Default: path
maxDepthintegernoMax directory depth (0-100)
cursorstringnoPagination cursor

tree

Render a directory tree with bounded recursion. Returns ASCII tree + structured JSON.

ParameterTypeRequiredDescription
pathstringnoBase directory (default: root)
maxDepthintegernoDepth (0 = root node only). Default: 5, Max: 50
maxEntriesintegernoMax entries. Default: 1000, Max: 20000
includeHiddenbooleannoInclude dotfiles. Default: false
includeIgnoredbooleannoInclude ignored items. Default: false
includeSizesbooleannoInclude file sizes in tree entries. Default: false

read

Read text file contents. Use head/tail to preview first/last N lines of large files.

ParameterTypeRequiredDescription
pathstringyesAbsolute path to file
headintegernoRead first N lines (1-100000)
tailintegernoRead last N lines (1-100000)
startLineintegernoStart line (1-based, inclusive)
endLineintegernoEnd line (1-based, inclusive). Requires startLine
includeHashbooleannoInclude SHA-256 hash of full file content. Default: false

read_many

Read multiple text files in one request.

ParameterTypeRequiredDescription
pathsstring[]yesFiles to read (1-100 paths)
headintegernoRead first N lines of each file
tailintegernoRead last N lines of each file
startLineintegernoStart line (1-based) per file
endLineintegernoEnd line (1-based) per file

stat

Get file/directory metadata: size, modified, permissions, mime, tokenEstimate.

ParameterTypeRequiredDescription
pathstringyesAbsolute path to file or directory

stat_many

Get metadata for multiple files/directories in one request.

ParameterTypeRequiredDescription
pathsstring[]yesFile/directory paths (1-100)

grep

Search file contents (grep-like). Returns matching lines with optional context.

ParameterTypeRequiredDescription
pathstringnoBase directory (default: root)
patternstringyesSearch text or RE2 regex when isRegex=true
isRegexbooleannoTreat pattern as RE2 regex. Default: false
caseSensitivebooleannoCase-sensitive matching. Default: false
wholeWordbooleannoMatch whole words only. Default: false
contextLinesintegernoLines of context before/after (0-50). Default: 0
maxResultsintegernoMax match rows (0-10000). Default: 500
filePatternstringnoRelative glob for candidate files (e.g. **/*.ts). Default: **/*
includeHiddenbooleannoInclude dotfiles. Default: false
includeIgnoredbooleannoInclude ignored items. Default: false

mkdir

Create a new directory (recursive). Idempotent.

ParameterTypeRequiredDescription
pathstringnoAbsolute path to directory to create
pathsstring[]noMultiple directories to create. Either path or paths required

write

Write content to a file, overwriting all existing content. Creates parent directories if needed.

ParameterTypeRequiredDescription
pathstringyesAbsolute path to file
contentstringyesContent to write

edit

Apply sequential literal string replacements (first occurrence per edit). Use dryRun to preview.

ParameterTypeRequiredDescription
pathstringyesAbsolute path to file
editsarrayyesList of non-empty {oldText, newText} replacements
dryRunbooleannoPreview edits without writing. Default: false
ignoreWhitespacebooleannoTreat whitespace sequences as equivalent. Default: false

mv

Move or rename a file or directory.

ParameterTypeRequiredDescription
sourcestringnoSingle path to move (deprecated: use sources)
sourcesstring[]noPaths to move. Either source or sources required
destinationstringyesDestination path

rm

Permanently delete a file or directory. Irreversible.

ParameterTypeRequiredDescription
pathstringyesAbsolute path to file or directory
recursivebooleannoDelete non-empty directories. Default: false
ignoreIfNotExistsbooleannoNo error if missing. Default: false

calculate_hash

Calculate SHA-256 hash of a file or directory.

ParameterTypeRequiredDescription
pathstringyesAbsolute path to file or directory

diff_files

Generate a unified diff between two files. Output feeds directly into apply_patch.

ParameterTypeRequiredDescription
originalstringyesPath to original file
modifiedstringyesPath to modified file
contextintegernoLines of context in diff output
ignoreWhitespacebooleannoIgnore leading/trailing whitespace. Default: false
stripTrailingCrbooleannoStrip trailing carriage returns. Default: false

apply_patch

Apply a unified diff patch to one or more files. Single-file: throws on failure. Multi-file: best-effort per file with results[]. Workflow: diff_files -> apply_patch(dryRun) -> apply_patch.

ParameterTypeRequiredDescription
pathstringyesPath to file (single) or base directory (multi-file patch)
patchstringyesUnified diff with @@ hunk headers (single or multi-file)
fuzzFactorintegernoMax fuzzy mismatches per hunk (0-20)
autoConvertLineEndingsbooleannoAuto-convert line endings. Default: true
dryRunbooleannoValidate without writing. Default: false

search_and_replace

Bulk search-and-replace across files matching a glob. Replaces all occurrences per file. Always dryRun: true first.

ParameterTypeRequiredDescription
pathstringnoBase directory (default: root)
filePatternstringnoRelative glob pattern (e.g. **/*.ts). Default: **/*
searchPatternstringyesText to search. RE2 regex when isRegex=true
replacementstringyesReplacement text. Supports $1, $2 with regex
isRegexbooleannoTreat as RE2 regex. Default: false
dryRunbooleannoPreview matches with diff. Default: false
includeHiddenbooleannoInclude dotfiles. Default: false
includeIgnoredbooleannoInclude ignored items. Default: false
returnDiffbooleannoReturn diff even when not dry-run. Default: false
maxFilesintegernoMax files to process before stopping (1-10000)
caseSensitivebooleannoCase-sensitive matching. Default: true

Resources

ResourceURIMIME TypeDescription
Instructionsinternal://instructionstext/markdownComprehensive usage rules and guidelines
Tool Cataloginternal://tool-catalogtext/markdownTool selection guide and data flow map
Workflowsinternal://workflowstext/markdownStandard operating procedures for exploration, search, edit, patch
Tool Infointernal://tool-info/{name}text/markdownPer-tool contract details, nuances, gotchas
Result Cachefilesystem-mcp://result/{id}text/plainEphemeral cached tool output (large results externalized here)
Metricsfilesystem-mcp://metricsapplication/jsonLive per-tool call/error/avgDurationMs snapshot

Prompts

PromptArgumentsDescription
get-helptopic (optional)Return usage instructions. Optionally filter by section heading prefix
compare-filesoriginal, modifiedGenerate a workflow for comparing two files using diff_files
analyze-pathpathGenerate a workflow for analyzing a file or directory
get-tool-helpnameReturn a prompt with the authoritative contract for a specific tool

MCP Capabilities

CapabilityStatusEvidence
loggingconfirmedsrc/server/bootstrap.ts โ€” registered in capabilities
resourcesconfirmedsrc/server/bootstrap.ts โ€” 6 resources registered
toolsconfirmedsrc/server/bootstrap.ts โ€” 18 tools registered
promptsconfirmedsrc/server/bootstrap.ts โ€” 4 prompts registered
completionsconfirmedsrc/completions.ts โ€” path, topic, and tool-name auto-completion
tasksconfirmedsrc/server/bootstrap.ts โ€” optional task support (list, cancel, requests)

Tool Annotations

AnnotationToolsValue
readOnlyHint: trueroots, ls, find, tree, read, read_many, stat, stat_many, grep, calculate_hash, diff_filesRead-only, idempotent, non-destructive
destructiveHint: truewrite, edit, rm, mv, search_and_replace, apply_patchDestructive writes, not idempotent
idempotentHint: truemkdirIdempotent write, non-destructive

Structured Output

All 18 tools define outputSchema (Zod -> JSON Schema) and return structuredContent alongside text content. Set FS_CONTEXT_STRIP_STRUCTURED=true to strip output schemas from tool definitions (reduces token usage for LLMs that don't use structured output).

โ†‘ Back to top

Configuration

HTTP & Auth

VariableDefaultDescription
FILESYSTEM_MCP_API_KEY(none)Bearer token required when binding HTTP to a non-loopback host
FILESYSTEM_MCP_MAX_HTTP_SESSIONS100Max concurrent HTTP sessions (1-10,000)
FILESYSTEM_MCP_HTTP_HOST127.0.0.1HTTP server bind address
FS_CONTEXT_MAX_REQUEST_BYTES4194304 (4 MB)Max HTTP request body size (1 KB - 256 MB)

File Size Limits

VariableDefaultDescription
MAX_FILE_SIZE10485760 (10 MB)Max file size for text read operations (1 MB - 100 MB)
MAX_SEARCH_SIZE1048576 (1 MB)Max file size for content search/grep (100 KB - 10 MB)
MAX_READ_MANY_TOTAL_SIZE524288 (512 KB)Max cumulative size for read_many requests (10 KB - 100 MB)
DEFAULT_SEARCH_TIMEOUT5000Search operation timeout in ms (100 - 60,000)

Access Control

VariableDefaultDescription
FS_CONTEXT_ALLOW_SENSITIVEfalseAllow reading sensitive files (.env, .key, credentials, tokens)
FS_CONTEXT_DENYLIST(none)CSV/newline-separated glob patterns to block (in addition to built-in denylist)
FS_CONTEXT_ALLOWLIST(none)CSV/newline-separated glob patterns to permit (overrides denylist)

Output & Inline Limits

VariableDefaultDescription
FS_CONTEXT_MAX_INLINE_CHARS20000Max inline result chars before externalizing to filesystem-mcp://result/{id}
FS_CONTEXT_MAX_INLINE_MATCHES50Max inline search matches before truncation
FS_CONTEXT_STRIP_STRUCTUREDfalseStrip outputSchema from tool definitions (reduces tokens)

Tasks

VariableDefaultDescription
FILESYSTEM_MCP_MAX_TASK_TTL_MS3600000 (1 hr)Max task TTL before auto-eviction (1 s - 24 hr)
FILESYSTEM_MCP_MAX_CONCURRENT_TASKS100Max simultaneous task executions (1-10,000)

Logging & Diagnostics

VariableDefaultDescription
FILESYSTEM_MCP_LOG_LEVELinfoMCP log level: debug, info, notice, warning, error, critical, alert, emergency
FS_CONTEXT_DIAGNOSTICSfalseEnable diagnostic logging
FS_CONTEXT_DIAGNOSTICS_DETAILfalseEnable detailed diagnostic output
FS_CONTEXT_TOOL_LOG_ERRORSfalseLog tool errors to stderr
FS_CONTEXT_SEARCH_WORKERS_DEBUGfalseDebug logging for search worker pool

Performance

VariableDefaultDescription
FS_CONTEXT_SEARCH_WORKERSCPU cores (โ‰ค 8)Concurrent search worker threads (1-16)
FS_CONTEXT_LIST_CURSOR_TTL_MS300000 (5 min)Cursor TTL for ls pagination snapshots

โ†‘ Back to top

HTTP Endpoints

When started with --port <number>, the server exposes a single MCP endpoint:

MethodPathPurpose
POST/mcpInitialize session or send requests (Streamable HTTP)
GET/mcpHTTP streaming session endpoint
DELETE/mcpTerminate a session

Required headers:

  • mcp-protocol-version โ€” use the negotiated MCP protocol version on post-initialize HTTP requests
  • mcp-session-id โ€” required for GET/DELETE (returned by POST on initialize)

Authentication: Requests to non-loopback HTTP binds require FILESYSTEM_MCP_API_KEY; clients must then send Authorization: Bearer <key>. Loopback-only binds may omit auth for local use. Uses SHA-256 timing-safe comparison.

CORS: Only localhost origins allowed (127.0.0.1, ::1, localhost).

Host validation: Loopback HTTP binds validate the Host header (localhost, 127.0.0.1, [::1]) to reduce DNS rebinding risk. Non-loopback binds still require FILESYSTEM_MCP_API_KEY.

Security

ControlStatusEvidence
Path sandboxingconfirmedsrc/lib/paths.ts โ€” all paths validated against allowed roots
Traversal preventionconfirmedsrc/lib/paths.ts โ€” resolved paths checked after normalization
Symlink escape preventionconfirmedsrc/__tests__/security.test.ts โ€” symlink boundary enforcement
Sensitive file denylistconfirmedsrc/lib/constants.ts โ€” blocks .git, .env*, SSH keys, certs, secrets
Origin validationconfirmedsrc/server/bootstrap.ts โ€” localhost-only Origin allowlist
Bearer authconfirmedsrc/server/bootstrap.ts โ€” optional FILESYSTEM_MCP_API_KEY with timing-safe compare
Input validationconfirmedsrc/schemas.ts โ€” Zod strict schemas on all tool inputs
Request body limitconfirmedsrc/server/bootstrap.ts โ€” configurable max request size (413 on overflow)
Remote bind guardconfirmedsrc/server/bootstrap.ts โ€” refuses non-loopback bind without FILESYSTEM_MCP_API_KEY

โ†‘ Back to top

Development

  • dev โ€” tsc --watch --preserveWatchOutput โ€” Watch mode TypeScript compilation
  • dev:run โ€” node --env-file=.env --watch dist/index.js โ€” Run server with auto-reload
  • start โ€” node dist/index.js โ€” Run production server
  • build โ€” node scripts/tasks.mjs build โ€” Clean build
  • test โ€” node scripts/tasks.mjs test โ€” Build + run all tests
  • test:fast โ€” node --test --import tsx/esm src/__tests__/**/*.test.ts node-tests/**/*.test.ts โ€” Run tests without build
  • lint โ€” eslint . โ€” Lint source
  • type-check โ€” node scripts/tasks.mjs type-check โ€” Type-check src + tests
  • format โ€” prettier --write . โ€” Format code
  • inspector โ€” npm run build && npx -y @modelcontextprotocol/inspector node dist/index.js ${workspaceFolder} โ€” Launch MCP Inspector

Build and Release

  • CI: .github/workflows/release.yml โ€” runs lint, type-check, test, build before tagging/publishing.
  • Docker: Multi-stage build with node:24-alpine. Builder compiles TypeScript + native modules (re2); release stage runs as non-root mcp user.
  • npm: npm run prepublishOnly runs lint + type-check + build.

Troubleshooting

  • "No allowed directories" โ€” Pass at least one directory argument or use --allow-cwd.
  • Sensitive file blocked โ€” Files matching the denylist (.env*, .git, SSH keys) are blocked by design. Check src/lib/constants.ts for the full list.
  • Large result externalized โ€” When tool output exceeds inline limits, it's cached as a resource at filesystem-mcp://result/{id}. Read the resource URI to get the full content.
  • Stdio: logs on stdout โ€” Keep logs on stderr only. The server uses console.error for diagnostics.
  • HTTP 413 โ€” Request body exceeds FS_CONTEXT_MAX_REQUEST_BYTES. Increase the limit or reduce payload size.
  • HTTP 401 โ€” FILESYSTEM_MCP_API_KEY is set but the request is missing or has an incorrect Authorization: Bearer header.

Credits

DependencyDescription
@modelcontextprotocol/serverMCP server SDK package
@modelcontextprotocol/clientMCP client SDK package
@modelcontextprotocol/nodeNode transport package for MCP runtime
commanderCLI argument parsing
diffUnified diff generation and patch application
ignore.gitignore pattern matching
re2Safe RE2 regex engine (no ReDoS)
zodSchema validation and JSON Schema generation

License

MIT License. See LICENSE for details.

โ†‘ Back to top

Related MCP Servers

modelcontextprotocol/server-filesystemVerified

๐Ÿ“‡ ๐Ÿ  - Direct local file system access.

๐Ÿ“‚ File Systems1 views
8b-is/smart-tree

๐Ÿฆ€ ๐Ÿ  ๐ŸŽ ๐ŸชŸ ๐Ÿง - AI-native directory visualization with semantic analysis, ultra-compressed formats for AI consumption, and 10x token reduction. Supports quantum-semantic mode with intelligent file categorization.

๐Ÿ“‚ File Systems0 views
aadilr/changethisfile-mcp

๐Ÿ“‡ โ˜๏ธ - Free file conversion between 690+ formats. Tools: convertfile (URL or base64 in โ†’ signed download URL out) and listconversions. Covers image, video, audio, document, data, font, ebook, and archive formats. No auth or signup required; remote streamable-HTTP endpoint available (see README).

๐Ÿ“‚ File Systems0 views
alebgl77/ftp-deploy-mcp

๐Ÿ“‡ ๐Ÿ  ๐ŸŽ ๐ŸชŸ ๐Ÿง - Deploy files from AI agents to your own FTP/FTPS/SFTP servers โ€” multi-server config, recursive deploy with dry-run and gitignore-like excludes, per-server path jail and read-only mode, FileZilla import, one-command setup for popular MCP clients.

๐Ÿ“‚ File Systems0 views

Engagement

Views
0
Installs
0
Upvotes
0

Views and upvotes are unique per visitor network (hashed IP). Installs count copy actions.

Status

Health: Not checked yet

We have not completed a health check for this listing yet.

No check timestamp yet.

Unclaimed listing (imported or pending owner verification). Claim it โ†’
โ˜… Spotlight Slot

Feature Your MCP Server

Get maximum visibility for your server across our directory, search results, and detail pages.

Spotlight Your Server

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge and attach your website.

Claim this listing

Promote this listing

Optional paid placement. Free listings stay free forever.

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.