Skip to main content
Glama

Send email

send_email

Send a transactional email via Groundmail. Provide subject + html/text, or a published template_id / template_alias with optional variables. To test without delivering anything, send to a simulator address: delivered@, bounce@, block@, complaint@, suppressed@ or delayed@simulator.groundmail.dev (plus addressing like bounce+test1@ works); the result has test: true and webhooks fire as for real mail. Do not put payment card numbers, government ID numbers, health information or passwords in the content.

Input Schema

NameRequiredDescriptionDefault
toYesRecipient email address. A …@simulator.groundmail.dev address simulates an outcome and never delivers
fromNoSender address (on a verified domain, or the sandbox sender). Optional when sender is set, the template has a sender, or the team has a default sender (list_senders); when set it wins
htmlNoHTML body. Do not combine with template_id or template_alias
textNoPlain-text body. Do not combine with template_id or template_alias
senderNoA saved sender's handle or id from list_senders (for example billing): sends as its name and address, and replies go to its reply-to unless reply_to is set. Ignored when from is set
tenantNoSend as this tenant: the send uses its domains, suppression list, pause switch and daily limit. Omit to send from the account as a whole. The tenant's external id (your id for that customer) or its Groundmail id
subjectNoSubject line. Optional when using a published template
categoryNotransactional (default): sign-in codes, receipts, alerts. product: onboarding, lifecycle and notification email, with one-click unsubscribe. newsletter: opt-in newsletters, for approved accounts only (otherwise the send fails with newsletter_not_enabled), sent from separate IPs with one-click unsubscribe
reply_toNoAddress that replies should go to
variablesNoTemplate variables when using template_id or template_alias
template_idNoPublished template UUID
template_aliasNoPublished template alias

Output Schema

NameRequiredDescriptionDefault
idYesEmail id (msg_…)
testNoPresent and true on a test send (test key or simulator addresses): nothing was delivered
statusYesStatus after the request, for example queued or scheduled
held_backNoPresent when Groundmail validation held some recipients back; the email went to the rest

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / held_back / items / properties / reason / description
      Previous value: -"Why: invalid_address (cannot exist), no_mail_server (domain takes no email), previously_bounced (hard-bounced for a Groundmail sender in the last 90 days) or mailbox_not_found"New value: +"Why: invalid_address (cannot exist), no_mail_server (domain takes no email), previously_bounced (hard-bounced for a Groundmail sender in the last 90 days), mailbox_not_found, or likely_bot_signup (looks like a bot sign-up; only when the send opted in)"
  2. Changed3 schema fields changed
    • changedInput schema / properties / from / description
      Previous value: -"Sender address (must match a verified domain or sandbox sender)"New value: +"Sender address (on a verified domain, or the sandbox sender). Optional when sender is set, the template has a sender, or the team has a default sender (list_senders); when set it wins"
    • addedInput schema / properties / sender
      Added value: +{
      +  "description": "A saved sender's handle or id from list_senders (for example billing): sends as its name and address, and replies go to its reply-to unless reply_to is set. Ignored when from is set",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "from",
      -  "to"
      -]New value: +[
      +  "to"
      +]
  3. Changed1 schema field changed
    • addedInput schema / properties / category
      Added value: +{
      +  "description": "transactional (default): sign-in codes, receipts, alerts. product: onboarding, lifecycle and notification email, with one-click unsubscribe. newsletter: opt-in newsletters, for approved accounts only (otherwise the send fails with newsletter_not_enabled), sent from separate IPs with one-click unsubscribe",
      +  "enum": [
      +    "transactional",
      +    "product",
      +    "newsletter"
      +  ],
      +  "type": "string"
      +}
  4. Changed1 schema field changed
    • addedInput schema / properties / tenant
      Added value: +{
      +  "description": "Send as this tenant: the send uses its domains, suppression list, pause switch and daily limit. Omit to send from the account as a whole. The tenant's external id (your id for that customer) or its Groundmail id",
      +  "type": "string"
      +}
  5. Changed2 schema fields changed
    • changedInput schema / properties / to / description
      Previous value: -"Recipient email address"New value: +"Recipient email address. A …@simulator.groundmail.dev address simulates an outcome and never delivers"
    • addedOutput schema / properties / test
      Added value: +{
      +  "description": "Present and true on a test send (test key or simulator addresses): nothing was delivered",
      +  "type": "boolean"
      +}
  6. Changed1 schema field changed
    • addedOutput schema / properties / held_back
      Added value: +{
      +  "description": "Present when Groundmail validation held some recipients back; the email went to the rest",
      +  "items": {
      +    "properties": {
      +      "email": {
      +        "description": "The held-back address",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why: invalid_address (cannot exist), no_mail_server (domain takes no email), previously_bounced (hard-bounced for a Groundmail sender in the last 90 days) or mailbox_not_found",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "email",
      +      "reason"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  7. First observed

TDQS

A4.6/5.0
Behavior5/5

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

With annotations only covering the generic safety profile (non-read-only, non-idempotent, open-world), the description adds substantial behavior: simulator sends return test: true yet still fire webhooks, category-level consequences (newsletter fails with newsletter_not_enabled for unapproved accounts and sends from separate IPs), and a PII prohibition on content. That is real operational context an agent cannot infer from the annotations.

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?

Front-loads the action, then testing, then compliance, in three sentences with no filler. The simulator address enumeration is a dense clause but each token is functionally necessary for choosing an outcome.

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 12-parameter mutation tool with an output schema and full annotation coverage, the description supplies the non-obvious parts an agent needs: content-mode exclusivity, test delivery semantics, tenant scoping effects, and data-handling restrictions, leaving return shape to the output schema.

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 100%, so baseline is 3; the description still adds meaning by explaining the from/sender/template-default precedence chain and the simulator-address trick with plus addressing, and by framing variables as template-only. It largely mirrors the schema's own wording on precedence rather than extending it much further.

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?

States a specific verb and resource ('Send a transactional email via Groundmail') and immediately enumerates the two content modes (subject + html/text vs. published template_id/template_alias with variables), which lets an agent distinguish it from template-management siblings like create_template or publish_template.

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?

Gives concrete guidance for the testing scenario: use a simulator address from a listed set instead of sending real mail, and notes plus-addressing works. Missing is an explicit 'when not to use' or routing to siblings (e.g., validate_email before sending, list_senders for sender resolution), so it is clear but not fully alternative-aware.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources