Skip to main content
Glama

Send outreach emails

exim__email__send
Destructive

Sends outreach emails to the companies in a collection. Without confirm it returns a preview only; with confirm it runs signature, sender-domain and OFAC SDN checks and sends.

Input Schema

NameRequiredDescriptionDefault
ccMeNoCC the sender on each outbound
briefYesOutreach brief — what to mention, tone, ask
dryRunNoExplicit preview alias. Equivalent to omitting confirm — generates drafts without sending.
confirmNoRequired to actually flush emails. WITHOUT confirm this is always a safe preview (no send), even without dryRun. The pre-send sanity guard runs only when confirm is set.
profileNoSaved ideal-profile name; when set, each draft references the observed fit (matched attributes) to personalize the opening
regenerateNoRedraft fresh copy on send instead of flushing the exact drafts produced by the last `email draft` preview. Default false — send flushes the approved preview so sent copy matches what was reviewed.
senderNameYesSender display name
senderEmailNoFrom email (must be operator-owned domain)
collectionIdYesCollection name or id
trackingEnabledNoEnable open/click tracking
includeLowConfidenceNoInclude low-confidence recipient emails (role aliases info@/sales@, no-reply, single-letter local, image-filename addresses). Default false — these are auto-pruned and counted in stats.autoPruned.

Output Schema

NameRequiredDescriptionDefault
dataYes
statsNo
_debugNo
summaryYes
warningsNo
nextActionsYes
correlationIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / confirm / description
      Previous value: -"Required to actually flush emails. WITHOUT --confirm this is always a safe preview (no send), even without --dryRun. The pre-send sanity guard runs only when --confirm is set."New value: +"Required to actually flush emails. WITHOUT confirm this is always a safe preview (no send), even without dryRun. The pre-send sanity guard runs only when confirm is set."
    • changedInput schema / properties / dryRun / description
      Previous value: -"Explicit preview alias. Equivalent to omitting --confirm — generates drafts without sending."New value: +"Explicit preview alias. Equivalent to omitting confirm — generates drafts without sending."
  2. Changed2 schema fields changed
    • changedInput schema / properties / confirm / description
      Previous value: -"Required to actually flush emails. WITHOUT confirm this is always a safe preview (no send), even without dryRun. The pre-send sanity guard runs only when confirm is set."New value: +"Required to actually flush emails. WITHOUT --confirm this is always a safe preview (no send), even without --dryRun. The pre-send sanity guard runs only when --confirm is set."
    • changedInput schema / properties / dryRun / description
      Previous value: -"Explicit preview alias. Equivalent to omitting confirm — generates drafts without sending."New value: +"Explicit preview alias. Equivalent to omitting --confirm — generates drafts without sending."
  3. Changed2 schema fields changed
    • changedInput schema / properties / confirm / description
      Previous value: -"Required to actually flush emails. WITHOUT --confirm this is always a safe preview (no send), even without --dryRun. The pre-send sanity guard runs only when --confirm is set."New value: +"Required to actually flush emails. WITHOUT confirm this is always a safe preview (no send), even without dryRun. The pre-send sanity guard runs only when confirm is set."
    • changedInput schema / properties / dryRun / description
      Previous value: -"Explicit preview alias. Equivalent to omitting --confirm — generates drafts without sending."New value: +"Explicit preview alias. Equivalent to omitting confirm — generates drafts without sending."
  4. Changed25 schema fields changed
    • addedInput schema / not
      Added value: +{
      +  "anyOf": [
      +    {
      +      "not": {
      +        "if": {
      +          "allOf": [
      +            {
      +              "properties": {
      +                "confirm": {
      +                  "anyOf": [
      +                    {
      +                      "const": true
      +                    },
      +                    {
      +                      "pattern": "^\\s*([Tt][Rr][Uu][Ee]|1)\\s*$",
      +                      "type": "string"
      +                    }
      +                  ]
      +                }
      +              },
      +              "required": [
      +                "confirm"
      +              ]
      +            },
      +            {
      +              "not": {
      +                "properties": {
      +                  "dryRun": {
      +                    "anyOf": [
      +                      {
      +                        "const": true
      +                      },
      +                      {
      +                        "pattern": "^\\s*([Tt][Rr][Uu][Ee]|1)\\s*$",
      +                        "type": "string"
      +                      }
      +                    ]
      +                  }
      +                },
      +                "required": [
      +                  "dryRun"
      +                ]
      +              }
      +            }
      +          ]
      +        },
      +        "then": {
      +          "anyOf": [
      +            {
      +              "properties": {
      +                "senderEmail": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "senderEmail"
      +              ]
      +            }
      +          ]
      +        }
      +      }
      +    }
      +  ]
      +}
    • removedInput schema / properties / --brief
      Removed value: -{
      -  "description": "Outreach brief — what to mention, tone, ask",
      -  "pattern": "[^\\t\\n\\v\\f\\r\\x85\\p{Z}]",
      -  "type": "string"
      -}
    • removedInput schema / properties / --ccMe
      Removed value: -{
      -  "description": "CC the sender on each outbound",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / --collectionId
      Removed value: -{
      -  "description": "Collection name or id",
      -  "pattern": "[^\\t\\n\\v\\f\\r\\x85\\p{Z}]",
      -  "type": "string"
      -}
    • removedInput schema / properties / --confirm
      Removed value: -{
      -  "description": "Required to actually flush emails. WITHOUT --confirm this is always a safe preview (no send), even without --dryRun. The pre-send sanity guard runs only when --confirm is set.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / --dryRun
      Removed value: -{
      -  "description": "Explicit preview alias. Equivalent to omitting --confirm — generates drafts without sending.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / --includeLowConfidence
      Removed value: -{
      -  "description": "Include low-confidence recipient emails (role aliases info@/sales@, no-reply, single-letter local, image-filename addresses). Default false — these are auto-pruned and counted in stats.autoPruned.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / --profile
      Removed value: -{
      -  "description": "Saved ideal-profile name; when set, each draft references the observed fit (matched attributes) to personalize the opening",
      -  "type": "string"
      -}
    • removedInput schema / properties / --regenerate
      Removed value: -{
      -  "description": "Redraft fresh copy on send instead of flushing the exact drafts produced by the last `email draft` preview. Default false — send flushes the approved preview so sent copy matches what was reviewed.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / --senderEmail
      Removed value: -{
      -  "description": "From email (must be operator-owned domain)",
      -  "pattern": "[^\\t\\n\\v\\f\\r\\x85\\p{Z}]",
      -  "type": "string"
      -}
    • removedInput schema / properties / --senderName
      Removed value: -{
      -  "description": "Sender display name",
      -  "type": "string"
      -}
    • removedInput schema / properties / --trackingEnabled
      Removed value: -{
      -  "description": "Enable open/click tracking",
      -  "type": "boolean"
      -}
    • addedInput schema / properties / brief
      Added value: +{
      +  "description": "Outreach brief — what to mention, tone, ask",
      +  "maxLength": 100000,
      +  "pattern": "[^\\t\\n\\v\\f\\r\\x85\\p{Z}]",
      +  "type": "string"
      +}
    • addedInput schema / properties / ccMe
      Added value: +{
      +  "description": "CC the sender on each outbound",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / collectionId
      Added value: +{
      +  "description": "Collection name or id",
      +  "format": "uuid",
      +  "maxLength": 8000,
      +  "pattern": "[^\\t\\n\\v\\f\\r\\x85\\p{Z}]",
      +  "type": "string"
      +}
    • addedInput schema / properties / confirm
      Added value: +{
      +  "description": "Required to actually flush emails. WITHOUT --confirm this is always a safe preview (no send), even without --dryRun. The pre-send sanity guard runs only when --confirm is set.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / dryRun
      Added value: +{
      +  "description": "Explicit preview alias. Equivalent to omitting --confirm — generates drafts without sending.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / includeLowConfidence
      Added value: +{
      +  "description": "Include low-confidence recipient emails (role aliases info@/sales@, no-reply, single-letter local, image-filename addresses). Default false — these are auto-pruned and counted in stats.autoPruned.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / profile
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 120,
      +      "type": "string"
      +    },
      +    {
      +      "type": [
      +        "null",
      +        "boolean",
      +        "number",
      +        "string",
      +        "array",
      +        "object"
      +      ]
      +    }
      +  ],
      +  "contentSchema": {
      +    "type": [
      +      "null",
      +      "boolean",
      +      "number",
      +      "string",
      +      "array",
      +      "object"
      +    ]
      +  },
      +  "description": "Saved ideal-profile name; when set, each draft references the observed fit (matched attributes) to personalize the opening"
      +}
    • addedInput schema / properties / regenerate
      Added value: +{
      +  "description": "Redraft fresh copy on send instead of flushing the exact drafts produced by the last `email draft` preview. Default false — send flushes the approved preview so sent copy matches what was reviewed.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / senderEmail
      Added value: +{
      +  "description": "From email (must be operator-owned domain)",
      +  "format": "mail-address",
      +  "maxLength": 8000,
      +  "pattern": "[^\\t\\n\\v\\f\\r\\x85\\p{Z}]",
      +  "type": "string"
      +}
    • addedInput schema / properties / senderName
      Added value: +{
      +  "description": "Sender display name",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / trackingEnabled
      Added value: +{
      +  "description": "Enable open/click tracking",
      +  "type": "boolean"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "--brief",
      -  "--collectionId",
      -  "--senderName"
      -]New value: +[
      +  "brief",
      +  "collectionId",
      +  "senderName"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$defs": {
      +    "value0": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "body": {
      +          "type": "string"
      +        },
      +        "recipientCompany": {
      +          "type": "string"
      +        },
      +        "recipientCompanyId": {
      +          "anyOf": [
      +            {
      +              "format": "uuid",
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "recipientCountry": {
      +          "type": "string"
      +        },
      +        "recipientLanguage": {
      +          "type": "string"
      +        },
      +        "recipientName": {
      +          "type": "string"
      +        },
      +        "recipientTimezone": {
      +          "type": "string"
      +        },
      +        "recipientTitle": {
      +          "type": "string"
      +        },
      +        "subject": {
      +          "type": "string"
      +        },
      +        "toEmail": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "body",
      +        "recipientCompany",
      +        "recipientName",
      +        "recipientTitle",
      +        "subject",
      +        "toEmail"
      +      ],
      +      "type": "object"
      +    },
      +    "value1": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "type": [
      +              "null",
      +              "boolean",
      +              "number",
      +              "string",
      +              "array",
      +              "object"
      +            ]
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value2": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "$ref": "#/$defs/value3"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value3": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "command": {
      +          "type": "string"
      +        },
      +        "cost": {
      +          "type": "string"
      +        },
      +        "label": {
      +          "type": "string"
      +        },
      +        "rationale": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "command",
      +        "cost",
      +        "label",
      +        "rationale"
      +      ],
      +      "type": "object"
      +    },
      +    "value4": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value5": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "$ref": "#/$defs/value6"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value6": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "code": {
      +          "type": "string"
      +        },
      +        "message": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "message"
      +      ],
      +      "type": "object"
      +    },
      +    "value7": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {
      +            "type": [
      +              "null",
      +              "boolean",
      +              "number",
      +              "string",
      +              "array",
      +              "object"
      +            ]
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "additionalProperties": false,
      +  "properties": {
      +    "_debug": {
      +      "$ref": "#/$defs/value7"
      +    },
      +    "correlationId": {
      +      "type": "string"
      +    },
      +    "data": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "context": {
      +          "type": [
      +            "null",
      +            "boolean",
      +            "number",
      +            "string",
      +            "array",
      +            "object"
      +          ]
      +        },
      +        "cursor": {
      +          "type": "string"
      +        },
      +        "has_more": {
      +          "type": "boolean"
      +        },
      +        "items": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "$ref": "#/$defs/value0"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "context",
      +        "has_more",
      +        "items"
      +      ],
      +      "type": "object"
      +    },
      +    "nextActions": {
      +      "$ref": "#/$defs/value2"
      +    },
      +    "stats": {
      +      "$ref": "#/$defs/value4"
      +    },
      +    "summary": {
      +      "type": "string"
      +    },
      +    "warnings": {
      +      "$ref": "#/$defs/value5"
      +    }
      +  },
      +  "required": [
      +    "data",
      +    "nextActions",
      +    "summary"
      +  ],
      +  "type": "object"
      +}
  5. First observed

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, openWorldHint=true and non-idempotent, so the safety bar is lower. The description still adds real value beyond that: the confirm gating on preview vs. actual send and the specific pre-send checks (signature, sender-domain, OFAC SDN) are not in the annotations, giving the agent concrete behavioral context.

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?

Two sentences, no filler, and the critical decision variable (confirm) is stated up front in the first sentence. Every clause earns its place by conveying the preview/send distinction.

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?

An output schema exists, so return values need not be explained, and annotations carry the safety profile. The description covers the destructive-send gating and the compliance checks, leaving only minor gaps such as volume limits or what happens to already-approved drafts — not essential for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter including confirm, dryRun, regenerate and includeLowConfidence. The description reinforces the confirm semantics but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose4/5

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

The description names a specific verb and resource with scope: 'Sends outreach emails to the companies in a collection.' It clearly distinguishes the two modes (preview vs. real send), but it never explicitly references the sibling exim__email__draft, which is the natural alternative for the drafting-only case, so sibling differentiation is only partial.

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

Usage Guidelines3/5

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

It gives useful conditional guidance ('without confirm ... preview only; with confirm ... sends') that helps an agent decide the mode. However, it never names exim__email__draft as the tool to reach for when the agent only wants drafts, nor does it state prerequisites such as needing an existing collection or an operator-owned sender domain, so usage is implied rather than explicit.

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.