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 分