
WebDAV MCP Server
β 17from LaubPlusCo
Perform CRUD operations on a WebDAV server with basic authentication.
WebDAV MCP Server
A Model Context Protocol (MCP) server that enables CRUD operations on a WebDAV endpoint with basic authentication. This server enables Claude Desktop and other MCP clients to interact with WebDAV file systems through natural language commands.
Features
-
Connect to any WebDAV server with optional authentication
-
Perform CRUD operations on files and directories
-
Expose file operations as MCP resources and tools
-
Run via stdio transport (for Claude Desktop integration) or HTTP/SSE transport
-
Secure access with optional basic authentication
-
Support for bcrypt-encrypted passwords for MCP server authentication (WebDAV passwords must be plain text due to protocol limitations)
-
Connection pooling for better performance with WebDAV servers
-
Configuration validation using Zod
-
Structured logging for better troubleshooting
Or with npx
npx webdav-mcp-server
Option 2: Clone and build from source
Clone repository
git clone https://github.com/yourusername/webdav-mcp-server.git cd webdav-mcp-server
Build the application
npm run build
Option 3: Docker
Build the Docker image
docker build -t webdav-mcp-server .
Run the container without authentication
docker run -p 3000:3000 -e WEBDAV_ROOT_URL=http://your-webdav-server -e WEBDAV_ROOT_PATH=/webdav webdav-mcp-server
Run the container with authentication for both WebDAV and MCP server
docker run -p 3000:3000 -e WEBDAV_ROOT_URL=http://your-webdav-server -e WEBDAV_ROOT_PATH=/webdav -e WEBDAV_AUTH_ENABLED=true -e WEBDAV_USERNAME=admin -e WEBDAV_PASSWORD=password -e AUTH_ENABLED=true -e AUTH_USERNAME=user -e AUTH_PASSWORD=pass webdav-mcp-server
WebDAV authentication (optional)
WEBDAV_AUTH_ENABLED=true WEBDAV_USERNAME=admin
WebDAV password must be plain text (required when auth enabled)
The WebDAV protocol requires sending the actual password to the server
WEBDAV_PASSWORD=password
Auth password for MCP server can be a bcrypt hash (unlike WebDAV passwords)
AUTH_PASSWORD={bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy
Encrypted Passwords for MCP Server Authentication
For enhanced security of the MCP server (not WebDAV connections), you can use bcrypt-encrypted passwords instead of storing them in plain text:
- Generate a bcrypt hash:
Using the built-in utility
npm run generate-hash -- yourpassword
Or with npx
npx webdav-mcp-generate-hash yourpassword 2. Add the hash to your .env file with the {bcrypt} prefix:
AUTH_PASSWORD={bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy
This way, your MCP server password is stored securely. Note that WebDAV passwords must always be in plain text due to protocol requirements.
If using npx
npx webdav-mcp-server
If built from source
node dist/index.js
Running with HTTP/SSE transport
This mode enables the server to be accessed over HTTP with Server-Sent Events for real-time communication.
If using npx
npx webdav-mcp-server --http
If built from source
node dist/index.js --http
Start both WebDAV and MCP servers
cd docker docker-compose up -d
This will start:
- hacdias/webdav server on port 4080 (username: admin, password: admin)
- MCP server on port 3000 (username: user, password: pass)
This setup uses hacdias/webdav, a simple and standalone WebDAV server written in Go. The configuration for the WebDAV server is stored in webdav_config.yml, which you can modify to adjust permissions, add users, or change other settings.
The WebDAV server stores all files in a Docker volume called webdav_data, which persists across container restarts.
Server address and port
address: 0.0.0.0 port: 6060
Root data directory
directory: /data
Enable/disable CORS
cors: enabled: true
Additional CORS settings...
Default permissions (C=Create, R=Read, U=Update, D=Delete)
permissions: CRUD
User definitions
users:
username: admin password: admin # Plain text password permissions: CRUD # Full permissions
username: reader password: reader permissions: R # Read-only permissions
You can also use bcrypt-encrypted passwords
- username: secure password: "{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi"
For more advanced configuration options, refer to the hacdias/webdav documentation.
Testing
To run the tests:
npm test
Integrating with Claude Desktop
- Ensure the MCP feature is enabled in Claude Desktop
Using npx 2. Open Claude Desktop settings and click edit config (
claude_desktop_config.json) 3. Addjson { "mcpServers": { "webdav": { "command": "npx", "args": [ "-y", "webdav-mcp-server" ], "env": { "WEBDAV_ROOT_URL": "", "WEBDAV_ROOT_PATH": "", "WEBDAV_USERNAME": "", "WEBDAV_PASSWORD": "", "WEBDAV_AUTH_ENABLED": "true|false" } } } }Using node and local build 2. Clone this repository and runsetup.shon mac/linux orsetup.baton windows 3. Open Claude Desktop settings and click edit config (claude_desktop_config.json) 4. Addjson { "mcpServers": { "webdav": { "command": "node", "args": [ "/dist/index.js" ], "env": { "WEBDAV_ROOT_URL": "", "WEBDAV_ROOT_PATH": "", "WEBDAV_USERNAME": "", "WEBDAV_PASSWORD": "", "WEBDAV_AUTH_ENABLED": "true|false" } } } }
Available MCP Resources
-
webdav://{path}/list- List files in a directory -
webdav://{path}/content- Get file content -
webdav://{path}/info- Get file or directory information
Available MCP Tools
-
webdav_create_remote_file- Create a new file on a remote WebDAV server -
webdav_get_remote_file- Retrieve content from a file stored on a remote WebDAV server -
webdav_update_remote_file- Update an existing file on a remote WebDAV server -
webdav_delete_remote_item- Delete a file or directory from a remote WebDAV server -
webdav_create_remote_directory- Create a new directory on a remote WebDAV server -
webdav_move_remote_item- Move or rename a file/directory on a remote WebDAV server -
webdav_copy_remote_item- Copy a file/directory to a new location on a remote WebDAV server -
webdav_list_remote_directory- List files and directories on a remote WebDAV server
Available MCP Prompts
-
webdav_create_remote_file- Prompt to create a new file on a remote WebDAV server -
webdav_get_remote_file- Prompt to retrieve content from a remote WebDAV file -
webdav_update_remote_file- Prompt to update a file on a remote WebDAV server -
webdav_delete_remote_item- Prompt to delete a file/directory from a remote WebDAV server -
webdav_list_remote_directory- Prompt to list directory contents on a remote WebDAV server -
webdav_create_remote_directory- Prompt to create a directory on a remote WebDAV server -
webdav_move_remote_item- Prompt to move/rename a file/directory on a remote WebDAV server -
webdav_copy_remote_item- Prompt to copy a file/directory on a remote WebDAV server
Example Queries in Claude
Here are some example queries you can use in Claude Desktop once the WebDAV MCP server is connected:
-
"List files on my remote WebDAV server"
-
"Create a new text file called notes.txt on my remote WebDAV server with the following content: Hello World"
-
"Get the content of document.txt from my remote WebDAV server"
-
"Update config.json on my remote WebDAV server with this new configuration"
-
"Create a directory called projects on my remote WebDAV server"
-
"Copy report.docx to a backup location on my remote WebDAV server"
-
"Move the file old_name.txt to new_name.txt on my remote WebDAV server"
-
"Delete temp.txt from my remote WebDAV server"
License
MIT
Prerequisites
-
Node.js 18 or later
-
npm or yarn
-
WebDAV server (for actual file operations)
Installation
Option 1: Install from npm package
Global installation
npm install -g webdav-mcp-server
Install dependencies
npm install
Configuration
Create a .env file in the root directory with the following variables:
WebDAV configuration
WEBDAV_ROOT_URL=http://localhost:4080 WEBDAV_ROOT_PATH=/webdav
Server configuration (for HTTP mode)
SERVER_PORT=3000
Authentication configuration for MCP server (optional)
AUTH_ENABLED=true AUTH_USERNAME=user AUTH_PASSWORD=pass AUTH_REALM=MCP WebDAV Server
Usage
Running with stdio transport
This mode is ideal for direct integration with Claude Desktop.
If installed globally
webdav-mcp-server
If installed globally
webdav-mcp-server --http
Quick Start with Docker Compose
The easiest way to get started with both the WebDAV server and the MCP server is to use Docker Compose:
WebDAV Server Configuration
The webdav_config.yml file configures the hacdias/webdav server used in the Docker Compose setup. Here's what you can customize:
Programmatic Usage
You can also use this package programmatically in your own projects:
import { startWebDAVServer } from 'webdav-mcp-server';
// For stdio transport without authentication await startWebDAVServer({ webdavConfig: { rootUrl: 'http://your-webdav-server', rootPath: '/webdav', authEnabled: false }, useHttp: false });
// For stdio transport with WebDAV authentication (password must be plain text) await startWebDAVServer({ webdavConfig: { rootUrl: 'http://your-webdav-server', rootPath: '/webdav', authEnabled: true, username: 'admin', password: 'password' }, useHttp: false });
// With bcrypt hash for MCP server password (HTTP auth only) await startWebDAVServer({ webdavConfig: { rootUrl: 'http://your-webdav-server', rootPath: '/webdav', authEnabled: true, username: 'admin', password: 'password' // WebDAV password must be plain text }, useHttp: true, httpConfig: { port: 3000, auth: { enabled: true, username: 'user', password: '{bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy' } } });
// For HTTP transport with MCP authentication await startWebDAVServer({ webdavConfig: { rootUrl: 'http://your-webdav-server', rootPath: '/webdav', authEnabled: true, username: 'admin', password: 'password' }, useHttp: true, httpConfig: { port: 3000, auth: { enabled: true, username: 'user', password: 'pass', realm: 'MCP WebDAV Server' } } });
// For HTTP transport without authentication await startWebDAVServer({ webdavConfig: { rootUrl: 'http://your-webdav-server', rootPath: '/webdav', authEnabled: false }, useHttp: true, httpConfig: { port: 3000, auth: { enabled: false } } });
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.