Skip to main content
Glama

Forward a message

messages_forward
DestructiveIdempotent

Forward one message to the addresses you name, with the files it carries, inside the thread it already sits in. Only the provider's own limit applies to what it carries. It sends mail the person asked to go; mail they asked to prepare is a draft. A request id already spent sends nothing again: the answer says whether that send went or may have gone. An address the person did not give is found in their past mail - messages_list_all_mailboxes with from: or to: and the name, at the headers view - and is theirs to confirm before anything is written to it. The person's own last letter to someone - the newest found with to: and their address whose sender is an address mailboxes_list names - shows the manner they write to them in. Where the address it goes from has a signature - settings_send_as_get reads the default address's - the signature goes below your words and above any quote, so a sign-off, name, title, phone number or link in the words repeats it, and sign false leaves it off a terse note; where it has none, the words close as the person's own would.

Input Schema

NameRequiredDescriptionDefault
ccNoWho to copy.
toYesWho the forward is addressed to.
bccNoWho to blind-copy. The other recipients are not told.
flagNoOn an Outlook mailbox, a follow-up flag on these days for the person's own reminder, which the sent copy carries. No other mailbox keeps one.
fromNoThe address it goes from, the mailbox's default where left out. A Gmail connected by Google sign-in goes from any address Gmail lists as verified for it, under that address's own signature; an Outlook mailbox, and any other, from its own address alone, refusing another. The answer names the address it goes from.
htmlNoYour own words as HTML, for formatting; note stays their plain-text version. An Outlook mailbox keeps only the HTML and writes the plain version from it.
noteNoYour own words, above the message forwarded.
signNofalse leaves the signature out; it goes in by default.
mailboxYesThe mailbox's name or its email address.
chatFilesNoFiles the person attached in this chat, as the chat itself hands them over - never an address you write: a file anywhere else is refused, and goes in attachments instead.
messageIdYesThe provider's own identifier.
requestIdYesYour own id for this send, new for every message. One whose send went or may have gone sends nothing again.
afterwardsNoOnce it has gone, its thread is archived or marked read, as threads_archive or threads_modify does it - under that tool's own permission for this mailbox, counting no second action. Where that tool is turned off or the act fails, the mail still went, and the answer's afterwards says why its thread was left.
importanceNoHow important the message is marked, normal where left out: an Outlook mailbox marks its own, and any other writes the standard headers the recipient's mail app reads.
attachmentsNoFiles to carry: one held by any connected mailbox, content you write out, or a file put at an upload address. A file you hold and can send yourself by HTTP PUT, as from a terminal, is named by filename and mimeType alone: the call then writes nothing and answers with an address to put it at, and the same call made again names it by the upload that answer gave it. Any other file is written out, kept small.

Output Schema

NameRequiredDescriptionDefault
idNo
fromNoThe address it went from.
uploadsNo
acceptedNo
threadIdNo
messageIdNo
signatureNoWhich signature went under your words, or why none did: gmail, Gmail's own for the address it went from; lumman, the one Lumman keeps for an Outlook mailbox or one whose provider is imap; none_set, that address has none - settings_send_as_patch sets one, a Gmail one only where that address is the one the mailbox signs in with; left_out, the call asked for none; already_in_words, your words already carried it; company_adds, the person has said the mailbox's company adds its own on its server.
afterwardsNoWhat became of afterwards: done where the thread was archived or marked read; else the mail still went, reason says why its thread was left, and threadId names that thread for threads_archive or threads_modify.
sentCopyKeptNo
markedAnsweredNoPresent where the mailbox's server would not mark the message this replied to as answered: a search for what waits on the person still finds it there.
refusedRecipientsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / afterwards / description
      Previous value: -"Once it has gone, archive its thread or mark it read, as threads_archive or threads_modify would - under that tool's own permission for this mailbox, counting no second action. Where that tool is turned off or the act fails, the mail still went, and the answer's afterwards says why its thread was left."New value: +"Once it has gone, its thread is archived or marked read, as threads_archive or threads_modify does it - under that tool's own permission for this mailbox, counting no second action. Where that tool is turned off or the act fails, the mail still went, and the answer's afterwards says why its thread was left."
    • changedInput schema / properties / attachments / description
      Previous value: -"Files to carry: one held by any connected mailbox, content you write out, or a file put at an upload address. A file you hold and can send yourself by HTTP PUT, as from a terminal, is named by filename and mimeType alone: the call then writes nothing and answers with an address to put it at, and the same call made again names it by the upload that answer gave it. Otherwise write a small file out."New value: +"Files to carry: one held by any connected mailbox, content you write out, or a file put at an upload address. A file you hold and can send yourself by HTTP PUT, as from a terminal, is named by filename and mimeType alone: the call then writes nothing and answers with an address to put it at, and the same call made again names it by the upload that answer gave it. Any other file is written out, kept small."
  2. Changed2 schema fields changed
    • changedInput schema / properties / attachments / description
      Previous value: -"Files to carry: one held by a connected mailbox of the message's own provider, content you write out, or a file put at an upload address. A file you hold and can send yourself by HTTP PUT, as from a terminal, is named by filename and mimeType alone: the call then writes nothing and answers with an address to put it at, and the same call made again names it by the upload that answer gave it. Otherwise write a small file out."New value: +"Files to carry: one held by any connected mailbox, content you write out, or a file put at an upload address. A file you hold and can send yourself by HTTP PUT, as from a terminal, is named by filename and mimeType alone: the call then writes nothing and answers with an address to put it at, and the same call made again names it by the upload that answer gave it. Otherwise write a small file out."
    • changedInput schema / properties / attachments / items / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "attachmentId": {
      -        "description": "An attachment id, as a message read named it.",
      -        "maxLength": 2048,
      -        "pattern": "^(?:\\d+(?:\\.\\d+)*|[A-Za-z0-9_=-]+)$",
      -        "type": "string"
      -      },
      -      "mailbox": {
      -        "description": "The mailbox holding the message the file is in, of the same provider as the one written from.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "messageId": {
      -        "description": "The provider's own identifier.",
      -        "pattern": "^[A-Za-z0-9_=-]{1,512}$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mailbox",
      -      "messageId",
      -      "attachmentId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "content": {
      -        "contentEncoding": "base64",
      -        "description": "The file's own bytes, base64.",
      -        "format": "base64",
      -        "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
      -        "type": "string"
      -      },
      -      "contentId": {
      -        "description": "Places a picture inside the words rather than among the files: html shows it where it writes <img src=\"cid:<contentId>\">. One html does not show goes among the files.",
      -        "maxLength": 200,
      -        "pattern": "^[\\w.+-]+(?:@[\\w.-]+)?$",
      -        "type": "string"
      -      },
      -      "filename": {
      -        "description": "What the file is called.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "mimeType": {
      -        "description": "The file's media type.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "filename",
      -      "mimeType",
      -      "content"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "filename": {
      -        "description": "What the file is called.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "mimeType": {
      -        "description": "The file's media type.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "upload": {
      -        "description": "The upload an earlier call's answer gave this file, once the file is put at its address.",
      -        "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"
      -      }
      -    },
      -    "required": [
      -      "filename",
      -      "mimeType",
      -      "upload"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "A file you hold, named alone: the call answers with an address to put it at.",
      -    "properties": {
      -      "filename": {
      -        "description": "What the file is called.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "mimeType": {
      -        "description": "The file's media type.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "filename",
      -      "mimeType"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "attachmentId": {
      +        "description": "An attachment id, as a message read named it.",
      +        "maxLength": 2048,
      +        "pattern": "^(?:\\d+(?:\\.\\d+)*|[A-Za-z0-9_=-]+)$",
      +        "type": "string"
      +      },
      +      "mailbox": {
      +        "description": "The mailbox holding the message the file is in, whatever its provider.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "messageId": {
      +        "description": "The provider's own identifier.",
      +        "pattern": "^[A-Za-z0-9_=-]{1,512}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mailbox",
      +      "messageId",
      +      "attachmentId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "content": {
      +        "contentEncoding": "base64",
      +        "description": "The file's own bytes, base64.",
      +        "format": "base64",
      +        "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
      +        "type": "string"
      +      },
      +      "contentId": {
      +        "description": "Places a picture inside the words rather than among the files: html shows it where it writes <img src=\"cid:<contentId>\">. One html does not show goes among the files.",
      +        "maxLength": 200,
      +        "pattern": "^[\\w.+-]+(?:@[\\w.-]+)?$",
      +        "type": "string"
      +      },
      +      "filename": {
      +        "description": "What the file is called.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "mimeType": {
      +        "description": "The file's media type.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "filename",
      +      "mimeType",
      +      "content"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "filename": {
      +        "description": "What the file is called.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "mimeType": {
      +        "description": "The file's media type.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "upload": {
      +        "description": "The upload an earlier call's answer gave this file, once the file is put at its address.",
      +        "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"
      +      }
      +    },
      +    "required": [
      +      "filename",
      +      "mimeType",
      +      "upload"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A file you hold, named alone: the call answers with an address to put it at.",
      +    "properties": {
      +      "filename": {
      +        "description": "What the file is called.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "mimeType": {
      +        "description": "The file's media type.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "filename",
      +      "mimeType"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed2 schema fields changed
    • addedInput schema / properties / from
      Added value: +{
      +  "description": "The address it goes from, the mailbox's default where left out. A Gmail connected by Google sign-in goes from any address Gmail lists as verified for it, under that address's own signature; an Outlook mailbox, and any other, from its own address alone, refusing another. The answer names the address it goes from.",
      +  "format": "email",
      +  "pattern": "^(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+(?:\\.(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+)*@(?:(?:(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+\\.)+(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+|\\[(?:\\d{1,3}(?:\\.\\d{1,3}){3}|IPv6:[\\dA-Fa-f:.]+)\\])$",
      +  "type": "string"
      +}
    • addedOutput schema / properties / from
      Added value: +{
      +  "description": "The address it went from.",
      +  "type": "string"
      +}
  4. Changed2 schema fields changed
    • addedInput schema / properties / afterwards
      Added value: +{
      +  "description": "Once it has gone, archive its thread or mark it read, as threads_archive or threads_modify would - under that tool's own permission for this mailbox, counting no second action. Where that tool is turned off or the act fails, the mail still went, and the answer's afterwards says why its thread was left.",
      +  "enum": [
      +    "archive",
      +    "read"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / afterwards
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "What became of afterwards: done where the thread was archived or marked read; else the mail still went, reason says why its thread was left, and threadId names that thread for threads_archive or threads_modify.",
      +  "properties": {
      +    "act": {
      +      "enum": [
      +        "archive",
      +        "read"
      +      ],
      +      "type": "string"
      +    },
      +    "done": {
      +      "type": "boolean"
      +    },
      +    "reason": {
      +      "type": "string"
      +    },
      +    "threadId": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "act",
      +    "done"
      +  ],
      +  "type": "object"
      +}
  5. Changed6 schema fields changed
    • addedInput schema / properties / attachments
      Added value: +{
      +  "description": "Files to carry: one held by a connected mailbox of the message's own provider, content you write out, or a file put at an upload address. A file you hold and can send yourself by HTTP PUT, as from a terminal, is named by filename and mimeType alone: the call then writes nothing and answers with an address to put it at, and the same call made again names it by the upload that answer gave it. Otherwise write a small file out.",
      +  "items": {
      +    "anyOf": [
      +      {
      +        "properties": {
      +          "attachmentId": {
      +            "description": "An attachment id, as a message read named it.",
      +            "maxLength": 2048,
      +            "pattern": "^(?:\\d+(?:\\.\\d+)*|[A-Za-z0-9_=-]+)$",
      +            "type": "string"
      +          },
      +          "mailbox": {
      +            "description": "The mailbox holding the message the file is in, of the same provider as the one written from.",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "messageId": {
      +            "description": "The provider's own identifier.",
      +            "pattern": "^[A-Za-z0-9_=-]{1,512}$",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "mailbox",
      +          "messageId",
      +          "attachmentId"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "content": {
      +            "contentEncoding": "base64",
      +            "description": "The file's own bytes, base64.",
      +            "format": "base64",
      +            "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
      +            "type": "string"
      +          },
      +          "contentId": {
      +            "description": "Places a picture inside the words rather than among the files: html shows it where it writes <img src=\"cid:<contentId>\">. One html does not show goes among the files.",
      +            "maxLength": 200,
      +            "pattern": "^[\\w.+-]+(?:@[\\w.-]+)?$",
      +            "type": "string"
      +          },
      +          "filename": {
      +            "description": "What the file is called.",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "mimeType": {
      +            "description": "The file's media type.",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "filename",
      +          "mimeType",
      +          "content"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "filename": {
      +            "description": "What the file is called.",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "mimeType": {
      +            "description": "The file's media type.",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "upload": {
      +            "description": "The upload an earlier call's answer gave this file, once the file is put at its address.",
      +            "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"
      +          }
      +        },
      +        "required": [
      +          "filename",
      +          "mimeType",
      +          "upload"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "A file you hold, named alone: the call answers with an address to put it at.",
      +        "properties": {
      +          "filename": {
      +            "description": "What the file is called.",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "mimeType": {
      +            "description": "The file's media type.",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "filename",
      +          "mimeType"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / bcc
      Added value: +{
      +  "description": "Who to blind-copy. The other recipients are not told.",
      +  "items": {
      +    "format": "email",
      +    "pattern": "^(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+(?:\\.(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+)*@(?:(?:(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+\\.)+(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+|\\[(?:\\d{1,3}(?:\\.\\d{1,3}){3}|IPv6:[\\dA-Fa-f:.]+)\\])$",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / cc
      Added value: +{
      +  "description": "Who to copy.",
      +  "items": {
      +    "format": "email",
      +    "pattern": "^(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+(?:\\.(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+)*@(?:(?:(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+\\.)+(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+|\\[(?:\\d{1,3}(?:\\.\\d{1,3}){3}|IPv6:[\\dA-Fa-f:.]+)\\])$",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / chatFiles
      Added value: +{
      +  "description": "Files the person attached in this chat, as the chat itself hands them over - never an address you write: a file anywhere else is refused, and goes in attachments instead.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "download_url": {
      +        "type": "string"
      +      },
      +      "file_id": {
      +        "type": "string"
      +      },
      +      "file_name": {
      +        "type": "string"
      +      },
      +      "mime_type": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "download_url",
      +      "file_id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / uploads
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "address": {
      +        "type": "string"
      +      },
      +      "filename": {
      +        "type": "string"
      +      },
      +      "upload": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "filename",
      +      "upload",
      +      "address"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "id",
      -  "threadId"
      -]
  6. Changed1 schema field changed
    • addedOutput schema / properties / markedAnswered
      Added value: +{
      +  "const": false,
      +  "description": "Present where the mailbox's server would not mark the message this replied to as answered: a search for what waits on the person still finds it there.",
      +  "type": "boolean"
      +}
  7. Changed2 schema fields changed
    • addedInput schema / properties / flag
      Added value: +{
      +  "description": "On an Outlook mailbox, a follow-up flag on these days for the person's own reminder, which the sent copy carries. No other mailbox keeps one.",
      +  "properties": {
      +    "due": {
      +      "description": "The day it is due, as 2026-10-30.",
      +      "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"
      +    },
      +    "start": {
      +      "description": "The day it starts; today where left out.",
      +      "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"
      +    }
      +  },
      +  "required": [
      +    "due"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / importance
      Added value: +{
      +  "description": "How important the message is marked, normal where left out: an Outlook mailbox marks its own, and any other writes the standard headers the recipient's mail app reads.",
      +  "enum": [
      +    "high",
      +    "normal",
      +    "low"
      +  ],
      +  "type": "string"
      +}
  8. Changed2 schema fields changed
    • changedOutput schema / properties / signature / description
      Previous value: -"Which signature went under your words, or why none did: gmail, Gmail's own for the address it went from; lumman, the one Lumman keeps for an Outlook mailbox or one whose provider is imap; none_set, that address has none - settings_send_as_patch sets one, a Gmail one only where that address is the one the mailbox signs in with; left_out, the call asked for none; already_in_words, your words already carried it."New value: +"Which signature went under your words, or why none did: gmail, Gmail's own for the address it went from; lumman, the one Lumman keeps for an Outlook mailbox or one whose provider is imap; none_set, that address has none - settings_send_as_patch sets one, a Gmail one only where that address is the one the mailbox signs in with; left_out, the call asked for none; already_in_words, your words already carried it; company_adds, the person has said the mailbox's company adds its own on its server."
    • changedOutput schema / properties / signature / enum
      Previous value: -[
      -  "gmail",
      -  "lumman",
      -  "none_set",
      -  "left_out",
      -  "already_in_words"
      -]New value: +[
      +  "gmail",
      +  "lumman",
      +  "none_set",
      +  "left_out",
      +  "already_in_words",
      +  "company_adds"
      +]
  9. Changed2 schema fields changed
    • changedOutput schema / properties / signature / description
      Previous value: -"Which signature went under your words, or why none did: gmail, Gmail's own for the address it went from; none_set, that address has none - settings_send_as_patch sets a Gmail one where that address is the one the mailbox signs in with, and an Outlook mailbox, or one whose provider is imap, has none here; left_out, the call asked for none; already_in_words, your words already carried it."New value: +"Which signature went under your words, or why none did: gmail, Gmail's own for the address it went from; lumman, the one Lumman keeps for an Outlook mailbox or one whose provider is imap; none_set, that address has none - settings_send_as_patch sets one, a Gmail one only where that address is the one the mailbox signs in with; left_out, the call asked for none; already_in_words, your words already carried it."
    • changedOutput schema / properties / signature / enum
      Previous value: -[
      -  "gmail",
      -  "none_set",
      -  "left_out",
      -  "already_in_words"
      -]New value: +[
      +  "gmail",
      +  "lumman",
      +  "none_set",
      +  "left_out",
      +  "already_in_words"
      +]
  10. Changed2 schema fields changed
    • addedInput schema / properties / sign
      Added value: +{
      +  "description": "false leaves the signature out; it goes in by default.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / signature
      Added value: +{
      +  "description": "Which signature went under your words, or why none did: gmail, Gmail's own for the address it went from; none_set, that address has none - settings_send_as_patch sets a Gmail one where that address is the one the mailbox signs in with, and an Outlook mailbox, or one whose provider is imap, has none here; left_out, the call asked for none; already_in_words, your words already carried it.",
      +  "enum": [
      +    "gmail",
      +    "none_set",
      +    "left_out",
      +    "already_in_words"
      +  ],
      +  "type": "string"
      +}
  11. Changed1 schema field changed
    • 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-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+(?:\\.(?:[\\w!#$%&'*+/=?^\\x60{|}~-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+)*@(?:(?:(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+\\.)+(?:[A-Za-z0-9-]|[¡-ᙿᚁ-῿​-‧‪-‮‰-⁞⁠-⿿、-﻾＀-￿])+|\\[(?:\\d{1,3}(?:\\.\\d{1,3}){3}|IPv6:[\\dA-Fa-f:.]+)\\])$"
  12. Changed1 schema field changed
    • addedOutput schema / properties / sentCopyKept
      Added value: +{
      +  "const": false,
      +  "type": "boolean"
      +}
  13. Changed2 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  14. Changed1 schema field changed
    • addedOutput schema / properties / refusedRecipients
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  15. Changed5 schema fields changed
    • 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 / id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / threadId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / threadId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  16. First observed

TDQS

A4/5.0
Behavior5/5

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

Beyond the annotations it discloses the idempotency contract (a spent requestId sends nothing again, and the answer distinguishes 'went' from 'may have gone'), the signature placement relative to quoted text when sign=false, and provider-specific limits on carried files. It also implies side effects (write to the thread, optional signature injection) in a way annotations alone would not convey.

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

Conciseness3/5

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

The core action is front-loaded in a clean first sentence, but the remainder is a single dense paragraph of long, heavily subordinated clauses that are hard to parse ('the words close as the person's own would'). Information is valuable but structure and phrasing cost readability.

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?

Given a 15-parameter nested schema, an output schema, and full annotation coverage, the description covers the send-vs-draft decision, idempotency, signature behavior, and file carry limits. It leaves the flag, importance, afterwards, and multi-shape attachment mechanics entirely to the schema, which is acceptable but not exhaustive for a destructive send operation.

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 coverage is 100%, so the baseline is 3. The description adds meaning around signature and quote handling for note/html and echoes the requestId semantics already in the schema, but says nothing about cc, bcc, flag, importance, afterwards, chatFiles, or the four attachment shapes, so it does not meaningfully exceed the schema.

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 opening sentence gives a specific verb and resource with scope: forward one message, with its files, inside the thread it already sits in. It implicitly separates itself from drafts_forward ('mail they asked to prepare is a draft') but never names the sibling, so differentiation requires inference.

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?

It states the selecting condition between sending and drafting ('It sends mail the person asked to go; mail they asked to prepare is a draft') and gives a prerequisite workflow for unverified addresses (look up in past mail via messages_list_all_mailboxes and have the person confirm). No explicit 'do not use when' clause, and the alternative tool is not named.

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.