Skip to main content
Glama
PsychQuant

che-apple-mail-mcp

by PsychQuant

che-apple-mail-mcp

License: MIT macOS Swift MCP

最も幅広い機能を備えた Apple Mail MCP サーバー - SQLite を用いたミリ秒単位の検索で、250,000 件以上のメールを処理する 53 個のツールを提供します。

English | 日本語


なぜ che-apple-mail-mcp なのか?

機能

他のMCP

che-apple-mail-mcp

ツール総数

~20

53

言語

Python

Swift(ネイティブ)

検索速度

秒(AppleScript)

ミリ秒(SQLite)

検索フィールド

件名/送信者

件名/送信者/受信者/日付

バッチ操作

不可

1回の呼び出しで最大50件

メールボックス管理

基本

完全なCRUD

メールの色

不可

7色のフラグ + 背景色

VIP管理

不可

対応

ルール管理

一部

完全なCRUD

署名

不可

対応

生ヘッダー/ソース

不可

対応


Related MCP server: apple-mail-mcp

クイックスタート

プラグインをインストールします。これにより、署名済みバイナリ、/archive-mail コマンド群、セキュリティルール、そして最新の状態を監視するフックが、すべて1つのユニットとして提供されます。

claude plugin marketplace add PsychQuant/che-apple-mail-mcp
claude plugin install che-apple-mail-mcp@che-apple-mail-mcp

次に、権限を付与します - セットアップウィンドウに現在の状態が表示され、適切な System Settings ペインへのリンクが直接表示されます。

~/bin/CheAppleMailMCP --setup

💡 Full Disk Access を付与することで、高速な SQLite 読み取りパスと batch_export_emails_markdown が機能します。これを付与しない場合、ツール自体は動作しても、メールをまったく読み取れないため、権限の問題ではなくバグと誤解される可能性があります。macOS ではアプリがプログラム的にFDAをリクエストすることはできません。そのため手動でチェックする必要があり、毎回セットアップウィンドウで簡単に実行できます。

プラグイン vs MCP-only 登録

MCPサーバーを単独で登録することは可能である上級者向けの方法ですが、機能が大幅に縮小された構成になります。それを理解した上で選択してください。実行時に、この不足について気づかせてくれるものはありません(#353)。

プラグインに含まれるもの

MCP-onlyでの利用

全53ツールのMCPツール

✅ あり

/archive-mail + -migrate / -rebuild-threads / -repair-synthetic-ids / -view

❌ アーカイブ手順が存在しない

rules/compose-wrapper-free.md — 引用ブロックと、拒否された作成呼び出しの意味

⚠️ 背景: #304 以降、ラッパーは構造的に不可能であるため、このルールは現在、静かなフォールバックを防ぐのではなく、6つの拒否理由とその対処法を説明

rules/confirmation-triggers.mdrules/false-positive-detection.md

❌ 破壊的操作に対する確認規律がない

hooks/session-start.sh — 古さ検出による停止

❌ アップグレード後も古いバイナリのセッションが残る可能性

Developer ID 署名 + 公証済みバイナリ

❌ 自己ビルドのバイナリは ad-hoc 署名されるため、macOS 26 では TCC がFDA/自動化の権限を保持できず、権限が付与されていても機能しなくなる(#211

バージョンサイドコール → --self-update + #303 の古さを自己チェック

❌ 手動ビルドのバイナリにはサイドコールが存在しないため、そのチェックは常に動作しない

git clone https://github.com/PsychQuant/che-apple-mail-mcp.git
cd che-apple-mail-mcp
swift build -c release

# --scope user     : available across all projects (stored in ~/.claude.json)
# --transport stdio: local binary execution via stdin/stdout
# --               : separator between claude options and the command
mkdir -p ~/bin
cp .build/release/CheAppleMailMCP ~/bin/
claude mcp add --scope user --transport stdio che-apple-mail-mcp -- ~/bin/CheAppleMailMCP

~/bin/ などのローカルディレクトリにバイナリをインストールします。クラウド同期フォルダ(Dropbox、iCloud、OneDrive)は避けてください。同期が原因で MCP 接続がタイムアウトになることがあります。

自己ビルドのバイナリで再ビルド後も TCC 権限を維持するには、Developer ID で署名してください。(署名と公証を参照)。それ以外の場合は、ビルドのたびに権限を再付与する必要があります。


最近のリリース

詳細は CHANGELOG.md を参照してください。

v2.7.2 (2026-05-10) — attachmentFragment クラスタ修正とフォールバックの同等化

  • attachmentFragment のインデントを保守し、v2.7.0 の競合への対処による遅延をすリップしていた、MailController.attachmentScript ヘルパーを削除しました(#61##62

  • 添付ファイル数の上限(50件)+ CHE_MAIL_ATTACHMENT_DELAY_BETWEEN / _TRAILING による環境変数で制御できる遅延(#63#64

  • get_email_metadata の SQLite パスはエラー時に AppleScript にフォールバックするように - ある読取りツールの差が解消され、SQLite を優先する8つの読取りツールすべてと同等のフォールバックを実装しています(#71

v2.3.1 (2026-05-09) — base64修正 + .partial.emlx + 可観測性

  • 重要: RFC822 のヘッダー/本文分割が、絶対的な Data インデックスではなく相対的な配列インデックスを返していたため、Android の一部のGmailメッセージで html_body"sion: 1.1\n\n<base64>" で始まることがありました。生の base64 が LLM コンテキストに漏れ、下流で AUP の誤検知を引き起こしていました(#72

  • save_attachment は、.partial.emlx の本文が空の場合、Attachments/<rowId>/<part_id>/<filename> のキャッシュから読み取るようになりました。これにより、バイナリが取り除かれた IMAP メッセージで静かに0バイトになることがなくなりました((#66 )

  • SQLite 高速パスの失敗は、stderr にログを残すようになりました(SQLite ... fast path failed for rowId=...; falling back to AppleScript)(#69

v2.7.0 (2026-05-04) — Mail.app の競合状態対策

  • 複数添付の AppleScript 実行に 0.3 秒の間隔と、末尾に 0.5 秒の遅延を入れることで、Mail.app が添付ファイルを静かに落としてしまうことを防止しました(#60

v2.6.0 (2026-05-03) — セキュリティおよび検証の強化(8 PR、16件)

  • forward_email のプレーンモードで、RFC23RFC3676 に従った引用符 > を元のメールにプレフィックスとして付けるようになりました(reply_email の#43修正と同等)(#44

  • ツールの引数の型不一致はハードエラーになります — bool / [String] が黙って変換されないようにしました(#35

  • 受信者のEメール検証で、@ の欠落や複数など、ヘッダーインジェクションを拒否します(#41

  • cc_additional は、大文字小文字を区別せずに重複を排除します(#34

  • 添付ファイルパスを拒否リスト(~/.ssh、キーケイン、TCC db、ブラウザのCookie)+ シ唔リシックリンクを解決し、新しい MAIL_MCP_ATTACHMENT_ROOTS 環境変数による許可リスト(#38

  • id を取る全17のツールは、ハンドラ境界で id を Int として厳密に検証します - AppleScriptの述語イン DDCK できます(#50

  • reply_email の実行に使用する持続的統合テスト(#37#45)+ スモークテストマトリックステンプレート(#46#47

v2.5.0 (2026-04-17) — 作成ツールに format パラメータ

  • 4つの作成ツール(compose_email / create_draft / reply_email / forward_email)にて、format: "plain" | "markdown" | "html" パラメータを追加(#14#15 をクローズ)

  • 新しい message-composition ケーパビリティ仕様


全53ツール

ツール

説明

list_accounts

すべてのメールアカウントを一覧表示

get_account_info

アカウント詳細を取得

ツール

説明

list_mailboxes

すべてのボック(フォルダ)を一覧表示

create_mailbox

新しいメールボックスを作成

delete_mailbox

メールボックスを削除

get_special_mailboxes

特別なメールボックスの名前を取得(inbox、drafts、sent、trash、junk、outbox)

ツール

説明

list_emails

メールボックス内のメールを一覧表示

get_email

メールの全コンテンツを取得

search_emails

件名/本文から検索

get_unread_count

未読数を取得

get_email_headers

すべてのメールヘッダを取得

get_email_source

メールの生データを取得

get_email_metadata

メタデータ(転送済み、返信済み、サイズ)を取得

ツール

説明

mark_read

既読/未読としてマークします。

flag_email

メールにフラグを付ける/外します。

set_flag_color

フラグの色を設定します (7色)。

set_background_color

メールの背景色を設定します。

mark_as_junk

迷惑メール/迷惑メールではないとしてマークします。

move_email

別のメールボックスへ移動します。

copy_email

別のメールボックスへコピーします。

delete_email

メールを削除します (ゴミ箱へ)。

ツール

説明

compose_email

新しいメールを送信します(cc/bcc/添付ファイルに対応。format#304 以降 plain のみ。マルチアカウントで送信者を選択するためのオプションの from_address#131 を参照。検証済みFromポップアップ経由でクリーンに実行できる方法に対応(#219)。本文は常にMail標準のエディタから取得されます — #175 / check_accessibility を参照。クリーンに実行できない呼び出しは理由を明示して失敗し、何も作成しません(#304

reply_email

メールに返信します。オプション: cc_additionalattachmentssave_as_draftformat(v2.4.0以降)。プレーンモードでは RFC 3676 の > 引用形式で元のメールを埋め込みます(v2.5.0 / #43 以降)。新しい本文は Mail 標準の返信機能に貼り付けられます(#218)。plain 以外の format や Accessibility 権限の不足は、フォールバックせず失敗します(#304

forward_email

メールを転送します。オプション: body + format。プレーンモードでは RFC 3676 の > 引用形式で元のメールを埋め込みます(v2.5.0+ / #44 以降)。本文なしの転送は本文を割り当てず、Accessibility 権限も不要です。本文ありの場合は reply_email と同じルールが適用されます(#218 / #304

redirect_email

メールをリダイレクトします(元の送信者を保持)。

open_mailto

mailto URL を開きます。

返信を下書きとして保存する例 (v2.4.0+)

スレッドに返信し、追加のCCを付け、ファイルを添付し、送信前に人が確認できるよう下書きとして保存します:

reply_email(
    id="<message id from search_emails>",
    mailbox="INBOX",
    account_name="iCloud",
    body="Reply text",
    cc_additional=["x@y.com"],
    attachments=["/path/to/file.pdf"],
    save_as_draft=true
)

ツール

説明

list_drafts

下書きメールを一覧表示します — 各エントリには subject と数値の id が含まれます(#276 で追加、update_draft.draft_id / delete_email.id に渡す値を提供)。

create_draft

下書きを作成します(添付ファイルに対応。マルチアカウントで送信者を選択するためのオプションの from_address#131 を参照。検証済み From ポップアップ経由でクリーンに実行できる方法に対応(#219)。本文は常に Mail 標準のエディタから取得されます — #175 / check_accessibility を参照。クリーンに実行できない呼び出しはメールを明示して失敗し、何も作成しません(#304

update_draft

既存の下書きを置き換えます(upsert、#276): draft_id または完全一致の subject_match で特定 → 置き換え用の下書きを作成(create_draft と同じ実行条件と開示情報を継承)→ 古い下書きを削除。意図的に「先に作成、その後に削除」という順序を採用し、作成後のレシートを返します(失敗時は常に下書きを残す方向 — 最悪でも両方が存在することはあっても、両方が存在しないことは決してありません)。一致が0件または2件以上の場合は常に拒否されます(候補を一覧表示)。置き換え後の下書きには新しい id が割り当てられます

ツール

説明

list_attachments

メールの添付ファイルを一覧表示します。

save_attachment

添付ファイルをディスクに保存します。

ツール

説明

list_vip_senders

VIP送信者と一覧表示します。

ツール

説明

list_rules

メールルールを一覧表示します。

get_rule_details

ルールの詳細を取得します。

create_rule

新しいルールを作成します。

delete_rule

ルールを削除します。

enable_rule

ルールを有効/無効にします。

ツール

説明

list_signatures

メール署名を一覧表示します。

get_signature

署名の内容を取得します。

ツール

説明

list_smtp_servers

SMTPサーバーを一覧表示します。

ツール

説明

check_for_new_mail

新しいメールを確認します。

synchronize_account

IMAPアカウントを同期します。

ツール

説明

get_emails_batch

1回の呼び出しで最大50件のメールを取得します(項目ごとのエラーあり)

list_attachments_batch

最大50件のメールの添付ファイルを一覧表示します

batch_export_emails_markdown

サーバーサイドでの一括エクスポート(原文のままのマークダウン+添付ファイル。frontmatter マニフェストは固定、output\_dir ごとに並行処理を直列化 — #193 / #236

export_emails_markdown

非推奨batch_export_emails_markdown にリネーム(#233)。エイリアスの削除は早くても v3.0 以降です。

ツール

説明

extract_name_from_address

メールアドレスから名前を抽出します

extract_address

完全なアドレスからメールアドレスを抽出します

get_mail_app_info

Mail.app の情報を取得します

import_mailbox

ファイルからメールボックスをインポートします

ツール

説明

check_fda

フルディスクアクセスの状態を確認します(SQLite 高速パスの利用可否)

check_accessibility

アクセシビリティの許可を確認します(作成/返信 GUI パス。許可がない場合、これらのツールは動作を拒否します)

check_automation

Automation(Mail への Apple Events)の許可を確認します — プロンプトなしのプローブで、修正手段を伴う4つの状態を報告します(#293)。バイナリはそれ自身の許可を持っているため、osascript が動作しても ≠ バイナリが許可されている、とは限りません(#288

レスポンス形式: search_emails / list_emails

どちらのツールも エンベロープオブジェクト { results, returned, limit, truncated } を返します — 素の配列ではありませんv2.14.0 で変更、#204)。マッチ結果は .results から読み取ってください。

フィールド

意味

results

結果オブジェクトの配列(オブジェクトごとのフィールドはエンベロープ以前と両変更なし)。search_emails のオブジェクトは id, subject, sender, date_received, accountName, mailbox, to を持ち、アカウント UUID が解決可能な場合はさらに account_id を持ちます。list_emails オブジェクトは id, subject, sender を持ちます。

returned

results 内のオブジェクト数

limit

クエリに適用された実際の limit

truncated

返された数よりも利用可能な結果が多い場合に true — 残りを取得するには limit を増やすかクエリを絞り込みます(SQLite 高速パスでは確定、AppleScript フォールバックではベストエフォートのヒューリスティック — 下記参照)

truncated は SQLite 高速パスでは確定的です(内部的に limit + 1 を必須にします)。AppleScript フォールバックでは、returned == limit によるベストエフォートのヒューリスティックです。「列挙 → バッチ処理」を行う利用者は、完全なセットを取得したと判断する前に truncated を確認してください。


インストール

まず、クイックスタート から始めてください: プラグインのインストールがサポートされている方法であり、コマンド、安全ルール、スタセールネスチェックのフック、署名済みバイナリが得られます。以下の内容はすべて上級者/開発者向けの経路で、MCP サーバー単体のみを登録します。つまりプラグインに比べて厳密に小規模なインストールです(何が欠けるのかは Plugin vs MCP-only を参照してください。起動時に知る方法はありません)。

必要なもの

  • macOS 13.0+

  • Xcode Command Line Tools(下記の自分でビルドする方法に必要です)

  • Apple Mail に、アカウントが少なくとも1つ設定されていること

Step 1: ビルド

git clone https://github.com/PsychQuant/che-apple-mail-mcp.git
cd che-apple-mail-mcp
swift build -c release

Step 2: 設定

Claude Desktop の場合

~/Library/Application Support/Claude/claude_desktop_config.json を編集します:

{
  "mcpServers": {
    "che-apple-mail-mcp": {
      "command": "/full/path/to/che-apple-mail-mcp/.build/release/CheAppleMailMCP"
    }
  }
}

Claude Code(CLI)の場合

# Copy to ~/bin and register (user scope = available in all projects)
mkdir -p ~/bin
cp .build/release/CheAppleMailMCP ~/bin/
claude mcp add --scope user --transport stdio che-apple-mail-mcp -- ~/bin/CheAppleMailMCP

Step 3: アクセス許可を付与する

最速の方法はセットアップウィンドウを使うことです。セットアップウィンドウはライブで Full Disk Access / Automation / Accessibility の状態を表示し、許可に応じて続けて再チェックし、適切な System Settings преднастроек для вас:

~/bin/CheAppleMailMCP --setup

手動で行う場合:

Automation(Mail.app の制御):

open "x-apple.systempreferences:com.apple.preference.security?Privacy_Automation"
  1. CheAppleMailMCP を見つけて、Mail.app の許可を有効にします。

  2. Claude Code を使用している場合は、Terminal または iTerm も追加します。

Full Disk Access(SQLite 高速パスと export_emails_markdown~/Library/Mail を読み取ります):

open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"

macOS は Full Disk Access を responsible process(責任プロセス) — このサーバーを 起動した アプリ — に対して付与し、バイナリ自体には付与しません。Claude Code がターミナル内で実行する MCP サーバーの場合、その responsible process はターミナル**(Ghostty / Terminal / iTerm)です。したがって、お使いのターミナルアプリをここに追加して有効にしてください。ターミナルで一度許可を付与は、そこが起動するすべての MCP サーバー対象になります。(代わりにバイナリを直接起動する場合や、Claude Desktop バンドルを使用している場合は、そのバイナリ — ~/bin/CheAppleMailMCP — を追加してください。その場合、それが自身で responsible process になります。)FDA 拒否エラーはこれらの候補を指名して表示しますが、特定の1つのアプリを自動解決はしません。macOS に信頼できる API がないからです(#214)。Full Disk Access がない状態では、読み取りツールは静かに低速な AppleScript パスへフォールバックし、SQLite専用機能(projectionexport_emails_markdown)は失敗します。直接起動するパスの場合、Developer ID 署名済みアプリにしておくと、バージョンアップ後も許可が維持されます — 署名と公証はこちら を参照。

ガイド設定(#213) — 上記の手動手順を直接使う代わりに、バイナリにはセットアップヘルパーが同梱されています。

  • CheAppleMailMCP --setup は小さなウィンドウを開き、ライブな Full Disk Access 状態を表示します(タイマーで再チェックされ、許可した瞬間に "Ready ✅" に切り替わります)。さらに、オンデマンドの Automation チェックと "フルディスクアクセス設定を開く" / "バイナリパスをコピー" ボタンが表示します。

  • CheAppleMailMCP --check-fda はヘッドレスで状態を出力します(アクセスが 拒否 された場合はペインを開きます)— ターミナルやスクリプトから手軽に使えます。

  • check_fda MCP ツールは、オンデマンドで Claude に同じ状態を報告します(SQLite 専用機能でエラーが発生したときに呼叫してください)。

いずれも、iOS のユーザーが agent 自身で手動で切り替える単一のトグルを無くずことはできません(Apple は Full Disk Access を Accessibility / Screen Recording と同じ手動専用圏に置いています)。しかし、「どうすれば良いか」を明確にし、スイッチをオンにした瞬間にライブフィードバックを与えます。

アクセシビリティ(compose、#175/#304)フルディスクアクセス(FDA)とは別の、オプションの付与です。Mail.app は、AppleScript で注入された送信メッセージの本文を <blockquote type="cite"> で包みます。この blockquote は、一部のモバイルクライアントでは自分のテキストからの引用として表示されますが、送信者側ではローカルに確認できません。ラッパーのインラインスタイルに境界線がないためです。この blockquote を生成していたコードは、#304 以降、存在しません。すべての作成ツールは本文を Mail 自身のエディターから取得します(compose_email / create_draftmailto: の受け渡し、reply_email / forward_email はネイティブの返信/転送コマンド+ペースト)。保存・送信・添付はキーボードショートカットで行うため、アクセシビリティ(システム設定 → プライバシーとセキュリティ → アクセシビリティ)が必要です。これは FDA と同じ担当プロセス(ターミナル / Claude Desktop)に付与してください。check_accessibility MCP ツール--setup ウィンドウの アクセシビリティ 行がそのステータスを報告します。これがないと、これらのツールはフォールバックせずに失敗します。フォールバックする第二の経路は存在しないため、正常に実行できない呼び出しは名前付きエラーを返し、何も作成しません。エラーは open_mailto を指しますが、open_mailto には TCC 権限が一切不要です(添付ファイルを運べないため、ウィンドウの保存や送信はご自身で行ってください)。呼び出しを拒否する条件はちょうど6つあります:plain 以外の format、空の件名、アクセシビリティが付与されていない、from_address が単純な addr-spec ではない、パスに非 ASCII 文字を含む添付ファイル(#220)、そしてこのパスが埋められない表示名を持つ受信者です(cc/bcc は常に該当、送信時の to も該当します。ただし下書きの to 表示名は GUI 経由で入力されるため、下書きは例外です(#277))。既定以外のアカウントから正しい本文を送るには、from_address を渡してください。GUI が Mail の From ポップアップでそのアカウントを選択し、選択内容を読み戻します。誤った送信者のリスクを避けるため、そこで中止されます(#219)。レガシーパスとともに削除format: "markdown" / "html" — 現在のどのパスも、削除された本文割り当てなしにリッチテキストを届けることはできません。これは現在の実装の実態であり、不可能であるという証明ではありません(#310)。具体的には、ペーストパス(#218)はラッパー不要の第2のルートであり、NSPasteboard はリッチな形式を運べますが、そこで生成される MIME は未検証です。#306 がその点を確定します。代替案としては、#308 / #309 に加えて、require_wrapper_free パラメータ、sanitize_links パラメータ、そして CHE_MAIL_DISABLE_MAILTO_COMPOSE / CHE_MAIL_DISABLE_PASTE_REPLY エスケープハッチがあります。これに伴い、2つの機能も同時に失われます。明確に言うと:可視ウィンドウなしでの作成(ハッチの元々の目的)はもはや不可能であり、compose_emailName <addr> への送信もできなくなりました。create_draft を使用し、下書きを自分で送信してください。

Automation TCC (-1743) とゼロTCCエスケープハッチ

AppleScript ベースのツールが AppleScript error (-1743): Not authorized to send Apple events to Mail というエラーで失敗する場合、Automation 権限がこのバイナリに対して欠けています。署名済み MCP バイナリは独自の Automation 付与を保持します。その TCC ID はバイナリの署名 ID(#211 の FDA レッスで述べた Automation 軸)に紐付けられており、ターミナルとは独立しています。実証済みです:シェルから osascript で Mail を制御できることは、そのバイナリが認可されていることを意味しません。システム設定 → プライバシーとセキュリティ → Automationで権限を付与してください。バイナリ / そのホストのエントリを見つけて(Claude Desktop 拡張機能の場合は Claude.app の下にあります)、Mail を有効にします。エントリが存在しない場合、以前の拒否が記憶あり、macOS は再プロンプトしません。tccutil reset AppleEvents を実行し、その後 Mail ツールを再試行してプロンプトを再発生させます。権限はインストールごとであり、バイナリの更新によってエントリが無効化されることがあります(#211)。

権限が整うまでの間は open_mailto が引き続き動作します。LaunchServices(TCC ゼロ、#287)を経由し、システムデフォルトのメールクライアントに引用ブロックなしの作成ウィンドウを開きます。mailto は添付ファイルを渡せません(RFC 6068)ので、ファイルを手動でドラッグしてください。

ステップ4: Claudeを再起動

# For Claude Desktop
osascript -e 'quit app "Claude"' && sleep 2 && open -a "Claude"

# For Claude Code - start a new session
claude

使用例

自然言語(Claude Desktop)

"List all my mail accounts"
"Show unread emails in Gmail inbox"
"Search for emails about 'quarterly report'"
"Send an email to john@example.com about the meeting"
"Flag important emails in red"
"Create a rule to move newsletters to a folder"

直接のツール呼び出し(Claude Code)

"Use list_accounts to show my accounts"
"Use search_emails to find emails containing 'invoice'"
"Use set_flag_color to mark email ID 12345 as blue"
"Use check_for_new_mail to refresh"

フラグと背景色

フラグの色(set_flag_color

Index

Color

0

Red

1

Orange

2

Yellow

3

Green

4

Blue

5

Purple

6

Gray

-1

Clear

背景色(set_background_color

bluegraygreennoneorangepurpleredyellow


パフォーマンスとストレージ

SQLite + .emlx ファストパス

ほとんどの読み取りツールは、AppleScript IPC よりも Apple Mail のローカルな Envelope Index(SQLite)とディスク上の .emlx メッセージファイルを優先します。SQLite パスが要求を満たせない場合は、透過的に AppleScript にフォールバックします:

Tool

SQLite/.emlsx パス

AppleScript フォールバック

get_email

✓(任意のエラーで)

get_emails_batch

✓(項目ごと)

✓(項目ごと)

get_email_headers

✓(任意のエラーで)

get_email_source

✓(任意のエラーで)

search_emails

✓(リーダーが利用できない場合)

list_attachments

✓(任意のエラーで)

save_attachment

✓(任意のエラーで)

get_email_metadata

✓(任意のエラーで。#71 以降)

save_attachment の読み取りパスでは、ファストパスは AppleScript より 10〜100倍速いです(#12 の計測による)。他のツールの高速化率はリクエストの形状によって異なります。一般にラインボリュームの一括読み取りで最大の利点が得られます。

ファストパスにはこれが必要です:

  • ホストプロセスにフルディスクアクセスが付与されていること(システム設定 → プライバシーとセキュリティ → フルディスクアクセス)

  • Apple Mail のローカルストアが ~/Library/Mail/V10/... にあること

  • メッセージがローカルの .emlx ストレージに同期済みであること

EWS / Exchange アカウントは意図的にファストパスを迂回します

Apple Mail の Exchange (EWS) アカウントは .emlx ファイルを実体化しません。メッセージ本文はサーバーに置かれ、要求に応じて取得されます。これらのアカウントでは、8つすべての読み取りツール(get_email_metadata を含む。#71 以降)が透過的に AppleScript IPC へとグレードダウンします(動作は正しく、低速です)。症状:

  • EWS メッセージを500件一括取得すると、IMAP/Gmail メッセージを500件取得するよりも明らかに遅くなる

  • これはバグではありません。Apple Mail のストレージ構造による制約です(#9 を参照)

ファストパス迂回の診断

EWS 以外のアカウントでファストパスが失敗した場合、その障害は stderr にログ出力されます(#69 以降)。バイナリをターミナルで実行し stderr を監視すると、以下の区別できます:

  • EnvelopeIndexReader init failed: ... — DB に到達できない(よくあるのはフルディスクアクセス欠落)

  • SQLite get_email fast path failed for rowId=N: ... — メッセージ単位の失敗(例:.partial.emlx のみ、MIME の不正、ファイル未同期)

どちらの場合も、ログに ... falling through to AppleScript を含めて透過的に AppleScript へフォールバックします。したがって、監視可能性を回復しつつ、動作は維持されます。


トラブルチューニング

問題

解決策

サーバーが切断された

swift build -c release で再ビルドする

Appleイベントの送信が許可されていない

システム設定 > 自動操作 で権限を追加する

Mail.app が応答しない

Mail.app が設定済みアカウントで実行されていることを確認する

コマンドがタイムアウトする

大きなメールボックスは時間がかかる。特定の検索を試す

一括フェッチが期待より遅い

stderr に ... falling through to AppleScript の行がないか確認する。EWS/Exchange アカウントは常にフォールバックする(Performance & Storage 参照)。フォールバックが記録される他のアカウントは、修正可能な .emlx の問題を示している

save_attachment-1728 "Can't get account" または -1719 "Invalid mailbox index" で失敗する

#173 以降、両方のエラーは失敗した参照(アカウント / メールボックス / メッセージ)を特定する実行可能なヒントとともに返される。一般的な原因: 2つの Mail.app アカウントが同じ display_name を共有しているか、メール形式の account_name が複数のアカウントにマッピングされている — 下記の アカウントの曖昧さの解消 を参照。


アカウントの曖昧さの解消

Mail.app の AppleScript account "<display_name>" セレクタは、2つのアカウントが同じ display_name を共有する場合、一意ではありません — これは、iCloud のキャッチオールエイリアスが Gmail アドレスを自分自身に転送する場合や、Google Workspace と個人用 Gmail が重なる場合によくあるパターンです。その場合、AppleScript 経由のツール(save_attachment フォールバック、get_emailmark_read など)は非決定的に誤ったアカウントを選択し、-1728 / -1719 エラーが発生します。

修正方法: account_name と一緒に account_id(Mail.app のグローバルに一意な UUID)を渡します。指定すると、save_attachment は Mail.app の account id "<UUID>" セレクタを使い、曖昧さを回避します:

// Tool call: save_attachment with account_id
{
    "id": "273214",
    "mailbox": "[Gmail]/全部郵件",
    "account_name": "alice@example.com",
    "account_id": "C38E0583-47F8-4468-BE70-43155C15549D",  // ← disambiguates
    "attachment_name": "report.pdf",
    "save_path": "/tmp/report.pdf"
}

account_id の見つけ方:

  • search_emails の結果からresults 配列内の各オブジェクト(SearchResult)には、account_name とともに account_id フィールドがあります(MailboxURL.decode が SQLite の mailboxes.url オーソリティからアカウント UUID をデコードして設定されます。Mail.app の保存方法ではアカウント UUID がメールボックス URL のオーソリティにエンコードされており、SELECT mailboxes.account_id に直接相当するものはありません)。推奨: そのまま渡してください。

  • 手動で~/Library/Mail/V10/MailData/Signatures/AccountsMap.plist を読みます。トップレベルのキーが UUID で、AccountURL の値には、オーソリティにパーセントエンコードされた一致するメールアドレスが含まれています。

  • AppleScript 内: tell application "Mail" to get id of every account を実行すると UUID リストが得られます。

後方互換性: account_idオプションです。省略される(または空の場合)、ツールは従来の account "<display_name>" パスにフォールバックします — pre-#101 と同一の動作です — save_attachment には 1 つの例外があります#173): account_name@ を含む場合(メール形式で、search_emails などの SQLite パスツールが出力する形式)、save_attachment はまず AccountsMap を逆引き参照し、account id "<UUID>" セレクタに静かにアップグレードします(アップグレードは stderr に記録されます)。一致が 1 件のみ → その UUID。1 つのアドレスに複数のアカウント(iCloud キャッチオール + Gmail)→ 生の -1728 の代わりに候補をすべて列挙した実行可能なエラーが返ります。一致なし → 従来の display-name パスに戻ります(変更なし)。エッジケース: 説明@ が正当に含まれ、偶然別のアカウントのメールアドレスと一致する Mail アカウントは、先にメールの名前空間で解決されるようになりました — account_id を明示的に渡してセレクタを固定してください。他のツールは厳密な pre-#101 フォールバックを維持します(クロスツールの一斉変更は #176)。

スコープ: account_id は、AppleScript 経由でアカウントを参照するツール群で受け入れられます。save_attachment#101)から始まり、#104 の一括変更で以下の13の単一メッセージ / 移動 / 転送 / メールボックスツールが追加されました:

  • save_attachment — 先駆け

  • PR-A — 単一メッセージ変更ツール 3 つ: mark_readflag_emailset_flag_colorset_background_colormark_as_junk

  • PR-B — 移動 / 削除ツール 3. つ: move_emailcopy_emaildelete_email

  • PR-C — メッセージ転送ツール 3. つ: reply_emailforward_emailredirect_email

  • PR-D — メールボックス CRUD ツール 2 つ: create_mailboxdelete_mailbox

その後の対象範囲は #104 のセットを超えて広がっています:

  • #176 — メール→UUID の resolveAccountIdForTool チョークポイントを全 14 の AppleScript 経由書き込みハンドラに一般化(受け入れ済みの account_id だけでなく、メール形式の account_name も UUID セレクタに解決される)。

  • #180resolveMailboxRef / resolveMsgRef を介して、読み取りツールの AppleScript フォールバック(list_emails / search_emails / get_email / ヘッダ / ソース / メタデータ / 添付ファイル / get_unread_count)に account_id を通しました(以前延期されていた PR-E が完了)。

  • #179get_special_mailboxes がアカウントごとの特別なメールボックスの実名を取得するため、account_id / account_name を受け付けます。

  • #191 — アカウントレベルの操作ツール check_for_new_mailsynchronize_accountaccount_id のエスケープハッチが追加されました(synchronize_accountaccount_id 単体で受け付けます)。

account_id の適用外(追跡中): get_account_info / list_mailboxes#202)。

compose_email / create_draft は display_name 衝突の欠陥を示しません — これらは既存のメールをアカウントで参照するのではなく make new outgoing message を使用するため、account "<display_name>" セレクタを生成しません。マルチアカウントの送信者選択はオプションの from_address パラメータ(#131)で利用できます: 設定済みの Mail.app メールアドレスのどれか1つ("alice@example.com" または RFC 5322 形式の "Alice <alice@example.com>")を渡して送信メッセージの sender を設定します。省略すると Mail.app のデフォルトアカウントが使われます。list_accounts で実行中の Mac に設定されているアドレスを確認してください。

account_id によるアカウント間の移動 / コピーはサポートされていません#129 — #127 の検証から)。move_emailcopy_email も単一の account_id を受け、それがソースの msgRef と宛先の mailboxRef両方に適用されます。このアーキテクチャ的な選択は正しいものです(移動は単一アカウント内に留まります。Mail.app の AppleScript 動詞 move msg to <mailboxRef> は、宛先メールボックスを単一アカウントのコンテキストで表現する必要があるため)。Mail.app の UI ではドラッグ&ドロップによるアカウント間移動が可能ですが、AppleScript 経由の move_email / copy_email ツールではそれを再現できません。あるアカウントの account_id を指定して move_email を呼び、宛先 to_mailbox を別のアカウントで解決しようとすると、両方のアカウントで同名のメールボックスがある場合は誤ったアカウントのメールボックスを静かに選びます。どちらかをビンゴは -1719 "Invalid mailbox index" になります。別のアカウントにメッセージ内容のコピーが必要なら、save_attachmentcompose_email で手動で再構築できます — これは真の移動 / コピーではないことに注意してください: 元のメタデータ(Message-ID、受信日時、フラグ、ラベル)およびメッセージの識別情報は保持されません。


技術詳細

  • フレームワーク: MCP Swift SDK v0.10.0

  • 読み取りパス: SQLite(Envelope Index)+ .emlx ファイルパーサー。EWS / 解釈不能な .emlx は AppleScript フォールバック

  • 書き込み / 状態パス: NSAppleScript 経由の AppleScript

  • トランスポート: stdio

  • プラットフォーム: macOS 13.0+(Ventura 以降)


署名と公証

配布バイナリは Developer ID 署名済みと公証済みで、これは装飾ではありません。高速の読み取りパスにはフルディスクアクセス(FDA)が必要で、macOS TCC は FDA の認可をバイナリの designated requirement に結び付けます。アドホックバイナリでは、その requirement が cdhash であるため、バージョンが上がるたびに認可が無効になり、毎リリース後にバイナリをフルディスクアクセスリストに再度追加する必要がありました。安定した Developer ID 署名は代わりに その認可を署名 ID に結び付けるため、バージョンアップを乗り越えられます(#211)— この永続的な効果をもたらすのは公証ではなく署名です。

公証は**検疫起動(quarantined-launch)**の経路で重要です: ブラウザのダウンロードや .mcpb(Claude Desktop)インストールでは、初回起動時に Gatekeeper がバイナリを評価します。プラグインラッパーの curl + exec 経路は quarantine 属性を設定しないため、そこで Gatekeeper は作動しません。それでも公証しておくのは、公開済みリリースアセットをどの方法でも安全に実行できるようにするためです。

最初の認可は依然として手動です。 FDA(kTCCServiceSystemPolicyAllFiles)にはプログラムによるリクエスト API がありません。アプリができるのは設定ペインへのディープリンクのみです。署名により、その最初の認可が 恒久的 になるだけで、自動にはなりません。

初回セットアップ (メンテナー向け)

# 1. Developer ID Application cert in your login keychain (needs an Apple Developer account)
security find-identity -p codesigning -v        # find your identity

# 2. notarytool keychain profile (prompts for an app-specific password — never pass it on the CLI)
xcrun notarytool store-credentials <profile-name> \
  --apple-id <your-apple-id> --team-id <your-team-id>

# 3. Export both for the signed targets
export DEVELOPER_ID='Developer ID Application: Your Name (TEAMID)'
export NOTARY_PROFILE='<profile-name>'

自分のマシンへの開発インストール(高速 — 公証なし)

make install-signed     # build + Developer ID sign + copy to ~/bin

これを使うと、Apple の公証を待たずに、自分の Mac で安定したFDA(フルディスクアクセス)付与を取得できます。自分の証明書で署名されていればローカルで問題なく起動し、その付与は将来の再ビルド後も維持されます。~/bin/CheAppleMailMCP に一度だけフルディスクアクセスを付与すれば完了です。

配布リリース(署名 + 公証 + 公開)

make release-signed VERSION=vX.Y.Z      # wraps scripts/release.sh with REQUIRE_CODESIGN=1

これはユニバーサル(arm64 + x86_64)バイナリをビルドし、署名・公証(Apple との往復に1〜15分)を行い、GitHubリリースにアップロードします。証明書を持たないフォークでも、SKIP_CODESIGN=1 ./scripts/release.sh vX.Y.Z を使って未署名の開発版リリースを作成できます。


コントリビューション

コントリビューションを歓迎します!お気軽に Pull Request を送ってください。


ライセンス

MIT License - 詳細は LICENSE をご覧ください。


作成者

Che Peng (@kiki830621) が作りました。

これが役に立つと思ったら、スターを付けていただけると嬉しいです!

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
1dResponse time
4dRelease cycle
44Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to interact with Apple Mail through natural language, providing comprehensive email management including reading, searching, composing, organizing, and analyzing emails across all configured accounts. Includes an expert skill system that teaches intelligent email workflows and productivity strategies.
    26
    193
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables unified email management across Gmail, Outlook, iCloud, and IMAP providers with tools for search, send, organize, and batch operations via natural language.
    58
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables using Apple Mail accounts to search, read, manage, draft, and send messages from Codex or Claude Code locally.
    MIT

View all related MCP servers

Related MCP Connectors

  • Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflow…

  • Read, search, send, organize, draft and schedule email across your inboxes from any MCP client.

  • Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PsychQuant/che-apple-mail-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server