iCloud Mail
概览
作者提供的说明(英文原文)
Read, search, draft, send and file iCloud Mail over IMAP and SMTP. No tool destroys mail.
PopNx MCP 的三大支柱
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
- 用户评价i暂无评价评价功能将在后续阶段与账户功能一起开放
- 我们的基础检查i1 项中通过 1 项依据公开信息检查;尚未扫描代码
- 使用情况i非常新↓ 54/周 · ★ –
它能帮你做什么
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
- 连接方式: 在你的电脑上运行
- 传输方式: stdio
- 分类: 搜索与 AI 记忆
- 你需要填写:ICLOUD_EMAIL, ICLOUD_APP_PASSWORD
安装
选择你使用的 AI 应用,然后复制设置。
安装之前
- 基础检查:1 项中通过 1 项
- 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
- 需要你自己填写:
ICLOUD_EMAIL,ICLOUD_APP_PASSWORD,ICLOUD_DISPLAY_NAME
标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
- PyPI已安装 Python 的 uv(用于 uvx 命令)
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"icloud": {
"command": "uvx",
"args": [
"icloud-mail-mcp"
],
"env": {
"ICLOUD_EMAIL": "your-value",
"ICLOUD_APP_PASSWORD": "your-value",
"ICLOUD_DISPLAY_NAME": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add icloud --env ICLOUD_EMAIL=your-value --env ICLOUD_APP_PASSWORD=your-value --env ICLOUD_DISPLAY_NAME=your-value -- uvx icloud-mail-mcp运行前请先填写空着的值。
或者自己复制设置
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"icloud": {
"command": "uvx",
"args": [
"icloud-mail-mcp"
],
"env": {
"ICLOUD_EMAIL": "your-value",
"ICLOUD_APP_PASSWORD": "your-value",
"ICLOUD_DISPLAY_NAME": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
或者自己复制设置
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"icloud": {
"type": "stdio",
"command": "uvx",
"args": [
"icloud-mail-mcp"
],
"env": {
"ICLOUD_EMAIL": "your-value",
"ICLOUD_APP_PASSWORD": "your-value",
"ICLOUD_DISPLAY_NAME": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
需要你填写的值
- Your iCloud address, for example you@icloud.com.
- An app-specific password generated at account.apple.com. iCloud rejects your main password over IMAP.
ICLOUD_DISPLAY_NAMEenvName shown in the From header of sent mail. Defaults to the local part of the address.
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它能做什么
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
基础检查i
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月9日
- ✓ 通过
作者与仓库一致
注册名称已通过 GitHub 账户 JulienRabault 验证,该账户拥有此仓库
- … 尚未检查
仍在维护
我们还没有从 GitHub 读取这个仓库
- … 尚未检查
有许可证
我们还没有从 GitHub 读取这个仓库
- – 不适用
端点有响应
它在你的电脑上运行,没有互联网端点
- – 不适用
使用 OAuth 登录
在你的电脑上运行,改用本地设置
- … 尚未检查
工具描述中没有隐藏指令
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与“搜索与 AI 记忆”中的其他服务器比较i
- 星标数多于此分类中其他 5747 个服务器的 0%
- 发布到注册中心的时间比此分类中其他 5747 个服务器的 46% 更新
- 基础检查结果等于或优于此分类中其他 5747 个服务器的 100%
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
常见问题
iCloud Mail 安全吗?
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
它需要哪些密钥或代码?
你需要填写:ICLOUD_EMAIL, ICLOUD_APP_PASSWORD
它在我的电脑上运行还是在云端?
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
它还在维护吗?
GitHub 仓库最后更新于–,最新版本(0.1.1)于2个月前进入注册中心。
哪些应用可以使用它?
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。
有什么可以替代它?
同一分类中有:Context7, Codebase Memory, Exa
替代选择
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Codebase Memory
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Exa
Connect AI agents to Exa for web search, content fetching, and multi-step research.
作者的 README
打开 README
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
iCloud Mail 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 ... readonlyandBODY.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_foldersfinds them where an inbox-only search can't. - Drafts before sends.
save_draftputs a message in Drafts for you to review.send_emailexists, but it is separate and explicit. - Nothing destroys mail. There is no tool that deletes messages, and
delete_mailboxrefuses 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:
uvx --from icloud-mail-mcp icloud-mcp-setup # interactive configuration
uvx --from icloud-mail-mcp icloud-mcp # run the server
From source:
git clone https://github.com/JulienRabault/icloud-mcp.git
cd icloud-mcp uv sync uv 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:
{
"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
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:
[mcp_servers.icloud-mail]
command = "uv" args = ["run", "--directory", "/path/to/icloud-mcp", "python", "-m", "icloud_mcp"]
</details>
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:
| Tool | Description |
|---|---|
list_folders | List folders, optionally with message and unread counts |
folder_status | Counts for one folder without listing messages |
search_emails | Search one folder: text, sender, recipient, subject, dates, flags, size |
search_all_folders | The same search across every folder at once |
read_email | Full message: decoded body, optional HTML, attachment metadata |
get_thread | Rebuild a conversation, optionally with each message body |
save_attachments | Write attachments to disk and return their paths |
Write — explicit by design:
| Tool | Description |
|---|---|
save_draft | Put a message in Drafts. Nothing is sent |
set_flag | Read/unread, flagged, answered. Reversible |
create_mailbox | Create a folder, accented names included |
rename_mailbox | Rename a folder, messages follow |
delete_mailbox | Delete an empty folder. Refuses while it holds mail |
auto_organize | File messages by rules. Simulates unless dry_run=false |
move_emails | Move between folders. Simulates unless dry_run=false |
send_email | Actually 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
| URI | Content |
|---|---|
icloud://folders | Every folder with message and unread counts |
icloud://unread | Unread messages in the inbox |
Prompts
| Prompt | Purpose |
|---|---|
triage_inbox | Sort recent mail into action required / info / waiting / ignorable |
draft_reply | Read a message and its thread, draft a reply into Drafts |
follow_up | Reconstruct 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:
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
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:
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, andEXPUNGEpurges *every*\Deletedmessage in the folder.move_emailsrefuses 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_sidein 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/plainpart.
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_emailandmove_emailsare meant to run only after the user approves the exact content or the exact message list in the conversation.
Development
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