# Mail.app (npm · @p-l-ta/mail-mcp)

Search, read, send, and manage email via macOS Mail.app across all configured accounts.

- Trust score: 80/100 (high trust)
- Change this week: +34
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-04

## Components

- npm · `@p-l-ta/mail-mcp`: 80/100 (this document), [markdown](https://verifymcp.io/servers/p-l-ta-mail-mcp/p-l-ta-mail-mcp.md), [page](https://verifymcp.io/servers/p-l-ta-mail-mcp/p-l-ta-mail-mcp)

## Channel facts

- Registry: `npm`
- Package: `@p-l-ta/mail-mcp`
- Version: `1.3.5`
- 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-08-04.

- **Supply Chain Security**: 86/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to p-l-ta/mail-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 24 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 81/100
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 2285 tokens (~95/item across 24 items; 24 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 83% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add p-l-ta-mail-mcp -- npx -y @p-l-ta/mail-mcp
```

### Codex

```bash
codex mcp add p-l-ta-mail-mcp -- npx -y @p-l-ta/mail-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "p-l-ta-mail-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@p-l-ta/mail-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add p-l-ta-mail-mcp --command npx --arg -y --arg @p-l-ta/mail-mcp
```

### Hermes

```yaml
mcp_servers:
  p-l-ta-mail-mcp:
    command: "npx"
    args: ["-y", "@p-l-ta/mail-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "p-l-ta-mail-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@p-l-ta/mail-mcp"
      ]
    }
  }
}
```

## 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-08-04 (score 80, +4)

- [functional improvement] Stability: unverified → 0.27

### 2026-08-02 (score 76, +56)

- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [security] The attested source repository moved: p-l-ta/mail-mcp
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional] Licence: MIT

### 2026-07-31 (score 20, −8)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 28, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-28 (score 46, +22)

- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 83
- [functional] First check of Schema quality: pass
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 24)

First indexed and scored.

## MCP tools (24)

### `search_emails` (~183 tokens)

Search Mail.app messages via the Envelope Index database. Returns rich metadata including RFC message-id (usable with read_email, reply_to_email, set_message_flags).

Input parameters:

- `account` (string): Substring match against the full mailbox URL (host and path). Use the account hostname to target an account (e.g. 'icloud'), or a mailbox path segment to target a specific folder (e.g. 'INBOX', 'Amtr…
- `from` (string): Substring match on sender address or display name
- `include_deleted` (boolean)
- `limit` (integer)
- `query` (string): Free-text search across subject, sender, and body summary. Omit to list-only by other filters.
- `since` (string): ISO date — only messages on or after this date
- `subject` (string): Substring match on subject

### `read_email` (~67 tokens)

Read full body of a message by its RFC message-id. Uses Mail.app via AppleScript so it works for IMAP/iCloud/Exchange messages without filesystem access.

Input parameters:

- `message_id` (string, required): RFC message-id (with or without angle brackets) from search_emails / list_recent results

### `list_accounts_and_mailboxes` (~25 tokens)

List all configured Mail.app accounts and their mailboxes with unread counts.

### `list_recent` (~55 tokens)

List recent messages in a mailbox of a specific account.

Input parameters:

- `account` (string, required): Account name as shown in Mail.app
- `limit` (integer)
- `mailbox` (string)
- `unread_only` (boolean)

### `send_email` (~75 tokens)

Send a new email via Mail.app from an existing account.

Input parameters:

- `body` (string, required)
- `cc` (string): CC recipient email address
- `from_account` (string): Account name to send from (matches Mail.app account name)
- `subject` (string, required)
- `to` (string, required): Primary recipient email address

### `reply_to_email` (~50 tokens)

Reply to an existing message identified by RFC message-id.

Input parameters:

- `body` (string, required)
- `message_id` (string, required): RFC message-id from search/list results
- `reply_all` (boolean)

### `set_message_flags` (~46 tokens)

Set read and/or flagged status on a message identified by RFC message-id.

Input parameters:

- `flagged` (boolean)
- `message_id` (string, required)
- `read` (boolean)

### `move_email` (~103 tokens)

Move a message to a different mailbox by RFC message-id. Use list_accounts_and_mailboxes to get exact mailbox names.

Input parameters:

- `destination_account` (string): Account name to disambiguate if multiple accounts share the mailbox name
- `destination_mailbox` (string, required): Exact mailbox name from list_accounts_and_mailboxes (slash-pathed for nested, e.g. 'Folders/Amtrak')
- `message_id` (string, required): RFC message-id (with or without angle brackets)

### `trash_email` (~44 tokens)

Move a message to Deleted Messages (trash) by RFC message-id. Does not permanently delete.

Input parameters:

- `message_id` (string, required): RFC message-id (with or without angle brackets)

### `create_mailbox` (~65 tokens)

Create a new mailbox (folder) in a Mail.app account.

Input parameters:

- `account` (string): Account name to create it in. Required when multiple accounts are configured; use name from list_accounts_and_mailboxes.
- `name` (string, required): Name for the new mailbox/folder

### `bulk_mark_read` (~99 tokens)

Mark multiple messages as read in one call — by mailbox, sender substring, or both. Far faster than calling set_message_flags per message.

Input parameters:

- `account` (string): Restrict to this account name.
- `from` (string): Substring to match against the sender field. At least one of mailbox or from is required.
- `mailbox` (string): Restrict to this exact mailbox name. At least one of mailbox or from is required.

### `bulk_apply` (~169 tokens)

Apply one action (mark_read, mark_unread, flag, unflag, trash, or move) to a list of messages by RFC message-id, in a single batched call — far faster than calling set_message_flags/trash_email/move_email once per message.

Input parameters:

- `destination_account` (string): Account name to disambiguate if multiple accounts share the destination mailbox name
- `destination_mailbox` (string): Required when op is 'move'. Exact mailbox name from list_accounts_and_mailboxes.
- `message_ids` (array, required): RFC message-ids (with or without angle brackets) from search/list results
- `op` (string, required): Action to apply to every message: mark_read, mark_unread, flag, unflag, trash, or move (move requires destination_mailbox)

### `bulk_flag` (~153 tokens)

Flag or unflag multiple messages in one call — by mailbox, sender substring, or both. Queries the Envelope Index for matching IDs then updates in a single batched AppleScript call.

Input parameters:

- `account` (string): Restrict to this account (substring match against mailbox URL host).
- `flagged` (boolean, required): Target flagged state to apply to every matching message.
- `from` (string): Substring to match against the sender address or display name. At least one of mailbox or from is required.
- `limit` (integer): Maximum number of messages to update in one call.
- `mailbox` (string): Restrict to this exact mailbox name (matched against mailbox URL). At least one of mailbox or from is required.

### `bulk_trash` (~138 tokens)

Move multiple messages to trash in one call — by mailbox, sender substring, or both. Queries the Envelope Index for matching IDs then trashes in a single batched AppleScript call.

Input parameters:

- `account` (string): Restrict to this account (substring match against mailbox URL host).
- `from` (string): Substring to match against the sender address or display name. At least one of mailbox or from is required.
- `limit` (integer): Maximum number of messages to trash in one call.
- `mailbox` (string): Restrict to this exact mailbox name (matched against mailbox URL). At least one of mailbox or from is required.

### `bulk_move` (~194 tokens)

Move multiple messages to a destination mailbox in one call — by mailbox, sender substring, or both. Queries the Envelope Index for matching IDs then moves in a single batched AppleScript call.

Input parameters:

- `account` (string): Restrict source to this account (substring match against mailbox URL host).
- `destination_account` (string): Account name to disambiguate if multiple accounts share the destination mailbox name
- `destination_mailbox` (string, required): Exact mailbox name from list_accounts_and_mailboxes (slash-pathed for nested, e.g. 'Folders/Amtrak')
- `from` (string): Substring to match against the sender address or display name. At least one of mailbox or from is required.
- `limit` (integer): Maximum number of messages to move in one call.
- `mailbox` (string): Restrict source to this mailbox name (matched against mailbox URL). At least one of mailbox or from is required.

### `get_unsubscribe_link` (~55 tokens)

Extract unsubscribe URLs from a message — checks the List-Unsubscribe header first (reliable), then scans the plain-text body as a fallback.

Input parameters:

- `message_id` (string, required): RFC message-id (with or without angle brackets)

### `list_senders` (~179 tokens)

Return a grouped count of senders across mailboxes — who sends how many messages, how many are unread, and when the last arrived. By default excludes Deleted Messages, Junk, Sent, and Drafts so counts reflect live mail only. Ideal for identifying bulk senders and noise.

Input parameters:

- `account` (string): Account host/name substring to restrict to
- `include_system_mailboxes` (boolean): When true, include Deleted Messages, Junk, Sent Messages, and Drafts in unscoped queries. Has no effect when mailbox is specified.
- `limit` (integer): Max senders to return, ordered by message count desc
- `mailbox` (string): Mailbox name or URL substring to restrict to (e.g. 'INBOX', 'Amtrak'). When omitted, covers all non-system mailboxes (see include_system_mailboxes).

### `empty_mailbox` (~108 tokens)

Delete every message in a mailbox at once — moves to Deleted Messages, or permanently removes if the mailbox is already Deleted Messages/Trash. Use for Junk, Trash, or bulk-cleanup folders.

Input parameters:

- `account` (string): Account name to disambiguate when the same mailbox name exists in multiple accounts
- `mailbox_name` (string, required): Exact mailbox name to empty (e.g. 'Junk', 'Deleted Messages', 'Other Inbox'). Use list_accounts_and_mailboxes for exact names.

### `list_rules` (~28 tokens)

List all Mail.app rules with their conditions and actions. Reads directly from SyncedRules.plist.

### `create_rule` (~104 tokens)

Create a new Mail.app rule. A timestamped backup of SyncedRules.plist is made before writing. Mail.app may need to be restarted for the rule to take effect.

Input parameters:

- `actions` (object, required): At least one action should be set.
- `conditions` (array, required): One or more match conditions.
- `match_all` (boolean): true = ALL conditions must match (AND); false = ANY (OR).
- `name` (string, required): Display name for the rule.

### `update_rule` (~131 tokens)

Update an existing Mail.app rule by its RuleId (use list_rules to find IDs). A timestamped backup is made before writing. Mail.app may need to be restarted for changes to take effect.

Input parameters:

- `actions` (object): Partial actions update — only supplied fields are changed.
- `conditions` (array): Replace the full conditions list. Omit to leave unchanged.
- `match_all` (boolean): true = ALL (AND); false = ANY (OR).
- `name` (string): New display name.
- `rule_id` (string, required): The RuleId of the rule to update (from list_rules).

### `delete_rule` (~75 tokens)

Permanently delete a Mail.app rule by its RuleId. A timestamped backup of SyncedRules.plist is made before writing so the deletion can be undone. Mail.app may need to be restarted for the change to take effect.

Input parameters:

- `rule_id` (string, required): The RuleId of the rule to delete (from list_rules).

### `check_compatibility` (~52 tokens)

Probe each mail-mcp dependency (Envelope Index schema, SyncedRules.plist, AppleScript, MailData directory) and report pass/fail. Run this after a macOS update to verify nothing broke.

### `submit_feedback` (~87 tokens)

Open a pre-filled GitHub issue for mail-mcp (p-l-ta/mail-mcp) in the default browser. Automatically includes macOS version and mail-mcp version in the issue body.

Input parameters:

- `description` (string, required): Description of the problem or feedback. Include steps to reproduce if reporting a bug.
- `title` (string): Short issue title (optional — a default will be generated).

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/p-l-ta-mail-mcp/p-l-ta-mail-mcp#diagnostics

## Score history

- 2026-08-04: 80
- 2026-08-03: 76
- 2026-08-02: 76
- 2026-08-01: 20
- 2026-07-31: 20
- 2026-07-30: 28
- 2026-07-28: 46
- 2026-07-27: 24

## Links

- npm package: https://www.npmjs.com/package/@p-l-ta/mail-mcp
- Socket report: https://socket.dev/npm/package/@p-l-ta/mail-mcp
- Repository: https://github.com/p-l-ta/mail-mcp
- Changelog RSS feed: https://verifymcp.io/servers/p-l-ta-mail-mcp/p-l-ta-mail-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/p-l-ta-mail-mcp/p-l-ta-mail-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/p-l-ta-mail-mcp/p-l-ta-mail-mcp
