
Icloud Mcp
io.github.eodozzyPublished by GitHub account eodozzyv0.1.1Updated Oct 24, 2026
Read-only-by-default MCP server for iCloud mail, calendar, and contacts (IMAP/CalDAV/CardDAV).
Overview
Local MCP server that gives an assistant read-only access to iCloud mail, calendar and contacts, with opt-in, confirmed write tools.
- What you can do
- List, search and read mail: folders, inbox listing, full-text search, full message bodies
- List and search calendar events in a date window, and list calendar names
- List and search contacts by name, organization or email
- Send, reply to and forward mail (opt-in write tools)
- Create, update and delete events and contacts (opt-in write tools)
- Expose recent inbox mail and today's events as passive resources
- When to use it
- Useful when you want an assistant to look through your iCloud inbox, schedule or address book without copying data elsewhere, for example to summarize recent mail, find an event or look up a contact. Writes are only worth enabling if you want the assistant to send mail or change events and contacts.
- Requirements
- Runs locally over stdio as a Python 3.11+ package (pip or uvx). Needs ICLOUD_USERNAME (Apple ID email) and an Apple app-specific password, preferably stored in the OS keyring (ICLOUD_KEYRING_SERVICE) or, as a fallback, in ICLOUD_APP_PASSWORD. Network access to iCloud IMAP, SMTP, CalDAV and CardDAV endpoints, which can be overridden by environment variables.
Installation
In SourceWeft
- Open Icloud Mcp 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-mcp
[PyPI] [Python] [License: MIT]
A Model Context Protocol server that gives AI assistants read-only access to your iCloud mail and calendar over IMAP and CalDAV. Credentials live in your OS keyring (macOS Keychain by default) — never in a config file or the repo.
Defaults target iCloud, but every endpoint is overridable, so it works against any standard IMAP/CalDAV provider.
Status
Read-only by default; writes are strictly opt-in. Mail, calendar, and contacts
can be listed, searched, and read with no ability to change anything: the IMAP
connection is opened read-only and bodies are fetched with BODY.PEEK[], so
messages are never even marked as read.
Mutating tools span mail (send_mail, reply_mail, forward_mail), calendar
(create_event, update_event, delete_event), and contacts (create_contact,
update_contact, delete_contact) — but all are disabled unless you set
ICLOUD_ENABLE_WRITES=1, and even then every write requires an interactive
confirmation (MCP elicitation) before it runs. See Writes (opt-in).
Writes (opt-in)
Mutations are gated two ways:
- Operator switch — write tools refuse with an explanatory error unless
ICLOUD_ENABLE_WRITES=1is set in the server's environment. - Per-action confirmation — when enabled, each write tool calls back to the client to confirm the exact action before executing. Destructive operations (delete event / contact) are gated identically — no extra force flag, just the same confirmation.
iCloud issues a single app-specific password covering IMAP, SMTP, CalDAV, and CardDAV — there is no scoped "write-only" credential — so write-safety is structural: mail is sent over a separate, fresh SMTP connection (the read path's IMAP client has no send capability), and the opt-in flag + confirmation guard every mutation.
Install
Or run it without installing — handy for MCP clients that launch the server on demand:
To install the latest unreleased code straight from GitHub:
Or for local development:
Requires Python 3.11+.
Credentials
Generate an app-specific password for your Apple ID (never use your main password), then store it in your keyring:
On other platforms, the cross-platform keyring
library is used — keyring set icloud-mcp [email protected] also works anywhere.
The username comes from the ICLOUD_USERNAME environment variable. Resolution
order for the password:
- OS keyring (
ICLOUD_KEYRING_SERVICE, defaulticloud-mcp, + username) ICLOUD_APP_PASSWORDenvironment variable (fallback)
To reuse an existing keyring entry (e.g. one named my-icloud), set
ICLOUD_KEYRING_SERVICE=my-icloud.
Configuration
Set ICLOUD_USERNAME (required). All else is optional — see
.env.example for the full list of endpoint/timezone overrides.
Register with an MCP client
The server speaks MCP over stdio: a client launches the icloud-mcp command
as a subprocess and talks to it over stdin/stdout. "Installing" it into a client
just means telling that client which command to run and which env vars to pass —
the password itself stays in the keyring, never in the client config.
If icloud-mcp isn't on your PATH (e.g. you installed into a virtualenv),
use the absolute path to the launcher, e.g. /path/to/repo/.venv/bin/icloud-mcp.
Claude Code
Then claude mcp list to confirm. Add -s user to make it available across all
projects rather than just the current one.
Claude Desktop
Add the server to Claude Desktop's config file. On macOS this is:
(On Windows: %APPDATA%\Claude\claude_desktop_config.json.)
The easiest way to open it is Settings → Developer → Edit Config. Add an
mcpServers key alongside whatever is already in the file — do not paste a
second top-level { ... } object, or the file becomes invalid JSON:
If the file already contains other keys, merge mcpServers in as a sibling
(remember the comma between keys):
Then fully quit Claude Desktop (⌘Q, not just closing the window) and reopen it. The server shows up as a Local MCP server and its tools become available.
Notes:
- First call prompts for Keychain access. macOS asks whether
icloud-mcpmay read the keyring item; click Always Allow to avoid repeat prompts. - Claude Desktop may rewrite this file when it saves its own preferences,
dropping hand-added keys it doesn't recognize. If the server disappears after
you change other settings, just re-add the
mcpServersblock.
Tools & resources
Tools (model-invoked):
⚠️ Write tools require ICLOUD_ENABLE_WRITES=1 and confirm each action — see
Writes (opt-in).
Resources (passive context):
Behavior notes
- Empty/missing headers: messages whose
Subjectheader is absent or present-but-blank render as(no subject); a blank/absentFromrenders as(unknown). (Some mail has an empty subject line rather than no subject line at all — both are normalized.) - Snippets prefer the
text/plainpart; for HTML-only mail, tags are stripped (<style>/<script>/<head>content discarded) so you still get a readable preview. - Double-wrapped bodies: some senders (e.g. USPS Informed Delivery) embed a
redundant MIME header block at the top of the decoded body. A leading
Content-*/MIME-Versionheader block is stripped so those headers don't leak into the snippet or body. since_dateis date-granular and evaluated in the IMAP server's timezone (UTC for iCloud), so asince_dateof today can include late-yesterday messages in your local time.
Development
Security notes
- The app-specific password lives in the OS keyring only — never in
.env, never committed. - Read access (mail, calendar, contacts) cannot mutate anything; the IMAP session is opened read-only.
- Writes are off by default. They require
ICLOUD_ENABLE_WRITES=1and an interactive confirmation per action, and mail is sent over a separate SMTP connection isolated from the read path. - An app-specific password can be revoked at any time from appleid.apple.com without affecting your Apple ID.
License
MIT — see LICENSE.
Not affiliated with, endorsed by, or sponsored by Apple Inc. iCloud is a trademark of Apple Inc.
Source: README.md at commit 0d4886d
Tools
0Version history
1- v0.1.1LatestSep 16, 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
