Skip to main content
Glama

Send email

send_email
DestructiveIdempotent

Compose and deliver emails from a connected mailbox in direct, draft, or reply mode; schedule delivery and use idempotency keys to avoid duplicate sends on retries.

Instructions

Send an email from a connected mailbox. There are three modes: direct (to, subject and body), an existing draft (draftId), or a reply (replyToMessageId, optionally with replyAll) that takes its recipients, subject and threading from the original. Repeating a successful send with the same idempotencyKey and arguments returns the saved result instead of sending again. Reusing a key with different arguments, or after a failed or uncertain send, returns an error. Confirm with the user when the intent is ambiguous. Add sendAt to any mode to schedule the message instead of sending it now.

Input Schema

NameRequiredDescriptionDefault
ccNoRecipients, each "Name <a@x.com>" or "a@x.com"
toNoRecipients, each "Name <a@x.com>" or "a@x.com"
bccNoRecipients, each "Name <a@x.com>" or "a@x.com"
fromNoConnected address or an available send-as address
sendAtNoSchedule delivery instead of sending now: ISO 8601 with timezone offset or Z (e.g. 2026-07-11T09:00:00-07:00). Fluxmail saves the message as a real draft in the mailbox for delivery by fluxmail serve or fluxmail scheduled run using the same store. Stdio does not deliver schedules. Overdue mail may send when a worker starts. Returns a scheduleId for list/cancel.
draftIdNoSend this existing draft
subjectNoDefaults to "Re: ..." when replying
bodyHtmlNoHTML body
bodyTextNoPlain-text body. Line breaks appear in the sent email. Keep each prose paragraph on one continuous line and separate paragraphs with blank lines.
replyAllNoWith replyToMessageId: reply to all original recipients
accountIdNoAccount to operate on. Optional when exactly one account is connected.
attachmentsNo
idempotencyKeyYesReuse this key when retrying the same delivery
replyToMessageIdNoMessage being replied to; threads correctly and computes recipients if "to" is omitted

Output Schema

NameRequiredDescriptionDefault
dataYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv0.19.0
    • changedInput schema / properties / accountId / anyOf
      Previous value: -[
      -  {
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 512,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / attachments / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "content": {
      -          "description": "base64",
      -          "type": "string"
      -        },
      -        "contentId": {
      -          "description": "Content-ID for an inline image, referenced from bodyHtml as cid:<contentId>",
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "disposition": {
      -          "description": "Defaults to attachment",
      -          "enum": [
      -            "inline",
      -            "attachment"
      -          ],
      -          "type": "string"
      -        },
      -        "filename": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "mimeType": {
      -          "minLength": 1,
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "filename",
      -        "mimeType",
      -        "content"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "content": {
      +          "description": "base64",
      +          "type": "string"
      +        },
      +        "contentId": {
      +          "description": "Content-ID for an inline image, referenced from bodyHtml as cid:<contentId>",
      +          "maxLength": 255,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "disposition": {
      +          "description": "Defaults to attachment",
      +          "enum": [
      +            "inline",
      +            "attachment"
      +          ],
      +          "type": "string"
      +        },
      +        "filename": {
      +          "maxLength": 255,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "mimeType": {
      +          "maxLength": 255,
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "filename",
      +        "mimeType",
      +        "content"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / bcc / anyOf
      Previous value: -[
      -  {
      -    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      -    "items": {
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      +    "items": {
      +      "maxLength": 512,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "maxItems": 100,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / cc / anyOf
      Previous value: -[
      -  {
      -    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      -    "items": {
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      +    "items": {
      +      "maxLength": 512,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "maxItems": 100,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / draftId / anyOf
      Previous value: -[
      -  {
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 512,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / replyToMessageId / anyOf
      Previous value: -[
      -  {
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 512,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / subject / anyOf
      Added value: +[
      +  {
      +    "maxLength": 998,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / subject / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • changedInput schema / properties / to / anyOf
      Previous value: -[
      -  {
      -    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      -    "items": {
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      +    "items": {
      +      "maxLength": 512,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "maxItems": 100,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed4 schema fields changedv0.18.0
    • changedInput schema / properties / attachments / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "content": {
      -          "description": "base64",
      -          "type": "string"
      -        },
      -        "filename": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "mimeType": {
      -          "minLength": 1,
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "filename",
      -        "mimeType",
      -        "content"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "content": {
      +          "description": "base64",
      +          "type": "string"
      +        },
      +        "contentId": {
      +          "description": "Content-ID for an inline image, referenced from bodyHtml as cid:<contentId>",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "disposition": {
      +          "description": "Defaults to attachment",
      +          "enum": [
      +            "inline",
      +            "attachment"
      +          ],
      +          "type": "string"
      +        },
      +        "filename": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "mimeType": {
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "filename",
      +        "mimeType",
      +        "content"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / bcc / anyOf
      Previous value: -[
      -  {
      -    "$ref": "#/properties/to/anyOf/0"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      +    "items": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / cc / anyOf
      Previous value: -[
      -  {
      -    "$ref": "#/properties/to/anyOf/0"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      +    "items": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / replyToMessageId / anyOf
      Previous value: -[
      -  {
      -    "$ref": "#/properties/draftId/anyOf/0"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed29 schema fields changedv0.15.0
    • addedInput schema / properties / accountId / anyOf
      Added value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / accountId / minLength
      Removed value: -1
    • removedInput schema / properties / accountId / type
      Removed value: -"string"
    • addedInput schema / properties / attachments / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "content": {
      +          "description": "base64",
      +          "type": "string"
      +        },
      +        "filename": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "mimeType": {
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "filename",
      +        "mimeType",
      +        "content"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / attachments / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "content": {
      -      "description": "base64",
      -      "type": "string"
      -    },
      -    "filename": {
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "mimeType": {
      -      "minLength": 1,
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "filename",
      -    "mimeType",
      -    "content"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / attachments / type
      Removed value: -"array"
    • removedInput schema / properties / bcc / $ref
      Removed value: -"#/properties/to"
    • addedInput schema / properties / bcc / anyOf
      Added value: +[
      +  {
      +    "$ref": "#/properties/to/anyOf/0"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / bodyHtml / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedInput schema / properties / bodyText / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / cc / $ref
      Removed value: -"#/properties/to"
    • addedInput schema / properties / cc / anyOf
      Added value: +[
      +  {
      +    "$ref": "#/properties/to/anyOf/0"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / draftId / anyOf
      Added value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / draftId / minLength
      Removed value: -1
    • removedInput schema / properties / draftId / type
      Removed value: -"string"
    • addedInput schema / properties / from / anyOf
      Added value: +[
      +  {
      +    "format": "email",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / from / format
      Removed value: -"email"
    • removedInput schema / properties / from / type
      Removed value: -"string"
    • changedInput schema / properties / replyAll / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • removedInput schema / properties / replyToMessageId / $ref
      Removed value: -"#/properties/draftId"
    • addedInput schema / properties / replyToMessageId / anyOf
      Added value: +[
      +  {
      +    "$ref": "#/properties/draftId/anyOf/0"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / sendAt / anyOf
      Added value: +[
      +  {
      +    "format": "date-time",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / sendAt / description
      Previous value: -"Schedule delivery instead of sending now: ISO 8601 with timezone offset or Z (e.g. 2026-07-11T09:00:00-07:00). Fluxmail saves the message as a real draft in the mailbox and sends it at this time; the server must be running then (anything missed while it was down goes out at the next startup). Returns a scheduleId for list/cancel."New value: +"Schedule delivery instead of sending now: ISO 8601 with timezone offset or Z (e.g. 2026-07-11T09:00:00-07:00). Fluxmail saves the message as a real draft in the mailbox for delivery by fluxmail serve or fluxmail scheduled run using the same store. Stdio does not deliver schedules. Overdue mail may send when a worker starts. Returns a scheduleId for list/cancel."
    • removedInput schema / properties / sendAt / format
      Removed value: -"date-time"
    • removedInput schema / properties / sendAt / type
      Removed value: -"string"
    • changedInput schema / properties / subject / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / to / anyOf
      Added value: +[
      +  {
      +    "description": "Recipients, each \"Name <a@x.com>\" or \"a@x.com\"",
      +    "items": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / to / items
      Removed value: -{
      -  "minLength": 1,
      -  "type": "string"
      -}
    • removedInput schema / properties / to / type
      Removed value: -"array"
  4. Changed1 schema field changedv0.11.1
    • removedOutput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
  5. Changed4 schema fields changedv0.11.0
    • changedInput schema / properties / bodyText / description
      Previous value: -"Plain-text body"New value: +"Plain-text body. Line breaks appear in the sent email. Keep each prose paragraph on one continuous line and separate paragraphs with blank lines."
    • addedInput schema / properties / idempotencyKey
      Added value: +{
      +  "description": "Reuse this key when retrying the same delivery",
      +  "pattern": "^[\\x21-\\x7e]{1,255}$",
      +  "type": "string"
      +}
    • addedInput schema / required
      Added value: +[
      +  "idempotencyKey"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "data": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "accountId": {
      +          "type": "string"
      +        },
      +        "error": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "code"
      +          ],
      +          "type": "object"
      +        },
      +        "kind": {
      +          "type": "string"
      +        },
      +        "operationId": {
      +          "type": "string"
      +        },
      +        "result": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "id": {
      +              "type": "string"
      +            },
      +            "threadId": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "threadId"
      +          ],
      +          "type": "object"
      +        },
      +        "scheduleId": {
      +          "type": "string"
      +        },
      +        "status": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "operationId",
      +        "accountId",
      +        "kind",
      +        "status"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "data"
      +  ],
      +  "type": "object"
      +}
  6. Changed1 schema field changedv0.9.0
    • addedInput schema / properties / from
      Added value: +{
      +  "description": "Connected address or an available send-as address",
      +  "format": "email",
      +  "type": "string"
      +}
  7. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description explains idempotency semantics in detail: reusing the same key and arguments returns the saved result, while reusing a key with different arguments or after a failed/uncertain send errors. It also explains scheduling behavior and its limitations, which is exactly the kind of behavioral context an agent needs for a destructive, open-world send operation.

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

Conciseness5/5

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

The description is front-loaded with the core operation and then proceeds mode by mode, followed by idempotency and scheduling caveats. Every sentence adds operational value with no filler.

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

Completeness4/5

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

For a 14-parameter destructive tool with an output schema and rich parameter documentation, the description covers the critical behavioral concerns: modes, idempotency, scheduling limitations, and ambiguity handling. It could be stronger by explicitly routing to preview_send or forward_email alternatives, but the essential invocation context is present.

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 description coverage is high at 93%, so the schema already carries most parameter meaning. The description adds useful mode-level semantics connecting direct fields, draftId, replyToMessageId, replyAll, and sendAt to distinct workflows, going beyond a simple restatement of the schema.

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?

The description states a specific verb and resource: send an email from a connected mailbox. It also enumerates three distinct modes — direct send, existing draft, and reply — so an agent can identify what this tool does and which invocation path fits without opening the schema.

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

Usage Guidelines4/5

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

The description clearly maps use cases to modes: direct fields for new mail, draftId for an existing draft, and replyToMessageId for replies. It also advises confirming with the user when intent is ambiguous. It does not explicitly compare against sibling tools such as preview_send or forward_email, so it falls short of full alternative routing guidance.

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