Skip to main content
Glama
Isaac-To
by Isaac-To

CalDAV MCP Forwarder

完全にステートレスなModel Context Protocolサーバーで、Cloudflare WorkersからCalDAVサーバーにカレンダー操作を転送します。

ソースコードとデプロイ手順はGitHubリポジトリにあります。

ステータス: 機能する最初のリリースです。Workerはカレンダーの検出、イベントの一覧表示/検索、イベントの取得、作成、更新、削除、空き時間/予定ありのクエリをサポートしています。

3ステップで接続

  1. ブラウザで https://caldavmcp.anpc.work を開きます。

  2. CalDAVサーバー、ユーザー名、アプリパスワードを入力し、Test connection をクリックします。Calendar URL は空白のままにすると、自動的にカレンダーが検出されます。

  3. 必要に応じてデフォルトのカレンダーを選択し、セキュアトークンを作成して、生成されたMCP URLまたは設定をAIアシスタントにコピーします。

公開ページはデフォルトで有効期限なしの暗号化トークンを作成し、一度設定すれば忘れて使えます。必要に応じて短い有効期間を選択することもできます。認証情報はHTTPS経由でWorkerに送信されて暗号化され、ブラウザ内でデコードされることはありません。トークンを無効にする必要がある場合は CONNECTION_TOKEN_KEY をローテーションしてください。

アシスタントはイベントの一覧表示、検索、読み取り、作成、更新、削除、および空き時間/予定あり情報のクエリを実行できます。すべてのリクエストは独立しており、カレンダー、認証情報、セッションは保存されません。

Related MCP server: calendar-mcp

セキュリティモデル

生のパスワード、アプリパスワード、アクセストークンをURLに直接配置しないでください。URLはブラウザの履歴、リバースプロキシ、分析システム、アクセスログに残る可能性があります。

接続トークンは暗号化されたAES-GCM値です。

POST https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>

トークンは以下のような接続詳細を表します。

{
  "serverUrl": "https://caldav.example.com",
  "calendarUrl": "https://caldav.example.com/calendars/user/work/",
  "username": "user@example.com",
  "password": "app-password",
  "expiresAt": 1797700000
}

Workerは各トークンを1リクエストのために復号し、その後接続詳細を破棄します。トークンは作成時に有効期限を選択しない限り期限切れになりません。CONNECTION_TOKEN_KEY をローテーションすると、以前のキーで作成されたすべてのトークンを無効にできます。イベントおよび空き時間/予定ありURLは、設定されたCalDAVサーバーに属している必要があります。Workerのシークレットとして設定してください。キーはURLセーフなbase64で、128ビット、192ビット、または256ビットのAESキーを含む必要があります。

プライマリアカウントのパスワードよりも、プロバイダ固有のアプリパスワードやOAuthアクセストークンを優先してください。トークンや認証情報をこのリポジトリにコミットしないでください。

MCPクライアントの接続

Workerをデプロイしたら、WorkerのURLでMCPクライアントを設定します。正確な設定はクライアントによって異なりますが、エンドポイントは次のとおりです。

https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>

リモートHTTPサーバーを受け入れるMCPクライアント設定では、エンドポイントをサーバーURLとして使用します。例:

{
  "mcpServers": {
    "caldav": {
      "type": "http",
      "url": "https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>"
    }
  }
}

上記のサンプルトークンを実際のクライアントに貼り付けないでください。対象のCalDAVアカウントとカレンダー用に生成されたトークンに置き換えてください。

アシスタントは次のようなツールを呼び出せるようになります。

  • list_calendars

  • list_events

  • search_events

  • get_event

  • create_event

  • update_event

  • delete_event

アシスタントが処理できるリクエストの例:

  • 「明日の仕事用カレンダーには何が入っていますか?」

  • 「来週の火曜日の10:00に歯医者の予定を作成して。」

  • 「午後3時の会議を金曜日に移動して。」

  • 「『プロジェクトレビュー』というタイトルのイベントをキャンセルして。」

  • 「四半期計画会議に言及しているすべてのイベントを検索して。」

アシスタントは、特にイベントの削除など、重要な破壊的操作を実行する前に、ユーザーに確認する必要があります。

ツールの出力形式

ツールの応答は、次のアクションに必要な情報のみを含むコンパクトなJSONを使用します。

  • カレンダーリストには url と、利用可能な displayName、description、timezone、color が含まれます。

  • イベントリストと get_event には url、オプションの etag、現在のiCalendar data が含まれます。

  • create_event は作成されたイベントの url を返します。

  • update_event は更新されたイベントの url を返します。

  • delete_event は削除されたイベントの url と deleted: true を返します。

  • get_free_busy は空き時間/予定ありのiCalendar data のみを返します。

応答にはHTTPステータスコード、生のCalDAVメタデータ、プレゼンテーション書式は含まれません。

デプロイ

依存関係をインストール:

npm install

Workerをローカルで実行:

npm run dev

プロジェクトの型チェック:

npm run typecheck

単体テストを実行

npm test

カバレッジ付きでテストを実行

npm run coverage

カバレッジのしきい値は、ステートメント、行、関数で90%、ブランチで85%に設定されています。現在の単体テスト可能なソースモジュールは、4つのカテゴリすべてで100%を報告しています。Cloudflare Workerのエントリポイントは、Workersランタイムと外部CalDAVサービスが必要なため除外されています。デプロイ済みの環境または wrangler dev によるスモークテストで検証してください。

Cloudflare Workersにデプロイ:

npx wrangler login
npm run deploy

WorkerはCloudflareカスタムドメイン caldavmcp.anpc.work として設定されています。ゾーンが同じCloudflareアカウントでアクティブな場合、Wranglerがドメインと証明書を作成します。デプロイ前に必要なシークレットを設定してください。

npx wrangler secret put CONNECTION_TOKEN_KEY
npm run deploy

ドメインはCloudflare DNSでアクティブである必要があります。caldavmcp.anpc.work に対して競合するCNAMEレコードを追加しないでください。カスタムドメインがDNSレコードを管理します。

暗号化キーをCloudflare Workerのシークレットとして設定:

npx wrangler secret put CONNECTION_TOKEN_KEY

ローカル開発では、.dev.vars.example から .dev.vars を作成し、プレースホルダーを生成したキーに置き換えてください。Wranglerは npm run dev の実行時に .dev.vars を自動的に読み込みます。このファイルはコミットしないでください。

cp .dev.vars.example .dev.vars
openssl rand -base64 32 | tr '+/' '-_' | tr -d '='

暗号化キーを wrangler.jsonc、ソースコード、またはクライアント設定に決して配置しないでください。

利用可能なツール

すべてのツールは、トークン内の calendarUrl で選択されたカレンダーに対して動作するか、必要に応じて明示的な calendarUrl を受け入れます。

ツール

目的

list_calendars

アカウント内のカレンダーを検出します。

list_events

必須の start/end 範囲のイベントを一覧表示します。calendarUrl がない場合はすべてのカレンダーを検索します。

search_events

テキストでイベントデータを検索します。calendarUrl がない場合はすべてのカレンダーを検索します。

get_event

オブジェクトURLでイベントを取得します。

create_event

サマリー、開始、終了を指定してイベントを作成します。

update_event

現在のiCalendarデータとオブジェクトURLを使用してイベントを更新します。

delete_event

イベントを削除します。オプションでETagを指定できます。

get_free_busy

時間範囲の空き時間/予定ありデータをクエリします。

日付はISO 8601文字列(例:2026-08-20T10:00:00Z)にしてください。イベントの更新には現在のiCalendar data が必要です。これにより、プロバイダ固有の未知のプロパティが保持されます。

エージェント向けのツール動作

  • 利用可能なカレンダーURLが不明な場合は、最初に list_calendars を呼び出します。

  • list_events と search_events には start と end が必要です。明示的な calendarUrl で1つのカレンダーを選択します。指定がない場合は、トークンに設定されたカレンダーが使用されます。設定がない場合はすべてのカレンダーが検索されます。

  • search_events は、イベントのタイトルだけでなく、各イベントのiCalendarデータに対して大文字小文字を区別しないテキスト検索を実行します。

  • get_event にはイベントの現在のHTTPSオブジェクトURLが必要です。

  • create_event には summary、start、end が必要です。カレンダーの選択は、明示的なURL、トークンのカレンダー、次に最初に利用可能なカレンダーの順です。

  • update_event には現在のイベント data が必要です。変更するフィールドのみを送信してください。省略されたフィールドは保持されます。

  • delete_event はイベントを完全に削除します。最初にユーザーに削除を確認し、利用可能な場合は現在のETagを渡してください。

  • get_free_busy は要求された範囲のiCalendar空き時間/予定ありデータを返し、イベントの詳細は一覧表示しません。

ステートレスなリクエストフロー

MCP client
   |
   | POST /mcp/<encrypted-token>
   v
Cloudflare Worker
   | decrypt token in memory
   | create request-scoped CalDAV client
   | perform one operation
   | discard credentials and response data
   v
CalDAV server

このWorkerはカレンダーデータやMCPセッション状態を保持しません。リクエスト本文、認証情報、CalDAV応答はリクエスト中のみ存在します。

プロバイダに関する注意

CalDAVの実装は異なります。アプリパスワードやプロバイダ固有のエンドポイントが必要になる場合があります。

  • Nextcloud: 通常、アプリパスワードとカレンダーコレクションURLをサポートしています。

  • Fastmail: アプリ固有のパスワードとFastmailが提供するCalDAVエンドポイントを使用してください。

  • iCloud: 通常、アプリ固有のパスワードとアカウントのCalDAVエンドポイントが必要です。

  • Google Calendar: ネイティブのCalDAVサポートは限られています。CalDAV互換性が不十分な場合は、代わりにGoogleのAPIを使用してください。

対象のプロバイダで、カレンダーの検出、繰り返しイベント、タイムゾーン、参加者、ETag、削除動作を必ずテストしてください。

技術スタック

  • Cloudflare Workers

  • TypeScript

  • @modelcontextprotocol/sdk

  • tsdav

  • ical.js

  • zod

制限事項

このサービスはリクエストを転送するものであり、カレンダー同期サービスにはなりません。ローカルのイベントインデックスを維持したり、カレンダー間でイベントの重複排除を行ったり、後で実行するために作業をキューに入れたりすることはありません。CalDAVプロバイダが利用できない場合、リクエストは失敗し、永続ストレージからの再試行は行われません。

Related MCP Connectors

Related MCP Servers

  • 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.
    31 PyPI
    AGPL 3.0
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.
    6
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that gives AI assistants read/write access to any CalDAV calendar, enabling natural language management of events, attendees, and calendar queries across Nextcloud, Radicale, iCloud, and more.
    6
    MIT