Skip to main content
Glama

Draft a forward

drafts_forward

Compose a forward of a message as a draft, with the files it carries and inside the thread it already sits in. Nothing leaves the mailbox until the draft is sent. 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.
toNoWho the forward is addressed to. A draft may name nobody yet; it is sent only once it names someone.
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 draft 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.
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 the draft goes from once sent.
linkNo
uploadsNo
threadIdNo
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.
unfilledFieldsNoThe template fields your words hold unfilled, such as {first_name} or [Name], each as written. A send of the draft refuses one held in its words above any message it quotes until drafts_update puts the words each stands for in its place.
previousVersionIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • 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."
    • changedOutput schema / properties / unfilledFields / description
      Previous value: -"The template fields your words hold unfilled, such as {first_name} or [Name], each as written. A send of the draft refuses one held in its words above any message it quotes: put the words each stands for in its place with drafts_update first."New value: +"The template fields your words hold unfilled, such as {first_name} or [Name], each as written. A send of the draft refuses one held in its words above any message it quotes until drafts_update puts the words each stands for in its place."
  2. Changed2 schema fields changed
    • changedInput schema / properties / attachments / description
      Previous value: -"Files to carry: one held by a connected mailbox of the draft'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 the draft goes from once sent.",
      +  "type": "string"
      +}
  4. Changed3 schema fields changed
    • changedInput schema / properties / to / description
      Previous value: -"Who the forward is addressed to."New value: +"Who the forward is addressed to. A draft may name nobody yet; it is sent only once it names someone."
    • removedInput schema / properties / to / minItems
      Removed value: -1
    • changedInput schema / required
      Previous value: -[
      -  "mailbox",
      -  "messageId",
      -  "to"
      -]New value: +[
      +  "mailbox",
      +  "messageId"
      +]
  5. Changed2 schema fields changed
    • addedInput schema / properties / attachments
      Added value: +{
      +  "description": "Files to carry: one held by a connected mailbox of the draft'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 / 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"
      +}
  6. Changed1 schema field changed
    • addedOutput schema / properties / unfilledFields
      Added value: +{
      +  "description": "The template fields your words hold unfilled, such as {first_name} or [Name], each as written. A send of the draft refuses one held in its words above any message it quotes: put the words each stands for in its place with drafts_update first.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  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 draft 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. Changed3 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-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:.]+)\\])$"
    • 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-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:.]+)\\])$"
    • 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. Changed2 schema fields changed
    • 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"
      -]
  13. Changed2 schema fields changed
    • addedOutput schema / properties / previousVersionId
      Added value: +{
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "id",
      -  "link"
      -]New value: +[
      +  "id"
      +]
  14. 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"
  15. Changed3 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 / 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,}$"
  16. First observed

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false), it discloses the key traits an agent cannot infer: nothing is transmitted until sent, an unverified address must be confirmed before being written, signatures land below the agent's words and above the quote, sign=false suppresses them, flag works only on Outlook, and from-address latitude differs by provider (Gmail verified aliases vs. Outlook's own address only).

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?

Purpose is front-loaded in the first sentence, which is good. But the remainder is a single dense paragraph of heavily nested em-dash clauses ('the newest found with to: and their address whose sender is an address mailboxes_list names') that are hard to parse on first read; the oblique phrasing costs more comprehension than the word count saves.

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?

With 13 parameters, nested attachment variants, and an output schema already declaring return values, the description covers the non-obvious decision points: address confirmation, signature placement, provider-dependent from behavior, and thread placement. Return shape is correctly left to the output schema; only a brief note on draft state after creation is arguably thin.

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% and the per-parameter descriptions are themselves unusually rich (chatFiles vs attachments, contentId inline images, the upload-address handshake), so the schema carries the load. The description adds little param-level detail beyond the sign/signature rule and the from-address provider constraints, which are partly restated. Baseline 3 is appropriate.

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 ('Compose a forward of a message as a draft') and adds two scoping qualifiers — the files it carries and the thread it already sits in. Combined with 'Nothing leaves the mailbox until the draft is sent,' an agent can distinguish this from messages_forward (sends now) and drafts_create (new message) without opening any schema.

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

Usage Guidelines4/5

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

Gives concrete operating procedure: unresolved addresses must be looked up via messages_list_all_mailboxes with from:/to: at headers view and confirmed by the person before being written. It does not explicitly name drafts_create or messages_forward as alternatives, so the routing is implied by 'as a draft' rather than stated.

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.