caldav-mcp
caldav-mcp
AIアシスタントにカレンダーを。 CalDAV互換のあらゆるカレンダー — Nextcloud、Radicale、Baikal、ownCloud、iCloud、Fastmail など — への読み書きアクセスを、14個の専用ツールを通じて提供するMCPサーバーです。
caldav-mcp が選ばれる理由
Docker対応 | マルチステージのAlpineベースイメージ、非root実行、組み込みヘルスチェック。Dockerが動作する場所ならどこにでもデプロイできます。 |
Python 3.13 | Pydantic検証によるクリーンで型付けされたコードベース。読みやすく、拡張も簡単です。 |
単一コンテナ | たった一つの |
ステートレス | リクエスト間でセッション状態を保持しません。認証情報はリクエストごとにHTTPヘッダーで送信されるため、サーバーを再起動することなくマルチテナント利用が可能です。 |
デフォルトでセキュア | 定数時間のトークン比較、指数バックオフ付きのIP単位レート制限、入力サニタイズ、構造化監査ログ、エラーレスポンスにシークレットを含めません。 |
2層認証 | オプションの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)で利用可能になります。
ツール
サーバーは3つのカテゴリにわたって14個のMCPツールを公開します。
クエリ(読み取り専用)
ツール | 説明 |
利用可能なすべてのカレンダーを一覧表示 | |
日付範囲内のイベントを取得 | |
今日のイベントを取得 | |
今後7日間のイベントを取得 | |
UIDで特定のイベントを取得(出席者を含む) | |
概要、説明、場所、カテゴリを対象にテキストでイベントを検索 | |
時間範囲の空き時間/予定情報を取得 |
変更(書き込み)
ツール | 説明 |
新しいイベントを作成 — RRULE、優先度、カテゴリ、出席者に対応 | |
UIDで既存のイベントを部分的に更新 | |
UIDでイベントを削除 | |
カレンダー間でイベントを移動 |
出席者
ツール | 説明 |
イベントに出席者を追加 | |
イベントから出席者を削除 | |
イベントの出席者を一覧表示 |
デプロイ
Docker
このプロジェクトにはマルチステージの Dockerfile が同梱されています:
ビルダーステージ —
requirements.txtからPython依存関係をクリーンなプレフィックスにインストールします。ランタイムステージ — ビルド済みパッケージを最小限の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 # optionalTLSが有効な場合、サーバーはHTTPSで待ち受けます。設定されていない場合は、TLSを終端するリバースプロキシ(Traefik、Caddy、nginx)の背後で実行してください。
認証
2つの独立したレイヤー — どちらもオプションですが推奨されます。
レイヤー1: MCPエンドポイント認証
CALDAV_MCP_API_KEY が設定されている場合、/mcp エンドポイントへのすべてのリクエストには、以下のいずれかを含める必要があります:
Authorization: Bearer <token>X-Api-Key: <token>
トークンは、タイミングサイドチャネル攻撃を防ぐため、定数時間比較で照合されます。失敗した試行は、指数バックオフを備えたスライディングウィンドウ式レートリミッターでクライアントIPごとに追跡されます。
CALDAV_MCP_API_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証明書PEMファイルへのパス |
|
| TLS秘密鍵PEMファイルへのパス |
|
| カスタム認証局用のオプションの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ヘッダーまたは環境変数がない |
|
| タイプミスまたはカレンダー名の誤り |
|
イベントの時刻が正しく表示されない | サーバーのタイムゾーンが設定されていない |
|
FAQ
Q: 複数のCalDAVアカウントで使用できますか?
A: はい — リクエストごとに異なる X-Caldav-Url / X-Caldav-Username / X-Caldav-Password ヘッダーを送信してください。クライアントキャッシュは (url, username) をキーにします。
Q: どのCalDAVサーバーがサポートされていますか? A: CalDAV標準を実装する任意のサーバーです。Nextcloud、ownCloud、iCloud、Fastmail、Baikal、Radicale など。
Q: APIトークンは安全に送信されますか? A: HTTPS を使用する場合のみ。組み込みのTLSを有効にするか、サーバーをTLS終端リバースプロキシの背後に配置してください。
Q: CalDAVアプリパスワードを生成するにはどうすればよいですか? A: プロバイダーによって異なります。Nextcloud: 設定 → セキュリティ → アプリパスワード。iCloud: appleid.apple.com からアプリ専用パスワードを使用します。
Q: HTTPの代わりにstdioで使用できますか?
A: 現在のサーバーはStreamable HTTPトランスポートのみを使用します。stdioを使用するには、server.py を変更して mcp.run_http_async() の代わりに mcp.run() を呼び出してください。
ライセンス
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