JWears/Mcp-server
If you are the rightful owner of Mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
The Local Docs MCP Server is a TypeScript-based server designed to expose local documentation folders to AI assistants using the Model Context Protocol (MCP).
Local Docs MCP Server
A TypeScript-based Model Context Protocol (MCP) server that exposes multiple local documentation folders (namespaces) to AI assistants via tools and resources.
Features
- 🔌 HTTP Transport: Uses Streamable HTTP on
POST /mcp(no stdio) - 📁 Multi-Namespace Support: Organize docs across multiple roots with namespace isolation
- 🔗 Resource Access: Dynamic resource template
docs://{namespace}/{path}for file access - 🛠️ Three Tools:
list_files- List files matching glob patterns across namespacesread_file- Read specific file contents from a namespacesearch- Search for text across multiple files and namespaces
- 🔒 Security: Path traversal prevention, symlink escape detection, binary file filtering, configurable file size limits
- 📝 MIME Types: Automatic MIME type detection for all files
- ⚙️ Flexible Configuration: Configure via environment variables or
docs.config.json
Installation
Dependencies are already installed. If you need to reinstall:
npm install
Configuration
Method 1: Configuration File (docs.config.json)
Create a docs.config.json file in the project root:
{
"roots": [
{
"ns": "docs",
"path": "./docs"
},
{
"ns": "api",
"path": "./api-docs"
},
{
"ns": "guides",
"path": "C:/absolute/path/to/guides"
}
],
"maxFileKB": 256,
"allowSymlinks": false,
"ignore": [
"**/node_modules/**",
"**/.git/**",
"**/dist/**",
"**/build/**"
]
}
Method 2: Environment Variables
Set the DOCS_DIRS environment variable with comma-separated namespace:path pairs:
# Windows PowerShell
$env:DOCS_DIRS="docs:./docs,api:./api-docs,guides:C:/path/to/guides"
npm run dev
Note: Environment variables take precedence and will override/merge with docs.config.json.
Configuration Options
roots: Array of namespace definitionsns: Namespace identifier (alphanumeric, hyphens, underscores)path: Absolute or relative path to the root directory
maxFileKB: Maximum file size in kilobytes (default: 256)allowSymlinks: Allow symlinks that point outside the namespace (default: false)ignore: Glob patterns to ignore (default: node_modules, .git, etc.)PORT: Server port via environment variable (default: 3000)
Running the Server
Development Mode (with auto-reload)
npm run dev
Production Mode
npm start
The server will print the MCP URL on startup:
🚀 Local Docs MCP Server running
📁 Registered namespaces:
- docs: C:\Users\...\mcp-day\docs
- api: C:\Users\...\mcp-day\api-docs
🔗 MCP URL: http://localhost:3000/mcp
💚 Health check: http://localhost:3000/health
Testing with MCP Inspector
-
Install MCP Inspector (if not already installed):
npx @modelcontextprotocol/inspector -
Start the server in one terminal:
npm run dev -
Open MCP Inspector in another terminal:
npx @modelcontextprotocol/inspector -
Connect to the server:
- In the Inspector UI, enter the MCP URL:
http://localhost:3000/mcp - Transport type:
HTTP
- In the Inspector UI, enter the MCP URL:
-
Test the tools:
List Files (all namespaces):
{ "pattern": "**/*.md", "max": 50 }List Files (specific namespace):
{ "pattern": "**/*.md", "ns": "docs", "max": 50 }List Files (multiple namespaces):
{ "pattern": "**/*.md", "ns": ["docs", "api"], "max": 50 }Read File:
{ "ns": "docs", "path": "welcome.md" }Search (all namespaces):
{ "query": "MCP", "glob": "**/*.md", "max": 100 }Search (specific namespace):
{ "query": "MCP", "glob": "**/*.md", "ns": "docs", "max": 100 } -
Test Resources:
- Resources now use namespace URIs:
docs://{namespace}/{path} - Example:
docs://docs/welcome.md,docs://api/endpoints.md - Click on any resource link in the Inspector
- The file content should appear with proper MIME type
- Resources now use namespace URIs:
Project Structure
mcp-day/
├── server.ts # Main MCP server implementation
├── src/
│ └── roots.ts # RootRegistry implementation
├── package.json # Project configuration
├── tsconfig.json # TypeScript configuration
├── docs.config.json # Namespace configuration
├── README.md # This file
└── docs/ # Default documentation namespace
├── welcome.md # Sample markdown file
├── api.md # API reference
└── config.json # Sample JSON file
Tools Reference
list_files
Lists files in the docs directory matching a glob pattern. Can filter by namespace(s).
Input:
pattern(optional): Glob pattern (default:**/*.{md,mdx,txt,json})ns(optional): Namespace(s) to search - string or array. If omitted, searches all namespacesmax(optional): Maximum results (default: 200)
Output:
count: Number of files returnednamespaces: Array of searched namespacesfiles: Array withns,path,uri,size,mtime,mimeType- Resource links for each file as
docs://{ns}/{path}
read_file
Reads a file from a specific namespace in the docs directory.
Input:
ns(required): Namespace to read frompath(required): Relative path to the file within the namespace
Output:
ns: Namespacepath: File pathbytes: File sizelines: Line count- Resource link to the file content as
docs://{ns}/{path}
search
Searches for text in files. Can filter by namespace(s).
Input:
query(required): Search textglob(optional): File pattern to searchns(optional): Namespace(s) to search - string or array. If omitted, searches all namespacesmax(optional): Maximum matches (default: 100)contextLines(optional): Context lines (default: 1)
Output:
query: Search termnamespaces: Array of searched namespacesmatchCount: Number of matchesmatches: Array withns,path,lineNumber,line,start,end,uri- Resource links to matched files as
docs://{ns}/{path}
Resources
The server exposes dynamic resource templates for each namespace:
- URI Pattern:
docs://{namespace}/{path} - Examples:
docs://docs/welcome.mddocs://api/endpoints.mddocs://guides/tutorial.md
- Returns: File content with correct MIME type
Resources are automatically linked in tool responses and can be opened directly in the MCP Inspector.
Security Features
- Path Traversal Protection: All paths are validated to ensure they're within the namespace root
- Symlink Escape Detection: By default, symlinks pointing outside the namespace are blocked (configurable)
- Binary File Rejection: Binary files are automatically skipped
- Configurable File Size Limits: Files larger than the configured limit are rejected (default: 256KB)
- Namespace Validation: Namespace identifiers are validated (alphanumeric, hyphens, underscores only)
- Ignore Patterns: Automatically skip node_modules, .git, and other configured patterns
- Sanitized Errors: Error messages don't expose internal paths
Customization
Using Multiple Namespaces
Example 1: Via environment variable
# Windows PowerShell
$env:DOCS_DIRS="docs:./docs,api:./api-docs,guides:C:/guides"
npm run dev
Example 2: Via docs.config.json
{
"roots": [
{ "ns": "docs", "path": "./docs" },
{ "ns": "api", "path": "./api-docs" },
{ "ns": "guides", "path": "C:/absolute/path/to/guides" }
]
}
To add new namespaces, edit the docs.config.json file and restart the server.
Configuring File Size Limits
Edit docs.config.json:
{
"maxFileKB": 512,
"roots": [...]
}
Allowing Symlinks
Edit docs.config.json:
{
"allowSymlinks": true,
"roots": [...]
}
Warning: Only enable if you trust the symlink targets. This allows symlinks to point outside namespace roots.
Custom Ignore Patterns
Edit docs.config.json:
{
"ignore": [
"**/node_modules/**",
"**/.git/**",
"**/dist/**",
"**/build/**",
"**/*.log",
"**/tmp/**"
],
"roots": [...]
}
Troubleshooting
Server won't start:
- Check if port 3000 is already in use
- Try a different port:
$env:PORT="3001"; npm start - Check TypeScript compilation errors
Files not appearing:
- Verify namespace configuration in
docs.config.jsonorDOCS_DIRS - Check that namespace paths exist and are accessible
- Ensure files match the glob pattern
- Check file permissions
- Review ignore patterns
Namespace not found errors:
- Run
roots.listtool to see registered namespaces - Check namespace spelling (case-sensitive)
- Verify
docs.config.jsonis valid JSON - Check console logs for initialization warnings
Inspector can't connect:
- Verify the server is running
- Check the MCP URL is correct:
http://localhost:3000/mcp - Ensure no firewall is blocking the connection
- Check health endpoint:
http://localhost:3000/health
Path traversal or symlink errors:
- Ensure paths are relative to the namespace root
- Check
allowSymlinkssetting if using symlinks - Verify symlinks don't escape the namespace directory
File too large errors:
- Increase
maxFileKBindocs.config.json - Or filter out large files using ignore patterns
License
ISC