AI tools
Your coding assistant can work with ZapSMTP directly: send and inspect email through the MCP server, learn the API from Agent Skills and llms.txt, or drive everything from the command line.
The MCP server, the CLI and the skills are being published. llms.txt and the Markdown pages are available now.
MCP server
zapsmtp-mcp gives an assistant one tool per API operation, generated from the same description as these pages, plus send_test_email (any delivery outcome on the simulator) and verify_webhook_signature. Create a key in the dashboard (a zap_test_… key delivers nothing) and add the server to your client:
claude mcp add zapsmtp -e ZAP_API_KEY=zap_... -- npx -y zapsmtp-mcp// Settings → Developer → Edit Config (claude_desktop_config.json)
{
"mcpServers": {
"zapsmtp": {
"command": "npx",
"args": ["-y", "zapsmtp-mcp"],
"env": { "ZAP_API_KEY": "zap_..." }
}
}
}// ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project)
{
"mcpServers": {
"zapsmtp": {
"command": "npx",
"args": ["-y", "zapsmtp-mcp"],
"env": { "ZAP_API_KEY": "zap_..." }
}
}
}// .vscode/mcp.json: VS Code asks for the key once and keeps it
{
"inputs": [
{ "type": "promptString", "id": "zapsmtp-key", "description": "ZapSMTP API key", "password": true }
],
"servers": {
"zapsmtp": {
"command": "npx",
"args": ["-y", "zapsmtp-mcp"],
"env": { "ZAP_API_KEY": "${input:zapsmtp-key}" }
}
}
}- Choose what it can do.
--toolsets emails,templates,simulatorkeeps only those groups;--read-onlykeeps only reads. Tools carry read-only and destructive hints for clients that ask before acting. - Keep sends in bounds.
--sendersets the default From, and--allowed-recipient-domainsrefuses mail to any other domain. Sends carry an idempotency key, so a retried tool call never sends twice. - Serve a team.
--httpruns Streamable HTTP at/mcp, where every client brings its ownAuthorization: Bearerkey and the server holds none. - The docs come along.
llms.txtand every guide are bundled as MCP resources; nothing is fetched at runtime.
Agent Skills
Skills are folders an agent loads when a task needs them. The zapsmtp skill routes to six others: sending email, webhooks, templates, receiving email, email best practices, and migrating from Resend, SendGrid, Mailgun, Postmark or Amazon SES. Every code sample in them is checked against the API before release.
# in a checkout of the skills repository
DEST=.claude/skills # or ~/.claude/skills for every project
mkdir -p "$DEST/zapsmtp"
cp -R SKILL.md LICENSE references "$DEST/zapsmtp/"
for s in zapsmtp-*/; do cp -R "$s" "$DEST/"; done# .agents/skills is read by Cursor, GitHub Copilot and OpenAI Codex alike
DEST=.agents/skills
mkdir -p "$DEST/zapsmtp"
cp -R SKILL.md LICENSE references "$DEST/zapsmtp/"
for s in zapsmtp-*/; do cp -R "$s" "$DEST/"; doneFor a tool without skills support, put the relevant SKILL.md in its instruction file, such as AGENTS.md or .github/copilot-instructions.md.
llms.txt and Markdown pages
/llms.txt: what ZapSMTP is, how to authenticate and test, then every docs page with a one-line description (llmstxt.org)./llms-full.txt: every page in one file, for tools that load the whole context at once.- Every docs page as Markdown: add
.mdto its path, for example/docs/sending.mdor/docs/emails/send-email.md. /openapi.json: the whole API in OpenAPI 3.1 with request and response schemas.
All of them are rebuilt with the docs, so they never fall behind the pages you read here.
CLI
zapsmtp has a command for every API operation, with typed flags and --help for each. It prints tables in a terminal and JSON when piped, walks every page with --all, and exits non-zero on an API error with its code and request id.
npm install -g zapsmtp-cli
zapsmtp login # checks the key, keeps it readable by you only
zapsmtp test # an email to the simulator, then its events
zapsmtp send --from "Acme <hello@acme.com>" --to jane@example.org \
--subject "Your receipt" --html-file receipt.html --attach ./invoice.pdf
zapsmtp emails list --status bounced --all --json | jq '.[].to'
zapsmtp domains verify <domain-id>