
iCloud Mail
io.github.JulienRabaultPublished by GitHub account JulienRabaultv0.1.1Updated Oct 24, 2026
Read, search, draft, send and file iCloud Mail over IMAP and SMTP. No tool destroys mail.
Overview
Lets an assistant read, search, draft, file and send iCloud Mail over IMAP and SMTP, with read-only defaults and no mail-destroying tools.
- What you can do
- Connects to an iCloud mailbox over IMAP and SMTP and exposes tools to list folders, search one folder or all folders, read messages and threads, and save attachments to disk. Write tools cover saving drafts, setting flags, creating, renaming and deleting empty folders, rule-based filing, moving messages, and sending email. Read tools use read-only selection and peek fetches, and move or organize operations simulate unless explicitly told to apply.
- When to use it
- Useful when an assistant should triage an iCloud inbox, find messages filed outside the inbox, summarize threads, prepare drafts for review, or file mail by rules. It fits users who want mail handling to stay on their own machine rather than through a third-party mail service.
- Requirements
- Runs locally as a Python package (Python 3.11 or newer, with uv). Needs an iCloud account with two-factor authentication and an app-specific password supplied as ICLOUD_APP_PASSWORD, plus the iCloud address in ICLOUD_EMAIL; ICLOUD_DISPLAY_NAME is optional. Network access to iCloud IMAP and SMTP is required, and desktop clients must be restarted after configuration changes.
Installation
In SourceWeft
- Open iCloud Mail in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
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 ... 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:
From source:
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:
Claude Code
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:
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:
Write — explicit by design:
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
Prompts
Automation without an MCP client
examples/ holds standalone scripts using the same modules — point cron or Task
Scheduler at them:
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:
iCloud quirks handled here
Worth knowing if you're writing your own IMAP client against iCloud:
SEARCHreturns 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, noUIDPLUS. Moving meansCOPY+\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-8works. Accented queries run server-side across the whole mailbox. A client-side fallback covers servers that refuse, and flags it viafiltered_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
49 offline tests — no network, no credentials. CI runs them on Linux, macOS and Windows against Python 3.11 to 3.13.
Contributing
Issues and pull requests welcome. Tests must pass offline — no test may require a real mailbox.
License
MIT
Source: README.md at commit efee3ee
Tools
0Version history
1- v0.1.1LatestSep 22, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts