An MCP server implementation for Postmark email services.
- Exposes a Model Context Protocol (MCP) server for sending emails via Postmark
- Simple configuration via environment variables
- Comprehensive error handling and graceful shutdown
- Secure logging practices (no sensitive data exposure)
- Automatic email tracking configuration
- Node.js (v16 or higher recommended)
- A Postmark account and server token
-
Clone the repository:
git clone https://github.com/ActiveCampaign/postmark-mcp cd postmark-mcp
-
Install dependencies:
npm install
-
Configure environment variables:
- Copy
.env.example
to.env
:cp .env.example .env
- Edit
.env
and fill in your Postmark credentials and settings.
Variable Description Required POSTMARK_SERVER_TOKEN Your Postmark server API token Yes DEFAULT_SENDER_EMAIL Default sender email address Yes DEFAULT_MESSAGE_STREAM Postmark message stream (e.g., 'outbound') Yes - Copy
-
Run the server:
npm start
You can quickly install this MCP server in Cursor by clicking the following button:
Note: After clicking the button, you'll need to:
- Set your
POSTMARK_SERVER_TOKEN
in the MCP configuration- Set your
DEFAULT_SENDER_EMAIL
in the MCP configuration- Set your
DEFAULT_MESSAGE_STREAM
in the MCP configuration (defaults to "outbound")
This section provides a complete reference for the Postmark MCP server tools, including example prompts and expected payloads for each.
Sends a single text email.
Example Prompt:
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. Please bring your quarterly statistics report (and maybe some snacks).""
Expected Payload:
{
"to": "[email protected]",
"subject": "Meeting Reminder",
"textBody": "Don't forget our team meeting tomorrow at 2 PM. Please bring your quarterly statistics report (and maybe some snacks).",
"htmlBody": "HTML version of the email body", // Optional
"from": "[email protected]", // Optional, uses DEFAULT_SENDER_EMAIL if not provided
"tag": "meetings" // Optional
}
Response Format:
Email sent successfully!
MessageID: message-id-here
To: [email protected]
Subject: Meeting Reminder
Sends an email using a pre-defined template.
Example Prompt:
Send an email with Postmark template alias "welcome" to [email protected] with the following template variables:
{
"name": "John Doe",
"product_name": "MyApp",
"login_url": "https://myapp.com/login"
}
Expected Payload:
{
"to": "[email protected]",
"templateId": 12345, // Either templateId or templateAlias must be provided, but not both
"templateAlias": "welcome", // Either templateId or templateAlias must be provided, but not both
"templateModel": {
"name": "John Doe",
"product_name": "MyApp",
"login_url": "https://myapp.com/login"
},
"from": "[email protected]", // Optional, uses DEFAULT_SENDER_EMAIL if not provided
"tag": "onboarding" // Optional
}
Response Format:
Template email sent successfully!
MessageID: message-id-here
To: [email protected]
Template: template-id-or-alias-here
Lists all available templates.
Example Prompt:
Show me a list of all the email templates available in our Postmark account.
Response Format:
📋 Found 2 templates:
• Basic
- ID: 12345678
- Alias: basic
- Subject: none
• Welcome
- ID: 02345679
- Alias: welcome
- Subject: none
Retrieves email delivery statistics.
Example Prompt:
Show me our Postmark email delivery statistics from 2025-05-01 to 2025-05-15 for the "marketing" tag.
Expected Payload:
{
"tag": "marketing", // Optional
"fromDate": "2025-05-01", // Optional, YYYY-MM-DD format
"toDate": "2025-05-15" // Optional, YYYY-MM-DD format
}
Response Format:
Email Statistics Summary
Sent: 100 emails
Open Rate: 45.5% (45/99 tracked emails)
Click Rate: 15.2% (15/99 tracked links)
Period: 2025-05-01 to 2025-05-15
Tag: marketing
All emails are automatically configured with:
TrackOpens: true
TrackLinks: "HtmlAndText"
- Message stream from
DEFAULT_MESSAGE_STREAM
environment variable
The server implements comprehensive error handling:
- Validation of all required environment variables
- Graceful shutdown on SIGTERM and SIGINT
- Proper error handling for API calls
- No exposure of sensitive information in logs
- Consistent error message formatting
- Uses appropriate log levels (
info
for normal operations,error
for errors) - Excludes sensitive information from logs
- Provides clear operation status and results
For more information about the Postmark API, visit Postmark's Developer Documentation.