postmark_get_ bounce_ countsBounces by type per day: { Days: [ { Date, HardBounce, SoftBounce, SMTPApiError, Transient } ], HardBounce, SoftBounce, SMTPApiError, Transient }.
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
Postmark's server and account APIs, plus a one-call delivery diagnosis. Account-level tools need the Account API token.
postmark_get_ bounce_ countsBounces by type per day: { Days: [ { Date, HardBounce, SoftBounce, SMTPApiError, Transient } ], HardBounce, SoftBounce, SMTPApiError, Transient }.
postmark_get_ click_ countsLink clicks: { Days: [ { Date, Clicks, Unique } ], Clicks, Unique }.
postmark_get_ open_ countsOpens: { Days: [ { Date, Opens, Unique } ], Opens, Unique }.
postmark_get_ outbound_ overviewHeadline 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_ messageOne inbound email in full: headers, TextBody, HtmlBody, StrippedTextReply, attachments metadata, BlockedReason and processing history.
postmark_get_ outbound_ messageEverything about one sent email, including its body and MessageEvents (Delivered, Bounced, Opened, LinkClicked, SubscriptionChanged, Transient) with timestamps and details.
postmark_search_ inbound_ messagesSearch email received on the server's inbound address.
postmark_search_ outbound_ messagesSearch sent email (Postmark keeps it for the account's retention period, 45 days by default).
postmark_list_ domainsList sending domains in the account (needs the Account API token): { TotalCount, Domains: [ { ID, Name, DKIMVerified, ReturnPathDomainVerified, … } ] }.
postmark_create_ templateCreate a template (Mustachio syntax: {{var}}, {{#each items}}…{{/each}}).
postmark_create_ webhookSubscribe a URL to delivery events (Delivery, Bounce, SpamComplaint, Open, Click, SubscriptionChange) on one message stream.
postmark_get_ bulk_ email_ statusStatus of a bulk send: { Id, SubmittedAt, Status (Accepted | Processing | Completed | …), TotalMessages, PercentageCompleted, ReleasedCount, FailedCount, Subject }.
postmark_get_ templateOne template with its full content: { TemplateId, Name, Alias, Subject, HtmlBody, TextBody, TemplateType, LayoutTemplate, Active, AssociatedServerId }.
postmark_list_ templatesList templates on this server: { TotalCount, Templates: [ { TemplateId, Name, Alias, TemplateType (Standard | Layout), LayoutTemplate, Active } ] }.
postmark_list_ webhooksList event webhooks on the server: { Webhooks: [ { ID, Url, MessageStream, Status (verified | unverified), HttpAuth, HttpHeaders, Triggers } ] }.
postmark_send_ bulk_ emailBroadcast one message to many recipients (newsletters, announcements) on a broadcast stream.
postmark_send_ emailSend one email (transactional by default).
postmark_send_ email_ batchSend up to 500 different emails in one call (each with its own recipients/content).
postmark_send_ email_ batch_ with_ templatesSend up to 500 templated emails in one call.
postmark_send_ email_ with_ templateSend one email rendered from a stored Postmark template: give TemplateAlias (or TemplateId) plus TemplateModel (the variables).
postmark_update_ templateEdit a template.
postmark_validate_ templateCheck template syntax and preview the render without saving anything.
postmark_list_ message_ streamsList message streams on the server: { MessageStreams: [ { ID, Name, Description, MessageStreamType (Transactional | Broadcasts | Inbound), CreatedAt, ArchivedAt, SubscriptionManagementConfiguration } ], TotalCount }.
postmark_list_ sender_ signaturesList sender signatures (individually confirmed From addresses) in the account (needs the Account API token): { TotalCount, SenderSignatures: [ { ID, Domain, EmailAddress, ReplyToEmailAddress, Name, Confirmed } ] }.
postmark_activate_ bounceReactivate 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_ bounceOne bounce with its full details (Type, Description, Details, Email, BouncedAt, Inactive, CanActivate, Content when available).
postmark_get_ delivery_ statsBounce summary for the server: { InactiveMails, Bounces: [ { Type, Name, Count } ] } (counts per bounce type, plus how many addresses are deactivated).
postmark_list_ bouncesSearch bounces.
postmark_list_ serversList every server in the Postmark account (needs the Account API token): { TotalCount, Servers: [ { ID, Name, Color, DeliveryType, ServerLink, InboundAddress, … } ] }.
postmark_create_ suppressionsStop sending to up to 50 addresses on a stream (ManualSuppression).
postmark_delete_ suppressionsAllow sending again to up to 50 suppressed addresses on a stream.
postmark_list_ suppressionsAddresses Postmark will not send to on a stream: { Suppressions: [ { EmailAddress, SuppressionReason (HardBounce | SpamComplaint | ManualSuppression), Origin (Recipient | Customer | Admin), CreatedAt } ] }.
postmark_get_ current_ serverSettings of the connected Postmark server: { ID, Name, Color, DeliveryType (Live | Sandbox), ServerLink, InboundAddress, InboundHash, SmtpApiActivated, TrackOpens, TrackLinks, InboundHookUrl, InboundSpamThreshold, … }.
postmark_diagnose_ deliveryDiagnose 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_ usageClicks by browser family (Chrome, Safari, …): { Days: [ { Date, <browser>: count } ], <browser>: total }.
postmark_get_ click_ locationWhether clicks came from the HTML or the text part: { Days: [ { Date, HTML, Text } ], HTML, Text }.
postmark_get_ click_ platform_ usageClicks by platform: { Days: [ { Date, Desktop, Mobile, Unknown } ], Desktop, Mobile, Unknown }.
postmark_get_ open_ email_ client_ usageOpens by email client (Apple Mail, Gmail, Outlook, …): { Days: [ { Date, <client>: count } ], <client>: total }.
postmark_get_ open_ platform_ usageOpens by platform: { Days: [ { Date, Desktop, Mobile, WebMail, Unknown } ], Desktop, Mobile, WebMail, Unknown }.
postmark_get_ open_ read_ timesHow long recipients kept emails open, bucketed by seconds: { Days: [ { Date, 0, 1, …, 20+ } ], … }.
postmark_get_ sent_ countsEmails sent: { Days: [ { Date, Sent } ], Sent }.
postmark_get_ spam_ complaint_ countsSpam complaints: { Days: [ { Date, SpamComplaint } ], SpamComplaint }.
postmark_get_ tracked_ email_ countsEmails sent with open or link tracking: { Days: [ { Date, Tracked } ], Tracked }.
postmark_bypass_ inbound_ messageLet a blocked inbound message (status blocked, e.g. by an inbound rule or spam threshold) through to your inbound webhook.
postmark_get_ outbound_ message_ dumpThe raw MIME source of a sent email: { Body }.
postmark_list_ message_ clicksLink-click events for one sent message: { TotalCount, Clicks: [ … ] }.
postmark_list_ message_ opensOpen events for one sent message: { TotalCount, Opens: [ … ] }.
postmark_retry_ inbound_ messageRetry delivering a failed inbound message to your inbound webhook (after fixing the webhook).
postmark_search_ message_ clicksLink-click events across messages: { TotalCount, Clicks: [ { RecordType, MessageID, Recipient, ReceivedAt, OriginalLink, ClickLocation (HTML | Text), Client, OS, Platform, Geo, Tag } ] }.
postmark_search_ message_ opensOpen events across messages: { TotalCount, Opens: [ { RecordType, MessageID, Recipient, ReceivedAt, FirstOpen, Client, OS, Platform, Geo, UserAgent, Tag, MessageStream } ] }.
postmark_create_ domainAdd a sending domain (needs the Account API token).
postmark_delete_ domainRemove a sending domain from the account.
postmark_get_ domainOne domain with the DNS records to publish.
postmark_rotate_ domain_ dkimStart 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_ domainChange a domain's custom Return-Path.
postmark_verify_ domain_ dkimRe-check the domain's DKIM TXT record now (after the user has published it).
postmark_verify_ domain_ return_ pathRe-check the domain's Return-Path CNAME now.
postmark_delete_ templateDelete a template (a layout cannot be deleted while templates still use it).
postmark_delete_ webhookDelete a webhook.
postmark_get_ webhookOne webhook by ID.
postmark_get_ webhook_ statisticsDelivery health of one webhook over the last 24 hours: { Statuses, TimeRange, Metrics: { TotalRequests, SuccessCount, FailureCount, RetryCount, SuccessRate, SlowCount, AverageTerminalResponseTimeMs, … }, MetricsByTrigger }.
postmark_list_ bulk_ email_ requestsList bulk sends on this server, newest first: { Requests: [status objects], PaginationKey }.
postmark_push_ templatesCopy templates (matched by Alias) from one server to another, creating or updating them on the destination.
postmark_update_ webhookChange a webhook's URL, auth, headers or triggers.
postmark_verify_ webhookSend a test event for every enabled trigger to the webhook URL.
postmark_archive_ message_ streamArchive a stream: sending stops and its data is purged after 45 days (ExpectedPurgeDate).
postmark_create_ message_ streamCreate a message stream.
postmark_create_ sender_ signatureAdd a From address.
postmark_delete_ sender_ signatureRemove a sender signature; that From address stops working.
postmark_get_ message_ streamOne message stream by ID.
postmark_get_ sender_ signatureOne sender signature with its confirmation and DNS status.
postmark_resend_ sender_ signature_ confirmationEmail the confirmation link for an unconfirmed sender signature again.
postmark_unarchive_ message_ streamRestore an archived stream before its purge date.
postmark_update_ message_ streamRename a stream or change its description / unsubscribe handling.
postmark_update_ sender_ signatureChange a sender signature's name, reply-to, Return-Path or confirmation note.
postmark_create_ serverCreate a server (needs the Account API token).
postmark_delete_ serverPermanently 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_ dumpThe raw SMTP source of the bounce message: { Body }.
postmark_get_ serverOne server's settings by ID (needs the Account API token).
postmark_update_ serverChange any server's settings by ID (needs the Account API token).
postmark_create_ inbound_ ruleBlock inbound mail from a sender address or a whole domain.
postmark_delete_ inbound_ ruleRemove an inbound blocking rule.
postmark_list_ inbound_ rulesList inbound blocking rules: { TotalCount, InboundRules: [ { ID, Rule } ] } (each Rule is a sender address or domain whose inbound mail is blocked).
postmark_create_ data_ removalGDPR/privacy request: permanently delete everything Postmark stores about one recipient address across the account (needs the Account API token).
postmark_get_ data_ removalStatus of a data removal request: { ID, Status }.
postmark_update_ current_ serverChange settings of the connected server (name, color, tracking defaults, inbound webhook URL/domain, spam threshold, SMTP).
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.
••••••••••••3f7aAcme <hello@yourdomain.com>Sends, create_suppressions, activate_bounce and update_template act on Postmark as soon as the AI calls them. push_templates only previews unless told to apply. Tick Postmark on the PopMCP consent screen only for clients that need it.
Drop the PopMCP URL into Claude, ChatGPT, Codex or any other supported client. It signs in through PopMCP with OAuth, so your Postmark credential never leaves the server.
app.popmcp.com/mcpAsk for something harmless before the agent changes anything. Writes run as soon as it calls them, so confirm it reads the right account first.
Did jane@northwind.co get her password reset email? If a bounce deactivated her address, reactivate it
postmark_diagnose_deliveryok
Then just ask for the work
“Did jane@northwind.co get her password reset email? If a bounce deactivated her address, reactivate it”
“Stop sending newsletters to these 40 addresses from the churn export”
“How did last week's sending look: bounce rate, spam complaints and opens per day”
“Change the welcome template's subject line, check it renders, then send it to me with sample data”
One hosted endpoint, registered once per client. The same tools and the same permissions, whichever window the request comes from.
Add the PopMCP URL under Settings → Connectors and the tools appear in every chat.
The same endpoint, registered in the browser. Nothing to install on the machine you are working from.
Register PopMCP as a custom connector, then let ChatGPT read and update the account.
Wire the endpoint into Codex or the Codex CLI when a task needs live business context, not a fixture.
Register the remote MCP server in OpenCode's config for terminal-first and scripted agent runs.
Add PopMCP as an MCP server in Z.ai's desktop app and work the account from the same window.
FAQ
What teams ask before putting Postmark behind an AI client.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Launch a hosted MCP endpoint for Postmark, keep tool access under control, and start testing real workflow prompts right away.