CalDAV MCP Forwarder
CalDAV MCP Forwarder
完全にステートレスなModel Context Protocolサーバーで、Cloudflare WorkersからCalDAVサーバーにカレンダー操作を転送します。
ソースコードとデプロイ手順はGitHubリポジトリにあります。
ステータス: 機能する最初のリリースです。Workerはカレンダーの検出、イベントの一覧表示/検索、イベントの取得、作成、更新、削除、空き時間/予定ありのクエリをサポートしています。
3ステップで接続
ブラウザで
https://caldavmcp.anpc.workを開きます。CalDAVサーバー、ユーザー名、アプリパスワードを入力し、Test connection をクリックします。Calendar URL は空白のままにすると、自動的にカレンダーが検出されます。
必要に応じてデフォルトのカレンダーを選択し、セキュアトークンを作成して、生成されたMCP URLまたは設定をAIアシスタントにコピーします。
公開ページはデフォルトで有効期限なしの暗号化トークンを作成し、一度設定すれば忘れて使えます。必要に応じて短い有効期間を選択することもできます。認証情報はHTTPS経由でWorkerに送信されて暗号化され、ブラウザ内でデコードされることはありません。トークンを無効にする必要がある場合は CONNECTION_TOKEN_KEY をローテーションしてください。
アシスタントはイベントの一覧表示、検索、読み取り、作成、更新、削除、および空き時間/予定あり情報のクエリを実行できます。すべてのリクエストは独立しており、カレンダー、認証情報、セッションは保存されません。
Related MCP server: mcp-labrat
セキュリティモデル
生のパスワード、アプリパスワード、アクセストークンを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_calendarslist_eventssearch_eventsget_eventcreate_eventupdate_eventdelete_event
アシスタントが処理できるリクエストの例:
「明日の仕事用カレンダーには何が入っていますか?」
「来週の火曜日の10:00に歯医者の予定を作成して。」
「午後3時の会議を金曜日に移動して。」
「『プロジェクトレビュー』というタイトルのイベントをキャンセルして。」
「四半期計画会議に言及しているすべてのイベントを検索して。」
アシスタントは、特にイベントの削除など、重要な破壊的操作を実行する前に、ユーザーに確認する必要があります。
ツールの出力形式
ツールの応答は、次のアクションに必要な情報のみを含むコンパクトなJSONを使用します。
カレンダーリストには
urlと、利用可能なdisplayName、description、timezone、colorが含まれます。イベントリストと
get_eventにはurl、オプションのetag、現在のiCalendardataが含まれます。create_eventは作成されたイベントのurlを返します。update_eventは更新されたイベントのurlを返します。delete_eventは削除されたイベントのurlとdeleted: trueを返します。get_free_busyは空き時間/予定ありのiCalendardataのみを返します。
応答にはHTTPステータスコード、生のCalDAVメタデータ、プレゼンテーション書式は含まれません。
デプロイ
依存関係をインストール:
npm installWorkerをローカルで実行:
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 deployWorkerは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 を受け入れます。
ツール | 目的 |
| アカウント内のカレンダーを検出します。 |
| 必須の |
| テキストでイベントデータを検索します。 |
| オブジェクトURLでイベントを取得します。 |
| サマリー、開始、終了を指定してイベントを作成します。 |
| 現在のiCalendarデータとオブジェクトURLを使用してイベントを更新します。 |
| イベントを削除します。オプションでETagを指定できます。 |
| 時間範囲の空き時間/予定ありデータをクエリします。 |
日付は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/sdktsdavical.jszod
制限事項
このサービスはリクエストを転送するものであり、カレンダー同期サービスにはなりません。ローカルのイベントインデックスを維持したり、カレンダー間でイベントの重複排除を行ったり、後で実行するために作業をキューに入れたりすることはありません。CalDAVプロバイダが利用できない場合、リクエストは失敗し、永続ストレージからの再試行は行われません。
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
- Alicense-qualityAmaintenanceAn 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.37897MIT
- Flicense-qualityDmaintenanceAn 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.
- Alicense-qualityFmaintenanceProvider-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
- AlicenseAqualityBmaintenanceMCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.86MIT
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.
MCP server connecting AI agents to non-custodial staking data across 130+ networks.
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/Isaac-To/caldav_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server