Skip to main content
Glama
wildsurfer

your-mail-mcp

your-mail-mcp

あなたのメールにはすでに答えが眠っています。予約番号、搭乗ゲートのコード、請求書、保証期間、人々が文書で交わした約束。このサーバーは、あなたのAIアシスタントがそれらを見つけられるようにします。

こんなことを尋ねられます:

  • 「6月のフェリーの予約番号を探して」

  • 「去年の夏にホテルが送ってきたWi-Fiパスワードは何だった?」

  • 「会計士はVATについて何と答え、それはいつだった?」

  • 「屋根について私と業者の間で交わされたすべてのやり取りを時系列で集めて、誰が何を約束したかを要約して」

  • 「今朝、全アカウントに届いたもので、実際に私の対応が必要なものは何?」

次の用途に使えます:

  • 質問を理解する検索。 全履歴に対する全文検索。すべてのアカウントを1つのインデックスにまとめ、検索構文ではなく、あなたの考え方のままに表現できます。

  • スマートフォンからのトリアージ。 どこにいても、一晩のうちに届いたものの朝の要約を、ジャンクを除外して確認できます。

  • 他の作業の文脈としてのメール。 クライアントの要件をスレッドから取り出して、コーディングやライティングのセッションに持ち込めます。打ち直す必要はありません。

  • 放置しておけるエージェント。 このサーバーは読み取り専用です。あなたのアシスタントに届いた悪意のあるメールは、読まれるだけでそれ以上は何も起こりません。送信・削除・移動の機能はここには存在しないからです。そのため、スケジュールされたダイジェストや常時稼働のエージェントを安心して実行できます。

セットアップは2つのファイルとdocker compose up -dだけです。実行方法を参照してください。

セルフホスト型MCPサーバーで、MCPクライアント(Claude、またはストリーミングHTTP MCPとOAuthを話せる他のクライアント)にメールへの読み取りアクセスを提供します。1つ以上のIMAPアカウントをmbsyncでローカルのmaildirにミラーリングし、notmuchでインデックス化し、そのインデックスからツール呼び出しに応答します。

your-mail-mcpの仕組み: メールはIMAPプロバイダーからローカルミラーに取り込まれ、notmuchでインデックス化され、OAuthゲートを介してMCPクライアントに提供される。プロバイダーへの書き込み経路はない

この図では、メールは常に左から右にのみ移動します。サーバーがプロバイダーに向けて行う唯一の矢印は、起動時の単一のIMAP LISTで、そのサーバーがジャンクフォルダとゴミ箱フォルダを何と呼ぶかを調べるためです。メールボックスを選択することも、メッセージを取得することもありません。図のソースはdocs/diagrams/how-it-works.htmlです。

できないこと

読み取り専用という性質はアーキテクチャに組み込まれています。

ミラーはプル専用です。生成される各アカウントのmbsync設定にはSync PullCreate NearRemove NoneExpunge Noneが含まれています。この設定のどこにも、サーバーに変更をプッシュしたり、メッセージを削除したり、消去したりする機能はありません。

Goコード内で唯一のIMAP操作はLISTで、起動時にアカウントごとに1回発行され、各アカウントのジャンクフォルダとゴミ箱フォルダを特定します(プロバイダー別の注意事項トラブルシューティングを参照)。この接続はログインし、メールボックスを一覧表示し、ログアウトします。メールボックスを開くことも、メッセージを取得することもありません。

送信、削除、移動、タグ付けはありません。添付ファイルはshowthreadに一覧表示され、attachmentツールによって読み取り専用で提供されます。一度に1パーツずつ、5MBの上限付きです。より大きなパーツはGET /attachment/{id}/{part}で生のまま提供され、ベアラートークンまたは、ツールが過大なパーツを拒否したときに返す短期間有効な署名付きリンクで認証されます。このプロセス内の何ものも、どのアカウントへの書き込みアクセスを持ちません。

10個のツール、すべて読み取り専用:

ツール

機能

search

メールを検索します。スレッドの要約をJSONで返します。

ids

クエリに一致するメッセージIDを返します。

files

クエリに一致するmaildirファイルパスを返します。

count

クエリに一致するメッセージ数を数えます。

show

1つのメッセージを表示します: ヘッダーとデコードされた本文をJSONで。

thread

メッセージを含むスレッド全体を表示します。デフォルトではジャンク/ゴミ箱の返信を除外します。含めるにはinclude_excludedを設定します。

text

1つのメッセージのプレーンテキスト本文を返します。HTMLを変換します。

folders

アカウント、そのフォルダ、インデックスタグ、各アカウントの最終同期時刻と最終エラーを一覧表示します。

refresh

今すぐINBOXを同期し、届いたメッセージ数を報告します。

attachment

showのパート番号による、メッセージの1つの添付ファイルまたはMIMEパート。画像とバイナリは型付きコンテンツとして、テキストはマークされたブロックとして。5MBを超えるパートは、代わりに署名付きダウンロードリンクが返されます。

searchidsfilescountはnotmuchクエリ(from:to:subject:tag:folder:date:2026-01-01..2026-06-30、and/or/notで組み合わせ可能)を受け取り、オプションのaccountで1つのアカウントに限定でき、include_excludedでジャンク/ゴミ箱を含めることができます。

Related MCP server: notmuchproxy

実行方法

このサーバーを実行する方法は3つあります。違いは1つだけです: 誰がサーバーに到達できるか。ケース1から始めて、必要なときだけ上位に移ってください。どれもデフォルト以上の堅牢化はされていません。それはハードニングで、さらに下にあります。最初に動作させることを優先して、意図的に分離されています。

実行場所

到達できる人

メールの保存場所

1

あなたのマシン

そのマシンのみ

あなたのマシン

2

あなたのマシン

あなた、どこからでも

あなたのマシン

3

VPS

あなた、どこからでも

レンタルディスク

サーバーはghcr.io/wildsurfer/your-mail-mcpのコンテナイメージとして提供され、amd64とarm64向けにCIでビルド・公開されています。コンパイルは不要で、すべてのケースが同じように始まります。空のディレクトリに2つのファイルを置きます:

mkdir your-mail && cd your-mail
curl -fsSLO https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/compose.yaml
curl -fsSL https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/accounts.example.json -o accounts.json

accounts.jsonをあなたのアカウントで編集し(アカウントファイルを参照)、次にcompose.yamlの隣の.envファイルに、それが参照するシークレットを置きます:

# .env
OAUTH_PASSPHRASE=pick-a-long-one-you-can-type-on-a-smartphone
WORK_PASS=your-gmail-app-password
PERSONAL_PASS=your-icloud-app-specific-password

OAUTH_PASSPHRASEは、ケース2と3でインターネットとあなたのメールの間にある唯一の認証情報です。それに応じて扱ってください。

この2つのファイルにはあなたのメールのパスワードが含まれています。このディレクトリをバージョン管理下に置いたり、マシンの外に出るバックアップに入れたりする場合は、それに応じて扱ってください。


ケース1 — 自分のマシンで、自分のマシン専用

サーバーはループバックにバインドします。あなたのマシンの外からは誰も到達できないため、TLSを設定する必要も、ホスト名を所有する必要もありません。CLIツールは使用できます。スマートフォンは使用できません。

.envに1行追加します:

PUBLIC_URL=http://127.0.0.1:8080

次に起動します:

docker compose up -d
docker compose logs -f          # watch the first sync

最初の同期はmaildirを生成し、大きなメールボックスでは時間がかかります。意図的に、一度に1つのIMAPコマンドずつ、可能な速度よりも遅くしています。プロバイダーがスロットリングするからです。別の初期化ステップはありません。

Claude Code

claude mcp add --transport http your-mail http://127.0.0.1:8080/mcp

次にClaude Code内で/mcpを実行し、your-mailを選択して認証します。ブラウザが同意ページを開き、1つのことを尋ねます: あなたのOAUTH_PASSPHRASEです。これを行うまで、claude mcp listNeeds authenticationと表示します。

Codex

codex mcp add your-mail --url http://127.0.0.1:8080/mcp
codex mcp login your-mail

codex mcp listで認証状態が表示されます。ログインが成功した後もセッションにツールが表示されない場合、それは既知のCodexのバグで、OAuth認証情報が取得された後、使用されないというものです(openai/codex#20009)。修正されるまで、以下のブリッジを使用してください。

mcp-remoteはOAuthダンスを自分で行い、サーバーをstdio経由で再公開します。これはすべてのMCPクライアントがサポートしています:

# ~/.codex/config.toml
[mcp_servers.your-mail]
command = "npx"
args = ["-y", "mcp-remote", "http://127.0.0.1:8080/mcp"]

初回実行時に同じ同意ページを開き、トークンをキャッシュします。


ケース2 — 自分のマシンで、どこからでも到達可能

同じサーバーに加えて、公開HTTPSアドレスを提供する何かが必要です。メールはあなたのマシンに残り、トンネルは発信するため、自宅のネットワークで何も待ち受けません。スマートフォンとデスクトップアプリにはこれが必要です。カスタムコネクタはベンダーのサーバーによって取得されるため、プライベートアドレスには到達できません。

Tailscaleを使用(ドメイン不要)

macOSとLinuxで同じ1つのコマンドで、ドメインを所有せずにHTTPSホスト名を取得できます。

tailscale funnel --bg 8080

--bgは再起動後も実行を継続します。公開URLを出力します。これはhttps://your-machine.your-tailnet.ts.netのような形式です。これが使用するホスト名です:

# .env
PUBLIC_URL=https://your-machine.your-tailnet.ts.net
docker compose up -d

FunnelはHTTPS証明書と、あなたのtailnetで有効なFunnelノード属性が必要です。CLIは初回にポリシー行の追加を提案し、残りは管理コンソールで行います。tailscale funnel statusで公開されているものを表示し、tailscale funnel --https=443 offで停止します。

Cloudflareを使用(ドメインを所有し、Cloudflare上にある場合)

.ts.netではなく、自分のドメインのホスト名が必要な場合はこれを使用します。以下のmail.example.comあなたのドメインで、すでにCloudflareアカウントに追加されています。Cloudflareは名前付きトンネルのホスト名を提供しません。

cloudflared tunnel login
cloudflared tunnel create your-mail

createはトンネルのUUIDと、書き込んだ認証情報ファイルを出力します:

Tunnel credentials written to /Users/you/.cloudflared/f9e2…-… .json
Created tunnel your-mail with id f9e2…-…

以下の正確なパスを使用してください。cloudflared tunnel listでUUIDを再度出力できます。ホスト名をルーティングし、次に~/.cloudflared/config.ymlを書きます:

cloudflared tunnel route dns your-mail mail.example.com
tunnel: your-mail
credentials-file: /Users/you/.cloudflared/f9e2….json   # the path create printed
url: http://localhost:8080
cloudflared tunnel run your-mail

実行を継続するには: Linuxではsudo cloudflared service install。macOSではHomebrewでインストールし、brew services start cloudflaredを使用します。sudoインストールパスはルートユーザーのホームディレクトリの下で証明書を探すため、cloudflared tunnel loginがあなたのホームに書き込んだ証明書を見つけられません。

次に.envPUBLIC_URL=https://mail.example.comを設定し、docker compose up -dを実行します。

どちらの場合も

PUBLIC_URLは、クライアントに入力するものと正確に一致する必要があります。サーバーはOAuthメタデータのresourceとしてPUBLIC_URL + /mcpを公開します。ここでの不一致は、コネクタが追加を拒否する最も一般的な理由です。

スマートフォンで始める前に知っておくべきことが1つあります: ClaudeもChatGPTも、スマートフォンアプリからコネクタを追加することはできません。 ウェブ(またはClaudeのデスクトップアプリ)で一度追加すると、スマートフォンに表示されます。スマートフォン自体でセットアップを試みるのは時間の無駄です。

Claude — ウェブまたはデスクトップで追加し、スマートフォンで使用

  1. claude.aiまたはClaude Desktopで、設定 → コネクタに移動し、コネクタの横の**+**をクリックするか、カスタムコネクタを追加をクリックします。

  2. 名前とURL <PUBLIC_URL>/mcpを指定します。詳細なOAuthフィールドは空のままにします。このサーバーはクライアントを動的に登録します。

  3. Claudeが同意ページを開きます。OAUTH_PASSPHRASEを入力します。

  4. スマートフォンでClaudeアプリを開きます。コネクタはすでにあり、ツールはチャットで利用できます。コンポーザーのツールまたはコネクタメニューから会話でオンにします。

ChatGPT — ウェブで追加し、スマートフォンで使用

カスタムMCPコネクタは開発者モードの背後にあります。開発者モードを使用するにはPro、Plus、Business、Enterprise、Educationのいずれかのアカウントが必要で、ウェブ上でのみ利用できます。

  1. ウェブ版ChatGPTで、設定 → セキュリティとログイン を開き、開発者モード をオンにします。BusinessおよびEnterpriseワークスペースでは、管理者が先に許可する必要がある場合があります。

  2. リモートMCPサーバー用のコネクタを追加し、URLに <PUBLIC_URL>/mcp を指定し、認証方式にOAuthを選択します。ChatGPTは動的クライアント登録に対応しているため、貼り付けるものはありません。

  3. 自分の OAUTH_PASSPHRASE で同意画面を承認します。

  4. スマートフォンでChatGPTを開き、チャットでコネクタを有効にします。

これらのメニューは移動することがあります。上記の名前が表示されているものと一致しない場合は、設定内で開発者モードを探し、次にURLでコネクタを追加する場所を探してください。

ChatGPTはモバイルでは一部のMCP書き込みアクションを無効にします。このサーバーには書き込みアクションがまったくないため、ここでは影響はありません。

Claude Code

claude mcp add --transport http your-mail https://your-host/mcp

Codex

codex mcp add your-mail --url https://your-host/mcp
codex mcp login your-mail

ケース3 — VPS上で、どこからでも到達可能

これは、自分のマシンの電源が入っているかどうかに関係なくミラーを稼働させたい場合に選択します。月額数ドルの費用と、1つの大きなトレードオフがあります。メールの完全なプレーンテキストのコピーがレンタルしたディスクに移され、アプリパスワードも同じ環境に置かれます。選択する前に セキュリティ をお読みください。

インストールはケース1にトンネルを加えたもので、他人のコンピュータ上で行います。開くポートも、設定するDNSも、管理する証明書もありません。

新しいDebianまたはUbuntuマシン上で:

# 1. Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER && newgrp docker

# 2. The two files, and your accounts
mkdir your-mail && cd your-mail
curl -fsSLO https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/compose.yaml
curl -fsSL https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/accounts.example.json -o accounts.json
$EDITOR accounts.json             # your accounts
$EDITOR .env                      # OAUTH_PASSPHRASE and the account passwords

# 3. A public address, exactly as in case 2
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale funnel --bg 8080        # prints your https://….ts.net hostname

# 4. Put that hostname in .env, then start
echo "PUBLIC_URL=https://your-machine.your-tailnet.ts.net" >> .env
docker compose up -d
docker compose logs -f

PUBLIC_URL は最後に指定します。ホスト名はステップ3で表示されるまで分からないためです。

クライアントの接続はケース2とまったく同じです。

compose.yaml 内の restart: unless-stopped は、再起動後にコンテナを復帰させます。folders ツールで確認できます。このツールは各アカウントの最終同期と最終エラーを報告します。あるいは docker compose logs --tail=50 でも確認できます。

次に 堅牢化 をお読みください。パスワードでSSH接続でき、メールのコピーを保持しているVPSは、これをまったく実行しないよりも悪い状態です。


堅牢化

これらはサーバーを動作させるために必要なものではなく、そのためインストール手順には含まれていません。効果が大きい順に並んでいます。ケース1ではどれも必要ありません。

本物のパスフレーズを選んでください。 OAUTH_PASSPHRASE が扉そのものです。間違った推測には攻撃者は1秒しかかかりません。また、推測は直列化されているため、並列に実行しても効果はありません。しかし、どちらも短いパスフレーズを救ってはくれません。スマートフォンでも入力できる長いパスフレーズを使用してください。

SSHをロックダウンする(ケース3)。パスワードログインとメールのコピーが載ったレンタルボックスは、このドキュメントの中で最悪の組み合わせです。rootとして、何よりも先に:

adduser mail && usermod -aG sudo mail
rsync --archive --chown=mail:mail ~/.ssh /home/mail
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/; s/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart ssh

その後、rootではなく mail としてインストールを実行します。

使用していないポートを閉じる(ケース3)。トンネルを使用する場合、受信ポートはまったく必要ないため:

sudo ufw allow OpenSSH && sudo ufw --force enable

コネクタに到達できる相手を制限する。 サーバーと通信するのがClaudeアプリ内のカスタムコネクタだけの場合、そのトラフィックはAnthropicが公開しているエグレス範囲 160.79.104.0/21 から到着します。トンネルまたはファイアウォールでそれ以外のすべてを拒否できます。ラップトップからClaude CodeやCodexも使用している場合は、これを行わないでください。それらは現在地から接続するためです。

ボリュームをバックアップするか、再同期を受け入れる。 compose.yaml はmaildirとインデックスを名前付きボリュームに保持します。それらの中に一意なものは何もありません。すべてはまだメールサーバー上にあります。ただし、大きなメールボックスの再ダウンロードには時間がかかり、スロットリングを行うプロバイダーを悩ませます。

パスフレーズが保護しないものを理解する。 パスフレーズはMCPサーフェスへの入り口を守ります。保存中のデータを暗号化するものではありません。セキュリティ を参照してください。

自分が所有するドメインでTLSを自分で終端したい場合は、A レコードをマシンに向け、Caddyを前面に配置します。compose.override.yaml を追加します:

services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
volumes:
  caddy_data:
# Caddyfile
mail.example.com {
    reverse_proxy your-mail-mcp:8080
}

両方のポートを開きます — 80は必須です。Caddyは証明書チャレンジとHTTPSリダイレクトにそれを使用します:

sudo ufw allow 80/tcp && sudo ufw allow 443/tcp

Caddyは証明書を自ら取得および更新します。PUBLIC_URL にホスト名を設定し、docker compose up -d を実行します。

アカウントファイル

/config/accounts.json に読み取り専用でマウントされます(compose.yaml を参照)。JSONであり、encoding/json で解析されます。解析前にプロセス環境変数に対して展開されるため、文字列値内の ${VAR} はその名前の環境変数に置き換えられます。これがシークレットがファイルに残らない仕組みです:

{
  "accounts": [
    {
      "name": "work",
      "host": "imap.gmail.com",
      "user": "you@example.com",
      "password": "${WORK_PASS}"
    }
  ]
}

アカウントごとのキー:

キー

デフォルト

注記

name

必須。スペース、引用符、スラッシュ(前方/後方)は使用不可。アカウントの最上位maildirディレクトリになり、ツール呼び出しの account 引数になります。

host

必須。IMAPサーバーのホスト名。

port

993 (imaps) または 143 (その他)

user

必須。プロバイダー別注記 を参照: iCloudでは完全なメールアドレスではなく短い名前が必要です。

password

必須。${VAR} は環境変数から展開されます。リテラルのパスワードも機能しますが、推奨されません。

tls

imaps

imapsstarttls、または none

patterns

["*"]

mbsyncのフォルダーパターン — ミラーするフォルダー。

exclude_folders

自動的に検出

デフォルトで検索から除外するフォルダー名(SPECIAL-USEディスカバリ を参照)。これを設定すると、そのアカウントではディスカバリが完全に上書きされます。

アカウント名は一意である必要があります。少なくとも1つのアカウントが必要です。空の accounts 配列は起動エラーになります。

環境変数

変数

必須

デフォルト

意味

CONFIG

はい

アカウントファイルへのパス。

MAILDIR

はい

Maildirのルート。各アカウントにサブディレクトリが作成されます。

INDEX

はい

notmuch/Xapianのインデックスディレクトリ。

PUBLIC_URL

はい

サーバーに到達するための外部URL。クライアントが使用するのとまったく同じ形式(末尾のスラッシュがある場合は削除されます)。OAuthメタデータで使用され、クライアントに入力する内容と一致する必要があります。

OAUTH_PASSPHRASE

はい

同意画面をゲートする唯一のパスフレーズ。

SYNC_INTERVAL

いいえ

5m

完全同期の間隔。Goのduration形式(5m1h)。

SYNC_TIMEOUT

いいえ

1h

1回のmbsync実行のアカウントごとの期限。Goのduration形式。大きな最初のミラーがこの期限に達してもまだ実行中で打ち切られる場合は、これを上げてください。数万件のメッセージがあるメールボックスは、デフォルトを大幅に超える時間がかかることがあります。

LISTEN_ADDR

いいえ

:8080

HTTPサーバーがバインドするアドレス。

INIT_MIRROR

いいえ

未設定

マウントポイントではない空のディレクトリに同期するには 1 に設定します。/mail がボリュームであるcomposeでは不要です。

CONFIGMAILDIRINDEX は必須です。これらがないとプロセスは起動を拒否します。PUBLIC_URLOAUTH_PASSPHRASE はOAuthレイヤーによって必須であり、これらがない場合もプロセスは起動に失敗します。

コンテナイメージはこれらのうち4つをすでに設定しています(Dockerfile): MAILDIR=/mailINDEX=/indexCONFIG=/config/accounts.jsonLISTEN_ADDR=:8080compose.yaml はこれらを上書きしません。compose.yaml で対応するボリュームマウントまたは設定マウントも変更するのでない限り、そのままにしておいてください。マウントも一緒に移動させない上書きは、サーバーを空または存在しないパスに向けることになります。

Dockerを使用しない場合

LinuxおよびmacOS用のリリースバイナリ(amd64とarm64)は、チェックサム付きで リリースページ にあります。バイナリは mbsyncnotmuchw3m を外部コマンドとして実行するため、これらを先にインストールしてください。macOSでは brew install isync notmuch w3m、DebianとUbuntuでは apt install isync notmuch w3m です。isync 1.4.4以降が動作します。

その後はコンテナと同じ設定を、任意のパスで行います。コンテナのボリュームは最初はマウントポイントであり、空のmaildirガードはそれを実際の初回実行と見なします。自分で作成した普通のディレクトリは、同じガードにとっては欠落したボリュームとまったく同じに見えるため、ここが本当に初回実行であることを示す INIT_MIRROR=1 が必要です:

mkdir -p mail index
CONFIG=./accounts.json MAILDIR=./mail INDEX=./index INIT_MIRROR=1 \
PUBLIC_URL=http://127.0.0.1:8080 OAUTH_PASSPHRASE=... \
WORK_PASS=... ./your-mail-mcp

Windowsはサポートされていません。maildirの処理はUnixのファイルシステムセマンティクスに依存しており、外部実行するmbsyncもありません。

自分でビルドする

CIがすべてのイメージをビルド、テスト、公開するため、誰もビルドする必要はありません。ただし、自分で行いたい場合は1つのコマンドです。コンテナでは docker build -t your-mail-mcp .、バイナリでは go build です(Go 1.27。テストには上記の3つのツールがPATHにある必要があります)。

プロバイダー別注記

iCloudの注記は、このサーバーより前から運用されていた実際のiCloudミラーの長期間の運用から得られています。GmailとDovecotの注記はプロバイダーのドキュメントとプロジェクトの調査から得られたもので、まだすべてがこのサーバーを通じて再検証されているわけではありません。

  • iCloudimap.mail.me.com):IMAP の user は短い名前、つまり @icloud.com の前の部分であり、完全なメールアドレスではありません。iCloud は 同時 IMAP 接続を制限します。そのため、生成された mbsync 設定ではすべてのアカウントで PipelineDepth 1 が固定され、これは 設定変更できません。

  • Gmailimap.gmail.com):アプリパスワードが必要です。そのためには 事前にアカウントで 2 段階認証プロセスを有効にする必要があります。Gmail は IMAP 経由でアカウントのパスワードを直接受け付けません。また Gmail は 基本的にすべてを [Gmail]/All Mail にコピーを保持するため、Gmail アカウントのミラーは フォルダ一覧が示すサイズのおよそ 2 倍になります。ほとんどの メッセージが自分のフォルダと All Mail の両方に存在するからです。大規模な Gmail アカウントの最初のミラーには数時間かかり、Google はまた 1 日あたりの IMAP ダウンロード割り当て(1 日あたり約 2.5GB)を強制するため、数ギガバイトの メールボックスでは最初のミラーが数日にわたって分散されます。これは正常です。 サーバーは独自のスケジュールで再試行を続け、mbsync は中断した 場所から再開します。最初のミラーでは SYNC_TIMEOUT8h のような値に設定して、 長時間の実行がデフォルトの 1 時間の期限で打ち切られないようにしてください。

  • Dovecot サーバー(多くのセルフホスト型および小規模プロバイダー)では、一般的に フォルダ名の前に INBOX. を付けます(例:INBOX.Sent)。folders に 予期しないフォルダ名が表示される場合、通常はこれが原因です。

セキュリティ

アカウントのパスワードはプロセスの環境変数(accounts.json 内の ${VAR}、 またはリテラル値)を通じて供給されます。起動時に、サーバーはそれらを コンテナ内のディスク上にある生成された mbsync 設定ファイルに書き込みます。ファイルモードは 0600 です。そのファイルは暗号化されていません。コンテナの 環境変数、またはそのファイルを読み取れるものは誰でも、パスワードを平文で 読み取ることができます。

保存時の保護(ディスク暗号化、コンテナへの exec を制限する、 ホストへのアクセス)は運用者の責任です。この サーバーは保存時の資格情報の暗号化を主張せず、またその試みも 行いません。

OAuth パスフレーズは定数時間でチェックされ、単一の共有シークレットでサーバー全体を ゲートします。これはユーザーごとの資格情報システムではありません。 OAUTH_PASSPHRASE とメールアカウントのパスワードは同じ注意をもって 扱ってください。

search のスレッド概要には、一致するスレッド内のすべてのメッセージの表示名が含まれますが、 これは送信者が制御します。デフォルトで除外されるフォルダ(迷惑メール、ゴミ箱)内のメッセージでも、 本文が表示されることは決してないにもかかわらず、この方法で攻撃者が選んだ名前を あなたの前に表示できます。search は除外されたメッセージの本文を取得または表示しません。 threadshow は読み取りパスであり、この影響を受けません。thread は デフォルトで迷惑メール/ゴミ箱の返信を除外し(上記のツール表を参照)、show は すでに ID を持っている単一のメッセージを読み取ります。search におけるこの表示名の 漏洩は、このリリースでは修正されていません。

トラブルシューティング

「maildir ... is an empty plain directory, not a mount point: refusing to sync」 — サーバーは maildir がマウントされたファイルシステムであるかどうかをチェックします。 たまたま空であるマウントされたボリュームは初回実行であり、オプトインなしで 同期されます。そのため compose では追加の手順が不要です。空の プレーンな ディレクトリは 曖昧です。新しい maildir は、ボリュームがマウントされたことのないパスとまったく同じに見え、 2 番目のディレクトリへの同期は、マウントを修正した瞬間に消えるディレクトリに すべてのアカウントを再ダウンロードします。MAILDIR が指す場所にストレージを マウントするか、本当にこのファイルシステム上の通常のディレクトリであることを意図している場合は INIT_MIRROR=1 を設定してください。

「maildir ...: no such file or directory」 — パスがまったく存在しません。 compose を使用している場合、これはボリュームまたはバインドマウントが compose.yaml から欠落していることを意味します。バイナリを直接実行している場合、MAILDIR が 間違っていることを意味します。

folders ツールでアカウントごとの同期ステータスを確認してください。 これは設定されたすべての アカウント、その最後の成功した同期時刻、エラーがあればその最後のエラー、 そのフォルダ、およびインデックス内のタグを一覧表示します。パスワードが間違っている アカウントや期限切れのアプリ固有パスワードを持つ単一のアカウントは、他のアカウントを停止させません。 同期エラーはアカウントごとに分離されていますが、ここでは沈黙ではなく last error 行として表示されます。

迷惑メール/ゴミ箱の除外、2 つの異なる失敗の形:

  • コンテナログの「special-use discovery: account NAME: ...」 は、そのアカウントの起動時の接続、ログイン、または LIST が完全に 失敗したことを意味します。その失敗時には、照合にフォールバックするフォルダ名が ないため、そのアカウントでは 何も除外されません — 組み込みの英語名リストによるものでも同様です — 接続の問題が 修正されるか、exclude_folders が手動で設定されるまで。

  • エラー行はないが、folders にまだ何も除外されていないと表示される 場合、 LIST は成功したことを意味します。サーバーが \Junk/\Trash 属性(RFC 6154 SPECIAL-USE サポートなし)をアドバタイズしないだけで、 そのフォルダ名が組み込みの英語リスト(junkspamtrashdeleted messagesdeleted itemsbulk mail)と一致しません。これはローカライズされたメールボックスの ケースです。たとえばドイツ語やフランス語のメールボックスなどで、修正方法は同じです。 exclude_folders を手動で設定してください。

accounts.json 内の exclude_folders、例:"exclude_folders": ["Papierkorb"] は、すべてのケースで SPECIAL-USE と組み込みリストの両方より 優先されます。

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

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Local MCP server for multi-account IMAP/SMTP email (iCloud + Gmail via app-specific passwords). Never marks mail read. Cross-folder search, idempotent sends, TLS verified.
    8
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables LLMs to search and read email from a notmuch archive, providing tools for searching threads, retrieving messages, and listing tags through an MCP endpoint.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Local IMAP/SMTP MCP server that lets Claude read, search, draft, send, flag, and move mail across multiple IMAP mailboxes. Credentials stay on your machine.
  • F
    license
    Not graded
    quality
    B
    maintenance
    A private, single-user MCP server that unifies Gmail, Microsoft 365/Outlook, and IMAP mailboxes for LLMs to search and read emails live, without storing or caching mailbox contents.

View all related MCP servers

Related MCP Connectors

  • Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only

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

  • Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.

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/wildsurfer/your-mail-mcp'

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