WebDAV MCP 服务器
一个模型上下文协议 (MCP) 服务器,支持在 WebDAV 端点上进行 CRUD 操作,并支持基本身份验证。该服务器允许 Claude Desktop 和其他 MCP 客户端通过自然语言命令与 WebDAV 文件系统进行交互。
特征
- 使用可选身份验证连接到任何 WebDAV 服务器
- 对文件和目录执行 CRUD 操作
- 将文件操作公开为 MCP 资源和工具
- 通过 stdio 传输(用于 Claude Desktop 集成)或 HTTP/SSE 传输运行
- 通过可选的基本身份验证实现安全访问
- 支持 MCP 服务器身份验证的 bcrypt 加密密码(由于协议限制,WebDAV 密码必须是纯文本)
- 连接池可提高 WebDAV 服务器的性能
- 使用 Zod 进行配置验证
- 结构化日志,以便更好地排除故障
先决条件
- Node.js 18 或更高版本
- npm 或 yarn
- WebDAV 服务器(用于实际文件操作)
安装
选项 1:从 npm 包安装
# Global installation
npm install -g webdav-mcp-server
# Or with npx
npx webdav-mcp-server
选项 2:从源代码克隆并构建
# Clone repository
git clone https://github.com/yourusername/webdav-mcp-server.git
cd webdav-mcp-server
# Install dependencies
npm install
# Build the application
npm run build
选项 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
配置
在根目录中创建一个.env
文件,其中包含以下变量:
# WebDAV configuration
WEBDAV_ROOT_URL=http://localhost:4080
WEBDAV_ROOT_PATH=/webdav
# 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
# 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
# Auth password for MCP server can be a bcrypt hash (unlike WebDAV passwords)
# AUTH_PASSWORD={bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy
MCP 服务器身份验证的加密密码
为了增强 MCP 服务器(而非 WebDAV 连接)的安全性,您可以使用 bcrypt 加密的密码,而不是以纯文本形式存储它们:
- 生成 bcrypt 哈希:
# Using the built-in utility
npm run generate-hash -- yourpassword
# Or with npx
npx webdav-mcp-generate-hash yourpassword
- 使用 {bcrypt} 前缀将哈希添加到您的 .env 文件中:
AUTH_PASSWORD={bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy
这样,您的 MCP 服务器密码就能被安全存储。请注意,由于协议要求,WebDAV 密码必须始终以纯文本形式保存。
用法
使用 stdio 传输运行
此模式非常适合与 Claude Desktop 直接集成。
# If installed globally
webdav-mcp-server
# If using npx
npx webdav-mcp-server
# If built from source
node dist/index.js
使用 HTTP/SSE 传输运行
此模式允许通过 HTTP 访问服务器,并使用服务器发送事件进行实时通信。
# If installed globally
webdav-mcp-server --http
# If using npx
npx webdav-mcp-server --http
# If built from source
node dist/index.js --http
Docker Compose 快速入门
开始使用 WebDAV 服务器和 MCP 服务器的最简单方法是使用 Docker Compose:
# 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)
此设置使用hacdias/webdav ,这是一个用 Go 编写的简单独立的 WebDAV 服务器。WebDAV 服务器的配置存储在webdav_config.yml
中,您可以修改该文件以调整权限、添加用户或更改其他设置。
WebDAV 服务器将所有文件存储在名为webdav_data
的 Docker 卷中,该卷在容器重启后仍然存在。
WebDAV 服务器配置
webdav_config.yml
文件用于配置 Docker Compose 设置中使用的 hacdias/webdav 服务器。您可以自定义以下内容:
# 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"
有关更多高级配置选项,请参阅hacdias/webdav 文档。
测试
运行测试:
与 Claude Desktop 集成
- 确保 Claude Desktop 中启用了 MCP 功能
可用的 MCP 资源
webdav://{path}/list
列出目录中的文件webdav://{path}/content
获取文件内容webdav://{path}/info
获取文件或目录信息
可用的 MCP 工具
webdav_create_remote_file
- 在远程 WebDAV 服务器上创建新文件webdav_get_remote_file
- 从存储在远程 WebDAV 服务器上的文件中检索内容webdav_update_remote_file
- 更新远程 WebDAV 服务器上的现有文件webdav_delete_remote_item
- 从远程 WebDAV 服务器删除文件或目录webdav_create_remote_directory
- 在远程 WebDAV 服务器上创建新目录webdav_move_remote_item
- 移动或重命名远程 WebDAV 服务器上的文件/目录webdav_copy_remote_item
- 将文件/目录复制到远程 WebDAV 服务器上的新位置webdav_list_remote_directory
- 列出远程 WebDAV 服务器上的文件和目录
可用的 MCP 提示
webdav_create_remote_file
- 提示在远程 WebDAV 服务器上创建新文件webdav_get_remote_file
- 提示从远程 WebDAV 文件检索内容webdav_update_remote_file
- 提示更新远程 WebDAV 服务器上的文件webdav_delete_remote_item
- 提示从远程 WebDAV 服务器删除文件/目录webdav_list_remote_directory
- 提示列出远程 WebDAV 服务器上的目录内容webdav_create_remote_directory
- 提示在远程 WebDAV 服务器上创建目录webdav_move_remote_item
- 提示移动/重命名远程 WebDAV 服务器上的文件/目录webdav_copy_remote_item
- 提示复制远程 WebDAV 服务器上的文件/目录
Claude 中的示例查询
以下是连接 WebDAV MCP 服务器后您可以在 Claude Desktop 中使用的一些示例查询:
- “列出我的远程 WebDAV 服务器上的文件”
- “在我的远程 WebDAV 服务器上创建一个名为 notes.txt 的新文本文件,内容如下:Hello World”
- “从我的远程 WebDAV 服务器获取 document.txt 的内容”
- “使用此新配置更新远程 WebDAV 服务器上的 config.json”
- “在我的远程 WebDAV 服务器上创建一个名为 projects 的目录”
- “将 report.docx 复制到我的远程 WebDAV 服务器上的备份位置”
- “将远程 WebDAV 服务器上的文件 old_name.txt 移动到 new_name.txt”
- “从我的远程 WebDAV 服务器中删除 temp.txt”
程序化使用
您还可以在自己的项目中以编程方式使用此包:
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
}
}
});
执照
麻省理工学院