Skip to main content
Glama
resend-email-mcp

resend-email-mcp

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.

npm version License: MIT GitHub Stars GitHub Forks GitHub Issues Glama Quality

TypeScript Node.js MCP Claude Code Cursor Claude Desktop

Instagram YouTube LinkedIn Buy Me A Coffee Strat Academy


Why this MCP

resend-email-mcp

Official resend-mcp

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-mcp

Cursor / 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.json

  • Claude Desktop (macOS): ~/Library/Application Support/Claude/claude_desktop_config.json

  • Cursor: ~/.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

RESEND_API_KEY

✅

Your Resend API key

RESEND_FROM

–

Default sender for send_email when from is omitted (must be a verified domain)

RESEND_REPLY_TO

–

Default Reply-To address

RESEND_READONLY

–

true blocks every mutating tool (send/create/update/delete). Safe exploration of production

RESEND_ATTACHMENTS_DIR

–

Directory that send_email's localPath attachments are restricted to. Unset = disk reads disabled (safe default; path traversal is blocked)

RESEND_BASE_URL

–

Override API base URL (default https://api.resend.com). Must be https (http only for localhost)

RESEND_MAX_RETRIES

–

Retries on 429/5xx (default 3)


Tools

Emails

send_email · send_batch_emails · get_email · list_emails · update_email · cancel_email · preview_email

send_email accepts attachments by base64 content, public path (URL), or localPath (a file on disk, read and base64-encoded automatically — only enabled when RESEND_ATTACHMENTS_DIR is set, and restricted to that directory). preview_email dry-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

diagnose_domain

Inspects every DNS record (SPF/DKIM/DMARC) and reports what's missing + how to fix it

analyze_deliverability

Aggregates recent sends into delivery/bounce/complaint rates with a health verdict

inspect_email

Renders one email's full lifecycle timeline and flags problems

explain_bounce

Classifies a bounce (hard/soft/block) and recommends the action

audit_account

One-shot health check of domains, keys, and deliverability

search_logs

Smart filtering of API logs by status/path/recipient to find failures

test_send

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

resend://account

Domains + API keys snapshot

resend://domains

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 delivery

  • bounced@resend.dev — simulates a hard bounce

  • complained@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

validation_error: from domain is not verified

Your from/RESEND_FROM domain isn't verified

list_domains → diagnose_domain (shows missing DNS records + fixes) → verify_domain

Emails send but never arrive

Deliverability / reputation issue

analyze_deliverability then inspect_email on a sample ID

missing_api_key / invalid_api_key (HTTP 401)

RESEND_API_KEY unset or wrong

Check the .env; create a key at resend.com/api-keys

restricted_api_key / not_authorized (403)

Key scoped to sending-only or one domain

Use a full_access key (list_api_keys to inspect)

rate_limit_exceeded (429)

Too many requests

The client auto-retries with backoff; reduce volume

daily_quota_exceeded

Plan send limit reached

Upgrade plan or wait for reset

A specific email bounced

Invalid/blocking recipient

explain_bounce (classifies hard/soft/block + action)

"Is anything wrong with my setup?"

—

audit_account (one-shot health check)

Request fails for unknown reason

—

search_logs with only_errors: true

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 server

License

MIT © Helbert Paranhos / Strat Academy

Built with the Model Context Protocol. Not affiliated with Resend.

Available Tools

75 tools
add_contact_to_segmentB
Idempotent

Add a contact to a segment.

Inputs: id (required), segment_id (required).

analyze_deliverabilityA
Read-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_accountA
Read-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_emailA
Destructive

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_keyA
DestructiveIdempotent

Permanently revoke an API key by ID.

Inputs: id (required).

delete_broadcastA
DestructiveIdempotent

Delete a broadcast (only drafts and scheduled broadcasts can be deleted).

Inputs: id (required).

delete_contactA
DestructiveIdempotent

Delete a contact by ID or email address.

Inputs: id (required).

delete_contact_propertyB
DestructiveIdempotent

Delete a contact property by ID.

Inputs: id (required).

delete_domainA
DestructiveIdempotent

Permanently delete a domain from Resend.

Inputs: id (required).

delete_segmentA
DestructiveIdempotent

Delete a segment by ID.

Inputs: id (required).

delete_templateB
DestructiveIdempotent

Delete a template by ID.

Inputs: id (required).

delete_topicA
DestructiveIdempotent

Delete a topic by ID.

Inputs: id (required).

delete_webhookA
DestructiveIdempotent

Delete a webhook by ID.

Inputs: id (required).

diagnose_domainA
Read-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_bounceA
Read-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_broadcastA
Read-onlyIdempotent

Retrieve a broadcast by ID, including its status (draft/scheduled/sent) and stats.

Inputs: id (required).

get_contactA
Read-onlyIdempotent

Retrieve a contact by ID or by email address.

Inputs: id (required).

get_contact_propertyA
Read-onlyIdempotent

Retrieve a contact property by ID.

Inputs: id (required).

get_contact_topicsA
Read-onlyIdempotent

List the topic subscriptions of a contact.

Inputs: id (required).

get_domainA
Read-onlyIdempotent

Retrieve a domain by ID, including verification status and the full list of DNS records with their current state.

Inputs: id (required).

get_emailA
Read-onlyIdempotent

Retrieve a single sent email by ID, including its current delivery status.

Inputs: id (required).

get_email_attachmentA
Read-onlyIdempotent

Retrieve a single attachment of a sent email by attachment ID (returns metadata / download info).

Inputs: email_id (required), attachment_id (required).

get_logA
Read-onlyIdempotent

Retrieve a single API request log entry by ID, with full request/response detail.

Inputs: id (required).

get_received_attachmentA
Read-onlyIdempotent

Retrieve a single attachment of a received email by attachment ID.

Inputs: email_id (required), attachment_id (required).

get_received_emailA
Read-onlyIdempotent

Retrieve a single received email by ID, including parsed headers and body.

Inputs: id (required).

get_segmentA
Read-onlyIdempotent

Retrieve a segment by ID.

Inputs: id (required).

get_templateA
Read-onlyIdempotent

Retrieve a template by ID.

Inputs: id (required).

get_topicA
Read-onlyIdempotent

Retrieve a topic by ID.

Inputs: id (required).

get_webhookA
Read-onlyIdempotent

Retrieve a webhook by ID (including its subscribed events and status).

Inputs: id (required).

inspect_emailA
Read-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_keysA
Read-onlyIdempotent

List all API keys (metadata only — secret values are never returned).

Inputs: no named parameters.

list_broadcastsA
Read-onlyIdempotent

List all broadcasts (paginated).

Inputs: limit, after, before.

list_contact_propertiesA
Read-onlyIdempotent

List all custom contact properties defined on the account.

Inputs: no named parameters.

list_contactsB
Read-onlyIdempotent

List contacts (paginated).

Inputs: limit, after, before.

list_contact_segmentsA
Read-onlyIdempotent

List the segments a contact belongs to.

Inputs: id (required).

list_domainsA
Read-onlyIdempotent

List all domains on the account with their verification status.

Inputs: no named parameters.

list_email_attachmentsA
Read-onlyIdempotent

List the attachments of a sent email.

Inputs: email_id (required).

list_emailsA
Read-onlyIdempotent

List sent emails (paginated). Useful to find recent sends and their IDs.

Inputs: limit, after, before.

list_logsA
Read-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_attachmentsA
Read-onlyIdempotent

List the attachments of a received email.

Inputs: email_id (required).

list_received_emailsA
Read-onlyIdempotent

List inbound (received) emails. Requires email receiving to be configured on your Resend account.

Inputs: limit, after, before.

list_segment_contactsA
Read-onlyIdempotent

List the contacts that belong to a segment (paginated).

Inputs: id (required), limit, after, before.

list_segmentsA
Read-onlyIdempotent

List all segments.

Inputs: no named parameters.

list_templatesA
Read-onlyIdempotent

List all templates (paginated).

Inputs: limit, after, before.

list_topicsA
Read-onlyIdempotent

List all topics.

Inputs: no named parameters.

list_webhooksA
Read-onlyIdempotent

List all configured webhooks.

Inputs: no named parameters.

preview_emailA
Read-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_templateA
Idempotent

Publish a template's draft so it becomes the live version used by sends.

Inputs: id (required).

remove_contact_from_segmentC
DestructiveIdempotent

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_logsA
Read-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_broadcastA
Idempotent

Update a draft broadcast's content or settings (from, subject, html, text, etc.).

Inputs: id (required), from, subject, reply_to, +4 more.

update_contactB
Idempotent

Update a contact's name, subscription state, or custom properties.

Inputs: id (required), first_name, last_name, unsubscribed, +1 more.

update_contact_propertyA
Idempotent

Rename a contact property.

Inputs: id (required), name (required).

update_contact_topicsA
Idempotent

Update a contact's topic subscriptions (opt-in / opt-out of specific topics).

Inputs: id (required), topics (required).

update_domainA
Idempotent

Update a domain's settings: open/click tracking and TLS enforcement.

Inputs: id (required), open_tracking, click_tracking, tls.

update_emailA
Idempotent

Update a scheduled email — currently only the scheduled send time can be changed.

Inputs: id (required), scheduledAt (required).

update_templateB
Idempotent

Update a template's name, subject, or body. Creates a new draft version.

Inputs: id (required), name, subject, html, +1 more.

update_topicB
Idempotent

Update a topic's name or description.

Inputs: id (required), name, description.

update_webhookA
Idempotent

Update a webhook's endpoint URL, subscribed events, or enabled status.

Inputs: id (required), endpoint, events, status.

verify_domainA
Idempotent

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

    A3.7/5.0

    Scored across 75 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count2/5

    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.

    Completeness5/5

    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

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      A
      maintenance
      A 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.
      136
      18,684 npm
      581
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      An 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.
      -
    • A
      license
      A
      quality
      C
      maintenance
      An 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.
      84
      41 npm
      1
      MIT
    • A
      license
      A
      quality
      F
      maintenance
      An MCP server for the Resend email API, enabling AI assistants to send emails, manage contacts, audiences, and domains through natural language.
      18
      50 npm
      MIT