Postmark

Live

API KEY

TRANSACTIONAL EMAIL

Communication

Postmark gives your agent authenticated access to transactional email, message streams, and bounce data, with every send attributed to a real user.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Postmark
agent · Acme Q3
Run
Why did receipts stop reaching this customer?
S
postmark_get_bounces
81ms
Email agent
4 hard bounces since Tuesday, all to the same address. It is now on the suppression list.
Sources: 4 bounces, Aug 12 to Aug 17
postmark
4 bounces
18:29
Message Claude...

Tools your agent reaches for on Postmark, scoped per user.

CALL ANY TOOL
Send transactional email, manage message streams and templates, and inspect bounces and suppressions with the signed-in user's own Postmark access.
postmark_activate_bounce
Activate bounce
Reactivate a previously deactivated (bounced) email address on the current Postmark server, so future messages sent to it will be attempted again instead of being suppressed. Use postmark_list_bounces or postmark_get_bounce first to find the bounce ID for the address you want to reactivate.
Parameters
Name
Type
Required
Description
bounce_id
integer
Required
The numeric ID of the bounce whose associated email address should be reactivated. Example: 42.
postmark_archive_message_stream
Archive message stream
postmark_bypass_inbound_message
Bypass inbound message
postmark_create_inbound_rule
Create inbound rule
postmark_create_message_stream
Create message stream
postmark_create_template
Create template
postmark_delete_inbound_rule
Delete inbound rule
postmark_delete_template
Delete template
postmark_get_bounce
Get bounce
postmark_get_bounce_dump
Get bounce dump
postmark_get_click_browser_usage
Get click browser usage
postmark_get_click_location_stats
Get click location stats
postmark_get_email_client_usage
Get email client usage
postmark_get_email_platform_usage
Get email platform usage
postmark_get_message_clicks
Get message clicks
postmark_get_message_stream
Get message stream
postmark_get_outbound_stats_overview
Get outbound stats overview
postmark_get_server_info
Get server info
postmark_get_template
Get template
postmark_list_bounces
List bounces
postmark_list_inbound_rules
List inbound rules
postmark_list_message_opens
List message opens
postmark_list_outbound_messages
List outbound messages
postmark_list_templates
List templates
postmark_send_batch_emails
Send batch emails
postmark_send_batch_emails_with_templates
Send batch emails with templates
postmark_send_email
Send email
postmark_unarchive_message_stream
Unarchive message stream
postmark_update_message_stream
Update message stream
postmark_update_template
Update template

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Postmark tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["postmark"], toolNames: [
    "postmark_activate_bounce",
    "postmark_archive_message_stream",
    "postmark_bypass_inbound_message"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Is the Salesforce sync healthy?" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["postmark"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Which data sources are connected?" }],
  tools,
});

// Execute the tool call with the user's vaulted Postmark credential
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["postmark"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Pull open Zendesk tickets created this week." }],
  tools,
});

// Tool call runs with the user's vaulted Postmark credential
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["postmark"] }, pageSize: 100,
});

const agent = new Agent({
  name: "postmark_agent",
  model: "gemini-2.5-pro",
  instruction: "Work with Postmark for the signed-in user.",
  tools,
});

await agent.run("What auth does the Shopify connector need?");
Try these prompts
Paste any prompt into your agent to get started.
Delivery triage
Copy the prompt
Copied
Why did emails to this customer stop arriving?
Copy the prompt
Copied
Show me the hard bounces from the last week.
Copy the prompt
Copied
Reactivate this bounced address.
Streams
Copy the prompt
Copied
List the message streams on this server.
Copy the prompt
Copied
Create a broadcast stream for product updates.
Copy the prompt
Copied
Archive the stream we no longer use.
Templates
Copy the prompt
Copied
List the templates available on this server.
Copy the prompt
Copied
Create a template for the receipt email.
Copy the prompt
Copied
Show me the inbound rules configured.
SEE HOW AUTH WORKS
Your users connect Postmark once. Their credentials stay vaulted, every call is scope checked, and every send is logged.
1
Authorize
Your user connects
Postmark
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Postmark
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Postmark
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Postmark
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other connectors.
Support and Ops Teams
Email-to-calendar agent
Reads scheduling intent out of Gmail threads, resolves the times everyone actually has free, and creates the event on the user's own Google Calendar. No shared service account.
Engineering Teams
DevOps assistant agent
Polls GitHub for failing checks and stale PRs, opens Linear issues for the ones that need work, and posts a daily digest to Slack. It acts as the engineer, not a shared service account.
Engineering Teams
Engineering standup agent
Pulls commits from GitHub and GitLab, tracks issue movement in Jira, and posts a per-engineer standup brief to Slack. Each engineer's activity is read on their own delegated OAuth.
Engineering Teams
Auto release notes agent
Reads merged GitHub PRs, groups them into structured release notes, publishes the page to Notion, and announces the release in Slack. Every call runs on the engineer's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other connectors.
OPS
Email-to-calendar scheduling agent
Read scheduling intent out of Gmail threads, resolve mutual free time, and create the Google Calendar event.
ENGINEERING
DevOps assistant agent
Poll GitHub for failing checks and stale pull requests, open Linear issues for the ones that need work, and digest to Slack.
ENGINEERING
Engineering standup agent
Pull commits from GitHub and GitLab, track Jira issue movement, and post a per-engineer standup brief to Slack.
ENGINEERING
Auto-release notes agent
Group merged GitHub PRs into structured release notes, publish the page to Notion, and announce the release in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Postmark token looks fine in a demo. In production every action looks like one service account, and you cannot tell who wired a source or ran a query. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Postmark today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Can the agent reactivate a suppressed address?
Only if you scope it to. The bounce and suppression tools are separate from the read tools, so a diagnostic agent can stay read-only.
How many Postmark tools are available?
59 across sending, message streams, templates, bounces, suppressions, webhooks, and inbound rules.
Does this separate transactional and broadcast traffic?
Yes. Postmark's message streams are exposed as first-class tools, so your agent can target the right stream.
Who appears in the audit trail?
The user who triggered the agent, because Scalekit resolves their credential rather than a shared server token.
How is the API key protected?
Encrypted per tenant with AES-256, resolved at request time, never placed in LLM context.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""postmark"": {
""url"": ""https://mcp.scalekit.com/postmark"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.postmark]
url = ""https://mcp.scalekit.com/postmark""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""postmark"": {
""url"": ""https://mcp.scalekit.com/postmark"",
""type"": ""http""
}
}
}