プロトタイプ · プレビュー版:公式レジストリのすべてのサーバーを掲載し、30分ごとに同期しています。レビューとアカウント機能は今後のステップで始まります。
PopNx MCPAIを使う人のためのMCPサーバー · やさしい言葉で解説

Apple Mail

作者:mgcreaバージョン 1.37.0i★ –iパソコンで動く
レジストリ名io.github.mgcrea/mcp-apple-mail

インストール

概要

作者による説明(英語の原文)

Search, read and act on Apple Mail — threads, attachments, body search, writes off by default

PopNx MCPの3つの柱

この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。

できること

このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。

  • 接続方法: パソコンで動く
  • トランスポート: stdio
  • カテゴリ: 検索・AIの記憶

インストール

使っているAIアプリを選んで、設定をコピーしてください。

インストールの前に

  • 基本チェック:1項目中1項目に合格
  • あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
  • 自分で入力するもの: APPLE_MAIL_ALLOW_WRITES, APPLE_MAIL_ACCOUNTS, APPLE_MAIL_ALLOW_FILE_SEND

必要なもの

  • npmNode.jsのインストール(npxコマンドに必要)

どのアプリを使っていますか?

上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。

Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます

{
  "mcpServers": {
    "apple-mail": {
      "command": "npx",
      "args": [
        "-y",
        "@mgcrea/mcp-apple-mail"
      ],
      "env": {
        "APPLE_MAIL_ALLOW_WRITES": "your-value",
        "APPLE_MAIL_ACCOUNTS": "your-value",
        "APPLE_MAIL_ALLOW_FILE_SEND": "your-value"
      }
    }
  }
}

ターミナルでこれを実行します

claude mcp add apple-mail --env APPLE_MAIL_ALLOW_WRITES=your-value --env APPLE_MAIL_ACCOUNTS=your-value --env APPLE_MAIL_ALLOW_FILE_SEND=your-value -- npx -y @mgcrea/mcp-apple-mail

動かす前に、空欄の値を入力してください。

Cursorで開く

または、設定を自分でコピーする

プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます

{
  "mcpServers": {
    "apple-mail": {
      "command": "npx",
      "args": [
        "-y",
        "@mgcrea/mcp-apple-mail"
      ],
      "env": {
        "APPLE_MAIL_ALLOW_WRITES": "your-value",
        "APPLE_MAIL_ACCOUNTS": "your-value",
        "APPLE_MAIL_ALLOW_FILE_SEND": "your-value"
      }
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

VS Codeで開く

または、設定を自分でコピーする

プロジェクトの .vscode/mcp.json に貼り付けます

{
  "servers": {
    "apple-mail": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@mgcrea/mcp-apple-mail"
      ],
      "env": {
        "APPLE_MAIL_ALLOW_WRITES": "your-value",
        "APPLE_MAIL_ACCOUNTS": "your-value",
        "APPLE_MAIL_ALLOW_FILE_SEND": "your-value"
      }
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。

選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。

自分で入力する値

  • APPLE_MAIL_ALLOW_WRITES env
    Register the mutating tools. Off by default, and the gate decides whether the write tools exist at all rather than merely refusing — an agent with writes off cannot see them.
  • APPLE_MAIL_ACCOUNTS env
    Restrict every read and write to these Mail accounts, by name. Bounds reading, not just writing.
  • APPLE_MAIL_ALLOW_FILE_SEND env
    Let the compose tools attach a local file and send in the same call. Attaching to a draft needs only writes; this is off by default because an immediate send puts the file in someone's inbox with nob…

この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。

できること

パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。

基本チェックi

誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月8日にチェック

  • ✓ 合格

    作者とリポジトリが一致

    レジストリ名は、リポジトリを所有するGitHubアカウント mgcrea で確認済みです

  • … 未チェック

    今もメンテナンスされている

    このリポジトリはまだGitHubから読み取っていません

  • … 未チェック

    ライセンスがある

    このリポジトリはまだGitHubから読み取っていません

  • – 対象外

    エンドポイントが応答する

    これはパソコンで動くため、インターネット上のエンドポイントはありません

  • – 対象外

    OAuthでサインイン

    パソコンで動き、代わりにローカルの設定を使います

  • … 未チェック

    ツールの説明に隠れた指示がない

    パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです

検索・AIの記憶のほかのサーバーとの比較i

  • このカテゴリのほかの5686件のうち0%よりスターが多い
  • このカテゴリのほかの5686件のうち96%より最近レジストリに公開
  • 基本チェックの結果が、このカテゴリのほかの5686件のうち100%と同じかそれ以上

レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。

よくある質問

Apple Mailは安全ですか?

当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。

どんなキーやコードが必要ですか?

レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。

パソコンで動きますか、それともクラウドですか?

あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。

今もメンテナンスされていますか?

GitHubリポジトリの最終更新は–、最新バージョン(1.37.0)がレジストリに届いたのは一昨日です。

どのアプリで使えますか?

Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。

代わりに使えるものは?

同じカテゴリには:Context7, Codebase Memory, Exa

代わりの候補

同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。

カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i

Context7

Up-to-date docs for AI agents

作者:upstash広く使われている↓ 97.3万/週★ 6.4万一昨日更新

パソコンでもクラウドでも

Codebase Memory

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

作者:DeusData広く使われている↓ 1.8万/週★ 4.8万22 日前更新

パソコンで動く

Exa

Connect AI agents to Exa for web search, content fetching, and multi-step research.

作者:exa-labs成長中★ 52132 か月前更新

クラウドで動く✓ exa.ai

作者のREADME

READMEを開く

作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。

@mgcrea/mcp-apple-mail

Model Context Protocol server for the macOS Apple Mail app. Read, search and act on the mail that is already synced to your Mac — no IMAP credentials, no OAuth, no mail leaving the machine.

Unofficial. Not affiliated with Apple. It drives the Mail app that is already on your Mac.

Status

Search, listing, counting, threading, body reading, body _search_ and every mutation are implemented.

How it works

Apple Mail exposes two very different surfaces, and this server uses each for what it is good at. The split is not a preference; it comes from measurements on a real 29,617-message mailbox:

OperationApple Events (AppleScript/JXA)Verdict
List 4 accounts + every mailbox0.6 sfine
Mailbox total / unread count295 ms / 76 msfine
Resolve one message by id in a 29 k mailbox0.10 sfine
Fetch N messages, per field~130 ms + 42 ms per messageusable to ~50
Read one property per message in a loop~250 ms eachnever do this
messages whose read status is false74 secondsunusable

So searching cannot go through Apple Events at all. It has to read Mail's own SQLite index (~/Library/Mail/V10/MailData/Envelope Index), which is what Mail itself searches. That gives three lanes:

  • AppleScript lane — accounts, mailboxes, counts, message-by-id, and every mutation. This is also the _authority_ lane: after a write, the result is what Mail re-read, never what the index says.
  • Index lane — read-only SQLite for search and filtering. Needs Full Disk Access.
  • Body lane — .emlx files on disk for message bodies and attachments. Needs Full Disk Access, and falls back to a per-message Apple Event.

The index is never written to. Mail owns it, holds it open, and reconciles it against IMAP; a write there is corruption with a delay fuse.

Permissions

Two separate macOS permissions, doing different jobs. Neither is granted to Mail.app — it is the _reader_ that needs permission, not Mail.

PermissionNeeded forWithout it
Automation → Maileverythingthe server cannot do anything; you get a -1743 error
Full Disk Accesssearch, message bodies, attachmentsthe server still runs: accounts, mailboxes, counts and capped listings all work

Automation is granted to the app that launches the server (Terminal, iTerm, VS Code, Claude…). macOS prompts for it on the first Apple Event, so usually you just click Allow.

Full Disk Access is the awkward one.

Why you should not just grant it to your editor

macOS attributes a process's file access to its _responsible process_ — the app at the top of the launch chain. When Claude spawns this server the chain is:

launchd → Visual Studio Code.app → Code Helper → claude → node dist/cli.js

so the grant would have to go to VS Code, and with it every extension, task and terminal command that editor ever runs would gain read access to your entire disk: Messages, Safari history, SSH keys, other apps' containers. That is a much larger permission than "may search my mail", and it defeats APPLE_MAIL_ACCOUNTS, which exists to bound exactly this.

You cannot avoid it by granting the permission to .mcp.json (it is data, not code) or to node (it is not the responsible process, and it is shared by every node program on the machine).

What to do instead

Install Cupertino.app, the signed menu bar app this package is developed in. It holds one Full Disk Access grant and serves this server beneath it, so the permission belongs to a notarized binary rather than to your editor:

brew install --cask mgcrea/tap/cupertino

Measured: Full Disk Access and Automation granted to a signed .app are inherited two levels deep by the processes it spawns, so a node grandchild reads the Envelope Index and tccd resolves a grandchild osascript to the app rather than to whatever launched it.

Earlier versions of this package described a small compiled launcher that made itself its own responsible process through a private API. It is no longer built or shipped — there is nothing left to escape — though native/launcher.c stays in the repository as the clearest statement of the problem.

If you would rather not install the app, granting Full Disk Access to your editor does work. Read the paragraph above about what that grant actually covers before you do.

Restart your MCP host after granting. apple_mail_diagnostics reports which permission is missing and what it is blocking.

A wrinkle worth knowing: stat() on a TCC-protected file succeeds — you can see the size and mtime of the index without Full Disk Access, and only reading it is denied. So "the file is there" is not evidence that the permission is granted; access(R_OK) is.

This install flow is a stopgap. docs/distribution.md covers where it goes next — a signed, notarized app so the grant survives updates and no one needs a compiler — and why the App Store cannot host any of it.

Quick start

# A. from npm

npx -y @mgcrea/mcp-apple-mail

B. from source

pnpm install && pnpm build && node dist/cli.js

Wire it into Claude Code (.mcp.json) or Claude Desktop:

{

"mcpServers": { "apple-mail": { "command": "npx", "args": ["-y", "@mgcrea/mcp-apple-mail"], "env": { // Off by default. With it off the write tools are not registered at all. "APPLE_MAIL_ALLOW_WRITES": "0", }, }, }, }

Inspect the tools directly:

npx @modelcontextprotocol/inspector node dist/cli.js

Tools

ToolDoes
apple_mail_diagnosticsWhat the server can currently do and why. Call this first when anything looks wrong — it names the exact System Settings pane to open.
apple_mail_list_accountsAccounts with UUIDs, addresses and mailbox names. Start here.
apple_mail_list_mailboxesMailboxes, optionally with counts — from the index in one pass, ~0.3 s each without it.
apple_mail_list_messagesNewest N of one mailbox, with a ref per message.
apple_mail_search_messagesAny combination of filters. body searches message text — see Body search.
apple_mail_count_messagesTotals and unread, labelled by source.
apple_mail_list_open_draftsThe drafts open in Mail right now, each with a composer handle, recipients and its own text apart from the quote, read by the app's apple_desktop_mail_composers verb.

Every message carries an opaque ref (m1: / # ) which the read and action tools take. It is versioned and carries its mailbox, so a row id can never be applied to the wrong mailbox. Do not construct one by hand.

Attachments

Mail almost always stores attachment bodies _outside_ the message file, in a sidecar tree — on a real mail store, none of the attachments sampled were inline. So an attachment's size and whether it can be fetched cannot be answered by parsing the message alone, and two plausible shortcuts are both wrong:

  • A non-empty MIME part does not mean the bytes are there. Stripping leaves a byte of delimiter whitespace behind, which reads as a present, 1-byte attachment.
  • X-Apple-Content-Length is not a byte size. It records the base64-encoded length, so a 164,156-byte PDF advertises 224,634.

list_attachments therefore reports sizeBytes from the file on disk and a retrievable flag saying whether the bytes are on disk, rather than guessing from the message.

An attachment with retrievable: false has not been downloaded by Mail, which on a Gmail account caching messages without their attachments is most older mail. save_attachment then asks Mail to save it, and Mail's save fetches it from the server first; the result says from: "mail". Mail also keeps what it fetched, so the attachment reads retrievable: true afterwards. Mail has to be running and online, a large file can take a while (Mail allows itself two minutes), and Mail writes into a staging folder inside APPLE_MAIL_ATTACHMENT_DIR that is removed after the copy, never into the destination itself.

Security

Blast radius. This server can read your entire mail archive and, with writes on, send mail as you. Two independent controls:

  • APPLE_MAIL_ALLOW_WRITES (default off) gates every mutation. With it off the write tools are not registered — they are invisible to the model, not merely refused.
  • APPLE_MAIL_ACCOUNTS restricts which accounts are visible at all. This is the _read_-side control, and ALLOW_WRITES does not cover it. It is enforced in one place, so no query path can escape it.

Once implemented, sending will default to leaving a draft open for review; actually sending requires both ALLOW_WRITES and an explicit confirm: true.

No secrets. The server holds no credential of any kind — its access is the macOS permission you granted the host app. There is nothing here to leak, and nothing is sent anywhere: the server makes no network calls at all. What reaches a network is Mail itself, doing what it was asked: sending, checking for new mail, and also save_attachment asking it to download an attachment from your own mail server.

Attachments. save_attachment can only write inside APPLE_MAIL_ATTACHMENT_DIR, and the filename is reduced to its basename first — a sender who names their attachment ../../../.ssh/authorized_keys gets a file called authorized_keys in your downloads folder and nothing else. Existing files are never overwritten unless you ask.

Going the other way, send_message, reply_to_message and forward_message take attachments, absolute paths that Mail reads and attaches. On a draft, the default, you see the files before anything goes. Attaching and sending in one call (sendNow) is refused unless APPLE_MAIL_ALLOW_FILE_SEND is set, because nobody looks and a path is a way to mail out anything this server can read.

No shell. The one place this package spawns a process uses execFile, never exec, and no caller input is ever interpolated into script text. Scripts are static constants piped to osascript over stdin; every value travels as a JSON argument. A mailbox named "; do shell script "touch /tmp/pwned"; // is data, not syntax — there is a tes

冒頭だけを表示しています。続きはリポジトリで読めます

PopNxに聞く