Email (IMAP/SMTP) について
Email (IMAP/SMTP) は、LLM 向けの複数アカウント対応メール MCP サーバーです。IMAP/SMTP でメールの閲覧、送信、検索、整理を行い、OAuth2 や接続プール、レート制限、リトライも備えています。
主な機能
- 01複数アカウントのメールアクセス
- 02メールの閲覧・検索・整理
- 03メールの送信・返信・転送
- 04添付ファイルとスレッドの操作
- 05OAuth2 デバイスコード認証
- 06接続プール・制限・リトライ
活用シーン
- 01複数アカウントを横断したメール検索
- 02受信トレイの一括整理
- 03添付ファイル付きメールの送信
- 04メールスレッドと添付ファイルの確認
MCP 対応
アカウント、フォルダー、メール、添付ファイル、下書きを扱う 22 種類のメールツールを MCP クライアントに公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e EMAIL_CONFIG_FILE -e EMAIL_ACCOUNTS ghcr.io/boutquin/mcp-server-email:latestEMAIL_CONFIG_FILEPath to account JSON config fileEMAIL_ACCOUNTSシークレットInline JSON array of account configsローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/boutquin/mcp-server-email:lateststdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
mcp-server-email
Model Context Protocol 用の複数アカウント対応メールサーバーです。LLM が IMAP/SMTP 経由でメールの読み取り、送信、検索、整理を行えるようにします。接続プーリング、レート制限、再試行に対応しています。apple-bridge(ローカルの Mail.app へのアクセス)に対する、リモートメール用の機能として設計されています。
クイックスタート
-
インストール
go install github.com/boutquin/mcp-server-email/cmd/mcp-server-email@latest -
設定ファイルを作成(
~/.config/mcp-email/accounts.json)よく利用されるプロバイダー(Gmail、Outlook、Yahoo、iCloud、Fastmail、Zoho)の場合、メールドメインからホストとポートが自動検出されます。認証情報を指定するだけです。
[ { "id": "hello", "email": "[email protected]", "username": "[email protected]", "password": "app-password-here" } ]カスタムメールサーバーの場合は、ホストとポートを明示的に指定します。
[ { "id": "work", "email": "[email protected]", "imap_host": "mail.example.com", "imap_port": 993, "smtp_host": "mail.example.com", "smtp_port": 465, "username": "[email protected]", "password": "app-password-here" } ]chmod 600 ~/.config/mcp-email/accounts.json -
Claude Code に追加(
~/.claude.json){ "mcpServers": { "email": { "command": "mcp-server-email", "env": { "EMAIL_CONFIG_FILE": "~/.config/mcp-email/accounts.json" } } } } -
Claude Code を再起動 —
email_*ツールが使用できるようになります。
インストール
Go Install(Go 開発者におすすめ)
go install github.com/boutquin/mcp-server-email/cmd/mcp-server-email@latest
Homebrew(macOS/Linux)
brew install boutquin/tap/mcp-server-email
バイナリのダウンロード
お使いのプラットフォーム用のビルド済みバイナリを GitHub Releases からダウンロードしてください。
対応プラットフォーム:Linux(amd64、arm64)、macOS(amd64、arm64)、Windows(amd64、arm64)。
Docker
docker run --rm \
-e EMAIL_ACCOUNTS='[{"id":"main","email":"[email protected]","imap_host":"mail.example.com","imap_port":993,"smtp_host":"mail.example.com","smtp_port":465,"username":"[email protected]","password":"app-password"}]' \
ghcr.io/boutquin/mcp-server-email:latest
MCP Bundle(Claude Desktop)
Releases から .mcpb ファイルをダウンロードし、Claude Desktop で開いてください。
ソースからビルド
git clone https://github.com/boutquin/mcp-server-email.git
cd mcp-server-email
go build -o mcp-server-email ./cmd/mcp-server-email
設定
アカウントは起動時に一度だけ読み込まれます。変更を反映するには、サーバーを再起動する必要があります。
設定ファイルと環境変数
| 方法 | 適した用途 |
|---|---|
EMAIL_CONFIG_FILE — JSON ファイルへのパス | 本番環境での使用。ファイルのアクセス権を制限できます(chmod 600) |
EMAIL_ACCOUNTS — 環境変数内のインライン JSON | テスト、CI、コンテナ化されたデプロイ |
両方が設定されている場合は、EMAIL_ACCOUNTS が優先されます。
アカウント JSON スキーマ
[
{
"id": "hello",
"email": "[email protected]",
"imap_host": "mail.example.com",
"imap_port": 993,
"smtp_host": "mail.example.com",
"smtp_port": 465,
"username": "[email protected]",
"password": "app-password-here"
}
]
| フィールド | 必須 | 説明 |
|---|---|---|
id | はい | 一意のアカウント識別子 |
email | はい | メールアドレス |
imap_host | いいえ* | IMAP サーバーのホスト名 |
imap_port | いいえ* | IMAP ポート(993 = 暗黙的 TLS、143 = STARTTLS) |
smtp_host | いいえ* | SMTP サーバーのホスト名 |
smtp_port | いいえ* | SMTP ポート(465 = 暗黙的 TLS、587 = STARTTLS) |
username | はい | ログインユーザー名 |
password | はい** | アプリパスワードまたはアカウントのパスワード |
use_starttls | いいえ | TLS の自動検出を上書きします(true/false) |
insecure_skip_verify | いいえ | TLS 証明書の検証をスキップします(開発・テスト用) |
auth_method | いいえ | "password"(デフォルト)または "oauth2" |
oauth_client_id | いいえ | OAuth2 クライアント ID(auth_method が "oauth2" の場合に必須) |
oauth_client_secret | いいえ | OAuth2 クライアントシークレット |
oauth_token_file | いいえ | トークンファイルのパスを上書きします |
*よく利用されるプロバイダーの場合、ホストとポートは自動検出されます(下記参照)。カスタムサーバーでは必須です。 **OAuth2 認証を使用する場合は不要です。
プロバイダーの自動検出
imap_host/smtp_host が省略されている場合、サーバーはメールドメインから設定を検出します。
| プロバイダー | ドメイン | IMAP | SMTP |
|---|---|---|---|
| Gmail | gmail.com、googlemail.com | imap.gmail.com:993 | smtp.gmail.com:587 |
| Outlook | outlook.com、hotmail.com、live.com | outlook.office365.com:993 | smtp.office365.com:587 |
| Yahoo | yahoo.com | imap.mail.yahoo.com:993 | smtp.mail.yahoo.com:587 |
| iCloud | icloud.com、me.com、mac.com | imap.mail.me.com:993 | smtp.mail.me.com:587 |
| Fastmail | fastmail.com、fastmail.fm | imap.fastmail.com:993 | smtp.fastmail.com:587 |
| Zoho | zoho.com、zohomail.com | imap.zoho.com:993 | smtp.zoho.com:587 |
設定でホスト/ポートが明示的に指定されている場合は、常に自動検出より優先されます。
TLS モード
TLS モードはポートから自動検出されます。
| ポート | プロトコル | モード |
|---|---|---|
| 993 | IMAP | 暗黙的 TLS |
| 143 | IMAP | STARTTLS |
| 465 | SMTP | 暗黙的 TLS |
| 587 | SMTP | STARTTLS |
アカウントオブジェクトで "use_starttls": true または "use_starttls": false を指定すると上書きできます。自動検出を使用する場合(推奨)は省略してください。
OAuth2 認証
対応しているプロバイダー(Gmail、Outlook)では、アプリパスワードの代わりに OAuth2 を使用できます。デバイスコードフロー(RFC 8628)を使用するため、ブラウザーへのリダイレクトは不要です。
-
プロバイダーの開発者コンソール(Google Cloud Console または Azure AD)で OAuth2 認証情報を作成します
-
auth_method: "oauth2"を指定して アカウントを設定します。[ { "id": "gmail", "email": "[email protected]", "username": "[email protected]", "auth_method": "oauth2", "oauth_client_id": "your-client-id.apps.googleusercontent.com", "oauth_client_secret": "your-client-secret" } ] -
初回接続時に、サーバーがデバイスコードフローを開始し、確認用 URL とコードを stderr に出力します。URL にアクセスし、コードを入力して認証します。
-
トークンは
~/.config/mcp-email/tokens/に保存され、自動的に更新されます。2 回目以降の接続では、保存済みトークンが再利用されるため、再認証は不要です。
OAuth2 対応プロバイダー:Gmail(gmail.com、googlemail.com)および Outlook(outlook.com、hotmail.com、live.com)。
環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
EMAIL_CONFIG_FILE | はい* | — | JSON 設定ファイルのパス |
EMAIL_ACCOUNTS | はい* | — | アカウント設定の JSON 配列(インライン) |
EMAIL_DEFAULT_ACCOUNT | いいえ | 最初のアカウント | デフォルトのアカウント ID |
EMAIL_IMAP_TIMEOUT_MS | いいえ | 30000 | IMAP 操作のタイムアウト(ms) |
EMAIL_SMTP_TIMEOUT_MS | いいえ | 30000 | SMTP 操作のタイムアウト(ms) |
EMAIL_IMAP_RATE_LIMIT | いいえ | 60 | アカウントあたりの IMAP リクエスト数/分 |
EMAIL_SMTP_RATE_LIMIT | いいえ | 100 | アカウントあたりの SMTP 送信数/時間 |
MAX_ATTACHMENT_SIZE_MB | いいえ | 18 | 添付ファイル 1 件あたりの最大サイズ(MB) |
MAX_TOTAL_ATTACHMENT_SIZE_MB | いいえ | 18 | メッセージあたりの添付ファイル合計の最大サイズ(MB) |
MAX_DOWNLOAD_SIZE_MB | いいえ | 25 | 添付ファイルの最大ダウンロードサイズ(MB) |
EMAIL_POOL_CLOSE_TIMEOUT_MS | いいえ | 5000 | プールのクローズタイムアウト(ms) |
EMAIL_DEBUG | いいえ | false | stderr へのデバッグログ出力 |
LOG_LEVEL | いいえ | info | ログレベル:debug、info、warn、error |
LOG_FORMAT | いいえ | json | ログ形式:json または text |
*EMAIL_CONFIG_FILE または EMAIL_ACCOUNTS のいずれかが必要です。
設定ファイルのアクセス権
設定ファイルにはアカウントのパスワードが含まれています。必ずアクセスを制限してください。
chmod 600 ~/.config/mcp-email/accounts.json
ツール(22)
アカウントとフォルダーのツール
| ツール | 説明 | 主なパラメーター |
|---|---|---|
email_accounts | 接続状況とともに設定済みアカウントを一覧表示 | — |
email_folders | 未読数/合計数とともにすべてのフォルダーを一覧表示 | account? |
email_folder_create | 新しいフォルダーを作成 | name、account? |
メッセージの一覧表示
| ツール | 説明 | 主なパラメーター |
|---|---|---|
email_list | フォルダー内のメッセージを一覧表示 | folder?, limit?, offset?, includeBody?, account? |
email_unread | 未読メッセージを一覧表示 | folder?, limit?, includeBody?, account? |
email_search | 件名と本文を検索 | query, from?, to?, since?, before?, folder?, limit?, includeBody?, account? |
メッセージの操作
| ツール | 説明 | 主なパラメーター |
|---|---|---|
email_get | IDでメッセージ全体を取得 | id |
email_read_body | ページネーションを使ってメール本文を読む | id, offset?, limit?, format? |
email_move | メッセージをフォルダーに移動 | id, destination |
email_copy | メッセージをフォルダーにコピー | id, destination |
email_delete | メッセージを削除(ゴミ箱に移動、または完全に消去) | id, permanent? |
email_mark_read | 既読/未読に設定 | id, read |
email_flag | メッセージにフラグを設定/解除 | id, flagged |
email_reply | メッセージに返信(In-Reply-To、Referencesを設定し、本文を引用) | id, body, all?, cc?, bcc?, isHtml?, account? |
email_forward | メッセージを転送(元の添付ファイルを再添付) | id, to, body?, cc?, bcc?, isHtml?, account? |
email_batch | 複数のメッセージに対する一括操作 | action, ids, destination?, permanent?, read?, flagged? |
添付ファイルとスレッド
| ツール | 説明 | 主なパラメーター |
|---|---|---|
email_attachment_list | メッセージの添付ファイルを一覧表示 | id |
email_attachment_get | インデックスで添付ファイルをダウンロード | id, index, saveTo? |
email_thread | 会話スレッドを取得(INBOX、Sent、Archive、All Mailを横断して検索) | id |
送信と下書き
| ツール | 説明 | 主なパラメーター |
|---|---|---|
email_send | 任意の添付ファイルを付けてSMTP経由で送信 | to, subject, body, cc?, bcc?, replyTo?, isHtml?, attachments?, account? |
email_draft_create | 任意の添付ファイルを付けて下書きを保存 | to?, subject?, body?, cc?, bcc?, isHtml?, attachments?, account? |
email_draft_send | 既存の下書きを送信 | id |
省略可能なaccountパラメーターはすべて、設定済みのデフォルトアカウントを使用します。
検索
email_searchはIMAPのSEARCH OR (SUBJECT "q") (BODY "q")を使用して、件名と本文の両方を検索します。
省略可能なフィルターを使うと、本文をスキャンする前にサーバー側で候補を絞り込めます。
| フィルター | 形式 | 例 |
|---|---|---|
from | メールアドレスまたは名前 | "[email protected]" |
to | メールアドレスまたは名前 | "[email protected]" |
since | YYYY-MM-DD | "2026-01-01" |
before | YYYY-MM-DD | "2026-02-01" |
既存の操作タイムアウト(デフォルト30秒)により、大きなメールボックスで本文検索がハングするのを防ぎます。
添付ファイル
email_sendとemail_draft_createは、サーバーホスト上のファイル参照を指定するattachmentsパラメーター(配列)を受け付けます。
{
"attachments": [
{"path": "/tmp/report.pdf"},
{"path": "/tmp/data.csv", "filename": "Q1-data.csv", "content_type": "text/csv"}
]
}
| パラメーター | 必須 | 説明 |
|---|---|---|
path | はい | サーバーホスト上の絶対ファイルパス |
filename | いいえ | 表示ファイル名を上書きします(デフォルトはpathのベース名) |
content_type | いいえ | MIMEタイプ(省略した場合、ファイル拡張子から自動検出) |
制限(デフォルト): 1ファイルあたり18 MB、合計18 MB(base64エンコード前。エンコード後もSMTPの上限25 MB以内に収まります)。環境変数MAX_ATTACHMENT_SIZE_MBおよびMAX_TOTAL_ATTACHMENT_SIZE_MBで設定できます。
ダウンロード制限: 添付ファイルのダウンロード(email_attachment_get)はデフォルトで25 MBまでです。環境変数MAX_DOWNLOAD_SIZE_MBで設定できます。
検証に失敗した場合(ファイルが見つからない、絶対パスでない、サイズ超過)は、INVALID_ARGUMENTを返します。
メッセージ ID
メッセージ ID は、アカウント、メールボックス、UID をエンコードした複合文字列です。
{account}:{mailbox}:{uid}
例:hello:INBOX:12345
すべての CRUD ツール(email_get、email_move、email_copy、email_delete、email_mark_read、email_flag、email_draft_send)は、ID からアカウントとフォルダーを抽出するため、別途パラメーターを指定する必要はありません。
エラーコード
すべてのエラーは、構造化されたコードのプレフィックス付きで MCP ツールエラーとして返されます。
| コード | 意味 |
|---|---|
AUTH_FAILED | IMAP/SMTP 認証に失敗しました |
CONNECTION_FAILED | サーバーに接続できません |
ACCOUNT_NOT_FOUND | 不明なアカウント ID です |
FOLDER_NOT_FOUND | メールボックスが存在しません |
MESSAGE_NOT_FOUND | メールボックス内に UID が見つかりません |
INVALID_ARGUMENT | パラメーターがないか、無効です(添付ファイルの検証を含む) |
TIMEOUT | 操作がタイムアウトしました |
INTERNAL | 予期しないサーバーエラーです |
リソース
| URI | 説明 |
|---|---|
email://status | サーバーのバージョン、アカウントの接続状態、レート制限の設定 |
apple-bridge との比較
このサーバーと apple-bridge は、Email モデルとパラメーターのセマンティクス(limit、includeBody、folder、query)を共有しているため、LLM は両者を互換的に使用できます。主な違いは次のとおりです。
| 項目 | mcp-server-email | apple-bridge |
|---|---|---|
| トランスポート | IMAP/SMTP(リモート) | Mail.app(ローカル) |
| ツールのプレフィックス | email_* | mail_* |
| メッセージ ID | {account}:{mailbox}:{uid} | RFC 5322 Message-ID |
| フォルダーの作成 | 対応 | 非対応(Mail.app では UI が必要) |
| メッセージのコピー | 対応 | 非対応 |
| 下書きの送信 | 対応 | 非対応(Mail.app では作成 UI を使用) |
| 添付ファイル(送信) | サーバーホスト上のファイルパス | 未対応 |
開発
前提条件
- Go 1.24+
- golangci-lint
- Docker(統合テストのみで使用)
ビルド
go build ./...
単体テスト
make test
# or: go test -race -count=1 ./...
単体テストでは、imap.Operations と smtp.Operations インターフェースのモック実装を使用するため、稼働中のメールサーバーは必要ありません。
ベンチマーク
go test -bench=. -benchmem ./...
| ベンチマーク | パッケージ | 測定内容 |
|---|---|---|
BenchmarkPoolGetRelease | imap | 接続プールの取得/解放サイクル |
BenchmarkExtractAttachments | imap | MIME 添付ファイルの抽出 |
BenchmarkHtmlToText | tools | HTML からプレーンテキストへの変換 |
BenchmarkLimiterAllow | retry | レートリミッター(逐次処理) |
BenchmarkLimiterAllow_Parallel | retry | レートリミッター(並列処理) |
ファズテスト
ファズテストのターゲットには、testdata/fuzz/ ディレクトリ内のシードコーパスが付属しています。特定のターゲットを実行するには、次のようにします。
go test -fuzz=FuzzParseMessageID ./internal/models/ -fuzztime=30s
| ターゲット | パッケージ | ファズテストの対象 |
|---|---|---|
FuzzBuildSearchCriteria | imap | IMAP 検索クエリビルダー |
FuzzExtractAttachmentByIndex | imap | 添付ファイルのインデックス境界処理 |
FuzzExtractContentType | imap | MIME Content-Type パーサー |
FuzzParseMessageID | models | 複合メッセージ ID のコーデック |
FuzzHtmlToText | tools | HTML からテキストへのサニタイザー |
FuzzSplitAddresses | tools | メールアドレスリストの分割処理 |
リント
make lint
# or: golangci-lint run ./...
統合テスト
統合テストでは、実際のメールサーバーに対して IMAP/SMTP スタック全体をテストします。これらのテストは integration ビルドタグで分離されており、go test ./... の実行時には実行されません。
メールサーバー:Greenmail
テストでは、Docker イメージとしてパッケージ化された軽量な Java メールサーバーである Greenmail を使用します。実行方法に影響する主な詳細は次のとおりです。
| 設定 | 値 | 重要な理由 |
|---|---|---|
| IMAPS ポート | 3993 | Greenmail の SSL IMAP ポートです(993 ではありません)。コードはポート番号から TLS を自動検出するため、テストでは UseStartTLS=false を明示的に設定し、この標準外ポートで暗黙的 TLS を使用します。 |
| SMTPS ポート | 3465 | Greenmail の SSL SMTP ポートです(465 ではありません)。同様に UseStartTLS=false で上書きします。 |
| バインドアドレス | 0.0.0.0 | Greenmail はコンテナ内で 127.0.0.1 をデフォルトにします。そのため Docker のポートマッピングがひそかに失敗し、接続が EOF になります。-Dgreenmail.hostname=0.0.0.0 を必ず渡してください。 |
| ユーザー名 | test | Greenmail は、ログインユーザー名にメールアドレス全体ではなく、@ より前のローカル部のみを使用します。ユーザーが [email protected] の場合、IMAP/SMTP のユーザー名は test です。 |
| TLS 証明書 | 自己署名 | Greenmail は自己署名証明書を生成します。テストではアカウント設定で InsecureSkipVerify: true を設定し、証明書を受け入れます。 |
クイックスタート(1 コマンド)
make test-integration
Greenmail コンテナを起動し、すべての統合テストを実行した後、成功・失敗にかかわらずコンテナを削除します。
手動での手順
コンテナを毎回再起動せずにテストを繰り返し実行する場合は、次の手順に従ってください。
-
Greenmail を起動
docker run -d --name greenmail \ -p 3465:3465 -p 3993:3993 \ -e "GREENMAIL_OPTS=-Dgreenmail.setup.test.all -Dgreenmail.users=test:[email protected] -Dgreenmail.hostname=0.0.0.0" \ greenmail/standalone:2.1.0JVM が起動するまで約 3 秒待ちます。
-
統合テストを実行
TEST_IMAP_HOST=localhost TEST_IMAP_PORT=3993 \ TEST_SMTP_HOST=localhost TEST_SMTP_PORT=3465 \ [email protected] TEST_PASSWORD=password \ go test -tags=integration -race -v ./... -
完了したら停止
docker stop greenmail && docker rm greenmail
テスト環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
TEST_IMAP_HOST | はい* | — | IMAP サーバーのホスト名です。未設定の場合、テストはスキップされます。 |
TEST_IMAP_PORT | いいえ | 3993 | IMAPS ポート |
TEST_SMTP_HOST | はい* | — | SMTP サーバーのホスト名です。未設定の場合、テストはスキップされます。 |
TEST_SMTP_PORT | いいえ | 3465 | SMTPS ポート |
TEST_EMAIL | いいえ | [email protected] | テストアカウントのメールアドレス |
TEST_USERNAME | いいえ | TEST_EMAIL のローカル部 | IMAP/SMTP のログインユーザー名(Greenmail はローカル部のみを使用) |
TEST_PASSWORD | いいえ | password | アカウントのパスワード |
*対応する HOST 変数が未設定の場合、そのテストファイルのテストは失敗ではなく、メッセージを表示してスキップされます。
テストの対象範囲
IMAP(internal/imap/integration_test.go — 7 件のテスト):
| テスト | 検証内容 |
|---|---|
ConnectAndListFolders | TLS 接続、認証、フォルダー一覧の取得、INBOX の存在 |
SendAndListMessages | SMTP 送信から IMAP 受信までの往復、本文の内容一致 |
SearchBySubject | 件名文字列による IMAP SEARCH |
DeleteMessagePermanent | 削除フラグの設定と expunge、メッセージが削除されたことの確認 |
MoveMessage | IMAP MOVE による別フォルダーへの移動(サーバーが MOVE 拡張に対応していない場合はスキップ) |
DraftWorkflow | SaveDraft → GetDraft → DeleteDraft のライフサイクル(APPENDUID がない場合はスキップ) |
MarkReadAndFlag | 既読・フラグ付きフラグの設定と、GetMessage による確認 |
SMTP(internal/smtp/integration_test.go — 4 件のテスト):
| テスト | 検証内容 |
|---|---|
SendPlainText | プレーンテキストメールの配信、IMAP による本文内容の確認 |
SendHTML | HTML メールの配信、Content-Type が text/html であることの確認 |
SendWithAttachment | 添付ファイル付きのマルチパート MIME、メタデータに含まれるファイル名の確認 |
RateLimitTokenConsumption | 送信によるレート制限トークンの消費 |
トラブルシューティング
| 症状 | 原因 | 対処方法 |
|---|---|---|
接続時に EOF または connection reset が発生する | コンテナ内で Greenmail が 127.0.0.1 にバインドされている | GREENMAIL_OPTS に -Dgreenmail.hostname=0.0.0.0 を追加します |
TLS handshake failure/証明書エラーが発生する | 自己署名証明書が拒否されている | テスト設定ではすでに InsecureSkipVerify: true を設定しています。新しいテストを書く場合も同様にしてください |
Invalid login/password が発生する | メールアドレス全体をユーザー名として使用している | Greenmail が想定するのはローカル部分のみです([email protected] ではなく test)。TEST_USERNAME を設定するか、デフォルト値を使用してください。 |
ポート 3993 で STARTTLS エラーが発生する | 暗黙的な TLS 用のポートで STARTTLS を使用している | テスト設定では UseStartTLS=false を設定しています。ポート 3143/3025(平文、TLS なし)は使用しないでください。 |
| 「not set」と表示されてテストがスキップされる | TEST_IMAP_HOST/TEST_SMTP_HOST がエクスポートされていない | 環境変数をエクスポートするか、make test-integration ターゲットを使用してください |
MoveMessage テストがスキップされる | Greenmail が MOVE をサポートしていない可能性がある | 想定どおりです。このテストでは t.Skip() を使用しています |
CI
統合テストは、.github/workflows/ci.yml の integration ジョブを通じて GitHub Actions で自動的に実行されます。このジョブでは Greenmail のサービスコンテナを使用するため、手動で Docker を設定する必要はありません。詳しい設定については、ワークフローファイルを参照してください。
カバレッジ
単体テストと統合テストをまとめたカバレッジレポートを生成するには、次のコマンドを実行します。
# With Greenmail running (see above):
TEST_IMAP_HOST=localhost TEST_IMAP_PORT=3993 \
TEST_SMTP_HOST=localhost TEST_SMTP_PORT=3465 \
[email protected] TEST_PASSWORD=password \
go test -tags=integration -race -coverprofile=coverage.out ./...
go tool cover -func=coverage.out | tail -1 # total percentage
go tool cover -html=coverage.out # open in browser
アーキテクチャ
mcp-server-email/
├── cmd/mcp-server-email/ # Entry point
└── internal/
├── auth/ # OAuth2 device code flow, XOAUTH2 SASL, token store
├── config/ # Multi-account configuration, provider auto-detection
├── imap/ # IMAP client (split by concern), connection pool, Operations interface
│ ├── client.go # Client struct, lifecycle, shared helpers
│ ├── client_messages.go # List, search, get, attachments
│ ├── client_folders.go # Folder ops, role cache
│ ├── client_drafts.go # Draft save/get/delete
│ ├── client_flags.go # Flags, move, copy, delete
│ └── pool.go # Connection pool with configurable close timeout
├── log/ # Structured logging (slog) initialization
├── models/ # Email model, message ID codec, error types
├── resources/ # email://status resource
├── retry/ # Token-bucket rate limiter
├── smtp/ # SMTP client, Operations interface
└── tools/ # 22 MCP tool handlers + registration
ツールハンドラーは imap.Operations および smtp.Operations インターフェースを介して IMAP/SMTP クライアントから分離されており、モックを使った包括的な単体テストが可能です。
依存関係
このプロジェクトでは go-imap v2(現在 v2.0.0-beta.8)を使用しています。
v2 API はまだ安定していないため、v2.0.0 のリリース前に破壊的変更が発生する可能性があります。
go.mod で正確なバージョンを固定しており、安定版のリリース後は速やかにアップグレードします。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。