Repository navigation
v2.0.0 — Expand to 24 tools + raw-HTTP convergence
This release expands the MCP tool surface from 4 tools to 24, organized into eight categories. It includes one breaking change for users on Node 16 or 18.
⚠ Breaking changes
- Minimum Node.js version raised from 16 to 20. The
@modelcontextprotocol/sdkdependency requires Node ≥ 18; we set the floor at 20 to match a current LTS line. Users on Node 16 or 18 will seeEBADENGINEwarnings on install, or hard failures withengine-strict=true. The previous>=16declaration was already incompatible with the SDK at runtime — this release makes the floor honest.
Added
- 20 new tools across templates, messages, diagnostics, bounces, suppressions, webhooks, and server info. See the README "Tools" section for the complete reference.
diagnoseDelivery— composite triage tool. Answers "did my email reach X, and if not, why?" by running message search, suppression check, and bounce history in parallel for a recipient, then synthesizing a plain-English recommendation. First tool in a new "Diagnostics" category.sendBatchandsendBatchWithTemplate— wraps Postmark's synchronous batch endpoints (/email/batch,/email/batchWithTemplates). Send up to 500 distinct messages or templated recipients in a single HTTP request, with immediate per-message success/failure reporting. Note: these are Postmark's batch endpoints; Postmark's separate asynchronous bulk email API at/email/bulk(submit-and-poll, no message count cap, 50 MB payload limit, subject to approval) is a parallel capability for large-volume jobs and is tracked as a v2.1 follow-up — not a replacement for batch.- Template CRUD + validation —
getTemplate,createTemplate,editTemplate,deleteTemplate,validateTemplate. End-to-end template authoring including layout binding (passlayoutTemplate: "<alias>"to bind,nullto unbind). - Message search and details —
searchOutboundMessages(withmessageStreamfilter),getMessageDetails(full event timeline). - Bounce tooling —
searchBounces,getBounceDump,activateBounce. - Suppression management —
listSuppressions,createSuppressions,deleteSuppressions(up to 50 addresses per call). - Webhook lifecycle —
listWebhooks,createWebhook,deleteWebhook.createWebhookrequires at least one trigger enabled. getServerInfo— server name, color, tracking settings, configured webhook URLs.getDeliveryStatsstatparameter (optional). With no argument, returns a friendly summary (preserves v1 behavior). Withstat: "<name>", returns a polished per-stat breakdown. Supported values:summary,overview,sent,bounces,spam,tracked,opens,openPlatforms,openClients,openReadTimes,clicks,clickBrowsers,clickPlatforms,clickLocation.- Validation guards on
editTemplate,createWebhook,createTemplate,validateTemplate, andsendEmailWithTemplate— misuse fails fast with a clear message instead of hitting the API. - Smoke-test example harnesses —
smoke-test.example.mjs(read-only, 25 checks) andsmoke-test-mutating.example.mjs(full lifecycles + real sends + cleanup, 23 checks). Copy to the non-example name (gitignored) and edit verified-sender addresses to use. The mutating harness includes a startup guard that refuses to run with placeholder values.
Changed
getDeliveryStatsdefault summary output reformatted. Now includes bounce rate, spam rate, and tracked-of-sent percentage in addition to the v1 sent/open/click rates. All v1 fields are still present, just rendered with thousands separators and aligned columns.- All tools now talk to the Postmark REST API through a single raw-
fetchclient (postmarkRequest). Previously the server used the officialpostmarkSDK (andgetDeliveryStatsmixed in its own rawfetch). Transport is now unified on one hardened helper over nativefetchthat handles auth headers, a request timeout, and consistent error mapping (surfacing Postmark'sMessage/ErrorCode).
Fixed
getServerInfodisplayed the wrong field for "First Open Only". Was readingEnableSmtpApiErrorHooks(an unrelated boolean about SMTP API error hooks); now correctly readsPostFirstOpenOnly.engines.nodewas lying. Declared>=16but the MCP SDK requires>=18. The package wouldnpm installon Node 16 and then fail at runtime. Floor is now>=20and accurate.
Removed
postmarkandnode-fetchdependencies. The server now talks to the Postmark API through its own minimal HTTP client (postmarkRequest) over nativefetch(Node 20+), which also stampsX-Postmark-Client/ version / correlation-id headers so MCP-driven traffic is identifiable. Both runtime HTTP dependencies are dropped.