caldav-mcp
caldav-mcp
给你的 AI 助手一个日历。 一个 MCP 服务器,通过 14 个专为用途打造的工具,提供对任意兼容 CalDAV 的日历 —— Nextcloud、Radicale、Baikal、ownCloud、iCloud、Fastmail 等 —— 的读写访问。
为什么选择 caldav-mcp?
Docker 化 | 多阶段 Alpine 基础镜像,非 root 运行,内置健康检查。可在任何运行 Docker 的环境中部署。 |
Python 3.13 | 干净、带类型标注的代码库,配合 Pydantic 校验。易懂,易扩展。 |
单容器 | 一条 |
无状态 | 请求之间不保存会话状态。凭据随每次请求的 HTTP 请求头传递,无需重启服务器即可实现多租户使用。 |
默认安全 | 常量时间令牌比较、基于 IP 的指数退避限流、输入自动化、结构化审计日志、错误响应中不包含任何机密。 |
双层认证 | 可选的 API 密钥保护 MCP 端点;CalDAV 凭据按请求注入。两层相互独立、可组合,行为可预测、零意外。 |
Related MCP server: mcp-labrat
适用场景
AI 驱动的日历管理 —— 让 Claude、Codex 或任何 MCP 客户端通过自然语言创建、更新、搜索和删除事件。
多租户访问 —— 每次请求发送不同的
X-Caldav-*请求头,即可从单个服务器实例访问不同的 CalDAV 账户。自托管日历自动化 —— 与您现有的 Nextcloud、Radicale 或 Baikal 服务器结合使用,不依赖任何云服务。
企业 / 团队部署 —— 集中式、无状态、容器化。部署在反向代理之后,支持无停机横向扩展与凭据轮换。
快速开始
# 1. Clone the repo
git clone https://git.gelse.net/werner/caldav-mcp.git && cd caldav-mcp
# 2. Create your .env file
cp .env.example .env
# Edit .env — at minimum set CALDAV_MCP_API_KEY, CALDAV_URL, CALDAV_USERNAME, CALDAV_PASSWORD
# 3. Launch
docker compose up -d
# 4. Verify
curl -s http://localhost:8600/mcp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "X-Caldav-Url: https://cloud.example.com/remote.php/dav/calendars/user/" \
-H "X-Caldav-Username: user" \
-H "X-Caldav-Password: app-password" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}'现在服务器已通过 http://localhost:8600/mcp(Streamable HTTP)对外提供访问。
工具
服务器对外提供 14 个 MCP 工具,分为三个类别。
查询(只读)
工具 | 描述 |
列出所有可用的日历 | |
获取指定日期范围内的事件 | |
获取今天的事件 | |
获取未来 7 天的事件 | |
按 UID 获取指定事件(包括与会者) | |
在摘要、描述、地点和类别中按文本搜索事件 | |
获取指定时间范围内的空闲/忙碌信息 |
写入(变更)
工具 | 描述 |
创建新事件 —— 支持 RRULE、优先级、类别和与会者 | |
按 UID 部分更新已有事件 | |
按 UID 删除事件 | |
在日历之间移动事件 |
与会者
工具 | 描述 |
为事件添加与会者 | |
从事件中移除与会者 | |
列出事件的与会者 |
部署
Docker
该项目附带一个多阶段 Dockerfile:
构建阶段 —— 将 Python 依赖从
requirements.txt安装到干净的前缀目录中。运行阶段 —— 将预构建的包复制到一个最小的 Alpine 镜像中,以非 root 的
app用户身份运行,暴露端口8080。
docker build -t caldav-mcp:latest .
docker run -p 8600:8080 \
-e CALDAV_MCP_API_KEY=YOUR_KEY \
-e CALDAV_URL=https://cloud.example.com/remote.php/dav/calendars/user/ \
-e CALDAV_USERNAME=user \
-e CALDAV_PASSWORD=app-password \
caldav-mcp:latestDocker Compose
docker-compose.yaml 将宿主机端口 8600 映射到容器端口 8080,并从本地 .env 文件读取环境变量:
services:
caldav-mcp:
build: .
image: caldav-mcp:latest
restart: unless-stopped
ports:
- "8600:8080"
environment:
CALDAV_MCP_API_KEY: "${CALDAV_MCP_API_KEY:-}"
TZ: Europe/Viennadocker compose up -d还提供了 docker-compose.test.yaml 用于集成测试 —— 其中包含一个 Radicale CalDAV 服务器。
TLS / HTTPS
服务器支持内置 TLS,无需反向代理。设置以下环境变量即可直接启用 HTTPS:
CALDAV_MCP_TLS_CERT=/path/to/cert.pem
CALDAV_MCP_TLS_KEY=/path/to/key.pem
CALDAV_MCP_TLS_CA_BUNDLE=/path/to/ca.pem # optional启用 TLS 后,服务器会通过 HTTPS 监听。未设置此环境变量时,将其部署在终止 TLS 的反向代理(Traefik、Caddy、nginx)之后。
认证
两层独立的认证 —— 两者均可选,但均建议启用。
第 1 层:MCP 端点认证
当设置了 CALDAV_MCP_API_KEY 时,对 /mcp 端点的每个请求必须包含以下任一方式:
Authorization: Bearer <token>X-Api-Key: <token>
令牌的比对使用常量时间比较,以防止计时旁道攻击。失败的认证尝试通过带指数退避的滑动窗口限流器按客户端 IP 进行跟踪。
当 CALDAV_MCP_APPI_KEY 未设置时,该端点为开放性 —— 请勿在没有认证的情况下暴露到公网。
第 2 层:CalDAV 凭据
CalDAV 凭据按请求解析:
HTTP 请求头(首选):
X-Caldav-Url、X-Caldav-Username、X-Caldav-Password环境变量(后备):
CALDAV_URL、CALDAV_USERNAME、CALDAV_PASSWORD
HTTP 请求头优先。这提供了多租户使用场景 —— 无需重启服务器,不同客户端即可使用不同目标 CalDAV 账户。
配置
所有配置均通过环境变量进行,启动时由 Pydantic 校验。
服务器
变量 | 默认值 | 描述 |
|
| 监听端口(容器内部) |
|
| Streamable HTTP 端点路径 |
|
| MCP 端点的认证共享密钥 |
|
| IANA 时区(例如 |
CalDAV
变量 | 默认值 | 说明 |
|
| CalDAV 服务器 URL( |
|
| CalDAV 用户名( |
|
| CalDAV 密码( |
|
| 验证 CalDAV 连接上的 TLS 证书。仅当测试自签名证书时设为 |
速率限制
变量 | 默认值 | 说明 |
|
| 滑动窗口内每个 IP 的最大失败认证尝试次数 |
|
| 滑动窗口的时长(秒) |
TLS
变量 | 默认值 | 描述 |
|
| TLS 的路径 |
|
| TLS 私钥 PEM 文件的路径 |
|
| 自定义证书机构(CA)的可选 CA 捆绑包 |
日志
变量 | 默认值 | 描述 |
|
| 审计日志格式: |
安全
将服务器置于终止 TLS 的反向代理之后,或启用内置 TLS。
设置一个强健的
CALDAV_MCP_API_KEY。在网络/防火墙层限制访问,仅允许受信任主机或 VPN 访问。
除非明确需要远程访问,否则优先绑定到
127.0.0.1。绝不将 CalDAV 应用密码置于公开配置或日志中。
开发
命令
make test # Run unit tests
make test-integration # Run integration tests (requires docker-compose.test.yaml)
make test-performance # Run performance benchmarks
make lint # Lint with ruff (check + format)
make typecheck # Type check with mypy
make check # All checks: lint + typecheck + deps-check + test
make deps-check # Verify pyproject.toml and requirements.txt are in sync
make build # Build Docker image项目结构
caldav-mcp/
├── server.py # Thin entrypoint, launches FastMCP HTTP server
├── caldav_mcp/ # Core package
│ ├── tools/ # MCP tool handlers
│ │ ├── queries.py # Read-only tools (7)
│ │ ├── mutations.py # Write tools (4)
│ │ └── attendees.py # Attendee management (3)
│ ├── auth.py # Two-layer auth (API key + CalDAV creds)
│ ├── calendar.py # CalDAV calendar selection & serialization
│ ├── client_cache.py # Thread-safe LRU cache for DAVClient
│ ├── config.py # Env var parsing, header constants
│ ├── config_schema.py # Pydantic startup validation
│ ├── datetime_utils.py # Date/time parsing, timezone helpers
│ ├── errors.py # Typed exceptions, ToolResult dataclass
│ ├── event_builder.py # Pure iCalendar VEVENT construction
│ ├── sanitizers.py # Input sanitization, field length limits
│ ├── rate_limit.py # Sliding-window rate limiter
│ ├── audit.py # Structured JSON audit logging
│ ├── constants.py # Shared string constants
│ └── types.py # CalDAVClient Protocol definition
├── tests/ # Unit, integration, performance
├── docs/ # Architecture, API, contributing docs
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yaml # Production compose
├── docker-compose.test.yaml # Test compose with Radicale
├── requirements.txt # Runtime dependencies (pinned)
├── pyproject.toml # Dev config and dependencies
└── Makefile # Build/test shortcuts依赖
包 | 版本 | 用途 |
3.4.7 | MCP 服务器框架,Streamable HTTP 传输 | |
3.2.1 | CalDAV 客户端库 | |
7.2.2 | iCalendar RFC 5545 解析/生成 | |
>=2.28.0 | HTTP 传输层 |
故障排查
症状 | 原因 | 修复方法 |
| CalDAV 服务器无法访问 | 确认 |
| 自签名或无效的 TLS 证书 | 将服务器的 CA 导入系统信任库,或使用有效证书 |
| API 令牌缺失或无效 | 设置 |
| 没有 CalDAV 请求头或环境变量 | 提供 |
| 日历名称拼写错误或错误 | 运行 |
事件时间显示错误 | 服务器时区未设置 | 将 |
常见问题
问:我可以将此用于多个 CalDAV 账户吗?
答:可以——每个请求发送不同的 X-Caldav-Url / X-Caldav-Username / X-Caldav-Password 请求头。客户端缓存以 (url, username) 为键。
问:支持哪些 CalDAV 服务器? 答:任何实现 CalDAV 标准的服务器:Nextcloud、ownCloud、iCloud、Fastmail、Baikal、Radicale 等。
问:API 令牌是否安全传输? 答:仅在使用 HTTPS 时。启用内置 TLS,或将服务器放在 TLS 终止反向代理后面。
问:如何生成 CalDAV 应用密码? 答:取决于你的提供商。Nextcloud:设置 → 安全 → 应用密码。iCloud:使用来自 appleid.apple.com 的应用专用密码。
问:我可以通过 stdio 而不是 HTTP 使用此功能吗?
答:当前服务器仅使用 Streamable HTTP 传输。要使用 stdio,请修改 server.py,调用 mcp.run() 而不是 mcp.run_http_async()。
许可证
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn MCP server that exposes CalDAV calendar operations as tools for AI assistants. It enables users to connect to CalDAV servers to create and list calendar events within specific timeframes.43297MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with CalDAV calendars to manage events and check availability through natural language or voice commands. It provides specific tools for listing, searching, and creating calendar entries using an OpenAI-compatible interface.
- AlicenseNot gradedqualityFmaintenanceProvider-agnostic CalDAV calendar MCP server that connects any CalDAV calendar to AI assistants, enabling calendar operations like listing, creating, updating, and deleting events.AGPL 3.0
- AlicenseNot gradedqualityFmaintenanceA comprehensive MCP server that provides AI assistants with natural language access to Apple Calendar, enabling reading, searching, creating, and managing calendar events.3MIT
Related MCP Connectors
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gelse/caldav-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server