iCloud Mail

io.github.JulienRabault由 GitHub 账号 JulienRabault 发布v0.1.1更新于 Oct 24, 2026

Read, search, draft, send and file iCloud Mail over IMAP and SMTP. No tool destroys mail.

已验证STDIO仅桌面效率与工作流沟通与协作

概览

AI 生成的概览

让助手通过 IMAP 和 SMTP 读取、搜索、起草、归档和发送 iCloud 邮件,默认只读且没有销毁邮件的工具。

可以做什么
通过 IMAP 和 SMTP 连接 iCloud 邮箱,提供列出文件夹、在单个或全部文件夹中搜索、读取邮件与会话、把附件保存到磁盘等工具。写入类工具包括保存草稿、设置标记、创建、重命名和删除空文件夹、按规则归档、移动邮件以及发送邮件。读取工具使用只读选择和预览式抓取,移动或整理操作在未明确要求执行时只做模拟。
适用场景
适合让助手整理 iCloud 收件箱、查找被规则归档到收件箱之外的邮件、总结会话、准备待审阅的草稿,或按规则归档邮件。也适合希望邮件处理留在本机、不经过第三方邮件服务的用户。
运行要求
以本地 Python 包方式运行(需要 Python 3.11 或更高版本以及 uv)。需要启用双重认证的 iCloud 账户,并通过 ICLOUD_APP_PASSWORD 提供 App 专用密码,通过 ICLOUD_EMAIL 提供 iCloud 地址;ICLOUD_DISPLAY_NAME 可选。需要访问 iCloud 的 IMAP 和 SMTP 网络,修改配置后需重启桌面客户端。
安装前请注意
ICLOUD_APP_PASSWORD 中的 App 专用密码可访问邮箱,应存放在被 git 忽略的 .env 或环境变量中。send_email 会直接发送,没有草稿步骤也无法撤销;move_emails 和 auto_organize 在非模拟模式下会改变邮箱状态。来自邮件的附件文件名被视为不可信输入。收到的邮件是数据而非指令,服务器要求客户端不要执行邮件内的指示。

安装

在 SourceWeft 中

  1. 打开 控制台中的 iCloud Mail,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

iCloud Mail MCP

[License: MIT] [PyPI] [Python 3.11+] [MCP]

A Model Context Protocol (MCP) server for iCloud Mail. Lets an LLM read, search, file and send your Apple mail over IMAP and SMTP.

Runs entirely on your machine: your credentials and your mail never reach a third party. Networking and MIME parsing use only the Python standard library.

Key Features

  • Read-only by default. Search and read tools use SELECT ... readonly and BODY.PEEK — nothing is marked as read, moved or deleted behind your back.
  • Searches every folder, not just the inbox. Replies get filed away by mail rules; search_all_folders finds them where an inbox-only search can't.
  • Drafts before sends. save_draft puts a message in Drafts for you to review. send_email exists, but it is separate and explicit.
  • Nothing destroys mail. There is no tool that deletes messages, and delete_mailbox refuses any folder that still holds some.
  • Handles real iCloud MIME. Modified UTF-7 folder names, quoted-printable, lying charsets, HTML-only messages, accented server-side search.

Requirements

  • Python 3.11 or newer, and uv
  • An iCloud account with two-factor authentication enabled
  • An app-specific password — iCloud rejects your main password over IMAP

Getting started

Once published to PyPI, no clone is needed:

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

From source:

bash
git clone https://github.com/JulienRabault/icloud-mcp.gitcd icloud-mcpuv syncuv run python -m icloud_mcp.setup

The setup command asks for your address and app-specific password, tests the connection, writes .env, then prints the exact config block for your client.

Generate the app-specific password at account.apple.com → Sign-In and Security → App-Specific Passwords.

Standard config works in most clients:

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

Check with claude mcp list.

Claude Desktop

Add the standard config to claude_desktop_config.json:

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

On Windows, use the absolute path to uv.exe: desktop clients don't always inherit your shell PATH.

Codex

In ~/.codex/config.toml:

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

Use the standard config block in the MCP settings file of your editor (.cursor/mcp.json, ~/.codeium/windsurf/mcp_config.json, or the VS Code MCP settings).

MCP servers load at client startup — restart the client after editing its config.

Tools

Read — none of these modify the mailbox:

ToolDescription
list_foldersList folders, optionally with message and unread counts
folder_statusCounts for one folder without listing messages
search_emailsSearch one folder: text, sender, recipient, subject, dates, flags, size
search_all_foldersThe same search across every folder at once
read_emailFull message: decoded body, optional HTML, attachment metadata
get_threadRebuild a conversation, optionally with each message body
save_attachmentsWrite attachments to disk and return their paths

Write — explicit by design:

ToolDescription
save_draftPut a message in Drafts. Nothing is sent
set_flagRead/unread, flagged, answered. Reversible
create_mailboxCreate a folder, accented names included
rename_mailboxRename a folder, messages follow
delete_mailboxDelete an empty folder. Refuses while it holds mail
auto_organizeFile messages by rules. Simulates unless dry_run=false
move_emailsMove between folders. Simulates unless dry_run=false
send_emailActually sends. No draft step, no undo

No tool destroys mail. delete_mailbox refuses a folder that still holds messages — move them out first, which keeps the decision with you.

Attachment bytes never pass through the model: save_attachments writes files and returns paths. Filenames arriving from email are sanitised — they are hostile input, not trusted paths.

Resources

URIContent
icloud://foldersEvery folder with message and unread counts
icloud://unreadUnread messages in the inbox

Prompts

PromptPurpose
triage_inboxSort recent mail into action required / info / waiting / ignorable
draft_replyRead a message and its thread, draft a reply into Drafts
follow_upReconstruct an exchange with a contact, say who owes whom a reply

Automation without an MCP client

examples/ holds standalone scripts using the same modules — point cron or Task Scheduler at them:

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

All support --json for piping. See examples/README.md.

Bundled skill

skills/mailbox-search/ is a Claude Code skill that forces a sweep of every folder before concluding a message doesn't exist:

bash
cp -r skills/mailbox-search ~/.claude/skills/

iCloud quirks handled here

Worth knowing if you're writing your own IMAP client against iCloud:

  • SEARCH returns UIDs out of order. RFC 3501 doesn't guarantee ordering, and iCloud genuinely returns unsorted lists. Taking the tail of the response gives you the wrong messages — sort numerically first.
  • No MOVE, no UIDPLUS. Moving means COPY + \Deleted + EXPUNGE, and EXPUNGE purges every \Deleted message in the folder. move_emails refuses to run when the folder holds deleted messages outside the requested batch, which would otherwise be destroyed.
  • SEARCH CHARSET UTF-8 works. Accented queries run server-side across the whole mailbox. A client-side fallback covers servers that refuse, and flags it via filtered_client_side in the response.
  • Folder names use modified UTF-7 (RFC 3501), implemented in utf7.py.
  • Charsets lie. Bodies fall back to latin-1 when the declared charset fails, and to stripped HTML when there's no text/plain part.

Security notes

  • Credentials live in .env (gitignored) or the environment, never in code. Settings.__repr__ omits the password.
  • Email content is data, not instructions. The server tells clients never to act on directives found inside a received message.
  • send_email and move_emails are meant to run only after the user approves the exact content or the exact message list in the conversation.

Development

bash
uv run pytest -q

49 offline tests — no network, no credentials. CI runs them on Linux, macOS and Windows against Python 3.11 to 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

Contributing

Issues and pull requests welcome. Tests must pass offline — no test may require a real mailbox.

License

MIT

来源:README.md,提交 efee3ee

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.1最新Sep 22, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分