Skip to main content
Glama
nweii
by nweii

Apple Calendar MCP

Apple Calendar MCP は、AI クライアントに 1 つの iCloud Calendar アカウントへのリモート読み取り・書き取りアクセスを提供します。これは Cloudflare 上でステートレスな TypeScript Worker として実行され、Apple デバイスがオンラインであり続ける必要はありません。

Deploy to Cloudflare

1 つのデプロイメントは 1 つの Apple Account に接続します。これはマルチユーザー カレンダー サービスではありません。

デプロイ前 に

必要なもの:

  • Cloudflare アカウント。

  • 二要素認証を有効にした Apple Account。

  • リモート HTTPS サーバーと OAuth をサポートする MCP クライアント。

  • あなたの IANA タイムゾーン名。例: America/New_York。

Apple と Cloudflare の設定ページはご自身で開いてください。エージェントは案内や結果の検証はできますが、あなたのパスワードを受取ったり入カしたりするべきではありません。

[!WARNING] Apple Account のパスワード、Apple アプリ固有パスワード、承パスワードをチャット、ソース管理、ログ、または Issue に貼り付けないでください。

Related MCP server: calendar-app-mcp

Apple アプリ固有パスワードを作成する

  1. account.apple.com を開いてサインインします。

  2. Sign-In and Security > App-Specific Passwords を選択します。

  3. Generate an app-specific password を選択します。

  4. 明確なラベルを付けます。例: Apple Calendar MCP。

  5. Cloudflare が要求するまで、生成された値は Apple のページに表示したままにします。

Apple では、アプリ固有パスワードに二要素認証が必用です。アクティブなパスワードは最マ 25 個まで作成できます。1 つまたはすべてを取り消しできます。メインの Apple Account パスワードを変更またはリセットすると、すべてのアプリ固有パスワードが取り消されます。Apple のアプリ固有パスワードの手順を参照してください。

[!WARNING] Apple アプリ固有パスワードは、この MCP がクライアントに表示する Calendar 権限よりも広い範囲を持ちます。Worker は許可リストに登録された iCloud CalDAV ホストにのみアクセスを制限しますが、Apple は Calendar 専用のアプリ固有パスワードを発行しません。

Cloudflare にデプロイする

  1. このページ上部の Deploy to Cloudflare を選択します。

  2. Cloudflare にサインインし、デプロイメント フォームに従います。

  3. Cloudflare が要求する 3 つのシークレット値を入カします:

    • ICLOUD_USERNAME: Apple Account と iCloud Calendar に使用する完全なメール アドレス。

    • ICLOUD_APP_PASSWORD: Apple が生成したアプリ固有パスワード。正確にそのまま保ちます。

    • APPROVAL_PASSWORD: 新し MCP クライアントの承を保護する、別の一意のパスワード。Apple のどちらのパスワードも再利用しないでください。

  4. Worker のデプロイメントが完了するまで待ちます。

  5. Workers & Pages を開き、Worker を選択し、Settings を選択して Variables and Secrets を見つけます。

  6. CALENDAR_TIME_ZONE を UTC からあなたの IANA タイムゾーン名に変更し、設定をデプロイします。

  7. 次の形式のエンドポインとをコピーします: https://<worker-name>.<account-subdomain>.workers.dev/mcp。

Cloudflare は 3 つのシークレット値を暗号化された Worker シークレットとして保格します。デプロイメント フォームは、生成されたリポジトリやローカルの .dev.vars ファイルにそれらを書き込みません。

シークレットをスキップした場合や置き換える必要がある場合は、Workers & Pages を開き、Worker を選択し、Settings を選択して Variables and Secrets を見つけ、値を Secret として追加または編集し、Deploy を選択します。

Cloudflare は OAUTH_KV 名前空間を自動的にプロビジョニングします。wrangler.jsonc に KV ID を追加しないでください。

MCP クライアントを接続する

  1. デプロイした /mcp エンドポイントをカスタム リモート MCP サーバーまたはアプリとして追カします。

  2. Connect を選択します。クライアントが OAuth を検出し、Apple Calendar MCP 承ページを開くはずです。

  3. クライアント名と要求された権限を確認します。

  4. APPROVAL_PASSWORD を入カし、Allow and return を選択します。ページが必要以上のアクセスを求める場合は Cancel を選択します。

  5. クライアントが接続完了を報告するまで待ちます。完了後もブラウザ タブが開いたままの場合は閉じます。

  6. クライアントのツールを更新または再スキャンします。クライアントは接続後またはサーバー更新後にツール カタログをキャッシュすることがあります。

Claude の場合は、リモート MCP でカスタム コネクタを使用するを参照してください。ChatGPT の場合は、開発者モードとフル MCP コネクタを参照してください。

承認ページでは、次の 2 つの権限が提供されます:

  • Read calendars and events は calendar:read を許可し、7 つの読み取りツールを公開します。

  • Read and edit calendars and events は calendar:read calendar:write を許可し、4 つの変更容易ールを追加します。

権限を変更するには、再認証とツール カタログの更新が必用です。サーバーの更新では、既存の読み取り専用の認可に書き取りツールが追カされません。

[!WARNING] 参カ者や招カ状に関わる書き取り操カは、他の人にメールや通知を送信することがあります。

接続を確認する

まず読み取りアクセスを確認します:

  1. calendar_get_profile を呼び出します。Apple Account の ID とタイムゾーンを確認します。

  2. calendar_list_calendars を呼び出します。期待するカレンダー名が表示されることを確認します。

  3. 読み取り専用アクセスを承した場会、クライアントが変更ツールを表示しないことを確認します。

デプロイメント、シークレットの入カ、OAuth 接続、カレンダーの読み取り成功は、それぞれ独リした状態です。カレンダーの読み取りが成功すれば、Apple の認証情報が機能していることが証明されます。

書き取りアクセスを確認するには、まず Apple Calendar に空の一時カレンダーを作成します。エージェントには、あなたが確認した後にのみ、この制限されたテスを実行するよう依頼します:

  1. 一意のタイル、参カ者なし、繰り返しなし、アラートなしで、未ライのイベントを 1 つ作成します。

  2. イベントを読み取り、現在の ETag を保ちます。

  3. その ETag を使ってタイルのみを変更します。

  4. もう一度イベントを読み取り、返された ETag を使って削除します。

  5. イベントが存在しないことを確認します。

クリーンアップが失敗した場会、正しく なカレンダー、タイル、時刻を記録して、自分でイベントを削除できるようにしてください。デフォルトのカレンダーで書き取りテスをしないでください。

また、エージェントと Apple Calendar MCP をセットアップするの制限された手順をエージェントに与えることもできます。

ツール

ツール

スコープ

目的

calendar_get_profile

calendar:read

設定された iCloud アカウントの ID とデフォルトのタイムゾーンを返します。

calendar_list_calendars

calendar:read

表示されているカレンダー、有効なタイムゾーン、および不透明な ID を一覧表示します。

calendar_search_events

calendar:read

カレンダー全体で制限された時 間範囲を検索します。

calendar_list_events

calendar:read

1 つのカレンダーから制限された時 間範囲を一覧表示します。

calendar_get_event

calendar:read

イベントの詳細と現在の ETag を読み取ります。

calendar_batch_get_events

calendar:read

イベントごとのエラーを含む最マ 20 件のイベントを読み取ります。

calendar_get_availability

calendar:read

イベントの詳細を含まない、結合されたビジー ウィンドウを返します。

calendar_create_event

calendar:write

時 刻指定、終日、繰り返し、招カ、場 所指定、アラート付きのイベントを作成します。

calendar_update_event

calendar:write

1 つの出 現、この出 現以降、または系 列全体を変 更します。

calendar_delete_event

calendar:write

1 つの出 現、この出 現以降、または系 列全体を削 除します。

calendar_respond_to_invitation

calendar:write

招 カを受 託、辞 退、または仮 受 託します。

更新、削除、招カ応答ツールには、最新の ETag が必用です。繰り返しの出 現変 更には、検 索で返された元の recurrenceId も必用です。

時 刻指定の入 力には、Z または明 示的なオフセット付きの RFC 3339 タイムスタンプを使用します。クライアントは timeZone を省 略できます。作 成時 には、カレンダーの公 開された IANA タイムゾーンが使 用され、次に CALENDAR_TIME_ZONE が使 用されます。時 刻指定の出 力には、UTC と現 地の値が含 まれます。

location は表 示される Calendar のフィールドです。structuredLocation では、タイトル、住 所、緯 度、経 度、半 径を追 加できます。検 証済みの座 標により、Apple Calendar のマップ プレビューが有 効になります。座 標を推 測しないでください。

description は Calendar のメモに対 応します。url はイベントの URL フィールドに対 応します。MCP は、無 関係な変 更の際にサポートされていない添 付ファイルとアラーム タイプを保 持しますが、添 付ファイルのアップロード、ダウンロード、変 更は行 いません。生の ICS をインポートすることもありません。

カスタム ドメインを使用する

デフォルトの workers.dev エンドポインとには、ホスト名の設 定は不 要です。カスタム ドメインには、明 示的な許 可リストの設 定が 1 つ必 要です:

  1. Cloudflare で Worker を開きます。

  2. Settings > Domains & Routes > Add > Custom Domain を選 択し、ホスト名を追 加します。

  3. Variables and Secrets で、MCP_HOSTNAME を平 文変 数として追 加します。calendar.example.com などのホスト名のみを入 力します。https://、パス、ポート、認 証情 報を 含 めないでください。

  4. 設 定をデプロイします。

  5. クライアントを再 度 https://<custom-host>/mcp に接 続し、再び認 証を完 了します。

ホスト名は OAuth アイデンティティの一 部です。workers.dev に対 して発 行されたトークンは、カスタム オリジンには移 行しません。

Cloudflare Access を追 加する

組 み込 みの承 認パスワードがデフォルトの認 可ガードです。Cloudflare Access はオプションの多 層防 御です。

Access を追 加する場 合、<hostname>/authorize のみを保 護してください。/me mcp、/.well-known/*、/oauth/token、/oauth/register は MCP クライアントがアクセスできるようにしておいてください。Access が /authorize を保 護していることを確 認したら、EXTERNAL_AUTHORIZATION=true を平 文の Worker 変 数として追 加します。

[!WARNING] EXTERNAL_AUTHORIZATION=true は、外 部ガードが /authorize を保 護している場 合にのみ設 定してください。この設 定は、外 部ガードがアクティブであることを宣 言するものです。

セキュリティ

Worker は、実 行時 にあなたの Apple ユーザーネームとアプリ固 有パスワードを受 け取ります。あなたは自 分の Cloudflare アカウント、デプロイされたソース、Apple、および接 続されたすべての MCP クライアントを信 頼します。Cloudflare アカウントへのアクセスを制 限し、信 頼できるクライアントのみを接 続してください。

APPROVAL_PASSWORD は新 しい承 認を保 護します。このパスワードが設 定されているか、EXTERNAL_AUTHORIZATION が検 証済みの外 部ガードを宣 言している場 合を除 き、承 認ルートはフェイルクローズドになります。ガードを通 かした人 は誰 でも、設 定された Apple Account に対 してクライアントを認 可できます。

Cloudflare の OAuth プロバイダーは、アクセス トークン、リフレッシュ トークン、認 可コード、登 録済みクライアント シークレットをハッシュで保 格します。認 可プ口パティは暗 号 化されます。クライアント名とグラント メタデータはストレージ上 で可 視のま ま残るため、シークレットを 含 めてはな りません。プロバイダーの K V ストレージとクリーンアップのドキュメンテーションを参 照してください。

Worker は、許 可リストに登 録された iCloud CalDAV ホストにのみ、HTTPS で Apple の認 証情 報を送 信します。ツール引 数でアップロード ホストを選 択することはできません。エラーは認 証情 報に似 た値を伏 せます。Worker はツール引 数やイベント ペイロードをログに記 録しません。

ツール結 果には、タイル、メモ、場 所、参 カ者、URL が含 まれる場 合があります。MCP クライアントは、自 社の製 品およびワークスペースのポリシーに基 づいてこのデータを保 持できます。

書 き込 みアクセスは、イベントの作 成、変 更、削 除、招 カへの応 答を対 象とします。ETag はよ り新 しいイベントの上 書 きを防 ぎますが、意 図しない書 き込 みを無 害にすることはできません。無 関係な変 更では、可 能な場 合にサポートされていない Apple プロパティが保 持されます。

この正 準リポジトリ、または変 更をレビューしたフォークからデプロイしてください。リモート MCP サーバーは、所 有 者が新 しいコードをデプロイするとツール カタログを変 更できます。

アクセスを取り消す、またはローテーションする

目標

操作

結果

1つのクライアントを停止する

そのクライアントの設定で切断または削除します。利用可能な場合は失効フローを使用します。

クライアントはその接続の使用を停止します。

新しい承認を停止する

APPROVAL_PASSWORD をローテーションするか、Workerを無効化します。

既存のOAuthトークンは影響を受けません。

すべてのAppleアクセスを直ちに停止する

Workerを無効化し、account.apple.com でそのアプリ固有のパスワードを失効させます。

新しいアプリ固有のパスワードを設定するまで、カレンダー呼び出しは失敗します。

通常のローテーションを行う

新しいAppleアプリ固有のパスワードを作成し、Cloudflareで ICLOUD_APP_PASSWORD を置き換え、読み取り呼び出しを検証してから、古いパスワードを失効させます。

失効前に置き換えを検証するため、ダウンタイムを回避できます。

Apple Accountのパスワードリセット後に復旧する

新しいアプリ固有のパスワードを作成し、Workerのシークレットを置き換えます。

Appleは既に古いアプリ固有のパスワードを失効させています。

侵害を疑う場合は、最初に古いAppleアプリ固有のパスワードを失効させます。次にそれを置き換えてアクセスを検証します。これにより短時間の停止が発生します。

トラブルシューティング

  • 401 まはiCloudパスワードの拒否は、通例、アプリ固有のパスワードが存しないか失効していることを意味します。AppleとCloudflareで作成または置き換えてください。チャットに貼り付けないでください。

  • 書き込みツールがない場合は、通例、クライアントが読み取り専用の許可を持っているか、ツールカタログがキャッシュされていることを意味します。ツールを更新し、必要に応じて切断して再度承認してください。

  • /mcp を拒否するカスタムドメインは、通例、MCP_HOSTNAME が欠落しているか無効です。正確なホスト名を設定して再デプロイしてください。

  • フェイルクローズする承認ページには、APPROVAL_PASSWORD も宣言された外部ガードもありません。/authorize でCloudflare Accessを既に検証していない限り、承認シークレットを追加してください。

ローカルでの開発

bun install
cp .dev.vars.example .dev.vars
bun run test
bun run typecheck
bun run cloudflare:check

.dev.vars はローカルに保持します。bun run deploy でデプロイします。

ライセンス

MIT

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables calendar management with iCloud through CalDAV, allowing users to list, create, update, and delete events via a standardized API.
    558 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides AI calendar operators full iCloud Calendar access through CalDAV, with two-factor authentication and app-specific passwords.
    MIT