关于 dav-mcp
dav-mcp 是一个 MCP 服务,通过 CalDAV、CardDAV 和 VTODO 协议为 AI Agent 提供日历、联系人和任务管理能力。它提供 27 个工具,覆盖日历、联系人和任务的完整增删改查,适用于兼容 RFC 4791 和 RFC 6352 的各类服务器。
主要功能
- 0127 个工具,覆盖日历、联系人和任务
- 02CalDAV 日历的完整增删改查
- 03CardDAV 联系人管理与查询
- 04VTODO 任务管理与筛选
- 05freebusy_query 客户端计算空闲时段
- 06支持 Basic、Digest 和 OAuth 认证
适用场景
- 01通过 AI 助手查询日程与创建会议
- 02在 n8n 工作流中按条件查询联系人或任务
- 03定期清理已完成任务
MCP 相关
dav-mcp 本身是 MCP 服务,向 MCP 客户端暴露日历、联系人和任务相关的工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y dav-mcpCALDAV_SERVER_URLBase URL of your CalDAV/CardDAV server (e.g. https://example.com/dav.php/)CALDAV_USERNAMEUsername for DAV server authenticationCALDAV_PASSWORD密钥Password or app-specific password for DAV server authenticationAUTH_METHOD密钥Authentication method, case-insensitive: 'Basic' (default; switches to Digest by itself when the server only offers Digest), 'Digest' (Digest-only servers without ever sending the password) or 'OAuth' for GoogleGOOGLE_SERVER_URLGoogle CalDAV endpoint; required when AUTH_METHOD=oauth2GOOGLE_USERGoogle account email; required when AUTH_METHOD=oauth2GOOGLE_CLIENT_IDOAuth2 client ID; required when AUTH_METHOD=oauth2GOOGLE_CLIENT_SECRET密钥OAuth2 client secret; required when AUTH_METHOD=oauth2GOOGLE_REFRESH_TOKEN密钥OAuth2 refresh token; required when AUTH_METHOD=oauth2GOOGLE_TOKEN_URL密钥OAuth2 token endpoint for AUTH_METHOD=oauth2 (default: https://oauth2.googleapis.com/token)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
27收录的工具列表 · 更新于 3 周前
此工具无需参数。
详细介绍
dav-mcp
赋予 AI Agent 强大的组织能力 —— 将它们变成统筹管理日历、联系人和任务的助手。
基于 27 个可用于生产环境的工具,涵盖 CalDAV、CardDAV 和 VTODO 协议。
快速开始
一键安装(Claude Desktop)
- 从最新版本下载
dav-mcp-<version>.mcpb。从 4.1.2 版本开始,发布包中包含此文件。 - 使用 Claude Desktop(macOS 或 Windows)打开该文件。Claude 会显示安装对话框。
- 输入服务 URL、用户名和密码。密码会作为机密信息存储。除非你的服务需要
Digest,否则将身份验证方式保留为Basic。
.mcpb 文件是一个 MCP Bundle:它包含服务及其依赖项,因此无需安装 Node.js 或 npx。
Claude Desktop / Cursor(本地)
添加到你的 MCP 配置文件中:
{
"mcpServers": {
"dav-mcp": {
"command": "npx",
"args": ["-y", "dav-mcp"],
"env": {
"CALDAV_SERVER_URL": "https://dav.example.com",
"CALDAV_USERNAME": "your_username",
"CALDAV_PASSWORD": "your_password"
}
}
}
}
配置文件位置:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
添加配置后,重启 Claude Desktop。
n8n(远程 HTTP)
启动 HTTP 服务:
CALDAV_SERVER_URL=https://dav.example.com \
CALDAV_USERNAME=your_username \
CALDAV_PASSWORD=your_password \
BEARER_TOKEN=your-secret-token \
npx dav-mcp --http
然后在 n8n 中:
- 添加 AI Agent 节点
- 添加 MCP Client Tool 节点并连接到 AI Agent
- 配置:
- MCP 端点:
http://localhost:3000/mcp - 身份验证:Bearer
- 令牌:你的密钥令牌
- MCP 端点:
自定义端口:
npx dav-mcp --http --port=8080
Docker
拉取已发布的镜像(distroless,以非 root 用户运行,不含 shell):
docker run -d --name dav-mcp -p 3000:3000 --env-file .env \
ghcr.io/philflowio/dav-mcp:latest
标签:latest、确切的发行版本(5.0.0)和次版本系列(5.0)。
设置 PORT 可使用其他端口;健康检查会随之调整。
或者从源代码构建:
git clone https://github.com/PhilflowIO/dav-mcp.git
cd dav-mcp
cp .env.example .env
# Edit .env with your credentials
docker-compose up
编排能力
当工具不完整,迫使 AI 临场应变时,完备的工具能让它跨所有组件执行精确操作。
| 能力 | dav-mcp | 大多数 MCP |
|---|---|---|
| 日历管理 | 完整的增删改查(12 个工具) | 仅创建和列出(2-3 个工具) |
| 联系人管理 | 完整的 CardDAV(8 个工具) | 通常完全缺失 |
| 任务管理 | 完整支持 VTODO(7 个工具) | 很少提供 |
| 按字段更新 | 所有 RFC 属性及自定义字段 | 很少提供 |
| 空闲/忙碌查询 | 适用于所有服务(客户端执行) | 原生 REPORT,大多数服务不支持 |
| 服务端筛选 | 高效查询 | 导出全部数据 |
| 多服务提供商 | 适用于任何 CalDAV/CardDAV 服务 | 服务提供商支持有限 |
| 工具总数 | 27 个工具 | 2-6 个工具 |
可用工具(共 27 个)
CalDAV 工具(12 个)
- list_calendars - 列出所有可用日历
- list_events - 列出所有事件(筛选搜索请使用 calendar_query)
- create_event - 创建新的日历事件
- update_event - 首选:更新任意事件字段(SUMMARY、LOCATION、STATUS、自定义 X-* 属性);使用 start_date/end_date/all_day 移动或转换事件
- update_event_raw - 使用原始 iCal 数据更新事件(高级)
- delete_event - 永久删除事件
- calendar_query - 首选:按文本、日期范围或地点高效搜索和筛选事件
- make_calendar - 创建新的日历集合,可选择指定时区(例如
Europe/Berlin这样的 IANA 名称,会作为 VTIMEZONE 发送) - update_calendar - 更新日历属性(显示名称、描述、颜色、时区)
- delete_calendar - 删除日历及其所有事件
- calendar_multi_get - 按 URL 批量获取多个指定事件
- freebusy_query - 查找某个时间范围内的空闲和忙碌时段(“我什么时候有空?”),由客户端计算
CardDAV 工具(8 个)
- list_addressbooks - 列出所有可用的地址簿
- list_contacts - 列出所有联系人(筛选搜索请使用 addressbook_query)
- create_contact - 创建新联系人(vCard)
- update_contact - 首选:更新联系人的任意字段(FN、EMAIL、TEL、ORG、ADR、自定义 X-* 属性)
- update_contact_raw - 使用原始 vCard 数据更新联系人(高级)
- delete_contact - 永久删除联系人
- addressbook_query - 首选:按姓名、电子邮件或组织高效搜索和筛选联系人
- addressbook_multi_get - 按 URL 批量获取多个指定联系人
VTODO 工具(7 个)
- list_todos - 列出所有待办事项/任务(筛选搜索请使用 todo_query)
- create_todo - 创建待办事项/任务,可选设置到期日期、优先级和状态
- update_todo - 首选:更新待办事项的任意字段(SUMMARY、STATUS、PRIORITY、DUE、PERCENT-COMPLETE、自定义 X-* 属性)
- update_todo_raw - 使用原始 VTODO iCal 数据更新待办事项(高级)
- delete_todo - 永久删除待办事项/任务
- todo_query - 首选:按状态/到期日期高效搜索和筛选待办事项
- todo_multi_get - 按 URL 批量获取多个指定待办事项
时区
未指定时区的事件或待办事项(“浮动”时间,例如
DTSTART:20261010T090000,或全天日期),读取时会使用其日历的时区,
如 CalDAV 规范(RFC 4791 §9.9)所述:该时区由 make_calendar /
update_calendar 设置,并显示在 list_calendars 中。若日历未设置时区,则读取时
使用 dav-mcp 运行所在环境的时区:TZ 环境变量(例如
在 Docker 或 HTTP 部署中设置 TZ=Europe/Berlin),否则使用系统时区。创建和更新工具中
未指定时区的时间也会以相同方式读取;移动未设置时区的事件时,事件仍不会设置时区。
freebusy_query 会以日历时区显示时间段,并注明该时区。
实际应用
n8n 自动化工作流
- 会议管理:“显示我所有的周五会议” → calendar_query 使用日期筛选条件,仅返回相关事件
- 联系人搜索:“查找所有在 Google 工作的人” → addressbook_query 使用组织筛选条件,高效查找匹配项
- 任务报告:“显示已逾期的高优先级任务” → todo_query 使用筛选条件返回特定结果
- 定时清理:每日 cron 作业使用定向查询删除已完成的任务
Claude Desktop 集成
- 快速创建事件:“创建明天下午 2 点的团队会议” → create_event 立即执行
- 联系人查询:“Sarah 的电子邮件是什么?” → addressbook_query 使用姓名筛选条件查找联系人
- 日历概览:“我下周的日历上有什么安排?” → calendar_query 使用日期范围显示事件
- 日历管理:“创建一个名为 Project Luna 的新日历” → make_calendar 创建集合
兼容所有主流服务提供商
适用于所有遵循 RFC 4791 和 RFC 6352 的 CalDAV/CardDAV 服务端:
- Nextcloud - 完全支持
- Baikal - 完全支持
- Radicale - 完全支持
- iCloud - 使用专用应用密码即可
- 任何符合 RFC 标准的服务端 - 支持标准协议
身份验证
AUTH_METHOD 用于选择 dav-mcp 的登录方式(不区分大小写):
AUTH_METHOD | 凭据 | 适用场景 |
|---|---|---|
Basic(默认) | CALDAV_USERNAME、CALDAV_PASSWORD | 几乎所有服务。如果服务仅提供 Digest(例如,Baikal 设置为 Digest),dav-mcp 会自动切换到 Digest,无需进行任何设置。 |
Digest | CALDAV_USERNAME、CALDAV_PASSWORD | 仅接受 Digest(RFC 7616)的服务。与 Basic 模式下的自动切换不同,后者会先以 Basic 编码方式发送一次密码,然后遭到拒绝;Digest 模式绝不会发送密码,因此连接未使用 HTTPS 时请使用此模式。 |
OAuth(或 OAuth2) | GOOGLE_*,见下文 | Google Calendar |
dav-mcp 需要 Node.js 22 或更高版本。配置错误(例如,AUTH_METHOD 值未知,或所选方式缺少凭据)会导致服务在启动时停止,而不是回退到 Basic。
Google Calendar(OAuth2)
对于 Google Calendar,请使用 OAuth2 身份验证:
{
"mcpServers": {
"dav-mcp": {
"command": "npx",
"args": ["-y", "dav-mcp"],
"env": {
"AUTH_METHOD": "OAuth",
"GOOGLE_USER": "[email protected]",
"GOOGLE_CLIENT_ID": "your-client-id",
"GOOGLE_CLIENT_SECRET": "your-client-secret",
"GOOGLE_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}
安全性
- 输入验证:执行前,使用 Zod 模式验证所有输入
- 速率限制(HTTP 模式):每个客户端地址 15 分钟内最多 100 个请求,在检查 bearer 令牌之前计数。来自回环地址或私有网络(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)的客户端(例如,同一 Docker 网络中的另一个容器)可获得 10,000 个请求。限制:dav-mcp 看到的是连接到它的地址。若经过 Docker 端口映射或反向代理,该地址就是网桥网关或代理的地址,因此所有外部客户端共用这一个地址、同一个计数器和提高后的限额。如果要公开 HTTP 传输,请在代理处按客户端进行速率限制。
- Bearer 身份验证:HTTP 传输的令牌身份验证
- 不存储凭据:仅透传,绝不记录日志或缓存
- 结构化日志:使用请求 ID 记录审计轨迹,不暴露个人身份信息
- 默认关闭工具调用日志:设置
LOG_TOOL_CALLS=true会记录每次工具调用及其参数,便于调试;日志写入~/.local/state/dav-mcp/tool-calls.jsonl(或$XDG_STATE_HOME、Windows 上的%LOCALAPPDATA%,或TOOL_CALL_LOG_FILE),且仅你本人可读取。设置TOOL_CALL_LOG_MODE=console可改为将日志发送到 stderr。 - CORS 防护:将来源列入白名单,阻止跨站攻击
隐私政策
dav-mcp 在你的计算机(或你自己的服务)上运行,且只与您配置的 DAV 服务通信。它不收集遥测数据,也不会与维护者或第三方共享任何信息。工具结果会发送给调用该工具的 AI 助手。dav-mcp 不会存储凭据和日历数据;可选的工具调用日志默认关闭。完整政策:PRIVACY.md。联系:[email protected]。
文档
- MCP 规范 - Model Context Protocol 文档
- tsdav 文档 - CalDAV/CardDAV 库参考
- CalDAV RFC 4791 - CalDAV 协议规范
- CardDAV RFC 6352 - CardDAV 协议规范
参与贡献
欢迎提交拉取请求!请阅读 CONTRIBUTING.md 了解指南。
许可证
MIT 许可证 - 详情请参阅 LICENSE
致谢
本项目使用以下项目构建:
- tsdav - 优秀的 TypeScript CalDAV/CardDAV 库
- tsdav-utils - 用于符合 RFC 规范的字段更新的字段无关型实用工具层
- MCP SDK - Anthropic 的 Model Context Protocol
- ical.js - 符合 RFC 规范的 iCalendar 解析器
有疑问?遇到问题? 请创建一个 GitHub issue
为管理日历、联系人和任务的 AI Agent 打造
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。