# iCloud MCP (npm · mcp-icloud)

Apple Mail, Calendar, Contacts, Reminders, Notes, Messages and Safari via AppleScript or iCloud

- Trust score: 90/100 (high trust)
- Change this week: +1
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `mcp-icloud`: 90/100 (this document), [markdown](https://verifymcp.io/servers/mrgo2-icloud-mcp/mcp-icloud.md), [page](https://verifymcp.io/servers/mrgo2-icloud-mcp/mcp-icloud)

## Channel facts

- Registry: `npm`
- Package: `mcp-icloud`
- Version: `2.1.3`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 90/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects semver 5.3.0, reached via imap > utf7 > semver. A fixed version is available.
  - No install/post-install scripts declared.
  - 11 of 47 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to MrGo2/icloud-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 39 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2646 tokens (~64/item across 41 items; 41 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 90/100
  - Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (37% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the iCloud MCP server?

iCloud MCP runs locally as an npm package, launched with npx -y mcp-icloud. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add mrgo2-icloud-mcp -- npx -y mcp-icloud
```

### Cursor

```json
{
  "mcpServers": {
    "mrgo2-icloud-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-icloud"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "mrgo2-icloud-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-icloud"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add mrgo2-icloud-mcp -- npx -y mcp-icloud
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mrgo2-icloud-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-icloud"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add mrgo2-icloud-mcp --command npx --arg -y --arg mcp-icloud
```

### Hermes

```yaml
mcp_servers:
  mrgo2-icloud-mcp:
    command: "npx"
    args: ["-y", "mcp-icloud"]
```

### Netclaw

```json
{
  "McpServers": {
    "mrgo2-icloud-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-icloud"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add mrgo2-icloud-mcp -t stdio -c npx -a -y mcp-icloud
```

### Other

```json
{
  "mcpServers": {
    "mrgo2-icloud-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-icloud"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 90, +1)

No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 89, −2)

- [functional] Stability: pass → 0.83

### 2026-09-17 (score 91, 0)

- [security] Stability: 0.97 → pass

### 2026-09-16 (score 91, +1)

No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-14 (score 90, +1)

No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-12 (score 89, +1)

No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 88, −3)

- [functional] Stability: pass → 0.80

### 2026-09-10 (score 91, 0)

- [security] Stability: 0.97 → pass

## MCP tools (41)

### `about` (~16 tokens)

About This Server

Returns information about this iCloud MCP server

### `check-auth-status` (~18 tokens)

Check Auth Status

Check if iCloud credentials are configured correctly

### `set-mode` (~57 tokens)

Switch Mode

Switch between LOCAL (AppleScript/macOS apps) and CLOUD (iCloud protocols) modes

Input parameters:

- `mode` (string, required): Mode to activate: "local" for AppleScript access to macOS apps, "cloud" for iCloud protocols

### `list-emails` (~63 tokens)

List Emails

Lists emails from a folder (default: inbox)

Input parameters:

- `count` (integer): Number of emails to retrieve (default: 25, max: 50)
- `folder` (string): Email folder (inbox, sent, drafts, trash, archive, junk)

Output parameters:

- `items` (array): Emails
- `total` (integer): Number of items returned

### `read-email` (~58 tokens)

Read Email

Reads the full content of an email by UID

Input parameters:

- `folder` (string): Email folder (default: inbox)
- `uid` (string, required): Email handle: the UID from list-emails in cloud mode, or the message ID in local mode

### `send-email` (~159 tokens)

Send Email

Sends an email immediately from the user's account to one or more comma-separated recipients, with optional CC, BCC and HTML body. Cloud mode delivers over SMTP and returns the new message ID; local mode sends through Mail.app, which only sends plain text and returns no ID. There is no draft step, so the message goes out as soon as the tool runs.

Input parameters:

- `bcc` (string): BCC recipient(s), comma-separated
- `body` (string, required): Email body content
- `cc` (string): CC recipient(s), comma-separated
- `isHtml` (boolean): Whether the body is HTML (default: false)
- `subject` (string, required): Email subject
- `to` (string, required): Recipient email address(es), comma-separated

### `search-emails` (~139 tokens)

Search Emails

Searches one mail folder (inbox by default) by free text, sender, subject and unread state; the filters combine as AND. Results carry the same summary fields as list-emails, including the ref handle that read-email and mark-as-read take.

Input parameters:

- `count` (integer): Max results (default: 25, max: 50)
- `folder` (string): Email folder to search (default: inbox)
- `from` (string): Filter by sender
- `query` (string): Text to search in email content
- `subject` (string): Filter by subject
- `unreadOnly` (boolean): Only show unread emails

Output parameters:

- `items` (array): Matching emails
- `total` (integer): Number of items returned

### `mark-as-read` (~79 tokens)

Mark Email Read/Unread

Marks an email as read or unread

Input parameters:

- `folder` (string): Email folder (default: inbox)
- `isRead` (boolean): Mark as read (true) or unread (false). Default: true
- `uid` (string, required): Email handle: the UID from list-emails in cloud mode, or the message ID in local mode

### `list-folders` (~14 tokens)

List Mail Folders

Lists all email folders

Output parameters:

- `items` (array): Mail folders
- `total` (integer): Number of items returned

### `list-events` (~98 tokens)

List Events

Lists upcoming calendar events within a look-ahead window (30 days by default, up to 365). Each event carries its title, start and end times, and the ref handle that update-event and delete-event take as their eventUrl argument.

Input parameters:

- `count` (integer): Number of events to retrieve (default: 25, max: 50)
- `daysAhead` (integer): Number of days to look ahead (default: 30)

Output parameters:

- `items` (array): Calendar events
- `total` (integer): Number of items returned

### `create-event` (~149 tokens)

Create Event

Creates a new calendar event

Input parameters:

- `calendarName` (string): Local mode: name of the calendar to add the event to (optional, uses the default)
- `calendarUrl` (string): Cloud mode: URL of the calendar to add the event to (optional, uses the first calendar)
- `description` (string): Event description (optional)
- `end` (string, required): End date/time in ISO 8601 format
- `location` (string): Event location (optional)
- `start` (string, required): Start date/time in ISO 8601 format (e.g., 2026-01-15T10:00:00)
- `summary` (string, required): Event title/summary

### `update-event` (~147 tokens)

Update Event

Updates an existing calendar event. Only the fields you pass are changed. In cloud mode the CalDAV property-merge preserves recurrence, invitees and alarms (experimental: the live round-trip is not yet verified).

Input parameters:

- `description` (string): New description (optional)
- `end` (string): New end date/time in ISO 8601 format (optional)
- `eventUrl` (string, required): Event handle from list-events: the URL in cloud mode, the UID in local mode
- `location` (string): New location (optional)
- `start` (string): New start date/time in ISO 8601 format (optional)
- `summary` (string): New event title (optional)

### `delete-event` (~38 tokens)

Delete Event

Deletes a calendar event

Input parameters:

- `eventUrl` (string, required): Event handle from list-events: the URL in cloud mode, the UID in local mode

### `list-calendars` (~15 tokens)

List Calendars

Lists all available calendars

Output parameters:

- `items` (array): Calendars
- `total` (integer): Number of items returned

### `list-contacts` (~80 tokens)

List Contacts

Lists contacts from the user's address book, up to 50 per call, including the handle that read-contact and delete-contact take. For a targeted lookup, search-contacts filters by name, email or phone instead of paging through the full list.

Input parameters:

- `count` (integer): Number of contacts to retrieve (default: 25, max: 50)

Output parameters:

- `items` (array): Contacts
- `total` (integer): Number of items returned

### `search-contacts` (~54 tokens)

Search Contacts

Search contacts by name, email, or phone

Input parameters:

- `count` (integer): Max results (default: 25, max: 50)
- `query` (string, required): Search query (name, email, or phone)

Output parameters:

- `items` (array): Matching contacts
- `total` (integer): Number of items returned

### `read-contact` (~36 tokens)

Read Contact

Get detailed information about a specific contact

Input parameters:

- `contactUrl` (string, required): URL or ID of the contact (from list-contacts output)

### `create-contact` (~148 tokens)

Create Contact

Creates a contact in the user's address book (Contacts.app in local mode, iCloud over CardDAV in cloud mode). Every field is optional, so pass at least a name (displayName, or firstName and lastName) along with any known email, phone, organization, job title or notes.

Input parameters:

- `displayName` (string): Full display name
- `email` (string): Email address
- `firstName` (string): First name
- `lastName` (string): Last name
- `notes` (string): Notes about the contact
- `organization` (string): Company/Organization
- `phone` (string): Phone number
- `title` (string): Job title

### `delete-contact` (~62 tokens)

Delete Contact

Permanently deletes a contact from the user's address book. Takes the handle returned by list-contacts or search-contacts; there is no undo through this server.

Input parameters:

- `contactUrl` (string, required): URL or ID of the contact to delete (from list-contacts output)

### `list-contact-accounts` (~29 tokens)

List Contact Accounts

Lists all contact accounts (iCloud, Google, Exchange, etc.) - LOCAL mode only

Output parameters:

- `items` (array): Contact accounts
- `total` (integer): Number of items returned

### `list-contact-groups` (~46 tokens)

List Contact Groups

Lists contact groups from all accounts or a specific account - LOCAL mode only

Input parameters:

- `accountId` (string): Optional account ID to filter groups by (from list-contact-accounts)

Output parameters:

- `items` (array): Contact groups
- `total` (integer): Number of items returned

### `list-reminder-lists` (~24 tokens)

List Reminder Lists

Lists all reminder lists from Reminders.app (LOCAL mode only)

Output parameters:

- `items` (array): list-reminder-lists
- `total` (integer): Number of items returned

### `list-reminders` (~77 tokens)

List Reminders

Lists reminders from a specific list or all lists (LOCAL mode only)

Input parameters:

- `count` (integer): Maximum number of reminders to return (default: 50)
- `includeCompleted` (boolean): Include completed reminders (default: false)
- `listName` (string): Name of the reminder list (optional, lists all if not provided)

Output parameters:

- `items` (array): list-reminders
- `total` (integer): Number of items returned

### `create-reminder` (~118 tokens)

Create Reminder

Creates a new reminder (LOCAL mode only)

Input parameters:

- `body` (string): Reminder notes/description
- `dueDate` (string): Due date in ISO format (e.g., 2026-01-15T10:00:00)
- `listName` (string): Name of the list to add to (default: Reminders)
- `name` (string, required): Reminder title (required)
- `priority` (integer): Priority level (0=none, 1=high, 5=medium, 9=low)

### `update-reminder` (~78 tokens)

Update Reminder

Updates an existing reminder (LOCAL mode only)

Input parameters:

- `body` (string): New notes/description
- `dueDate` (string): New due date in ISO format
- `name` (string): New title
- `priority` (integer): New priority level
- `reminderId` (string, required): ID of the reminder to update (required)

### `complete-reminder` (~56 tokens)

Complete Reminder

Marks a reminder as complete or incomplete (LOCAL mode only)

Input parameters:

- `completed` (boolean): Set to true to complete, false to uncomplete (default: true)
- `reminderId` (string, required): ID of the reminder (required)

### `delete-reminder` (~33 tokens)

Delete Reminder

Deletes a reminder (LOCAL mode only)

Input parameters:

- `reminderId` (string, required): ID of the reminder to delete (required)

### `search-reminders` (~49 tokens)

Search Reminders

Search reminders by text in name or body (LOCAL mode only)

Input parameters:

- `count` (integer): Maximum results to return (default: 25)
- `query` (string, required): Search text (required)

### `list-note-folders` (~21 tokens)

List Note Folders

Lists all folders in Notes.app (LOCAL mode only)

Output parameters:

- `items` (array): list-note-folders
- `total` (integer): Number of items returned

### `list-notes` (~57 tokens)

List Notes

Lists notes from a specific folder or all folders

Input parameters:

- `count` (integer): Maximum number of notes to return (default: 25)
- `folderName` (string): Name of the folder (optional, lists all if not provided)

Output parameters:

- `items` (array): list-notes
- `total` (integer): Number of items returned

### `read-note` (~32 tokens)

Read Note

Reads the content of a specific note

Input parameters:

- `noteId` (string, required): ID of the note to read (required)

### `create-note` (~52 tokens)

Create Note

Creates a new note

Input parameters:

- `body` (string): Note content/body
- `folderName` (string): Folder to create the note in (default: Notes)
- `title` (string, required): Note title (required)

### `search-notes` (~45 tokens)

Search Notes

Search notes by text in title or content

Input parameters:

- `count` (integer): Maximum results to return (default: 25)
- `query` (string, required): Search text (required)

### `list-chats` (~40 tokens)

List Chats

List recent iMessage/SMS conversations with contact names and last message preview

Input parameters:

- `limit` (integer): Number of conversations to show (default 20)

Output parameters:

- `items` (array): Recent conversations
- `total` (integer): Number of items returned

### `read-messages` (~97 tokens)

Read Messages

Read message history for a specific iMessage/SMS conversation

Input parameters:

- `attachments` (boolean): Include attachment info (default false)
- `chatId` (integer, required): Chat ID (rowid from list-chats)
- `end` (string): End date (ISO 8601, optional)
- `limit` (integer): Number of messages (default 20)
- `start` (string): Start date (ISO 8601, optional)

### `send-message` (~87 tokens)

Send Message

Sends an iMessage or SMS to a phone number or email handle, with an optional file attachment. The message is delivered as soon as the tool runs; there is no draft step and no recall.

Input parameters:

- `body` (string, required): Message content
- `file` (string): Path to file attachment (optional)
- `to` (string, required): Recipient phone number (with country code) or email

### `react-message` (~45 tokens)

React To Message

Send a tapback reaction (love, like, dislike, laugh, emphasis, question)

Input parameters:

- `chatId` (integer, required): Chat ID
- `type` (string, required): Reaction type

### `list-safari-tabs` (~20 tokens)

List Safari Tabs

Lists all open tabs in Safari across all windows

Output parameters:

- `items` (array): list-safari-tabs
- `total` (integer): Number of items returned

### `get-current-safari-url` (~24 tokens)

Get Current Safari URL

Gets the URL and title of the current/active Safari tab

### `open-safari-url` (~55 tokens)

Open URL In Safari

Opens a URL in Safari (new tab or new window)

Input parameters:

- `inNewWindow` (boolean): Open in new window instead of new tab (default: false)
- `url` (string, required): URL to open (required)

### `close-safari-tab` (~60 tokens)

Close Safari Tab

Closes a Safari tab

Input parameters:

- `tabIndex` (integer): Tab index to close (0-based). If omitted, closes the current tab.
- `windowIndex` (integer): Window index (0-based, default: 0 for front window)

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/mrgo2-icloud-mcp/mcp-icloud#diagnostics

## Score history

- 2026-09-20: 90
- 2026-09-19: 89
- 2026-09-18: 89
- 2026-09-17: 91
- 2026-09-16: 91
- 2026-09-15: 90
- 2026-09-14: 90
- 2026-09-13: 89
- 2026-09-12: 89
- 2026-09-11: 88
- 2026-09-10: 91
- 2026-09-09: 91
- 2026-09-08: 91
- 2026-09-07: 91
- 2026-09-06: 90
- 2026-09-05: 90
- 2026-09-04: 89
- 2026-09-03: 89
- 2026-09-02: 88
- 2026-09-01: 88
- 2026-08-31: 87
- 2026-08-30: 87
- 2026-08-29: 87
- 2026-08-28: 86
- 2026-08-27: 86
- 2026-08-26: 85
- 2026-08-25: 84
- 2026-08-24: 83
- 2026-08-23: 83
- 2026-08-22: 82

## Common questions

### What is the iCloud MCP server?

iCloud MCP is listed in the public MCP registry as io.github.MrGo2/icloud-mcp. Apple Mail, Calendar, Contacts, Reminders, Notes, Messages and Safari via AppleScript or iCloud. This page covers its npm package (mcp-icloud).

### Is the iCloud MCP server safe to use?

iCloud MCP scores 90 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the iCloud MCP server expose?

iCloud MCP exposes 41 tools: about, check-auth-status, set-mode, list-emails, read-email, and 36 more. Their descriptions and schemas cost roughly 2,575 tokens of context every time the server is loaded.

### Is the iCloud MCP server still maintained?

iCloud MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the iCloud MCP server under?

iCloud MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/mcp-icloud
- Socket report: https://socket.dev/npm/package/mcp-icloud
- Repository: https://github.com/MrGo2/icloud-mcp
- Changelog RSS feed: https://verifymcp.io/servers/mrgo2-icloud-mcp/mcp-icloud.xml
- Changelog JSON feed: https://verifymcp.io/servers/mrgo2-icloud-mcp/mcp-icloud.json
- HTML version of this page: https://verifymcp.io/servers/mrgo2-icloud-mcp/mcp-icloud
