resend-email-mcp
A comprehensive Resend API MCP server with 75+ tools and 2 resources for sending, managing, and debugging email campaigns, plus a unique diagnostics layer.
Email Operations
Send single, batch (up to 100), or scheduled emails with HTML/text, CC/BCC, attachments (base64, URL, or local file), tags, headers, and templates
Preview, get, list, update, and cancel sent emails
List and retrieve attachments on sent and received emails
Domain Management
Create, get, list, update, delete, and verify sending domains
Configure open/click tracking and TLS per domain
API Key Management
Create, list, and delete API keys with optional permission scoping and domain restrictions
Broadcasts (Newsletters/Campaigns)
Create, get, list, update, send (now or scheduled), and delete broadcast campaigns targeting audiences or segments
Contact & Audience Management
Create, get, list, update, and delete contacts with custom properties
Manage contact topic subscriptions and segment memberships
Create, list, update, and delete custom contact property definitions
Segments
Create, get, list, and delete segments with optional filter rules; list segment contacts
Templates
Create, get, list, update, delete, publish, and duplicate reusable email templates with
{{variable}}support
Topics
Create, get, list, update, and delete subscription topics
Webhooks
Create, get, list, update, and delete webhooks for events (sent/delivered/bounced/complained/opened/clicked, contact/domain changes)
API Logs
List and retrieve API request logs with full request/response detail
Debug & Diagnostics (unique differentiator)
diagnose_domain— Inspect DNS records (SPF/DKIM/DMARC) with concrete fix stepsanalyze_deliverability— Aggregate delivery/bounce/complaint rates with a health verdictinspect_email— Full lifecycle timeline of a single emailexplain_bounce— Classify bounce type (hard/soft/block) with recommended actionaudit_account— One-shot health check of domains, API keys, and deliverabilitysearch_logs— Smart log filtering by HTTP status, endpoint path, or recipienttest_send— Safely simulate delivery, bounce, or complaint via sandbox addresses
Escape Hatch
resend_raw— Make authenticated requests to any Resend endpoint not covered by a dedicated tool
Safety & Configuration
RESEND_READONLY=trueblocks all mutating operations for safe production explorationRESEND_ATTACHMENTS_DIRrestricts local file reads to a safe directoryIdempotency key support for safe retries
Two MCP resources (
resend://account,resend://domains) for read-only account context
Provides comprehensive tools for sending emails, managing domains, contacts, broadcasts, templates, segments, topics, webhooks, logs, and a unique debug/diagnostics layer for the Resend email API.
resend-email-mcp
The most complete Resend MCP server — full coverage of the Resend API (emails, domains, contacts, broadcasts, templates, segments, topics, webhooks, logs) plus a unique debug/diagnostics layer no other Resend MCP offers: deliverability analysis, DNS troubleshooting, email lifecycle inspection, bounce explanation, and account auditing.
Works with Claude Code, Cursor, Claude Desktop, and any other MCP client.
Why this MCP
resend-email-mcp | Official | Minimal MCPs | |
Send / batch / schedule | ✅ | ✅ | partial |
Domains, contacts, broadcasts, templates, segments, topics, webhooks | ✅ | ✅ | ❌ |
API request logs tools | ✅ | ❌ | ❌ |
Debug layer (diagnose, analyze, inspect, explain, audit) | ✅ 7 tools | ❌ | ❌ |
Readonly safety mode | ✅ | ❌ | ❌ |
Raw escape hatch for new endpoints | ✅ | ❌ | ❌ |
Idempotency-key support | ✅ | partial | ❌ |
75 tools + 2 resources.
Related MCP server: Resend MCP Server
Quick start
1. Get a Resend API key
Create one at https://resend.com/api-keys.
2. Add to your MCP client
Claude Code (CLI)
claude mcp add resend -e RESEND_API_KEY=re_xxxxxxxx -- npx -y resend-email-mcpCursor / Claude Desktop / generic (mcp.json / claude_desktop_config.json)
{
"mcpServers": {
"resend": {
"command": "npx",
"args": ["-y", "resend-email-mcp"],
"env": {
"RESEND_API_KEY": "re_xxxxxxxx",
"RESEND_FROM": "Acme <hello@acme.com>"
}
}
}
}Config file locations:
Claude Desktop (Windows):
%APPDATA%\Claude\claude_desktop_config.jsonClaude Desktop (macOS):
~/Library/Application Support/Claude/claude_desktop_config.jsonCursor:
~/.cursor/mcp.json(or per-project.cursor/mcp.json)
Restart the client and ask: "Send a test email to delivered@resend.dev" or "Audit my Resend account."
Configuration
Env var | Required | Description |
| ✅ | Your Resend API key |
| – | Default sender for |
| – | Default Reply-To address |
| – |
|
| – | Directory that |
| – | Override API base URL (default |
| – | Retries on 429/5xx (default |
Tools
Emails
send_email · send_batch_emails · get_email · list_emails · update_email · cancel_email · preview_email
send_emailaccepts attachments by base64content, publicpath(URL), orlocalPath(a file on disk, read and base64-encoded automatically — only enabled whenRESEND_ATTACHMENTS_DIRis set, and restricted to that directory).preview_emaildry-runs a message — resolving the final sender, sizing attachments, and surfacing warnings — without sending.
Attachments (sent & received)
list_email_attachments · get_email_attachment · list_received_emails · get_received_email · list_received_attachments · get_received_attachment
Domains
create_domain · get_domain · list_domains · update_domain · delete_domain · verify_domain
API keys
create_api_key · list_api_keys · delete_api_key
Broadcasts
create_broadcast · get_broadcast · list_broadcasts · update_broadcast · send_broadcast · delete_broadcast
Contacts
create_contact · get_contact · list_contacts · update_contact · delete_contact · get_contact_topics · update_contact_topics · list_contact_segments · add_contact_to_segment · remove_contact_from_segment
Contact properties
create_contact_property · get_contact_property · list_contact_properties · update_contact_property · delete_contact_property
Segments
create_segment · get_segment · list_segments · delete_segment · list_segment_contacts
Templates
create_template · get_template · list_templates · update_template · delete_template · publish_template · duplicate_template
Topics
create_topic · get_topic · list_topics · update_topic · delete_topic
Webhooks
create_webhook · get_webhook · list_webhooks · update_webhook · delete_webhook
Logs
list_logs · get_log
🔍 Debug & diagnostics (the differentiator)
Tool | What it does |
| Inspects every DNS record (SPF/DKIM/DMARC) and reports what's missing + how to fix it |
| Aggregates recent sends into delivery/bounce/complaint rates with a health verdict |
| Renders one email's full lifecycle timeline and flags problems |
| Classifies a bounce (hard/soft/block) and recommends the action |
| One-shot health check of domains, keys, and deliverability |
| Smart filtering of API logs by status/path/recipient to find failures |
| Safely simulates delivered/bounced/complained via Resend sandbox addresses |
Escape hatch
resend_raw — call any Resend endpoint not yet wrapped in a dedicated tool.
Resources
Beyond tools, the server exposes two read-only MCP resources so a client can pull account context without spending a tool call:
URI | Content |
| Domains + API keys snapshot |
| All sending domains with verification status |
Every tool is annotated with MCP hints (readOnlyHint, destructiveHint, idempotentHint) so clients can show which operations are safe and which need confirmation.
Example prompts
"Diagnose why acme.com isn't verified." →
diagnose_domain"How healthy is my email sending this week?" →
analyze_deliverability"What happened to email re_abc123?" →
inspect_email"Why did that email bounce and what should I do?" →
explain_bounce"Something's wrong with my Resend setup — check everything." →
audit_account"Send our launch newsletter to the 'beta' segment." →
create_broadcast+send_broadcast
Testing safely
Use Resend's sandbox addresses (no reputation impact):
delivered@resend.dev— simulates deliverybounced@resend.dev— simulates a hard bouncecomplained@resend.dev— simulates a spam complaint
Or just run test_send and then inspect_email on the returned ID.
Enable RESEND_READONLY=true to explore a production account without any risk of sending or deleting.
Troubleshooting
This MCP is built to debug itself — when something fails, reach for the diagnostic tools instead of guessing.
Symptom / error | Likely cause | What to run |
| Your |
|
Emails send but never arrive | Deliverability / reputation issue |
|
|
| Check the |
| Key scoped to sending-only or one domain | Use a |
| Too many requests | The client auto-retries with backoff; reduce volume |
| Plan send limit reached | Upgrade plan or wait for reset |
A specific email bounced | Invalid/blocking recipient |
|
"Is anything wrong with my setup?" | — |
|
Request fails for unknown reason | — |
|
Every error returned by this server includes the HTTP status, Resend's error name, and an actionable Hint line.
Local development
git clone https://github.com/helbertparanhos/resend-email-mcp.git
cd resend-email-mcp
npm install
npm run build
cp .env.example .env # add your RESEND_API_KEY
npm run inspector # opens the MCP Inspector against the built serverLicense
MIT © Helbert Paranhos / Strat Academy
Built with the Model Context Protocol. Not affiliated with Resend.
Available Tools
75 toolsadd_contact_to_segmentBIdempotent
Add a contact to a segment.
Inputs: id (required), segment_id (required).
analyze_deliverabilityARead-onlyIdempotent
Aggregate the MOST RECENT sent emails (up to 100 — a single page, not the full history) into deliverability metrics: delivered / bounced / complained / suppressed / opened / clicked counts and rates, plus a health verdict and recommendations. Use to answer 'how is my email health?' or to investigate a recent drop in delivery.
Inputs: sample.
audit_accountARead-onlyIdempotent
One-shot health check of the whole Resend account: lists domains (and whether they're verified), API keys, and recent deliverability (most recent 100 emails), then returns a prioritized list of problems and recommendations. Great first call when 'emails aren't working'.
Inputs: no named parameters.
cancel_emailADestructive
Cancel a scheduled email that has not been sent yet.
Inputs: id (required).
create_api_keyA
Create a new Resend API key. The full key value is returned ONLY once — store it securely. Optionally scope it to sending-only and to a single domain.
Inputs: name (required), permission, domain_id.
create_broadcastA
Create a broadcast (newsletter / campaign) targeted at an audience or segment. Created as a draft — use send_broadcast to deliver or schedule it.
Inputs: from (required), subject (required), audience_id, segment_id, +5 more.
create_contactA
Create a contact. Provide email plus optional name and custom properties. unsubscribed controls subscription state.
Inputs: email (required), first_name, last_name, unsubscribed, +1 more.
create_contact_propertyA
Create a custom contact property (a field you can store on every contact, e.g. 'plan' or 'signup_date').
Inputs: name (required), type (required).
create_domainA
Add a sending domain to Resend. Returns the DNS records (SPF, DKIM, optional DMARC) you must add to your DNS provider before verifying.
Inputs: name (required), region, custom_return_path.
create_segmentA
Create a segment — a saved, optionally rule-based grouping of contacts you can target with broadcasts.
Inputs: name (required), filter.
create_templateA
Create a reusable email template. Use {{variable}} placeholders in html/text and pass values via send_email's templateData.
Inputs: name (required), subject, html, text.
create_topicA
Create a topic — a subscription category (e.g. 'Product updates', 'Promotions') contacts can opt in/out of independently.
Inputs: name (required), description.
create_webhookA
Create a webhook endpoint that receives Resend events. Returns a signing secret used to verify payloads.
Inputs: endpoint (required), events (required).
delete_api_keyADestructiveIdempotent
Permanently revoke an API key by ID.
Inputs: id (required).
delete_broadcastADestructiveIdempotent
Delete a broadcast (only drafts and scheduled broadcasts can be deleted).
Inputs: id (required).
delete_contactADestructiveIdempotent
Delete a contact by ID or email address.
Inputs: id (required).
delete_contact_propertyBDestructiveIdempotent
Delete a contact property by ID.
Inputs: id (required).
delete_domainADestructiveIdempotent
Permanently delete a domain from Resend.
Inputs: id (required).
delete_segmentADestructiveIdempotent
Delete a segment by ID.
Inputs: id (required).
delete_templateBDestructiveIdempotent
Delete a template by ID.
Inputs: id (required).
delete_topicADestructiveIdempotent
Delete a topic by ID.
Inputs: id (required).
delete_webhookADestructiveIdempotent
Delete a webhook by ID.
Inputs: id (required).
diagnose_domainARead-onlyIdempotent
Deep DNS/verification diagnosis for a sending domain. Fetches the domain, inspects every required DNS record (SPF, DKIM, DMARC, MX, Return-Path), reports what is verified vs. pending/missing, and gives concrete fix steps. Use this whenever sending fails with 'domain not verified' or before going live.
Inputs: id (required).
duplicate_templateB
Duplicate an existing template into a new one.
Inputs: id (required), name.
explain_bounceARead-onlyIdempotent
Diagnose why an email bounced. Fetches the email, classifies the bounce as hard / soft / block / suppressed, explains it in plain language, and recommends the correct action (remove address, retry later, fix content, etc.).
Inputs: id (required).
get_broadcastARead-onlyIdempotent
Retrieve a broadcast by ID, including its status (draft/scheduled/sent) and stats.
Inputs: id (required).
get_contactARead-onlyIdempotent
Retrieve a contact by ID or by email address.
Inputs: id (required).
get_contact_propertyARead-onlyIdempotent
Retrieve a contact property by ID.
Inputs: id (required).
get_contact_topicsARead-onlyIdempotent
List the topic subscriptions of a contact.
Inputs: id (required).
get_domainARead-onlyIdempotent
Retrieve a domain by ID, including verification status and the full list of DNS records with their current state.
Inputs: id (required).
get_emailARead-onlyIdempotent
Retrieve a single sent email by ID, including its current delivery status.
Inputs: id (required).
get_email_attachmentARead-onlyIdempotent
Retrieve a single attachment of a sent email by attachment ID (returns metadata / download info).
Inputs: email_id (required), attachment_id (required).
get_logARead-onlyIdempotent
Retrieve a single API request log entry by ID, with full request/response detail.
Inputs: id (required).
get_received_attachmentARead-onlyIdempotent
Retrieve a single attachment of a received email by attachment ID.
Inputs: email_id (required), attachment_id (required).
get_received_emailARead-onlyIdempotent
Retrieve a single received email by ID, including parsed headers and body.
Inputs: id (required).
get_segmentARead-onlyIdempotent
Retrieve a segment by ID.
Inputs: id (required).
get_templateARead-onlyIdempotent
Retrieve a template by ID.
Inputs: id (required).
get_topicARead-onlyIdempotent
Retrieve a topic by ID.
Inputs: id (required).
get_webhookARead-onlyIdempotent
Retrieve a webhook by ID (including its subscribed events and status).
Inputs: id (required).
inspect_emailARead-onlyIdempotent
Full lifecycle view of one email: fetches it and renders a readable timeline of its events (sent → delivered → opened → clicked, or bounced/complained), highlighting the final state and any problem. Use to answer 'what happened to this email?'.
Inputs: id (required).
list_api_keysARead-onlyIdempotent
List all API keys (metadata only — secret values are never returned).
Inputs: no named parameters.
list_broadcastsARead-onlyIdempotent
List all broadcasts (paginated).
Inputs: limit, after, before.
list_contact_propertiesARead-onlyIdempotent
List all custom contact properties defined on the account.
Inputs: no named parameters.
list_contactsBRead-onlyIdempotent
List contacts (paginated).
Inputs: limit, after, before.
list_contact_segmentsARead-onlyIdempotent
List the segments a contact belongs to.
Inputs: id (required).
list_domainsARead-onlyIdempotent
List all domains on the account with their verification status.
Inputs: no named parameters.
list_email_attachmentsARead-onlyIdempotent
List the attachments of a sent email.
Inputs: email_id (required).
list_emailsARead-onlyIdempotent
List sent emails (paginated). Useful to find recent sends and their IDs.
Inputs: limit, after, before.
list_logsARead-onlyIdempotent
List API request logs — every request made to your Resend account with status code, endpoint and timing. The backbone for debugging. For smart filtering use search_logs.
Inputs: limit, after, before.
list_received_attachmentsARead-onlyIdempotent
List the attachments of a received email.
Inputs: email_id (required).
list_received_emailsARead-onlyIdempotent
List inbound (received) emails. Requires email receiving to be configured on your Resend account.
Inputs: limit, after, before.
list_segment_contactsARead-onlyIdempotent
List the contacts that belong to a segment (paginated).
Inputs: id (required), limit, after, before.
list_segmentsARead-onlyIdempotent
List all segments.
Inputs: no named parameters.
list_templatesARead-onlyIdempotent
List all templates (paginated).
Inputs: limit, after, before.
list_topicsARead-onlyIdempotent
List all topics.
Inputs: no named parameters.
list_webhooksARead-onlyIdempotent
List all configured webhooks.
Inputs: no named parameters.
preview_emailARead-onlyIdempotent
Dry-run an email WITHOUT sending it. Resolves the final from (incl. RESEND_FROM default), validates the payload, reads/sizes any local attachments, and returns a summary plus warnings. Use to verify a message before calling send_email.
Inputs: to (required), subject (required), from, html, +11 more.
publish_templateAIdempotent
Publish a template's draft so it becomes the live version used by sends.
Inputs: id (required).
remove_contact_from_segmentCDestructiveIdempotent
Remove a contact from a segment.
Inputs: id (required), segment_id (required).
resend_rawA
Advanced escape hatch — make a raw authenticated request to ANY Resend API endpoint not covered by a dedicated tool. Prefer specific tools when one exists. Mutating methods (POST/PATCH/PUT/DELETE) are blocked in readonly mode.
Inputs: method (required), path (required), body, query.
search_logsARead-onlyIdempotent
Smart search over API request logs: fetch recent logs and filter by HTTP status, status class (e.g. only errors), endpoint path substring, and/or recipient. Returns matching entries plus a breakdown of error types. Use to find why requests are failing.
Inputs: sample, status, only_errors, path_contains, +1 more.
send_batch_emailsA
Send up to 100 distinct emails in one call (one API request). Each entry is a full email object. Note: batch sends do NOT support attachments or scheduling per Resend limits.
Inputs: emails (required), idempotencyKey.
send_broadcastA
Send a broadcast now, or schedule it for later. Omit scheduledAt to send immediately.
Inputs: id (required), scheduledAt.
send_emailA
Send a single email via Resend. Supports HTML/text, cc/bcc, reply-to, attachments, tags, custom headers, scheduling, and templates. Uses RESEND_FROM as the default sender when from is omitted.
Inputs: to (required), subject (required), from, html, +11 more.
test_sendA
Validate your sending setup by sending to Resend's sandbox addresses, which deterministically simulate outcomes WITHOUT hurting your reputation. Choose 'delivered', 'bounced', or 'complained'. Returns the resulting email ID so you can inspect_email it.
Inputs: outcome (required), from, subject.
update_broadcastAIdempotent
Update a draft broadcast's content or settings (from, subject, html, text, etc.).
Inputs: id (required), from, subject, reply_to, +4 more.
update_contactBIdempotent
Update a contact's name, subscription state, or custom properties.
Inputs: id (required), first_name, last_name, unsubscribed, +1 more.
update_contact_propertyAIdempotent
Rename a contact property.
Inputs: id (required), name (required).
update_contact_topicsAIdempotent
Update a contact's topic subscriptions (opt-in / opt-out of specific topics).
Inputs: id (required), topics (required).
update_domainAIdempotent
Update a domain's settings: open/click tracking and TLS enforcement.
Inputs: id (required), open_tracking, click_tracking, tls.
update_emailAIdempotent
Update a scheduled email — currently only the scheduled send time can be changed.
Inputs: id (required), scheduledAt (required).
update_templateBIdempotent
Update a template's name, subject, or body. Creates a new draft version.
Inputs: id (required), name, subject, html, +1 more.
update_topicBIdempotent
Update a topic's name or description.
Inputs: id (required), name, description.
update_webhookAIdempotent
Update a webhook's endpoint URL, subscribed events, or enabled status.
Inputs: id (required), endpoint, events, status.
verify_domainAIdempotent
Trigger verification for a domain after adding its DNS records. Re-checks SPF/DKIM. Use diagnose_domain for a human-readable report of what is still missing.
Inputs: id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 75 tools
Every tool has a clearly distinct purpose with no ambiguity. Even though there are many tools, each is unique: send_email vs send_batch_emails vs send_broadcast, and CRUD operations for different entities are well-separated. Descriptions remove any confusion.
All tool names follow a consistent verb_noun pattern (e.g., create_domain, list_emails, delete_contact). There are no mixed conventions or vague verbs; the naming is predictable and clear.
75 tools is excessive for an MCP server. While Resend has a broad API, this number far exceeds the typical well-scoped range (3-15). It feels like almost every API endpoint is exposed, making the tool surface difficult to navigate and maintain.
The tool set is extremely comprehensive, covering sending, receiving, contacts, segments, broadcasts, templates, domains, webhooks, logs, and account health checks. There are no obvious gaps; even edge cases like batch sending, preview, and testing are included.
Maintenance
Related MCP Connectors
Hosted Mailchimp MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Official remote MCP server of MailSenpai, the EU-hosted email marketing platform. Connect Claude, ChatGPT, Cursor or another MCP client with OAuth 2.1 and PKCE. 74 tools manage lists, subscribers, segments, templates, draft campaigns and stats, and check email DNS, blacklists and spam. Sends and deletions require explicit confirmation; every call is logged. The same team also offers SMTP Senpai, an SMTP relay and email API for transactional sending: https://en.mailsenpai.com/smtp-senpai/.
Hosted Klaviyo MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Related MCP Servers
- AlicenseAqualityAmaintenanceA simple MCP server that enables users to send emails using Resend's API, integrating with tools like Cursor and Claude Desktop for seamless email composition and delivery.13618,684 npm581MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP (Multi-Agent Conversation Protocol) Server for interacting with Resend's email API, auto-generated using AG2's MCP builder to enable sending emails through natural language.-
- AlicenseAqualityCmaintenanceAn MCP server for the PostStack email API that enables AI assistants to send transactional emails, manage contacts, handle inbound email threads, and perform deliverability checks through 84 curated tools.8441 npm1MIT
- AlicenseAqualityFmaintenanceAn MCP server for the Resend email API, enabling AI assistants to send emails, manage contacts, audiences, and domains through natural language.1850 npmMIT