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 |
| get_template | Get template details and variables |
| create_template | Create a draft template |
| update_template | Edit template content or variables |
| publish_template | Make template available for sending |
| unpublish_template | Revert template to draft |
| test_template | Send a test email from template |
| delete_template | Remove a template |
| Domains | |
| list_domains | List domains and verification status |
| create_domain | Add a domain, returns DNS records |
| get_domain | Get domain details and DNS records |
| verify_domain | Check DNS verification |
| delete_domain | Remove a domain |
| Contacts | |
| list_contacts | Browse contacts with tag/email filters |
| get_contact | Get contact details by ID |
| create_contact | Add a contact to your audience |
| update_contact | Edit fields, tags, or timezone |
| delete_contact | Remove a contact permanently |
| batch_contacts | Bulk create/update contacts |
| get_contact_tags | List all unique tags |
| get_audience_stats | Active, unsubscribed, bounced counts |
| unsubscribe_contact | Unsubscribe a contact |
| resubscribe_contact | Resubscribe a contact |
| Broadcasts | |
| list_broadcasts | List broadcasts with status filter |
| create_broadcast | Create a draft marketing email |
| get_broadcast | Get broadcast details and stats |
| update_broadcast | Edit draft broadcast content |
| delete_broadcast | Delete a draft broadcast |
| duplicate_broadcast | Copy an existing broadcast |
| send_broadcast | Send immediately to audience |
| schedule_broadcast | Schedule for future delivery |
| cancel_broadcast | Cancel a scheduled broadcast |
| test_broadcast | Send a test preview email |
| get_broadcast_analytics | Opens over time, link performance |
| list_broadcast_recipients | Recipients with delivery status |
| 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 |
| delete_webhook | Delete webhook configuration |
| regenerate_webhook_secret | Regenerate signing secret |
| 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.