SendPigeon Documentation
Everything you need to send transactional emails. SDKs for Node.js, Python, Go, PHP and REST API.
MCP Server
Give AI assistants email tools via Model Context Protocol.
MCP lets AI assistants call external tools. Add the SendPigeon server once — your AI gets email sending, templates, contacts, and delivery tracking via natural language. More background in the blog post.
Quick Setup
Sign up at sendpigeon.com and grab an API key from the dashboard. Use a test-mode key (sk_test_...) while setting up.
npx @sendpigeon/mcp initPaste your API key, pick your client (Claude Desktop, Cursor, or Claude Code). Config file is written and merged with existing MCP servers automatically.
Restart your client and you should see SendPigeon's tools available. Try: "Send a test email to me@example.com"
Manual Setup
Or add the server block to your client's config file directly:
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
{ "mcpServers": { "sendpigeon": { "command": "npx", "args": ["-y", "@sendpigeon/mcp"], "env": { "SENDPIGEON_API_KEY": "sk_test_your_key_here" } } }}Cursor
.cursor/mcp.json in your project root
{ "mcpServers": { "sendpigeon": { "command": "npx", "args": ["-y", "@sendpigeon/mcp"], "env": { "SENDPIGEON_API_KEY": "sk_test_your_key_here" } } }}Windsurf
~/.codeium/windsurf/mcp_config.json
{ "mcpServers": { "sendpigeon": { "command": "npx", "args": ["-y", "@sendpigeon/mcp"], "env": { "SENDPIGEON_API_KEY": "sk_test_your_key_here" } } }}Claude Code
.mcp.json in your project root
{ "mcpServers": { "sendpigeon": { "command": "npx", "args": ["-y", "@sendpigeon/mcp"], "env": { "SENDPIGEON_API_KEY": "sk_test_your_key_here" } } }}Tools Reference
| Tool | Description |
|---|---|
| Sending | |
| send_email | Send an email with custom HTML or text |
| send_template_email | Send using a template with variables |
| send_batch_emails | Send up to 100 emails in one call |
| get_email_status | Check delivery status of a sent email |
| cancel_email | Cancel a scheduled email |
| Templates | |
| list_templates | List all email templates |
| create_template | Create a draft template |
| update_template | Edit template content or variables |
| publish_template | Make template available for sending |
| delete_template | Remove a template |
| Domains | |
| list_domains | List domains and verification status |
| create_domain | Add a domain, returns DNS records |
| verify_domain | Check DNS verification |
| delete_domain | Remove a domain |
| Contacts | |
| list_contacts | Browse contacts with tag/email filters |
| create_contact | Add a contact to your audience |
| update_contact | Edit fields, tags, or timezone |
| batch_contacts | Bulk create/update contacts |
| get_audience_stats | Active, unsubscribed, bounced counts |
| Broadcasts | |
| create_broadcast | Create a draft marketing email |
| send_broadcast | Send immediately to audience |
| schedule_broadcast | Schedule for future delivery |
| get_broadcast_analytics | Opens over time, link performance |
| Webhooks | |
| get_webhook_config | Current webhook configuration |
| enable_webhook | Set URL + events, get signing secret |
| update_webhook | Change URL or events |
| disable_webhook | Stop receiving webhooks |
| test_webhook | Send a test payload |
| list_webhook_deliveries | Recent delivery attempts |
| Tracking & Suppressions | |
| get_tracking_defaults | Current open/click tracking settings |
| update_tracking_defaults | Toggle tracking or privacy mode |
| list_suppressions | Bounced/complained addresses |
| delete_suppression | Remove from suppression list |
Example
Sending a welcome email via template:
You: Send the welcome template to sarah@acme.com from hello@myapp.com. Set name to Sarah and company to Acme Corp.
AI calls get_template → finds variables name, company
AI calls send_template_email with the parameters
AI: Done! Email sent (ID: em_x7k9m2). Want me to check the status in a minute?
Tip: Use a test-mode API key (sk_test_...) during development. Emails go to the local dev server instead of delivering.