Apple Calendar について
macOS の Apple Calendar 向け MCP サーバーです。カレンダーデータの読み取りに加え、設定によりイベントの作成・更新・削除もできます。読み取りと書き込みは別経路で、書き込みツールは初期状態では登録されません。
主な機能
- 01アカウントとカレンダーの一覧表示
- 02期間を指定したイベントの一覧・検索・取得
- 03有効化時のイベント作成・更新・削除
- 04アカウントやカレンダーによる読み取り対象の絞り込み
活用シーン
- 01指定期間内の予定を確認
- 02カレンダーイベントを検索して内容を確認
- 03書き込みを有効にして予定を変更
MCP 対応
MCP サーバーとして、カレンダーの診断、アカウントとカレンダーの一覧、イベントの読み取り・検索ツールを公開します。書き込みツールは APPLE_CALENDAR_ALLOW_WRITES=1 の場合にのみ登録されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @mgcrea/mcp-apple-calendarAPPLE_CALENDAR_ALLOW_WRITESRegister the mutating tools. Off by default, and the gate decides whether the write tools exist at all rather than merely refusing — an agent with writes off cannot see them.APPLE_CALENDAR_CALENDARSRestrict every read and write to these calendars, by name.APPLE_CALENDAR_ACCOUNTSRestrict every read and write to these Calendar accounts, by name or id. Bounds reading, not just writing.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
@mgcrea/mcp-apple-calendar
macOS の Apple Calendar アプリ向け Model Context Protocol サーバーです。
非公式です。 Apple とは提携していません。Mac 上にすでにある Calendar ストアを読み取ります。
読み取り用と書き込み用のレーンを分けています
- インデックスレーン —
Calendar.sqlitedbを読み取り専用の SQLite で読み取ります。すべての読み取りはこのレーンを経由します。 - Apple Events レーン — 書き込み専用です。このパッケージには
jxa/read.tsはなく、今後も追加されないことをテストで保証しています。
これは Notes とは逆の方式です。 Notes では検索が 97 ms だったため Apple Events を採用しました。Calendar ではそうはいきません。Apple Events 経由で 1,349 件のイベントを対象に ±90 日の範囲を検索すると 3,355 ms かかり、whose はさらに遅く不安定です。また、プロパティごとの一括取得には、どのプロパティでも約 1.8 秒かかるため、Notes の一括取得のようにコストを償却できません。ストアは読み取り専用で 1 ms で開きます。Calendar に必要なのは機能ではなく、速度のためのファイルレーンです。
EventKit は必要ありません。そのため、コンパニオンアプリは、独自の TCC プロンプトを表示するフレームワークにリンクすることなく、純粋なブローカーのままです。
| 権限 | 必要な用途 | 許可しない場合 |
|---|---|---|
| フルディスクアクセス | すべての読み取り | 何も動作しません — 読み取りの代替手段はありません |
| オートメーション → Calendar | 書き込みのみ | 読み取りには影響しません |
Calendar.app に権限を付与する必要はありません。権限が必要なのは 読み取り側 です。サーバーを起動するアプリ(Terminal、iTerm、VS Code、Claude)にフルディスクアクセスを付与してから、再起動してください。
書き込みを無効にした状態(デフォルト)では、オートメーションの許可プロンプトは一切表示されません。読み取り専用の Calendar サーバーに必要な権限は 1 つだけです。
ツール
読み取り:diagnostics、list_accounts、list_calendars、list_events、search_events、get_event。
書き込みは APPLE_CALENDAR_ALLOW_WRITES=1 の場合にのみ登録されます。フラグがオフの場合、モデルには表示されず、単に拒否されるわけではありません:create_event、update_event、delete_events。
設定
| 変数 | デフォルト | |
|---|---|---|
APPLE_CALENDAR_ALLOW_WRITES | オフ | 書き込みツールを登録します。 |
APPLE_CALENDAR_ACCOUNTS | すべて | 読み取り側の許可リスト。カンマ区切りです。 |
APPLE_CALENDAR_CALENDARS | すべて | 読み取り側の許可リスト。カンマ区切りです。 |
APPLE_CALENDAR_DEFAULT_CALENDAR | Calendar の | 名前が指定されていない場合に、新しいイベントを追加するカレンダーです。 |
APPLE_CALENDAR_DEFAULT_RANGE_DAYS | 7 | 範囲を無制限にすると、10 年分をスキャンすることになります。 |
APPLE_CALENDAR_MAX_RANGE_DAYS | 366 | 呼び出し元が指定する範囲の上限です。 |
APPLE_CALENDAR_DEFAULT_EVENT_DURATION_MINUTES | 60 | 書き込み時に終了時刻が指定されていない場合に使います。 |
APPLE_CALENDAR_INCLUDE_DECLINED | オフ | 読み取り時に辞退したイベントを含めます。 |
APPLE_CALENDAR_INCLUDE_CANCELLED | オフ | 読み取り時にキャンセルされたイベントを含めます。 |
APPLE_CALENDAR_TIMEZONE | システム | 範囲の解決に使うタイムゾーンを上書きします。 |
APPLE_CALENDAR_INDEX_MODE | auto | auto | ro | immutable | off。 |
APPLE_CALENDAR_STORE | 自動 | Calendar.sqlitedb のパスを明示的に指定します。 |
APPLE_CALENDAR_OSASCRIPT_TIMEOUT_MS | 30000 | 初回の権限プロンプトに対応できるよう設定されています。 |
注意すべき点
~/Library/Calendarsは存在しません。 保存先は~/Library/Group Containers/group.com.apple.calendar/Calendar.sqlitedbです。- 繰り返し予定はキャッシュテーブルにあります。 日付範囲を指定して単純に
SELECT ... FROM CalendarItemを実行すると、展開済みの繰り返し予定が漏れます。範囲クエリでは、繰り返しルールを持たないアイテムとキャッシュ内のすべてのアイテムを結合します。キャッシュ内の489件の親アイテムのうち456件は、それ自体のルールを持ちません。 - 日付は1970年からではなく、2001年からの秒数です。
CalendarItem.last_modifiedとorig_dateの両方が該当します。 - フローティングタイムゾーンはシステムのタイムゾーンではありません。
GMT±HHMMに一致するものは実際のタイムゾーンです。それ以外をフローティングとして扱うことで、気付かないまま2時間ずれるのを防げます。 - 書き込みは必ず Apple Events 経由で行い、ストアには直接書き込みません。 アプリがストアを開いたまま保持し、同期するためです。
ライセンス
MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。