Skip to main content
Glama

caldav-mcp

AIアシスタントにカレンダーを。 CalDAV互換のあらゆるカレンダー — Nextcloud、Radicale、Baikal、ownCloud、iCloud、Fastmail など — への読み書きアクセスを、14個の専用ツールを通じて提供するMCPサーバーです。

caldav-mcp が選ばれる理由

Docker対応

マルチステージのAlpineベースイメージ、非root実行、組み込みヘルスチェック。Dockerが動作する場所ならどこにでもデプロイできます。

Python 3.13

Pydantic検証によるクリーンで型付けされたコードベース。読みやすく、拡張も簡単です。

単一コンテナ

たった一つの docker compose up — データベースもバックグラウンドワーカーもサイドカーも不要です。

ステートレス

リクエスト間でセッション状態を保持しません。認証情報はリクエストごとに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ツールを公開します。

クエリ(読み取り専用)

ツール

説明

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. ビルダーステージrequirements.txt からPython依存関係をクリーンなプレフィックスにインストールします。

  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)の背後で実行してください。

認証

2つの独立したレイヤー — どちらもオプションですが推奨されます。

レイヤー1: MCPエンドポイント認証

CALDAV_MCP_API_KEY が設定されている場合、/mcp エンドポイントへのすべてのリクエストには、以下のいずれかを含める必要があります:

  • Authorization: Bearer <token>

  • X-Api-Key: <token>

トークンは、タイミングサイドチャネル攻撃を防ぐため、定数時間比較で照合されます。失敗した試行は、指数バックオフを備えたスライディングウィンドウ式レートリミッターでクライアントIPごとに追跡されます。

CALDAV_MCP_API_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証明書PEMファイルへのパス

CALDAV_MCP_TLS_KEY

""

TLS秘密鍵PEMファイルへのパス

CALDAV_MCP_TLS_CA_BUNDLE

""

カスタム認証局用のオプションのCAバンドル

ロギング

変数

デフォルト

説明

CALDAV_MCP_LOG_FORMAT

text

監査ログの形式: text または json

セキュリティ

  • 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

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() を呼び出してください。

ライセンス

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