Skip to main content
Glama

Send an email

well_send_message

Send one email to one or several people (a supplier, a customer, an accountant) from the user's own mailbox (Gmail or Outlook).

Use it when the user asks you to email, write to, or message someone else. To notify the user themselves, use well_send_notification instead.

  • to: a list of the recipients' email addresses, one entry per address. Use the addresses the user gave, or ones read from Well's records; never guess one. Ask the user when you do not have it. One email goes to all of them: do not call this tool once per recipient.

  • cc and bcc: optional lists of addresses in copy and in blind copy. Fill them only when the user asked for a copy.

  • subject and body: write them in the user's language, with what the user asked to say. The body is plain text; line breaks are kept.

  • invoice_id: the id of an issued invoice, only when the user asks you to send that invoice or to chase its customer for it, and you hold its id from Well's records (an invoice you issued or read in this conversation). Well then records the email against the invoice, attaches the invoice's PDF when it is small enough to go as a file, and ends the body with a lasting link to the PDF, which the card shows: never write a link to the invoice in the body yourself, and never say a file is attached unless the result's attached_file names it. Leave it out for every other email, and never guess or invent an id. A draft invoice, or an invoice of another workspace, is refused before anything is sent.

  • A sales invoice goes out once, then is chased at most once per lateness band (1 to 30, 31 to 60, 61 to 90, over 90 days late). When the result has code invoice_already_sent, nothing was sent: follow its message.

  • send_again: set it to true when the user knows the invoice already went out at this step (you told them, or they said so) and asks to send it again anyway, for example to a corrected address or as a copy the customer asked for, or when an invoice_already_sent result tells you to. The card then says it sends the invoice again, and the user approves it there; nothing leaves before that. Never set it otherwise.

  • reply_to_note_id: the note_id of the mail this email answers, read from the user's own email records. The email then goes out as a reply in that mail's thread, from the mailbox that received it. Well writes the subject of a reply itself: that mail's subject with "Re: " in front, which the card shows. Leave it out for a new email, and never guess an id. When the result has code reply_target_not_found, nothing was sent: tell the user, and do not send it as a new email unless they ask.

  • accountant_package: instead of a written email, send the accountant the package of one closed month: its receipts as a ZIP, the reconciliation and the journal, given as calendar_year and calendar_month. Set include_fec only when the user asks for the FEC. Never combine it with invoice_id or reply_to_note_id. When the result has code accountant_package_too_large, call again with the same values and delivery set to "link".

This call sends nothing. It returns an approval link: give it to the user and say the email goes out only after they open the link in Well, read it and approve it there. Never say the email was sent, and never call this tool again for the same email unless the user asks for a changed one (a changed email needs a new link) or an invoice_already_sent result tells you to.

When the result has code missing_send_scope or gmail_reconnect_required, Well cannot send from the user's mailbox yet: give the user the reconnect link from the message, and call this tool again with the same values once they say they reconnected. With mailbox_send_right_missing, say only that the mailbox cannot send, with no link. Offer an other_space_mailbox by its address, and on a yes call again with sender_mailbox_id set to its mailbox_id. Never send the email another way.

When the token authorizes one workspace, call this directly — no workspace call is needed first. When it authorizes several, this read will not guess which one you mean: pass workspace_id on the call.

Input Schema

NameRequiredDescriptionDefault
ccNoAddresses in copy.
toYesThe recipients' email addresses, one entry per address. Empty only with accountant_package, which goes to the address Well remembers.
bccNoAddresses in blind copy.
bodyYesThe email body, in plain text. Line breaks are kept.
subjectYesThe email subject line.
invoice_idNoThe id of the issued invoice this email sends. Omit it when the email is not about an invoice.
send_againNoTrue only when the user knows this invoice already went out at this step and asks to send it again anyway.
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several — a write lands in exactly one workspace and this call would not say which.
bound_deliveryNoSet by Well, never by you: how the accountant package goes.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
send_again_overNoSet by Well, never by you: the send a send-again card repeats.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.
bound_expires_onNoSet by Well, never by you: the day the package link expires.
reply_to_note_idNoThe note_id of the mail this email answers, from the user's own email records: the email goes out as a reply in that mail's thread. Omit it for a new email.
bound_fingerprintNoSet by Well, never by you: the digest of the files the package showed.
sender_mailbox_idNoOnly the `mailbox_id` of an `other_space_mailbox` a refusal offered, once the user said yes to sending from it. Omit it otherwise.
accountant_packageNoThe calendar month (`calendar_year`, `calendar_month`) of a closed month whose receipts, bank reconciliation and journal the user asks to send to their accountant. Set `include_fec` only when the user asks for the FEC. Well builds the package and attaches it or links it; never describe the attachment or write a link yourself. Omit it for any other email.
bound_receipt_countNoSet by Well, never by you: the receipt count the package showed.

Output Schema

NameRequiredDescriptionDefault
codeNomissing_send_scope or gmail_reconnect_required when the user's mailbox needs reconnecting; mailbox_send_right_missing when its send right is missing and the link was already given; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; order_not_billable when invoice_id names a store's sales order, whose customer Well never writes to; invoice_already_sent when the invoice already went out at this step; reply_target_not_found when reply_to_note_id names no mail of the user's own Gmail.
linkNoA link the refusal hands to the user.
errorNoWhy no approval link was created, with the reconnect link when the mailbox needs reconnecting.
statusYes
successYes
error_codeYes
expires_atYes
approval_urlYes
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
approval_requiredYes
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
other_space_mailboxNoA mailbox of another of the user's spaces that can send: name it in sender_mailbox_id on a yes.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
flow_action_offer_idYes
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.
reconnect_already_offeredNoTrue when the reconnect link was already given for this mailbox, so this refusal carries none.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • addedInput schema / properties / accountant_package
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The calendar month (`calendar_year`, `calendar_month`) of a closed month whose receipts, bank reconciliation and journal the user asks to send to their accountant. Set `include_fec` only when the user asks for the FEC. Well builds the package and attaches it or links it; never describe the attachment or write a link yourself. Omit it for any other email.",
      +  "properties": {
      +    "calendar_month": {
      +      "description": "The calendar month, 1 to 12, of the closed month.",
      +      "maximum": 12,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "calendar_year": {
      +      "description": "The calendar year of the closed month.",
      +      "maximum": 2100,
      +      "minimum": 2000,
      +      "type": "integer"
      +    },
      +    "delivery": {
      +      "description": "\"link\" only when a call refused the package as too large. Omit it otherwise.",
      +      "enum": [
      +        "auto",
      +        "link"
      +      ],
      +      "type": "string"
      +    },
      +    "include_fec": {
      +      "description": "True only when the user asks for the FEC. Only French books have one.",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "calendar_year",
      +    "calendar_month"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / bound_delivery
      Added value: +{
      +  "description": "Set by Well, never by you: how the accountant package goes.",
      +  "enum": [
      +    "attached",
      +    "link"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / bound_expires_on
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "date",
      +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Set by Well, never by you: the day the package link expires."
      +}
    • addedInput schema / properties / bound_fingerprint
      Added value: +{
      +  "description": "Set by Well, never by you: the digest of the files the package showed.",
      +  "type": "string"
      +}
    • addedInput schema / properties / bound_receipt_count
      Added value: +{
      +  "description": "Set by Well, never by you: the receipt count the package showed.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedInput schema / properties / to / description
      Previous value: -"The recipients' email addresses, one entry per address."New value: +"The recipients' email addresses, one entry per address. Empty only with accountant_package, which goes to the address Well remembers."
    • removedInput schema / properties / to / minItems
      Removed value: -1
  2. Changed1 schema field changed
    • changedOutput schema / properties / code / description
      Previous value: -"missing_send_scope or gmail_reconnect_required when the user's mailbox needs reconnecting; mailbox_send_right_missing when its send right is missing and the link was already given; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; invoice_already_sent when the invoice already went out at this step; reply_target_not_found when reply_to_note_id names no mail of the user's own Gmail."New value: +"missing_send_scope or gmail_reconnect_required when the user's mailbox needs reconnecting; mailbox_send_right_missing when its send right is missing and the link was already given; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; order_not_billable when invoice_id names a store's sales order, whose customer Well never writes to; invoice_already_sent when the invoice already went out at this step; reply_target_not_found when reply_to_note_id names no mail of the user's own Gmail."
  3. Changed20 schema fields changed
    • changedInput schema / properties / bcc / items / pattern
      Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • changedInput schema / properties / cc / items / pattern
      Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • changedInput schema / properties / send_again_over / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • addedInput schema / properties / sender_mailbox_id
      Added value: +{
      +  "description": "Only the `mailbox_id` of an `other_space_mailbox` a refusal offered, once the user said yes to sending from it. Omit it otherwise.",
      +  "format": "uuid",
      +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +  "type": "string"
      +}
    • changedInput schema / properties / to / items / pattern
      Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • removedOutput schema / properties / approval_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / approval_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / code / description
      Previous value: -"missing_send_scope or gmail_reconnect_required when Gmail needs reconnecting; outlook_send_unsupported when the user's mailbox is Outlook; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; invoice_already_sent when the invoice already went out at this step; reply_target_not_found when reply_to_note_id names no mail of the user's own Gmail."New value: +"missing_send_scope or gmail_reconnect_required when the user's mailbox needs reconnecting; mailbox_send_right_missing when its send right is missing and the link was already given; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; invoice_already_sent when the invoice already went out at this step; reply_target_not_found when reply_to_note_id names no mail of the user's own Gmail."
    • changedOutput schema / properties / error / description
      Previous value: -"Why no approval link was created, with the reconnect link when Gmail needs reconnecting."New value: +"Why no approval link was created, with the reconnect link when the mailbox needs reconnecting."
    • removedOutput schema / properties / error_code / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / error_code / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / expires_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / expires_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / flow_action_offer_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / flow_action_offer_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / link / description
      Previous value: -"The link that connects Gmail, when the user's mailbox is Outlook."New value: +"A link the refusal hands to the user."
    • addedOutput schema / properties / other_space_mailbox
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "A mailbox of another of the user's spaces that can send: name it in sender_mailbox_id on a yes.",
      +  "properties": {
      +    "address": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "mailbox_id": {
      +      "type": "string"
      +    },
      +    "provider": {
      +      "enum": [
      +        "gmail",
      +        "outlook"
      +      ],
      +      "type": "string"
      +    },
      +    "workspace_id": {
      +      "type": "string"
      +    },
      +    "workspace_name": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "mailbox_id",
      +    "address",
      +    "provider",
      +    "workspace_id",
      +    "workspace_name"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / reconnect_already_offered
      Added value: +{
      +  "description": "True when the reconnect link was already given for this mailbox, so this refusal carries none.",
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / resolved_workspace / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / resolved_workspace / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  4. Changed2 schema fields changed
    • addedInput schema / properties / reply_to_note_id
      Added value: +{
      +  "description": "The note_id of the mail this email answers, from the user's own email records: the email goes out as a reply in that mail's thread. Omit it for a new email.",
      +  "format": "uuid",
      +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +  "type": "string"
      +}
    • changedOutput schema / properties / code / description
      Previous value: -"missing_send_scope or gmail_reconnect_required when Gmail needs reconnecting; outlook_send_unsupported when the user's mailbox is Outlook; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; invoice_already_sent when the invoice already went out at this step."New value: +"missing_send_scope or gmail_reconnect_required when Gmail needs reconnecting; outlook_send_unsupported when the user's mailbox is Outlook; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; invoice_already_sent when the invoice already went out at this step; reply_target_not_found when reply_to_note_id names no mail of the user's own Gmail."
  5. Changed2 schema fields changed
    • addedInput schema / properties / body / maxLength
      Added value: +100000
    • addedInput schema / properties / subject / maxLength
      Added value: +300
  6. Changed1 schema field changed
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
  7. Changed4 schema fields changed
    • addedInput schema / properties / send_again
      Added value: +{
      +  "description": "True only when the user knows this invoice already went out at this step and asks to send it again anyway.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / send_again_over
      Added value: +{
      +  "description": "Set by Well, never by you: the send a send-again card repeats.",
      +  "format": "date-time",
      +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      +  "type": "string"
      +}
    • changedOutput schema / properties / code / description
      Previous value: -"missing_send_scope or gmail_reconnect_required when Gmail needs reconnecting; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used."New value: +"missing_send_scope or gmail_reconnect_required when Gmail needs reconnecting; outlook_send_unsupported when the user's mailbox is Outlook; write_target_unreadable, invoice_not_issued or invoice_canceled when invoice_id cannot be used; invoice_already_sent when the invoice already went out at this step."
    • addedOutput schema / properties / link
      Added value: +{
      +  "description": "The link that connects Gmail, when the user's mailbox is Outlook.",
      +  "type": "string"
      +}
  8. Added

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: annotations only say non-read-only, non-destructive, open-world, while the description discloses that this call sends nothing and returns an approval link the user must open, that wave-by-wave chase limits apply (once per lateness band), that drafts/foreign-workspace invoices are refused pre-send, and that send_again cards require user approval in the card. It also names recovery behavior for each refusal code, which is exactly the context annotations cannot carry.

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-loaded purpose, then one bullet per decision-bearing parameter, then a distinct paragraph on the approval-link contract and one on failure codes — a clean, scannable structure. It is nonetheless long for a tool with only 3 required params, and the closing paragraph about workspace_id/workflow largely restates what the schema already documents, which could be trimmed.

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 19-parameter, open-world, non-read-only tool with nested objects, the description covers the approval gate, per-mode conflicts, retry/escalation paths for every named error code, and mailbox reconnection handling; an output schema exists so return shapes need not be re-explained. Nothing an agent needs to call it correctly or recover from a refusal is missing.

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

Parameters5/5

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

Schema coverage is already 100%, but the description adds real meaning the schema cannot: invoice_id triggers PDF attachment plus a Well-written lasting link and forbids hand-written links; reply_to_note_id makes Well compose the "Re: " subject itself; send_again is scoped to a step the user already knows about; accountant_package replaces a written email with a month package. That is operational semantics well beyond field-level docs.

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+resource+scope: "Send one email to one or several people ... from the user's own mailbox (Gmail or Outlook)", and immediately distinguishes itself from well_send_notification. The card-approval nature of the call is also stated up front, so the agent knows this is not a direct send.

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?

Explicit when-to-use ("when the user asks you to email, write to, or message someone else"), an explicit alternative with its selection condition (well_send_notification for self-notification), and mode selection rules for invoice_id, reply_to_note_id and accountant_package, including mutual-exclusion ("Never combine it with `invoice_id` or `reply_to_note_id`").

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