paddock
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@paddocklist all files in my workspace directory"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
paddock — Local filesystem workbench (MCP stdio server)
paddock gives agents a complete, constrained set of local file operations: text read/write, directory management, filename search, content search, and metadata queries — all operations are confined to configurable "paddock" directories, and out-of-bounds access is always rejected.
Zero runtime dependencies: pure Node.js standard library, no
npm installneededMCP protocol: line-delimited JSON-RPC 2.0 over stdio, loadable by any MCP client
dsh-ready: ships a Cordis bridge plugin, one-line
bundleintegration with the harnessRead-only mode:
--read-onlyblocks all write operations in one shotLarge files & binaries: streaming head/tail, byte slicing, base64 reads, binary sniffing
Search: a self-built glob engine (
***?{a,b}[abc]) plus regex/fixed-string content search
Quick start
# No dependency installation needed, run directly
node src/entry.js "C:/Users/me/projects"Once started, the MCP session begins: JSON-RPC messages are read line by line from stdin, written line by line to stdout, and logs go only to stderr.
Connect from any MCP client (example with a standard MCP client config):
{
"mcpServers": {
"paddock": {
"command": "node",
"args": ["/path/to/fs-mcp/src/entry.js", "C:/Users/me/projects"]
}
}
}You can also run a smoke session directly to verify:
# Write an initialize request to stdin and observe the response
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}' | node src/entry.js "C:/Users/me/projects"Related MCP server: MCP Local Filesystem Server
Installation
As an MCP server: copy this directory, run
node src/entry.js <paddock dirs…>, no build step.As a dsh plugin: see docs/INTEGRATION.md.
Requirements: Node.js ≥ 18.17 (check with
node --version).
Installing in DSH
dsh plugin --profile demo add github:JohnXu22786/fs-mcpdemois a dsh profile: it is created automatically on first use, and the package is added todsh.profile.bundles;The
cordis.patch.ymlinside the package defines thepaddock/bridgeplugin, which starts this MCP server within the dsh process and registers all 16 tools intoctx.toolsafter the handshake — no manual configuration needed;Removal:
dsh plugin --profile demo remove paddockConfiguration
Configuration is merged as "defaults < config file < environment variables < command-line arguments"; paddock directories are unioned across all three sources.
Command line
node src/entry.js [options] [paddock dirs…]
--config <path> config file (defaults to paddock.config.json in the working directory, loaded only if present)
--read-only read-only mode: blocks all write operations
--zones <path> additional paddock directories (repeatable)
--verbose debug logging (stderr)
--version / --helpPositional arguments are treated as paddock directories. At least one paddock is required, otherwise startup fails (exit code 2).
Config file (paddock.config.json)
{
"zones": ["C:/Users/me/projects", "C:/Users/me/data"],
"readOnly": false,
"limits": {
"peekBytes": 1048576,
"readBytes": 16777216,
"sliceBytes": 65536,
"grepBytes": 262144,
"grepHits": 200,
"findHits": 1000,
"treeDepth": 6
},
"behavior": {
"includeHidden": false
}
}A full example is in examples/paddock.config.example.json.
Environment variables
Variable | Description |
| config file path (takes precedence over the default path) |
| paddock directories: a JSON array string ( |
|
|
| same as above ( |
limits semantics
Key | Default | Effect |
| 1 MiB | upper bound for |
| 16 MiB | upper bound for |
| 64 KiB | upper bound for a single |
| 256 KiB | per-file scan limit for |
| 200 | hit-count limit for |
| 1000 | result-count limit for |
| 6 | default depth limit for |
| 20000 | total node limit for |
Tool interface
16 tools; write operations carry a mutating marker (gated by read-only mode). All path arguments must be absolute paths inside a paddock; relative paths are resolved against the process working directory and validated the same way.
Read-only tools
Tool | Parameters | Description |
| — | list paddocks (given paths + resolved real paths) |
|
| list directory: entry type (file/dir/link), size, sorting, counts and totals |
|
| recursive directory tree (JSON); overly deep directories are marked |
|
| read text files; head/tail stream the first/last N lines; binary and over-limit files are rejected |
|
| batch text reads (1–64 files); a single file failure is folded without aborting |
|
| read large files by byte range; binary content returned as base64; |
|
| base64 read of binaries + MIME guessing (png/jpg/mp3/…) |
|
| recursive filename glob search |
|
| content search: regex (case-insensitive by default) or fixed string; line numbers + truncated snippets |
|
| metadata: type/size/permissions/times; symlinks report their target |
Write tools
Tool | Parameters | Description |
|
| write/overwrite (UTF-8), parent directories created automatically |
|
| precise replacement: |
|
| recursive directory creation, idempotent |
|
| move/rename; refuses to overwrite an existing destination; cross-device copies + deletes automatically |
|
| copy files/directories; symlinks are not followed (links are recreated as-is) |
|
| delete; non-empty directories need |
Error model
Tool-level failures do not produce protocol errors; they return structured isError: true results:
{
"isError": true,
"content": [{ "type": "text", "text": "[not-found] File does not exist: C:/…" }],
"structuredContent": { "error": { "code": "not-found", "message": "File does not exist: C:/…" } }
}Error codes: config readonly validation fence (out of bounds) not-found conflict limit binary wrong-kind io internal (fallback). network / timeout / jsonrpc appear only in the bridge client (the communication layer with the server subprocess). Error messages carry actionable follow-up suggestions (e.g. large files are pointed to pdk_slice).
Security model
Paddock boundary: every path passes "paddock" validation before any IO (see docs/SECURITY.md).
Symlinks: existing paths are
realpath-resolved then validated; new paths validate by resolving the "nearest existing ancestor" and re-checking — links inside a paddock that point outside can never become a springboard.Component-level checks: string-prefix misjudgments such as
zonevszone_extraare impossible; win32 comparisons fold case.Windows hardening: rejects invalid path segments, trailing dots/spaces, and reserved device names (NUL/CON/COM1…).
Read-only mode: with
--read-onlyor configreadOnly: true, all 6 write tools are gated.Delete protection: paddock root directories cannot be removed by
pdk_remove.Large files/binaries: text-read limits, slice reads, base64, NUL-byte sniffing — the model is never slammed with gigantic or binary content.
dsh integration
Pick either of the two ways; details in docs/INTEGRATION.md:
Bundle bridge (recommended, zero dependencies): this package's
dsh.bundle.patchpoints tocordis.patch.yml, and dsh merges thepaddock/bridgeplugin line into the config tree; the plugin starts the server subprocess inside the harness process and, after the handshake, registers all 16 tools intoctx.tools— model-side tool names look likemcp__paddock__pdk_peek.Official MCP client: connect directly to
node src/entry.js <paddock>with the@deepseek-ai/dsh-mcp-clientconfig line.
Development
npm test # node --test: 100+ cases (4 symlink cases skip on win32 as they need developer mode)
npm run smoke # sequential end-to-end smoke test (real subprocess + stdio session, 16 checks)
node src/entry.js --helpTest coverage: paddock escapes/symlink escapes/ancestor-chain protection, read-write round-trips, large-file and binary policies, glob and content search, three-source config merging, protocol engine, end-to-end subprocess sessions.
License
MIT, see LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseBqualityDmaintenanceA lightweight MCP server for basic file operations, enabling reading, writing, and listing files securely via the Model Context Protocol.31
- Flicense-qualityDmaintenanceAn MCP server that provides secure access to local file system operations.
- FlicenseAqualityDmaintenanceA safe MCP server for sandboxed filesystem operations (list, move, create directories, delete files) via pure Python, designed for Claude Desktop.5
- Alicense-qualityCmaintenanceMCP server that exposes file operations (list, read, write, delete, unzip) in a sandbox directory, preventing path traversal.24MIT
Related MCP Connectors
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Zero-install remote MCP server for proof-of-existence file attestation.
A MCP server built for developers enabling Git based project management with project and personal…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/JohnXu22786/fs-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server