100+ integrations are ready to connect to your AI.Connect your first MCP

Postmark MCP server for your AI

Find out in one call why an address isn't getting mail, reactivate a bounced address, send a batch of emails in one call, edit and preview a template, and pull bounce, open and click stats.

PopMCPPostmark

Did jane@northwind.co get her password reset email? If a bounce deactivated her address, reactivate it

Supported Postmark tools

Postmark's server and account APIs, plus a one-call delivery diagnosis. Account-level tools need the Account API token.

postmark_get_bounce_counts

Bounces by type per day: { Days: [ { Date, HardBounce, SoftBounce, SMTPApiError, Transient } ], HardBounce, SoftBounce, SMTPApiError, Transient }.

postmark_get_click_counts

Link clicks: { Days: [ { Date, Clicks, Unique } ], Clicks, Unique }.

postmark_get_open_counts

Opens: { Days: [ { Date, Opens, Unique } ], Opens, Unique }.

postmark_get_outbound_overview

Headline sending stats for a date range: { Sent, Bounced, SMTPApiErrors, BounceRate, SpamComplaints, SpamComplaintsRate, Opens, UniqueOpens, Tracked, WithOpenTracking, WithLinkTracking, TotalTrackedLinksSent, UniqueLinksClicked, TotalClicks, WithClientRecorded, WithPlatformRecorded }.

postmark_get_inbound_message

One inbound email in full: headers, TextBody, HtmlBody, StrippedTextReply, attachments metadata, BlockedReason and processing history.

postmark_get_outbound_message

Everything about one sent email, including its body and MessageEvents (Delivered, Bounced, Opened, LinkClicked, SubscriptionChanged, Transient) with timestamps and details.

postmark_search_inbound_messages

Search email received on the server's inbound address.

postmark_search_outbound_messages

Search sent email (Postmark keeps it for the account's retention period, 45 days by default).

postmark_list_domains

List sending domains in the account (needs the Account API token): { TotalCount, Domains: [ { ID, Name, DKIMVerified, ReturnPathDomainVerified, … } ] }.

postmark_create_template

Create a template (Mustachio syntax: {{var}}, {{#each items}}…{{/each}}).

postmark_create_webhook

Subscribe a URL to delivery events (Delivery, Bounce, SpamComplaint, Open, Click, SubscriptionChange) on one message stream.

postmark_get_bulk_email_status

Status of a bulk send: { Id, SubmittedAt, Status (Accepted | Processing | Completed | …), TotalMessages, PercentageCompleted, ReleasedCount, FailedCount, Subject }.

postmark_get_template

One template with its full content: { TemplateId, Name, Alias, Subject, HtmlBody, TextBody, TemplateType, LayoutTemplate, Active, AssociatedServerId }.

postmark_list_templates

List templates on this server: { TotalCount, Templates: [ { TemplateId, Name, Alias, TemplateType (Standard | Layout), LayoutTemplate, Active } ] }.

postmark_list_webhooks

List event webhooks on the server: { Webhooks: [ { ID, Url, MessageStream, Status (verified | unverified), HttpAuth, HttpHeaders, Triggers } ] }.

postmark_send_bulk_email

Broadcast one message to many recipients (newsletters, announcements) on a broadcast stream.

postmark_send_email

Send one email (transactional by default).

postmark_send_email_batch

Send up to 500 different emails in one call (each with its own recipients/content).

postmark_send_email_batch_with_templates

Send up to 500 templated emails in one call.

postmark_send_email_with_template

Send one email rendered from a stored Postmark template: give TemplateAlias (or TemplateId) plus TemplateModel (the variables).

postmark_update_template

Edit a template.

postmark_validate_template

Check template syntax and preview the render without saving anything.

postmark_list_message_streams

List message streams on the server: { MessageStreams: [ { ID, Name, Description, MessageStreamType (Transactional | Broadcasts | Inbound), CreatedAt, ArchivedAt, SubscriptionManagementConfiguration } ], TotalCount }.

postmark_list_sender_signatures

List sender signatures (individually confirmed From addresses) in the account (needs the Account API token): { TotalCount, SenderSignatures: [ { ID, Domain, EmailAddress, ReplyToEmailAddress, Name, Confirmed } ] }.

postmark_activate_bounce

Reactivate an address Postmark deactivated after a bounce so you can send to it again (only when the bounce's CanActivate is true; hard bounces usually mean the address is dead).

postmark_get_bounce

One bounce with its full details (Type, Description, Details, Email, BouncedAt, Inactive, CanActivate, Content when available).

postmark_get_delivery_stats

Bounce summary for the server: { InactiveMails, Bounces: [ { Type, Name, Count } ] } (counts per bounce type, plus how many addresses are deactivated).

postmark_list_bounces

Search bounces.

postmark_list_servers

List every server in the Postmark account (needs the Account API token): { TotalCount, Servers: [ { ID, Name, Color, DeliveryType, ServerLink, InboundAddress, … } ] }.

postmark_create_suppressions

Stop sending to up to 50 addresses on a stream (ManualSuppression).

postmark_delete_suppressions

Allow sending again to up to 50 suppressed addresses on a stream.

postmark_list_suppressions

Addresses Postmark will not send to on a stream: { Suppressions: [ { EmailAddress, SuppressionReason (HardBounce | SpamComplaint | ManualSuppression), Origin (Recipient | Customer | Admin), CreatedAt } ] }.

postmark_get_current_server

Settings of the connected Postmark server: { ID, Name, Color, DeliveryType (Live | Sandbox), ServerLink, InboundAddress, InboundHash, SmtpApiActivated, TrackOpens, TrackLinks, InboundHookUrl, InboundSpamThreshold, … }.

postmark_diagnose_delivery

Diagnose why an address is or isn't receiving email: checks the recent messages sent to it, its bounces, and whether the message stream suppresses it, then says what's wrong and which tool fixes it.

postmark_get_click_browser_usage

Clicks by browser family (Chrome, Safari, …): { Days: [ { Date, <browser>: count } ], <browser>: total }.

postmark_get_click_location

Whether clicks came from the HTML or the text part: { Days: [ { Date, HTML, Text } ], HTML, Text }.

postmark_get_click_platform_usage

Clicks by platform: { Days: [ { Date, Desktop, Mobile, Unknown } ], Desktop, Mobile, Unknown }.

postmark_get_open_email_client_usage

Opens by email client (Apple Mail, Gmail, Outlook, …): { Days: [ { Date, <client>: count } ], <client>: total }.

postmark_get_open_platform_usage

Opens by platform: { Days: [ { Date, Desktop, Mobile, WebMail, Unknown } ], Desktop, Mobile, WebMail, Unknown }.

postmark_get_open_read_times

How long recipients kept emails open, bucketed by seconds: { Days: [ { Date, 0, 1, …, 20+ } ], … }.

postmark_get_sent_counts

Emails sent: { Days: [ { Date, Sent } ], Sent }.

postmark_get_spam_complaint_counts

Spam complaints: { Days: [ { Date, SpamComplaint } ], SpamComplaint }.

postmark_get_tracked_email_counts

Emails sent with open or link tracking: { Days: [ { Date, Tracked } ], Tracked }.

postmark_bypass_inbound_message

Let a blocked inbound message (status blocked, e.g. by an inbound rule or spam threshold) through to your inbound webhook.

postmark_get_outbound_message_dump

The raw MIME source of a sent email: { Body }.

postmark_list_message_clicks

Link-click events for one sent message: { TotalCount, Clicks: [ … ] }.

postmark_list_message_opens

Open events for one sent message: { TotalCount, Opens: [ … ] }.

postmark_retry_inbound_message

Retry delivering a failed inbound message to your inbound webhook (after fixing the webhook).

postmark_search_message_clicks

Link-click events across messages: { TotalCount, Clicks: [ { RecordType, MessageID, Recipient, ReceivedAt, OriginalLink, ClickLocation (HTML | Text), Client, OS, Platform, Geo, Tag } ] }.

postmark_search_message_opens

Open events across messages: { TotalCount, Opens: [ { RecordType, MessageID, Recipient, ReceivedAt, FirstOpen, Client, OS, Platform, Geo, UserAgent, Tag, MessageStream } ] }.

postmark_create_domain

Add a sending domain (needs the Account API token).

postmark_delete_domain

Remove a sending domain from the account.

postmark_get_domain

One domain with the DNS records to publish.

postmark_rotate_domain_dkim

Start a DKIM key rotation: Postmark issues a new key (DKIMPendingHost/DKIMPendingTextValue) that the user must publish; the old key keeps working until the new one verifies.

postmark_update_domain

Change a domain's custom Return-Path.

postmark_verify_domain_dkim

Re-check the domain's DKIM TXT record now (after the user has published it).

postmark_verify_domain_return_path

Re-check the domain's Return-Path CNAME now.

postmark_delete_template

Delete a template (a layout cannot be deleted while templates still use it).

postmark_delete_webhook

Delete a webhook.

postmark_get_webhook

One webhook by ID.

postmark_get_webhook_statistics

Delivery health of one webhook over the last 24 hours: { Statuses, TimeRange, Metrics: { TotalRequests, SuccessCount, FailureCount, RetryCount, SuccessRate, SlowCount, AverageTerminalResponseTimeMs, … }, MetricsByTrigger }.

postmark_list_bulk_email_requests

List bulk sends on this server, newest first: { Requests: [status objects], PaginationKey }.

postmark_push_templates

Copy templates (matched by Alias) from one server to another, creating or updating them on the destination.

postmark_update_webhook

Change a webhook's URL, auth, headers or triggers.

postmark_verify_webhook

Send a test event for every enabled trigger to the webhook URL.

postmark_archive_message_stream

Archive a stream: sending stops and its data is purged after 45 days (ExpectedPurgeDate).

postmark_create_message_stream

Create a message stream.

postmark_create_sender_signature

Add a From address.

postmark_delete_sender_signature

Remove a sender signature; that From address stops working.

postmark_get_message_stream

One message stream by ID.

postmark_get_sender_signature

One sender signature with its confirmation and DNS status.

postmark_resend_sender_signature_confirmation

Email the confirmation link for an unconfirmed sender signature again.

postmark_unarchive_message_stream

Restore an archived stream before its purge date.

postmark_update_message_stream

Rename a stream or change its description / unsubscribe handling.

postmark_update_sender_signature

Change a sender signature's name, reply-to, Return-Path or confirmation note.

postmark_create_server

Create a server (needs the Account API token).

postmark_delete_server

Permanently delete a server and everything in it (needs the Account API token; Postmark must have enabled server deletion for the account, otherwise ErrorCode 604).

postmark_get_bounce_dump

The raw SMTP source of the bounce message: { Body }.

postmark_get_server

One server's settings by ID (needs the Account API token).

postmark_update_server

Change any server's settings by ID (needs the Account API token).

postmark_create_inbound_rule

Block inbound mail from a sender address or a whole domain.

postmark_delete_inbound_rule

Remove an inbound blocking rule.

postmark_list_inbound_rules

List inbound blocking rules: { TotalCount, InboundRules: [ { ID, Rule } ] } (each Rule is a sender address or domain whose inbound mail is blocked).

postmark_create_data_removal

GDPR/privacy request: permanently delete everything Postmark stores about one recipient address across the account (needs the Account API token).

postmark_get_data_removal

Status of a data removal request: { ID, Status }.

postmark_update_current_server

Change settings of the connected server (name, color, tracking defaults, inbound webhook URL/domain, spam threshold, SMTP).

Connect Postmark to your AI

Credentials off one Postmark screen, then an endpoint your client signs into. Nothing to deploy, and nothing to install.

Paste your Account API token (Account → API Tokens) to pick from all your servers, or one server's Server API token (Servers → your server → API Tokens) for just that server. PopMCP detects which you pasted. A default From address is optional.

Postmark API token••••••••••••3f7a
Default From address (optional)Acme <hello@yourdomain.com>
ConnectionVerified

Then just ask for the work

  • “Did jane@northwind.co get her password reset email? If a bounce deactivated her address, reactivate it”

    • diagnose_delivery
    • get_bounce
    • activate_bounce
  • “Stop sending newsletters to these 40 addresses from the churn export”

    • list_message_streams
    • create_suppressions
  • “How did last week's sending look: bounce rate, spam complaints and opens per day”

    • get_outbound_overview
    • get_bounce_counts
    • get_open_counts
  • “Change the welcome template's subject line, check it renders, then send it to me with sample data”

    • get_template
    • validate_template
    • update_template
    • send_email_with_template

Use Postmark from the assistant you already open

One hosted endpoint, registered once per client. The same tools and the same permissions, whichever window the request comes from.

Claude DesktopCustom connector

Add the PopMCP URL under Settings → Connectors and the tools appear in every chat.

Claude WebCustom connector

The same endpoint, registered in the browser. Nothing to install on the machine you are working from.

ChatGPTCustom connector

Register PopMCP as a custom connector, then let ChatGPT read and update the account.

CodexDesktop & CLI

Wire the endpoint into Codex or the Codex CLI when a task needs live business context, not a fixture.

OpenCodeCoding agent

Register the remote MCP server in OpenCode's config for terminal-first and scripted agent runs.

ZCodeDesktop app

Add PopMCP as an MCP server in Z.ai's desktop app and work the account from the same window.

Postmark MCP server questions

What teams ask before putting Postmark behind an AI client.

Should I use a Postmark Server API token or the Account API token?

Either works, and PopMCP detects which one you pasted. A Server API token connects one server: sending, templates, bounces, messages, stats, streams, suppressions, webhooks and inbound rules. The Account API token, visible only to the account owner and admins, connects any of your servers and adds servers, domains, sender signatures, template push and data removals. Postmark's shared POSTMARK_API_TEST token is refused.

Can one Postmark token connect several servers?

Yes, with the Account API token. After you paste it, PopMCP lists every server in the account and you choose which to connect and which PopMCP workspace each one belongs in. Each connection is pinned to one server and a workspace holds one Postmark connection, so an agency can map each client's server to that client's workspace from a single token.

How do I find out why someone didn't get a Postmark email?

Ask, and the AI runs diagnose_delivery. In one read-only call it checks the recent messages sent to that address, its bounces, and whether the message stream suppresses it, then names the tool that fixes it, such as activate_bounce or delete_suppressions. Spam-complaint suppressions can only be lifted by Postmark support. Postmark keeps message history for 45 days by default.

Does Postmark message search use my time zone?

No. Postmark reads message and bounce search dates as US Eastern wall-clock time, so PopMCP converts zoned timestamps before they reach Postmark, while stats tools take plain YYYY-MM-DD dates. Paging is filled in too: count defaults to 50 with a maximum of 500, and count plus offset can't pass 10,000. That's why a question like "what did we send yesterday afternoon" lands on the right messages.

Can the AI send Postmark batches and broadcasts?

Yes, within Postmark's rules. send_email_batch and send_email_batch_with_templates send up to 500 emails in one call, and each result carries its own ErrorCode because Postmark returns HTTP 200 even when some messages fail. send_bulk_email is for broadcasts on a broadcast stream and needs Postmark's approval first; get_bulk_email_status tracks progress. The optional default From address fills any send that omits one.

Which Postmark events can PopMCP watch?

19 in total. Six arrive by Postmark webhook: delivered, bounced, marked as spam, opened, link clicked and subscription changed. Four are polled: email sent, inbound email received, inbound email blocked and address deactivated. Change detection covers an address suppressed, a suppression lifted, template created, message stream created and inbound block rule added, and four thresholds watch bounce rate, spam rate, deactivated addresses and daily sending volume.

Do I have to run or host the Postmark MCP server myself?

No. PopMCP hosts it and gives you a Streamable HTTP MCP URL. There is nothing to deploy, no callback URL to register, and no infrastructure to keep running or patch.

Which AI clients can use this MCP server?

Any client that supports a remote Streamable HTTP MCP server: Claude Desktop, Claude Web, ChatGPT custom connectors, Codex and the Codex CLI, OpenCode and Z.ai's ZCode, as well as editors such as Cursor, Windsurf and Zed. Your client signs in to PopMCP with OAuth; the provider credential never leaves the server.

Why do only 34 of the 86 tools load by default?

Loading 86 tool definitions into every conversation burns context before the work starts. PopMCP loads a curated 34-tool set covering the everyday workflows and keeps the rest searchable, so your AI pulls a specialist tool only when a task needs it. Every tool stays searchable, and on Scale the owner can load the full catalog for a teammate's connection.

What is the difference between a tool and a trigger?

A tool is something your AI calls, and there are 86 here. A trigger is something PopMCP watches for you: 19 Postmark events that can start work on the PopMCP side. Triggers never enter your AI client's context, and none of them ask you to paste a callback URL into Postmark.

Connect Postmark to your AI in minutes

Launch a hosted MCP endpoint for Postmark, keep tool access under control, and start testing real workflow prompts right away.

Connect your first MCP