Skip to main content
Glama
Email Sending MCP

Email Sending MCP

by resend

Update Inbox Draft

update-inbox-draft

Update a Resend inbox draft's recipients, subject, body, or attachments before sending; changes are saved to the draft and no email is sent.

Instructions

Purpose: Update a draft in a Resend inbox: change its recipients, its subject, its body, or its attachments. At least one of to, cc, bcc, subject, text, html, or attachments is required. This still sends nothing: the draft only goes out when send-inbox-draft is called.

NOT for: Changing which thread or message a draft replies to. Those are fixed when the draft is created. Not for editing a message already sent: sent mail cannot be changed.

Returns: The draft's id. Use get-inbox-draft to read the draft after the update.

When to use: User asks to change, rewrite, or fix a draft before it is sent. Omitting a field leaves it as it was; passing null for a field clears it. The draft must keep at least one non-empty field, so clearing the last one with null returns a 422. For attachments, an empty array also removes them all. Passing text or html replaces the whole body: the body part you leave out of that call becomes empty. Get the draft ID from list-inbox-drafts.

Input Schema

NameRequiredDescriptionDefault
ccNoNew email address to copy, or an array of addresses, replacing the draft's current ones. Pass null to clear the cc list; omit to leave it untouched. Across to, cc, and bcc a draft can carry at most 50 recipients in total.
toNoNew recipient email address, or an array of addresses, replacing the draft's current ones. Pass null to clear the recipients; omit to leave them untouched. Across to, cc, and bcc a draft can carry at most 50 recipients in total.
bccNoNew email address to blind-copy, or an array of addresses, replacing the draft's current ones. Pass null to clear the bcc list; omit to leave it untouched. Across to, cc, and bcc a draft can carry at most 50 recipients in total.
htmlNoNew HTML body for the draft. Pass null to clear the HTML body; omit to leave it untouched.
textNoNew plain text body for the draft. Pass null to clear the plain text body; omit to leave it untouched.
draftIdYesDraft ID. Use list-inbox-drafts to find draft IDs.
inboxIdYesInbox ID, or the inbox email address (e.g. "support@example.com"). Not the Resend receiving address.
subjectNo
attachmentsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv2.28.0
    • changedInput schema / properties / attachments / anyOf
      Previous value: -[
      -  {
      -    "description": "Files to store on the draft. Each one needs filename, base64 content and contentType; a draft cannot attach a file by URL. Together they can total at most 25 MB. An empty file or a blocked file type (such as .exe) is rejected. Passing attachments replaces every file on the draft; pass null or an empty array to remove them all, or omit to keep them.",
      -    "items": {
      -      "properties": {
      -        "content": {
      -          "description": "Base64-encoded file content.",
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "contentType": {
      -          "description": "MIME type of the file (e.g. \"application/pdf\").",
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "filename": {
      -          "description": "Name of the file with extension (e.g. \"quote.pdf\").",
      -          "minLength": 1,
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "filename",
      -        "content",
      -        "contentType"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Files to store on the draft. Each attachment needs `filename` plus either `content` (base64, with `contentType`) or `url` (an http(s) URL Resend downloads; `contentType` defaults to the downloaded file's type). Together they can total at most 25 MB, downloads included, and all downloads together must finish within 20 seconds. An empty file or a blocked file type (such as .exe) is rejected. Passing attachments replaces every file on the draft; pass null or an empty array to remove them all, or omit to keep them.",
      +    "items": {
      +      "properties": {
      +        "content": {
      +          "description": "Base64-encoded file content. Requires contentType. Provide content or url, not both.",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "contentType": {
      +          "description": "MIME type of the file (e.g. \"application/pdf\"). Required with content; with url, defaults to the downloaded file's type.",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "filename": {
      +          "description": "Name of the file with extension (e.g. \"quote.pdf\").",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "url": {
      +          "description": "URL where the file is hosted. Resend downloads it when the draft is saved, so a URL Resend cannot download fails this call. It must start with http:// or https:// and cannot start with http://localhost:. Provide content or url, not both.",
      +          "format": "uri",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "filename"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed2 schema fields changedv2.27.1
    • changedInput schema / properties / attachments / anyOf
      Previous value: -[
      -  {
      -    "description": "Files to store on the draft. Each one needs filename, base64 content and contentType; a draft cannot attach a file by URL. There is no limit on the number of files, but together they can total at most 25 MB. An empty file or a blocked file type (such as .exe) is rejected. Passing attachments replaces every file on the draft; pass null or an empty array to remove them all, or omit to keep them.",
      -    "items": {
      -      "properties": {
      -        "content": {
      -          "description": "Base64-encoded file content.",
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "contentType": {
      -          "description": "MIME type of the file (e.g. \"application/pdf\").",
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "filename": {
      -          "description": "Name of the file with extension (e.g. \"quote.pdf\").",
      -          "minLength": 1,
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "filename",
      -        "content",
      -        "contentType"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Files to store on the draft. Each one needs filename, base64 content and contentType; a draft cannot attach a file by URL. Together they can total at most 25 MB. An empty file or a blocked file type (such as .exe) is rejected. Passing attachments replaces every file on the draft; pass null or an empty array to remove them all, or omit to keep them.",
      +    "items": {
      +      "properties": {
      +        "content": {
      +          "description": "Base64-encoded file content.",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "contentType": {
      +          "description": "MIME type of the file (e.g. \"application/pdf\").",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "filename": {
      +          "description": "Name of the file with extension (e.g. \"quote.pdf\").",
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "filename",
      +        "content",
      +        "contentType"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / inboxId / description
      Previous value: -"Inbox ID"New value: +"Inbox ID, or the inbox email address (e.g. \"support@example.com\"). Not the Resend receiving address."
  3. Addedv2.26.1

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only saying it is a non-read-only, non-open-world mutation, the description carries real behavioral weight: it states that nothing is sent, that clearing the last non-empty field returns a 422, that empty attachment arrays delete all files, and that supplying text or html blanks the counterpart body part. These are non-obvious side effects an agent could not infer from the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Bold section headers (Purpose / NOT for / Returns / When to use) front-load the essentials and no sentence is filler, though the null-vs-omit rule is restated rather than stated once, and the block is longer than the tool's complexity strictly requires.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation with no output schema, the description covers return value (the draft's id), validation failure mode (422 on emptying the draft), body-replacement semantics, and where to obtain the draft ID. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (78%) and each parameter already documents null-vs-omit, so much of the description's parameter prose is redundant. It does add genuinely schema-absent cross-parameter rules: at least one of the listed fields is required, and passing text or html replaces the whole body so the omitted part becomes empty.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Update a draft in a Resend inbox') and enumerates exactly which fields can change (recipients, subject, body, attachments). It also distinguishes itself from close siblings by naming send-inbox-draft and get-inbox-draft, so an agent can route without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit 'When to use' trigger (user asks to change/rewrite/fix a draft before sending) and an explicit 'NOT for' section covering thread/message reassignment and already-sent mail. It also names prerequisites and routing siblings: get the ID from list-inbox-drafts, verify with get-inbox-draft, and send with send-inbox-draft.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools