mcpField
S
SMTP

SMTP

ローカル
smtp-mcp.ni-c.deコミュニケーション0今日更新

SMTP について

SMTP は、設定済みの SMTP アカウントを通じてメールを送る MCP サーバーです。送信は明示的に有効化するまで停止し、宛先を許可リストに限定したうえで、各メッセージに人の承認を求めます。

主な機能

  1. 01メールの作成とプレビュー
  2. 02メールの送信、返信、転送
  3. 03許可リストによる宛先制限
  4. 04送信前の人による承認
  5. 05固定の差出人アドレス
  6. 06TLS と送信上限の設定

活用シーン

  1. 01送信前にメール内容を確認
  2. 02許可された宛先へ承認済みメールを送信
  3. 03確認を経てメールに返信または転送

MCP 対応

SMTP 設定確認、宛先検証、メールプレビュー、接続テストを MCP クライアントに提供し、送信を有効にすると送信、返信、転送ツールも利用できます。送信ツールは初期状態で無効で、各メールに人の承認が必要です。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"ni-c-smtp": {
"command": "npx",
"args": [
"-y",
"@ni-c/smtp-mcp"
],
"env": {
"SMTP_HOST": "<SMTP_HOST>",
"SMTP_PORT": "<SMTP_PORT>",
"SMTP_TLS": "<SMTP_TLS>",
"SMTP_USER": "<SMTP_USER>",
"SMTP_PASSWORD": "<SMTP_PASSWORD>",
"SMTP_FROM": "<SMTP_FROM>",
"SMTP_REPLY_TO": "<SMTP_REPLY_TO>",
"SMTP_ALLOW_SEND": "<SMTP_ALLOW_SEND>",
"SMTP_ALLOWED_RECIPIENTS": "<SMTP_ALLOWED_RECIPIENTS>",
"SMTP_MAX_RECIPIENTS": "<SMTP_MAX_RECIPIENTS>",
"SMTP_MAX_SENDS_PER_HOUR": "<SMTP_MAX_SENDS_PER_HOUR>",
"SMTP_MAX_MESSAGE_BYTES": "<SMTP_MAX_MESSAGE_BYTES>",
"SMTP_MAX_ATTACHMENT_BYTES": "<SMTP_MAX_ATTACHMENT_BYTES>",
"SMTP_ATTACHMENT_DIR": "<SMTP_ATTACHMENT_DIR>",
"SMTP_ATTACHMENT_TYPES": "<SMTP_ATTACHMENT_TYPES>",
"SMTP_SIGNATURE": "<SMTP_SIGNATURE>",
"SMTP_AUDIT_LOG": "<SMTP_AUDIT_LOG>",
"SMTP_ALLOW_TOOLS": "<SMTP_ALLOW_TOOLS>",
"SMTP_DENY_TOOLS": "<SMTP_DENY_TOOLS>",
"SMTP_INSECURE_TLS": "<SMTP_INSECURE_TLS>"
}
}
}
}
起動コマンドnpx -y @ni-c/smtp-mcp
設定が必要な環境変数
SMTP_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@ni-c/smtp-mcp0.2.0
ocighcr.io/ni-c/smtp-mcp:0.2.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

smtp-mcp

CI OpenSSF Scorecard Socket Badge Glama score
npm version container image HTTP via mcp-hub
docs sponsor

SMTP 用の Model Context Protocol(MCP)サーバーです。SMTP は、すべてのメールサーバーがメールの配送を受け付けるために使用するプロトコルです。

Claude Code、Claude Desktop、Codex などの MCP クライアントが、設定済みの 1 つのアドレスからメールの送信、返信、転送を行えるようにします。すべてのメールは、人が承認してから送信されます。

ツールは最大 7 つですが、必ず 7 つ必要なわけではありません。SMTP_ALLOW_TOOLS=essential を設定すると、厳選された 5 つのツールだけが登録されます。モデルは 7 つより 5 つのツールからのほうが、適切なツールをはるかに確実に選べます。読み込むツールの選択をご覧ください。

stdio 経由で smtp-mcp と通信する MCP クライアント。smtp-mcp は各宛先を許可リストと照合し、人にメールの承認を求めてから、TLS 経由で送信サーバーに渡します 7 つのツールを一覧表示した後、send_mail を呼び出します。メールは送信されず、宛先と件名がそれぞれラベル付きの行に表示され、承認を求められます。続いて、許可リストにないアドレスを指定して 2 回目の呼び出しを行うと、接続が開かれる前に拒否されます ## 他との違い

メールを送信します。そのため、独立したサーバーです。 対となる 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_mailsend_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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。