mcp-ical-swift
mcp-ical-swift
macOS SequoiaのTCC制限を回避するためにコンパイル済みSwiftバイナリを使用する、Apple Calendar用のローカルMCPサーバーです。
なぜこれが必要なのか
macOS Sequoia (26.x) では、ヘッドレスプロセスは標準のTCC(プライバシーとセキュリティ)メカニズムを通じてカレンダーへのアクセス権を取得できません。
PythonからのEventKit (例: PyObjC) は
kTCCServiceCalendarを必要としますが、これはヘッドレスプロセスではトリガーできないシステムダイアログを通じてのみ許可されます。Sequoiaの「システム設定」>「プライバシーとセキュリティ」>「カレンダー」には+ボタンが存在しません。osascript経由のAppleScript はkTCCServiceAppleEvents(自動化の許可)を必要としますが、これは呼び出し元のバイナリ(通常はnodeやbun)に帰属します。TCCデータベースを直接編集しても、TCCデーモンの整合性チェックによって無視されます。icalBuddy やその他のHomebrewツールは内部でEventKitを使用しており、同様の壁に突き当たります。
コンパイル済みのSwiftバイナリ (swiftc) が機能するのは、それがAppleによって署名されたMach-O実行ファイルであり、システムSwiftツールチェーンからカレンダーのTCC権限を継承するためです。Node/Bunが execFileSync を介してこのバイナリを起動すると、EventKitは authorizationStatus = .fullAccess を報告し、カレンダーデータを返します。
機能
すべてのカレンダーを一覧表示
指定した期間内のイベントを一覧表示
キーワードでイベントを検索
新規イベントの作成(カレンダー、場所、メモ、終日対応)
既存イベントの更新
UIDによるイベント詳細の取得
イベントの削除
stdio経由で完全にローカルで動作(ネットワーク、APIキー、クラウドは不要)
前提条件
macOS Sequoia (26.x) 以降
Bun 1.1以降
swiftc用のXcode Command Line Tools (xcode-select --install)Appleカレンダー内のカレンダーデータ(iCloud、Exchange、またはローカルカレンダー)
インストール
git clone https://github.com/Sealjay/mcp-ical-swift.git
cd mcp-ical-swift
bun install
bun run buildbuild スクリプトは src/calendar-reader.swift を bin/calendar-reader にコンパイルします。
MCPクライアントの設定
Claude Code
claude mcp add --transport stdio ical --scope user -- bun run /absolute/path/to/mcp-ical-swift/src/index.tsOpenClaw
{
"mcp": {
"servers": {
"ical": {
"command": "bun",
"args": ["run", "/absolute/path/to/mcp-ical-swift/src/index.ts"]
}
}
}
}Claude Desktop
claude_desktop_config.json に以下を追加します:
{
"mcpServers": {
"ical": {
"command": "bun",
"args": ["run", "/absolute/path/to/mcp-ical-swift/src/index.ts"]
}
}
}ツール
ツール | 説明 |
| すべてのAppleカレンダーを一覧表示 |
| 指定期間内(YYYY-MM-DD)のイベントを一覧表示 |
| キーワードでイベントを検索(デフォルト:30日先まで) |
| 新規イベントを作成(タイトル、開始、終了、カレンダー、場所、メモ、終日) |
| UIDで既存イベントを更新 |
| UIDでイベントの詳細を取得 |
| UIDでイベントを削除 |
仕組み
MCP Client (Claude, OpenClaw, etc.)
--> stdio --> Bun MCP server (src/index.ts)
--> execFileSync --> compiled Swift binary (bin/calendar-reader)
--> EventKit framework --> Apple Calendar dataSwiftバイナリは一度コンパイルされ (bun run build)、各ツール呼び出し時に同期的に実行されます。バイナリはJSONをstdoutに出力し、Bun MCPサーバーがそれをMCPツール結果としてラップします。サーバーはインジェクションリスクを避けるため、シェル実行ではなく execFileSync を使用します。
重要なポイント:swiftc でコンパイルされたバイナリはAppleによって署名されており、システムツールチェーンからカレンダーのTCC権限を継承します。これにより、Node、Bun、Python、AppleScriptがヘッドレス環境でカレンダーにアクセスすることを妨げるTCC制限を回避できます。
プライバシーとセキュリティ
このサーバーはデフォルトでシステム上のすべてのカレンダー(iCloud、Exchange、ローカル、共有、購読)にアクセスします。
list_eventsおよびsearch_eventsのオプションのcalendarパラメータを使用して、リクエストごとにカレンダー名でフィルタリングできます。イベントのメモはレスポンスに含まれ、機密データ(会議のPIN、パスワード、個人情報など)が含まれている可能性があります。MCPクライアントにアクセス権を付与する際はこれを考慮してください。
書き込み操作(
create_event、update_event、delete_event)は確認ステップなしで実行可能です。MCPクライアント(またはその中のプロンプトインジェクション)がカレンダーデータを変更する可能性があります。すべての通信はstdio経由のローカルで行われ、外部サービスにデータは送信されません。
脆弱性を報告する場合は SECURITY.md を参照してください。
制限事項
macOS専用(EventKitとSwiftツールチェーンが必要)
Bunランタイムが必要
Swiftバイナリは一度コンパイルされ、ツール呼び出しごとに同期的に呼び出されるため、非常に高いスループットの用途には適していません
定期的なイベントの変更は、その単一のインスタンスのみに適用されます (
.thisEventスパン)カレンダーへのアクセスは、macOSのTCCがコンパイル済みバイナリに許可を与えているかどうかに依存します
トラブルシューティング
「Calendar access is not granted(カレンダーへのアクセス権がありません)」
コンパイルされたバイナリは、カレンダーのTCC権限を持つコンテキストから少なくとも一度実行する必要があります。ビルドとテストを実行してください:
bun run build
bin/calendar-reader list-events $(date +%Y-%m-%d)これでイベントが返されれば、バイナリはカレンダーへのアクセス権を持っています。そうでない場合は、Terminal.app(通常はカレンダーのTCC権限が付与されています)から実行してみてください。
イベントが空の場合
Appleカレンダーでカレンダーが設定されていることを確認してください。以下を実行してください:
bin/calendar-reader list-calendarsコンパイルに失敗する場合
Xcode Command Line Toolsがインストールされていることを確認してください:
xcode-select --installライセンス
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/Sealjay/mcp-ical-swift'
If you have feedback or need assistance with the MCP directory API, please join our Discord server