WebDAV MCP服务器

一个通过MCP协议暴露WebDAV请求工具的服务,用于在AI/代理运行时中操作WebDAV服务器资源。

  • by bmordue
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 bmordue/webdav-mcp

使用说明

WebDAV MCP服务器

一种模型上下文协议(MCP)服务器,它公开了一个工具,用于对配置的WebDAV端点发出经过身份验证的WebDAW请求。它通过stdio进行通信,因此可以嵌入兼容的AI/代理运行时。

特性

  • 通过以下方式实现MCP服务器 @modelcontextprotocol/sdk.
  • 单一工具 dav_request 支持常见的WebDAV方法: PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, GET, PUT, DELETE.
  • 属性预设更简单 PROPFIND 请求(内置: basic, detailed, minimal).
  • 枚举和检查预设的工具: list_property_presets, get_property_preset.
  • 使用环境变量的自动基本身份验证。
  • 深度收割台处理 PROPFIND.
  • 返回封装为MCP文本内容的结构化JSON(状态、标头、正文)。
  • 优雅关闭 SIGINT.

为什么

此服务器允许AI助手(或任何MCP客户端)检查和操纵WebDAV服务器上的资源:列出目录(PROPFIND),创建收藏(MKCOL),上传/下载文件(PUT/GET)移动/复制资源以及管理锁。

先决条件

  • Node.js 18+(用于本机 fetch ES模块)
  • 可访问的WebDAV服务器URL。
  • (可选)WebDAV凭据(用户名和密码)(如果服务器需要身份验证)。

安装

克隆存储库:

git clone <your-fork-url> webdav-mcp
cd webdav-mcp

安装依赖项:

npm install

(运行时不需要严格的构建步骤,因为TypeScript是在发布时编译的;如果你以后引入多个文件或希望分发编译后的JS,你可以添加一个构建步骤。)

配置

启动服务器之前,请设置以下环境变量:

变量 必填 描述
DAV_SERVER_URL 是 WebDAV服务器的基本URL,例如。 https://dav.example.com/remote.php/webdav/
DAV_USERNAME 可选 基本身份验证的用户名
DAV_PASSWORD 可选 基本身份验证密码

如果 DAV_USERNAME 和 DAV_PASSWORD 如果都已设置,则会自动添加基本身份验证。

属性预设配置

预设处理的可选环境变量:

变量 默认值 描述
DAV_PROPERTY_PRESETS_DIR ./property-presets 包含具有预设定义的JSON文件的目录。每个文件可以是单个预设对象或预设数组。
DAV_PROPERTY_PRESETS_TTL_MS 5000 在检查文件更改之前,缓存的TTL为毫秒。

如果目录不存在,内置预设仍然可用。

用法

运行服务器(stdio模式):

node src/server.ts

或者直接使其可执行(shebang存在):

chmod +x src/server.ts
./src/server.ts

通过将其声明为stdio服务器命令,将其与MCP兼容的客户端集成。示例(伪客户端配置):

{
  "servers": [
    {
      "name": "webdav",
      "command": "node",
      "args": ["/absolute/path/to/webdav-mcp/src/server.ts"],
      "env": {
        "DAV_SERVER_URL": "https://dav.example.com/remote.php/webdav/",
        "DAV_USERNAME": "alice",
        "DAV_PASSWORD": "s3cret"
      }
    }
  ]
}

工具: dav_request

输入JSON模式(简化):

{
  "method": "PROPFIND|PROPPATCH|MKCOL|COPY|MOVE|LOCK|UNLOCK|GET|PUT|DELETE",
  "path": "<relative path>",
  "body": "<optional XML or other content>",
  "headers": {"<name>": "<value>"},
  "depth": "0|1|infinity"
  "preset": "<optional preset name>",
  "additionalProperties": [ {"namespace": "DAV:", "name": "quota-used-bytes"} ]
}

最少必填字段: method, path.

如果 preset 为a PROPFIND 请求 body 字段将被忽略,并由预设值加上任何值自动生成 additionalProperties 提供。

工具: list_property_presets, get_property_preset

列出预设值:

{
  "name": "list_property_presets",
  "arguments": {}
}

获取预设定义:

{
  "name": "get_property_preset",
  "arguments": {"name": "basic"}
}

示例 PROPFIND 使用预设:

{
  "name": "dav_request",
  "arguments": {
    "method": "PROPFIND",
    "path": "/photos",
    "depth": "1",
    "preset": "basic"
  }
}

具有额外属性:

{
  "name": "dav_request",
  "arguments": {
    "method": "PROPFIND",
    "path": "/media",
    "depth": "1",
    "preset": "basic",
    "additionalProperties": [
      {"namespace": "DAV:", "name": "quota-used-bytes"}
    ]
  }
}

例子

列出目录(深度1):

{
  "name": "dav_request",
  "arguments": {
    "method": "PROPFIND",
    "path": "/",
    "depth": "1"
  }
}

上传文件(PUT):

{
  "name": "dav_request",
  "arguments": {
    "method": "PUT",
    "path": "/notes/todo.txt",
    "body": "Finish documentation"
  }
}

删除资源:

{
  "name": "dav_request",
  "arguments": {
    "method": "DELETE",
    "path": "/notes/old.txt"
  }
}

发展

TypeScript配置存在 tsconfig.json.有用的命令:

# Type checking only
npx tsc --noEmit

# Build to dist (if you add a build script later)
npx tsc

您可以将脚本块添加到 package.json:

{
  "scripts": {
    "typecheck": "tsc --noEmit",
    "build": "tsc"
  }
}

然后运行:

npm run typecheck
npm run build

运行测试(涵盖预设逻辑):

npm test

错误处理

错误将返回 isError: true JSON主体包含 error 现场。服务器还将MCP级别的错误记录到带有前缀的stderr中 [MCP Error].

安全说明

  • 目前仅支持基本身份验证。
  • 避免直接在客户端配置中嵌入凭据——首选环境变量或秘密管理器。
  • 强烈建议使用HTTPS DAV_SERVER_URL.
  • 该工具返回原始响应体;如果XML可能包含敏感数据,请相应地处理。

故障排除

症状 原因 修复
DAV_SERVER_URL environment variable is not set 缺少配置 启动服务器前导出变量
身份验证失败(401) 凭据错误 验证 DAV_USERNAME/DAV_PASSWORD
空的PROPFIND结果 错误 Depth 或路径 调整 depth 或检查路径正确性
工具未列出 MCP客户端未正确连接 确保命令和路径正确
未找到预设 预设名称错误 使用 list_property_presets 查看可用名称

贡献

  1. 分叉存储库。
  2. 创建要素分支。
  3. 在保持TypeScript严格性的情况下进行更改。
  4. 提交一个带有明确描述的拉取请求。

请在文档中使用英式英语拼写。

许可证

在此处指定您的许可证(例如MIT)。添加一个 LICENCE 文件正式化。


© 2025