Postmark Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Postmark Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A FastMCP server that exposes the Postmark API as MCP tools, so an LLM agent can send transactional email and monitor delivery (templates, bounces, outbound messages, stats, and suppressions).
It supports a read-only mode: when enabled, every mutating tool — including all email-sending tools — is hidden from the tool list and cannot be called.
Server-token (single Postmark server) endpoints only:
| Area | Read tools | Write tools |
|---|---|---|
| — | send_email, send_email_batch, send_email_with_template, send_email_batch_with_templates | |
| Templates | list_templates, get_template, validate_template | create_template, edit_template, delete_template |
| Bounces | get_delivery_stats, list_bounces, get_bounce, get_bounce_dump | activate_bounce |
| Messages | search_outbound_messages, get_outbound_message_details, search_message_opens, search_message_clicks | — |
| Stats | get_outbound_overview, get_sent_counts, get_bounce_counts, get_spam_counts, get_open_counts, get_click_counts | — |
| Suppressions | list_suppressions | create_suppressions, delete_suppressions |
Account-level admin (servers, domains, sender signatures, webhooks, template push) is out of scope — those require an account token.
# Published to PyPI:
uvx postmark-mcp
# Local checkout, before publishing:
uvx --from . postmark-mcpThe server speaks MCP over stdio (the transport MCP clients spawn).
All configuration comes from environment variables. The MCP client injects them into the spawned process via its server config env block.
| Env var | Required | Default | Purpose |
|---|---|---|---|
POSTMARK_SERVER_TOKEN | yes | — | Postmark server token (sent as X-Postmark-Server-Token) |
POSTMARK_READ_ONLY | no | false | When truthy (1/true/yes/on), hide and block all write tools, including sending email |
POSTMARK_BASE_URL | no | https://api.postmarkapp.com | API base URL (override for testing) |
POSTMARK_TIMEOUT | no | 30 | Per-request timeout, in seconds |
If POSTMARK_SERVER_TOKEN is missing the server exits immediately with an actionable message, rather than failing on the first tool call.
Add to your client's mcpServers block (e.g. Claude Desktop). Restart the client after editing env so the server is re-spawned.
{
"mcpServers": {
"postmark": {
"command": "uvx",
"args": ["postmark-mcp"],
"env": {
"POSTMARK_SERVER_TOKEN": "your-server-token",
"POSTMARK_READ_ONLY": "false"
}
}
}
}Set POSTMARK_READ_ONLY to true for a monitoring-only deployment that cannot send email or change any state.
uv sync --extra dev # install deps (incl. dev tools)
uv run ruff check . # lint
uv run ruff format . # format
uv run pytest # tests (no network — Postmark calls are mocked with respx)
uv run postmark-mcp # run locally (requires POSTMARK_SERVER_TOKEN)the raw per-message array so you can inspect each element's ErrorCode/Message.
masked (mask_error_details=True) to avoid leaking details.
mcp.disable(tags={"write"})).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.