Resend MCP
Vendor MCP94 toolsBearer TokenCommunicationDeveloper ToolsMarketingConnect to Resend's official MCP server to send transactional and marketing emails, manage sending domains, contacts, audiences, broadcasts, and templates...
Resend MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret> -
Make your first call
Section titled “Make your first call”quickstart.ts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENV_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'resendmcp'const identifier = 'user_123'// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'resendmcp_get_automation',toolInput: {},})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "resendmcp"identifier = "user_123"# Make your first callresult = actions.execute_tool(tool_input={},tool_name="resendmcp_get_automation",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Claim verify domain — Trigger asynchronous DNS verification and ownership transfer for a domain claim, using the placeholder Domain ID
- Domain verify, remove — Trigger domain verification in Resend
- Update webhook, topic, template — Update an existing webhook in Resend
- Send event, email, broadcast — Purpose: Fire an event to trigger automations for a specific contact
- Grant revoke oauth — Revoke an OAuth grant by ID
- Webhook remove — Remove a webhook by ID from Resend
Tool list
Section titled “Tool list”Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.
resendmcp_add_contact_to_segment#Add a contact to a segment in Resend (by contact ID or email).3 params
Add a contact to a segment in Resend (by contact ID or email).
segmentIdstringrequiredSegment ID to add the contact tocontactIdstringoptionalContact IDemailstringoptionalContact email addressresendmcp_add_suppression#Add an email address to the suppression list in Resend. Suppressed addresses never receive emails from the account, even when included as recipients. Hard bounces and spam complaints are added to the suppression list automatically; use this tool to manually suppress an address when needed, e.g. to honor a do-not-contact request. To suppress many addresses at once, use batch-add-suppressions instead.1 param
Add an email address to the suppression list in Resend. Suppressed addresses never receive emails from the account, even when included as recipients. Hard bounces and spam complaints are added to the suppression list automatically; use this tool to manually suppress an address when needed, e.g. to honor a do-not-contact request. To suppress many addresses at once, use batch-add-suppressions instead.
emailstringrequiredEmail address to suppressresendmcp_batch_add_suppressions#Add multiple email addresses to the suppression list in Resend in a single call. Suppressed addresses never receive emails from the account. Hard bounces and spam complaints are added to the suppression list automatically; use this tool to manually suppress addresses when needed, e.g. to honor do-not-contact requests. For a single address, use add-suppression instead.1 param
Add multiple email addresses to the suppression list in Resend in a single call. Suppressed addresses never receive emails from the account. Hard bounces and spam complaints are added to the suppression list automatically; use this tool to manually suppress addresses when needed, e.g. to honor do-not-contact requests. For a single address, use add-suppression instead.
emailsarrayrequiredEmail addresses to suppressresendmcp_batch_remove_suppressions#Remove multiple entries from the suppression list in Resend in a single call, by email addresses or by suppression IDs (provide exactly one of the two). The addresses will start receiving emails again. Before using this tool, you MUST double-check with the user that they want to remove these suppressions. Reference the EMAIL ADDRESSES (or IDs) when double-checking, and warn the user that addresses suppressed due to a bounce or complaint may hurt deliverability if emailed again. You may only use this tool if the user explicitly confirms they want to remove the suppressions after you double-check.2 params
Remove multiple entries from the suppression list in Resend in a single call, by email addresses or by suppression IDs (provide exactly one of the two). The addresses will start receiving emails again. Before using this tool, you MUST double-check with the user that they want to remove these suppressions. Reference the EMAIL ADDRESSES (or IDs) when double-checking, and warn the user that addresses suppressed due to a bounce or complaint may hurt deliverability if emailed again. You may only use this tool if the user explicitly confirms they want to remove the suppressions after you double-check.
emailsarrayoptionalEmail addresses to remove from the suppression list. Cannot be used with "ids".idsarrayoptionalSuppression IDs to remove from the suppression list. Cannot be used with "emails".resendmcp_cancel_broadcast#**Purpose:** Cancel a queued or scheduled broadcast by ID or Resend dashboard URL, without removing it. Cancelling a queued broadcast stops it mid-send (emails already sent are not affected). Cancelling a scheduled broadcast reverts it to draft.
**NOT for:** Removing a broadcast entirely (use remove-broadcast). Draft and sent broadcasts cannot be cancelled - sent broadcasts are immutable, and drafts have nothing to cancel.
**When to use:** User wants to "stop", "cancel", or "pause" a broadcast that is currently sending or scheduled to send.1 param
**Purpose:** Cancel a queued or scheduled broadcast by ID or Resend dashboard URL, without removing it. Cancelling a queued broadcast stops it mid-send (emails already sent are not affected). Cancelling a scheduled broadcast reverts it to draft. **NOT for:** Removing a broadcast entirely (use remove-broadcast). Draft and sent broadcasts cannot be cancelled - sent broadcasts are immutable, and drafts have nothing to cancel. **When to use:** User wants to "stop", "cancel", or "pause" a broadcast that is currently sending or scheduled to send.
broadcastIdstringrequiredBroadcast ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>)resendmcp_cancel_email#Cancel a scheduled email that has not yet been sent. Only works for emails that were scheduled using the scheduledAt parameter.1 param
Cancel a scheduled email that has not yet been sent. Only works for emails that were scheduled using the scheduledAt parameter.
idstringrequiredThe ID of the scheduled email to cancelresendmcp_compose_broadcast#**Purpose:** Set the TipTap JSON content of a broadcast, enabling it to be edited visually in the Resend dashboard editor. Automatically connects and disconnects from the editor. Can also update metadata (subject, preview text, name) in the same call.
**This is the recommended way to set email content.** Content set via compose-broadcast can be visually edited by the user in the dashboard. Use this for newsletters and any broadcast where the user may want to refine the content.
**Workflow:** get-tiptap-json-content (with include_schema: true) -> compose-broadcast
**When to use:**
- After create-broadcast, to set the email body
- When the user wants to write, edit, or style email content
- When the user wants to collaborate on the email in the dashboard editor
**Important:** Always call get-tiptap-json-content first to retrieve the existing TipTap JSON, then build your changes on top of it. Skipping this will overwrite all existing content.
**Note:** Switching between compose (TipTap) and update (raw HTML) modes is lossy - some content or formatting may be lost. If the broadcast already has HTML content, ask the user before switching to compose mode.5 params
**Purpose:** Set the TipTap JSON content of a broadcast, enabling it to be edited visually in the Resend dashboard editor. Automatically connects and disconnects from the editor. Can also update metadata (subject, preview text, name) in the same call. **This is the recommended way to set email content.** Content set via compose-broadcast can be visually edited by the user in the dashboard. Use this for newsletters and any broadcast where the user may want to refine the content. **Workflow:** get-tiptap-json-content (with include_schema: true) -> compose-broadcast **When to use:** - After create-broadcast, to set the email body - When the user wants to write, edit, or style email content - When the user wants to collaborate on the email in the dashboard editor **Important:** Always call get-tiptap-json-content first to retrieve the existing TipTap JSON, then build your changes on top of it. Skipping this will overwrite all existing content. **Note:** Switching between compose (TipTap) and update (raw HTML) modes is lossy - some content or formatting may be lost. If the broadcast already has HTML content, ask the user before switching to compose mode.
broadcastIdstringrequiredBroadcast ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>)contentobjectoptionalTipTap JSON content. Call get-tiptap-json-content (with include_schema: true) first to get the existing content and the schema reference.namestringoptionalUpdate the broadcast name (internal label).previewTextstringoptionalUpdate the preview text (shown in inbox before opening the email).subjectstringoptionalUpdate the email subject line.resendmcp_compose_template#**Purpose:** Set the TipTap JSON content of a template, enabling it to be edited visually in the Resend dashboard editor. Automatically connects and disconnects from the editor. Can also update metadata (subject, name) in the same call.
**This is the recommended way to set email content.** Content set via compose-template can be visually edited by the user in the dashboard.
**Workflow:** get-tiptap-json-content (with include_schema: true) → compose-template
**When to use:**
- After create-template, to set the email body
- When the user wants to write, edit, or style email content
- When the user wants to collaborate on the email in the dashboard editor
**Important:** Always call get-tiptap-json-content first to retrieve the existing TipTap JSON, then build your changes on top of it. Skipping this will overwrite all existing content.
**Note:** Switching between compose (TipTap) and update (raw HTML) modes is lossy — some content or formatting may be lost. If the template already has HTML content, ask the user before switching to compose mode.4 params
**Purpose:** Set the TipTap JSON content of a template, enabling it to be edited visually in the Resend dashboard editor. Automatically connects and disconnects from the editor. Can also update metadata (subject, name) in the same call. **This is the recommended way to set email content.** Content set via compose-template can be visually edited by the user in the dashboard. **Workflow:** get-tiptap-json-content (with include_schema: true) → compose-template **When to use:** - After create-template, to set the email body - When the user wants to write, edit, or style email content - When the user wants to collaborate on the email in the dashboard editor **Important:** Always call get-tiptap-json-content first to retrieve the existing TipTap JSON, then build your changes on top of it. Skipping this will overwrite all existing content. **Note:** Switching between compose (TipTap) and update (raw HTML) modes is lossy — some content or formatting may be lost. If the template already has HTML content, ask the user before switching to compose mode.
idstringrequiredThe template ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>)contentobjectoptionalTipTap JSON content. Call get-tiptap-json-content (with include_schema: true) first to get the existing content and the schema reference.namestringoptionalUpdate the template name.subjectstringoptionalUpdate the default email subject.resendmcp_connect_to_editor#**Purpose:** Show agent presence in the Resend dashboard editor. Users will see an agent avatar while connected.
**When to use:**
- To signal to dashboard users that an AI agent is working on the content outside of compose workflows
- **Not needed before compose-broadcast or compose-template** — get-tiptap-json-content connects automatically, and compose tools disconnect when done.
**Returns:** Connection token and room ID.
**Note:** This establishes a live, stateful editor session for the agent — call disconnect-from-editor when done to remove the agent's presence from the dashboard.3 params
**Purpose:** Show agent presence in the Resend dashboard editor. Users will see an agent avatar while connected. **When to use:** - To signal to dashboard users that an AI agent is working on the content outside of compose workflows - **Not needed before compose-broadcast or compose-template** — get-tiptap-json-content connects automatically, and compose tools disconnect when done. **Returns:** Connection token and room ID. **Note:** This establishes a live, stateful editor session for the agent — call disconnect-from-editor when done to remove the agent's presence from the dashboard.
resource_idstringrequiredID of the resource or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id> or https://resend.com/templates/<id>)resource_typestringrequiredType of resource to connect toagent_namestringoptionalDisplay name for the agent avatarresendmcp_create_api_key#Create a new API key in Resend. The token is only shown once upon creation, so you MUST display it to the user.3 params
Create a new API key in Resend. The token is only shown once upon creation, so you MUST display it to the user.
namestringrequiredAPI key namedomainIdstringoptionalRestrict API key to send emails from a specific domain. Only applicable when permission is "sending_access".permissionstringoptionalAccess level. "full_access" grants complete resource management. "sending_access" restricts to email delivery only.resendmcp_create_automation#**Purpose:** Create an automation workflow that triggers on events and executes a sequence of steps.
**When to use:**
- User wants to set up automated email sequences (welcome series, drip campaigns, re-engagement)
- User wants to automate actions based on events (update contacts, add to segments)
**Workflow:** manage-events (create event, if needed) → list-templates (to get template IDs) → get-template (to check if template has "from" and "subject" — if not, use list-domains to pick a verified domain for the step config) → create-automation → send-event (to test)
**Returns:** Automation ID and dashboard link.
The workflow is a JSON object with one key: "steps" — an array of step objects.
Each step has: key (unique string), type, config, and either "next" (string|null) or "branches" (for branching steps).
Use keys like: "trigger", "send_email_1", "delay_1", "condition_1", "wait_event_1".
## Step types
### trigger — starts the automation when an event fires (required, exactly one)
config: { "eventName": "<event_name>" }
Uses "next".
### send_email — send an email using a published template
config: { "template": { "id": "<template_id>", "variables": { "<key>": "<value>" } }, "from": "Name <sender@example.com>", "subject": "Email subject", "replyTo": "<address>" }
**"from" and "subject" are resolved from the step config first, then fall back to the template.** If neither provides a "from", the email will silently fail to send. If neither provides a "subject", the run will error. Best practice: always set "from" and "subject" on the step config so the automation is self-contained. Use list-domains to find verified domains for "from". "replyTo" and "variables" are optional. Variables can use { "var": "event.<field>" } or { "var": "contact.<field>" } for dynamic values.
Uses "next".
### delay — pause the workflow
config: { "duration": "<human-readable>" }
Examples: "30 minutes", "1 hour", "2 days", "1 week". Max 30 days.
Uses "next".
### condition — conditional split based on contact or event data
config: A condition rule object:
Single rule: { "type": "rule", "field": "event.<field>" or "contact.<field>", "operator": "<op>", "value": <value> }
Compound: { "type": "and"|"or", "rules": [<rule>, ...] }
Operators: eq, neq, gt, gte, lt, lte, contains, starts_with, ends_with, exists, is_empty.
exists/is_empty do not require a value.
Uses "branches": { "condition_met": "<step_key>", "condition_not_met": "<step_key_or_null>" }
### wait_for_event — pause until a specific event arrives or timeout
config: { "eventName": "<event_name>", "timeout": "<human-readable>", "filterRule": <optional condition rule> }
For email lifecycle events use "resend:email.<opened|clicked|bounced|delivered|complained|failed|suppressed>".
Uses "branches": { "event_received": "<step_key>", "timeout": "<step_key_or_null>" }
### contact_update — update contact fields
config: { "firstName": "<value>", "lastName": "<value>", "unsubscribed": true|false, "properties": { "<key>": "<value>" } }
All fields optional. Values can use { "var": "event.<field>" } for dynamic data.
Uses "next".
### contact_delete — remove the contact from the audience
config: {}
Uses "next".
### add_to_segment — add contact to a segment
config: { "segmentId": "<segment_id>" }
Uses "next".
## Rules
1. Every step must be reachable from the trigger via next/branches.
2. Terminal steps have "next": null (or null branch values).
3. The workflow must be tree-shaped — no merging branches back together.
## Example: Linear drip campaign
{
"steps": [
{ "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" },
{ "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_123" }, "from": "Welcome <hello@example.com>", "subject": "Welcome!" }, "next": "delay_1" },
{ "key": "delay_1", "type": "delay", "config": { "duration": "3 days" }, "next": "send_email_2" },
{ "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_456" }, "from": "Welcome <hello@example.com>", "subject": "Getting started" }, "next": null }
]
}
## Example: Re-engagement with wait_for_event
{
"steps": [
{ "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" },
{ "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_789" }, "from": "Team <team@example.com>", "subject": "Welcome" }, "next": "wait_event_1" },
{ "key": "wait_event_1", "type": "wait_for_event", "config": { "eventName": "resend:email.opened", "timeout": "3 days" }, "branches": { "event_received": null, "timeout": "send_email_2" } },
{ "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_abc" }, "from": "Team <team@example.com>", "subject": "Did you miss this?" }, "next": null }
]
}
## Example: Condition branch
{
"steps": [
{ "key": "trigger", "type": "trigger", "config": { "eventName": "trial.ended" }, "next": "condition_1" },
{ "key": "condition_1", "type": "condition", "config": { "type": "rule", "field": "event.converted", "operator": "eq", "value": true }, "branches": { "condition_met": "send_email_1", "condition_not_met": "send_email_2" } },
{ "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_thanks" }, "from": "Team <team@example.com>", "subject": "Thanks for upgrading!" }, "next": null },
{ "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_win_back" }, "from": "Team <team@example.com>", "subject": "We'd love to have you back" }, "next": null }
]
}3 params
**Purpose:** Create an automation workflow that triggers on events and executes a sequence of steps. **When to use:** - User wants to set up automated email sequences (welcome series, drip campaigns, re-engagement) - User wants to automate actions based on events (update contacts, add to segments) **Workflow:** manage-events (create event, if needed) → list-templates (to get template IDs) → get-template (to check if template has "from" and "subject" — if not, use list-domains to pick a verified domain for the step config) → create-automation → send-event (to test) **Returns:** Automation ID and dashboard link. The workflow is a JSON object with one key: "steps" — an array of step objects. Each step has: key (unique string), type, config, and either "next" (string|null) or "branches" (for branching steps). Use keys like: "trigger", "send_email_1", "delay_1", "condition_1", "wait_event_1". ## Step types ### trigger — starts the automation when an event fires (required, exactly one) config: { "eventName": "<event_name>" } Uses "next". ### send_email — send an email using a published template config: { "template": { "id": "<template_id>", "variables": { "<key>": "<value>" } }, "from": "Name <sender@example.com>", "subject": "Email subject", "replyTo": "<address>" } **"from" and "subject" are resolved from the step config first, then fall back to the template.** If neither provides a "from", the email will silently fail to send. If neither provides a "subject", the run will error. Best practice: always set "from" and "subject" on the step config so the automation is self-contained. Use list-domains to find verified domains for "from". "replyTo" and "variables" are optional. Variables can use { "var": "event.<field>" } or { "var": "contact.<field>" } for dynamic values. Uses "next". ### delay — pause the workflow config: { "duration": "<human-readable>" } Examples: "30 minutes", "1 hour", "2 days", "1 week". Max 30 days. Uses "next". ### condition — conditional split based on contact or event data config: A condition rule object: Single rule: { "type": "rule", "field": "event.<field>" or "contact.<field>", "operator": "<op>", "value": <value> } Compound: { "type": "and"|"or", "rules": [<rule>, ...] } Operators: eq, neq, gt, gte, lt, lte, contains, starts_with, ends_with, exists, is_empty. exists/is_empty do not require a value. Uses "branches": { "condition_met": "<step_key>", "condition_not_met": "<step_key_or_null>" } ### wait_for_event — pause until a specific event arrives or timeout config: { "eventName": "<event_name>", "timeout": "<human-readable>", "filterRule": <optional condition rule> } For email lifecycle events use "resend:email.<opened|clicked|bounced|delivered|complained|failed|suppressed>". Uses "branches": { "event_received": "<step_key>", "timeout": "<step_key_or_null>" } ### contact_update — update contact fields config: { "firstName": "<value>", "lastName": "<value>", "unsubscribed": true|false, "properties": { "<key>": "<value>" } } All fields optional. Values can use { "var": "event.<field>" } for dynamic data. Uses "next". ### contact_delete — remove the contact from the audience config: {} Uses "next". ### add_to_segment — add contact to a segment config: { "segmentId": "<segment_id>" } Uses "next". ## Rules 1. Every step must be reachable from the trigger via next/branches. 2. Terminal steps have "next": null (or null branch values). 3. The workflow must be tree-shaped — no merging branches back together. ## Example: Linear drip campaign { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_123" }, "from": "Welcome <hello@example.com>", "subject": "Welcome!" }, "next": "delay_1" }, { "key": "delay_1", "type": "delay", "config": { "duration": "3 days" }, "next": "send_email_2" }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_456" }, "from": "Welcome <hello@example.com>", "subject": "Getting started" }, "next": null } ] } ## Example: Re-engagement with wait_for_event { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_789" }, "from": "Team <team@example.com>", "subject": "Welcome" }, "next": "wait_event_1" }, { "key": "wait_event_1", "type": "wait_for_event", "config": { "eventName": "resend:email.opened", "timeout": "3 days" }, "branches": { "event_received": null, "timeout": "send_email_2" } }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_abc" }, "from": "Team <team@example.com>", "subject": "Did you miss this?" }, "next": null } ] } ## Example: Condition branch { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "trial.ended" }, "next": "condition_1" }, { "key": "condition_1", "type": "condition", "config": { "type": "rule", "field": "event.converted", "operator": "eq", "value": true }, "branches": { "condition_met": "send_email_1", "condition_not_met": "send_email_2" } }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_thanks" }, "from": "Team <team@example.com>", "subject": "Thanks for upgrading!" }, "next": null }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_win_back" }, "from": "Team <team@example.com>", "subject": "We'd love to have you back" }, "next": null } ] }
namestringrequiredName for the automation (e.g., "Welcome Series")workflowobjectrequiredThe workflow definition. See the tool description for the full schema and examples.statusstringoptionalInitial status. Default: disabled. Use "enabled" to activate immediately.resendmcp_create_broadcast#**Purpose:** Create a broadcast campaign (one email sent to an entire segment). Defines subject, body, and segment; does NOT send yet. Use send-broadcast to send it.
**NOT for:** Sending a one-off email to specific people (use send-email). Not for adding contacts (use create-contact).
**Returns:** Broadcast ID. Use this ID with send-broadcast to send, or get-broadcast/update-broadcast to manage.
**When to use:**
- User wants to "email my list", "send a newsletter", "broadcast to my segment", "email all contacts in X"
- Newsletter, announcement, or bulk message to one segment
- Supports personalization: {{{FIRST_NAME}}}, {{{LAST_NAME}}}, {{{EMAIL}}}, {{{RESEND_UNSUBSCRIBE_URL}}}
**"All contacts" note:** Broadcasts require a segment. There is no "all contacts" option in the API. If the user wants to send to all contacts, check list-segments for an existing segment that covers everyone. If none exists, suggest creating one with create-segment.
**Workflow:** list-segments (if needed) -> create-broadcast -> get-tiptap-json-content (with include_schema: true) -> compose-broadcast -> send-broadcast.
**Content options after creating:**
- **compose-broadcast** (recommended): Sets TipTap content that the user can visually edit in the Resend dashboard. Use this when the user wants to collaborate on or refine the email in the editor.
- **update-broadcast with html/text**: Sets static HTML/text content. Use this only when the user explicitly wants to set raw HTML. Switching between compose and html/text modes is lossy - some content or formatting may be lost. Ask the user before switching.8 params
**Purpose:** Create a broadcast campaign (one email sent to an entire segment). Defines subject, body, and segment; does NOT send yet. Use send-broadcast to send it. **NOT for:** Sending a one-off email to specific people (use send-email). Not for adding contacts (use create-contact). **Returns:** Broadcast ID. Use this ID with send-broadcast to send, or get-broadcast/update-broadcast to manage. **When to use:** - User wants to "email my list", "send a newsletter", "broadcast to my segment", "email all contacts in X" - Newsletter, announcement, or bulk message to one segment - Supports personalization: {{{FIRST_NAME}}}, {{{LAST_NAME}}}, {{{EMAIL}}}, {{{RESEND_UNSUBSCRIBE_URL}}} **"All contacts" note:** Broadcasts require a segment. There is no "all contacts" option in the API. If the user wants to send to all contacts, check list-segments for an existing segment that covers everyone. If none exists, suggest creating one with create-segment. **Workflow:** list-segments (if needed) -> create-broadcast -> get-tiptap-json-content (with include_schema: true) -> compose-broadcast -> send-broadcast. **Content options after creating:** - **compose-broadcast** (recommended): Sets TipTap content that the user can visually edit in the Resend dashboard. Use this when the user wants to collaborate on or refine the email in the editor. - **update-broadcast with html/text**: Sets static HTML/text content. Use this only when the user explicitly wants to set raw HTML. Switching between compose and html/text modes is lossy - some content or formatting may be lost. Ask the user before switching.
fromstringrequiredFrom email address (e.g. "onboarding@resend.com" or "Resend <onboarding@resend.com>")namestringrequiredName for the broadcast. If the user does not provide a name, go ahead and create a descriptive name for them, based on the email subject/content and the context of your conversation.segmentIdstringrequiredSegment ID to send tosubjectstringrequiredEmail subjecttextstringrequiredPlain text version of the email content. The following placeholders may be used to personalize the email content: {{{FIRST_NAME|fallback}}}, {{{LAST_NAME|fallback}}}, {{{EMAIL}}}, {{{RESEND_UNSUBSCRIBE_URL}}}htmlstringoptionalHTML version of the email content. Placeholders: {{{FIRST_NAME|fallback}}}, {{{LAST_NAME|fallback}}}, {{{EMAIL}}}, {{{RESEND_UNSUBSCRIBE_URL}}}.
Email HTML requirements - follow all of these without exception:
STRUCTURE
- Always include <!DOCTYPE html>, <html>, <head>, <body>
- Layout must be table-based: <table>, <tr>, <td> - never use <div> for layout
- Outer wrapper table at width="100%", inner content table at max 600px wide
- Every table must have cellpadding="0" cellspacing="0" border="0"
CSS
- All styles must be inline (style="...") - no <style> tag, no external stylesheets
- No flexbox, no grid, no CSS variables, no CSS shorthand (use padding-top not padding)
- font-family must always include web-safe fallbacks (Arial, Helvetica, Georgia, sans-serif)
- Always set font-size, line-height, and color explicitly on every text element
IMAGES
- Always set width, height, border="0", display:block on every <img>
- Use absolute URLs only - no relative paths
- Always include alt text
LINKS & BUTTONS
- Never use <button> - use <a> styled as a button inside a <td>
- No <video>, <form>, or <input> elements
- No JavaScript of any kind
OUTLOOK COMPATIBILITY
- Use bgcolor attribute on <td> alongside CSS background-color
- No CSS background-image (poor Outlook support)
- Add <!--[if mso]> conditionals where needed for Outlook rendering
META (in <head>)
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">previewTextstringoptionalPreview text for the emailreplyToarrayoptionalReply-to email address(es)resendmcp_create_contact#Create a new contact in Resend. Optionally assign to segments and configure topic subscriptions.7 params
Create a new contact in Resend. Optionally assign to segments and configure topic subscriptions.
emailstringrequiredContact email addressfirstNamestringoptionalContact first namelastNamestringoptionalContact last namepropertiesobjectoptionalCustom property key-value pairs for the contact (e.g. { "company_name": "Acme" })segmentIdsarrayoptionalArray of segment IDs to assign this contact totopicsarrayoptionalArray of topic subscription configurationsunsubscribedbooleanoptionalWhether the contact is unsubscribed from all broadcastsresendmcp_create_contact_import#Bulk-import contacts from a CSV file into Resend. The import is processed asynchronously: this returns an import ID immediately, then use get-contact-import to poll its status and counts. Provide the CSV as raw text via `content`. Max file size 100MB.6 params
Bulk-import contacts from a CSV file into Resend. The import is processed asynchronously: this returns an import ID immediately, then use get-contact-import to poll its status and counts. Provide the CSV as raw text via `content`. Max file size 100MB.
contentstringrequiredRaw CSV text to upload (e.g. "email,first_name\na@b.com,Ada").columnMapobjectoptionalMaps contact fields to CSV header names. When omitted, headers are matched case-sensitively to "email", "first_name", and "last_name".filenamestringoptionalName for the uploaded file. Defaults to "contacts.csv".onConflictstringoptionalHow to handle contacts that already exist: "upsert" updates them, "skip" leaves them unchanged. Defaults to "upsert".segmentIdsarrayoptionalArray of segment IDs to assign the imported contacts to.topicsarrayoptionalTopic subscription configurations applied to the imported contacts.resendmcp_create_contact_property#Create a new contact property in Resend. A contact property is a custom attribute (e.g. "company_name", "plan_tier") that can be attached to contacts.3 params
Create a new contact property in Resend. A contact property is a custom attribute (e.g. "company_name", "plan_tier") that can be attached to contacts.
keystringrequiredThe property key. Max 50 characters, only alphanumeric characters and underscores allowed.typestringrequiredThe property type: "string" or "number".fallbackValuestringoptionalDefault value when the property is not set for a contact. Must match the specified type.resendmcp_create_domain#Create a new domain in Resend. Returns DNS records that must be configured with your DNS provider for verification. You MUST display the DNS records to the user so they can set them up.8 params
Create a new domain in Resend. Returns DNS records that must be configured with your DNS provider for verification. You MUST display the DNS records to the user so they can set them up.
namestringrequiredThe domain name (e.g., example.com)capabilitiesobjectoptionalDomain capabilities configuration.clickTrackingbooleanoptionalEnable click tracking in HTML emails.customReturnPathstringoptionalSubdomain for the Return-Path address. Defaults to "send".openTrackingbooleanoptionalEnable email open rate tracking.regionstringoptionalDeployment region. Defaults to "us-east-1".tlsstringoptionalTLS mode. "opportunistic" attempts secure connection with fallback. "enforced" requires TLS or fails. Defaults to "opportunistic".trackingSubdomainstringoptionalCustom subdomain for tracking links (e.g., "track" for track.example.com). When set, click and open tracking URLs will use this subdomain instead of the default.resendmcp_create_domain_claim#Start a claim for a domain another Resend account has already verified. The domain is recreated under your account with brand-new DKIM keys, so the previous account's DNS records cannot be reused. Returns a TXT record that MUST be added to your DNS to prove ownership. You MUST display the TXT record to the user. After they add it, use verify-domain-claim, then poll get-domain-claim until status is "completed".6 params
Start a claim for a domain another Resend account has already verified. The domain is recreated under your account with brand-new DKIM keys, so the previous account's DNS records cannot be reused. Returns a TXT record that MUST be added to your DNS to prove ownership. You MUST display the TXT record to the user. After they add it, use verify-domain-claim, then poll get-domain-claim until status is "completed".
namestringrequiredThe domain name to claim (e.g., example.com)clickTrackingbooleanoptionalEnable click tracking in HTML emails.customReturnPathstringoptionalSubdomain for the Return-Path address. Defaults to "send".openTrackingbooleanoptionalEnable email open rate tracking.regionstringoptionalDeployment region. Defaults to "us-east-1".trackingSubdomainstringoptionalCustom subdomain for tracking links (e.g., "track" for track.example.com).resendmcp_create_segment#Create a new segment in Resend. A segment is a group of contacts that can be used to target specific broadcasts.1 param
Create a new segment in Resend. A segment is a group of contacts that can be used to target specific broadcasts.
namestringrequiredName for the new segmentresendmcp_create_template#Create a new email template in Resend. Templates are created in draft status. Use publish-template to make them available for sending. Variables use triple-brace syntax in HTML: {{{VAR_NAME}}}.
**Workflow:** create-template → get-tiptap-json-content (with include_schema: true) → compose-template → publish-template.
**Content options after creating:**
- **compose-template** (recommended): Sets TipTap content that the user can visually edit in the Resend dashboard. Use this when the user wants to collaborate on or refine the template in the editor.
- **update-template with html/text**: Sets static HTML/text content. Use this only when the user explicitly wants to set raw HTML. Switching between compose and html/text modes is lossy — some content or formatting may be lost. Ask the user before switching.8 params
Create a new email template in Resend. Templates are created in draft status. Use publish-template to make them available for sending. Variables use triple-brace syntax in HTML: {{{VAR_NAME}}}. **Workflow:** create-template → get-tiptap-json-content (with include_schema: true) → compose-template → publish-template. **Content options after creating:** - **compose-template** (recommended): Sets TipTap content that the user can visually edit in the Resend dashboard. Use this when the user wants to collaborate on or refine the template in the editor. - **update-template with html/text**: Sets static HTML/text content. Use this only when the user explicitly wants to set raw HTML. Switching between compose and html/text modes is lossy — some content or formatting may be lost. Ask the user before switching.
htmlstringrequiredThe HTML content of the template. Use triple-brace syntax for variables: {{{VARIABLE_NAME}}}.
Email HTML requirements — follow all of these without exception:
STRUCTURE
- Always include <!DOCTYPE html>, <html>, <head>, <body>
- Layout must be table-based: <table>, <tr>, <td> — never use <div> for layout
- Outer wrapper table at width="100%", inner content table at max 600px wide
- Every table must have cellpadding="0" cellspacing="0" border="0"
CSS
- All styles must be inline (style="...") — no <style> tag, no external stylesheets
- No flexbox, no grid, no CSS variables, no CSS shorthand (use padding-top not padding)
- font-family must always include web-safe fallbacks (Arial, Helvetica, Georgia, sans-serif)
- Always set font-size, line-height, and color explicitly on every text element
IMAGES
- Always set width, height, border="0", display:block on every <img>
- Use absolute URLs only — no relative paths
- Always include alt text
LINKS & BUTTONS
- Never use <button> — use <a> styled as a button inside a <td>
- No <video>, <form>, or <input> elements
- No JavaScript of any kind
OUTLOOK COMPATIBILITY
- Use bgcolor attribute on <td> alongside CSS background-color
- No CSS background-image (poor Outlook support)
- Add <!--[if mso]> conditionals where needed for Outlook rendering
META (in <head>)
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">namestringrequiredThe name of the template.aliasstringoptionalAn alias for the template. Can be used instead of the ID to reference the template.fromstringoptionalSender email address (e.g., "Your Name <sender@example.com>"). Can be overridden when sending.replyTostringoptionalDefault Reply-to email address(es). Can be overridden when sending.subjectstringoptionalDefault email subject. Can be overridden when sending.textstringoptionalPlain text version of the message. If not provided, HTML will be used to generate it.variablesarrayoptionalArray of template variables (up to 50 per template).resendmcp_create_topic#Create a new topic in Resend. Topics allow contacts to manage their subscription preferences for different types of emails.3 params
Create a new topic in Resend. Topics allow contacts to manage their subscription preferences for different types of emails.
defaultSubscriptionstringrequiredDefault subscription preference for new contacts. Cannot be modified after creation.namestringrequiredTopic name (max 50 characters)descriptionstringoptionalTopic description (max 200 characters)resendmcp_create_webhook#Create a new webhook in Resend. A webhook allows you to receive notifications at a specified URL when certain events occur (e.g. email.sent, email.delivered, email.bounced).2 params
Create a new webhook in Resend. A webhook allows you to receive notifications at a specified URL when certain events occur (e.g. email.sent, email.delivered, email.bounced).
endpointstringrequiredThe URL where webhook events will be senteventsarrayrequiredArray of event types to subscribe toresendmcp_disconnect_from_editor#Remove agent presence from the Resend dashboard editor. Call this when done editing.0 params
Remove agent presence from the Resend dashboard editor. Call this when done editing.
resendmcp_duplicate_automation#Duplicate an existing automation by ID or Resend dashboard URL. Creates a copy with its own ID, including the steps and connections of the original. Use this when the user wants a new automation based on one they already have, instead of rebuilding the workflow from scratch. Use update-automation on the new ID to rename it or change its workflow.1 param
Duplicate an existing automation by ID or Resend dashboard URL. Creates a copy with its own ID, including the steps and connections of the original. Use this when the user wants a new automation based on one they already have, instead of rebuilding the workflow from scratch. Use update-automation on the new ID to rename it or change its workflow.
idstringrequiredAutomation ID or Resend dashboard URL (e.g. https://resend.com/automations/<id>) of the automation to duplicateresendmcp_duplicate_template#Duplicate an existing email template in Resend. Creates a new draft copy of the template with a new ID. Accepts a template ID, alias, or Resend dashboard URL.1 param
Duplicate an existing email template in Resend. Creates a new draft copy of the template with a new ID. Accepts a template ID, alias, or Resend dashboard URL.
idstringrequiredThe ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>) of the template to duplicate.resendmcp_get_automation#**Purpose:** Get details of a specific automation (with its workflow) or list all automations.
**Modes:**
- With `id`: Returns full automation details including the workflow definition.
- Without `id`: Lists all automations with optional status filter and pagination.
**When to use:**
- User asks "show me my automations" or "what automations do I have?"
- User wants to inspect a specific automation's workflow
- Before update-automation, to see the current workflow5 params
**Purpose:** Get details of a specific automation (with its workflow) or list all automations. **Modes:** - With `id`: Returns full automation details including the workflow definition. - Without `id`: Lists all automations with optional status filter and pagination. **When to use:** - User asks "show me my automations" or "what automations do I have?" - User wants to inspect a specific automation's workflow - Before update-automation, to see the current workflow
afterstringoptionalCursor for forward pagination (for list mode).beforestringoptionalCursor for backward pagination (for list mode).idstringoptionalAutomation ID or Resend dashboard URL (e.g. https://resend.com/automations/<id>). If omitted, lists all automations.limitnumberoptionalNumber of automations to retrieve (for list mode).statusstringoptionalFilter by status (for list mode only).resendmcp_get_automation_runs#**Purpose:** List runs for an automation, or get details of a specific run.
**Modes:**
- With `runId`: Returns detailed run info with step-by-step execution status, outputs, and errors.
- Without `runId`: Lists runs for the automation with optional status filter.
**When to use:**
- User wants to see if an automation is working
- User wants to debug a failed automation run
- User asks "why did this automation fail?" or "show me recent runs"
**Run statuses:** running, completed, failed, cancelled
**Step statuses:** pending, running, completed, failed, skipped, waiting6 params
**Purpose:** List runs for an automation, or get details of a specific run. **Modes:** - With `runId`: Returns detailed run info with step-by-step execution status, outputs, and errors. - Without `runId`: Lists runs for the automation with optional status filter. **When to use:** - User wants to see if an automation is working - User wants to debug a failed automation run - User asks "why did this automation fail?" or "show me recent runs" **Run statuses:** running, completed, failed, cancelled **Step statuses:** pending, running, completed, failed, skipped, waiting
automationIdstringrequiredThe automation ID or Resend dashboard URL (e.g. https://resend.com/automations/<id>)afterstringoptionalCursor for forward pagination (for list mode).beforestringoptionalCursor for backward pagination (for list mode).limitnumberoptionalNumber of runs to retrieve (for list mode).runIdstringoptionalSpecific run ID to get details for. If omitted, lists all runs.statusstringoptionalFilter runs by status (for list mode only).resendmcp_get_broadcast#Retrieve full details of a specific broadcast by ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>), including HTML and plain text content.1 param
Retrieve full details of a specific broadcast by ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>), including HTML and plain text content.
broadcastIdstringrequiredBroadcast ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>)resendmcp_get_contact#Get a contact by ID or email from Resend.2 params
Get a contact by ID or email from Resend.
emailstringoptionalContact email addressidstringoptionalContact IDresendmcp_get_contact_import#Get the status and counts of a contact import by ID. Use after create-contact-import to track progress (queued, in_progress, completed, failed).1 param
Get the status and counts of a contact import by ID. Use after create-contact-import to track progress (queued, in_progress, completed, failed).
idstringrequiredContact import IDresendmcp_get_contact_property#Get a contact property by ID from Resend.1 param
Get a contact property by ID from Resend.
contactPropertyIdstringrequiredContact property IDresendmcp_get_domain#Get a domain by ID from Resend. Returns full domain details including DNS records needed for verification.1 param
Get a domain by ID from Resend. Returns full domain details including DNS records needed for verification.
idstringrequiredDomain IDresendmcp_get_domain_claim#Retrieve the latest claim for a domain by its placeholder Domain ID (the domain_id from create-domain-claim). Returns claim status and the TXT record needed to prove ownership. Poll until status is "completed".1 param
Retrieve the latest claim for a domain by its placeholder Domain ID (the domain_id from create-domain-claim). Returns claim status and the TXT record needed to prove ownership. Poll until status is "completed".
idstringrequiredThe placeholder Domain ID created by the claimresendmcp_get_email#Retrieve full details of a specific sent transactional email by ID, including message_id, HTML and plain text content.1 param
Retrieve full details of a specific sent transactional email by ID, including message_id, HTML and plain text content.
idstringrequiredThe email ID to retrieveresendmcp_get_log#**Purpose:** Get detailed information about a specific API request log, including the full request and response bodies.
**Returns:** Log details: id, created_at, endpoint, method, response_status, user_agent, request_body, response_body.
**When to use:**
- User wants to inspect a specific API request
- Debugging a particular API call
- User says "show me that log", "what was in that request?"1 param
**Purpose:** Get detailed information about a specific API request log, including the full request and response bodies. **Returns:** Log details: id, created_at, endpoint, method, response_status, user_agent, request_body, response_body. **When to use:** - User wants to inspect a specific API request - Debugging a particular API call - User says "show me that log", "what was in that request?"
logIdstringrequiredThe Log ID to retrieveresendmcp_get_received_email#Retrieve full details of a specific received email by ID, including HTML and plain text content, headers, and raw email download URL.1 param
Retrieve full details of a specific received email by ID, including HTML and plain text content, headers, and raw email download URL.
idstringrequiredThe received email ID to retrieveresendmcp_get_received_email_attachment#Retrieve details of a specific attachment from a received email, including a time-limited download URL.2 params
Retrieve details of a specific attachment from a received email, including a time-limited download URL.
emailIdstringrequiredThe received email IDidstringrequiredThe attachment IDresendmcp_get_segment#Get a segment by ID from Resend.1 param
Get a segment by ID from Resend.
idstringrequiredSegment IDresendmcp_get_sent_email_attachment#Retrieve details of a specific attachment from a sent email, including a time-limited download URL.2 params
Retrieve details of a specific attachment from a sent email, including a time-limited download URL.
emailIdstringrequiredThe sent email IDidstringrequiredThe attachment IDresendmcp_get_suppression#Get a suppression list entry by ID or email address from Resend. Use this to check whether a specific address is suppressed and why (origin: bounce, complaint, or manual).1 param
Get a suppression list entry by ID or email address from Resend. Use this to check whether a specific address is suppressed and why (origin: bounce, complaint, or manual).
idOrEmailstringrequiredSuppression ID or email addressresendmcp_get_template#Get an email template by ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>) from Resend. Returns full template details including HTML content, variables, and publish status.1 param
Get an email template by ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>) from Resend. Returns full template details including HTML content, variables, and publish status.
idstringrequiredThe template ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>)resendmcp_get_tiptap_json_content#**Purpose:** Retrieve the existing TipTap JSON content of a broadcast or template, optionally bundled with the TipTap schema reference. Also connects the agent to the editor so the avatar is visible while content is being generated.
**When to use:**
- **Always call this before compose-broadcast or compose-template** to fetch the current document state — even if you expect it to be empty, the resource may have content set via the dashboard
- When the user asks to edit, tweak, or modify existing email content
- To inspect the current TipTap structure of a resource
**Returns:** The TipTap JSON content object for the resource, and optionally the TipTap schema. Use the content as the base for modifications, then pass the updated JSON to compose-broadcast or compose-template.
**Note:** This tool automatically connects the agent to the editor. The subsequent compose-broadcast or compose-template call will disconnect when done.
**Tip:** Set include_schema to true to get both the existing content and the schema in one call.3 params
**Purpose:** Retrieve the existing TipTap JSON content of a broadcast or template, optionally bundled with the TipTap schema reference. Also connects the agent to the editor so the avatar is visible while content is being generated. **When to use:** - **Always call this before compose-broadcast or compose-template** to fetch the current document state — even if you expect it to be empty, the resource may have content set via the dashboard - When the user asks to edit, tweak, or modify existing email content - To inspect the current TipTap structure of a resource **Returns:** The TipTap JSON content object for the resource, and optionally the TipTap schema. Use the content as the base for modifications, then pass the updated JSON to compose-broadcast or compose-template. **Note:** This tool automatically connects the agent to the editor. The subsequent compose-broadcast or compose-template call will disconnect when done. **Tip:** Set include_schema to true to get both the existing content and the schema in one call.
resource_idstringrequiredThe broadcast ID (UUID), template identifier (UUID or alias), or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id> or https://resend.com/templates/<id>)resource_typestringrequiredType of resource to fetch content forinclude_schemabooleanoptionalReturns the TipTap schema reference alongside the content. Required for producing valid TipTap JSON. Set to false only if you already have the schema.resendmcp_get_topic#Get a topic by ID from Resend.1 param
Get a topic by ID from Resend.
idstringrequiredTopic IDresendmcp_get_webhook#Get a webhook by ID from Resend.1 param
Get a webhook by ID from Resend.
webhookIdstringrequiredWebhook IDresendmcp_list_api_keys#List all API keys from Resend. Returns API key names, IDs, and creation dates. Don't bother telling the user the IDs or creation dates unless they ask for them.3 params
List all API keys from Resend. Returns API key names, IDs, and creation dates. Don't bother telling the user the IDs or creation dates unless they ask for them.
afterstringoptionalAPI key ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalAPI key ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of API keys to retrieve. Max: 100, Min: 1resendmcp_list_broadcasts#**Purpose:** List all broadcast campaigns (newsletters/bulk emails to audiences) with ID, name, audience, status, timestamps.
**NOT for:** Listing transactional emails (use list-emails). Not for listing segments or contacts (use list-segments, list-contacts).
**Returns:** For each broadcast: id, name, segment_id, status, created_at, scheduled_at, sent_at.
**When to use:** User asks "show my broadcasts", "what newsletters did I send?", "list campaigns". Use get-broadcast for full details of one.0 params
**Purpose:** List all broadcast campaigns (newsletters/bulk emails to audiences) with ID, name, audience, status, timestamps. **NOT for:** Listing transactional emails (use list-emails). Not for listing segments or contacts (use list-segments, list-contacts). **Returns:** For each broadcast: id, name, segment_id, status, created_at, scheduled_at, sent_at. **When to use:** User asks "show my broadcasts", "what newsletters did I send?", "list campaigns". Use get-broadcast for full details of one.
resendmcp_list_contact_imports#List contact imports from Resend. Optionally filter by status. Use to discover import IDs or review past imports.4 params
List contact imports from Resend. Optionally filter by status. Use to discover import IDs or review past imports.
afterstringoptionalContact import ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalContact import ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of contact imports to retrieve. Default: 10, Max: 100, Min: 1statusstringoptionalFilter imports by status.resendmcp_list_contact_properties#List all contact properties from Resend. This tool is useful for getting property IDs and seeing which custom attributes are configured. If you need a contact property ID, you MUST use this tool to get all available properties and then ask the user to select the one they want. Don't bother telling the user the IDs or creation dates unless they ask for them.3 params
List all contact properties from Resend. This tool is useful for getting property IDs and seeing which custom attributes are configured. If you need a contact property ID, you MUST use this tool to get all available properties and then ask the user to select the one they want. Don't bother telling the user the IDs or creation dates unless they ask for them.
afterstringoptionalContact property ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalContact property ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of contact properties to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_contact_segments#List all segments a contact belongs to in Resend (by contact ID or email). Don't bother telling the user the IDs or creation dates unless they ask for them.5 params
List all segments a contact belongs to in Resend (by contact ID or email). Don't bother telling the user the IDs or creation dates unless they ask for them.
afterstringoptionalSegment ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalSegment ID before which to retrieve more (for backward pagination). Cannot be used with "after".contactIdstringoptionalContact IDemailstringoptionalContact email addresslimitnumberoptionalNumber of segments to retrieve. Max: 100, Min: 1. If omitted, all segments are returned.resendmcp_list_contact_topics#List all topic subscriptions for a contact in Resend (by contact ID or email). Don't bother telling the user the IDs unless they ask for them.5 params
List all topic subscriptions for a contact in Resend (by contact ID or email). Don't bother telling the user the IDs unless they ask for them.
afterstringoptionalTopic ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalTopic ID before which to retrieve more (for backward pagination). Cannot be used with "after".emailstringoptionalContact email addressidstringoptionalContact IDlimitnumberoptionalNumber of topics to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_contacts#**Purpose:** List contacts from Resend. Optionally filter by segment. Use to discover contact IDs or emails.
**NOT for:** Listing segments (use list-segments). Not for listing sent emails (use list-emails) or broadcasts (use list-broadcasts).
**Returns:** For each contact: id, email, first_name, last_name, unsubscribed, created_at.
**When to use:** User asks "who's in this list?", "show contacts", "who did I add?" Don't bother telling the user the IDs, unsubscribe statuses, or creation dates unless they ask for them.4 params
**Purpose:** List contacts from Resend. Optionally filter by segment. Use to discover contact IDs or emails. **NOT for:** Listing segments (use list-segments). Not for listing sent emails (use list-emails) or broadcasts (use list-broadcasts). **Returns:** For each contact: id, email, first_name, last_name, unsubscribed, created_at. **When to use:** User asks "who's in this list?", "show contacts", "who did I add?" Don't bother telling the user the IDs, unsubscribe statuses, or creation dates unless they ask for them.
afterstringoptionalContact ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalContact ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of contacts to retrieve. Default: 20, Max: 100, Min: 1segmentIdstringoptionalSegment ID to filter by. If provided, only contacts in this segment will be returned.resendmcp_list_domains#List all domains from Resend. Returns domain names, statuses, regions, and capabilities. Don't bother telling the user the IDs unless they ask for them.3 params
List all domains from Resend. Returns domain names, statuses, regions, and capabilities. Don't bother telling the user the IDs unless they ask for them.
afterstringoptionalDomain ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalDomain ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of domains to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_emails#**Purpose:** List recently sent emails (transactional emails sent via send-email) with metadata: recipient, subject, status, timestamps.
**NOT for:** Listing broadcast campaigns (use list-broadcasts). Not for composing or sending.
**Returns:** Paginated list with to, subject, status, created_at, message_id, and ID per email.
**When to use:**
- User asks "what emails were sent?", "show recent emails", "did my email go out?"
- Checking delivery status of sent messages
- Finding an email ID to fetch full content (then use get-email)
**Workflow:** list-emails → get-email( id ) when user needs full body or details.3 params
**Purpose:** List recently sent emails (transactional emails sent via send-email) with metadata: recipient, subject, status, timestamps. **NOT for:** Listing broadcast campaigns (use list-broadcasts). Not for composing or sending. **Returns:** Paginated list with to, subject, status, created_at, message_id, and ID per email. **When to use:** - User asks "what emails were sent?", "show recent emails", "did my email go out?" - Checking delivery status of sent messages - Finding an email ID to fetch full content (then use get-email) **Workflow:** list-emails → get-email( id ) when user needs full body or details.
afterstringoptionalEmail ID after which to retrieve more emails (for forward pagination). Cannot be used with "before".beforestringoptionalEmail ID before which to retrieve more emails (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of emails to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_logs#**Purpose:** List API request logs for the account. Use to review recent API activity, debug issues, or audit API usage.
**Returns:** For each log: id, created_at, endpoint, method, response_status, user_agent. Use pagination (limit, after/before) for large lists.
**When to use:**
- User wants to see recent API activity
- Debugging API issues or checking request history
- User says "show my logs", "what API calls were made?", "check recent requests"3 params
**Purpose:** List API request logs for the account. Use to review recent API activity, debug issues, or audit API usage. **Returns:** For each log: id, created_at, endpoint, method, response_status, user_agent. Use pagination (limit, after/before) for large lists. **When to use:** - User wants to see recent API activity - Debugging API issues or checking request history - User says "show my logs", "what API calls were made?", "check recent requests"
afterstringoptionalLog ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalLog ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of logs to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_oauth_grants#List OAuth grants for the team — the apps authorized to act on the team's behalf. Returns every grant, active and revoked; a grant with a non-null revoked_at is no longer active. Each grant includes the client (app) name, scopes, and creation date. Don't bother telling the user the IDs unless they ask for them.3 params
List OAuth grants for the team — the apps authorized to act on the team's behalf. Returns every grant, active and revoked; a grant with a non-null revoked_at is no longer active. Each grant includes the client (app) name, scopes, and creation date. Don't bother telling the user the IDs unless they ask for them.
afterstringoptionalOAuth grant ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalOAuth grant ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of OAuth grants to retrieve. Max: 100, Min: 1resendmcp_list_received_email_attachments#List all attachments from a specific received (inbox) email. Returns attachment metadata including filename, size, content type, and a time-limited download URL. Use for emails listed by list-received-emails.4 params
List all attachments from a specific received (inbox) email. Returns attachment metadata including filename, size, content type, and a time-limited download URL. Use for emails listed by list-received-emails.
emailIdstringrequiredThe received email IDafterstringoptionalAttachment ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalAttachment ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of attachments to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_received_emails#**Purpose:** List emails received (inbox) by your Resend receiving address. Use for "show my inbox", "what emails did I get?", "list incoming mail".
**NOT for:** Listing emails you sent (use list-emails). Not for listing broadcasts (use list-broadcasts).
**Returns:** Paginated metadata: from, to, subject, message_id, received time. Use get-received-email with an ID for full content.3 params
**Purpose:** List emails received (inbox) by your Resend receiving address. Use for "show my inbox", "what emails did I get?", "list incoming mail". **NOT for:** Listing emails you sent (use list-emails). Not for listing broadcasts (use list-broadcasts). **Returns:** Paginated metadata: from, to, subject, message_id, received time. Use get-received-email with an ID for full content.
afterstringoptionalEmail ID after which to retrieve more emails (for forward pagination). Cannot be used with "before".beforestringoptionalEmail ID before which to retrieve more emails (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of emails to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_segments#**Purpose:** List all segments in the account. Use to get segment IDs required by create-contact, create-broadcast, list-contacts.
**NOT for:** Listing contacts inside a segment (use list-contacts with segmentId). Not for listing broadcasts (use list-broadcasts).
**Returns:** For each segment: name, id, created_at. Use pagination (limit, after/before) for large lists.
**When to use:** User says "show my segments", "what lists do I have?", or before create-contact/create-broadcast when segmentId is unknown.3 params
**Purpose:** List all segments in the account. Use to get segment IDs required by create-contact, create-broadcast, list-contacts. **NOT for:** Listing contacts inside a segment (use list-contacts with segmentId). Not for listing broadcasts (use list-broadcasts). **Returns:** For each segment: name, id, created_at. Use pagination (limit, after/before) for large lists. **When to use:** User says "show my segments", "what lists do I have?", or before create-contact/create-broadcast when segmentId is unknown.
afterstringoptionalSegment ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalSegment ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of segments to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_sent_email_attachments#List all attachments from a specific sent email (from send-email or list-emails). Returns attachment metadata including filename, size, content type, and a time-limited download URL.4 params
List all attachments from a specific sent email (from send-email or list-emails). Returns attachment metadata including filename, size, content type, and a time-limited download URL.
emailIdstringrequiredThe sent email IDafterstringoptionalAttachment ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalAttachment ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of attachments to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_suppressions#**Purpose:** List email addresses on the suppression list. Suppressed addresses never receive emails from the account. Optionally filter by origin: "bounce" (added automatically after a hard bounce), "complaint" (added automatically after a spam complaint), or "manual" (added via the API or dashboard).
**NOT for:** Checking a single address (use get-suppression). Not for listing contacts (use list-contacts).
**Returns:** For each suppression: email, id, origin, source_id (when present), created_at. Use pagination (limit, after/before) for large lists.
**When to use:** User says "show my suppression list", "who is suppressed?", or "why isn't this person receiving emails?" combined with a broad look at suppressed addresses.4 params
**Purpose:** List email addresses on the suppression list. Suppressed addresses never receive emails from the account. Optionally filter by origin: "bounce" (added automatically after a hard bounce), "complaint" (added automatically after a spam complaint), or "manual" (added via the API or dashboard). **NOT for:** Checking a single address (use get-suppression). Not for listing contacts (use list-contacts). **Returns:** For each suppression: email, id, origin, source_id (when present), created_at. Use pagination (limit, after/before) for large lists. **When to use:** User says "show my suppression list", "who is suppressed?", or "why isn't this person receiving emails?" combined with a broad look at suppressed addresses.
afterstringoptionalSuppression ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalSuppression ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of suppressions to retrieve. Default: 20, Max: 100, Min: 1originstringoptionalOnly return suppressions with this origin: "bounce", "complaint", or "manual".resendmcp_list_templates#List all email templates from Resend. Returns template names, statuses, and aliases. Don't bother telling the user the IDs unless they ask for them.3 params
List all email templates from Resend. Returns template names, statuses, and aliases. Don't bother telling the user the IDs unless they ask for them.
afterstringoptionalTemplate ID after which to retrieve more (for forward pagination). Cannot be used with "before".beforestringoptionalTemplate ID before which to retrieve more (for backward pagination). Cannot be used with "after".limitnumberoptionalNumber of templates to retrieve. Default: 20, Max: 100, Min: 1resendmcp_list_topics#List all topics from Resend. This tool is useful for getting topic IDs to use with other tools like send-email.0 params
List all topics from Resend. This tool is useful for getting topic IDs to use with other tools like send-email.
resendmcp_list_webhooks#List all webhooks from Resend. Use to get webhook IDs and see which endpoints and events are configured. Not for listing emails, segments, or broadcasts.0 params
List all webhooks from Resend. Use to get webhook IDs and see which endpoints and events are configured. Not for listing emails, segments, or broadcasts.
resendmcp_manage_events#**Purpose:** Create, list, get, update, or remove event definitions in Resend.
Events define named triggers that your application sends to start automations. Each event can have an optional schema that validates payload data.
**Actions:**
- `create`: Define a new event with a name and optional schema.
- `list`: List all event definitions (paginated).
- `get`: Get event details by ID or name.
- `update`: Update an event's schema.
- `remove`: Delete an event. You MUST confirm with the user before removing.
**Workflow:** manage-events (create) → create-automation → send-event
**Schema types:** string, number, boolean, date7 params
**Purpose:** Create, list, get, update, or remove event definitions in Resend. Events define named triggers that your application sends to start automations. Each event can have an optional schema that validates payload data. **Actions:** - `create`: Define a new event with a name and optional schema. - `list`: List all event definitions (paginated). - `get`: Get event details by ID or name. - `update`: Update an event's schema. - `remove`: Delete an event. You MUST confirm with the user before removing. **Workflow:** manage-events (create) → create-automation → send-event **Schema types:** string, number, boolean, date
actionstringrequiredThe operation to perform.afterstringoptionalCursor for forward pagination (for list).beforestringoptionalCursor for backward pagination (for list).identifierstringoptionalEvent ID or name (for get, update, remove).limitnumberoptionalNumber of events to retrieve (for list). Default: 20.namestringoptionalEvent name (for create). Use dot notation like "user.created". Cannot start with "resend:".schemastringoptionalEvent payload schema (for create, update). Maps field names to types. Pass null to remove the schema.resendmcp_publish_template#Publish an email template in Resend. Templates must be published before they can be used for sending emails. Re-publishing a previously published template makes the latest changes live. Accepts a template ID, alias, or Resend dashboard URL.1 param
Publish an email template in Resend. Templates must be published before they can be used for sending emails. Re-publishing a previously published template makes the latest changes live. Accepts a template ID, alias, or Resend dashboard URL.
idstringrequiredThe template ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>)resendmcp_remove_api_key#Remove an API key by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this API key. Reference the NAME of the API key when double-checking, and warn the user that removing an API key is irreversible and any services using it will lose access. You may only use this tool if the user explicitly confirms they want to remove the API key after you double-check.1 param
Remove an API key by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this API key. Reference the NAME of the API key when double-checking, and warn the user that removing an API key is irreversible and any services using it will lose access. You may only use this tool if the user explicitly confirms they want to remove the API key after you double-check.
idstringrequiredAPI key IDresendmcp_remove_automation#Remove an automation by ID or Resend dashboard URL. Before using this tool, you MUST double-check with the user that they want to remove this automation. Reference the NAME of the automation when confirming, and warn the user that removal is irreversible and will stop all future runs. You may only use this tool if the user explicitly confirms.1 param
Remove an automation by ID or Resend dashboard URL. Before using this tool, you MUST double-check with the user that they want to remove this automation. Reference the NAME of the automation when confirming, and warn the user that removal is irreversible and will stop all future runs. You may only use this tool if the user explicitly confirms.
idstringrequiredAutomation ID or Resend dashboard URL (e.g. https://resend.com/automations/<id>)resendmcp_remove_broadcast#Remove a broadcast by ID or Resend dashboard URL. Before using this tool, you MUST double-check with the user that they want to remove this broadcast. Reference the NAME of the broadcast when double-checking, and warn the user that removing a broadcast is irreversible. You may only use this tool if the user explicitly confirms they want to remove the broadcast after you double-check.1 param
Remove a broadcast by ID or Resend dashboard URL. Before using this tool, you MUST double-check with the user that they want to remove this broadcast. Reference the NAME of the broadcast when double-checking, and warn the user that removing a broadcast is irreversible. You may only use this tool if the user explicitly confirms they want to remove the broadcast after you double-check.
broadcastIdstringrequiredBroadcast ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>)resendmcp_remove_contact#Remove a contact from Resend (by ID or email). Before using this tool, you MUST double-check with the user that they want to remove this contact. Reference the contact's name (if present) and email address when double-checking, and warn the user that removing a contact is irreversible. You may only use this tool if the user explicitly confirms they want to remove the contact after you double-check.2 params
Remove a contact from Resend (by ID or email). Before using this tool, you MUST double-check with the user that they want to remove this contact. Reference the contact's name (if present) and email address when double-checking, and warn the user that removing a contact is irreversible. You may only use this tool if the user explicitly confirms they want to remove the contact after you double-check.
emailstringoptionalContact email addressidstringoptionalContact IDresendmcp_remove_contact_from_segment#Remove a contact from a segment in Resend (by contact ID or email). Before using this tool, you MUST double-check with the user that they want to remove the contact from the segment.3 params
Remove a contact from a segment in Resend (by contact ID or email). Before using this tool, you MUST double-check with the user that they want to remove the contact from the segment.
segmentIdstringrequiredSegment ID to remove the contact fromcontactIdstringoptionalContact IDemailstringoptionalContact email addressresendmcp_remove_contact_property#Remove a contact property by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this contact property. Reference the KEY of the property when double-checking, and warn the user that removing a contact property is irreversible and will remove the property from all contacts. You may only use this tool if the user explicitly confirms they want to remove the contact property after you double-check.1 param
Remove a contact property by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this contact property. Reference the KEY of the property when double-checking, and warn the user that removing a contact property is irreversible and will remove the property from all contacts. You may only use this tool if the user explicitly confirms they want to remove the contact property after you double-check.
contactPropertyIdstringrequiredContact property IDresendmcp_remove_domain#Remove a domain by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this domain. Reference the NAME of the domain when double-checking, and warn the user that removing a domain is irreversible and will stop all email sending/receiving for that domain. You may only use this tool if the user explicitly confirms they want to remove the domain after you double-check.1 param
Remove a domain by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this domain. Reference the NAME of the domain when double-checking, and warn the user that removing a domain is irreversible and will stop all email sending/receiving for that domain. You may only use this tool if the user explicitly confirms they want to remove the domain after you double-check.
idstringrequiredDomain IDresendmcp_remove_segment#Remove a segment by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this segment. Reference the NAME of the segment when double-checking, and warn the user that removing a segment is irreversible. You may only use this tool if the user explicitly confirms they want to remove the segment after you double-check.1 param
Remove a segment by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this segment. Reference the NAME of the segment when double-checking, and warn the user that removing a segment is irreversible. You may only use this tool if the user explicitly confirms they want to remove the segment after you double-check.
idstringrequiredSegment IDresendmcp_remove_suppression#Remove an entry by ID or email address from the suppression list in Resend, allowing the address to receive emails again. Before using this tool, you MUST double-check with the user that they want to remove this suppression. Reference the EMAIL ADDRESS when double-checking, and warn the user that the address will start receiving emails again — if it was suppressed due to a bounce or complaint, sending to it may hurt deliverability. You may only use this tool if the user explicitly confirms they want to remove the suppression after you double-check.1 param
Remove an entry by ID or email address from the suppression list in Resend, allowing the address to receive emails again. Before using this tool, you MUST double-check with the user that they want to remove this suppression. Reference the EMAIL ADDRESS when double-checking, and warn the user that the address will start receiving emails again — if it was suppressed due to a bounce or complaint, sending to it may hurt deliverability. You may only use this tool if the user explicitly confirms they want to remove the suppression after you double-check.
idOrEmailstringrequiredSuppression ID or email addressresendmcp_remove_template#Remove an email template by ID, alias, or Resend dashboard URL from Resend. Before using this tool, you MUST double-check with the user that they want to remove this template. Reference the NAME of the template when double-checking, and warn the user that removing a template is irreversible. You may only use this tool if the user explicitly confirms they want to remove the template after you double-check.1 param
Remove an email template by ID, alias, or Resend dashboard URL from Resend. Before using this tool, you MUST double-check with the user that they want to remove this template. Reference the NAME of the template when double-checking, and warn the user that removing a template is irreversible. You may only use this tool if the user explicitly confirms they want to remove the template after you double-check.
idstringrequiredThe template ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>)resendmcp_remove_topic#Remove a topic by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this topic. Reference the NAME of the topic when double-checking, and warn the user that removing a topic is irreversible. You may only use this tool if the user explicitly confirms they want to remove the topic after you double-check.1 param
Remove a topic by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this topic. Reference the NAME of the topic when double-checking, and warn the user that removing a topic is irreversible. You may only use this tool if the user explicitly confirms they want to remove the topic after you double-check.
idstringrequiredTopic IDresendmcp_remove_webhook#Remove a webhook by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this webhook. Reference the ENDPOINT of the webhook when double-checking, and warn the user that removing a webhook is irreversible. You may only use this tool if the user explicitly confirms they want to remove the webhook after you double-check.1 param
Remove a webhook by ID from Resend. Before using this tool, you MUST double-check with the user that they want to remove this webhook. Reference the ENDPOINT of the webhook when double-checking, and warn the user that removing a webhook is irreversible. You may only use this tool if the user explicitly confirms they want to remove the webhook after you double-check.
webhookIdstringrequiredWebhook IDresendmcp_revoke_oauth_grant#Revoke an OAuth grant by ID. Before using this tool, you MUST double-check with the user that they want to revoke this grant. Reference the NAME of the app (client) when double-checking, and warn the user that revocation is immediate and irreversible — every access and refresh token issued under the grant stops working, and the app would need to be re-authorized to regain access. You may only use this tool if the user explicitly confirms they want to revoke the grant after you double-check.1 param
Revoke an OAuth grant by ID. Before using this tool, you MUST double-check with the user that they want to revoke this grant. Reference the NAME of the app (client) when double-checking, and warn the user that revocation is immediate and irreversible — every access and refresh token issued under the grant stops working, and the app would need to be re-authorized to regain access. You may only use this tool if the user explicitly confirms they want to revoke the grant after you double-check.
idstringrequiredOAuth grant IDresendmcp_send_batch_emails#**Purpose:** Send up to 100 transactional emails in one API call. Each item has the same fields as send-email (to, subject, text, from, etc.).
**NOT for:** Sending one email (use send-email) or the same content to a segment (use create-broadcast + send-broadcast).
**When to use:** User wants to send many individual emails in bulk (e.g. 50 password resets, 100 receipts). Not for one-to-many broadcasts.2 params
**Purpose:** Send up to 100 transactional emails in one API call. Each item has the same fields as send-email (to, subject, text, from, etc.). **NOT for:** Sending one email (use send-email) or the same content to a segment (use create-broadcast + send-broadcast). **When to use:** User wants to send many individual emails in bulk (e.g. 50 password resets, 100 receipts). Not for one-to-many broadcasts.
emailsarrayrequiredArray of email objects to send (1-100 emails)idempotencyKeystringoptionalOptional unique key for the whole batch that prevents duplicate batch sends on retries (sent as the Idempotency-Key header). Use the same key when retrying the same batch; use a new key for a different batch. Max 256 characters.resendmcp_send_broadcast#**Purpose:** Send (or schedule) an existing broadcast by ID. The broadcast must have been created with create-broadcast first.
**NOT for:** Sending a new one-off email (use send-email). Not for creating the broadcast content (use create-broadcast).
**Returns:** Send confirmation and broadcast ID.
**When to use:**
- User has created a broadcast and says "send it", "go ahead and send", "schedule this for tomorrow"
- After create-broadcast; call send-broadcast with the returned ID to deliver to the audience
- Optional scheduledAt: natural language or ISO 8601 for scheduled send
**Workflow:** create-broadcast -> send-broadcast. Use list-broadcasts to find existing draft/sent broadcasts.2 params
**Purpose:** Send (or schedule) an existing broadcast by ID. The broadcast must have been created with create-broadcast first. **NOT for:** Sending a new one-off email (use send-email). Not for creating the broadcast content (use create-broadcast). **Returns:** Send confirmation and broadcast ID. **When to use:** - User has created a broadcast and says "send it", "go ahead and send", "schedule this for tomorrow" - After create-broadcast; call send-broadcast with the returned ID to deliver to the audience - Optional scheduledAt: natural language or ISO 8601 for scheduled send **Workflow:** create-broadcast -> send-broadcast. Use list-broadcasts to find existing draft/sent broadcasts.
broadcastIdstringrequiredBroadcast ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>)scheduledAtstringoptionalWhen to send the broadcast. Value may be in ISO 8601 format (e.g., 2024-08-05T11:52:01.858Z) or in natural language (e.g., "tomorrow at 10am", "in 2 hours", "next day at 9am PST", "Friday at 3pm ET"). If not provided, the broadcast will be sent immediately.resendmcp_send_email#**Purpose:** Send a single transactional email to one or more recipients immediately (or schedule it). Use for one-off messages, notifications, and direct replies.
**NOT for:** Sending the same email to a whole list/audience (use create-broadcast + send-broadcast). Not for managing contacts or audiences.
**Returns:** Send confirmation and email ID.
**When to use:**
- User wants to "send an email" to specific people (names or addresses)
- One-off messages: password reset, order confirmation, receipt, alert
- User says "email this to X", "notify them", "send a message to..."
- Scheduling a single email for later
**Workflow:** Get recipient(s) and content from user → send-email. Use list-emails or get-email to check delivery status afterward.
**Key trigger phrases:** "Send an email", "Email this to", "Notify", "Send a message", "Reply to them", "Schedule an email"14 params
**Purpose:** Send a single transactional email to one or more recipients immediately (or schedule it). Use for one-off messages, notifications, and direct replies. **NOT for:** Sending the same email to a whole list/audience (use create-broadcast + send-broadcast). Not for managing contacts or audiences. **Returns:** Send confirmation and email ID. **When to use:** - User wants to "send an email" to specific people (names or addresses) - One-off messages: password reset, order confirmation, receipt, alert - User says "email this to X", "notify them", "send a message to..." - Scheduling a single email for later **Workflow:** Get recipient(s) and content from user → send-email. Use list-emails or get-email to check delivery status afterward. **Key trigger phrases:** "Send an email", "Email this to", "Notify", "Send a message", "Reply to them", "Schedule an email"
fromstringrequiredSender email address (e.g. "onboarding@resend.com" or "Acme <onboarding@resend.com>"). You MUST ask the user for this parameter. Under no circumstance provide it yourselfsubjectstringrequiredEmail subject linetextstringrequiredPlain text email contenttoarrayrequiredArray of recipient email addresses (1-50 recipients)attachmentsarrayoptionalArray of file attachments. Each needs filename plus one of: url or content. Max 40MB total.bccarrayoptionalOptional array of BCC email addresses. You MUST ask the user for this parameter. Under no circumstance provide it yourselfccarrayoptionalOptional array of CC email addresses. You MUST ask the user for this parameter. Under no circumstance provide it yourselfheadersobjectoptionalOptional custom email headers as key/value pairs (e.g. {"List-Unsubscribe": "<https://example.com/unsubscribe>", "X-Entity-Ref-ID": "unique-id"}). Use for one-click unsubscribe, preventing Gmail threading, or other MIME headers Resend accepts.htmlstringoptionalHTML email content. When provided, the plain text argument MUST be provided as well.idempotencyKeystringoptionalOptional unique key that prevents duplicate sends on retries (sent as the Idempotency-Key header). Use the same key when retrying the same logical email; use a new key for a different email. Max 256 characters.replyToarrayoptionalOptional email addresses for the email readers to reply to (e.g. "support@example.com" or "Support Team <support@example.com>"). You MUST ask the user for this parameter. Under no circumstance provide it yourselfscheduledAtstringoptionalOptional parameter to schedule the email. This uses natural language. Examples would be 'tomorrow at 10am' or 'in 2 hours' or 'next day at 9am PST' or 'Friday at 3pm ET'.tagsarrayoptionalArray of custom tags for tracking/analytics. Each tag has a name and value.topicIdstringoptionalTopic ID for subscription-based sending. When set, the email respects contact subscription preferences for this topic.resendmcp_send_event#**Purpose:** Fire an event to trigger automations for a specific contact.
**When to use:**
- User wants to trigger an automation workflow for a contact
- Testing an automation by sending a test event
**Workflow:** create-event (if needed) → create-automation (if needed) → send-event
**Important:**
- The event name must match the trigger event name in an automation for it to fire.
- Identify the contact by either contactId OR email, not both.
- The payload is optional and can contain any key-value data that the automation steps can reference via event.* variables.4 params
**Purpose:** Fire an event to trigger automations for a specific contact. **When to use:** - User wants to trigger an automation workflow for a contact - Testing an automation by sending a test event **Workflow:** create-event (if needed) → create-automation (if needed) → send-event **Important:** - The event name must match the trigger event name in an automation for it to fire. - Identify the contact by either contactId OR email, not both. - The payload is optional and can contain any key-value data that the automation steps can reference via event.* variables.
eventstringrequiredThe event name (e.g., "user.created", "payment.failed")contactIdstringoptionalThe contact ID to associate with the event. Use either contactId or email, not both.emailstringoptionalThe contact email to associate with the event. Use either contactId or email, not both.payloadobjectoptionalOptional key-value data passed to the automation. Accessible in steps via event.* variables.resendmcp_update_api_key#Rename an existing API key in Resend. Only the name can be changed — permission and domain restrictions are fixed at creation and cannot be updated.2 params
Rename an existing API key in Resend. Only the name can be changed — permission and domain restrictions are fixed at creation and cannot be updated.
idstringrequiredAPI key IDnamestringrequiredNew API key nameresendmcp_update_automation#**Purpose:** Update an automation's name, status, or workflow.
**When to use:**
- User wants to rename an automation
- User wants to enable or disable an automation (use status: "disabled" to stop it)
- User wants to modify the workflow steps
**Important:**
- To disable/stop an automation, set status to "disabled". Existing runs will continue to completion.
- When updating the workflow, provide the complete new workflow — it replaces the existing one.
- Use get-automation first to see the current workflow before making changes.
The workflow is a JSON object with one key: "steps" — an array of step objects.
Each step has: key (unique string), type, config, and either "next" (string|null) or "branches" (for branching steps).
Use keys like: "trigger", "send_email_1", "delay_1", "condition_1", "wait_event_1".
## Step types
### trigger — starts the automation when an event fires (required, exactly one)
config: { "eventName": "<event_name>" }
Uses "next".
### send_email — send an email using a published template
config: { "template": { "id": "<template_id>", "variables": { "<key>": "<value>" } }, "from": "Name <sender@example.com>", "subject": "Email subject", "replyTo": "<address>" }
**"from" and "subject" are resolved from the step config first, then fall back to the template.** If neither provides a "from", the email will silently fail to send. If neither provides a "subject", the run will error. Best practice: always set "from" and "subject" on the step config so the automation is self-contained. Use list-domains to find verified domains for "from". "replyTo" and "variables" are optional. Variables can use { "var": "event.<field>" } or { "var": "contact.<field>" } for dynamic values.
Uses "next".
### delay — pause the workflow
config: { "duration": "<human-readable>" }
Examples: "30 minutes", "1 hour", "2 days", "1 week". Max 30 days.
Uses "next".
### condition — conditional split based on contact or event data
config: A condition rule object:
Single rule: { "type": "rule", "field": "event.<field>" or "contact.<field>", "operator": "<op>", "value": <value> }
Compound: { "type": "and"|"or", "rules": [<rule>, ...] }
Operators: eq, neq, gt, gte, lt, lte, contains, starts_with, ends_with, exists, is_empty.
exists/is_empty do not require a value.
Uses "branches": { "condition_met": "<step_key>", "condition_not_met": "<step_key_or_null>" }
### wait_for_event — pause until a specific event arrives or timeout
config: { "eventName": "<event_name>", "timeout": "<human-readable>", "filterRule": <optional condition rule> }
For email lifecycle events use "resend:email.<opened|clicked|bounced|delivered|complained|failed|suppressed>".
Uses "branches": { "event_received": "<step_key>", "timeout": "<step_key_or_null>" }
### contact_update — update contact fields
config: { "firstName": "<value>", "lastName": "<value>", "unsubscribed": true|false, "properties": { "<key>": "<value>" } }
All fields optional. Values can use { "var": "event.<field>" } for dynamic data.
Uses "next".
### contact_delete — remove the contact from the audience
config: {}
Uses "next".
### add_to_segment — add contact to a segment
config: { "segmentId": "<segment_id>" }
Uses "next".
## Rules
1. Every step must be reachable from the trigger via next/branches.
2. Terminal steps have "next": null (or null branch values).
3. The workflow must be tree-shaped — no merging branches back together.
## Example: Linear drip campaign
{
"steps": [
{ "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" },
{ "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_123" }, "from": "Welcome <hello@example.com>", "subject": "Welcome!" }, "next": "delay_1" },
{ "key": "delay_1", "type": "delay", "config": { "duration": "3 days" }, "next": "send_email_2" },
{ "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_456" }, "from": "Welcome <hello@example.com>", "subject": "Getting started" }, "next": null }
]
}
## Example: Re-engagement with wait_for_event
{
"steps": [
{ "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" },
{ "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_789" }, "from": "Team <team@example.com>", "subject": "Welcome" }, "next": "wait_event_1" },
{ "key": "wait_event_1", "type": "wait_for_event", "config": { "eventName": "resend:email.opened", "timeout": "3 days" }, "branches": { "event_received": null, "timeout": "send_email_2" } },
{ "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_abc" }, "from": "Team <team@example.com>", "subject": "Did you miss this?" }, "next": null }
]
}
## Example: Condition branch
{
"steps": [
{ "key": "trigger", "type": "trigger", "config": { "eventName": "trial.ended" }, "next": "condition_1" },
{ "key": "condition_1", "type": "condition", "config": { "type": "rule", "field": "event.converted", "operator": "eq", "value": true }, "branches": { "condition_met": "send_email_1", "condition_not_met": "send_email_2" } },
{ "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_thanks" }, "from": "Team <team@example.com>", "subject": "Thanks for upgrading!" }, "next": null },
{ "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_win_back" }, "from": "Team <team@example.com>", "subject": "We'd love to have you back" }, "next": null }
]
}4 params
**Purpose:** Update an automation's name, status, or workflow. **When to use:** - User wants to rename an automation - User wants to enable or disable an automation (use status: "disabled" to stop it) - User wants to modify the workflow steps **Important:** - To disable/stop an automation, set status to "disabled". Existing runs will continue to completion. - When updating the workflow, provide the complete new workflow — it replaces the existing one. - Use get-automation first to see the current workflow before making changes. The workflow is a JSON object with one key: "steps" — an array of step objects. Each step has: key (unique string), type, config, and either "next" (string|null) or "branches" (for branching steps). Use keys like: "trigger", "send_email_1", "delay_1", "condition_1", "wait_event_1". ## Step types ### trigger — starts the automation when an event fires (required, exactly one) config: { "eventName": "<event_name>" } Uses "next". ### send_email — send an email using a published template config: { "template": { "id": "<template_id>", "variables": { "<key>": "<value>" } }, "from": "Name <sender@example.com>", "subject": "Email subject", "replyTo": "<address>" } **"from" and "subject" are resolved from the step config first, then fall back to the template.** If neither provides a "from", the email will silently fail to send. If neither provides a "subject", the run will error. Best practice: always set "from" and "subject" on the step config so the automation is self-contained. Use list-domains to find verified domains for "from". "replyTo" and "variables" are optional. Variables can use { "var": "event.<field>" } or { "var": "contact.<field>" } for dynamic values. Uses "next". ### delay — pause the workflow config: { "duration": "<human-readable>" } Examples: "30 minutes", "1 hour", "2 days", "1 week". Max 30 days. Uses "next". ### condition — conditional split based on contact or event data config: A condition rule object: Single rule: { "type": "rule", "field": "event.<field>" or "contact.<field>", "operator": "<op>", "value": <value> } Compound: { "type": "and"|"or", "rules": [<rule>, ...] } Operators: eq, neq, gt, gte, lt, lte, contains, starts_with, ends_with, exists, is_empty. exists/is_empty do not require a value. Uses "branches": { "condition_met": "<step_key>", "condition_not_met": "<step_key_or_null>" } ### wait_for_event — pause until a specific event arrives or timeout config: { "eventName": "<event_name>", "timeout": "<human-readable>", "filterRule": <optional condition rule> } For email lifecycle events use "resend:email.<opened|clicked|bounced|delivered|complained|failed|suppressed>". Uses "branches": { "event_received": "<step_key>", "timeout": "<step_key_or_null>" } ### contact_update — update contact fields config: { "firstName": "<value>", "lastName": "<value>", "unsubscribed": true|false, "properties": { "<key>": "<value>" } } All fields optional. Values can use { "var": "event.<field>" } for dynamic data. Uses "next". ### contact_delete — remove the contact from the audience config: {} Uses "next". ### add_to_segment — add contact to a segment config: { "segmentId": "<segment_id>" } Uses "next". ## Rules 1. Every step must be reachable from the trigger via next/branches. 2. Terminal steps have "next": null (or null branch values). 3. The workflow must be tree-shaped — no merging branches back together. ## Example: Linear drip campaign { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_123" }, "from": "Welcome <hello@example.com>", "subject": "Welcome!" }, "next": "delay_1" }, { "key": "delay_1", "type": "delay", "config": { "duration": "3 days" }, "next": "send_email_2" }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_456" }, "from": "Welcome <hello@example.com>", "subject": "Getting started" }, "next": null } ] } ## Example: Re-engagement with wait_for_event { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_789" }, "from": "Team <team@example.com>", "subject": "Welcome" }, "next": "wait_event_1" }, { "key": "wait_event_1", "type": "wait_for_event", "config": { "eventName": "resend:email.opened", "timeout": "3 days" }, "branches": { "event_received": null, "timeout": "send_email_2" } }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_abc" }, "from": "Team <team@example.com>", "subject": "Did you miss this?" }, "next": null } ] } ## Example: Condition branch { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "trial.ended" }, "next": "condition_1" }, { "key": "condition_1", "type": "condition", "config": { "type": "rule", "field": "event.converted", "operator": "eq", "value": true }, "branches": { "condition_met": "send_email_1", "condition_not_met": "send_email_2" } }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_thanks" }, "from": "Team <team@example.com>", "subject": "Thanks for upgrading!" }, "next": null }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_win_back" }, "from": "Team <team@example.com>", "subject": "We'd love to have you back" }, "next": null } ] }
idstringrequiredAutomation ID or Resend dashboard URL (e.g. https://resend.com/automations/<id>)namestringoptionalNew name for the automation.statusstringoptionalNew status. Use "disabled" to stop the automation (prevents new runs).workflowobjectoptionalNew workflow definition. Replaces the existing workflow entirely.resendmcp_update_broadcast#Update broadcast metadata by ID or Resend dashboard URL (name, subject, from, html, text, segment, preview text, reply-to). To edit TipTap content, use compose-broadcast instead.
**Important:** The API requires `from` and `segmentId` to be set on the broadcast. If the broadcast was created from the dashboard, these may be empty. Always call get-broadcast first to check, and include `from` and `segmentId` in your update if they are not already set. Use list-domains to find verified domains for the from address, and list-segments to find segment IDs.
**Note on html/text fields:** Setting html or text via this tool replaces any content previously set via compose-broadcast. This switch is lossy — some content or formatting may be lost. Prefer compose-broadcast for content changes. If the broadcast was composed with TipTap content, ask the user before overwriting it with raw HTML.9 params
Update broadcast metadata by ID or Resend dashboard URL (name, subject, from, html, text, segment, preview text, reply-to). To edit TipTap content, use compose-broadcast instead. **Important:** The API requires `from` and `segmentId` to be set on the broadcast. If the broadcast was created from the dashboard, these may be empty. Always call get-broadcast first to check, and include `from` and `segmentId` in your update if they are not already set. Use list-domains to find verified domains for the from address, and list-segments to find segment IDs. **Note on html/text fields:** Setting html or text via this tool replaces any content previously set via compose-broadcast. This switch is lossy — some content or formatting may be lost. Prefer compose-broadcast for content changes. If the broadcast was composed with TipTap content, ask the user before overwriting it with raw HTML.
broadcastIdstringrequiredBroadcast ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>)fromstringoptionalFrom email address (e.g. "onboarding@resend.com" or "Resend <onboarding@resend.com>")htmlstringoptionalHTML content of the email.
Email HTML requirements — follow all of these without exception:
STRUCTURE
- Always include <!DOCTYPE html>, <html>, <head>, <body>
- Layout must be table-based: <table>, <tr>, <td> — never use <div> for layout
- Outer wrapper table at width="100%", inner content table at max 600px wide
- Every table must have cellpadding="0" cellspacing="0" border="0"
CSS
- All styles must be inline (style="...") — no <style> tag, no external stylesheets
- No flexbox, no grid, no CSS variables, no CSS shorthand (use padding-top not padding)
- font-family must always include web-safe fallbacks (Arial, Helvetica, Georgia, sans-serif)
- Always set font-size, line-height, and color explicitly on every text element
IMAGES
- Always set width, height, border="0", display:block on every <img>
- Use absolute URLs only — no relative paths
- Always include alt text
LINKS & BUTTONS
- Never use <button> — use <a> styled as a button inside a <td>
- No <video>, <form>, or <input> elements
- No JavaScript of any kind
OUTLOOK COMPATIBILITY
- Use bgcolor attribute on <td> alongside CSS background-color
- No CSS background-image (poor Outlook support)
- Add <!--[if mso]> conditionals where needed for Outlook rendering
META (in <head>)
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">namestringoptionalName for the broadcastpreviewTextstringoptionalPreview text for the emailreplyToarrayoptionalReply-to email address(es)segmentIdstringoptionalSegment ID to send tosubjectstringoptionalEmail subjecttextstringoptionalPlain text content of the emailresendmcp_update_contact#Update a contact in Resend (by ID or email).6 params
Update a contact in Resend (by ID or email).
emailstringoptionalContact email addressfirstNamestringoptionalContact first name. Pass `null` to remove the contact's first name.idstringoptionalContact IDlastNamestringoptionalContact last name. Pass `null` to remove the contact's last name.propertiesobjectoptionalCustom property key-value pairs to update (e.g. { "company_name": "Acme" })unsubscribedbooleanoptionalWhether the contact is unsubscribed from all broadcastsresendmcp_update_contact_property#Update an existing contact property in Resend. Only the fallback value can be changed — the key and type cannot be modified after creation.2 params
Update an existing contact property in Resend. Only the fallback value can be changed — the key and type cannot be modified after creation.
contactPropertyIdstringrequiredContact property IDfallbackValuestringrequiredNew default value for the property. Pass null to remove the fallback value. Must match the property type.resendmcp_update_contact_topics#Update topic subscriptions for a contact in Resend (by contact ID or email).3 params
Update topic subscriptions for a contact in Resend (by contact ID or email).
topicsarrayrequiredArray of topic subscription configurations to updateemailstringoptionalContact email addressidstringoptionalContact IDresendmcp_update_domain#Update an existing domain in Resend. Allows changing tracking settings, TLS mode, and capabilities.6 params
Update an existing domain in Resend. Allows changing tracking settings, TLS mode, and capabilities.
idstringrequiredDomain IDcapabilitiesobjectoptionalDomain capabilities. At least one capability must remain enabled.clickTrackingbooleanoptionalTrack clicks within the body of each HTML email.openTrackingbooleanoptionalTrack the open rate of each email.tlsstringoptionalTLS mode. "opportunistic" attempts secure connection with fallback. "enforced" requires TLS or fails.trackingSubdomainstringoptionalCustom subdomain for tracking links (e.g., "track" for track.example.com). When set, click and open tracking URLs will use this subdomain instead of the default.resendmcp_update_email#Reschedule a scheduled email by updating its scheduled send time. Only works for emails that were scheduled and have not yet been sent.2 params
Reschedule a scheduled email by updating its scheduled send time. Only works for emails that were scheduled and have not yet been sent.
idstringrequiredThe ID of the scheduled email to updatescheduledAtstringrequiredThe new scheduled time in ISO 8601 format (e.g., "2024-08-05T11:52:01.858Z").resendmcp_update_template#Update template metadata by ID, alias, or Resend dashboard URL (name, subject, from, html, variables, etc.). After updating a published template, use publish-template again to make the changes live. To edit TipTap content, use compose-template instead.
**Note on html/text fields:** Setting html or text via this tool replaces any content previously set via compose-template. This switch is lossy — some content or formatting may be lost. Prefer compose-template for content changes. If the template was composed with TipTap content, ask the user before overwriting it with raw HTML.9 params
Update template metadata by ID, alias, or Resend dashboard URL (name, subject, from, html, variables, etc.). After updating a published template, use publish-template again to make the changes live. To edit TipTap content, use compose-template instead. **Note on html/text fields:** Setting html or text via this tool replaces any content previously set via compose-template. This switch is lossy — some content or formatting may be lost. Prefer compose-template for content changes. If the template was composed with TipTap content, ask the user before overwriting it with raw HTML.
idstringrequiredThe template ID, alias, or Resend dashboard URL (e.g. https://resend.com/templates/<id>)aliasstringoptionalNew alias for the template.fromstringoptionalNew sender email address.htmlstringoptionalNew HTML content for the template.
Email HTML requirements — follow all of these without exception:
STRUCTURE
- Always include <!DOCTYPE html>, <html>, <head>, <body>
- Layout must be table-based: <table>, <tr>, <td> — never use <div> for layout
- Outer wrapper table at width="100%", inner content table at max 600px wide
- Every table must have cellpadding="0" cellspacing="0" border="0"
CSS
- All styles must be inline (style="...") — no <style> tag, no external stylesheets
- No flexbox, no grid, no CSS variables, no CSS shorthand (use padding-top not padding)
- font-family must always include web-safe fallbacks (Arial, Helvetica, Georgia, sans-serif)
- Always set font-size, line-height, and color explicitly on every text element
IMAGES
- Always set width, height, border="0", display:block on every <img>
- Use absolute URLs only — no relative paths
- Always include alt text
LINKS & BUTTONS
- Never use <button> — use <a> styled as a button inside a <td>
- No <video>, <form>, or <input> elements
- No JavaScript of any kind
OUTLOOK COMPATIBILITY
- Use bgcolor attribute on <td> alongside CSS background-color
- No CSS background-image (poor Outlook support)
- Add <!--[if mso]> conditionals where needed for Outlook rendering
META (in <head>)
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">namestringoptionalNew name for the template.replyTostringoptionalNew Reply-to email address(es).subjectstringoptionalNew default email subject.textstringoptionalNew plain text version of the message.variablesarrayoptionalNew array of template variables (replaces existing variables).resendmcp_update_topic#Update an existing topic in Resend. Note: defaultSubscription cannot be modified after creation.3 params
Update an existing topic in Resend. Note: defaultSubscription cannot be modified after creation.
idstringrequiredTopic IDdescriptionstringoptionalNew topic description (max 200 characters)namestringoptionalNew topic name (max 50 characters)resendmcp_update_webhook#Update an existing webhook in Resend. You can change the endpoint URL, subscribed events, or enable/disable the webhook.4 params
Update an existing webhook in Resend. You can change the endpoint URL, subscribed events, or enable/disable the webhook.
webhookIdstringrequiredWebhook IDendpointstringoptionalNew URL where webhook events will be senteventsarrayoptionalNew array of event types to subscribe tostatusstringoptionalWebhook statusresendmcp_verify_domain#Trigger domain verification in Resend. This starts an asynchronous verification process that checks if the DNS records are correctly configured. The domain status will temporarily show as "pending" during verification.1 param
Trigger domain verification in Resend. This starts an asynchronous verification process that checks if the DNS records are correctly configured. The domain status will temporarily show as "pending" during verification.
idstringrequiredDomain IDresendmcp_verify_domain_claim#Trigger asynchronous DNS verification and ownership transfer for a domain claim, using the placeholder Domain ID. The claim stays "pending" while verification runs; poll get-domain-claim for status. Once "completed", the transferred domain has NEW DKIM records — fetch them with get-domain, add them to DNS, then run verify-domain.1 param
Trigger asynchronous DNS verification and ownership transfer for a domain claim, using the placeholder Domain ID. The claim stays "pending" while verification runs; poll get-domain-claim for status. Once "completed", the transferred domain has NEW DKIM records — fetch them with get-domain, add them to DNS, then run verify-domain.
idstringrequiredThe placeholder Domain ID created by the claim