Skip to main content
Glama

caldav-mcp

给你的 AI 助手一个日历。 一个 MCP 服务器,通过 14 个专为用途打造的工具,提供对任意兼容 CalDAV 的日历 —— Nextcloud、Radicale、Baikal、ownCloud、iCloud、Fastmail 等 —— 的读写访问。

为什么选择 caldav-mcp?

Docker 化

多阶段 Alpine 基础镜像,非 root 运行,内置健康检查。可在任何运行 Docker 的环境中部署。

Python 3.13

干净、带类型标注的代码库,配合 Pydantic 校验。易懂,易扩展。

单容器

一条 docker compose up —— 无需数据库、后台任务、无需 sidecar。

无状态

请求之间不保存会话状态。凭据随每次请求的 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 工具,分为三个类别。

查询(只读)

工具

描述

caldav_list_calendars

列出所有可用的日历

caldav_get_events

获取指定日期范围内的事件

caldav_get_today_events

获取今天的事件

caldav_get_week_events

获取未来 7 天的事件

caldav_get_event_by_uid

按 UID 获取指定事件(包括与会者)

caldav_search_events

在摘要、描述、地点和类别中按文本搜索事件

caldav_get_freebusy

获取指定时间范围内的空闲/忙碌信息

写入(变更)

工具

描述

caldav_create_event

创建新事件 —— 支持 RRULE、优先级、类别和与会者

caldav_update_event

按 UID 部分更新已有事件

caldav_delete_event

按 UID 删除事件

caldav_move_event

在日历之间移动事件

与会者

工具

描述

caldav_add_attendee

为事件添加与会者

caldav_remove_attendee

从事件中移除与会者

caldav_list_attendees

列出事件的与会者

部署

Docker

该项目附带一个多阶段 Dockerfile

  1. 构建阶段 —— 将 Python 依赖从 requirements.txt 安装到干净的前缀目录中。

  2. 运行阶段 —— 将预构建的包复制到一个最小的 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:latest

Docker 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/Vienna
docker 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 凭据按请求解析:

  1. HTTP 请求头(首选):X-Caldav-UrlX-Caldav-UsernameX-Caldav-Password

  2. 环境变量(后备):CALDAV_URLCALDAV_USERNAMECALDAV_PASSWORD

HTTP 请求头优先。这提供了多租户使用场景 —— 无需重启服务器,不同客户端即可使用不同目标 CalDAV 账户。

配置

所有配置均通过环境变量进行,启动时由 Pydantic 校验。

服务器

变量

默认值

描述

CALDAV_MCP_PORT

8080

监听端口(容器内部)

CALDAV_MCP_PATH

/mcp

Streamable HTTP 端点路径

CALDAV_MCP_API_KEY

""(禁用)

MCP 端点的认证共享密钥

TZ

""(UTC)

IANA 时区(例如 Europe/Vienna),用于计算今天/周边界

CalDAV

变量

默认值

说明

CALDAV_URL

""

CalDAV 服务器 URL(X-Caldav-Url 请求头的后备值)

CALDAV_USERNAME

""

CalDAV 用户名(X-Caldav-Username 请求头的后备值)

CALDAV_PASSWORD

""

CalDAV 密码(X-Caldav-Password 请求头的后备值)

CALDAV_MCP_CALDAV_VERIFY_SSL

true

验证 CalDAV 连接上的 TLS 证书。仅当测试自签名证书时设为 false

速率限制

变量

默认值

说明

CALDAV_MCP_RATE_LIMIT_MAX_FAILURES

10

滑动窗口内每个 IP 的最大失败认证尝试次数

CALDAV_MCP_RATE_LIMIT_WINDOW_SECONDS

60

滑动窗口的时长(秒)

TLS

变量

默认值

描述

CALDAV_MCP_TLS_CERT

""

TLS 的路径

CALDAV_MCP_TLS_KEY

""

TLS 私钥 PEM 文件的路径

CALDAV_MCP_TLS_CA_BUNDLE

""

自定义证书机构(CA)的可选 CA 捆绑包

日志

变量

默认值

描述

CALDAV_MCP_LOG_FORMAT

text

审计日志格式:textjson

安全

  • 将服务器置于终止 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

依赖

版本

用途

fastmcp

3.4.7

MCP 服务器框架,Streamable HTTP 传输

caldav

3.2.1

CalDAV 客户端库

icalendar

7.2.2

iCalendar RFC 5545 解析/生成

requests

>=2.28.0

HTTP 传输层

故障排查

症状

原因

修复方法

Connection refused

CalDAV 服务器无法访问

确认 CALDAV_URL 正确且服务器正在运行

SSL: CERTIFICATE_VERIFY_FAILED

自签名或无效的 TLS 证书

将服务器的 CA 导入系统信任库,或使用有效证书

ERROR:[auth] unauthorized

API 令牌缺失或无效

设置 CALDAV_MCP_API_KEY 并在请求中包含 Authorization: Bearer <token>

Missing CalDAV credentials

没有 CalDAV 请求头或环境变量

提供 X-Caldav-* 请求头,或设置 CALDAV_URL/CALDAV_USERNAME/CALDAV_PASSWORD

Calendar 'X' not found

日历名称拼写错误或错误

运行 caldav_list_calendars 查看可用名称——它们区分大小写

事件时间显示错误

服务器时区未设置

TZ 环境变量设置为你的 IANA 时区(例如 Europe/Vienna

常见问题

问:我可以将此用于多个 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()

许可证

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • F
    license
    Not graded
    quality
    D
    maintenance
    An 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.
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provider-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

View all related MCP servers

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…

View all MCP Connectors

Latest Blog Posts

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