关于 iCloud
iCloud 是连接 AI 客户端与 iCloud 邮件、日历、联系人、提醒事项、备忘录、云盘及其他所列服务的 MCP 服务。它可本地运行或托管,凭据由运行者掌控,并对发送邮件等操作采用以审批为先的保护措施。
主要功能
- 01访问邮件、日历和联系人
- 02使用提醒事项、备忘录和 iCloud 云盘
- 03搜索 iMessage 历史记录并查询 Apple 地图
- 04读取 Apple Health 睡眠与活动数据
- 05邮件发送和邀请采用审批保护
- 06本地运行或托管以供远程客户端连接
适用场景
- 01查找邮件并起草回复
- 02查看空闲时间并创建或调整日程
- 03在 iCloud 云盘中查找和查看文件
- 04回顾消息或健康活动记录
MCP 相关
向 MCP 客户端提供 iCloud 数据和操作能力。支持本地连接,以及通过 HTTPS 和 OAuth 进行远程 MCP 连接;提醒事项、备忘录、云盘、地图、消息和健康功能可选用 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 可将 Claude、Codex、ChatGPT 或任何其他 MCP 客户端连接到你日常使用的 Apple 账户。
它在你自己的设备上运行,密码也留在设备上,任何内容要离开设备前都会征求你的同意。
开口提问。
“找出房东关于暖气的邮件,并起草一封礼貌的回复。”
“下周我什么时候有一小时空闲?那时约安娜吃午饭。”
“把周四的牙医预约改到周五,时间不变。只改这一个。”
“提醒我下个月一号续办护照。”
“在 iCloud 云盘里找出我的报税 PDF,告诉我去年缴了多少税。”
“如果我需要九点到车站,骑车过去要多久?”
“帮我了解一下这个周末收到的信息。”
“和上个月相比,我这周睡得怎么样?”
以隐私为设计核心。
密码留在本地。
Apple 为这些服务提供的唯一登录方式是专用密码。
密码只保存在你的设备或 Mac 的 Keychain 中。AI 永远看不到它。
未经你同意,任何内容都不会离开。
AI 撰写的邮件会等待你批准,或存入草稿箱。
不会向其他人发送邀请。删除的内容会移至废纸篓。
专为陌生人发来的邮件打造。
AI 读取的所有内容都会标记为他人的话,而不是指令。
隐藏字符会被清除,钓鱼手法也会被指出。
在关键环节经过测试。
每次变更都会运行 600 多项离线测试,包括对读取他人数据的每个解析器进行模糊测试、针对真实邮件和日历服务的集成测试,
以及使用实时 iCloud 账户进行的实操测试,验证只有 Apple 服务才有的特殊行为。
## 0.12 版新增内容
| Apple 健康 从 iPhone 获取每日睡眠及其阶段、步数、活动和心率数据,还可从「健康」App 的导出文件获取完整历史记录。 | 任意 MCP 客户端 Claude、Codex、ChatGPT、Cursor 等。ChatGPT 可以登录托管服务,无需额外设置。 | 更清晰的工具名称 每个工具都采用 area_verb_noun 格式,例如 mail_send_message,让任何 Agent 都能选对工具。旧名称仍可在 TOOLS 中使用。 |
| 减少误报 来自 Outlook 的邮件不再触发隐藏文本警告。针对含有面向 AI 的隐藏文本的邮件,警告仍会保留,并且你可以查看隐藏内容。 | Apple 地图 查询骑行、驾车、步行或乘坐公共交通的出行时间,可指定出发或到达时间,还可搜索地点。日历出行时间可以使用此功能。 | 信息 读取和搜索 iMessage 及 SMS 历史记录。发送功能默认关闭;启用后仍需经过你的批准,并使用允许列表。 |
| 菜单栏应用 快速查看健康状况,暂停或重启服务,更改凭据,并让任何已连接的应用退出登录。 | 暂停 只需切换一个开关,所有工具都会回复服务已暂停,而无需断开任何人的连接。 | 更安全 邀请允许列表、经过筛查的主题和名称、自定义分类器,以及对所有读取他人数据的解析器进行模糊测试。 |
0.9 至 0.11 版:地图、信息、菜单栏应用和暂停功能、草稿和文件夹、日历和联系人群组,以及功能更丰富的提醒事项。0.6 至 0.8 版:日历速度提升约三倍、更轻量的邮件处理、首次调用即时完成、自定义规则文件、待回复事项、冲突检查,以及强化的重复规则防护。自 0.4 版起:支持撤销的批量清理、安全退订、精确预订、编辑备忘录、搜索 Drive 文件内容、生日和快捷指令。0.3 版:一键安装 Claude Desktop 扩展、本地模式、钥匙串存储、空闲时间、RSVP 和诈骗警告。
邮件、日历和通讯录使用 Apple 的标准协议。
提醒事项、备忘录、iCloud Drive、地图、信息和健康数据通过 Mac 上的可选辅助程序处理。
它会向外连接,因此你的 Mac 无需开放端口。
| 这台电脑上的任意客户端 | Claude Desktop,一键安装 | 你自己的服务 | |
|---|---|---|---|
| 设置 | 一条命令或几行配置 | 双击扩展 | Docker 和 HTTPS 地址 |
| 适用于 | Claude Code、Codex、Claude Desktop、Cursor、VS Code,以及这台电脑上的其他 MCP 客户端 | 这台电脑上的 Claude Desktop | 网页、桌面和手机上的 Claude 与 ChatGPT、Codex,以及支持远程 MCP 服务的任意客户端 |
| 外发邮件 | 保存到草稿,供你发送 | 保存到草稿,供你发送 | 等待你在浏览器中批准 |
| 指南 | 设置 › | 安装 › | 快速入门 › |
已在 Claude(网页、桌面、手机、Claude Code 和桌面扩展)以及本地运行服务的 Codex CLI 上完成测试。任何支持 MCP 的客户端都能以相同方式运行:本地使用时由客户端自行启动服务,托管使用时则通过 OAuth 登录。
在本地运行
服务在你自己的电脑上运行。客户端需要时会启动服务并直接与之通信,因此无需公开地址、隧道、Docker 或 OAuth。网页和手机上的应用无法访问它;如需使用这些应用,请托管服务。
一键安装 Claude Desktop
- 从最新版本下载
icloud-mcp-<version>.mcpb。 - 双击该文件,或将其拖到 Claude Desktop → Settings → Extensions。
- 填写你的 Apple Account 电子邮件地址、专用 App 密码(Claude Desktop 会将其保存在系统钥匙串中)、姓名和时区,例如
Europe/Amsterdam。
该服务默认要求先批准操作:邮件会保存到草稿,供你发送;向其他人发送邀请的功能则处于关闭状态。此设置适用于 Mail、Calendar 和 Contacts。Reminders、Notes 和 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. 将密码保存在 Keychain 中(Mac 上)。它会提示输入 App 专用密码,且不会在命令行中显示密码:
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 个核心工具:搜索、读取和回复邮件;列出日程、查找空闲时间以及创建或更新日程;查找联系人;主要的提醒事项、备忘录和云盘工具;以及健康检查。按需添加具体名称,例如TOOLS=essential,mail_move_messages,也可以选择整个类别:TOOLS=mail、TOOLS=mail,calendar(还包括contacts、reminders、notes、drive、maps、imessage、health;健康检查始终保留)。
本地发送方式。 这里没有审批页面,因此默认设置 SEND_REQUIRES_APPROVAL=true 时,AI 发送的每条邮件都会改为保存到草稿文件夹中,结果也会说明这一点。你可以在 Mail 中检查邮件,然后自行点击 Send。设置 SEND_REQUIRES_APPROVAL=false 即可允许直接发送;此时只有客户端自身的审批提示会进行确认。
本地使用提醒事项、备忘录和 iCloud 云盘。 在环境变量文件中添加 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。如果两个客户端同时启动服务,只有先启动的客户端能使用 Mac 工具;Mail、Calendar 和 Contacts 在两个客户端中都可用。
快速开始
只需托管一次,你的 AI 就能通过网页、桌面应用和手机访问你的 iCloud:Claude、ChatGPT、Codex,或任何支持远程 MCP 服务的客户端。
你需要准备
- Docker 和 compose 插件(或 Python 3.11+)。
- 一个启用了双重认证的 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。任何 TLS 前端(Caddy、nginx)也都可用,只要它保留 Host 标头即可。MCP_PUBLIC_URL 必须与公开地址完全一致。
4. 连接客户端
将 https://<your-host>/mcp 添加为远程 MCP 服务。随后,服务会显示一个审批页面:输入所有者密码。
- Claude: 设置 → 连接器 → 添加自定义连接器。
- ChatGPT: 设置 → 应用与连接器 → 高级 → 开启开发者模式,然后创建使用 OAuth 的连接器(需要支持开发者模式的套餐)。
- Codex:
codex mcp add icloud --url https://<your-host>/mcp,然后运行codex mcp login icloud。 - 其他: 任何支持通过 OAuth 使用远程(可流式传输的 HTTP)MCP 服务的客户端。若网页客户端的登录流程会跳转回另一台主机,则需将该主机加入
OAUTH_ALLOWED_REDIRECT_HOSTS。
更改工具或设置后,请重新连接,因为客户端会缓存工具定义。菜单栏应用可以让一个或所有已连接的客户端退出登录;如果没有该应用,请删除数据卷中的 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(将其加入书签,并且只在此处登录,切勿通过 Agent 提供的链接登录),检查确切的收件人和正文,然后批准或丢弃。排队的消息会在 OUTBOX_TTL_SECONDS 指定的时间后过期(默认 24 小时),且最多只会释放一次。旧版 https://<your-host>/outbox 页面仍可使用,每次访问时都会要求输入所有者密码。
控制面板
https://<your-host>/dashboard 是管理服务器的地方:查看哪些请求在等待你批准、Agent 做了哪些更改、连接了哪些应用,以及邮件、日历和联系人是否能正常响应。手机上使用时显示标签栏,电脑上使用时显示侧边栏,并支持浅色和深色模式。
- 使用通行密钥登录。 先使用所有者密码登录一次,然后在“安全”下添加通行密钥:之后即可使用 Face ID、Touch ID 或安全密钥登录。通行密钥只能用于服务器自己的地址,因此外观相似的页面无法使用它。添加通行密钥后,设置
OWNER_PASSWORD_LOGIN=false即可关闭密码登录。通行密钥需要安装可选的webauthn软件包(pip install "icloud-mcp-server[passkey]");Docker 镜像已包含该软件包。 - 活动记录。 Agent 执行的每项写入操作(移动邮件、更改日历事件、编辑联系人)、每次批准和丢弃、每次登录和失败的尝试,以及每次连接或退出的应用,都会记录到
DATA_DIR/audit.jsonl,其中包含名称、地址和主题,但绝不包含邮件正文、密码或令牌。每条记录都包含上一条记录的哈希值;“活动”页面会显示文件之后是否被更改。记录保留AUDIT_KEEP_DAYS(90)天。设置AUDIT_LOG=false可关闭此功能。 - 日历邀请也可以等待你处理。 设置
ALLOW_CALENDAR_INVITES=approve后,任何会让 iCloud 给其他人发送邮件的日历更改(创建、修改或取消含受邀者的事件,或回复邀请)都会暂存在“审批”页面,而不会立即写入。批准后只会写入你看到的内容,且仅当事件自此之后未发生变化时才会写入;否则不会写入,页面也会说明原因。将事件移至其他日历不会发送邮件,也不会暂存。 - 设置。 服务器的所有行为都可以在“设置”中更改,包括区域和工具、邮件发送方式、邀请、联系人、Mac 助手、只读模式以及控制面板本身。来自环境变量的值会在对应字段标明;在此设置的值会列出,并附有“重置”按钮。更改会保存到
DATA_DIR/settings.json,优先于环境变量,并在重启后生效(可通过一个按钮重启)。服务器会先检查新值能否使其正常启动,再保存更改;如果更改会降低防护级别,则会要求你重新登录。服务器的监听地址、应用的登录方式以及连接目标仍由环境变量控制,页面仅显示这些信息。DASHBOARD_SETTINGS=view会显示设置但不允许更改;off会忽略settings.json。 - 实时更新,支持安装。 打开的“概览”或“审批”页面会在 15 秒内显示新请求,无需重新加载;“发送”和“丢弃”可直接在页面中操作:你可以在“概览”中打开请求,并在对应行中批准;丢弃操作可在五秒内撤销。页面检查更新不会计作使用,因此打开的标签页仍会在
DASHBOARD_SESSION_MINUTES设定的时间后退出。在 Chrome 和 Edge 中,或在 Safari 中使用“添加到主屏幕”,即可将控制面板安装为应用。它的 Service Worker 不会缓存任何内容,因此邮件不会存储在浏览器中。 - 会话。 登录后,若连续
DASHBOARD_SESSION_MINUTES(30)分钟未使用,会话即过期,最长不超过 12 小时。如果登录已超过五分钟,移除通行密钥、更改密码和退出应用时都需要确认。 - 登录记录清晰易读,通行密钥登录也不会受影响。 锁定机制拦截的登录失败会在十分钟窗口结束时写入一条汇总记录,即使之后没有其他活动也会如此,因此活动日志能够显示每次失败集中出现的情况,同时避免记录泛滥。登录凭证由每个进程独有的密钥签名,且绝不会存储。只有使用通行密钥成功登录后,凭证才会计为已使用,因此大量挑战请求既不会填满任何存储空间,也不会影响所有者使用通行密钥登录。服务器重启后,未完成的登录凭证会失效;所有者只需重新登录。
安全
能够读取邮件并代你执行操作的连接器是提示词注入的攻击目标:恶意邮件或邀请可能包含试图操控 Agent 的文本。服务会将此类内容标记为不可信,并告知 Agent 应将其视为数据,但这只是对大模型的请求,并非保证。真正能保护你的是配置:
| 风险 | 默认设置 | 配置项 |
|---|---|---|
| Agent 根据注入的指令发送邮件 | 发送操作只会将邮件加入队列,等待你在 /dashboard/approvals 上批准(DASHBOARD=false 时为 /outbox;本地运行时:保存到“草稿”) | SEND_REQUIRES_APPROVAL=true |
| Agent 向陌生人发送邀请 | 禁止更改参会者 | ALLOW_CALENDAR_INVITES=false |
| 开启邀请后,Agent 邀请了错误的人 | 可邀请任意地址,最多 10 位来宾 | INVITE_ALLOWLIST、MAX_ATTENDEES |
| Agent 将陌生人的地址添加到真实联系人中,导致之后的回复发往该地址 | 允许,但结果和审批页面会将该地址标记为由 Agent 添加 | 设置 CONTACTS_ALLOW_EMAIL_CHANGES=false 可阻止此操作 |
| Agent 为处理今天的任务读取多年的邮件存档 | 整个邮箱 | MAIL_MAX_AGE_DAYS |
| 未能识别恶意文本 | 内置规则(英文和荷兰文),并移除 HTML 邮件中隐藏的文本(看起来像指令时会发出警告;show_hidden 可显示这些文本) | SAFETY_SCREEN=command:<path> 可添加自定义分类器 |
| Agent 向任意地址发送邮件 | 可发送到任意地址,每封邮件最多 25 位收件人 | SEND_ALLOWLIST、MAX_RECIPIENTS |
| Agent 销毁邮件 | 删除操作会将邮件移至“废纸篓”;禁止从“废纸篓”中删除 | ALLOW_PERMANENT_DELETE=false |
| Agent 销毁笔记或文件 | 笔记会移至“最近删除”,Drive 文件会移至“废纸篓”。提醒事项没有废纸篓,因此删除后无法恢复(只有一行,很容易重新创建);在列表之间移动提醒事项不会删除它 | 始终如此 |
| Agent 根据注入的指令给他人发短信 | iMessage 发送功能默认关闭;开启后,每条消息都必须经你批准,只有允许列表中的对象(列表为空 = 无人)才能收到消息,且禁止发送列表会直接屏蔽相应句柄 | IMESSAGE_ALLOW_SEND=false、IMESSAGE_SEND_ALLOWLIST、IMESSAGE_NEVER_SEND |
| Agent 从“信息”中读取你的验证码 | “信息”功能默认关闭;开启后,银行和一次性验证码发送方会被隐藏,你也可以隐藏或允许特定聊天 | ENABLE_IMESSAGE=false、IMESSAGE_HIDE_SHORT_CODES=true、IMESSAGE_HIDDEN_CHATS |
| Agent 更改任何内容 | 所有可写内容 | 为连接器启用只读模式:READ_ONLY=true |
大多数客户端也可以在工具运行前征求你的许可(在 Claude 中,可为每个工具启用“使用前询问”):请将此设置用于发送、回复、转发和删除工具。任何获得应用专用密码的人都拥有对邮件、日历和联系人的完全访问权限(Apple 不提供范围更窄的权限),因此请妥善保护服务及其 .env。
完整安全模型
- iCloud 凭据仅存在于服务环境或 macOS 钥匙串中。客户端持有仅适用于*此*服务的短期持有者令牌。 - 客户端可以动态注册,但未经所有者密码授权,任何操作都不会获准。重定向主机受到限制。令牌以 SHA-256 哈希形式存储(文件权限为 600)。审批页面和发件箱页面在 15 分钟内输错密码 10 次后会锁定(整个服务范围内;现有令牌仍可使用)。锁定仅针对密码:仪表板通行密钥仍可用于登录,因此其他人输错密码不会让所有者无法登录。被锁定机制拦下的失败登录会在时间窗口结束时汇总记录一次;登录票据使用每个进程独有的密钥签名,仅在通行密钥登录成功后才计为已使用,并会在重启时作废,因此无论是大量请求还是伪造票据,都无法抢先占用所有者的通行密钥登录:`docker compose logs icloud-mcp | grep 'oauth:'`。 - 每次被拒绝的登录续期都会记录原因(已轮换、已过期、客户端错误、无法识别),但绝不记录令牌值;未经身份验证的调用方无法刷屏写入日志:`docker compose logs icloud-mcp | grep 'oauth:'`。 - 邮件、事件、笔记和文件中的文本会移除不可见的操控字符(Unicode 标签字符、零宽空格、方向覆盖字符;保留库尔德语、波斯语和阿拉伯语所需的标记);当文本针对 AI、索要密码或代码,或声称银行信息已更改(英语和荷兰语)时,结果会附带 `safety_warnings`。 - 每条工具错误在传递给 Agent 前都会经过清理:密码和令牌会被遮蔽,URL 会截断至主机名(iCloud DAV 路径中包含账户 ID),不可见字符会被移除。可能引用服务响应的运行状况检查错误和意外错误,也会移除账户地址和长数字。 - MCP 端点会验证 `Host` 和 `Origin`。工具结果会附带不可信内容提示。HTTP 客户端请求日志记录已禁用,以免账户标识符出现在日志中。 - Mac 桥接服务运行在自己的私有 TLS 端口上,使用自签名证书,辅助程序会通过指纹固定该证书;同时还需要持有者令牌。它绝不会通过公共地址或隧道提供服务。服务只会发送固定列表中的操作名称和经过验证的参数,绝不发送脚本文本。 - 菜单栏应用的管理 API 默认关闭,除非设置了 `ADMIN_PORT`。它仅监听 127.0.0.1,使用自己的端口(绝不使用公共端口或隧道);每个请求都需要 `DATA_DIR/admin-token` 中的令牌(权限为 600);浏览器请求和非回环 `Host` 标头都会被拒绝。 - 设计上仅供单一所有者使用:一次部署只服务一个 iCloud 账户。它不支持多租户,并且刻意不支持存储他人的应用专用密码。工具
92 个工具。 其中 50 个用于 Mail、Calendar、Contacts、时钟和运行状况检查;可选 Mac 辅助程序另提供 40 个;还有 2 个用于你允许名单中的 Shortcuts。打开相应部分查看详情。
每个名称的格式为 area_verb_noun(mail_send_message、calendar_create_event)。11 个工具在 0.7.0 中重命名,36 个工具在 0.12.0 中重命名(例如 mail_send 这样有动词但没有名词的名称),以符合该格式;TOOLS 仍接受旧名称,并会记录新名称。
邮件 · 25 个工具
| 类型 | 工具 | |---|---| | 读取 | `mail_list_folders`、`mail_search_messages`、`mail_list_changes`、`mail_find_correspondent`、`mail_get_message`、`mail_get_messages`(单次调用最多 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` 可在一次 IMAP 往返中读取一批邮件(一整天的未读邮件或整个邮件线程),速度约为逐封读取的 7 倍。 - **一次搜索所有文件夹。** `mail_search_messages` 设置 `all_folders=true` 后,会按时间倒序搜索“归档”“已发送”“垃圾邮件”以及你自己的文件夹,因为邮件规则和回复可能会将邮件移出收件箱。 - **区分新闻简报与个人邮件。** 搜索结果会标记 `bulk` 邮件(包含 List-Unsubscribe 或 List-Id 标头、批量邮件优先级,或由自动化地址、免回复地址发送的邮件),并说明如何取消订阅;`mail_list_senders` 会按发件人汇总文件夹内容。 - **安全地批量清理。** `mail_run_bulk_action`(移动、归档、移至垃圾箱、标记为已读)始终会先预览:邮件数量、样例,以及一个仅对应这些邮件的确认令牌。执行时必须提供该令牌,因此之后收到的邮件绝不会受影响。每次执行都会按 Message-ID 记录,且可在 30 天内通过 `mail_undo_bulk_action` 撤销。操作至少需要一个筛选条件,且绝不会永久删除邮件。 - **无需打开链接即可取消订阅。** `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 换行符或只有一个长段落时提供 `layout_warnings`。 - **拒绝过期 ID。** 每封邮件都会附带其所在文件夹的 `uidvalidity`;接受 uid 并据此执行操作的工具也会要求传回该值。如果 iCloud 此后重新编号了文件夹,工具会拒绝操作,而不会误改其他邮件。 - 阅读邮件不会将其标记为已读。密件抄送收件人会收到邮件,但发送过程中会移除标头。 - 收件人格式可以是 `[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时则只影响某个日期(系列中的其他事件不受影响)。 - 一次调用即可查找空闲时间。
calendar_find_free_time会根据指定时长、工作时间和所选星期几返回可用时段。路途时间会计为忙碌;标记为有空的事件、已取消的事件和你已拒绝的邀请不会计入;全天事件会单独列出,而不会被推测处理。 - 了解邀请是否已发出。 邀请他人后,结果会报告 iCloud 记录的每位受邀者状态(例如已发送、已送达或已拒绝,比如地址拼写错误),因此 Agent 不会谎称某人已收到邀请。
- 管理日历。 创建、重命名和删除日历。默认日历永远不会被删除;包含事件的日历只有在预览并提供确认令牌后才会删除;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可接受、拒绝或标记为暂定回复,适用于整个系列或某个日期;iCloud 会自行给组织者发送邮件。 - 可安全重试。
calendar_create_event和contacts_create_contact支持可选的request_id:如果调用超时并使用相同 ID 重试,系统会找到首次尝试,而不会创建重复项。 - Apple 路途时间和地图位置。 事件可以包含 Apple 的路途时间(骑行、步行、驾车或公共交通)和结构化目的地,这样 Apple 才会显示地图卡片。
- 添加参与者不会影响其他人。
add_attendees和remove_attendees只会修改一位参与者;完整参与者列表会合并而非替换,因此现有参与者的回复状态会保留,也不会再次收到邀请。邀请由 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,这样 Agent 会询问,而不是猜测。 - 可以处理拼写错误的姓名。 如果没有完全匹配的结果,
contacts_search_contacts会建议发音相近的姓名;mail_find_correspondent则可通过近似姓名、地址或公司查找你曾发过邮件的人,只读取邮件标头。近似匹配会被标记,Agent 必须先征求你的确认,才能向此人发送邮件、发出邀请或编辑其信息。 - 邮寄地址会按街道、城市、地区、邮政编码和国家/地区读取和写入,可标记为家庭、工作或自定义标签(“度假屋”),并按 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/。 - 移动和删除操作一次只处理一条备忘录,并且除了其 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`- 可处理整个 iCloud Drive,Mac 会持续同步其中的内容,因此每次更改都会自动同步到其他设备。
drive_read_file可从纯文本文件、PDF 和 Word、RTF、ODT 及 HTML 文档中返回文本。若文件已由“优化 Mac 存储空间”移出本地,会先下载。如果耗时过长,回复会说明文件仍在下载,而不是超时。- 搜索文件内容。
drive_search_content可在纯文本、PDF、Word、RTF、ODT 和 HTML 文件的文本中查找词语(忽略大小写和重音符号),并为每个匹配项返回一段摘录。每个文件只会读取一次,文本会保存在 Mac 上的私有缓存中(drive-text-cache.sqlite,权限模式为 600),因此后续搜索速度更快,即使 macOS 已将文件移出本地也能搜索。除非设置download=true,否则会跳过仅存于 iCloud 的文件,并且回复始终会说明跳过了多少个文件。(我们最初尝试了 Spotlight,后来弃用:其 iCloud Drive 索引经证实并不完整。) drive_write_file可创建纯文本文件。替换文件需要使用overwrite,旧版本会移至废纸篓。drive_move_item绝不会覆盖文件。drive_get_file会传回文件本身(base64,最大不超过MAX_ATTACHMENT_BYTES),因此 Agent 可以像使用mail_get_attachment处理邮件附件一样,将文件附加或转发。- 永远不会永久删除任何内容。
drive_trash_item会将项目移至废纸篓,你可以从中恢复。 - 路径相对于 Drive,不能离开 Drive,也不能通过
..或符号链接离开(指向外部的链接甚至不会列出)。无法访问 Drive 的废纸篓文件夹。
Apple 地图 · 2 个工具,需搭配 Mac 助手
maps_get_travel_time、maps_search_places
- 可查询两地之间的步行、骑行、驾车或公共交通所需时间和距离,并指定出发或到达时间(公共交通只提供时间,不提供路线)。地点可以是地址、名称或
lat,lon;目的地会在出发地附近查找,结果会列出解析后的两个地点,以便发现匹配错误。 - 开启地图后,日历中的出行时间会优先使用所有者测得的数值,否则使用 Apple 地图估算值,并始终标明数据类型;绝不会编造数值。10 分钟内重复的问题会使用缓存回答。
- 通过 Mac 上的 MapKit 运行(由安装程序构建的
bin/maps-cli)。无需权限,也绝不会使用 Mac 自身的位置。设置ENABLE_MAPS=true即可启用。
Messages · 4 个工具,需搭配 Mac 助手
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 旁时,在 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会详细提供某一天的数据(每小时汇总、心率读数或睡眠时间线);health_get_status会说明数据的新鲜度。 - Mac 无法读取 HealthKit,因此数据来自你的 iPhone:快捷指令会将最近两天的数据写入 iCloud Drive(位于“快捷指令”应用自己的文件夹中,Drive 工具无法访问),而 Mac 辅助程序会将数据保存在私有存储中(
health.sqlite,权限模式为 600),并仅返回数据,不会返回原始导出文件。使用python3 mac-helper/health/build_shortcut.py health.shortcut创建快捷指令,使用shortcuts sign --mode anyone对其签名,然后通过自动化运行,例如在打开常用应用时运行(锁定的 iPhone 无法读取 Health 数据,因此定时运行大多会失败)。每次导出都会覆盖最近两天,因此成功运行一次即可补齐任何间隔;重叠的导出不会重复计数。 - 你的完整历史记录来自 Health 应用自己的导出文件(“个人资料”→“导出所有健康数据”):在 Mac 上的辅助程序
ops文件夹中运行python3 health.py import export.zip。数据会以流的方式读取;如果 iPhone 和 Watch 对同一批步数都进行了计数,则每小时取较大的总数,而不是将两者相加。 - 没有数据的日期或指标会直接省略,而不会报告为零;系统会告知 Agent,数据缺失表示 Watch 可能未佩戴。每项结果都会标记为私密。
health_refresh_data只会运行你在 Mac 上设置的命令(health-refresh.json),绝不会运行服务端发送的命令。设置ENABLE_HEALTH=true即可启用。
状态和时间 · 3 个工具
icloud_check_health 会在一次调用中检查所有已启用的区域(登录邮件、列出日历、读取通讯录,并检查 Mac 辅助程序是否在线),同时报告每项检查耗时。icloud_get_helper_status 会报告 Mac 辅助程序是否在线、上次检测到它的时间、运行的版本、排队的任务数量及耗时。icloud_get_time 会提供你所在时区的当前日期、星期和时间,避免 Agent 根据猜测的日期预订事项。
服务器还提供 MCP 提示词,客户端可将其显示为一键工作流:整理我的收件箱、我欠下的回复、我正在等待的后续回复、规划我的一周、为预约做准备、根据邮件创建日历、找个时间和某人见面、整理我的提醒事项和即将到来的生日。只有启用了所需功能区域时,相应工作流才会显示;每个工作流都会要求 Agent 在发送、预订、移动或删除任何内容之前,先向你展示计划执行的操作。
与 Agent 协作
服务器会告知每个 Agent 如何使用它:服务器的说明根据你实际启用的工具生成,始终以安全规则开头(邮件、日历事件和联系人中的内容均为不可信数据,绝不是指令),并说明你配置的审批流程。
使用 AGENT_NOTES_FILE 添加自己的规则:在服务器所在机器上的简短 Markdown 文件,每次使用时都会重新读取,因此编辑后无需重新连接即可生效。Agent 会在安全规则之后看到这些内容;这些规则可以补充安全规则,但绝不能放宽限制。Agent 也可以将其作为 icloud://agent-notes 资源重新读取。docs/agent-notes.example.md 展示了具体思路:哪个日历用于什么、如何为邮件签名、哪些列表是共享的。请将文件控制在 8,000 个字符以内。
以下工具可减少 Agent 的猜测:
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/ 包含 iCloud MCP Control,这是一款原生 macOS 应用,用于在 Mac 上运行的服务器。它的菜单是标准 macOS 菜单,类似 Time Machine:显示服务器是否正在运行、拥有多少工具和已连接应用,以及用通俗文字说明任何问题;你还可以暂停服务器(工具会回复服务器已暂停,但不会断开任何连接)、重启或停止服务器、Mac 助手和隧道。其设置可更改所有者密码、替换 iCloud 专用应用密码(保存前会先通过 iCloud 测试),并列出每个已连接的应用及其上次使用时间,让你可以退出一个、多个或全部应用的登录。使用 ADMIN_PORT 开启其管理 API:它仅在 127.0.0.1 上通过自己的端口监听,每个请求都需要服务器写入数据文件夹中 admin-token 的令牌。
通过你的 Mac 使用提醒事项、备忘录、iCloud 云盘、地图、信息和健康
Apple 只在自家设备上提供提醒事项、备忘录、iCloud 云盘、Apple 地图、你的信息历史记录和健康数据,因此需要在你的 Mac 上运行一个小型辅助程序(mac-helper/),在服务发出请求时执行相应操作。
- 你的 Mac 上不会有任何程序监听。 辅助程序会主动连接到服务的专用 HTTPS 端口(绝不会连接到公共地址,也不会经过隧道),并长轮询以获取任务。
- 绝不会发送代码。 服务只会发送操作名称,以及来自固定列表、经过验证的参数。提醒事项会运行安装程序在你的 Mac 上构建的小型 EventKit 程序,地图会运行小型 MapKit 程序。备忘录会运行静态脚本。信息会以只读方式读取你自己的信息数据库。iCloud 云盘和健康各自会通过 Apple 自带的 Python 运行一个固定的 Python 脚本。无论哪种情况,参数都以单个 JSON 值的形式传入,绝不会作为代码传入。
- 已固定并经过身份验证。 使用通过指纹固定的自签名证书进行 TLS 验证,并使用 Bearer 令牌。
- 关闭时如实反馈。 你的 Mac 开机且可连接时(通过家庭网络或 VPN),辅助程序即可工作。否则,工具会说明情况。
在 .env 中启用此功能:设置 ENABLE_REMINDERS=true、ENABLE_NOTES=true、ENABLE_DRIVE=true、ENABLE_MAPS=true、ENABLE_IMESSAGE=true 和 ENABLE_HEALTH=true 中任意一项,设置至少包含 32 个随机字符的 BRIDGE_TOKEN,并将 BRIDGE_BIND 设置为 Mac 可连接到服务的地址。服务会在日志中输出供安装程序使用的证书指纹,并将其写入数据文件夹中的 bridge_fingerprint.txt。然后按照 Mac 辅助程序指南操作。
快捷指令,双重允许列表。 若要让助手运行你的一些快捷指令(shortcuts_list_shortcuts、shortcuts_run_shortcut),请在服务端的 SHORTCUTS_ALLOW 中列出快捷指令的准确名称,并且在 Mac 上的 ~/Library/Application Support/icloud-mac-helper/shortcuts-allow.txt 中每行列出一个名称。名称必须同时出现在两个列表中,因此即使服务遭到入侵,也无法运行你未在 Mac 本机允许的快捷指令。Apple 的 shortcuts 命令会运行该快捷指令,并可选地接收文本输入,之后会返回其文本输出。未设置允许列表或服务为只读时,这些工具不会生效。
重要
iCloud 云盘和信息需要为辅助程序使用的 Python 授予“完全磁盘访问权限”。 在 macOS 27 上,只有辅助程序以命令行工具中的
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` | 空 | 发件人姓名;发送邮件时添加的纯文本签名(`\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 | 未指定时差的时间所用时区(IANA 名称,例如 `Europe/Amsterdam`);新事件所用日历(否则为 "Calendar" 或 "Home",再否则为第一个日历) | | `ENABLE_MAIL`, `ENABLE_CALENDAR`, `ENABLE_CONTACTS` | true | 关闭整个功能区 | | `ENABLE_REMINDERS`, `ENABLE_NOTES`, `ENABLE_DRIVE`, `ENABLE_MAPS` | false | 通过 Mac helper 提供的功能区(需要 `BRIDGE_TOKEN`);Maps 提供 Apple Maps 出行时间和地点搜索 | | `ENABLE_IMESSAGE` | false | 通过 Mac helper 读取和搜索你自己的 iMessage 和 SMS 历史记录 | | `ENABLE_HEALTH` | false | 通过 Mac helper,从 iPhone 导出数据中获取每日 Apple Health 数据 | | `IMESSAGE_HIDDEN_CHATS`, `IMESSAGE_VISIBLE_CHATS` | 空 | 永不向 Agent 显示的聊天;或设置后,仅显示这些聊天 | | `IMESSAGE_MAX_AGE_DAYS` | 0 | 0 = 全部历史记录;设置数字则将每次读取限制在指定天数内 | | `IMESSAGE_HIDE_SHORT_CODES` | true | 隐藏服务发送方(银行、快递、一次性验证码):任何不是电子邮件地址或完整电话号码的发送方 | | `IMESSAGE_NEVER_SEND` | 空 | 永远不向其发送内容的对象(例如你自己的助手 Apple ID);其聊天会标记为助手 | | `IMESSAGE_ALLOW_SEND`, `IMESSAGE_SEND_REQUIRES_APPROVAL` | false, true | 允许使用 `imessage_send_message`;每条 iMessage 都会在仪表板上等待你批准,与邮件设置无关 | | `IMESSAGE_SEND_ALLOWLIST` | 空 | 可接收 iMessage 的对象(句柄或聊天 ID);留空表示无人,`*` 表示任何人 | | `TOOLS` | all | 要开放的 `essential`、功能区(`mail`、`calendar`、`contacts`、`reminders`、`notes`、`drive`、`maps`、`imessage`、`health`)和/或工具名称;其他工具将完全不会注册。未知名称会导致服务停止并列出有效名称 | | `BRIDGE_TOKEN`, `BRIDGE_BIND` | 空, 127.0.0.1 | Mac helper 密钥(至少 32 个字符)以及其私有端口发布的地址 | | `BRIDGE_HOST` | 127.0.0.1(Docker 镜像中为 0.0.0.0) | bridge 在进程内绑定的地址。除非 helper 所在的 Mac 需要通过网络访问此进程,否则使用环回地址 | | `SHORTCUTS_ALLOW` | 空 | 助手可通过 Mac helper 运行的 Shortcuts 完整名称,以逗号分隔(名称中包含逗号时可用 `;` 分隔);Mac 端也必须列出这些名称(见下文) | | `BRIDGE_JOB_TIMEOUT_SECONDS` | 60 | 工具调用等待 Mac 的时长(最多为 `TOOL_TIMEOUT_SECONDS` 减 5,以便收到自身的消息) | | `READ_ONLY` | false | 禁止发送内容(包括草稿)、移动或删除内容,以及更改日历、联系人、提醒事项、备忘录或文件 | | `ALLOW_SEND` | true | false = Agent 只能保存草稿 | | `SEND_REQUIRES_APPROVAL` | true | 将待发邮件放入队列,等待通过浏览器批准(本地模式下:保存到 Drafts) | | `OUTBOX_TTL_SECONDS`, `OUTBOX_MAX` | 86400, 20 | 队列的有效时长和容量 | | `ALLOW_CALENDAR_INVITES` | false | 允许添加与会者(iCloud 随后会发送邀请、更新和取消通知):`true`,或设置为 `approve`,将每项此类更改提交到仪表板,等待你批准 | | `SEND_ALLOWLIST` | 空 | 仅允许向这些地址或域名发送邮件(`@example.org,[email protected]`) | | `MAX_RECIPIENTS` | 25 | 每封邮件的收件人数上限 | | `ALLOW_PERMANENT_DELETE` | false | 允许从 Trash 中删除邮件 | | `SAVE_SENT_COPY` | true | 将已发送邮件复制到 Sent(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, 空 | 绑定地址和额外允许的 `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 文本发送一次) | | `IMAP_POOL_SIZE`, `IMAP_IDLE_SECONDS` | 3, 600 | 保留以供复用的已登录邮件连接数(0 = 每次调用都登录),以及最后一次调用后保持预热的时长 | | `CALDAV_POOL_SIZE`, `CALDAV_KEEPALIVE_SECONDS` | 4, 600 | 保留以供复用的日历连接数,以及最后一次调用后保持预热的时长(0 = 不保持连接) | | `CALDAV_AUTH` | auto | `basic` 会在首次请求中发送 Basic 凭据,而非等待 401(仅限 https 或本机);`auto` 会对 iCloud 和本地服务执行此操作,对其他服务则协商使用 Basic 或 Digest | | `WARMUP_ON_START` | true | 启动后立即在后台登录邮件、日历和联系人,以加快首次调用 | | `TOOL_WORKERS` | 8 | 可同时运行的工具调用数 | | `OWNER_ADDRESSES` | (无) | 其他属于你的地址(别名),这样发给这些地址的邀请也会被视为发给你 | | `AGENT_NOTES_FILE` | (无) | 你为 Agent 编写的规则,会添加到指令中,并通过 `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,按照手动设置进行配置。 |
| 时间相差一小时或更多 | 时区字段必须填写一个 IANA 名称,例如 Europe/Amsterdam,不能包含其他内容。在“设置”→“扩展”→“iCloud”中修改。 |
| 找不到 Reminders、Notes 或 Drive | 此扩展支持 Mail、Calendar 和 Contacts。Mac 上的区域需要按照手动设置进行配置,并使用 Mac 辅助程序。 |
服务和连接
| 症状 | 解决方法 |
|---|---|
selftest 登录失败 | 通常是登录名导致的。有些账户登录某项服务时使用的名称不同:请分别设置 IMAP_USERNAME、SMTP_USERNAME、CALDAV_USERNAME 或 CARDDAV_USERNAME。请使用 App 专用密码,切勿使用 Apple Account 密码。 |
| 客户端无法连接到服务,或审批页面始终不显示 | MCP_PUBLIC_URL 必须与公开地址完全一致,且末尾不能有斜杠;TLS 前端必须保留 Host 标头。确保服务前面没有 Cloudflare Access 之类的登录墙。 |
| 审批页面或发件箱页面不接受你的密码 | 15 分钟内输错 10 次密码后,所有人都无法访问这些页面。请稍候,然后使用 .env 中的所有者密码,而非 Apple 密码。 |
| 新工具或修改后的设置没有显示 | 客户端会缓存工具定义。请在客户端设置中重新连接服务(在 Codex 中,请开启新会话),然后开始新的聊天。 |
| 网页客户端登录时被拒绝(“redirect host not allowed”) | 登录后会跳转到服务不认识的主机。默认允许 Claude 和 ChatGPT;要使用其他客户端,请将其主机添加到 OAUTH_ALLOWED_REDIRECT_HOSTS。 |
| 服务重启后出现 “Missing session ID” | 保持 MCP_STATELESS=true(默认值)。如果关闭了此设置,每次重启后都要重新连接连接器。 |
| 工具调用超时 | iCloud 可能响应较慢;超过 TOOL_TIMEOUT_SECONDS(默认值为 60)后,调用会被中止,并返回指出缓慢步骤的错误。请重试;如果问题仍然出现,请检查服务日志。 |
Mail、Calendar 和 Contacts
| 症状 | 解决方法 |
|---|---|
| AI 说已发送电子邮件,但收件箱中没有邮件 | 这是审批步骤正常生效的表现。托管环境:打开 https://<your-host>/dashboard/approvals,查看邮件并批准。本地环境:邮件会保存在“草稿”中。 |
| 添加活动嘉宾时遭拒 | 邀请功能默认关闭。如果希望 AI 邀请他人,请设置 ALLOW_CALENDAR_INVITES=true。 |
| 发往某个特定地址的邮件遭拒 | 检查 SEND_ALLOWLIST 和 MAX_RECIPIENTS。 |
| 已发送的邮件没有出现在“已发送”中 | iCloud 不会自动归档已发送的邮件。请保留 SAVE_SENT_COPY=true(默认值)。 |
Mac 辅助程序:Reminders、Notes、iCloud Drive 和 Health
| 症状 | 解决方法 | |---|---| | 工具提示 Mac 助手处于离线状态 | Mac 必须开机、保持唤醒、已登录,并且能够访问桥接地址(家庭网络或 VPN)。询问 *“Mac 助手是否在线?”*,并在 Mac 上检查 `~/Library/Logs/icloud-mac-helper/helper.log`。 | | 助手日志显示 "No route to host" | macOS 会阻止第三方 Python 访问本地网络。请使用 Apple 的 Python(安装程序会选择它),或在“隐私与安全性”>“本地网络”中允许访问。 | | 提醒事项请求被拒绝 | 在“隐私与安全性”>“提醒事项”中,为“iCloud Mac Helper (Reminders)”开启“完全访问权限”,然后运行助手的自检。 | | 备忘录请求被拒绝(“不允许控制”) | 在“隐私与安全性”>“自动化”中,允许助手的 Python 控制备忘录。 | | iCloud 云盘提示助手无权访问 | 为命令行工具 `Python.app` 授予“完全磁盘访问权限”,并确保助手以该可执行文件运行(重新运行安装程序)。请参阅 [Mac 助手指南](https://github.com/epinethrone/icloud-mcp/blob/main/mac-helper/README.md#icloud-drive)。 | | 读取云盘文件时提示文件仍在下载 | 文件仅存储在 iCloud 中(“优化 Mac 存储空间”)。文件已开始下载;请一分钟后重试。 | | 健康数据缺失或已有数小时未更新 | iPhone 仅会在解锁时导出数据:检查 `health_get_status`,然后打开自动化所监控的应用。一天没有数据表示 Apple Watch 已关闭;一次导出会补齐最近两天的数据。 |本项目处理的 iCloud 特殊情况
这些情况只会在连接 Apple 的真实服务器时出现,本地测试服务器上不会出现:
- CalDAV 会拒绝按 UID 筛选的查询(
412),因此会按资源名称获取事件,并在必要时回退到扫描。作为账户所有者的参会者会被改写为内部路径,并将地址放在EMAIL参数中。 - IMAP 不支持
MOVE。移动和删除操作会使用 COPY、标记\Deleted,然后仅对这些邮件执行UID EXPUNGE(绝不会直接执行EXPUNGE)。iCloud 不会自动归档已发送邮件。 - CardDAV 的发现流程结束时使用的主机与开始时不同(请跟随返回的链接);它会在一次请求中返回整个通讯录,并将约一半的电子邮件存储在分组的
itemN.EMAIL属性中,标签则存储在itemN.X-ABLabel中。 - 旅行时间是 Apple 存储的一个数值,并非实时估算。它永远不会重新计算,因此,如果未提供时长,则不会接受起点或出行方式,而不是静默地不执行任何操作。
限制
- 提醒事项、备忘录、iCloud 云盘、地图、信息和健康都需要 Mac 助手以及一台开机的 Mac;健康还需要 iPhone 导出数据。联系人照片和备注不会向 Agent 开放,删除联系人后无法恢复。
- 仅支持一个身份:不能使用别名作为发件人地址。非文本附件会以 base64 格式返回,并有大小上限。
- 邮件调用最多会复用两个已登录的连接,因此首次调用后,每次调用都能节省登录所需的时间(约一秒);日历和联系人调用连接 iCloud 时需要约 1.5 到 5 秒。
- Claude 目前尚未为自定义连接器显示自定义图标(请求链接)。服务仍会提供并声明项目徽标,因此,支持显示图标的客户端以及你在审批页面和发件箱页面上打开的浏览器标签页都会显示该徽标。
欢迎提交问题和拉取请求。每个拉取请求都会针对 Python 3.11 至 3.13 运行离线测试,并接受自动化的安全审查。
- 安全问题: 请不要公开提交问题。请改为遵循安全政策。
- 提交拉取请求前: 确保
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 数字生活的助手,又不愿将 Apple 账户交给任何人的用户打造。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。