mcpField
I
iCloud Mail

iCloud Mail

本地服务
github.com/JulienRabault通信协作15 周前更新

关于 iCloud Mail

iCloud Mail 是通过 IMAP 和 SMTP 管理 Apple 邮件的本地 MCP 服务,面向希望在 AI 客户端中处理邮件的用户。它默认只读,并将发送等写入操作设计为明确步骤,且没有删除邮件的工具。

主要功能

  1. 01搜索所有邮件文件夹
  2. 02读取邮件、线程及附件信息
  3. 03先保存草稿,再单独发送
  4. 04移动邮件和规则整理支持模拟运行
  5. 05提供文件夹及未读邮件资源

适用场景

  1. 01跨文件夹查找邮件和回复
  2. 02查看邮件线程并起草回复
  3. 03保存附件到磁盘并取得路径
  4. 04按规则整理邮件并先预览更改

MCP 相关

MCP 服务向客户端提供邮件搜索、读取、整理、草稿和发送等工具,以及文件夹和未读邮件资源、收件箱分类等提示词。附件写入磁盘并返回路径,不将字节传给模型。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"julienrabault-icloud": {
"command": "uvx",
"args": [
"icloud-mail-mcp"
],
"env": {
"ICLOUD_EMAIL": "<ICLOUD_EMAIL>",
"ICLOUD_APP_PASSWORD": "<ICLOUD_APP_PASSWORD>",
"ICLOUD_DISPLAY_NAME": "<ICLOUD_DISPLAY_NAME>"
}
}
}
}
启动命令uvx icloud-mail-mcp
需要配置的环境变量
ICLOUD_EMAILYour iCloud address, for example [email protected].
ICLOUD_APP_PASSWORD密钥An app-specific password generated at account.apple.com. iCloud rejects your main password over IMAP.
ICLOUD_DISPLAY_NAMEName shown in the From header of sent mail. Defaults to the local part of the address.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiicloud-mail-mcp0.1.1

工具

15

收录的工具列表 · 更新于 2 周前

参数类型必填说明
with_countsboolean否添加每个文件夹的邮件总数和未读数

详细介绍

iCloud Mail MCP

License: MIT PyPI Python 3.11+ MCP

一个用于 iCloud Mail 的模型上下文协议(MCP)服务。让大模型通过 IMAP 和 SMTP 读取、搜索、归档和发送你的 Apple 邮件。

所有操作都在你的设备上运行:你的凭据和邮件绝不会传给第三方。网络通信和 MIME 解析仅使用 Python 标准库。

主要功能
  • 默认只读。 搜索和读取工具使用 SELECT ... readonly 和 BODY.PEEK——不会在你不知情的情况下将邮件标记为已读、移动或删除。
  • 搜索所有文件夹,而不只是收件箱。 回复会根据邮件规则归档;search_all_folders 可以在收件箱搜索无法找到的地方找到它们。
  • 发送前先保存草稿。 save_draft 会将邮件保存到“草稿”文件夹,供你审核。send_email 也可用,但与之分离,需要明确调用。
  • 不会销毁邮件。 没有删除邮件的工具,而且 delete_mailbox 会拒绝删除仍包含邮件的文件夹。
  • 支持真实的 iCloud MIME 格式。 包括 Modified UTF-7 文件夹名称、quoted-printable、错误的字符集声明、纯 HTML 邮件以及服务器端的重音字符搜索。
要求
  • Python 3.11 或更高版本,以及 uv
  • 已启用双重认证的 iCloud 账户
  • App 专用密码——iCloud 不允许通过 IMAP 使用你的主密码
开始使用

发布到 PyPI 后,无需克隆:

uvx --from icloud-mail-mcp icloud-mcp-setup     # interactive configuration
uvx --from icloud-mail-mcp icloud-mcp           # run the server

从源代码安装:

git clone https://github.com/JulienRabault/icloud-mcp.git
cd icloud-mcp
uv sync
uv run python -m icloud_mcp.setup

设置命令会要求你提供邮箱地址和 App 专用密码,测试连接,写入 .env,然后打印客户端所需的准确配置块。

在 account.apple.com →“登录与安全”→“App 专用密码”中生成 App 专用密码。

标准配置适用于大多数客户端:

{
  "mcpServers": {
    "icloud-mail": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/icloud-mcp", "python", "-m", "icloud_mcp"]
    }
  }
}
Claude Code
claude mcp add icloud-mail --scope user -- uv run --directory /path/to/icloud-mcp python -m icloud_mcp

使用 claude mcp list 检查。

Claude Desktop

将标准配置添加到 claude_desktop_config.json:

  • macOS — ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows — %APPDATA%\Claude\claude_desktop_config.json

在 Windows 上,请使用 uv.exe 的绝对路径:桌面客户端不一定会继承 shell 的 PATH。

Codex

在 ~/.codex/config.toml 中:

[mcp_servers.icloud-mail]
command = "uv"
args = ["run", "--directory", "/path/to/icloud-mcp", "python", "-m", "icloud_mcp"]
Cursor / Windsurf / VS Code

在编辑器的 MCP 设置文件中使用标准配置块 (.cursor/mcp.json、~/.codeium/windsurf/mcp_config.json 或 VS Code MCP 设置)。

MCP 服务会在客户端启动时加载——编辑配置后,请重启客户端。

工具

读取——以下工具均不会修改邮箱:

工具描述
list_folders列出文件夹,可选择显示邮件数和未读数
folder_status查看一个文件夹的邮件数和未读数,不列出邮件
search_emails在一个文件夹中搜索:文本、发件人、收件人、主题、日期、标记和大小
search_all_folders一次搜索所有文件夹,搜索条件相同
read_email完整邮件:解码后的正文、可选的 HTML、附件元数据
get_thread重建对话,可选择显示每封邮件的正文
save_attachments将附件写入磁盘并返回其路径

写入——操作均需明确指定:

工具描述
save_draft将邮件放入草稿箱,不会发送
set_flag设置已读/未读、已标记、已回复状态。可撤销
create_mailbox创建文件夹,支持带重音符号的名称
rename_mailbox重命名文件夹,邮件会随之移动
delete_mailbox删除空文件夹。文件夹中有邮件时会拒绝操作
auto_organize按规则整理邮件。除非设置 dry_run=false,否则只会模拟操作
move_emails在文件夹间移动邮件。除非设置 dry_run=false,否则只会模拟操作
send_email实际发送邮件。没有草稿步骤,也无法撤销

没有任何工具会销毁邮件。delete_mailbox 会拒绝删除仍有邮件的文件夹——请先将邮件移出,这样决定权就在你手中。

附件数据不会经过模型:save_attachments 会写入文件并返回路径。对来自邮件的文件名会进行净化处理——这些名称是不可信的输入,而不是可信路径。

资源
URI内容
icloud://folders所有文件夹及其邮件数和未读数
icloud://unread收件箱中的未读邮件
提示词
提示词用途
triage_inbox将近期邮件分为需要处理 / 信息 / 等待 / 可忽略
draft_reply阅读邮件及其会话,并在草稿箱中起草回复
follow_up重建与联系人的邮件往来,说明谁应回复谁
不使用 MCP 客户端进行自动化

examples/ 中包含使用相同模块的独立脚本——将它们配置到 cron 或 Task Scheduler 中:

uv run python examples/daily_digest.py           # what arrived today
uv run python examples/watch_sender.py acme.com  # exit 1 if nothing new
uv run python examples/waiting_on_reply.py       # threads nobody answered
uv run python examples/auto_file.py --apply      # file mail by rules

所有脚本都支持 --json,便于通过管道传递。请参阅 examples/README.md。

随附技能

skills/mailbox-search/ 是一项 Claude Code 技能,会强制搜索所有文件夹,然后才能断定某封邮件不存在:

cp -r skills/mailbox-search ~/.claude/skills/
此处处理的 iCloud 特性

如果你要编写自己的 IMAP 客户端来连接 iCloud,以下内容值得了解:

  • SEARCH 返回的 UID 顺序不固定。 RFC 3501 未保证排序,而 iCloud 实际上确实会返回未排序的列表。直接取响应末尾的条目会得到错误的邮件——应先按数字排序。
  • 没有 MOVE,也没有 UIDPLUS。 移动邮件需要执行 COPY + \Deleted + EXPUNGE,而 EXPUNGE 会清除文件夹中所有 \Deleted 邮件。若文件夹中存在不在请求批次内的已删除邮件,move_emails 会拒绝运行,否则这些邮件会被一并销毁。
  • SEARCH CHARSET UTF-8 可用。 含重音符号的查询会在服务器端对整个邮箱进行搜索。对于拒绝此操作的服务器,客户端会采用备用方案,并通过响应中的 filtered_client_side 标记。
  • 文件夹名称使用改良版 UTF-7(RFC 3501),由 utf7.py 实现。
  • 字符集声明可能不可靠。 声明的字符集无法使用时,正文会回退到 latin-1;没有 text/plain 部分时,则会回退到去除标签后的 HTML。
安全说明
  • 凭据保存在 .env(已加入 gitignore)或环境变量中,绝不会写入代码。Settings.__repr__ 会省略密码。
  • 邮件内容是数据,不是指令。服务器会告知客户端,绝不可执行收到的邮件中包含的指令。
  • 只有在对话中用户批准确切内容或确切邮件列表后,才应运行 send_email 和 move_emails。
开发
uv run pytest -q

49 项离线测试——无需网络,也无需凭据。CI 会在 Linux、macOS 和 Windows 上使用 Python 3.11 至 3.13 运行这些测试。

src/icloud_mcp/
  config.py        env / .env loading
  utf7.py          modified UTF-7 for folder names
  models.py        frozen Pydantic models
  mime.py          header, body and attachment decoding
  imap_client.py   connection, LIST, STATUS, SELECT, FETCH
  search.py        SEARCH criteria, threading, multi-folder search
  smtp_client.py   MIME building, SMTP send, copy to Sent
  attachments.py   attachment extraction, filename sanitising
  drafts.py        APPEND to Drafts
  flags.py         \Seen, \Flagged, \Answered
  move.py          COPY + EXPUNGE with the anti-purge guard
  mailboxes.py     create, rename, delete (empty only)
  organize.py      rule-based filing
  server.py        tools, resources, prompts
  setup_wizard.py  interactive configuration
  cli.py           terminal checks
贡献

欢迎提交问题和拉取请求。测试必须可离线通过——不得有任何测试需要真实邮箱。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。