Postmark MCP Server について
Postmark MCP Serverは、MCP対応アシスタントからPostmarkのメール送信やアカウント操作を行うサーバーです。テンプレート、配信診断、Webhookにも対応します。
主な機能
- 01単件・一括・テンプレートメールの送信
- 02テンプレートの作成・編集・検証・削除
- 03メッセージ検索と配信診断
- 04バウンス、抑制リスト、Webhookの管理
- 05配信統計とサーバー情報の取得
活用シーン
- 01アシスタントからトランザクションメールを送信
- 02個別データを使ったテンプレートメールの一括送信
- 03配信失敗やバウンスの調査
- 04Postmarkの利用状況確認とWebhook設定
MCP 対応
MCPクライアントにPostmarkアカウント操作用のツールを提供します。ツールのアノテーションで読み取り専用、変更、破壊的操作を区別します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
公式 Postmark MCP サーバー

Claude やその他の MCP 対応 AI アシスタントを使って、Postmark からメールを送信できます。
機能
- Postmark アカウントを基盤とする Model Context Protocol(MCP)サーバーを公開します
- メール送信(単件および一括)、テンプレート(CRUD および検証)、メッセージ検索、配信診断、バウンス、抑制、統計、サーバー情報、Webhook に対応する 24 個のツール
- MCP ツールのアノテーション(
readOnlyHint、destructiveHint)により、対応クライアントは安全な読み取りを自動承認し、変更や破壊的な操作の前に確認を求めることができます - 環境変数によるシンプルな設定
- 包括的なエラー処理と正常なシャットダウン
- stderr への構造化 JSON ログ出力と、オプションのログファイルへの保存。メールアドレスはデフォルトで一部がマスクされます
- HTTPS の強制と、Webhook 登録時に使用できるオプションのドメイン許可リスト
- すべての送信で開封・クリックを自動追跡
便利なドキュメント
- 📒 API ドキュメント
- 🔎 API エクスプローラー
- 📖 エンジニアリング記事
- 📝 変更履歴 — 各リリースの新機能
フィードバック
ぜひご意見をお聞かせください。フィードバックフォームからご意見やご提案をお寄せください。
X でフォローしてください - @postmarkapp
セットアップ
要件
- Node.js v22 以降。Node.js の各メジャーバージョンで最新のパッチリリースを使用してください。2026 年 10 月の Node.js セキュリティリリースを参照してください。
- Postmark アカウントとサーバートークン
インストール(ローカル開発)
リポジトリをクローンします:
git clone https://github.com/ActiveCampaign/postmark-mcp
cd postmark-mcp
依存関係をインストールします:
npm install
# or
yarn
# or
bun install
設定(ローカル開発)
サンプルから独自の環境ファイルを作成します
cp .env.example .env
.env を編集し、Postmark の認証情報と設定を記述します。
重要: これはローカル開発のみを目的としています。シークレットをバージョン管理に保存してはなりません。また、.env 形式のファイルは .gitignore に追加してください。
必須
| 変数 | 説明 |
|---|---|
POSTMARK_SERVER_TOKEN | Postmark サーバーの API トークン |
DEFAULT_SENDER_EMAIL | デフォルトの送信元メールアドレス(Postmark で認証済みの送信元である必要があります) |
DEFAULT_MESSAGE_STREAM | Postmark のメッセージストリーム(例:outbound) |
オプション
| 変数 | デフォルト | 説明 |
|---|---|---|
AGENT_LABEL | — | このインスタンスのラベルです(例:prod、staging)。すべての Postmark API リクエストで X-Agent-Label として送信され、ログやサポートチケットでトラフィックの送信元を特定するのに役立ちます。 |
WEBHOOK_URL_ALLOWLIST | — | createWebhook が受け付ける HTTPS URL プレフィックスをカンマ区切りで指定します(例:https://hooks.yourapp.com,https://inbound.corp.io)。未設定の場合、有効な HTTPS URL はすべて受け付けられます。 |
LOG_FILE | — | 標準エラー出力に加えて、構造化 JSON ログを追記するファイルのパスです。ファイルが存在しない場合は作成されます。ローテーションやサイズ上限はありません。長時間稼働するデプロイでは、logrotate などの外部ツールを使用してファイルを管理してください。 |
LOG_EMAIL_FULL | false | true に設定すると、マスキングせずにメールアドレスをログに記録します。デフォルトでは、ログ内のメールボックス部分が一部マスキングされます(u**[email protected])。 |
サーバーを実行します:
npm start
# or
yarn start
# or
bun start
スモークテスト(有効な .env が必要です):
リポジトリには、スモークテスト用のサンプルファイルが2つ含まれています。実行前に、それぞれをサンプルではない名前にコピーしてください(コピー先は gitignore の対象です)。これにより、確認済みの送信者アドレスを含むローカルの編集内容がコミットされることを防げます。
# Read-only suite (25 checks). Optionally edit RECIPIENT_WITH_HISTORY.
cp smoke-test.example.mjs smoke-test.mjs
npm run smoke
# Mutating suite (full lifecycles + real email sends).
# REQUIRED: edit SENDER and RECIPIENT to two of your verified addresses.
cp smoke-test-mutating.example.mjs smoke-test-mutating.mjs
node smoke-test-mutating.mjs
読み取り専用のテストスイートは、stdio 経由でサーバーを起動し、Postmark アカウントに対してすべての読み取りツールと、editTemplate および createWebhook の検証パスを実行します。メールの送信や状態の変更は行いません。
変更を伴うテストスイートは、テンプレート(レイアウトのバインドを含む)、Webhook、抑制リストの作成→編集→削除の一連のライフサイクルを実行し、設定した2つのアドレス間で実際のメールを送信します。テスト後にはクリーンアップを行います。プレースホルダー値が残っている間は、スクリプトの実行が拒否されます。
Cursor クイックインストール
MCP のインストール後、設定を更新して以下を指定してください:
POSTMARK_SERVER_TOKENDEFAULT_SENDER_EMAILDEFAULT_MESSAGE_STREAM(デフォルト:outbound)
MCP クライアントの設定
npx を使用する(推奨 — クローン不要)
ローカルコピーを管理せずに、npm から直接インストールします:
{
"mcpServers": {
"postmark": {
"command": "npx",
"args": ["-y", "@activecampaign/postmark-mcp"],
"env": {
"POSTMARK_SERVER_TOKEN": "your-postmark-server-token",
"DEFAULT_SENDER_EMAIL": "[email protected]",
"DEFAULT_MESSAGE_STREAM": "outbound"
}
}
}
}
ローカルクローンを使用する
{
"mcpServers": {
"postmark": {
"command": "node",
"args": ["/absolute/path/to/postmark-mcp/index.js"],
"env": {
"POSTMARK_SERVER_TOKEN": "your-postmark-server-token",
"DEFAULT_SENDER_EMAIL": "[email protected]",
"DEFAULT_MESSAGE_STREAM": "outbound"
}
}
}
}
どちらのスニペットも、Claude Desktop(~/Library/Application Support/Claude/claude_desktop_config.json)、Cursor(.cursor/mcp.json)、および標準の JSON 設定形式を受け入れるその他の MCP クライアントで使用できます。
ツール
このセクションでは、Postmark MCP サーバーのツールについて、プロンプトやペイロードの例を含む完全なリファレンスを提供します。サーバーには、8つのカテゴリに分類された24個のツールが登録されています。
目次
メール
sendEmail
1 人、または最大 50 人の宛先にトランザクションメールを送信します。
プロンプトの例:
Send an email using Postmark to [email protected] with the subject "Meeting Reminder" and the message "Don't forget our team meeting tomorrow at 2 PM."
想定ペイロード:
{
"to": "[email protected]",
"subject": "Meeting Reminder",
"textBody": "Don't forget our team meeting tomorrow at 2 PM.",
"htmlBody": "<p>Don't forget our team meeting tomorrow at 2 PM.</p>",
"from": "[email protected]",
"cc": "[email protected]",
"bcc": "[email protected]",
"replyTo": "[email protected]",
"tag": "meetings"
}
to には、単一のアドレスまたは最大 50 件のアドレスの配列を指定できます。htmlBody、from、cc、bcc、replyTo、tag は任意です。from を省略した場合は、DEFAULT_SENDER_EMAIL が使用されます。
レスポンス:
Email sent successfully!
MessageID: 0a1b2c3d-...
To: [email protected]
Subject: Meeting Reminder
sendEmailWithTemplate
Postmark のテンプレートを使用してメールを送信します。
プロンプトの例:
Send the "welcome" template to [email protected] with name "John Doe" and login_url "https://myapp.com/login".
想定ペイロード:
{
"to": "[email protected]",
"templateAlias": "welcome",
"templateModel": {
"name": "John Doe",
"login_url": "https://myapp.com/login"
},
"from": "[email protected]",
"tag": "onboarding"
}
templateId(数値)または templateAlias(文字列)のどちらか一方を指定してください。両方は指定できません。
レスポンス:
Template email sent successfully!
MessageID: 0a1b2c3d-...
To: [email protected]
Template: welcome
sendBatch
1 回の API 呼び出しで最大 500 件のメールを送信します。各メッセージは、宛先、件名、本文がそれぞれ独立しています。Postmark の同期バッチエンドポイント(POST /email/batch)を利用し、メッセージごとの結果をすぐに返します。
注: Postmark では、大量配信ジョブ向けに、メッセージ数の上限がなく、ペイロード上限が 50 MB の非同期一括メール API(
POST /email/bulk)も提供されています。このエンドポイントでは、送信後に結果をポーリングするワークフローが使用されますが、現在この MCP サーバーではラップされていません。
想定ペイロード:
{
"messages": [
{
"to": "[email protected]",
"subject": "Order #1234 confirmed",
"textBody": "Thanks Alice — your order is on its way.",
"tag": "order-confirmation"
},
{
"to": "[email protected]",
"subject": "Order #1235 confirmed",
"textBody": "Thanks Bob — your order is on its way.",
"tag": "order-confirmation"
}
]
}
メッセージごとに、to、subject、textBody が必須です。htmlBody、from、cc、bcc、replyTo、tag は任意です。メッセージの from を省略した場合は、DEFAULT_SENDER_EMAIL が使用されます。
レスポンス:
Sent 2/2 successfully
Successes:
- [email protected] — abc-123-def
- [email protected] — abc-456-ghi
一部のメッセージの送信が受け付けられなかった場合(例:抑制対象の宛先)、エラーコード(ErrorCode)と理由とともに、失敗したメッセージが先に表示されます。
Sent 8/10 successfully (2 failed)
Failures:
- [email protected] — 406: Address has been suppressed.
- [email protected] — 300: Inactive recipient
...
sendBatchWithTemplate
最大 500 件のテンプレートメールを送信します。同じテンプレートを使用し、宛先ごとにテンプレートモデルを指定します。「新規ユーザーごとにこのオンボーディングテンプレートをレンダリングする」といったワークフローに最適です。
想定ペイロード:
{
"templateAlias": "welcome",
"from": "[email protected]",
"tag": "onboarding",
"recipients": [
{ "to": "[email protected]", "templateModel": { "name": "Alice", "plan": "Pro" } },
{ "to": "[email protected]", "templateModel": { "name": "Bob", "plan": "Free" } }
]
}
templateId(数値)または templateAlias(文字列)のどちらか一方を指定してください。トップレベルの from と tag はすべての宛先に適用されますが、宛先ごとに上書きできます。各宛先では、任意の cc、bcc、replyTo も指定できます。
レスポンス: sendBatch と同じ形式です。
テンプレート
listTemplates
このサーバーに保存されているテンプレートを一覧表示します。最初の 100 件のテンプレートを返します。サーバーに 100 件を超えるテンプレートがある場合、ページネーションはまだサポートされていないため、レスポンスに結果が切り詰められたことが示されます。
レスポンス:
Found 2 templates:
• **Welcome**
- ID: 12345678
- Alias: welcome
- Subject: Welcome to {{product_name}}
getTemplate
1 件のテンプレートの全コンテンツ(HTML 本文、テキスト本文、件名、種類)を取得します。
ペイロード: { "templateIdOrAlias": "welcome" } — 数値の ID または文字列のエイリアスを指定できます。
createTemplate
新しいテンプレートを作成します。name が必要です。htmlBody または textBody の少なくとも一方を指定する必要があります。
Standard テンプレートでは subject が必須で、Layout テンプレートでは 省略する必要があります。Postmark は Layout でこのフィールドを受け付けません。
layoutTemplate(Standard のみ)を指定すると、新しいテンプレートがエイリアスで既存の Layout に紐付けられます。指定しない場合、新しいテンプレートは Layout の装飾なしでレンダリングされます。
想定ペイロード:
{
"name": "Order Confirmation",
"subject": "Your order #{{order_id}} is confirmed",
"htmlBody": "<h1>Thanks {{name}}</h1>",
"textBody": "Thanks {{name}}",
"alias": "order-confirmation",
"templateType": "Standard",
"layoutTemplate": "basic"
}
templateType は "Standard"(デフォルト)または "Layout" を指定できます。
editTemplate
既存のテンプレートを更新します。templateIdOrAlias と、更新するフィールド(name、subject、htmlBody、textBody、alias、layoutTemplate)の 少なくとも1つ が必要です。
"layoutTemplate": null を指定すると、テンプレートと現在の Layout の紐付けが解除されます(MCP はこれを、紐付け解除に必要な Postmark API の空文字列に変換します)。
deleteTemplate
ID またはエイリアスを指定して、テンプレートを完全に削除します。Standard テンプレートが紐付けられている間は Layout テンプレートを削除できません。先に editTemplate で紐付けを解除してください。
ペイロード: { "templateIdOrAlias": "order-confirmation" }
validateTemplate
テンプレートの内容を保存せずに検証します(Mustachio の構文、未定義の変数)。subject、htmlBody、textBody の少なくとも1つが必要です。
想定ペイロード:
{
"subject": "Order #{{order_id}}",
"htmlBody": "<p>Thanks {{name}}</p>",
"textBody": "Thanks {{name}}",
"testRenderModel": { "order_id": 42, "name": "John" },
"templateType": "Standard"
}
メッセージ
searchOutboundMessages
送信メッセージの履歴を検索します。
想定ペイロード(すべてのフィルターは任意):
{
"recipient": "[email protected]",
"fromEmail": "[email protected]",
"tag": "marketing",
"subject": "Welcome",
"status": "sent",
"messageStream": "outbound",
"fromDate": "2025-05-01",
"toDate": "2025-05-15",
"count": 50,
"offset": 0
}
status は queued、sent、processed のいずれかです。count は1~500(デフォルトは50)です。
getMessageDetails
単一の送信メッセージの詳細とイベントのタイムラインを取得します。
ペイロード: { "messageId": "0a1b2c3d-..." }
診断
diagnoseDelivery
複合的なトリアージツールです。宛先アドレスを指定してメッセージ検索、抑制チェック、バウンス履歴の照会を並列に実行し、結果をわかりやすい推奨事項にまとめることで、「メールは X に届いたか。届いていない場合、その理由は何か」という問いに答えます。
これは 診断 ツールです。単一のエンドポイントをそのまま反映するのではなく、複数の Postmark API 呼び出しを組み合わせて、まとまりのある回答を返します。
プロンプトの例:
Did my email to [email protected] get delivered? If not, what should I do?
想定ペイロード:
{
"recipient": "[email protected]",
"messageId": "0a1b2c3d-...",
"fromDate": "2026-04-21",
"toDate": "2026-04-28",
"messageStream": "outbound"
}
recipient 以外のフィールドはすべて任意です。messageId を省略すると、その宛先への最新のメッセージが使用されます。デフォルトの検索期間は直近7日間です。
応答例:
Delivery Diagnosis: [email protected]
────────────────────────────────────────────────
Suppression: not suppressed on stream "outbound"
Most recent message:
MessageID: fadeae4e-fb04-4102-9303-9876078c7b81
Subject: Welcome to MyApp
Sent: 2026-04-27T18:42:19.0000000-04:00
Status: Sent
Events: Delivered, Opened×2, Clicked
Bounce history: none
Recommended action:
Email was delivered. If recipient says they didn't see it, check their
spam folder or ask them to whitelist the sender domain.
宛先が抑制されている場合、理由によって推奨事項が異なります。SpamComplaint は解除できませんが、HardBounce は再有効化できる場合があり、ManualSuppression は deleteSuppressions で削除できます。
バウンス
searchBounces
種類、宛先、タグ、メッセージ ID、メッセージストリーム、日付範囲、有効/無効の状態で任意にフィルターして、バウンスログを検索します。
想定ペイロード(すべて任意):
{
"type": "HardBounce",
"inactive": true,
"emailFilter": "@example.com",
"tag": "marketing",
"messageID": "0a1b2c3d-...",
"messageStream": "outbound",
"fromDate": "2025-05-01",
"toDate": "2025-05-15",
"count": 50,
"offset": 0
}
サポートされている type の値(Postmark の BounceType 列挙型に一致する22種類):AddressChange、AutoResponder、BadEmailAddress、Blocked、ChallengeVerification、DMARCPolicy、DnsError、HardBounce、InboundError、ManuallyDeactivated、OpenRelayTest、SMTPApiError、SoftBounce、SpamComplaint、SpamNotification、Subscribe、TemplateRenderingFailed、Transient、Unconfirmed、Unknown、Unsubscribe、VirusNotification。
getBounceDump
バウンスの生の SMTP ダンプを返します。バウンスダンプは30日間保持されます。
ペイロード: { "bounceId": 123456 }
activateBounce
無効化されたメールアドレスを再有効化します(CanActivate: true のバウンスのみ)。
ペイロード: { "bounceId": 123456 }
抑制
listSuppressions
メッセージストリームの抑制を一覧表示します。
想定ペイロード(すべて任意):
{
"messageStream": "outbound",
"suppressionReason": "HardBounce",
"origin": "Recipient",
"emailAddress": "[email protected]",
"fromDate": "2025-05-01",
"toDate": "2025-05-15"
}
suppressionReason は HardBounce、SpamComplaint、ManualSuppression のいずれかです。origin は Recipient、Customer、Admin のいずれかです。messageStream を省略すると、DEFAULT_MESSAGE_STREAM が使用されます。
createSuppressions
メッセージストリームで最大 50 件のメールアドレスを抑制します。
ペイロード: { "emailAddresses": ["[email protected]", "[email protected]"], "messageStream": "outbound" }
deleteSuppressions
抑制リストから最大 50 件のアドレスを削除します。注:SpamComplaint の抑制は削除できません。
ペイロード: { "emailAddresses": ["[email protected]"], "messageStream": "outbound" }
統計とサーバー
getDeliveryStats
統合統計ツールです。デフォルトではわかりやすい概要を返します。特定の内訳を表示するには、任意の stat を指定します。
想定ペイロード(すべて省略可能):
{
"stat": "summary",
"tag": "marketing",
"fromDate": "2025-05-01",
"toDate": "2025-05-15",
"messageStream": "outbound"
}
対応する stat の値:
stat | 返される内容 |
|---|---|
summary (デフォルト) | 開封率/クリック率/バウンス率/スパム率の概要 |
overview | すべての概要件数(送信数、追跡数、開封数、クリック数、バウンス数など) |
sent | 送信数 |
bounces | 種類別のバウンス内訳 |
spam | スパム苦情件数 |
tracked | 追跡対象のメール件数 |
opens | 開封数合計とユニーク開封数 |
openPlatforms | 開封プラットフォームの内訳(デスクトップ/モバイル/Webメール/不明) |
openClients | メールクライアント上位 10 件(Apple Mail、Gmail など) |
openReadTimes | 閲覧時間のヒストグラム |
clicks | リンククリック数合計とユニーククリック数 |
clickBrowsers | クリックに使用されたブラウザー上位 10 件 |
clickPlatforms | クリックプラットフォームの内訳(デスクトップ/モバイル/Webメール/不明) |
clickLocation | HTML とプレーンテキストのクリック位置 |
デフォルトの概要レスポンス:
Email Delivery Summary
Sent: 74
Tracked: 33 (44.6% of sent)
Open rate: 93.9% (31/33 unique opens)
Click rate: 4.8% (10/207 unique links clicked)
Bounced: 1 (1.4%)
Spam: 0 (0.0%)
Period: 2025-05-01 → 2025-05-15
Tag: marketing
stat: "openPlatforms" のレスポンス例:
Open Platform Usage
Desktop 20 (64.5%)
Mobile 0 (0.0%)
WebMail 11 (35.5%)
Unknown 0 (0.0%)
getServerInfo
Postmark サーバーの名前、色、追跡設定、Webhook URL を返します。
ペイロード: {}
Webhook
listWebhooks
設定済みの Webhook を一覧表示します。messageStream で任意のフィルターを指定できます。
createWebhook
Webhook サブスクリプションを作成します。url と、少なくとも 1 つのトリガーが必要です。
セキュリティに関する注意: Webhook は永続的です。一度登録すると、Webhook が削除されるまで、そのサーバーで今後発生するすべての一致イベント(開封、クリック、バウンス、スパム苦情など)のイベントデータが、Postmark から登録先 URL に POST されます。自分が管理する URL のみを登録してください。WEBHOOK_URL_ALLOWLIST を使用すると、許可する URL を既知のプレフィックスに制限できます。
url には HTTPS を使用する必要があります。HTTP URL は拒否されます。WEBHOOK_URL_ALLOWLIST が設定されている場合、URL は設定済みのプレフィックスのいずれかにも一致する必要があります。
想定ペイロード:
{
"url": "https://hooks.yourapp.com/postmark",
"messageStream": "outbound",
"openEnabled": true,
"clickEnabled": true,
"deliveryEnabled": false,
"bounceEnabled": true,
"spamComplaintEnabled": true,
"subscriptionChangeEnabled": false
}
deleteWebhook
ID を指定して Webhook を削除します。
ペイロード: { "webhookId": 1234567 }
実装の詳細
API リクエストヘッダー
Postmark API へのすべてのリクエストには、クライアントを識別するために次のヘッダーが含まれます。
| ヘッダー | 説明 |
|---|---|
X-Postmark-Client | 常に postmark-mcp です。このサーバーがリクエスト元であることを示します |
X-Postmark-Client-Version | この MCP サーバーのバージョンです。パッケージのバージョンと一致します |
X-Postmark-MCP-Client | MCP ホストアプリケーションの名前とバージョンです(例:claude-desktop/1.0)。MCP の initialize ハンドシェイクから取得されます。クライアントがこの情報を提供しない場合は省略されます。 |
X-Agent-Label | AGENT_LABEL 環境変数の値です。設定されていない場合は省略されます。 |
このサーバーは独自の HTTP クライアントを使用しており、postmark npm パッケージは使用しません。そのため、Postmark のログやサポートチケットで MCP トラフィックを postmark-mcp として識別できます。
自動設定
すべてのメールには次の設定が自動的に適用されます。
TrackOpens: trueTrackLinks: "HtmlAndText"DEFAULT_MESSAGE_STREAM環境変数に基づくメッセージストリーム
エラー処理
このサーバーは包括的なエラー処理を実装しています。
- 必須環境変数をすべて検証します
- SIGTERM と SIGINT で正常にシャットダウンします
- API 呼び出しのエラーを適切に処理します
- ログに機密情報を出力しません
- 一貫した形式でエラーメッセージを表示します
ログ記録
すべてのツール呼び出しは、構造化された JSON 行を stderr に出力します。LOG_FILE が設定されている場合、同じ行がそのファイルにも追記されます。
ログエントリの形式:
{
"timestamp": "2026-06-16T20:34:01.123Z",
"tool": "sendEmail",
"clientName": "claude-desktop",
"clientVersion": "1.0",
"args": {
"to": "u**[email protected]",
"subject": "Meeting Reminder",
"textBody": "[312ch]"
},
"status": "ok",
"durationMs": 243
}
エラーが発生した場合、status は "error" となり、error フィールドにメッセージが含まれます。
ログに記録されるデータと記録されないデータ:
| データ | 記録方法 |
|---|---|
| メールアドレス | 一部をマスク:u**[email protected](無効にするには LOG_EMAIL_FULL=true を設定) |
htmlBody / textBody | バイト数のみ:[312ch] |
templateModel およびその他のデータオブジェクト | キー名のみ:{ "_keys": ["name", "plan"] } |
バッチの messages / recipients 配列 | 件数と宛先リスト:{ "_count": 2, "_recipients": ["u**r@…", "a*b@…"] } |
password、secret、token、apikey に一致するフィールド | [redacted] |
| ツール名、所要時間、MCP クライアントの識別情報、ステータス | すべて記録 |
起動、シャットダウン、API 接続に関する非構造化の運用メッセージは、JSON ツールログと併せて、引き続きプレーンテキストとして stderr に出力されます。
セキュリティに関する考慮事項
アクセス範囲
この MCP サーバーは、設定された POSTMARK_SERVER_TOKEN のすべての権限で動作します。バルクメール送信、テンプレート管理、Webhook 登録、抑制リストの編集など、24 個のツールを公開し、接続するすべての MCP クライアントが利用できます。
Postmark には2 種類のトークンがあります。Server Token(ここで使用)と Account Token です。どちらも権限をサブスコープに分割する機能には対応していません。Server Token は、そのトークンが属するサーバー上のすべての操作へのフルアクセスを許可します。実際に公開範囲を制限する方法は、構成によるものです。
- MCP トラフィック専用の専用 Postmark サーバーを作成します。侵害された場合の影響を、アカウント全体ではなく、そのサーバーのデータと設定に限定できます。
- そのサーバーには、実際に必要なメッセージストリームと、検証済みの送信者署名のみを設定します。
- トークンが漏えいした場合は、ローテーションします。
ツールの影響範囲
24 個のツールには、影響の大きい操作がいくつか含まれています。以下にリスクレベル別の内訳を示します。
| カテゴリ | ツール |
|---|---|
| 破壊的(取り消し不可) | editTemplate、deleteTemplate、deleteWebhook、deleteSuppressions |
| 送信(メールの送信) | sendEmail、sendEmailWithTemplate、sendBatch、sendBatchWithTemplate |
| 追加(アカウント状態の変更) | createTemplate、createSuppressions、createWebhook、activateBounce |
| 読み取り専用 | 残りのすべての 12 個のツール |
すべてのツールには MCP アノテーション(readOnlyHint、destructiveHint、idempotentHint)が付いています。アノテーションに対応する MCP クライアント(Cursor や Claude Desktop など)は、安全な読み取り専用の参照(readOnlyHint: true)を自動承認でき、読み取り以外の操作(送信、テンプレート編集、抑制リストの変更、Webhook の管理)には確認プロンプトを表示します。データを完全に削除するツールには、破壊的な操作と単なる変更操作を区別するクライアント向けに、destructiveHint: true も付いています。
Webhook URL ポリシー
createWebhook は、すべての URL に HTTPS を必須とします。Webhook を登録すると、削除されるまで Postmark は継続的にイベントデータ(開封、クリック、バウンス、迷惑メールの苦情)をその URL に POST します。侵害されたツール呼び出しや誤ったツール呼び出しによって、自分が管理していないコールバックが登録されるのを防ぐには、所有する HTTPS プレフィックスを WEBHOOK_URL_ALLOWLIST に設定します。listWebhooks または Postmark ダッシュボードから、登録済みの Webhook を定期的に監査してください。
Webhook の受信側を保護するには、ネットワークまたはファイアウォールのレベルでPostmark が公開している送信 IP アドレスを許可リストに登録し、Postmark だけがエンドポイントに POST できるようにします。
プロンプトインジェクションのリスク
この MCP サーバーはメールを送信し、Webhook を登録できるため、プロンプトインジェクションの標的となる可能性があります。メール、テンプレート、またはリポジトリ内の悪意あるコンテンツによって、AI が意図しない引数でツールを呼び出すおそれがあります。上記の緩和策(専用トークン、MCP クライアントでのツール承認、WEBHOOK_URL_ALLOWLIST)により、発生した場合の影響範囲を抑えられます。信頼できない環境では、送信ツールや破壊的なツールを自動承認する設定にしないでください。
Postmark API の詳細については、Postmark の開発者向けドキュメントをご覧ください。
ライセンス
MIT © ActiveCampaign
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。