iCloud について
iCloudは、AIクライアントをiCloudメール、カレンダー、連絡先、リマインダー、メモ、Driveなどのサービスに接続するMCPサーバーです。ローカル実行とホスト運用に対応し、認証情報を運用者の管理下に置き、メール送信などには承認を重視した保護策を設けています。
主な機能
- 01メール、カレンダー、連絡先へのアクセス
- 02リマインダー、メモ、iCloud Driveの操作
- 03iMessage履歴の検索とApple Mapsの利用
- 04Apple Healthの睡眠・活動データの読み取り
- 05メール送信と招待に対する承認保護
- 06ローカル実行またはリモートクライアント向けホスト運用
活用シーン
- 01メールを探して返信案を作成する
- 02空き時間を確認して予定を作成・変更する
- 03iCloud Drive内のファイルを探して確認する
- 04メッセージや健康活動の履歴を振り返る
MCP 対応
iCloudのデータと操作機能をMCPクライアントに提供します。ローカル接続と、HTTPSおよびOAuthによるリモートMCPに対応しています。リマインダー、メモ、Drive、Maps、メッセージ、HealthにはMacヘルパーを利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx icloud-mcp-serverICLOUD_USERNAMEYour Apple Account email.ICLOUD_APP_PASSWORDシークレットAn app-specific password from account.apple.com (not your Apple password).ICLOUD_DISPLAY_NAMEName shown on mail you send.DEFAULT_TIMEZONEIANA timezone for calendar times, e.g. Europe/Berlin.SEND_REQUIRES_APPROVALtrue: mail Claude sends is saved to Drafts for you to send. false: sent directly.AGENT_NOTES_FILEPath to a file with your own rules for agents, added to the instructions.OWNER_ADDRESSESYour aliases, comma-separated, so invitations to them count as yours.WARMUP_ON_STARTSign in to mail, calendar and contacts in the background at start.TOOL_WORKERSTool calls that can run at the same time.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
50掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
今週の予定、受信トレイ、あるいは去年の春に保存したファイルについてAIに尋ねるだけで、答えがわかります。
iCloud MCPは、普段お使いのAppleアカウントにClaude、Codex、ChatGPT、その他のMCPクライアントを接続します。
お使いのコンピューター上で動作し、パスワードをその中に保管し、情報を外部に送信する前に確認を求めます。
話しかけるだけ。
"暖房について大家さんから来たメールを探して、丁寧な返信の下書きを作って。"
"来週、1時間空いているのはいつ?その時間にAnnaとランチを予約して。"
"木曜日の歯医者の予約を、同じ時間の金曜日に変更して。変更するのはその予約だけ。"
"来月の1日にパスポートを更新するようリマインドして。"
"iCloud Driveで確定申告書のPDFを探して、去年いくら払ったか教えて。"
"9時に駅に着きたい場合、自転車でどれくらいかかる?"
"今週末に届いたメッセージの概要を教えて。"
"今週の睡眠は、先月と比べてどうだった?"
プライバシーを第一に設計。
パスワードは手元に保管されます。
Appleでは、これらのサービスにアプリ用パスワード以外でサインインする方法はありません。
パスワードはお使いのコンピューター、またはMacのキーチェーンにのみ保存されます。AIが目にすることはありません。
許可なく情報が外部に送信されることはありません。
AIが作成したメールは、承認を待つか、下書きフォルダーに保存されます。
他の人への招待は無効になっており、削除した項目はゴミ箱に移動します。
見知らぬ人からのメールにも対応できるよう設計。
AIが読むすべての内容には、指示ではなく他人の言葉であることが明示されます。
隠し文字は取り除かれ、フィッシングの手口には注意が促されます。
重要な環境でテスト済み。
変更のたびに600件を超えるオフラインテストを実行します。他人のデータを読み取るすべてのパーサーのファジングテスト、実際のメールサーバーやカレンダーサーバーに対する統合テストに加え、
Appleのサーバー特有の挙動を確認するため、実際のiCloudアカウントで手動テストも行っています。
## 0.12 の新機能
| Apple Health iPhone から、睡眠とそのステージ、歩数、アクティビティ、1 日ごとの心拍数を取得できます。Health アプリから書き出したデータを使えば、全履歴も利用できます。 | あらゆる MCP クライアント Claude、Codex、ChatGPT、Cursor などに対応します。ChatGPT は追加設定なしでホスト型サーバーにサインインできます。 | わかりやすいツール名 すべてのツールが area_verb_noun 形式です。たとえば mail_send_message のように、どのエージェントでも適切なツールを選べます。TOOLS では従来の名前も引き続き使えます。 |
| 誤警告の削減 Outlook からのメールでは、非表示のテキストについて警告が表示されなくなりました。AI に向けられた非表示テキストには引き続き警告が表示され、何が隠されていたかを確認できます。 | Apple Maps 出発時刻または到着時刻を指定して、自転車、車、徒歩、公共交通機関での所要時間を調べたり、場所を検索したりできます。カレンダーの移動時間にも使用できます。 | メッセージ iMessage と SMS の履歴を読み取り、検索できます。送信はデフォルトで無効になっており、有効にした場合も、承認と許可リストの設定が必要です。 |
| メニューバーアプリ サーバーの状態をひと目で確認し、一時停止や再起動、認証情報の変更、接続済みアプリのサインアウトができます。 | 一時停止 スイッチひとつで、誰の接続も切断せずに、サーバーが一時停止中であることをすべてのツールが応答します。 | より安全に 招待用許可リスト、件名と名前のスクリーニング、独自の分類器に対応し、他者のデータを読み取るすべてのパーサーにファジングを実施しています。 |
0.9〜0.11:Maps、Messages、メニューバーアプリと一時停止、下書きとフォルダ、カレンダーと連絡先グループ、機能が強化されたReminders。0.6〜0.8:カレンダーが約3倍高速に、メールの負荷を軽減、初回呼び出しが即時に、独自のルールファイル、返信待ち、予定の競合チェック、強化された繰り返し予定ガード。0.4 以降:取り消し可能な一括整理、安全な配信停止、正確な予約、メモの編集、Drive ファイル内の検索、誕生日、Shortcuts。0.3:ワンクリックで導入できるClaude Desktop拡張機能、ローカルモード、Keychain ストレージ、空き時間、出欠確認、詐欺警告。
Mail、Calendar、Contacts は Apple の標準プロトコルを使用します。
Reminders、Notes、iCloud Drive、Maps、Messages、Health は Mac 上のオプションのヘルパー経由で利用できます。
ヘルパーは外向きに接続するため、Mac でポートを開く必要はありません。
| このコンピューター上の任意のクライアント | Claude Desktop、ワンクリック | 独自のサーバー | |
|---|---|---|---|
| セットアップ | 1 つのコマンド、または数行の設定 | 拡張機能をダブルクリック | Docker と HTTPS アドレス |
| 対応環境 | Claude Code、Codex、Claude Desktop、Cursor、VS Code など、このコンピューター上の任意の MCP クライアント | このコンピューター上の Claude Desktop | Web、デスクトップ、スマートフォン上の Claude と ChatGPT、Codex、およびリモート MCP サーバーに対応する任意のクライアント |
| 送信メール | 送信できるように下書きに保存されます | 送信できるように下書きに保存されます | ブラウザーでの承認を待ちます |
| ガイド | セットアップ › | インストール › | クイックスタート › |
Claude(Web、デスクトップ、スマートフォン、Claude Code、Desktop 拡張機能)および、サーバーをローカルで実行する Codex CLI でテスト済みです。MCP に対応するクライアントなら、どれでも同じように動作します。ローカルではクライアントがサーバーを起動し、ホスト環境では OAuth でサインインします。
ローカルで実行する
サーバーはご自身のコンピューター上で動作します。必要なときにクライアントが起動し、サーバーと直接通信するため、公開アドレス、トンネル、Docker、OAuth は不要です。Web 上のアプリやスマートフォンからはアクセスできません。その場合はホストしてください。
Claude Desktop にワンクリックでインストール
- 最新のリリースから
icloud-mcp-<version>.mcpbをダウンロードします。 - ダブルクリックするか、Claude Desktop → Settings → Extensions にドラッグします。
- Apple Account のメールアドレス、App 用パスワード(Claude Desktop がシステムのキーチェーンに保存します)、名前、タイムゾーン(
Europe/Amsterdamなど)を入力します。
最初は承認が必要な設定で起動します。メールは送信できるように下書きに保存され、ほかの人への招待は無効になっています。これにより、メール、カレンダー、連絡先が利用できます。リマインダー、メモ、iCloud Drive には、Mac ヘルパーと以下の手動セットアップが必要です。
手動セットアップ(任意の MCP クライアント)
1. 自分だけが読み取れるファイルに設定を保存します。
mkdir -p ~/.icloud-mcp && chmod 700 ~/.icloud-mcp
cat > ~/.icloud-mcp/icloud.env <<'END'
[email protected]
ICLOUD_DISPLAY_NAME=Your Name
DEFAULT_TIMEZONE=Europe/Berlin
END
chmod 600 ~/.icloud-mcp/icloud.env
2. パスワードはキーチェーンに保存します(Mac の場合)。アプリ用パスワードの入力を求められ、コマンドラインには表示されません。
uvx icloud-mcp-server --store-password
Mac をお使いでない場合は、代わりにファイルに ICLOUD_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx を追加してください。設定の項目はどれでも追加できますが、MCP_PUBLIC_URL と MCP_OWNER_PASSWORD は必要ありません。
3. クライアントに追加します(uv が必要です)。
Claude Code:
claude mcp add icloud -- uvx icloud-mcp-server --local --env-file ~/.icloud-mcp/icloud.env
Codex:
codex mcp add icloud -- uvx icloud-mcp-server --local --env-file ~/.icloud-mcp/icloud.env
Claude Desktop:Settings → Developer → Edit Config を開き、claude_desktop_config.json に次の内容を追加して、Claude を再起動します。Cursor(~/.cursor/mcp.json)、VS Code、Windsurf、Gemini CLI など、ほとんどのクライアントでは、各自の MCP 設定に同じ command と args を指定します。
{
"mcpServers": {
"icloud": {
"command": "uvx",
"args": ["icloud-mcp-server", "--local", "--env-file", "/Users/YOU/.icloud-mcp/icloud.env"]
}
}
}
クライアントが uvx を見つけられない場合は、フルパス(which uvx)を指定してください。uv を使わない場合は、pip install icloud-mcp-server を実行し、コマンドとして icloud-mcp を指定します。
ヒント
ツールを絞ると、より適切に選べます。 クライアントは、短いリストからのほうが適切なツールをより確実に選択できます。
TOOLS=essentialを追加すると、基本の 19 個に絞れます。メールの検索、読み取り、返信、イベントの一覧表示、空き時間の検索、イベントの作成や更新、連絡先の検索、リマインダー、メモ、Drive の主要なツール、ヘルスチェックが含まれます。必要に応じて、たとえばTOOLS=essential,mail_move_messagesのようにツール名を指定して追加するか、領域全体を指定します。例:TOOLS=mail、TOOLS=mail,calendar(ほかにcontacts、reminders、notes、drive、maps、imessage、healthがあります。ヘルスチェックは常に有効です)。
ローカルでの送信方法。 承認ページはありません。そのため、デフォルトの SEND_REQUIRES_APPROVAL=true では、AI が送信するすべてのメッセージが代わりに 下書き フォルダへ保存され、その旨が結果に表示されます。Mail で内容を確認し、自分で送信します。直接送信できるようにするには、SEND_REQUIRES_APPROVAL=false に設定します。その場合、確認手段はクライアント独自の承認プロンプトのみです。
ローカルでのリマインダー、メモ、iCloud Drive。 環境設定ファイルに ENABLE_REMINDERS=true(および/または ENABLE_NOTES、ENABLE_DRIVE)と BRIDGE_TOKEN を追加し、クライアントを一度起動してから、Mac ヘルパーをインストールします。サーバーには https://127.0.0.1:8001 を、フィンガープリントには ~/.icloud-mcp/bridge_fingerprint.txt の値を指定してください。ローカルモードでは、ブリッジは 127.0.0.1 でのみ待ち受けます。2 つのクライアントが同時にサーバーを起動した場合、Mac ツールを利用できるのは先に起動したクライアントのみです。Mail、Calendar、Contacts はどちらでも利用できます。
クイックスタート
一度ホストすれば、Claude、ChatGPT、Codex など、リモート MCP サーバーに対応するあらゆるクライアントから、ウェブ、デスクトップアプリ、スマートフォンを通じて AI があなたの iCloud にアクセスできます。
必要なもの
- compose プラグインを備えた Docker(または Python 3.11 以降)。
- 2 要素認証を有効にした Apple Account と、App 用パスワード(account.apple.com → サインインとセキュリティ → App 用パスワード)。
- 公開された HTTPS アドレス。ウェブアプリとスマートフォンアプリはプロバイダーのクラウドから接続するため、LAN アドレスや VPN アドレスは使えません。Cloudflare Tunnel が最も簡単です。外向きの接続のみで、ポートフォワーディングは不要です。
- OAuth を使ってリモート MCP サーバーを追加できるクライアント。たとえば Claude(カスタムコネクタ)、ChatGPT(開発者モード)、Codex です。
警告
サーバーの前に Cloudflare Access などのログイン画面を設置しないでください。クライアントのサーバーは対話型ログインを完了できず、サーバーには独自の OAuth があります。
1. 設定する
git clone https://github.com/epinethrone/icloud-mcp.git && cd icloud-mcp
cp .env.example .env # fill in ICLOUD_USERNAME, ICLOUD_APP_PASSWORD, ICLOUD_DISPLAY_NAME,
# MCP_PUBLIC_URL (your https address, no trailing slash), MCP_OWNER_PASSWORD
chmod 600 .env
MCP_OWNER_PASSWORD は、クライアントの承認時と送信トレイのページであなた自身が入力する、新しいランダムなパスワード(12 文字以上)です。Apple のパスワードではありません。必要であれば、./configure.sh のサイレントプロンプトでシークレットを入力できます。
2. 外部に公開する前に、実際の iCloud で認証情報を確認する
docker build -t icloud-mcp:local .
docker run --rm --env-file .env icloud-mcp:local python -m icloud_mcp.selftest # logs in to IMAP, SMTP, CalDAV, CardDAV; sends nothing
docker run --rm --env-file .env icloud-mcp:local python -m icloud_mcp.selftest --probe-sent [email protected] # sends ONE test mail
ログインに失敗する場合は、通常、ログイン名が原因です。IMAP_USERNAME、SMTP_USERNAME、CALDAV_USERNAME、CARDDAV_USERNAME をそれぞれ個別に設定してください。
3. 起動する
docker compose up -d --build # listens on 127.0.0.1:8000 only
同梱の Cloudflare Tunnel を使う場合は、トンネルを作成し、その公開ホスト名(MCP_PUBLIC_URL のホスト部分)を http://icloud-mcp:8000 に向け、トークンを .tunnel.env に TUNNEL_TOKEN=... として設定してから、docker compose --profile tunnel up -d --build で起動します。Host ヘッダーを維持する限り、Caddy や nginx などの TLS フロントエンドも使えます。MCP_PUBLIC_URL は公開アドレスと完全に一致させる必要があります。
4. クライアントを接続する
リモート MCP サーバーとして https://<your-host>/mcp を追加します。するとサーバーに承認ページが表示されます。所有者のパスワードを入力してください。
- Claude: Settings → Connectors → Add custom connector。
- ChatGPT: Settings → Apps & Connectors → Advanced → 開発者モードを有効にし、OAuth を使うコネクタを作成します(開発者モードを利用できるプランが必要です)。
- Codex:
codex mcp add icloud --url https://<your-host>/mcpを実行し、次にcodex mcp login icloudを実行します。 - その他: OAuth を使うリモート(ストリーミング可能な HTTP)MCP サーバーに対応するクライアント。サインイン後に別のホストへ戻るウェブクライアントの場合は、そのホストを
OAUTH_ALLOWED_REDIRECT_HOSTSに追加する必要があります。
ツールや設定を変更した場合は、クライアントがツール定義をキャッシュするため、再接続してください。メニューバーアプリから、接続済みのクライアントを 1 つ、またはすべてサインアウトできます。アプリがない場合は、データボリューム内の oauth_state.json を削除して再起動すると、すべてのクライアントのアクセスを取り消せます。
5. 動作を確認する
新しいチャットで 「iCloud 接続を確認して」 と尋ねます。AI が icloud_check_health を実行し、各サービスにサインインして、所要時間を報告します。次に 「今週のカレンダーには何がある?」 と尋ね、メールを送るよう依頼してみてください。デフォルト設定では何も送信されません。メッセージは、承認するまで https://<your-host>/dashboard/approvals に保留されます。問題が起きた場合は、トラブルシューティングを参照してください。
送信メールの承認
デフォルトの SEND_REQUIRES_APPROVAL=true では、mail_send_message、mail_reply_to_message、mail_forward_message は queued_for_owner_approval を返し、メールは送信されません。https://<your-host>/dashboard/approvals を開き(ブックマークしておき、ここでのみサインインしてください。エージェントから渡されたリンクではサインインしないでください)、宛先と本文の内容を正確に確認してから、承認または破棄します。キューに入ったメッセージは OUTBOX_TTL_SECONDS(デフォルトでは 24 時間)後に期限切れとなり、送信されるのは最大 1 回です。以前からある https://<your-host>/outbox ページも引き続き使えますが、アクセスのたびに所有者のパスワードを求められます。
ダッシュボード
https://<your-host>/dashboard は、サーバーの状況を確認する場所です。承認待ちの項目、エージェントが変更した内容、接続中のアプリ、メール、カレンダー、連絡先が応答するかどうかを確認できます。スマートフォンではタブバー、コンピューターではサイドバーで表示され、ライトモードとダークモードに対応しています。
- パスキーでサインインします。 最初にオーナーパスワードでサインインし、次に「セキュリティ」でパスキーを追加します。それ以降は、Face ID、Touch ID、またはセキュリティキーを使えます。パスキーはサーバー自体のアドレスでのみ機能するため、よく似たページでは使用できません。パスキーを追加すると、
OWNER_PASSWORD_LOGIN=falseに設定してパスワードでのサインインを無効にできます。パスキーにはオプションのwebauthnパッケージが必要です(pip install "icloud-mcp-server[passkey]")。Docker イメージには含まれています。 - アクティビティ。 エージェントによる書き込み(メールの移動、イベントの変更、連絡先の編集)、すべての承認と破棄、サインインと失敗した試行、接続またはサインアウトしたすべてのアプリが、
DATA_DIR/audit.jsonlに記録されます。名前、アドレス、件名は記録されますが、メッセージ本文、パスワード、トークンは記録されません。各エントリーには直前のエントリーのハッシュが含まれ、アクティビティページでファイルが後から変更されたかどうかを確認できます。エントリーはAUDIT_KEEP_DAYS(90)日間保持されます。AUDIT_LOG=falseで無効にできます。 - カレンダーの招待も承認待ちにできます。
ALLOW_CALENDAR_INVITES=approveに設定すると、iCloud からほかの人にメールが送信されるカレンダーの変更(ゲストを含むイベントの作成、変更、キャンセル、または招待への返信)は書き込まれず、「承認」ページに保留されます。承認すると、表示されていた内容がそのまま書き込まれます。ただし、イベントがその後変更されていない場合に限ります。変更されていた場合は何も書き込まれず、その旨がページに表示されます。イベントを別のカレンダーに移動してもメールは送信されず、承認待ちにもなりません。 - 設定。 サーバーのすべての動作は「設定」で変更できます。対象領域とツール、メールの送信方法、招待、連絡先、Mac ヘルパー、読み取り専用モード、ダッシュボード自体を設定できます。環境変数から取得した値はフィールドにその旨が表示され、ここで設定した値は「リセット」ボタンとともに一覧表示されます。変更は
DATA_DIR/settings.jsonに保存され、環境変数の設定より優先されます。再起動後に適用されます(ボタンは 1 つです)。新しい値で起動できることをサーバーが確認してから保存します。また、保護を弱める変更では、再度サインインするよう求められます。サーバーのリッスン先、アプリのサインイン方法、接続先は環境変数で設定し、ここでは表示のみされます。DASHBOARD_SETTINGS=viewにすると設定を変更せずに表示でき、offにするとsettings.jsonを無視します。 - リアルタイム対応で、インストールも可能です。 「概要」または「承認」ページを開いていると、リロードしなくても 15 秒以内に新しいリクエストが表示されます。「送信」と「破棄」はその場で実行できます。「概要」でリクエストを開き、その行で承認できます。また、破棄は 5 秒以内なら取り消せます。新着情報の確認は利用状況に数えられないため、タブを開いたままでも
DASHBOARD_SESSION_MINUTESを過ぎるとサインアウトされます。Chrome と Edge、または Safari の「ホーム画面に追加」では、ダッシュボードをアプリとしてインストールできます。サービスワーカーは何もキャッシュしないため、メールがブラウザーに保存されることはありません。 - セッション。 サインインは、
DASHBOARD_SESSION_MINUTES(30)分間操作がない場合、または最長 12 時間で終了します。サインインから 5 分以上経過している場合、パスキーの削除、パスワードの変更、アプリからのサインアウトには確認が必要です。 - サインインの失敗記録は読みやすく保たれ、パスキーでのサインインも妨げられません。 ロックによって保留されたサインインの失敗は、その後に何も起きなくても、10 分間の期間が終わると 1 行の要約として記録されます。そのため、アクティビティログに集中した試行がすべて記録されても、ログが埋め尽くされることはありません。サインインチケットにはプロセスごとのキーで署名し、保存はしません。また、チケットはパスキーでのサインインが成功した後にのみ使用済みになります。そのため、チャレンジが大量に発生しても、何かが埋まったり、オーナーのパスキーでのサインインが妨げられたりすることはありません。サーバーを再起動すると未使用のサインインチケットは無効になり、オーナーは再度サインインするだけです。
セキュリティ
メールを読んであなたに代わって操作できるコネクターは、プロンプトインジェクションの標的になります。悪意のあるメールや招待状には、エージェントを誘導しようとするテキストが含まれていることがあります。サーバーはそのようなコンテンツすべてに信頼できない情報のラベルを付け、エージェントにはデータとして扱うよう指示しますが、これは言語モデルへの依頼であり、保証ではありません。実際にあなたを守るのは設定です。
| リスク | デフォルト | 設定 |
|---|---|---|
| インジェクションされた指示に従ってエージェントがメールを送信する | 送信時は、あなたが /dashboard/approvals で承認するまでメッセージがキューに登録されます(DASHBOARD=false の場合は /outbox。ローカルでは下書きに保存されます) | SEND_REQUIRES_APPROVAL=true |
| エージェントが知らない相手に招待状をメールする | 参加者の変更はブロックされます | ALLOW_CALENDAR_INVITES=false |
| 招待が有効なとき、エージェントが誤った相手を招待する | 任意のアドレス。ゲストは最大10人 | INVITE_ALLOWLIST、MAX_ATTENDEES |
| エージェントが実在する連絡先に知らない相手のアドレスを登録し、その後の返信がそこに届く | 許可されますが、結果と承認ページで、エージェントが追加したアドレスとして表示されます | ブロックするには CONTACTS_ALLOW_EMAIL_CHANGES=false |
| 今日の作業なのにエージェントが何年分ものアーカイブを読む | メールボックス全体 | MAIL_MAX_AGE_DAYS |
| 悪意のあるテキストが検出されない | 組み込みパターン(英語とオランダ語)に加え、HTML メール内で隠されたテキストを削除します(指示のように見える場合は警告されます。show_hidden で確認できます) | SAFETY_SCREEN=command:<path> を指定すると、独自の分類器を追加できます |
| エージェントが任意のアドレスにメールする | 任意のアドレス。1通あたり最大25人 | SEND_ALLOWLIST、MAX_RECIPIENTS |
| エージェントがメールを破棄する | 削除するとゴミ箱に移動します。ゴミ箱からの削除は無効です | ALLOW_PERMANENT_DELETE=false |
| エージェントがメモやファイルを破棄する | メモは「最近削除した項目」に、Drive のファイルはゴミ箱に移動します。リマインダーにはゴミ箱がないため、削除すると元に戻せません(1行なので簡単に作り直せます)。リマインダーをリスト間で移動しても削除されません | 常に有効 |
| インジェクションされた指示に従ってエージェントが人にテキストメッセージを送る | iMessage の送信は無効です。有効にした場合、すべてのメッセージで承認が必要です。許可リストに載った相手(空の場合は誰も対象になりません)にのみ送信でき、送信禁止リストに登録されたハンドルには送信できません | IMESSAGE_ALLOW_SEND=false、IMESSAGE_SEND_ALLOWLIST、IMESSAGE_NEVER_SEND |
| エージェントが Messages から認証コードを読む | Messages は無効です。有効にした場合、銀行やワンタイムコードの送信元は非表示になり、チャットを非表示にしたり、許可したりできます | ENABLE_IMESSAGE=false、IMESSAGE_HIDE_SHORT_CODES=true、IMESSAGE_HIDDEN_CHATS |
| エージェントがあらゆるものを変更する | 書き込み可能なすべてのもの | 読み取り専用のコネクターにするには READ_ONLY=true |
ほとんどのクライアントでは、ツールの実行前に確認を求める設定もできます(Claude ではツールごとに「使用前に確認」)。送信、返信、転送、削除のツールで有効にしてください。アプリ用パスワードを入手した人は、メール、カレンダー、連絡先に完全にアクセスできます(Apple はそれより限定されたアクセス範囲を提供していません)。そのため、サーバーとその .env を適切に保護してください。
セキュリティモデルの詳細
- iCloud の認証情報は、サーバー環境または macOS Keychain にのみ存在します。クライアントが保持するのは、このサーバー用の短期間有効なベアラートークンです。 - クライアントは動的に登録できますが、オーナーのパスワードなしでは何も許可されません。リダイレクト先のホストは制限されています。トークンは SHA-256 ハッシュとして保存されます(ファイルモード 600)。承認ページと送信トレイのページは、15 分以内にパスワードを 10 回間違えるとロックされます(サーバー全体に適用されます。既存のトークンは引き続き使用できます)。ロックされるのはパスワードのみです。ダッシュボードのパスキーでは引き続きサインインできるため、ほかの人がパスワードを間違えてもオーナーが締め出されることはありません。ロック中に保留されたサインイン失敗は、時間枠の終了時に 1 件の概要として記録されます。また、サインインチケットはプロセスごとの鍵で署名され、パスキーによるサインインが成功した場合にのみ使用済みとして扱われ、再起動すると無効になります。そのため、大量のリクエストも偽造チケットも、オーナーのパスキーによるサインインを妨げることはできません。 - 拒否されたサインイン更新はすべて、その理由(すでにローテーション済み、有効期限切れ、クライアント不一致、未認識)とともに記録されます。トークン値は記録されません。また、認証されていない呼び出し元はログを大量に書き込めません。`docker compose logs icloud-mcp | grep 'oauth:'` - メール、イベント、メモ、ファイルのテキストから、見えない誘導文字(Unicode のタグ文字、ゼロ幅スペース、方向上書き文字)が除去されます(クルド語、ペルシア語、アラビア語のテキストに必要なマークは保持されます)。また、テキストが AI に向けて指示している場合、パスワードやコードを求めている場合、または銀行口座情報が変更されたと述べている場合、結果には `safety_warnings` が含まれます(英語とオランダ語に対応)。 - すべてのツールエラーは、エージェントに届く前にサニタイズされます。パスワードとトークンはマスクされ、URL はホスト部分までに切り詰められます(iCloud DAV パスにはアカウント ID が含まれます)。見えない文字も除去されます。サーバーの応答を引用することがあるヘルスチェックエラーや予期しないエラーからは、アカウントアドレスと長い数字も除去されます。 - MCP エンドポイントは `Host` と `Origin` を検証します。ツールの結果には、信頼できないコンテンツに関する注意書きが含まれます。HTTP クライアントのリクエストログは無効化されており、アカウント識別子がログに記録されることはありません。 - Mac ブリッジは専用のプライベート TLS ポートで動作し、ヘルパーがフィンガープリントでピン留めする自己署名証明書とベアラートークンを使用します。パブリックアドレスやトンネル経由で提供されることはありません。サーバーが送信するのは、固定リストから選択された操作名と検証済みの引数のみで、スクリプトテキストは送信しません。 - メニューバーアプリ用の管理 API は、`ADMIN_PORT` が設定されていない限り無効です。127.0.0.1 のみで専用ポートを使って待ち受けます(パブリックポートやトンネルは使用しません)。すべてのリクエストで `DATA_DIR/admin-token` のトークンが必要です(モード 600)。ブラウザーからのリクエストと、ループバック以外の `Host` ヘッダーは拒否されます。 - 設計上、オーナーは 1 人です。1 つのデプロイメントで扱う iCloud アカウントは 1 つです。マルチテナントではなく、ほかの人のアプリ用パスワードを保存することは意図的に対象外としています。ツール
92 個のツール。 Mail、Calendar、Contacts、時計、ヘルスチェック用が 50 個、オプションの Mac ヘルパーを追加すると 40 個、許可リストに登録した Shortcuts 用が 2 個です。詳細は各セクションを開いてください。
各ツール名は area_verb_noun 形式です(mail_send_message、calendar_create_event)。この形式に合わせるため、0.7.0 で 11 個、0.12.0 で 36 個のツール名(mail_send のように名詞を含まない動詞形式)が変更されました。TOOLS では引き続き旧名を使用でき、ログには新しい名前が記録されます。
メール · 25 個のツール
| 種類 | ツール | |---|---| | 読み取り | `mail_list_folders`、`mail_search_messages`、`mail_list_changes`、`mail_find_correspondent`、`mail_get_message`、`mail_get_messages`(1 回の呼び出しにつき最大 25 件)、`mail_get_thread`、`mail_get_attachment`、`mail_extract_bookings` | | 読み取り | `mail_list_senders`(フォルダー内の送信者を、送信数の多い順に表示し、一括操作と配信停止の情報も含む)、`mail_list_awaiting_reply`(返信がない送信済みメール) | | 書き込み | `mail_send_message`、`mail_reply_to_message`(全員に返信を含む)、`mail_forward_message`、`mail_mark_messages`、`mail_move_messages`、`mail_delete_messages`(ゴミ箱へ移動)、`mail_send_draft`(保存済みの下書きをそのまま送信)、`mail_update_draft`、`mail_create_folder`、`mail_update_folder`(名前を変更)、`mail_delete_folder`(フォルダー内のメールは先にゴミ箱へ移動)、`mail_run_bulk_action`、`mail_undo_bulk_action`、`mail_unsubscribe_from_list` | - 返信では、件名の `Re:`、`In-Reply-To` と `References`、適切な宛先、引用元の本文をプレーンテキストと HTML の両方で保持します。送信済みメールは「送信済み」にコピーされ、元のメールには「返信済み」のフラグが付けられます(転送の場合は `$Forwarded` が付きます)。`draft=true` を指定すると、送信せず「下書き」に保存します。 - `mail_get_messages` は、1 回の IMAP 往復で複数のメール(1 日分の未読メールやスレッド全体など)を読み込みます。1 件ずつ読み込む場合より約 7 倍高速です。 - **すべてのフォルダーを一度に検索します。** `mail_search_messages` に `all_folders=true` を指定すると、アーカイブ、送信済み、迷惑メール、自分で作成したフォルダーも含めて新しい順に検索します。メールルールや返信によって、メッセージが受信トレイから移動されている場合があるためです。 - **ニュースレターと個人からのメールを見分けます。** 検索結果では、`bulk` メール(List-Unsubscribe または List-Id ヘッダーがあるメール、一括送信として優先されるメール、自動送信元や no-reply の送信元)に印を付け、購読解除の方法を示します。`mail_list_senders` はフォルダー内のメールを送信者ごとにまとめます。 - **安全にまとめて整理できます。** `mail_run_bulk_action`(移動、アーカイブ、ゴミ箱への移動、既読にする)は必ず最初にプレビューを表示します。プレビューには件数、サンプル、対象のメッセージだけを示す確認トークンが含まれます。実行にはそのトークンが必要なため、後から届いたメールが処理されることはありません。実行内容はすべて Message-ID ごとに記録され、`mail_undo_bulk_action` で 30 日以内なら元に戻せます。フィルターを少なくとも 1 つ指定する必要があり、完全に削除されることはありません。 - **リンクを開かずに購読を解除できます。** `mail_unsubscribe_from_list` は List-Unsubscribe ヘッダーのみを使用します。標準のワンクリックリクエスト(RFC 8058。HTTPS の場合はパブリックアドレスのみ)を送信するか、通常の送信経路で購読解除メールを送信するため、承認ルールが適用されます。本文中のリンクは開かず、購読解除用ウェブページはユーザーに渡すだけです。また、迷惑メール内のメールに対する購読解除は拒否されます。 - **予約情報を正確に取り出します。** `mail_extract_bookings` は、航空会社、ホテル、鉄道会社、チケット販売サイトが埋め込む schema.org の予約データ(フライト、宿泊、列車、バス、レンタカー、レストラン、イベント)と `.ics` 招待状を読み込み、それぞれに `calendar_create_event` 用のブロックを添えて返します。文面から推測することはなく、該当データがないメッセージはその旨を示します。 - **変更された項目だけを取得します。** `mail_list_changes` はトークンを返します。次回そのトークンを渡すと、フォルダーを再読み込みする代わりに IMAP CONDSTORE を使い、新着メッセージと既読、フラグ付き、返信済みの状態が変わったメッセージだけを一覧表示します。iCloud によってフォルダーの番号が振り直されていた場合は、推測せず最初からやり直すよう案内します。 - **誰が誰の返信を待っているか。** `mail_list_awaiting_reply` は、あなたが相手に送信したメールのうち、返信も、その後の相手からのメールもないものを、フォルダーを問わず待機時間の長い順に一覧表示します。`mail_search_messages` では `people_only`(ニュースレターを除外)、`unanswered_only`、`since_hours` を指定できます。 - **レイアウトをチェックし、書き換えることはありません。** 送信結果と下書き結果には、プレーンテキストの本文に HTML タグが含まれている場合、Windows の改行コードが使われている場合、または 1 段落が長すぎる場合に `layout_warnings` が付与されます。 - **古い ID は拒否されます。** 各メッセージにはフォルダーの `uidvalidity` が付与されます。UID を使うツールは、その値を受け取って検証し、その後 iCloud によってフォルダーの番号が振り直されていた場合は、別のメッセージに誤って作用しないよう処理を拒否します。 - メッセージを読んでも既読にはなりません。Bcc の宛先にはメールが届きますが、送信時にヘッダーは削除されます。 - 宛先には `[email protected]`、`Name `、`mailto:[email protected]` を指定できます。それ以外は明確なエラーとともに拒否され、黙って無視されることはありません。カレンダー · 12 個のツール
calendar_list_calendars、calendar_list_events、calendar_find_free_time、calendar_get_event、calendar_create_event、calendar_update_event、calendar_move_event、calendar_delete_event、calendar_respond_to_event、calendar_create_calendar、calendar_update_calendar(名前の変更)、calendar_delete_calendar
- 複数のカレンダー、一覧表示時に展開される繰り返しイベント、終日イベント、アラート、リンク、メモ、参加者に対応しています。繰り返しイベントを編集または削除するとシリーズ全体が変更されますが、
occurrence_startを渡すと該当する日付だけが変更されます(シリーズの残りには影響しません)。 - 空き時間を探すには1回の呼び出しで済みます。
calendar_find_free_timeは、指定した時間の長さ、勤務時間、選択した曜日に基づいて空き時間を返します。移動時間は予定ありとして扱われます。「空き」とマークされたイベント、キャンセル済みのイベント、辞退した招待は対象外です。終日イベントは推測で扱わず、別に一覧表示されます。 - 招待が送信されたか確認できます。 招待した後、結果には各ゲストについてiCloudが記録した状態(送信済み、配信済み、またはアドレスの入力間違いなどによる拒否)が報告されるため、エージェントが実際には招待していない相手を招待したと主張することはありません。
- カレンダーを管理できます。 カレンダーの作成、名前の変更、削除ができます。デフォルトのカレンダーは削除されません。イベントが登録されているカレンダーを削除するには、プレビュー後に確認トークンが必要です。削除したカレンダーは、iCloud.comで約30日間復元できます(この方法で設定した色はiCloudに無視されるため、色のオプションはありません)。
- カレンダー間で移動できます。
calendar_move_eventはWebDAV MOVEを使ってイベントを別のカレンダーに移動します(繰り返しの場合はシリーズ全体)。イベントは再作成されず、ゲストにも新しい招待は送信されません。MOVEに対応していないサーバーでは、先にコピーを作成し、その後でのみ元のイベントを削除します。 - 競合や重複が報告されます。
calendar_create_eventは、新しいイベントと重なるイベント(conflicts。両方の移動時間を含み、「空き」のイベント、キャンセル済みのイベント、辞退済みのイベントは対象外)と、同じタイトルおよび時間のpossible_duplicateを返します。on_conflict/on_duplicate=refuseを指定すると、イベントは作成されません。 - 返信待ちの招待。
calendar_list_events(needs_reply=true)は、まだ回答していない招待を一覧表示します(すべてのメールアドレス宛ての招待が対象です。別名をOWNER_ADDRESSESに追加してください)。starting_within_minutesを指定すると、現在からの時間を基準に検索します。 - 招待に回答できます。
calendar_respond_to_eventは、シリーズ全体または1日分について、承諾、辞退、仮承諾を設定します。主催者へのメールはiCloudが自動送信します。 - 安全に再試行できます。
calendar_create_eventとcontacts_create_contactでは、任意のrequest_idを指定できます。呼び出しがタイムアウトし、同じIDで再試行すると、重複を作成せず、最初の試行結果が見つかります。 - Appleの移動時間と地図上の場所に対応しています。 イベントにはAppleの移動時間(自転車、徒歩、自動車、公共交通機関)と、構造化された目的地を設定できます。これにより、Appleが地図カードを表示できます。
- ゲストを追加しても、ほかの人には影響しません。
add_attendeesとremove_attendeesは1人の参加者を変更します。ゲストリスト全体を指定した場合は置き換えではなく統合されるため、既存のゲストの出欠回答は維持され、招待も再送信されません。招待メールはiCloud自体が送信し、許可しない限り無効です。
連絡先 · 11個のツール
contacts_search_contacts、contacts_get_contact、contacts_list_birthdays、contacts_create_contact、contacts_update_contact、contacts_delete_contact、contacts_list_groups、contacts_get_group、contacts_create_group、contacts_update_group(名前の変更、メンバーの追加または削除)、contacts_delete_group(グループのみ。メンバーは削除されません)
- 連絡先は全件取得してキャッシュされ、アクセント記号を無視して、名前、ニックネーム、会社名、メールアドレス、電話番号でローカル検索できます。メールアドレスのない連絡先は
has_email: falseを返すため、エージェントは推測せずに確認します。 - 名前の入力ミスにも対応します。
contacts_search_contactsは完全一致するものがない場合、響きの似た名前を候補として提示します。また、mail_find_correspondentはメッセージのヘッダーのみを読み取り、おおよその名前、アドレス、会社名から、メールを送ったことのある相手を見つけます。おおよその一致にはその旨が表示され、エージェントはその相手に送信、招待、編集を行う前に、必ず確認を求めます。 - 住所は、Appleの連絡先アプリが想定する形式で保存され、番地、市区町村、都道府県、郵便番号、国として読み書きできます。自宅、勤務先、または独自のラベル(「別荘」など)も指定できます。
- 近日中の誕生日。
contacts_list_birthdaysは誕生日が近い順に一覧表示し、年がわかる場合は年齢も算出します(Appleの「年不明」を示す1604年にも対応し、うるう年以外の2月29日は2月28日になります)。 - 更新では、変更対象以外のすべてのフィールドを保持し、ETagを使って古い情報での上書きを拒否します。
add_emailsとadd_phonesは、既存の住所やそのラベルに触れずに、カードへ追加します。連絡先の写真とメモは返されません。
リマインダー · 10個のツール、Macヘルパー付き
reminders_list_lists、reminders_list_reminders、reminders_create_reminder、reminders_update_reminder、reminders_complete_reminder、reminders_move_reminder(同じリマインダーを別のリストに移動します。削除はされません)、reminders_delete_reminder(リマインダーには「最近削除した項目」がないため、削除すると元に戻せません)、reminders_create_list、reminders_update_list(名前を変更)、reminders_delete_list(リスト内のすべての項目も削除。プレビューとそのトークンによる確認後のみ)
- AppleのEventKitを通じて実行されます。リストの長さに関係なく、読み取りは常に最新のデータを取得し、約20~40ミリ秒かかります。デフォルトでは未完了のリマインダーを対象とします。
completed="only"を指定すると、期間内に完了した項目と完了日時を一覧表示します。 - 繰り返しリマインダー(
repeat。毎日以上の間隔に対応:FREQ=WEEKLY;BYDAY=MO、FREQ=MONTHLY;BYMONTHDAY=1;COUNT=12)と追加の通知(alerts_minutes_before、alerts_at)に対応します。通知を変更しても、期限時刻そのものに設定された通知は保持されます。 - リスト名はアカウント間で重複する場合があるため、ツールは
list_idを受け取り、名前が曖昧な場合は処理を拒否します。期限日は実在する日付か検証されます(日付のみを指定した場合は、現地時間の09:00になります)。
メモ · 9個のツール、Macヘルパー付き
notes_list_folders、notes_list_notes、notes_read_note、notes_create_note、notes_append_to_note、notes_update_note、notes_create_folder、notes_move_note、notes_delete_note
- 読み取り、作成、編集、整理ができます。メモへの追記(
notes_append_to_note。見出し、リスト、書式を保持します。表を含むメモは拒否されます)や、書き換え(notes_update_note。タイトルを保持します)、フォルダーやサブフォルダーの作成、メモの移動が可能です。 - 編集は保護されています。
notes_read_noteはcontent_hashを返します。追記と更新には、現在のタイトルとともにこの値が必要なため、読み取り後に変更されたメモが上書きされることはありません。ロックされたメモ、添付ファイル付きのメモ、「最近削除した項目」にあるメモは処理を拒否します。また、書き込み前に旧バージョンを~/Library/Application Support/icloud-mac-helper/note-backups/に保存します。 - 移動と削除は一度に1件のメモに対して行われ、IDに加えて現在のタイトルも必要です。そのため、古いIDや誤ったIDを指定しても何も変更されません。
- 削除すると、メモは最近削除した項目に移動し、約30日間は復元できます。ロックされたメモや、すでに「最近削除した項目」にあるメモは処理を拒否します。そこから削除すると完全に消えてしまうためです。「最近削除した項目」に移動する操作が行われることはありません。
iCloud Drive · 10個のツール、Macヘルパー付き
`drive_list_folder`, `drive_search_files`, `drive_search_content`, `drive_get_info`, `drive_read_file`, `drive_get_file`, `drive_write_file`, `drive_create_folder`, `drive_move_item`, `drive_trash_item`- Mac が同期を維持するため、iCloud Drive 全体で動作し、変更はすべてほかのデバイスにも自動的に同期されます。
drive_read_fileは、プレーンテキストファイル、PDF、Word、RTF、ODT、HTML 文書からテキストを返します。「Mac ストレージを最適化」によってオフロードされたファイルは、先にダウンロードされます。時間がかかりすぎる場合は、タイムアウトする代わりに、ファイルのダウンロードがまだ完了していないことを回答で知らせます。- ファイル内を検索できます。
drive_search_contentは、プレーンテキスト、PDF、Word、RTF、ODT、HTML ファイル内のテキストから単語を検索し(大文字小文字とアクセント記号は区別しません)、一致した箇所ごとに抜粋を返します。各ファイルは一度だけ読み込まれ、そのテキストは Mac 上のプライベートキャッシュ(drive-text-cache.sqlite、モード 600)に保存されるため、次回以降の検索は高速で、macOS によってファイルがオフロードされた後も機能します。iCloud にしかないファイルはdownload=trueを指定しない限り検索対象から除外され、回答では除外された件数が必ず示されます。(Spotlight も最初に試しましたが、iCloud Drive のインデックスが明らかに不完全だったため採用しませんでした。) drive_write_fileはプレーンテキストファイルを作成します。ファイルの置き換えにはoverwriteが必要で、古いバージョンはゴミ箱に移動されます。drive_move_itemがファイルを上書きすることはありません。drive_get_fileはファイル自体(base64、最大MAX_ATTACHMENT_BYTES)を渡すため、エージェントはファイルを添付したり、転送したりできます。これはメールでmail_get_attachmentを使う場合と同様です。- 完全に削除されることはありません。
drive_trash_itemは項目をゴミ箱に移動するため、そこから復元できます。 - パスは Drive を基準とした相対パスで、
..を使ってもシンボリックリンクを使っても、Drive の外に出ることはできません(外部につながるリンクは一覧にも表示されません)。Drive のゴミ箱フォルダーにはアクセスできません。
Apple Maps · Mac ヘルパー付きの 2 つのツール
maps_get_travel_time, maps_search_places
- 徒歩、自転車、車、公共交通機関での 2 地点間の所要時間と距離を、出発時刻または到着時刻を指定して取得できます(公共交通機関ではルートではなく時刻が返されます)。場所は住所、名称、または
lat,lonで指定します。目的地は出発地の近くで検索され、解決された両方の場所が結果に表示されるため、誤った候補との一致を確認できます。 - Maps が有効な場合、カレンダーの移動時間には、所有者が測定値を登録していればその値を、登録していなければ Apple Maps の推定値を使用し、どちらであるかを常に明記します。根拠のない数値を示すことはありません。10 分以内に繰り返された質問にはキャッシュから回答します。
- Mac 上の MapKit を通じて実行されます(インストーラーによってビルドされる
bin/maps-cli)。アクセス許可は不要で、Mac 自身の位置情報を使用することもありません。ENABLE_MAPS=trueで有効にしてください。
Messages · Mac ヘルパー付きの 4 つのツール
imessage_list_chats, imessage_read_chat, imessage_search_messages, imessage_send_message(デフォルトでは無効)
- Mac 上のご自身の iMessage と SMS の履歴を読み取り専用で扱います。会話と参加者(連絡先と照合)、リアクション付きメッセージ、配信・既読状態、名前付き添付ファイルを確認でき、履歴全体を検索できます(大文字・小文字とアクセント記号は区別しません)。
- 読み取るのはご自身の Messages データベースのみです(ヘルパーを実行している Mac ユーザーのもの)。Mac 上の別のユーザーのデータには一切触れません。ヘルパーの Python には、iCloud Drive と同じく、フルディスクアクセスの許可が必要です。
- Messages の内容は他人の言葉です。検索結果には、信頼できないデータであることを示す通知と安全に関する警告が付けられます。
IMESSAGE_HIDDEN_CHATSでチャットを完全に非表示にできます。銀行やワンタイムコードなどのサービス送信者はデフォルトで非表示になり、IMESSAGE_MAX_AGE_DAYSで検索対象期間を制限できます。また、IMESSAGE_NEVER_SENDでご自身のアシスタントとのスレッドを指定できます。ENABLE_IMESSAGE=trueで有効にします。 - 送信は
IMESSAGE_ALLOW_SEND=trueを設定しない限り無効です。送信先はIMESSAGE_SEND_ALLOWLISTに記載された相手に限られます(空の場合は誰にも送信できません)。IMESSAGE_NEVER_SENDに指定した相手や、Mac 上のimessage-never-send.txtに記載されたハンドルには、決して送信しません。また、メールは直接送信できる設定でも、ダッシュボードで承認するまで送信しないのがデフォルトです。iMessage のみが対象で、SMS は送信しません。各送信内容は Messages の記録に基づいて確認されます。最初の送信時に、Messages を操作する許可を一度だけ求められます。Mac の前にいるときに--selftest-imessage-send [email protected]を実行すると、この確認が表示されます。
Apple Health · 4 つのツールと Mac ヘルパー
health_get_summary、health_get_day、health_get_status、health_refresh_data
- Apple Health の日ごとの数値を取得します。歩数、アクティブエネルギー、移動距離(データが記録された時間数を含む)、安静時および歩行時の心拍数、HRV、呼吸数、心拍数の範囲、各睡眠の段階を確認できます。睡眠は終了した日付で表示されます。
health_get_dayでは、1 日分の詳細(時間ごとの合計、心拍数の測定値、睡眠のタイムライン)を取得できます。health_get_statusでは、データがどれくらい新しいかを確認できます。 - Mac から HealthKit を読み取ることはできないため、データは iPhone から取得します。ショートカットで過去 2 日分を iCloud Drive に書き込みます(ショートカットアプリ専用のフォルダーに保存されるため、Drive ツールからはアクセスできません)。Mac ヘルパーはデータをプライベートストア(
health.sqlite、モード 600)に保存し、生データのエクスポートではなく数値を返します。python3 mac-helper/health/build_shortcut.py health.shortcutでショートカットを作成し、shortcuts sign --mode anyoneで署名します。よく使うアプリを開いたときなどのオートメーションから実行してください(ロック中の iPhone は Health を読み取れないため、時刻指定の実行はほとんど失敗します)。各エクスポートには過去 2 日分が含まれるため、1 回正常に実行すれば欠落分を補えます。期間が重なるエクスポートが二重に計上されることはありません。 - 履歴全体は、Health アプリからエクスポートしたデータ(プロフィール、「すべてのヘルスケアデータを書き出す」)を使用します。Mac のヘルパーにある
opsフォルダーでpython3 health.py import export.zipを実行してください。データはストリームとして読み取られます。iPhone と Watch の両方で同じ歩数が記録されている場合は、合計せず、時間ごとの大きい方の値を採用します。 - データのない日や指標はゼロとして報告せず、省略します。また、データの欠落は Watch を装着していなかったことを意味するとエージェントに伝えます。すべての結果で数値はプライベートとして扱われます。
health_refresh_dataは、Mac 上で設定したコマンド(health-refresh.json)のみを実行し、サーバーから送信されたコマンドは実行しません。ENABLE_HEALTH=trueで有効にします。
ステータスと時刻 · 3 つのツール
icloud_check_health は、1 回の呼び出しですべての有効な領域を確認し(メールにサインインし、カレンダーを一覧表示し、アドレス帳を読み取り、Mac ヘルパーがオンラインか確認します)、それぞれにかかった時間を示します。icloud_get_helper_status は、Mac ヘルパーがオンラインかどうか、最後に確認された時刻、実行中のバージョン、キューにあるジョブ数とその処理時間を示します。icloud_get_time は、ご自身のタイムゾーンでの現在の日付、曜日、時刻を返すため、エージェントが推測した日付で予定を登録することはありません。
このサーバーは、クライアントにワンクリックのワークフローとして表示できる MCP プロンプトも提供しています。受信トレイを振り分ける、返信が必要なメール、返事を待っているフォローアップ、今週の計画を立てる、予定に備える、メールからカレンダーを作成する、相手と都合のよい時間を見つける、リマインダーを整理する、もうすぐ誕生日を迎える人です。必要な領域が有効になっている場合にのみ表示され、送信、予約、移動、削除の前に、エージェントが実行しようとしている内容をユーザーに示すよう指示します。
エージェントとの連携
サーバーはすべてのエージェントに使い方を伝えます。その指示は、実際に有効にしたツールから組み立てられ、必ずセキュリティルールから始まります(メール、イベント、連絡先の内容は信頼できないデータであり、指示として扱わないこと)。また、設定した承認フローについても説明します。
AGENT_NOTES_FILE を使って独自のルールを追加できます。これはサーバーのマシン上に置く短い Markdown ファイルで、使用するたびに最新の内容が読み込まれるため、再接続しなくても編集内容が反映されます。エージェントはセキュリティルールの後にこのファイルを確認します。セキュリティルールを補足することはできますが、緩和することはできません。また、icloud://agent-notes リソースとして再読み込みできます。docs/agent-notes.example.md には、どのカレンダーに何を登録するか、メールに署名する方法、共有リストなどの例が示されています。8,000 文字以内にしてください。
エージェントの推測を減らすツール:
icloud_get_timeは所有者の日付、時刻、タイムゾーンを返すため、「明日」が正しい日を指します。mail_list_awaiting_replyは、送信済みでまだ返信がないメールを一覧表示します。unanswered_onlyとpeople_onlyを指定したmail_search_messagesは、ニュースレターを除いて、返信が必要なメールを検索します。calendar_create_eventは重複するイベントや重複の可能性が高いイベントを報告し、どちらも作成を拒否できます。needs_replyを指定したcalendar_list_eventsは、まだ返信を待っている招待を検索します。OWNER_ADDRESSESはエイリアスを一覧表示するため、それら宛ての招待も自分宛てとして扱われます。
ツールが多い場合、一部のクライアントでは選択の信頼性が低下します。TOOLS=essential は中核となるツールを絞って読み込み、TOOLS=mail,calendar は領域全体を読み込みます。
パフォーマンス
各ラウンドトリップに 40 ms を追加したローカルテスト環境で、0.5.0 と 0.6.0 を比較して測定しました(詳細と測定方法)。
| 0.5.0 | 0.6.0 | |
|---|---|---|
| 30 日分のイベント、すべてのカレンダー | 0.74 s | 0.25 s |
| 同じ一覧の返却バイト数 | 26,017 | 12,384 |
| 20 件のメッセージを検索し、10 件を読み込む(iCloud から受信) | 465 KB | 55 KB |
| 20 件ヒットしたメール検索の返却バイト数 | 8,946 | 6,447 |
| すべてのクライアントが読み込むスキーマテキスト | 51,951 chars | 37,956 chars |
接続は最後の呼び出しから 10 分間、サインイン状態を維持します(IMAP_IDLE_SECONDS、CALDAV_KEEPALIVE_SECONDS)。WARMUP_ON_START を設定すると、サーバーの起動時にサインインします。dev/bench.py を実行すると、自分のアカウントで同じ測定を繰り返せます。
メニューバーから操作する
menubar/ には、Mac 上で動作するサーバー用のネイティブ macOS アプリ、iCloud MCP Control が含まれています。Time Machine のような標準的な macOS メニューから、サーバーの稼働状況、ツールの数、接続中のアプリ、問題の内容を分かりやすく確認できます。また、サーバーを一時停止できます(一時停止中はツールがその旨を応答しますが、接続は切断されません)。再起動や停止のほか、Mac ヘルパーやトンネルも操作できます。設定では、所有者のパスコードを変更したり、iCloud で検証してから保存するアプリ用パスワードを差し替えたりできます。また、接続中の各アプリと最終使用日時を確認できるため、1 つ、グループ、またはすべてのアプリからサインアウトできます。ADMIN_PORT を設定すると管理 API が有効になります。この API は専用ポートで 127.0.0.1 のみをリッスンし、すべてのリクエストに、サーバーがデータフォルダー内の admin-token に書き込むトークンが必要です。
Mac 経由のリマインダー、メモ、iCloud Drive、マップ、メッセージ、ヘルスケア
Apple はリマインダー、メモ、iCloud Drive、Apple マップ、メッセージの履歴、ヘルスケアのデータを自社デバイスでしか公開していないため、小さなヘルパー(mac-helper/)を Mac 上で実行し、サーバーからリクエストがあったときに処理します。
- Mac 上では何も待ち受けません。 ヘルパーはサーバーのプライベート HTTPS ポート(公開アドレスでもトンネルでもありません)に向けて接続し、ジョブをロングポーリングします。
- コードが送信されることはありません。 サーバーが送信するのは、固定リストから選ばれた操作名と、検証済みの引数です。リマインダーはインストーラーが Mac 上でビルドする小さな EventKit プログラムを実行し、マップは小さな MapKit プログラムを実行します。メモは静的スクリプトを実行します。メッセージは自身のメッセージデータベースから読み取り専用で取得します。iCloud Drive とヘルスケアはそれぞれ、Apple 独自の Python で固定の Python スクリプトを 1 つ実行します。いずれの場合も、引数はコードではなく、単一の JSON 値として渡されます。
- ピン留めされ、認証されています。 ヘルパーがフィンガープリントでピン留めする自己署名証明書を使った TLS に加え、ベアラートークンを使用します。
- オフライン時の状態も正確に伝えます。 Mac の電源が入っていて接続可能な間(ホームネットワークまたは VPN)に動作します。そうでない場合、ツールはその旨を伝えます。
.env で ENABLE_REMINDERS=true、ENABLE_NOTES=true、ENABLE_DRIVE=true、ENABLE_MAPS=true、ENABLE_IMESSAGE=true、ENABLE_HEALTH=true のいずれかを設定し、32 文字以上のランダムな BRIDGE_TOKEN を指定して、Mac からサーバーに接続する際のアドレスを BRIDGE_BIND に設定すると有効になります。サーバーはインストーラー用の証明書フィンガープリントをログに記録し、データフォルダー内の bridge_fingerprint.txt にも書き込みます。その後、Mac ヘルパーガイドに従ってください。
Shortcuts は 2 か所で許可リストに登録します。 アシスタントが一部の Shortcuts(shortcuts_list_shortcuts、shortcuts_run_shortcut)を実行できるようにするには、サーバーの SHORTCUTS_ALLOW に正確な名前を列挙し、さらに Mac の ~/Library/Application Support/icloud-mac-helper/shortcuts-allow.txt にも 1 行に 1 つずつ記載してください。名前は両方のリストに含まれている必要があるため、サーバーが侵害されても、Mac 自体で許可していないショートカットを実行することはできません。Apple の shortcuts コマンドで実行し、任意でテキスト入力を渡すことができ、テキスト出力が返されます。許可リストがない場合、または読み取り専用サーバーでは、これらのツールは利用できません。
重要
iCloud Drive とメッセージには、ヘルパーの Python にフルディスクアクセスが必要です。 macOS 27 では、ヘルパーが Command Line Tools の
Python.app実行ファイルとして動作した場合にのみ、この許可が有効になります。インストーラーはそのように設定します。詳しくはMac ヘルパーガイドをご覧ください。
設定
すべて環境変数で設定します。.env.exampleには、それぞれの設定項目についてコメントがあります。
すべての設定
| 変数 | デフォルト値 | 意味 | |---|---|---| | `ICLOUD_USERNAME` | 必須 | サインインに使用する Apple Account | | `ICLOUD_APP_PASSWORD` | 必須(または Keychain) | App 用パスワード | | `ICLOUD_KEYCHAIN`, `ICLOUD_KEYCHAIN_SERVICE` | true, icloud-mcp | macOS:`ICLOUD_APP_PASSWORD` が設定されていない場合、ログイン Keychain から App 用パスワードを読み取ります(`--store-password` を使って保存します) | | `ICLOUD_EMAIL_ADDRESS` | username | 差出人アドレス(iCloud アドレスまたはエイリアス) | | `ICLOUD_DISPLAY_NAME`, `EMAIL_SIGNATURE` | empty | 差出人名。送信メールに追加されるプレーンテキストの署名(`\n` = 改行) | | `IMAP_HOST/PORT/SECURITY/USERNAME` | `imap.mail.me.com`, 993, ssl, username | IMAP | | `SMTP_HOST/PORT/SECURITY/USERNAME` | `smtp.mail.me.com`, 587, starttls, username | SMTP | | `CALDAV_URL`, `CALDAV_USERNAME`, `CALDAV_REQUIRE_TLS` | `https://caldav.icloud.com`, username, true | CalDAV | | `CARDDAV_URL`, `CARDDAV_USERNAME` | `https://contacts.icloud.com`, username | CardDAV | | `DEFAULT_TIMEZONE`, `DEFAULT_CALENDAR` | `UTC`, auto | オフセットのない時刻に適用するタイムゾーン(`Europe/Amsterdam` などの IANA 名)。新しいイベントに使用するカレンダー(該当しない場合は「Calendar」または「Home」、それもない場合は最初のカレンダー) | | `ENABLE_MAIL`, `ENABLE_CALENDAR`, `ENABLE_CONTACTS` | true | 対象領域全体を無効にします | | `ENABLE_REMINDERS`, `ENABLE_NOTES`, `ENABLE_DRIVE`, `ENABLE_MAPS` | false | Mac ヘルパーを経由する領域(`BRIDGE_TOKEN` が必要)。Maps は Apple Maps の移動時間と場所の検索です | | `ENABLE_IMESSAGE` | false | Mac ヘルパー経由で、自分の iMessage と SMS の履歴を読み取り、検索します | | `ENABLE_HEALTH` | false | iPhone のエクスポートデータから取得した毎日の Apple Health の数値を、Mac ヘルパー経由で読み取ります | | `IMESSAGE_HIDDEN_CHATS`, `IMESSAGE_VISIBLE_CHATS` | empty | エージェントに常に表示しないチャット。または、設定した場合は、表示するチャットのみを指定します | | `IMESSAGE_MAX_AGE_DAYS` | 0 | 0 = 全履歴。数値を指定すると、すべての読み取りが指定日数以内に制限されます | | `IMESSAGE_HIDE_SHORT_CODES` | true | サービスの送信者(銀行、配達、ワンタイムコード)を非表示にします。メールアドレスでも完全な電話番号でもない送信者が対象です | | `IMESSAGE_NEVER_SEND` | empty | 何も送信しない相手(たとえば、自分のアシスタントの Apple ID)を指定します。そのチャットにはアシスタントのラベルが付きます | | `IMESSAGE_ALLOW_SEND`, `IMESSAGE_SEND_REQUIRES_APPROVAL` | false, true | `imessage_send_message` を許可します。メールの設定にかかわらず、iMessage の送信ごとにダッシュボードで承認を待ちます | | `IMESSAGE_SEND_ALLOWLIST` | empty | iMessage の送信先(ハンドルまたはチャット ID)。空の場合は誰にも送信せず、`*` の場合は全員に送信できます | | `TOOLS` | all | 公開する `essential`、領域(`mail`、`calendar`、`contacts`、`reminders`、`notes`、`drive`、`maps`、`imessage`、`health`)、および/またはツール名を指定します。それ以外は登録されません。不明な名前を指定するとサーバーが停止し、有効な名前が一覧表示されます | | `BRIDGE_TOKEN`, `BRIDGE_BIND` | empty, 127.0.0.1 | Mac ヘルパーのシークレット(32 文字以上)と、そのプライベートポートを公開するアドレス | | `BRIDGE_HOST` | 127.0.0.1 (Docker イメージでは 0.0.0.0) | プロセス内でブリッジがバインドするアドレス。ヘルパーの Mac がネットワーク経由でこのプロセスに接続する場合を除き、ループバックアドレスを使用します | | `SHORTCUTS_ALLOW` | empty | Mac ヘルパー経由でアシスタントが実行できるショートカットの正確な名前を、コンマ区切りで指定します(名前にコンマが含まれる場合は `;` で区切ります)。Mac 側にも一覧表示されている必要があります(下記参照) | | `BRIDGE_JOB_TIMEOUT_SECONDS` | 60 | ツール呼び出しが Mac からの応答を待つ時間(最大で `TOOL_TIMEOUT_SECONDS` から 5 を引いた値。応答メッセージが届く時間を確保します) | | `READ_ONLY` | false | 送信(下書きも含む)、移動、削除、カレンダー、連絡先、リマインダー、メモ、ファイルの変更を禁止します | | `ALLOW_SEND` | true | false = エージェントは下書きの保存のみ可能です | | `SEND_REQUIRES_APPROVAL` | true | 送信メールをブラウザーでの承認用にキューに入れます(ローカルでは「下書き」に保存します) | | `OUTBOX_TTL_SECONDS`, `OUTBOX_MAX` | 86400, 20 | キューの保持期間と最大件数 | | `ALLOW_CALENDAR_INVITES` | false | 参加者を許可します(iCloud が招待、更新、キャンセルのメールを送信します)。`true` を指定するか、`approve` を指定すると、その変更ごとにダッシュボードでの承認を待ちます | | `SEND_ALLOWLIST` | empty | メールの送信先として許可するアドレスまたはドメインのみを指定します(`@example.org,[email protected]`) | | `MAX_RECIPIENTS` | 25 | 1 メッセージあたり | | `ALLOW_PERMANENT_DELETE` | false | ゴミ箱からのメール削除を許可します | | `SAVE_SENT_COPY` | true | 送信済みメールを「送信済み」にコピーします(iCloud は自動でコピーしません) | | `MAX_BODY_CHARS`, `MAX_ATTACHMENT_BYTES` | 30000, 5 MiB | 結果サイズの上限 | | `MCP_PUBLIC_URL`, `MCP_OWNER_PASSWORD` | ホスト時は必須 | 公開 HTTPS アドレス。所有者パスワード(12 文字以上) | | `MCP_HOST`, `MCP_PORT`, `MCP_EXTRA_ALLOWED_HOSTS` | 127.0.0.1 (Docker イメージでは 0.0.0.0), 8000, empty | バインドアドレスと、追加で許可する `Host` ヘッダー | | `MCP_STATELESS` | true | サーバー側の MCP セッションを使用しないため、再起動しても接続中のクライアントで「Missing session ID」が発生しません | | `TOOL_TIMEOUT_SECONDS` | 60 | この時間を超えて実行中のツール呼び出しは、時間のかかったステップを示すエラーとともに中断されます(`MCP_JSON_RESPONSE` が有効な場合は最大 90 秒。Cloudflare の 100 秒制限より短くなります) | | `MCP_JSON_RESPONSE` | true | 各リクエストにイベントストリームではなく、単一のプレーンな JSON 本文で応答します。クライアントで問題が発生する場合は `false` にします | | `MCP_STRUCTURED_CONTENT` | false | 結果を `structuredContent` としても送信します(これを必要とするクライアント向け)。それ以外の場合、結果はコンパクトな JSON テキストとして 1 回だけ送信されます | | `IMAP_POOL_SIZE`, `IMAP_IDLE_SECONDS` | 3, 600 | 再利用のためにログイン状態を維持するメール接続数(0 = 呼び出しごとにログイン)と、最後の呼び出し後に接続を維持する時間 | | `CALDAV_POOL_SIZE`, `CALDAV_KEEPALIVE_SECONDS` | 4, 600 | 再利用のために維持するカレンダー接続数と、最後の呼び出し後に接続を維持する時間(0 = キープアライブなし) | | `CALDAV_AUTH` | auto | `basic` は 401 を待たずに最初のリクエストで Basic 認証情報を送信します(HTTPS またはこのコンピューター宛ての場合のみ)。`auto` は iCloud とローカルサーバーで同様に動作し、その他のサーバーでは認証方式(Basic または Digest)をネゴシエートします | | `WARMUP_ON_START` | true | 起動直後にバックグラウンドでメール、カレンダー、連絡先にサインインし、最初の呼び出しを高速化します | | `TOOL_WORKERS` | 8 | 同時に実行できるツール呼び出し数 | | `OWNER_ADDRESSES` | (なし) | 招待を自分宛てとして扱うための、自分の追加アドレス(エイリアス) | | `AGENT_NOTES_FILE` | (なし) | エージェント向けの独自ルール。指示に追加され、`icloud://agent-notes` として提供されます(`docs/agent-notes.example.md` を参照) | | `DATA_DIR` | `./data` (Docker では `/data`) | OAuth 状態と送信トレイ | | `ADMIN_PORT` | 無効 | メニューバーアプリ用のループバック限定管理 API(トークンは `DATA_DIR` 内の `admin-token`) | | `DASHBOARD` | true | 所有者用ダッシュボード(ホストモードのみ)(`/dashboard`) | | `OWNER_PASSWORD_LOGIN` | true | `false` = パスキーが登録されている場合、ダッシュボードへのサインインにはパスキーのみを使用します | | `DASHBOARD_SESSION_MINUTES` | 30 | ダッシュボードのサインインは、この時間使用しないと終了します(最大 12 時間) | | `AUDIT_LOG`, `AUDIT_KEEP_DAYS` | true, 90 | `DATA_DIR/audit.jsonl` に保存されるアクティビティログと、その保持日数 | | `DASHBOARD_SETTINGS` | edit | `view` = 設定をダッシュボードに表示しますが、そこで変更することはできません。`off` = `DATA_DIR/settings.json` を無視します | | `OAUTH_ALLOWED_REDIRECT_HOSTS` | `claude.ai,claude.com,chatgpt.com,chat.openai.com,localhost,127.0.0.1` | サインイン後にクライアントへ戻ることを許可する宛先:Claude、ChatGPT、Codex などのローカルクライアント。どのサインインでも所有者パスワードが必要です | | `ACCESS_TOKEN_TTL`, `REFRESH_TOKEN_TTL` | 3600, 30 days | トークンの有効期間(リフレッシュトークンはローテーションされます) | | `REFRESH_TOKEN_GRACE_SECONDS` | 60 | ローテーション後すぐにリフレッシュトークンが再送された場合、アプリからサインアウトさせず、同じ新しいペアを返します(メモリ内のみ。0 = 無効、最大 300) | | `LOG_LEVEL` | INFO | |トラブルシューティング
まず、AI に 「iCloud 接続を確認して」 と尋ねてください。icloud_check_health は有効なすべての領域をテストし、失敗している領域を示します。
Claude Desktop 拡張機能
| 症状 | 対処方法 |
|---|---|
| 「Failed to initialize cache」、「Operation not permitted」、「Unable to connect to extension server」 | セキュリティソフトウェアが、拡張機能によってダウンロードされた uv と Python をブロックしている可能性があります(F-Secure などのウイルス対策アプリケーション制御は、署名されていないプログラムをブロックします)。そのソフトウェアで uv と Python を許可するか、確認のために一度終了するか、すでに信頼している Python を使って手動セットアップを行ってください。 |
| 時刻が1時間以上ずれている | タイムゾーンの欄には、Europe/Amsterdam のような IANA 名を1つだけ入力し、それ以外は入力しないでください。設定 → 拡張機能 → iCloud で変更してください。 |
| リマインダー、メモ、または Drive が表示されない | この拡張機能が対応するのは Mail、Calendar、Contacts です。Mac の各領域を使うには、手動セットアップと Mac ヘルパーが必要です。 |
サーバーと接続
| 症状 | 対処方法 |
|---|---|
selftest でログインに失敗する | 多くの場合、ログイン名が原因です。一部のアカウントでは、サービスごとに異なる名前でサインインします。IMAP_USERNAME、SMTP_USERNAME、CALDAV_USERNAME、CARDDAV_USERNAME を個別に設定してください。Apple Account のパスワードではなく、アプリ用パスワードを使用してください。 |
| クライアントがサーバーに接続できない、または承認ページが表示されない | MCP_PUBLIC_URL は末尾のスラッシュなしで公開アドレスと完全に一致し、TLS フロントエンドは Host ヘッダーを維持する必要があります。Cloudflare Access のようなログイン画面がサーバーの前にないことを確認してください。 |
| 承認ページまたは送信トレイページでパスワードが受け付けられない | 15分間にパスワードを10回間違えると、全員がページを利用できなくなります。しばらく待ってから、Apple のパスワードではなく、.env に設定した所有者のパスワードを使用してください。 |
| 新しいツールや変更した設定が反映されない | クライアントはツール定義をキャッシュします。クライアントの設定からサーバーに再接続し(Codex では新しいセッションを開始します)、新しいチャットを開始してください。 |
| ウェブクライアントのサインインが拒否される(「redirect host not allowed」) | サインイン後のリダイレクト先が、サーバーに認識されていないホストです。Claude と ChatGPT はデフォルトで許可されています。別のクライアントのホストは OAUTH_ALLOWED_REDIRECT_HOSTS に追加してください。 |
| サーバー再起動後に「Missing session ID」と表示される | MCP_STATELESS=true(デフォルト)を維持してください。これを無効にした場合は、再起動のたびにコネクターを再接続してください。 |
| ツール呼び出しがタイムアウトする | iCloud の処理には時間がかかる場合があります。呼び出しは TOOL_TIMEOUT_SECONDS(デフォルトは60秒)後に中断され、時間がかかった処理が示されます。再試行し、繰り返し発生する場合はサーバーログを確認してください。 |
メール、カレンダー、連絡先
| 症状 | 対処方法 |
|---|---|
| AI はメールを送信したと言うが、届いていない | これは承認ステップが機能している状態です。ホスト型の場合:https://<your-host>/dashboard/approvals を開き、メッセージを確認して承認してください。ローカルの場合:下書きに保存されています。 |
| イベントへのゲスト追加が拒否される | 招待はデフォルトで無効です。AI から人を招待したい場合は、ALLOW_CALENDAR_INVITES=true に設定してください。 |
| 特定のアドレス宛てのメール送信が拒否される | SEND_ALLOWLIST と MAX_RECIPIENTS を確認してください。 |
| 送信済みメールが「送信済み」に表示されない | iCloud は送信済みメールを自動で保存しません。SAVE_SENT_COPY=true(デフォルト)を維持してください。 |
Mac ヘルパー:リマインダー、メモ、iCloud Drive、ヘルスケア
| 症状 | 対処方法 | |---|---| | ツールに Mac ヘルパーがオフラインと表示される | Mac の電源が入っていて、スリープ状態ではなく、ログイン済みで、ブリッジアドレスに接続できる必要があります(ホームネットワークまたは VPN)。*"Is the Mac helper online?"* と尋ね、Mac で `~/Library/Logs/icloud-mac-helper/helper.log` を確認してください。 | | ヘルパーのログに「No route to host」と表示される | macOS はサードパーティ製の Python にローカルネットワークへのアクセスを許可しません。Apple の Python を使用するか(インストーラーが選択します)、プライバシーとセキュリティ > ローカルネットワークで許可してください。 | | リマインダーへのアクセスが拒否される | プライバシーとセキュリティ > リマインダーで「iCloud Mac Helper (Reminders)」にフルアクセスを許可してから、ヘルパーのセルフテストを実行してください。 | | メモへのアクセスが拒否される(「制御が許可されていません」) | プライバシーとセキュリティ > オートメーションで、ヘルパーの Python にメモの制御を許可してください。 | | iCloud Drive でヘルパーにアクセス権がないと表示される | Command Line Tools の `Python.app` にフルディスクアクセスを許可し、ヘルパーがその実行ファイルとして動作していることを確認してください(インストーラーを再実行します)。[Mac ヘルパーガイド](https://github.com/epinethrone/icloud-mcp/blob/main/mac-helper/README.md#icloud-drive)を参照してください。 | | Drive ファイルを読み込むと、まだダウンロード中と表示される | ファイルは iCloud にのみ保存されていました(「Mac ストレージを最適化」)。ダウンロードが始まっているので、1 分後にもう一度尋ねてください。 | | ヘルスケアの数値が欠けている、または何時間も古い | iPhone はロック解除中にのみデータを書き出します。`health_get_status` を確認してから、自動化で監視しているアプリを開いてください。データが丸一日ない場合は、Watch の電源がオフになっていました。1 回の書き出しで過去 2 日分が補完されます。 |このプロジェクトが回避する iCloud の癖
これらは Apple の実サーバーに接続した場合にのみ発生し、ローカルのテストサーバーでは発生しません。
- CalDAV は UID で絞り込んだクエリを拒否するため(
412)、イベントはリソース名で取得し、失敗時にはスキャンに切り替えます。アカウント所有者が出席者の場合は、アドレスをEMAILパラメーターに指定した内部パスに書き換えます。 - IMAP には
MOVEがありません。移動と削除には COPY、\Deletedフラグの設定、対象のメッセージだけを指定したUID EXPUNGEを使用します(通常のEXPUNGEは決して使いません)。iCloud は送信済みメールを自動では保存しません。 - CardDAV は開始時とは異なるホストで探索を終えるため、返されたリンクをたどる必要があります。また、1 回のリクエストでアドレス帳全体を返し、メールアドレスの約半数を、ラベルを
itemN.X-ABLabelに格納したグループ形式のitemN.EMAILプロパティに保存します。 - 移動時間は Apple が保存する数値であり、リアルタイムの推定値ではありません。再計算されないため、所要時間が指定されていない出発地や移動手段は、何もせずに処理を終えるのではなく、拒否されます。
制限事項
- リマインダー、メモ、iCloud Drive、マップ、メッセージ、ヘルスケアには Mac ヘルパーと電源の入った Mac が必要です。ヘルスケアでは、iPhone によるデータの書き出しも必要です。連絡先の写真とメモは意図的にエージェントに公開していません。また、連絡先を削除すると元に戻せません。
- ID は 1 つです。エイリアスは差出人アドレスとして使用できません。テキスト以外の添付ファイルは base64 で返され、サイズに上限があります。
- メールの呼び出しではログイン済みの接続を最大 2 つ再利用します。これにより、初回以降の各呼び出しでログイン処理(約 1 秒)が省略されます。iCloud に対するカレンダーと連絡先の呼び出しには約 1.5~5 秒かかります。
- Claude はまだカスタムコネクターのカスタムアイコンを表示しません(要望を送信)。サーバーはプロジェクトのロゴを配信して公開しているため、アイコンを表示できるクライアントや、承認ページおよび送信トレイページを開いたときのブラウザータブにはロゴが表示されます。
Issue やプルリクエストを歓迎します。すべてのプルリクエストで、Python 3.11~3.13 を対象としたオフラインテストと、自動化されたセキュリティ重視のレビューが実施されます。
- セキュリティ上の問題: 公開 Issue は作成しないでください。代わりにセキュリティポリシーに従ってください。
- プルリクエストを作成する前に:
pytest tests --ignore=tests/integrationが成功することを確認し、新しい動作に対するテストを追加してください。 - iCloud と通信する変更:
selftestを実行し、実際のアカウントで手動でも試してください。ローカルのテストサーバーでは、iCloud が受け付けないものも受け付けます。 - 新しいツール: 安全性に関するデフォルト設定を維持してください。送信、招待、削除を行うものはすべて既存の設定による制限を維持し、iCloud から読み取ったものはすべて、指示ではなくデータとして扱ってください。
開発
python -m venv .venv && . .venv/bin/activate
pip install -e ".[test]"
pytest tests --ignore=tests/integration # offline tests, no network
sudo apt install dovecot-imapd && dev/start_local_stack.sh
pytest tests # adds integration tests against local Dovecot, an SMTP sink and Radicale
python packaging/mcpb/build.py # builds the Claude Desktop extension into dist/
python dev/readme_art.py # redraws the README artwork in assets/readme/
dev/e2e_http.py は、HTTP 経由で稼働中のサーバー(OAuth とツール呼び出し)を操作します。ローカルのテストサーバーでは、iCloud が受け付けないものも受け付けます(上記の癖を参照してください)。そのため、変更をテストする際は、selftest と実際のアカウントを使った手動実行もテストの一部として扱ってください。
謝辞
MCP Python SDK、IMAPClient、caldav、icalendar、html2text、python-dateutil、Uvicorn、HTTPX を基盤として構築されています。Notes スクリプトは MrGo2/icloud-mcp(MIT)を改変したものです。THIRD_PARTY_NOTICES.md をご覧ください。
MIT ライセンス · Apple Account を他者に預けることなく、Apple のサービスを利用するためのアシスタントを求める方のために作られています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。