SMTP について
SMTP は、設定済みの SMTP アカウントを通じてメールを送る MCP サーバーです。送信は明示的に有効化するまで停止し、宛先を許可リストに限定したうえで、各メッセージに人の承認を求めます。
主な機能
- 01メールの作成とプレビュー
- 02メールの送信、返信、転送
- 03許可リストによる宛先制限
- 04送信前の人による承認
- 05固定の差出人アドレス
- 06TLS と送信上限の設定
活用シーン
- 01送信前にメール内容を確認
- 02許可された宛先へ承認済みメールを送信
- 03確認を経てメールに返信または転送
MCP 対応
SMTP 設定確認、宛先検証、メールプレビュー、接続テストを MCP クライアントに提供し、送信を有効にすると送信、返信、転送ツールも利用できます。送信ツールは初期状態で無効で、各メールに人の承認が必要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @ni-c/smtp-mcpSMTP_HOSTHostname of the SMTP server, e.g. smtp.example.net.SMTP_PORTPort. Defaults to 587 for starttls, 465 for implicit, 25 for none.SMTP_TLSstarttls (default), implicit or none. STARTTLS is required, never opportunistic.SMTP_USERUsername for SMTP authentication.SMTP_PASSWORDシークレットPassword or app-specific password for SMTP authentication.SMTP_FROMThe only sender this server will use, e.g. "Name <[email protected]>". There is no from parameter.SMTP_REPLY_TOReply-To header on every message, e.g. "Team <[email protected]>". Unset means no Reply-To header and replies go to SMTP_FROM. There is no reply_to parameter.SMTP_ALLOW_SENDSet to "true" to register the sending tools. Defaults to false: the server cannot send until it is set.SMTP_ALLOWED_RECIPIENTSComma-separated addresses and @domains this server may write to. Required with SMTP_ALLOW_SEND=true; "*" allows any.SMTP_MAX_RECIPIENTSMaximum distinct recipients across To, Cc and Bcc in one message. Default 10.SMTP_MAX_SENDS_PER_HOURSliding hourly cap on messages sent. Default 20.SMTP_MAX_MESSAGE_BYTESMaximum size of the composed message. Default 10485760.SMTP_MAX_ATTACHMENT_BYTESMaximum size of a single attachment. Default 5242880.SMTP_ATTACHMENT_DIRDirectory attachments are read from. Unset means attachments are unavailable.SMTP_ATTACHMENT_TYPESComma-separated content types that may be attached. Defaults to a document and image allowlist.SMTP_SIGNATUREText appended below the standard signature delimiter of every message.SMTP_AUDIT_LOGFile the audit lines are appended to, in addition to stderr.SMTP_ALLOW_TOOLSComma-separated tool names, a prefix with one trailing *, or "essential" for the curated preset.SMTP_DENY_TOOLSComma-separated tool names or prefixes to remove, applied after SMTP_ALLOW_TOOLS.SMTP_INSECURE_TLSSet to "true" to accept self-signed certificates. Prefer a proper internal CA.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
smtp-mcp
SMTP 用の Model Context Protocol(MCP)サーバーです。SMTP は、すべてのメールサーバーがメールの配送を受け付けるために使用するプロトコルです。
Claude Code、Claude Desktop、Codex などの MCP クライアントが、設定済みの 1 つのアドレスからメールの送信、返信、転送を行えるようにします。すべてのメールは、人が承認してから送信されます。
ツールは最大 7 つですが、必ず 7 つ必要なわけではありません。SMTP_ALLOW_TOOLS=essential を設定すると、厳選された 5 つのツールだけが登録されます。モデルは 7 つより 5 つのツールからのほうが、適切なツールをはるかに確実に選べます。読み込むツールの選択をご覧ください。
## 他との違い
メールを送信します。そのため、独立したサーバーです。 対となる imap-mcp はメールボックスを読み取りますが、意図的に 送信機能を持たせていません。この機能がないことこそが、セキュリティ上の主張のすべてです。プライベートなデータにアクセスでき、攻撃者が制御するコンテンツを処理するエージェントは、外部へ出る手段も持ったときに初めて悪用可能になるからです。 このサーバーはその出口に当たるため、同じ主張はできません。代わりに通信経路を狭め、独自の認証情報を使って別のプロセスで動作することで、その存在意義を果たします。
インストール時は無効です。 SMTP_ALLOW_SEND のデフォルトは false です。設定するまで送信ツールは登録されません。つまり、tools/list に表示されず、呼び出し時に拒否されるわけでもありません。
指定した宛先にのみ送信できます。 送信を有効にするには SMTP_ALLOWED_RECIPIENTS が必要です。接続を開く前に、To、Cc、Bcc のすべてのアドレスがこの設定と照合されるため、「別の人にメールを送れ」という注入された指示は、サーバーがそれを指示として読み取ることなく失敗します。すべての宛先を許可することもできますが、その場合は * と明記する必要があります。
すべてのメッセージは人が承認します。 モデルではありません。リクエストは MCP のエリシテーションとしてクライアントに送られます。宛先、件名、Bcc はそれぞれ独立したラベル付きの行に表示されるため、指示のように見える件名がサーバー自身の文の一部になることはありません。
送信者は選択できません。 from パラメーターはありません。モデルが送信者を選べると、同僚の名前を使ってメールを送信でき、その結果は本人が書いたメッセージと見分けがつかなくなります。
要件
- Node.js 22 以降
- 送信に使用できる SMTP アカウント — ポート 587 または 465 のサブミッションサーバーと、ユーザー名およびパスワードが必要です。通常、二要素認証を使用するプロバイダーでは、アプリ固有のパスワードが必要です。
設定
TLS を使用してください。
SMTP_TLS=starttls(デフォルト)はアップグレードを必須とし、アップグレードを試みるだけではありません。そのため、STARTTLS機能が除去されている場合、パスワードを平文で送信してしまうのではなく、接続が失敗します。自己署名証明書を使用する場合は、SMTP_INSECURE_TLSよりも適切な内部 CA を優先してください。 | 変数 | 必須 | デフォルト | 説明 | | --------------------------- | --------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------- | |SMTP_HOST| はい | — | SMTP サーバーのホスト名です。例:smtp.example.net。 | |SMTP_USER| はい | — | SMTP 認証に使用するユーザー名です。 | |SMTP_PASSWORD| はい | — | パスワードまたはアプリ固有のパスワードです。 | |SMTP_FROM| はい | — | 使用できる唯一の送信者です。例:Name <[email protected]>。fromパラメーターはありません。 | |SMTP_REPLY_TO| いいえ | — | すべてのメッセージに設定する Reply-To です。例:Team <[email protected]>。未設定の場合、返信先はSMTP_FROMになります。 | |SMTP_PORT| いいえ | 587 / 465 / 25 |SMTP_TLSによって異なります。 | |SMTP_TLS| いいえ |starttls|starttls、implicit、またはnone。機会的な TLS は使用しません。 | |SMTP_ALLOW_SEND| いいえ |false|trueに設定すると、送信ツールが登録されます。 | |SMTP_ALLOWED_RECIPIENTS|SMTP_ALLOW_SEND=trueの場合 | — | アドレスと@domainsをカンマ区切りで指定します。*を指定すると、すべての宛先が許可されます。 | |SMTP_MAX_RECIPIENTS| いいえ |10| 1 通のメッセージに含められる To、Cc、Bcc の重複しない宛先数です。 | |SMTP_MAX_SENDS_PER_HOUR| いいえ |20| 1 時間あたりの送信数の上限です。 | |SMTP_MAX_MESSAGE_BYTES| いいえ |10485760| 作成したメッセージのサイズ上限です。 | |SMTP_MAX_ATTACHMENT_BYTES| いいえ |5242880| 1 つの添付ファイルのサイズ上限です。 | |SMTP_ATTACHMENT_DIR| いいえ | — | 添付ファイルの読み込み元ディレクトリです。未設定の場合、添付ファイルは使用できません。 | |SMTP_ATTACHMENT_TYPES| いいえ | ドキュメントと画像の許可リスト | 添付を許可するコンテンツタイプをカンマ区切りで指定します。text/htmlとapplication/zipは明示的な許可が必要です。 | |SMTP_SIGNATURE| いいえ | — | 標準の--区切り文字の下に追加するテキストです。 | |SMTP_AUDIT_LOG| いいえ | — | 標準エラー出力に加えて、監査ログの行を追記するファイルです。 | |SMTP_ALLOW_TOOLS| いいえ | — | ツール名、末尾に*を 1 つ付けたプレフィックス、またはessentialを指定します。 | |SMTP_DENY_TOOLS| いいえ | — |SMTP_ALLOW_TOOLSの適用後に削除されます。 | |SMTP_INSECURE_TLS| いいえ |false| 自己署名証明書を受け入れます。 | |ELICITATION| いいえ |true|falseにすると、承認ダイアログが 2 回呼び出すトークンに置き換わります。プレフィックスは付きません。 | このファミリーのほかのものとは逆なので、次の2つのデフォルト設定はよく確認してください。
SMTP_ALLOW_SENDはオフです。 インストール直後の smtp-mcp では、メッセージの作成とプレビューはできますが、送信はできません。SMTP_ALLOWED_RECIPIENTSが未設定だと、起動エラーになります。「誰にでも」ではありません。 設定行がないことを許可として扱うと、誤操作が実際のメッセージ送信につながります。全員を許可する場合は*を指定してください。
読み込むツールの選択
SMTP_ALLOW_TOOLS で登録するツールを指定し、SMTP_DENY_TOOLS でその中から除外します。どちらも、カンマ区切りのツール名、または末尾に * が1つ付いたプレフィックスを指定します。フィルターで除外されたツールは構築されません。tools/list に表示されず、呼び出しへの応答は「見つかりません」となります。これは送信ゲートが閉じているときの送信ツールと同じです。公開した後で拒否するのではなく、最初から表示されません。
SMTP_ALLOW_TOOLS=essential # the curated five
SMTP_ALLOW_TOOLS='get_server_info,preview_mail'
SMTP_DENY_TOOLS=forward_mail # everything else, minus forwarding
essential は get_server_info、validate_recipients、preview_mail、send_mail、reply_mail です。forward_mail は含まれません。転送では他人のコンテンツや添付ファイルを外部に送るため、意図的に有効にすべきツールです。
どのツールにも一致しない項目があると、実際のツール名を一覧表示して起動が中止されます。tools/list にひっそり表示されなくなったツールは見えないため、環境変数が原因だと誰も気づきません。
インストール
Claude Code
claude mcp add smtp -- npx -y @ni-c/smtp-mcp
Claude Desktop
{
"mcpServers": {
"smtp": {
"command": "npx",
"args": ["-y", "@ni-c/smtp-mcp"],
"env": {
"SMTP_HOST": "smtp.example.net",
"SMTP_USER": "[email protected]",
"SMTP_PASSWORD": "app-specific-password",
"SMTP_FROM": "Your Name <[email protected]>",
"SMTP_ALLOW_SEND": "true",
"SMTP_ALLOWED_RECIPIENTS": "@example.net"
}
}
}
}
Codex
[mcp_servers.smtp]
command = "npx"
args = ["-y", "@ni-c/smtp-mcp"]
[mcp_servers.smtp.env]
SMTP_HOST = "smtp.example.net"
SMTP_USER = "[email protected]"
SMTP_PASSWORD = "app-specific-password"
SMTP_FROM = "Your Name <[email protected]>"
SMTP_ALLOW_SEND = "true"
SMTP_ALLOWED_RECIPIENTS = "@example.net"
Docker
docker run --rm -i \
-e SMTP_HOST=smtp.example.net \
-e [email protected] \
-e SMTP_PASSWORD=app-specific-password \
-e SMTP_FROM='Your Name <[email protected]>' \
-e SMTP_ALLOW_SEND=true \
-e [email protected] \
ghcr.io/ni-c/smtp-mcp
mcp-hub 経由
ローカルプロセスを起動できないクライアント(ChatGPT connectors、Claude on the web、
Cursor、LibreChat)は、mcp-hub 経由で smtp-mcp に接続できます。1つのコンテナで複数の stdio MCP サーバーを Streamable HTTP 経由で提供し、単一のパスワードによる OAuth 2.1 ログインと、OAuth に対応できないクライアント向けの長期間有効なトークンを備えています。/hub エンドポイントでは、すべてのサーバーが6つのメタツールの背後に置かれます。これにより、モデルのコンテキストに N×ツールのスキーマを含めることなく、1つのコネクターからすべてのサーバーにアクセスできます。また、両方のプロトコルリビジョンに対応しています。このサーバーが質問をすると、それは mcp-hub を経由して、相手側のユーザーに届きます。
/config/mcp.json は Claude Code の形式を使用するため、エントリーはすでにあるものと同じです。
{
"mcpServers": {
"smtp-mcp": {
"command": "npx",
"args": ["-y", "@ni-c/smtp-mcp"],
"env": {
"SMTP_HOST": "smtp.example.net",
"SMTP_USER": "[email protected]",
"SMTP_PASSWORD": "…",
"SMTP_FROM": "Your Name <[email protected]>",
"SMTP_ALLOW_TOOLS": "essential"
},
"denyTools": ["send_mail", "reply_mail"]
}
}
}
ここでの allowTools と denyTools は、ハブ独自のサーバーごとのフィルターであり、env に指定する *_ALLOW_TOOLS とは異なります。その違いと、そこから起こり得る間違いについては、クライアントガイドを参照してください。
ツール
常に登録されます。これらのツールではメッセージを送信できません。
| ツール | 機能 |
|---|---|
get_server_info | エンドポイント、固定送信者、許可リスト、制限、送信が有効かどうかを確認します。 |
validate_recipients | このサーバーからメールを送信できるアドレスと、それ以外が拒否される理由を確認します。接続は行いません。 |
preview_mail | send_mail が作成するものとまったく同じメッセージを作成して表示します。送信時に行われるすべてのチェックを実行します。 |
test_connection | 接続し、TLS をネゴシエートして、認証を行い、切断します。何も送信しません。実行は最大10秒に1回です。 |
SMTP_ALLOW_SEND=true の場合にのみ登録されます。👤 は、実行前に人間への確認を求めるツールを示します。
| ツール | 機能 |
|---|---|
send_mail 👤 | 新しいメッセージを送信します。 |
reply_mail 👤 | 元のメッセージのスレッドに返信します。件名から Re: を生成します。 |
forward_mail 👤 | 元のメッセージを一字一句そのまま引用し、新しい宛先に転送します。 |
構造化出力
すべてのツールはoutputSchemaを宣言し、テキストブロックとともに
structuredContentを返すため、クライアントは文章を解析せずに結果を利用できます。
{
"sent": true,
"already_sent": false,
"message_id": "<b1c9…@example.net>",
"accepted": ["[email protected]", "[email protected]"],
"rejected": [],
"bytes": 1284,
"sends_remaining_this_hour": 9,
"note": "The SMTP server accepted the message. It cannot be recalled.",
}
preview_mailは、untrusted: trueとsource: "smtp"をフィールドとして持つ唯一のツールです。引用された原文は送信者が書いたものであり、誰でもメールを送信できるためです。テキストブロックではnonceフェンスを維持し、構造化データにも同じフィールドを含めることで、クライアントが解析する必要のないようにしています。ここにあるそれ以外のものは、このサーバー自身の設定か、サーバー自身が送信した結果を報告するものであり、このマーカーを付けると、誰が書いたかについて誤った主張になります。
あえて公開していないもの
fromパラメーター。 送信者はSMTP_FROMだけで指定し、それ以外はありません。- 確認をスキップする方法。
forceも「信頼できる呼び出し元」モードもありません。ゲートを無効にするオプションがあれば、プロンプトインジェクションが真っ先に狙うでしょう。 - メールの読み取り。 それはimap-mcpの役割です。別々の認証情報を使い、2つを別々のプロセスに分けることが、どちらも安全に保つための重要な要素です。
- 任意のヘッダー。 スレッド化には
in_reply_toとreferencesを使用します。ヘッダー名をそのまま渡す機能はありません。そうするのは、手順を増やしたヘッダーインジェクションだからです。 - DKIM署名。 送信サーバーが代わりに署名します。環境変数に秘密の署名鍵を置くのは、一見したほど得策ではありません。
安全性
- 送信はデフォルトで無効であり、有効になるまでツールは存在しません。
- 接続を開く前に、To、Cc、Bccのすべての宛先を許可リストと照合します。
- MCPのエリシテーションを通じて、人間がすべてのメッセージを承認します。 2回の呼び出しによるトークンのフォールバックは、それが同じものではないことを明確に示します。
- 確認はメッセージそのものに紐付けられます。 宛先リストをソートしたものとコンテンツのダイジェストからSHA-256フィンガープリントを生成するため、別のテキストや、より広い宛先リストに承認を流用できません。
- ダイアログにはエンベロープだけでなく、メッセージが表示されます。 本文、引用された原文、HTML部分を、それぞれ文字数とともに表示します。ここにあるほかの仕組みは、メッセージの宛先を制限しますが、これはメッセージの内容を制限します。
- Bccの宛先は、ラベル付きの独立した行に表示されます。 人間に見えない隠し宛先は、理想的な情報流出経路になり得ます。
- 確認文では、呼び出し元が指定した値をサーバー自身の文に引用しません。
- 同じメッセージが二度送信されることはありません。 承認は、誰かがあるメッセージに同意したことを示しますが、それを再度送信することに同意したわけではありません。そのため、SMTPサーバーが受け付けたメッセージは、その承認を再利用できる期間中、記録されます。
- 送信するHTMLからスクリプト、イベントハンドラー、リモート読み込み画像、安全でないURLスキームを除去し、除去した項目はすべて報告します。 気付かれないまま除去されることはありません。確実に無害化できないマークアップは、修復せずに拒否します。
- 引用された原文は変更せずに引き継ぎ、該当するプロンプトインジェクションのパターンをダイアログに明記します。
- 添付ファイルは
SMTP_ATTACHMENT_DIR内のものに限り、拡張子の許可リスト、シンボリックリンクの拒否、マジックバイトの検査を通過したものだけを使用します。 - 受け付けたメッセージはすべてstderrに記録し、必要に応じてファイルにも記録します。本文は記録しません。
その背景にある考え方と、これらの対策でカバーされない内容については、SECURITY.mdをご覧ください。
ドキュメント
完全なガイド、ツールリファレンス、安全性に関する注意事項は
smtp-mcp.ni-c.de(ソースはdocs/)にあります。
開発
npm install
npm test
npm run build
test/integration/には、使い捨てのMailpitサンドボックスがあります。実際のメールボックスではなく、こちらを使って開発してください。このサーバーの役割はメッセージを送信することであり、テストの実行に失敗すると、実在する人々に実際のメールが送られてしまいます。
docker compose -f test/integration/compose.yml up -d --wait
npm run build && npm run test:integration
リリース
main で vX.Y.Z タグを付けると、リリースワークフローが実行されます。このワークフローでは、タグが package.json と一致することを確認し、Trusted Publishing を通じて provenance 付きで npm に公開し、SBOM を含むマルチアーキテクチャイメージを GHCR にプッシュし、CHANGELOG のセクションから GitHub リリースを作成して、バージョンを MCP Registry に登録します。
コントリビューション
Issue、ディスカッション、プルリクエストを歓迎します。詳しくは CONTRIBUTING.md をご覧ください。脆弱性については、公開 Issue ではなく 非公開での報告 をご利用ください。ポリシーは SECURITY.md に記載されています。
ライセンス
MIT © Willi Thiel
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。