Multi Mail
Server Details
Gmail, Outlook, Hotmail, Microsoft 365, iCloud, Fastmail, other IMAP mailboxes: search, read, send.
- Status
- Healthy
- Uptime
- 78.8% over 43 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- lumman-lab/multi-mail
- GitHub Stars
- 0
- Server Listing
- Multi Mail
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 35 tools
Each tool has a distinct resource+action target, and the deliberate draft-vs-send twins (drafts_reply vs messages_reply, drafts_forward vs messages_forward, drafts_create vs messages_send) are explicitly distinguished by 'nothing leaves the mailbox until sent'. The main residual overlap is threads_modify vs labels_update vs sweeps_apply (all can move mail into folders), which is resolvable but requires reading long descriptions. No true duplicates exist.
All snake_case, grouped by clear nouns prefixes (drafts_, labels_, messages_, threads_, settings_, sweeps_) which is very predictable. The only wrinkle is verb placement inside the settings_ group: settings_filters_create (prefix_noun_verb) versus settings_get_vacation / settings_update_vacation / settings_send_as_get (prefix_verb_noun), plus messages_attachments_get. Minor inconsistency, still readable.
35 tools is heavy, well past the comfortable band, and some granularity feels expandable (three separate sweep tools, five settings_send_as/vacation tools). However the domain genuinely spans three provider families and several sub-domains (threads, drafts, labels, filters, signatures, cleanup), and almost every tool maps to a distinct operation rather than padding. Borderline heavy rather than bloated.
Coverage is unusually complete: full read/search/list, draft CRUD plus send, send/reply/forward, thread archive/trash/untrash/modify/get, label CRUD, filter CRUD, vacation get/update, signature get/patch/find, bulk cleanup preview/apply/put-back, and attachment retrieval. Gaps are minor: no way to list or get drafts directly (must be inferred via folder search), no permanent delete/purge, and no tool to add or reconnect a mailbox even though mailboxes_list exposes a 'needs reconnecting' state.
Available Tools
35 toolsdrafts_createDraft a messageAInspect
Compose an email in a connected mailbox and keep it there as a draft. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Who to copy. | |
| to | No | Who the message is addressed to. A draft may name nobody yet; it is sent only once it names someone. | |
| bcc | No | Who to blind-copy. The other recipients are not told. | |
| body | No | The message text; html alone is enough, its text read from it. | |
| flag | No | 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. | |
| from | No | 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. | |
| html | No | The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it. | |
| sign | No | false leaves the signature out; it goes in by default. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| subject | Yes | The subject line. | |
| chatFiles | No | 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. | |
| importance | No | 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. | |
| attachments | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| from | No | The address the draft goes from once sent. |
| link | No | |
| uploads | No | |
| threadId | No | |
| signature | No | 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. |
| unfilledFields | No | 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. |
| previousVersionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring a non-destructive write, the description adds useful behavioral detail: the draft remains in the mailbox, unconfirmed addresses should not be written to, and signatures are inserted by default unless sign=false. It still does not cover error or permission behavior, but the added context is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, and the content is information-rich, but the description is a dense single paragraph with long nested clauses. It is not wasteful, yet it is harder to parse than necessary for an agent deciding how to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, rich annotations, and full schema description coverage, so the description need not explain return values or every parameter. It adds important draft and signature context, though it could more explicitly distinguish this tool from sibling draft operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters thoroughly. The description adds some meaning around sign/from signature behavior, but it does not need to compensate for missing parameter documentation and does not explain most of the 13 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Compose an email in a connected mailbox and keep it there as a draft.' This makes clear it creates a draft rather than sending, but it does not explicitly differentiate from siblings such as drafts_update or drafts_send.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides workflow guidance for finding an address in past mail and for handling signatures, including 'sign false leaves it off a terse note.' However, it does not explicitly say when to use this instead of drafts_update or drafts_send, leaving the sibling selection mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drafts_deleteDiscard a draftADestructiveInspect
Move a draft to the bin, where its provider keeps it until its own retention ends it: threads_untrash with the messageId this answers and scope message brings it back as a draft. Only a draft not yet sent moves: a message already sent or received, or one a send through Lumman already named, is refused, and nothing already sent is touched.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id a draft tool answered, or the draftId a search or a read answered. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| discarded | Yes | |
| messageId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, so the bar is lower — yet the description adds real behavioral context: the draft goes to the provider bin, remains under provider retention, is restorable to a draft via threads_untrash with the returned messageId, and is refused for already-sent messages. That is precisely the mutation detail an agent cannot get from the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is correctly front-loaded in the first clause, but the remainder is a dense colon-and-dash chain that fuses the restore path, the retention caveat, and the refusal rules into one long sentence. Every fact is relevant, yet the packing makes the restore instructions easy to misread.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with an output schema, the description covers what an agent needs: what happens to the object, when the call is refused, and how to undo it. The one soft spot is the unexplained `messageId` reference, which is never tied back to this tool's returned id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both `id` and `mailbox` are already documented, and the baseline of 3 applies. The description does not add syntax or format guidance for either parameter; its only reference is `messageId`, which is not a parameter of this tool and could momentarily confuse an agent about what to pass.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: "Move a draft to the bin." It also names the fallback/sibling mechanism (threads_untrash) and the scope value needed, so an agent can separate this from threads_trash or drafts_update without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit eligibility rules are given: only a draft not yet sent moves; sent or received messages are refused, and a message already named by a send through Lumman is refused too. It also tells the agent how to reverse the action. What's missing is a direct routing statement against nearby siblings such as drafts_update or threads_trash.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drafts_forwardDraft a forwardAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Who to copy. | |
| to | No | Who the forward is addressed to. A draft may name nobody yet; it is sent only once it names someone. | |
| bcc | No | Who to blind-copy. The other recipients are not told. | |
| flag | No | 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. | |
| from | No | 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. | |
| html | No | Your 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. | |
| note | No | Your own words, above the message forwarded. | |
| sign | No | false leaves the signature out; it goes in by default. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| chatFiles | No | 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. | |
| messageId | Yes | The provider's own identifier. | |
| importance | No | 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. | |
| attachments | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| from | No | The address the draft goes from once sent. |
| link | No | |
| uploads | No | |
| threadId | No | |
| signature | No | 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. |
| unfilledFields | No | 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. |
| previousVersionId | No |
TDQS
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.
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.
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.
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.
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.
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.
drafts_replyDraft a replyAInspect
Compose a reply to a message as a draft, inside the thread it answers and quoting it below the reply: to whoever wrote it - to whom it was sent, where this mailbox wrote it - or with replyAll to everyone on it. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Who to copy, instead of those replyAll copies. | |
| to | No | Who the reply goes to, instead of whoever wrote the message - whom it was sent to, where this mailbox wrote it - and, with replyAll, those it was sent to. | |
| bcc | No | Who to blind-copy. The other recipients are not told. | |
| body | No | The reply text; html alone is enough, its text read from it. | |
| flag | No | 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. | |
| from | No | The address it goes from. Left out, a reply goes from the address its message was sent to where Gmail lists that one, else from the mailbox's default. 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. | |
| html | No | The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it. | |
| sign | No | false leaves the signature out; it goes in by default. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| replyAll | No | true addresses everyone the message was sent to and copied too - never its blind copies, never this mailbox. | |
| chatFiles | No | 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. | |
| messageId | Yes | The provider's own identifier. | |
| importance | No | 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. | |
| attachments | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| from | No | The address the draft goes from once sent. |
| link | No | |
| uploads | No | |
| threadId | No | |
| signature | No | 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. |
| unfilledFields | No | 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. |
| previousVersionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the operation creates a draft rather than sending, how unknown addresses are resolved and confirmed, how signatures are placed, and how sender address selection differs by provider. These are substantive behavioral details an agent could not infer from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a long, dense paragraph with nested dashes and parenthetical clauses that make it hard to parse. The purpose is front-loaded, but the remaining prose is far from concise and includes complex procedural guidance that could be structured more clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 14-parameter schema, rich parameter descriptions, and an output schema, the description covers the critical non-obvious behavior: draft-only semantics, recipient selection, signature handling, and sender address constraints. It does not explain every parameter, but the schema already does so in detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 14 parameters in detail. The description adds some recipient and signature context, but much of that overlaps with the schema's own parameter descriptions, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause states a specific verb and resource: compose a reply to a message as a draft, threaded and quoting the original. It distinguishes draft creation from sending, but it does not explicitly compare itself with sibling tools such as messages_reply or drafts_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it by saying 'Nothing leaves the mailbox until the draft is sent,' and it explains replyAll, cc, and signature choices. However, it does not explicitly name alternatives or state when another draft or reply tool should be chosen instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drafts_sendSend a draftADestructiveIdempotentInspect
Send a draft. It leaves the mailbox and consumes the draft. Only a draft is sent: a message already sent or received is refused, and nothing leaves. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id a draft tool answered, or the draftId a search or a read answered. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| requestId | Yes | Your own id for this send, new for every message. One whose send went or may have gone sends nothing again. | |
| afterwards | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| accepted | No | |
| threadId | Yes | |
| messageId | No | |
| signature | No | 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. |
| afterwards | No | 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. |
| sentCopyKept | No | |
| markedAnswered | No | 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. |
| refusedRecipients | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/open-world annotations it discloses that the draft is consumed, that the send is an external irreversible act ("leaves the mailbox"), the requestId idempotency contract (a spent id sends nothing again and the answer reports whether the send went or may have gone), and that afterwards runs under another tool's permission yet the mail still goes if that step fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The effect and the draft-only constraint are front-loaded, and every sentence carries substance. The framing line about mail "asked to go" vs. "asked to prepare" is slightly discursive for the value it adds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema covering return values, the description still supplies what an agent actually needs: the draft-only precondition, the consumption of the draft, the idempotency rule, and the failure semantics of the afterwards option.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the descriptions already explain id, mailbox, requestId dedup, and the afterwards side effect, so the schema does the heavy lifting. The description's requestId sentence largely restates what the schema already says, adding only that the response reports whether the send went or may have gone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Send a draft. It leaves the mailbox and consumes the draft." gives a specific verb and resource plus its effect, and "Only a draft is sent: a message already sent or received is refused" separates it from messages_send without requiring the schemas to be opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It draws the intended boundary ("mail the person asked to go" vs. "mail they asked to prepare") and states the hard precondition that the target must still be a draft. It never names messages_send explicitly as the route for composing new mail, so the routing is clear but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drafts_updateEdit a draftADestructiveInspect
Change a draft in a connected mailbox. A field the call leaves out stays as the draft has it. On Gmail a new subject moves the draft out of its conversation into one of its own; on Outlook the answer names the conversation the draft is kept in. A mailbox whose provider is imap keeps the edited draft under a new id the answer names, and the old id then reads nothing; an old version its server did not remove stays in Drafts, named as previousVersionId. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Who to copy. | |
| id | Yes | The id a draft tool answered, or the draftId a search or a read answered. | |
| to | No | Who the message is addressed to. | |
| bcc | No | Who to blind-copy. The other recipients are not told. | |
| body | No | Your own words. They replace everything the draft says above the message it quotes, a signature there included; that quote stays as written, its formatting and pictures with it, and a draft quoting in HTML stays HTML. Given without html on a draft quoting nothing, the draft becomes plain text. | |
| html | No | Your own words as HTML, in place of the draft's own above any quote; given without body, their plain-text version is read from them. An Outlook mailbox keeps only the HTML and writes the plain version from it. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| subject | No | The subject line. | |
| chatFiles | No | 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. Named, they and attachments together replace the files the draft holds: one it holds stays only where attachments names it again. | |
| attachments | No | Files to carry, each held by any connected mailbox, written out or 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. Named, they replace the ones it holds - never the pictures inside its words - and an empty list removes them all. An Outlook draft takes on the new files before it gives up the old, so a replacement stopped midway is reported and may leave both. An Outlook draft sent while it is rewritten may lose its old files from the sent copy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| from | No | The address the draft goes from once sent. |
| link | No | |
| uploads | No | |
| threadId | No | |
| signature | No | 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. |
| unfilledFields | No | 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. |
| previousVersionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: omitted fields are preserved, Gmail and Outlook handle subject/conversation changes differently, imap drafts move to a new id, the old id stops resolving, and a previous version may remain as previousVersionId. It also discloses attachment replacement semantics and Outlook-specific caveats, which is rich transparency for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, but the description is a dense, meandering paragraph with archaic phrasing and many semicolon-linked caveats. Most content is relevant to a complex mutation, but the structure makes it harder to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, full schema coverage, annotations covering destructive behavior, and an output schema, the description is largely complete about side effects and provider-specific outcomes. It could be stronger with explicit routing to sibling draft tools and clearer permission expectations, but the behavioral picture is sufficiently detailed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description still adds useful parameter meaning, especially that a new subject can move a Gmail draft to its own conversation and that omitted fields retain their existing values, going beyond the schema's short field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: changing an existing draft in a connected mailbox. It distinguishes the operation from creating or sending a draft through the word 'Change' and the resource 'draft', but it does not explicitly differentiate from sibling tools such as drafts_create or drafts_send.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Change a draft' and by details such as omitted fields staying unchanged, but the description never explicitly says when to use this tool instead of drafts_create, drafts_send, drafts_reply, or drafts_delete. It gives some procedural guidance around confirming an unlisted address, but no clear exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
labels_createCreate a labelAInspect
Create a label in a connected mailbox and answer the id it is applied by. In a Gmail mailbox, and as a folder in one whose provider is imap or in an Outlook mailbox, a / nests it under the label before it, made first where missing. An Outlook mailbox makes a folder where the name holds a / or folder is true, and a category otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the label is called. | |
| folder | No | In an Outlook mailbox, true makes a folder rather than a category. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| type | No | |
| messagesTotal | No | |
| messagesUnread | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only, non-destructive mutation. The description adds important behavioral context beyond the annotations, especially that a slash nests labels and that missing parent labels are created first, and it distinguishes Outlook folders from categories. It does not cover duplicate-name behavior or failure modes, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and clear, but the second sentence is grammatically tangled and difficult to parse: 'In a Gmail mailbox, and as a folder in one whose provider is imap or in an Outlook mailbox, a / nests it...' The content is useful, but the structure could be cleaner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and annotations present, the description does not need to explain return values or safety hints. It covers the key mailbox-provider semantics and the parent-label creation side effect, though it omits duplicate handling and error behavior, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning beyond the schema by explaining that slash characters create nested labels and that in Outlook a name containing a slash or folder=true creates a folder rather than a category.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create a label in a connected mailbox.' It also states that the tool returns the label id, and its create semantics clearly distinguish it from sibling tools such as labels_update, labels_delete, and labels_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is for creating labels and explains provider-specific behavior, but it does not explicitly say when to use it instead of labels_update or labels_list, nor does it state when not to use it. Usage is inferable but not directly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
labels_deleteDelete a labelADestructiveIdempotentInspect
Delete one label, by its id from labels_list. No message is deleted: in a Gmail connected by Google sign-in the label comes off every message; an Outlook mailbox's category leaves its list, and the messages that carried it keep its name. A mailbox whose provider is imap, a Gmail one included, deletes only a folder holding no mail and no folder, and so does an Outlook mailbox.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A label id from labels_list. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description goes well beyond them by disclosing that no messages are deleted and that effects differ by provider (Gmail label removed from every message, Outlook category removed from the list, messages keep the name). The final sentence about imap is worded so ambiguously ('deletes only a folder holding no mail and no folder') that the critical edge case is hard to parse, which keeps this from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded and the 'No message is deleted' clause earns its place, but the provider sentence is dense and the trailing imap sentence is convoluted enough that a reader must re-parse it. That sentence arguably fails to earn its place in its current form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the destructive/idempotent profile and an output schema present, the description supplies the remaining piece an agent needs: what actually happens to messages under each provider. The only gap is the muddled imap behavior, which leaves one provider's outcome uncertain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented; the description only reinforces that id comes from labels_list. It adds no format, constraint, or failure-mode detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one label') plus the identifier source ('by its id from labels_list'), which separates it cleanly from labels_create and labels_update. An agent knows exactly what the tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: the id must come from labels_list, and it explains the message-level consequences of deleting. It does not explicitly say when to prefer labels_update over delete, nor does it warn to confirm before invoking a destructive call, so no true exclusions are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
labels_listList labelsARead-onlyInspect
List the labels a connected mailbox holds, by the id each is applied by. A mailbox whose provider is imap holds its folders as labels, nested by /, beside UNREAD, STARRED and SPAM. An Outlook mailbox's labels are its categories, of type category, and its own folders, of type folder, each named by its path with how many messages it holds and how many are unread; Outlook's own folders - the inbox, sent mail, drafts, Deleted Items, Junk and the like - are not labels. A Gmail connected by Google sign-in also holds Gmail's own labels, of type system, among them IMPORTANT, Gmail's mark of what matters, and its inbox tabs as CATEGORY_PERSONAL, CATEGORY_SOCIAL, CATEGORY_PROMOTIONS, CATEGORY_UPDATES and CATEGORY_FORUMS, which threads_modify applies and removes as it does the person's own.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| labels | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the description is free to add the genuinely useful part: how labels differ per provider (IMAP folders, Outlook categories/folders with counts, Gmail system labels and CATEGORY_* tabs) and which Outlook folders are excluded. It stops short of describing pagination or ordering, but the provider semantics are real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The information is front-loaded correctly (what it lists, then per-provider semantics), but it is one dense paragraph with run-on sentences such as the Outlook sentence stacking path, counts and unread counts. Phrases like "Gmail's mark of what matters" are filler that dilute an otherwise technical description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, and the description instead supplies the interpretive context an agent needs to read label ids and types. Pagination and result limits are the only notable omissions for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single well-described 'mailbox' parameter (name or email), so baseline is 3. The description reinforces the notion of a 'connected mailbox' with provider-dependent behavior but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: listing the labels a mailbox holds, keyed by label id. It is unambiguous against the mutation siblings (labels_create/update/delete), but it never explicitly contrasts itself with those siblings or with threads_get which also surfaces label ids.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer from 'List' and readOnlyHint that this is the discovery step, and the closing reference to threads_modify hints at how labels are consumed. There is no explicit 'use this before labels_update or threads_modify to obtain ids' statement, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
labels_updateEdit a labelADestructiveIdempotentInspect
Rename a label, recolour it, or both. The id comes from labels_list. A new name carries the labels nested under it by / with it. An Outlook mailbox's category takes only a new colour, as Microsoft allows, and its folder only a new name, given where it is and keeping its id. A mailbox whose provider is imap renames its folder, which takes no colour, and answers the label's new id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A label id from labels_list. | |
| name | No | Its new name. | |
| color | No | Its new colour. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| type | No | |
| messagesTotal | No | |
| messagesUnread | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and idempotent behavior, but the description adds meaningful non-obvious effects: a new name carries nested labels, Outlook category/folder constraints apply, and an IMAP rename answers the label's new id. These details go well beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the provider-specific cases are packed efficiently into four sentences with little waste. The phrasing 'by / with it' is slightly awkward, and the provider detail density keeps it from being maximally crisp.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a provider-sensitive update tool, the description covers the key cases and relies appropriately on the schema for parameter details and the output schema for return values. No major behavioral or usage omission remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters and the colour enum. The description still adds provider-dependent meaning for name and colour, though it does not add syntax or enum details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Rename a label, recolour it, or both') and clearly identifies an edit operation. It references labels_list as the id source but does not explicitly distinguish this tool from labels_create or labels_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite that the id comes from labels_list and gives provider-specific applicability rules, such as Outlook categories taking only a new colour and Outlook folders only a new name. It does not explicitly say when not to use the tool or name create/delete as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mailboxes_listList mailboxesARead-onlyInspect
List the connected mailboxes that answer - Gmail, Outlook.com and Hotmail, Microsoft 365 and any other email account read over IMAP - each by the name a tool's mailbox input takes, with its service, whether it is a personal or a work account, the search language it reads, whether it needs reconnecting, the tools its provider does not offer and those the person turned off, and its inbox's counts. It counts no action.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mailboxes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint true, destructiveHint false, openWorldHint false), so the description only needs to add context, and it does: it discloses the exact per-mailbox attributes returned, including reconnect-needed state and provider/toggle limitations. "It counts no action" adds a behavioral trait not present in any structured field, though the phrasing is opaque enough to be only partly useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single long run-on sentence built from dashes and comma-separated clauses, which makes the field inventory hard to parse at a glance. The verb and resource are front-loaded, which is good, but the trailing enumeration of returned attributes is dense and could have been a compact list or omitted given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with full annotation coverage and an output schema, the essential information is present and no critical gap exists. The main omissions are the relationship to messages_list_all_mailboxes and clarification of the cryptic "counts no action" claim, and much of the text duplicates what the output schema already declares.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter meaning to add and the baseline of 4 would normally apply. The description instead spends its words on return-value attributes, which are already covered by the output schema, so it neither compensates nor harms — a middling 3 reflects the absence of any parameter-relevant contribution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"List the connected mailboxes" gives a specific verb and resource, then enumerates the providers covered (Gmail, Outlook.com/Hotmail, Microsoft 365, generic IMAP), so the scope is unambiguous. It stops short of distinguishing itself from the sibling messages_list_all_mailboxes, which an agent could plausibly confuse with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "each by the name a tool's mailbox input takes" implicitly tells the agent to call this first to discover valid mailbox identifiers for other tools, which is useful usage context. However, there is no explicit when-to-use statement, no exclusion, and no mention of the messages_list_all_mailboxes alternative, so the guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messages_attachments_getRead an attachmentARead-onlyInspect
Read one attachment of a message. The answer is what it says, as plain text; with as original it is the file itself, base64, or a picture too large for one answer shrunk to fit. messages_get and threads_get name a message's attachments and their sizes. Either answer names a link the original is served at whole for 15 minutes after it is given, to a plain GET carrying no credential. From a terminal, curl --fail-with-body -o "" fetches it; a refused fetch exits non-zero and leaves its reason in that file.
| Name | Required | Description | Default |
|---|---|---|---|
| as | No | text, the default: what the file says. original: the file itself, byte for byte, or a picture too large for one answer shrunk to fit. | |
| id | Yes | An attachment id, as a message read named it. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| messageId | Yes | The message's id, as a search or a read answered it. | |
| continuation | No | Where the words resume, as the last part read named it. The original always comes whole. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| size | Yes | |
| text | No | |
| shrunk | No | Where a picture's original is more than one answer carries: the JPEG data holds in its place, shrunk to fit. |
| address | No | |
| charset | No | |
| outcome | No | |
| filename | Yes | |
| mimeType | Yes | |
| returned | Yes | |
| messageId | Yes | |
| attachmentId | Yes | |
| continuation | No | |
| contentFormat | Yes | |
| sizePrecision | Yes | |
| carriesPayload | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/non-destructive annotations: discloses that text mode returns plain text, original returns base64 bytes or a downscaled picture, and that the answer carries a link valid for 15 minutes served to a credential-free GET. Even supplies a concrete curl invocation with its failure semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and mode selection before the link/curl detail, and every sentence carries information. The prose is somewhat run-on and the curl paragraph is dense, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers mode selection, size/continuation behavior, how the id is obtained, and how to retrieve the original via the expiring link — enough that an agent can call it correctly even though an output schema also exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds value by clarifying what `as` yields in each mode (base64, shrunk picture) and that `continuation` only affects text mode while the original always comes whole.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read one attachment of a message") and implicitly distinguishes itself from messages_get/threads_get, which only name attachments and sizes. An agent can tell exactly which tool fetches attachment bytes versus which lists them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the prerequisite path explicitly ("messages_get and threads_get name a message's attachments and their sizes"), so the agent knows how to obtain the id. It also explains the text-vs-original choice and the fallback for oversized pictures, though it gives no explicit exclusions for when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messages_forwardForward a messageADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Who to copy. | |
| to | Yes | Who the forward is addressed to. | |
| bcc | No | Who to blind-copy. The other recipients are not told. | |
| flag | No | 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. | |
| from | No | 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. | |
| html | No | Your 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. | |
| note | No | Your own words, above the message forwarded. | |
| sign | No | false leaves the signature out; it goes in by default. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| chatFiles | No | 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. | |
| messageId | Yes | The provider's own identifier. | |
| requestId | Yes | Your own id for this send, new for every message. One whose send went or may have gone sends nothing again. | |
| afterwards | No | 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. | |
| importance | No | 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. | |
| attachments | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| from | No | The address it went from. |
| uploads | No | |
| accepted | No | |
| threadId | No | |
| messageId | No | |
| signature | No | 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. |
| afterwards | No | 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. |
| sentCopyKept | No | |
| markedAnswered | No | 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. |
| refusedRecipients | No |
TDQS
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.
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.
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.
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.
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.
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.
messages_getRead a messageBRead-onlyInspect
Read one message in a connected mailbox, with its headers and its body. A message whose recipients one answer cannot carry names the first that fit, omittedRecipients counting the rest. The times it answers with carry their offset in the person's own time zone, which the answer names under now beside their time now in it - UTC where the person has stored no zone, as now says.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The message's id, as a search or a thread read answered it, or a draft's own id. | |
| view | No | full, the default, carries each message's text and attachments; summary leaves those out; headers leaves out the subject and snippet too. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cc | Yes | |
| id | Yes | |
| to | Yes | |
| bcc | Yes | |
| now | Yes | The person's own time zone, in which every time this answer gives is written, and their time now in it. |
| body | No | |
| date | Yes | |
| from | Yes | |
| link | No | |
| draft | Yes | |
| focus | No | Outlook alone, on a message in the inbox: whether it sits in Focused or Other. |
| folder | No | |
| listId | No | On a message read alone, the mailing list it came from, as its List-Id header names it. |
| unread | Yes | |
| draftId | Yes | |
| flagged | No | |
| hasFile | No | Whether the message carries a file. |
| replyTo | No | On a message read alone, where a reply goes in place of the sender, as its Reply-To names it. |
| snippet | No | |
| subject | No | |
| answered | No | |
| labelIds | Yes | |
| threadId | Yes | |
| important | No | Whether it is marked important: Gmail's own importance mark, Outlook's high importance. A password mailbox other than a Gmail keeps none. |
| bodyFormat | No | |
| categories | No | |
| invitation | No | Whether it invites to a meeting or updates one; a cancellation or an answer to one does not. |
| attachments | No | |
| mailingList | No | Whether it names a mailing list it came from, in a List-Id or List-Unsubscribe header. |
| unsubscribe | No | On a message read alone, where its sender takes requests to leave the list, as its List-Unsubscribe header names them - shown, never followed. |
| authentication | No | On a message read alone, whether its sender passed authentication as the server that received it judged it, never as Lumman would: that server's DMARC result, on Outlook Microsoft's composite verdict - pass where the From address is proven. Absent where no server Lumman knows for the provider wrote one. |
| omittedCharacters | No | |
| omittedRecipients | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring a safe read-only, non-destructive, closed-world operation, the description adds useful behavioral context beyond those fields. It explains recipient truncation via omittedRecipients and timezone-offset formatting in the response, though it does not cover permission requirements or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with a clear first sentence, but the later sentences about omittedRecipients and timezone formatting are convoluted and harder to parse than necessary. The content earns its place, but the phrasing is not concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a complete input schema, an output schema, and annotations covering safety, so the description need not explain every return field. It still adds context about recipient truncation and timezone representation, and is largely complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the id, view, and mailbox semantics are already documented in the schema. The description does not add parameter-specific syntax or selection guidance beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states a specific verb and resource: reading one message in a connected mailbox, including headers and body. It distinguishes a single-message operation from list-style siblings through the phrase 'one message,' but it does not explicitly name alternatives such as messages_list or threads_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by saying it reads one message, but it gives no explicit guidance about when to choose this over messages_list, threads_get, or messages_attachments_get. There are no exclusions, prerequisites, or alternative-selection cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messages_listSearch a mailboxARead-onlyInspect
Search one connected mailbox in its own provider's query language, Gmail's or Outlook's, narrowed by the inputs beside q, or list its mail by those inputs alone. An Outlook mailbox without q reads one folder, the inbox unless folder names another, in order; with q it searches every folder and leaves off each page what the other inputs rule out, filtered counting them, so a short page can have more after it, and it answers no match past its 1,000th, ceiling marking the page where it stopped. Any other mailbox whose provider is imap leaves off each page what an instant, a size or has:attachment rules out, filtered counting them, and names under notSearched each folder the call had no time left to search. A message whose recipients one answer cannot carry names the first that fit, omittedRecipients counting the rest. The times it answers with carry their offset in the person's own time zone, which the answer names under now beside their time now in it - UTC where the person has stored no zone, as now says.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | A Gmail mailbox, whatever its provider, reads Gmail's search operators: from:, to:, cc:, subject:, is:unread, is:starred, in:sent, has:attachment, filename:pdf, after:2026/01/31, before:, newer_than:7d, larger:5M, OR, -word and ( ). An Outlook mailbox reads Microsoft's keyword query language - from:, to:, cc:, subject:, body:, received:, hasAttachments:true, plain words and quoted phrases, AND, OR and NOT in capitals - and never a filter expression such as isRead eq false. A few distinctive words, with OR between alternatives, miss less than a copied subject line or sentence. Any other mailbox whose provider is imap reads only from:, to: and cc: (never me), subject:, plain words and quoted phrases, -word or -"a phrase" leaving it out, is:unread, one run of OR between any of those (as a OR b OR c), has:attachment, and larger: and smaller: in bytes or as 500K or 5M, after: and before: as 2026/01/31, newer_than: in days, months or years, and one in: or label: naming one folder, by the name labels_list gives a label of type user or as inbox, sent, archive, drafts, spam or trash, a name holding a space quoted and a quote or backslash inside the quotes taking a backslash before it, with no AND or NOT, and is searched by message in every folder but the bin and junk. after: and before: written as a bare date open at midnight in the person's own time zone, save in an Outlook mailbox's query, whose dates Microsoft reads itself. | |
| by | No | message, the default, answers each matching message; thread answers each matching thread with every message in it. | |
| view | No | summary, the default, carries each message's subject and snippet; headers leaves both out; compact, the lightest page, carries only each message's id, threadId, sender, date, unread mark, subject and the first 100 characters of its snippet. | |
| after | No | Only mail that arrived at or after this instant, with its offset, as 2026-10-20T00:00:00Z. | |
| focus | No | Outlook alone: focused answers the mail Outlook sorts into Focused, other the mail in Other. Outlook sorts its inbox alone, and reads mail in every other folder as focused. | |
| order | No | newest, the default, answers the newest mail first; oldest the oldest. Gmail answers newest first alone, and so does Outlook with q. | |
| before | No | Only mail that arrived before this instant, written and read as after is. | |
| folder | No | One folder to search: inbox, sent, archive, drafts, deleted or junk, or a folder's id from labels_list - on a Gmail connected by Google sign-in any label's, on Outlook a folder's and never a category's. A mailbox whose provider is imap takes no folder in q beside it. | |
| unread | No | true answers unread mail alone, false read mail alone. | |
| flagged | No | true answers flagged mail alone - starred on Gmail, flagged on Outlook - false the rest. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| pageToken | No | The nextPageToken of the page before, asked with every other input the same. Outlook, and a Gmail whose provider is imap, page threads by their matching messages, so a thread can recur on a later page. | |
| maxResults | No | How many results to take, 10 where left out. |
Output Schema
| Name | Required | Description |
|---|---|---|
| now | Yes | The person's own time zone, in which every time this answer gives is written, and their time now in it. |
| more | Yes | |
| shown | Yes | |
| ceiling | No | |
| omitted | No | |
| threads | No | |
| filtered | No | |
| messages | No | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| unreadable | Yes | |
| notSearched | No | |
| nextPageToken | Yes | |
| screeningWait | No | Present where a message is marked not_yet_screened: the seconds to wait before reading those messages by their ids. |
| resultSizeEstimate | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint false, openWorldHint false), and the description goes well beyond them with pagination quirks ('a short page can have more after it'), the Outlook 1,000-result ceiling, imap notSearched reporting for folders not reached, and omittedRecipients truncation. None of this repeats the annotations and none of it contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every clause carries information, but the prose is baroque and heavily post-modified ('the times it answers with carry their offset...'), making it slow to parse. Size is defensible for a 13-parameter multi-provider tool, yet the phrasing costs readability without adding precision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description names the notable response fields (notSearched, omittedRecipients, ceiling, now) that an agent must interpret to page correctly or explain truncated results. Provider-specific behavioral divergences for Gmail, Outlook and imap are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning on top: that an Outlook mailbox without q reads one folder (inbox unless folder names another) while with q it searches every folder, which is a semantic interaction between q, folder and the provider that the schema does not state. The rest of the parameter detail remains in the schema, so it is not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Search one connected mailbox in its own provider's query language... or list its mail by those inputs alone.' The phrase 'one connected mailbox' implicitly separates it from the sibling messages_list_all_mailboxes, and the q/keyword split makes the two modes of use unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how the two modes work (query language vs. filter inputs alone) and gives per-provider scoping rules, but it never explicitly says when to pick this tool over messages_list_all_mailboxes, threads_get, or messages_get. Usage is implied by scope rather than stated as a decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messages_list_all_mailboxesSearch every mailboxARead-onlyInspect
Search every mailbox you have connected - every email account at once - in one call, or only those mailboxes names. The answer names the mailbox each result came from, names any mailbox it could not search, and is merged newest first by when each message arrived, a thread by its newest. A message whose recipients one answer cannot carry names the first that fit, omittedRecipients counting the rest. One search for what arrived after: the time of the last look is the cheapest way to watch for new mail. The times it answers with carry their offset in the person's own time zone, which the answer names under now beside their time now in it - UTC where the person has stored no zone, as now says.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | A Gmail mailbox, whatever its provider, reads Gmail's search operators: from:, to:, cc:, subject:, is:unread, is:starred, in:sent, has:attachment, filename:pdf, after:2026/01/31, before:, newer_than:7d, larger:5M, OR, -word and ( ). An Outlook mailbox reads Microsoft's keyword query language - from:, to:, cc:, subject:, body:, received:, hasAttachments:true, plain words and quoted phrases, AND, OR and NOT in capitals - and never a filter expression such as isRead eq false. A few distinctive words, with OR between alternatives, miss less than a copied subject line or sentence. Any other mailbox whose provider is imap reads only from:, to: and cc: (never me), subject:, plain words and quoted phrases, -word or -"a phrase" leaving it out, is:unread, one run of OR between any of those (as a OR b OR c), has:attachment, and larger: and smaller: in bytes or as 500K or 5M, after: and before: as 2026/01/31, newer_than: in days, months or years, and one in: or label: naming one folder, by the name labels_list gives a label of type user or as inbox, sent, archive, drafts, spam or trash, a name holding a space quoted and a quote or backslash inside the quotes taking a backslash before it, with no AND or NOT, and is searched by message in every folder but the bin and junk. Every mailbox is asked these alike, in its own provider's language or applied to what it answers: from:, to: and cc: (never me), subject:, plain words and quoted phrases, OR between any of those (as a OR b OR c), -word or -"a phrase" leaving it out, is:unread, has:attachment, larger: in bytes or as 500K or 5M, in:trash or in:spam searching the bin or spam alone, and dates: after: and before: as 2026/01/31, read as midnight in the time zone answers name under now, or with an offset as 2026-01-31T09:00+01:00, and newer_than: as 7d, 2m or 1y, each mailbox answering only what arrived inside the period, with no AND, NOT, AROUND, NEAR or ONEAR in capitals. A password mailbox other than a Gmail reads one run of OR, and a query holding more leaves it out. Where the mailboxes read different languages - a Gmail reads Gmail's, whatever its provider - a query holding any other term is refused; where they read one, it is asked whole. Left out, every message is answered. | |
| by | No | message, the default, answers each matching message; thread answers each matching thread with every message in it. | |
| run | No | The name of a task this search is one run of, repeated as on a schedule - 1 to 40 letters, digits and hyphens. Each mailbox is then read from ten minutes before the last run under that name began reading it, or for the last 24 hours where none has, its first run, as its asked entry says under run. A mailbox's mark moves only once a run answers its whole period to its last page, so one not reached or not paged to its end is read from its older mark next time, and nextPageToken under the same run pages on to it. An account keeps 50 names, the longest unused forgotten first. | |
| view | No | summary, the default, carries each message's subject and snippet; headers leaves both out; compact, the lightest page, carries only each message's id, threadId, sender, date, unread mark, subject and the first 100 characters of its snippet. | |
| waiting | No | on_me answers only the threads waiting for the person's reply - their newest message someone else's, addressed to them; on_others only those waiting on another's - their newest message the person's own. Every mailbox is then read by thread, whatever by says, and each thread is answered with its newest message alone, drafts aside; one whose newest message reports a failed delivery is marked bounced and waits on nobody. A thread is picked by who wrote last and to whom - on any other mailbox whose provider is imap, by its answered mark - never by what its message asks, which its words alone say. A page holds only what waits, so it can be short while more names a mailbox holding more. A Gmail, whatever its provider, and an Outlook mailbox answer both; any other mailbox whose provider is imap answers on_me by the mail no mail app marked answered and cannot answer on_others. | |
| mailboxes | No | The mailboxes to search, each by its name or email address; every one where none is named. | |
| pageToken | No | The nextPageToken of the answer before, asked with every other input the same: it searches on each mailbox it names from where that mailbox's page stopped, and no other. A thread can recur on a later page. | |
| maxResults | No | How many results to take from each mailbox, 5 where left out. |
Output Schema
| Name | Required | Description |
|---|---|---|
| now | Yes | The person's own time zone, in which every time this answer gives is written, and their time now in it. |
| more | Yes | |
| asked | Yes | Each mailbox searched, with what of the query its provider honoured itself and what was applied after. |
| shown | Yes | |
| omitted | No | |
| threads | No | |
| messages | No | |
| searched | Yes | |
| unreadable | Yes | |
| unreachable | Yes | |
| nextPageToken | Yes | |
| screeningWait | No | Present where a message is marked not_yet_screened: the seconds to wait before reading those messages by their ids. |
| perMailboxMaxResults | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, non-open-world behavior, and the description adds substantial context: merged newest-first results, thread grouping by newest message, mailbox provenance, omittedRecipients counting, time-zone offsets, pagination behavior, and run-mark advancement rules. It also discloses provider-specific limitations for 'waiting' and query support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense run-on paragraph with awkward phrasing and repeated provider-specific search-operator details. The purpose is front-loaded, but the rest is poorly structured and much of it duplicates the schema rather than earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-mailbox search with pagination, incremental runs, and waiting modes, it covers provider differences, result merging, partial pages, and failure reporting. The output schema handles return values, and the main missing piece is explicit routing guidance versus messages_list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all eight parameters are already documented in the schema, including the extensive provider-specific 'q' syntax and 'run' mark semantics. The description largely repeats that schema content and adds only limited additional meaning, such as 'Left out, every message is answered' for 'q'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search every mailbox you have connected - every email account at once - in one call, or only those mailboxes names.' The scope is clear enough to distinguish it from a single-mailbox search, though it does not name the sibling messages_list explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two main modes, all connected mailboxes or only named ones, and suggests incremental polling: 'the time of the last look is the cheapest way to watch for new mail.' The 'run' parameter description also covers scheduled repeated searches, but there is no explicit when-not guidance or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messages_replyReply to a messageADestructiveIdempotentInspect
Reply to a message, inside its own thread and quoting it below the reply: to whoever wrote it - to whom it was sent, where this mailbox wrote it - or with replyAll to everyone on it. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Who to copy, instead of those replyAll copies. | |
| to | No | Who the reply goes to, instead of whoever wrote the message - whom it was sent to, where this mailbox wrote it - and, with replyAll, those it was sent to. | |
| bcc | No | Who to blind-copy. The other recipients are not told. | |
| body | No | The reply text; html alone is enough, its text read from it. | |
| flag | No | 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. | |
| from | No | The address it goes from. Left out, a reply goes from the address its message was sent to where Gmail lists that one, else from the mailbox's default. 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. | |
| html | No | The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it. | |
| sign | No | false leaves the signature out; it goes in by default. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| replyAll | No | true addresses everyone the message was sent to and copied too - never its blind copies, never this mailbox. | |
| chatFiles | No | 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. | |
| messageId | Yes | The provider's own identifier. | |
| requestId | Yes | Your own id for this send, new for every message. One whose send went or may have gone sends nothing again. | |
| afterwards | No | 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. | |
| importance | No | 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. | |
| attachments | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| from | No | The address it went from. |
| uploads | No | |
| accepted | No | |
| threadId | No | |
| messageId | No | |
| signature | No | 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. |
| afterwards | No | 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. |
| sentCopyKept | No | |
| markedAnswered | No | 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. |
| refusedRecipients | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses idempotency behavior for requestId, replyAll recipient exclusions, signature placement and sign=false behavior, provider-specific from-address rules, Outlook-only flag behavior, and what afterwards does if archiving or marking read fails. These details materially inform safe invocation of a destructive send operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a dense, run-on paragraph with nested clauses that are difficult to scan. Much of the content is valuable for this complex tool, but the phrasing is unnecessarily ornate and would benefit from tighter structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 16-parameter send tool with full schema coverage and an output schema, the description covers the major behavioral concerns an agent needs: recipient resolution, replyAll semantics, requestId idempotency, signatures, from-address rules, and post-send side effects. Return details are left appropriately to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds useful cross-parameter semantics: recipient defaults when to/cc are omitted, signature placement relative to quoted text, requestId replay behavior, and provider-specific from-address constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: replying to a message inside its own thread and quoting it below the reply. It distinguishes this send action from draft preparation and clarifies recipient behavior with replyAll, making it identifiable against siblings such as drafts_reply and messages_send.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when this tool sends versus when the person asked only to prepare a draft, and it describes recipient defaults and how to find an address the person did not provide. It does not explicitly compare against messages_forward or state a general exclusion for new-message composition, but the send-versus-draft guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messages_sendSend a messageADestructiveIdempotentInspect
Compose a new message in a connected mailbox and send it in one call. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Who to copy. | |
| to | Yes | Who the message is addressed to. | |
| bcc | No | Who to blind-copy. The other recipients are not told. | |
| body | No | The message text; html alone is enough, its text read from it. | |
| flag | No | 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. | |
| from | No | 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. | |
| html | No | The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it. | |
| sign | No | false leaves the signature out; it goes in by default. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| subject | Yes | The subject line. | |
| chatFiles | No | 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. | |
| requestId | Yes | Your own id for this send, new for every message. One whose send went or may have gone sends nothing again. | |
| afterwards | No | 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. | |
| importance | No | 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. | |
| attachments | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| from | No | The address it went from. |
| uploads | No | |
| accepted | No | |
| threadId | No | |
| messageId | No | |
| signature | No | 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. |
| afterwards | No | 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. |
| sentCopyKept | No | |
| markedAnswered | No | 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. |
| refusedRecipients | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint, idempotentHint and openWorldHint, and the description corroborates and enriches them: a spent requestId 'sends nothing again' and the answer distinguishes 'went' from 'may have gone'. It adds provider-specific behavior (from-address restrictions on Outlook vs Gmail, flags only on Outlook), signature insertion order relative to quotes, and the partial-failure semantics of 'afterwards' where the thread action fails but mail still went.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, which is good, but the body is one dense em-dash-chained paragraph where sentences such as 'the words close as the person's own would' or 'the manner they write to them in' are oblique enough to need re-reading. The content mostly earns its place; the packaging makes it harder to scan than it should be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, nested, destructive, provider-varying send, the description covers the hard judgment calls: send vs draft, address confirmation before use, idempotency, signature, and post-send thread actions. The multi-shape attachments flow (including the deferred HTTP PUT round-trip) is left entirely to the schema, and an output schema exists to carry return detail, so coverage is strong but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely extends several parameters: requestId gains retry semantics, `sign` gains signature placement and sign-off duplication rules, `from` gains per-provider address eligibility, and `afterwards` gains the permission-inheritance and failure caveat. It says nothing about attachments or chatFiles, but those are fully documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Compose a new message in a connected mailbox and send it in one call') and immediately draws the boundary against drafting ('mail they asked to prepare is a draft'), which separates it from drafts_create without opening either schema. The distinction is stated as a rule about intent, not just a label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing to siblings for sub-tasks: messages_list_all_mailboxes with from:/to: at the headers view to find an unknown address, mailboxes_list to identify the person's own addresses, settings_send_as_get for the signature. It does not, however, route the obvious alternatives for messages_reply, messages_forward or drafts_send, so those exclusions are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_filters_createCreate a filterADestructiveInspect
Create a rule - a filter - that files a connected mailbox's incoming mail from now on: out of the inbox, under a label, into a folder or marked read. A rule that carries mail out of the mailbox, or that bins or junks what it matches, is refused, whether or not the provider would take it. A rule matches mail meeting every condition it names, and on an Outlook mailbox leaves alone mail meeting any one under except; a condition or action the mailbox's provider cannot hold is refused there, never approximated. An Outlook mailbox's rule files under its categories (addLabelIds), into one folder (folder), out of the inbox (removeLabelIds INBOX), as read (removeLabelIds UNREAD) and at an importance (markImportance); a Gmail mailbox's folder is a label it files under out of the inbox. Senders are blocked by one rule from them with addLabelIds a label named Blocked - made with labels_create where labels_list holds none, on an Outlook mailbox a category - removeLabelIds ["INBOX", "UNREAD"], and on an Outlook mailbox stop true; muted by removeLabelIds ["UNREAD"] alone. Neither deletes anything. What no rule can hold - by age, the newest few from each sender, first-time senders or by meaning - is a clear-out instead: sweeps_preview takes olderThanDays and keepNewest, and the ready request Keep my inbox tidy, offered to the person, sets one up as a scheduled task. On an Outlook mailbox, focus with from alone puts those senders always in Focused or always in Other instead of making a rule.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Mail sent to this email address. | |
| body | No | Outlook only: one plain word or quoted phrase in the body. | |
| from | No | Mail from this sender, or from any of a list of up to 20 email addresses. | |
| size | No | Mail of at least, at most or between these sizes, in kilobytes. | |
| stop | No | Outlook only: true keeps later rules from acting on what this rule matches. | |
| toMe | No | Mail sent to the person alone (only, Outlook only), with the person in copy (copy), or either way (either). | |
| focus | No | Outlook only: the senders from names - each an email address, beside no other condition or action - go always in Focused (focused) or always in Other (other), and no rule is made. A sender already placed is moved. | |
| query | No | Anything else: a Gmail search query, or for an Outlook mailbox one plain word or quoted phrase in the subject or body, with no AND, OR or NOT in capitals. | |
| except | No | Outlook only: mail meeting any one of these conditions is left alone. | |
| folder | No | A folder to move what the rule matches into, by its id from labels_list: on an Outlook mailbox never Deleted Items or Junk, or a folder under either; on a Gmail mailbox a label of its own the mail is filed under out of the inbox. | |
| forward | No | Refused: this surface makes no rule that carries mail elsewhere. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| subject | No | One plain word or quoted phrase in the subject. | |
| importance | No | Outlook only: mail its sender marked at this importance. | |
| addLabelIds | No | Labels to apply, by id. TRASH and SPAM are refused. | |
| mailingList | No | Outlook only: mail from a mailing list. | |
| hasAttachment | No | Mail carrying files. | |
| markImportance | No | The importance to give what the rule matches: Outlook's own, or on a Gmail mailbox high marking it important and the others not. | |
| removeLabelIds | No | Labels to remove, by id: INBOX takes what the rule matches out of the inbox, UNREAD marks it read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| marks | No | What it does that takes mail out of the mailbox or out of sight: forwards, redirects, bins - into the trash or Deleted Items, a folder under it, or Recoverable Items - junks, deletes, or hides - out of the inbox and marked read. One marked anything but hides is only paused or removed from here. |
| action | No | |
| placed | No | Where focus was asked, each sender placed instead of a rule made, as settings_filters_list lists it. |
| enabled | No | |
| folders | No | The folders it moves or copies mail into, on an Outlook mailbox by their paths; on a Gmail mailbox the labels it files under out of the inbox. |
| criteria | No | |
| hasError | No | |
| sequence | No | |
| deletable | No | |
| placement | No | On an Outlook mailbox, a sender Outlook always sorts into Focused or Other rather than a rule, acting only while Focused Inbox is on; removed by its id as a rule is. |
| exceptions | No | |
| madeByAgentAt | No | When one of the person's AI clients made it here, or changed what it matches; absent for a rule made anywhere else. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond standard behaviors by disclosing crucial behavioral traits, such as the rule refusing to carry mail out of the mailbox, the 'every condition must match' logic, and specific provider limitations (e.g., Gmail label vs. Outlook folder).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is overly dense, repetitive, and excessively long. While exhaustive, it prioritizes technical detail over concise guidance, making it difficult for an agent to quickly grasp the core functionality without reading multiple sentences of caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (19 parameters and multiple provider variants), the description is maximally complete. It covers cross-platform nuances, limitations, and functional logic for every major component.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema coverage is 100%, the description adds vital semantic meaning, explaining the functional difference between parameters (e.g., what `folder` means on Gmail vs. Outlook) and the implications of complex field usage like `removeLabelIds`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The tool's purpose is clearly stated as creating a rule or filter for an email mailbox. It uses specific language to define what the rule does (categorizes, moves, marks as read) and how it interacts with the mailbox.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides excellent usage guidance by explicitly contrasting this tool with `sweeps_preview` (sweep/delete) and `focus` (Outlook category setting), helping the agent choose between a permanent rule and a one-off cleanup/specific category setting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_filters_deleteDelete a filterADestructiveIdempotentInspect
Delete one rule, or one sender's placement in Focused or Other, by its id. Mail it already filed stays where it is.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A rule id from settings_filters_list. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavioral context — 'Mail it already filed stays where it is' — clarifying the scope of destruction, which the annotations cannot convey. It stops short of noting auth/permission requirements or that the rule stops applying to future mail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the action and its scope come first and the reassurance about existing mail follows. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and rich annotations present, the description needn't explain return values or safety flags. It covers the main ambiguity for a destructive tool (what survives the deletion), though it omits the auth/prerequisite path and any warning about irreversibility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (id, mailbox) are already fully documented, including that the id comes from settings_filters_list. The description only restates 'by its id' and adds nothing about the mailbox parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and two precise resource variants (a rule, or a sender's Focused/Other placement) plus the lookup key (id). This clearly distinguishes it from settings_filters_create/update/list and from the drafts/labels delete siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'by its id' hints that an id must first be obtained, but the description never names settings_filters_list or says when to delete versus disable via settings_filters_update. No explicit when-not or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_filters_listList filtersARead-onlyInspect
List the rules a connected mailbox files incoming mail by, each marked where it forwards, redirects, bins, junks, deletes or hides mail, whoever made it, with the folders it files into and when the person's AI clients made it; an Outlook mailbox's list also names each sender it always sorts into Focused or Other, by placement; and a Gmail mailbox's list, unlike an Outlook one's, also says whether Gmail forwards all its mail, and where.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| filter | Yes | |
| forwarding | No | Whether Gmail forwards all of a Gmail mailbox's incoming mail, and to which address; absent for an Outlook mailbox. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=true, destructive=false, openWorld=false, so the safety bar is low and the description adds real context: it discloses that results include per-rule action markers (forward, redirect, bin, junk, delete, hide), creator, target folders, AI-client timestamps, plus provider-specific additions (Outlook Focused/Other placements, Gmail's forward-all setting). What it omits is anything about volume, pagination, or failure modes for an unknown mailbox.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one ~70-word run-on sentence chained with semicolons and relative clauses. The purpose is front-loaded, but the provider-specific caveats are buried and would read far better as separate sentences or a short bulleted list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full annotation coverage, the description only needs to frame what the list contains and any provider divergence — both are covered. The gap is small: no note on behavior when the mailbox name is ambiguous or unknown.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single required 'mailbox' parameter already documented as name or email address. The description's phrase 'a connected mailbox' adds the constraint that the mailbox must be connected, which is mildly useful, but it provides no format or resolution detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause gives a specific verb+resource: list the rules a connected mailbox files incoming mail by, i.e. filter rules, which is distinct from the create/delete/update filter siblings. The trailing enumerations of what each rule reports stay on-topic but dilute the single clear statement of purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent infers it reads filter configuration for a given mailbox, versus settings_filters_create/update/delete which mutate. No explicit when-to-use, prerequisites, or named alternative is given, and the Gmail/Outlook differences are framed as return-content notes rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_filters_updateChange a filterADestructiveInspect
Change one rule by its id from settings_filters_list, naming its conditions and actions whole as settings_filters_create takes them - its sender list included - or, on an Outlook mailbox, pause or resume it with enabled. A change replaces every condition, exception and action the rule holds, so anything settings_filters_list shows of it that this tool cannot name is dropped - a loss the person agrees to first. A change is refused wherever a new rule would be. A rule marked as forwarding, redirecting, binning, junking or deleting mail is only paused or removed from here, and one Outlook marks read-only is not changed at all. Outlook keeps the rule's id; Gmail changes a rule by making it anew under a new id, and pauses none. Answers the rule as it now stands. A sender's placement in Focused or Other is no rule and is not changed here: settings_filters_create with focus moves it, and settings_filters_delete removes it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A rule id from settings_filters_list. | |
| to | No | Mail sent to this email address. | |
| body | No | Outlook only: one plain word or quoted phrase in the body. | |
| from | No | Mail from this sender, or from any of a list of up to 20 email addresses. | |
| size | No | Mail of at least, at most or between these sizes, in kilobytes. | |
| stop | No | Outlook only: true keeps later rules from acting on what this rule matches. | |
| toMe | No | Mail sent to the person alone (only, Outlook only), with the person in copy (copy), or either way (either). | |
| query | No | Anything else: a Gmail search query, or for an Outlook mailbox one plain word or quoted phrase in the subject or body, with no AND, OR or NOT in capitals. | |
| except | No | Outlook only: mail meeting any one of these conditions is left alone. | |
| folder | No | A folder to move what the rule matches into, by its id from labels_list: on an Outlook mailbox never Deleted Items or Junk, or a folder under either; on a Gmail mailbox a label of its own the mail is filed under out of the inbox. | |
| enabled | No | Outlook only: false pauses the rule, true resumes it. | |
| forward | No | Refused: this surface makes no rule that carries mail elsewhere. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| subject | No | One plain word or quoted phrase in the subject. | |
| importance | No | Outlook only: mail its sender marked at this importance. | |
| addLabelIds | No | Labels to apply, by id. TRASH and SPAM are refused. | |
| mailingList | No | Outlook only: mail from a mailing list. | |
| hasAttachment | No | Mail carrying files. | |
| markImportance | No | The importance to give what the rule matches: Outlook's own, or on a Gmail mailbox high marking it important and the others not. | |
| removeLabelIds | No | Labels to remove, by id: INBOX takes what the rule matches out of the inbox, UNREAD marks it read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | No | |
| marks | No | What it does that takes mail out of the mailbox or out of sight: forwards, redirects, bins - into the trash or Deleted Items, a folder under it, or Recoverable Items - junks, deletes, or hides - out of the inbox and marked read. One marked anything but hides is only paused or removed from here. |
| action | No | |
| enabled | No | |
| folders | No | The folders it moves or copies mail into, on an Outlook mailbox by their paths; on a Gmail mailbox the labels it files under out of the inbox. |
| criteria | No | |
| hasError | No | |
| previous | No | What became of the rule it replaced: removed; gone, already removed elsewhere, so the change is done; or kept, its removal failed or went unanswered, so both may stand, and settings_filters_delete removes that one. |
| sequence | No | |
| standing | No | Where the rule it replaced was already gone, every rule the mailbox holds now, where that could be read - settings_filters_list otherwise. |
| deletable | No | |
| placement | No | On an Outlook mailbox, a sender Outlook always sorts into Focused or Other rather than a rule, acting only while Focused Inbox is on; removed by its id as a rule is. |
| exceptions | No | |
| previousId | No | On a Gmail mailbox, which changes a rule by making it anew where Outlook keeps its id, the id it had before. |
| madeByAgentAt | No | When one of the person's AI clients made it here, or changed what it matches; absent for a rule made anywhere else. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, it discloses the key destructive behavior: a change replaces every condition, exception and action, so anything not named is dropped, and the person must agree first. It also covers refusal conditions, read-only Outlook rules, platform-specific id behavior (Outlook keeps the id; Gmail recreates under a new id), and that the response is the rule as it now stands.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a single long, convoluted paragraph with nested clauses and archaic phrasing. Most content is relevant to this 20-parameter destructive tool, yet the structure makes it harder to scan than a shorter, segmented description would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, destructive filter-update tool with a rich schema and an output schema, the description covers the essential behavioral contract: replacement semantics, consent before loss, refusal cases, platform differences, and sibling routing. Return-value detail is unnecessary because an output schema exists, though it still notes that the rule is returned as it now stands.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the many parameters; the description still adds important semantics by saying conditions and actions must be named whole as settings_filters_create takes them, sender lists included. It also clarifies that enabled is Outlook-only pause/resume and that replacing a rule means unnamed conditions are lost.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Change one rule by its id from settings_filters_list,' and immediately ties the id source to the list tool, distinguishing the update case from create/list. It also notes the Outlook pause/resume variant, so an agent knows this is the mutation tool for an existing filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use this tool (changing an existing rule by id) and routes nearby cases to siblings: Focused/Other sender placement is moved by settings_filters_create with focus and removed by settings_filters_delete. It also explains that forwarding/redirecting/binning/junking/deleting rules can only be paused or removed here, which is clear when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_get_vacationRead the vacation responderARead-onlyInspect
Read whether a connected mailbox answers mail automatically - an out-of-office or vacation reply - what it says, and any schedule or restriction it carries.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| endTime | Yes | |
| startTime | Yes | |
| enableAutoReply | Yes | |
| responseSubject | Yes | |
| externalAudience | No | |
| responseBodyHtml | Yes | |
| restrictToDomain | Yes | |
| restrictToContacts | Yes | |
| externalReplyMessage | No | |
| internalReplyMessage | No | |
| scheduledEndDateTime | No | |
| responseBodyPlainText | Yes | |
| scheduledStartDateTime | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and a closed-world scope, so the safety profile is covered. The description adds genuine value beyond them by disclosing the breadth of what is returned: the on/off state, message text, and any schedule or restriction, which tells the agent this is a richer read than a bare boolean.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the verb leading, and the dash-delimited clauses enumerate the returned facets efficiently. Slightly dense phrasing, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read with a full output schema and complete annotations, the description covers purpose and returned scope without redundant return-value detail. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter, mailbox, fully documented in the schema as a name or email address (100% coverage). The description adds nothing about the parameter itself, so the baseline of 3 applies - the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (read) and resource (the automatic vacation/out-of-office reply) and enumerates what is inspected: whether it fires, its text, and its schedule or restrictions. The read framing implicitly contrasts with settings_update_vacation, though no sibling is named outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Use is implied - inspect a given mailbox's vacation responder - but there is no explicit when-to-use, when-not, or named alternative such as settings_send_as_find or settings_filters_list for other settings inquiries. The agent must infer that this is the read-only counterpart to settings_update_vacation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_send_as_findFind the signatureAInspect
Find the signature the newest sent mail of an Outlook mailbox, or one whose provider is imap, carries - the block its mail app marked, else the closing lines its messages share, never a line such as Sent from my iPhone - and write it, with its pictures, into a new draft from that mailbox to its own address. That draft is the person's to see, and only on their word does settings_send_as_patch with fromDraft keep the signature from it, before the draft is sent: sent, it is a test message to themselves. It needs messages_get and drafts_create turned on for that mailbox, and is refused while the person has said its company adds a signature on its own server. For a mailbox whose provider is imap it also takes the name its newest sent mail goes out under, where none is held.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | No | |
| draftId | Yes | The draft holding the signature found, from and to sendAsEmail. It is the person's to see, and only on their word does settings_send_as_patch with fromDraft keep the signature from it, before the draft is sent. |
| sendAsEmail | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Richly discloses behavior beyond the annotations: it creates a self-addressed draft (a write, consistent with readOnlyHint=false and destructiveHint=false), explains the draft is the person's to see, that sending turns it into a test message to themselves, the inference heuristic used (marked block, else shared closing lines, never a 'Sent from my iPhone' line), and IMAP-specific sourcing. Prerequisites and refusal conditions are surfaced, all beyond what annotations declare.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is valuable but delivered as one long, densely embedded run-on sentence with awkward phrasing ('the person's to see', 'takes the name its newest sent mail goes out under'), making it hard to parse. The lead action is front-loaded, but the structure sacrifices readability for compression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the description covers the remaining essentials: the required tool permissions, the server-side-signature refusal, the draft side effect, the downstream patch hand-off, and the IMAP caveat. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter 'mailbox' with 100% schema coverage already documenting it as name or email address, so baseline is 3. The description adds no new parameter-level detail, only behavioral notes about IMAP sending-name resolution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (find the signature) and clarifies it does more than a read: it also writes the result into a new self-addressed draft. It implicitly distinguishes itself from settings_send_as_get (which reads the configured signature) and settings_send_as_patch (which applies it), though those sibling names are not stated explicitly as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real prerequisites (messages_get and drafts_create must be enabled per mailbox) and an explicit refusal condition (company adds a signature server-side). It also defines the downstream hand-off: only on the person's word does settings_send_as_patch with fromDraft keep the signature. It stops short of stating a clear 'use this vs settings_send_as_get' selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_send_as_getRead the signatureARead-onlyInspect
Read the signature of the address the mailbox sends from by default, as HTML, with that address. It goes under the words of every message composed from that address, unless the call passes sign false or the person has said the mailbox's company adds its own on its server. A mailbox with no signature answers without one. For an Outlook mailbox, or one whose provider is imap, it is the one Lumman keeps for it, which settings_send_as_patch sets, naming the pictures it shows without their bytes, beside the name a mailbox whose provider is imap sends under.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pictures | No | The pictures the signature shows by content id, as cid:<id> in its markup, without their bytes. |
| signature | No | |
| displayName | No | For a mailbox whose provider is imap, the name its mail goes out under beside its address. |
| sendAsEmail | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, destructiveHint false and openWorldHint false, so the description's added value is in the edge-case behavior: an empty signature returns without one, the company may append its own server-side, and inline images are named without their bytes. That is genuine context beyond the structured fields, though the final sentence is hard enough to parse that some of the value is lost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core fact is buried in a long run-on sentence, and the trailing sentence about Outlook/imap providers is a tangled pile of relative clauses that takes several reads to decode. It is not front-loaded: the actionable read semantics are interleaved with caveats and provider minutiae.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description only needed to convey scoping and edge cases, which it largely does. The dangling 'sign false' reference and the impenetrable provider sentence are the only real gaps for an agent deciding whether to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter at 100% schema description coverage ('The mailbox's name or its email address'), so the schema already does the work. The description refers to 'the mailbox' but adds no accepted forms, defaults, or resolution behavior beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause states a specific verb and resource: read the default send-as address's signature, returned as HTML. It also names the counterpart setter, settings_send_as_patch, so the agent can place it in the read/write pair. However, the second sentence drifts into provider-specific trivia that muddies rather than sharpens the distinction from settings_send_as_find.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the read/write pairing with settings_send_as_patch, and the description notes when a signature will be absent (no signature configured, or the company appends one server-side). There is no explicit 'use this when you need X, use the sibling when Y' statement, and the reference to a 'sign false' flag on 'the call' is ambiguous and does not correspond to any parameter in this tool's schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_send_as_patchEdit the signatureADestructiveIdempotentInspect
Replace the signature of the address the mailbox sends from by default. Nothing of the old one is kept; settings_send_as_get reads it beforehand. An empty signature clears it. Where that address is not the one a Gmail mailbox signs in with, Gmail lets only its own settings change it, and the call is refused. An Outlook mailbox, or one whose provider is imap, keeps no signature a tool reaches, so Lumman keeps this one for it, written as signature or taken with fromDraft from a draft of that mailbox: its formatting, tables and links to web, mail and phone addresses, a picture it links to as that link, and the pictures a draft's signature block holds, at most 10000 bytes once kept, its pictures counted. Written markup keeps a picture only where it names one the kept signature already holds, as cid:. For a mailbox whose provider is imap, displayName sets the name its mail goes out under instead.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | The mailbox's name or its email address. | |
| fromDraft | No | For an Outlook mailbox, or one whose provider is imap: a draft of that mailbox whose signature block - the one its mail app or Lumman marked - is kept with the pictures it holds. Reading it needs messages_get turned on for that mailbox. Left out where signature or displayName is given. | |
| signature | No | The signature, as HTML. Gmail sanitises it; for an Outlook mailbox, or one whose provider is imap, Lumman keeps what a signature needs of it. Left out where fromDraft or displayName is given. | |
| displayName | No | For a mailbox whose provider is imap: the name its mail goes out under beside its address, replacing any taken from its sent mail. Left out where signature or fromDraft is given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pictures | No | The pictures the signature shows by content id, as cid:<id> in its markup, without their bytes. |
| signature | No | |
| displayName | No | For a mailbox whose provider is imap, the name its mail goes out under beside its address. |
| sendAsEmail | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: old signature contents are not retained, empty input clears the signature, Gmail's refusal condition is stated, provider-specific storage rules are explained, and size/picture/markup constraints are disclosed. This is consistent with destructiveHint=true and idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose and destructive behavior are front-loaded, and most sentences carry necessary provider-specific details. However, the provider rules are packed into long, dense sentences that make the description harder to scan than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive mutation, provider-specific behavior, four parameters, full schema coverage, annotations, and an output schema, the description is complete enough for correct invocation. It covers refusal conditions, empty-value semantics, and the main provider-dependent alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters, including fromDraft, signature, and displayName. The description adds provider-level context, but most parameter-specific meaning is already present in the schema, so it only meets the baseline rather than adding significant new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: replacing the signature of the address the mailbox sends from by default. It also distinguishes the read counterpart explicitly via settings_send_as_get and describes the empty-signature clearing behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit alternatives and conditions: settings_send_as_get reads the old signature beforehand, an empty signature clears it, fromDraft is used for Outlook/imap mailboxes, displayName is used for imap mailboxes, and Gmail refuses changes where the address is not the sign-in address.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_update_vacationSet the vacation responderADestructiveIdempotentInspect
Turn the automatic reply - out-of-office, auto-reply or vacation responder - on or off, or change what it says. What this call does not name is kept: its schedule, who it answers, and its words when it is turned off; a schedule it keeps, even one that has ended, still decides when it answers. An Outlook mailbox turned on from off answers from then on, whatever schedule it held, and holds no subject.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | The mailbox's name or its email address. | |
| enableAutoReply | Yes | Whether the mailbox answers automatically. | |
| responseSubject | No | The subject the answer carries. | |
| responseBodyPlainText | No | What the answer says. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| endTime | Yes | |
| startTime | Yes | |
| enableAutoReply | Yes | |
| responseSubject | Yes | |
| externalAudience | No | |
| responseBodyHtml | Yes | |
| restrictToDomain | Yes | |
| restrictToContacts | Yes | |
| externalReplyMessage | No | |
| internalReplyMessage | No | |
| scheduledEndDateTime | No | |
| responseBodyPlainText | Yes | |
| scheduledStartDateTime | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides deep operational context regarding scheduling persistence. It explicitly states that schedules are kept even when the responder is off and notes the specific behavior of losing the subject line when the mailbox is turned on from an off state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly long, but its density of information justifies the length. It avoids filler and focuses exclusively on high-value operational constraints and behaviors.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of how scheduling and state persistence work in this system, the description is exceptionally complete. It covers edge cases like previously ended schedules, which is critical for agent accuracy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since the input schema provides 100% coverage for all parameters, the baseline score of 3 is maintained. The description only elaborates on the semantic purpose of changing the body or subject, rather than compensating for missing schema detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The tool clearly defines its purpose as managing the 'vacation responder,' covering both enabling/disabling and modifying the content. It is distinct from general draft tools or list operations in the provided sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains the boundaries of the operation—what can be changed (content, status). While it doesn't explicitly name the contrasting tool, the focus on modification vs. retrieval guides usage effectively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sweeps_applyClear out a previewADestructiveIdempotentInspect
Move the groups a sweeps_preview counted, each to the trash - Deleted Items in Outlook - or the archive, or into a label or folder the person made in that mailbox, named by its id from labels_list, or mark a group's unread mail read where it is; Gmail moves mail by its labels, taking the inbox label off and adding Trash or the label filed into, and a mailbox held by its password into its trash, archive or label folder - a Gmail's archive being All Mail. Filing into the inbox, the bin, junk, sent mail, drafts, the archive, a Gmail tab or another label Gmail keeps itself is refused (file_refused). Each group is named by its number with the messages count the preview answered, and any count that differs refuses the whole call. Left-out mail is a group too, archived, filed or marked read, never binned: flagged 21, drafts 22, sent 23, own 24, writtenTo 25; deleted and junk mail is never moved. Binning needs a preview narrowed by senders, a domain, a subject phrase or olderThanDays of 30 or more, and leaves a group's receipts, orders, bookings, bills, account and security notices where they are (heldApart). Marking read leaves mail already read as it is (alreadyRead), so putting back never marks it unread. A message changed since the preview is left where it is. A call works for about three minutes and answers per group what moved or was marked read, what changed and what it did not reach, which stays untouched, with up to 20 failures. The same call again under the same sweep, while anything is notReached or failed as unavailable, carries on where the last stopped, settles any message a call cut short left mid-move, and counts no action against the daily allowance. sweeps_put_back puts it back until putBackUntil. The times it answers with carry their offset in the person's own time zone, which the answer names under now beside their time now in it - UTC where the person has stored no zone, as now says.
| Name | Required | Description | Default |
|---|---|---|---|
| sweep | Yes | The sweep handle sweeps_preview answered. | |
| groups | Yes | ||
| mailbox | Yes | The mailbox's name or its email address. | |
| onlyIfNewest | No | true acts only while this sweep's preview is still the newest of its mailbox, refused (sweep_replaced) once a newer one is held. |
Output Schema
| Name | Required | Description |
|---|---|---|
| now | Yes | The person's own time zone, in which every time this answer gives is written, and their time now in it. |
| sweep | Yes | |
| failed | Yes | |
| groups | Yes | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| putBackUntil | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses extensive behavior: refused filing targets, heldApart protections, alreadyRead behavior, notReached and failure limits, the three-minute call window, resumption semantics under the same sweep, daily allowance treatment, and timezone reporting. These details are consistent with destructiveHint=true and idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sprawling, telegraphic block with semicolon-separated clauses that is difficult to scan. Most content is relevant, but the run-on structure and lack of grouping undermine front-loading and readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive batch tool, the description covers preconditions, safety exclusions, failure limits, idempotent resumption, and response-time semantics. The output schema can carry the exact return shape, so the description is complete enough for an agent to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 75%, but the description adds meaning: group numbers and message counts must match the preview, label ids come from labels_list, action outcomes are explained through bin/archive/read/file prose, and mailbox password handling is described. onlyIfNewest is left to the schema, which keeps this below a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it moves the groups counted by sweeps_preview into trash, archive, labels, or read state. It also distinguishes the tool from sweeps_preview and sweeps_put_back, so an agent can tell this applies a preview and mutates mail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear that groups must come from sweeps_preview, that message counts must match the preview, and that binning requires a suitably narrowed preview. It also names sweeps_put_back for reversal. It stops short of explicit routing guidance versus direct siblings such as threads_trash or threads_archive, but the preconditions and refusal cases cover most usage decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sweeps_previewPreview a clear-outARead-onlyInspect
Count who fills one folder of a mailbox, the inbox unless folder names another, before clearing it out by sender - newsletters, promotions and notifications a group at a time rather than thread by thread, each group sweeps_apply moves once the person approves it; nothing is moved. The answer numbers the 20 senders with the most mail there, each with its count, how many are unread, its newest and oldest dates, two of its subjects, and heldApart: how many are receipts, orders, bookings, bills, account or security notices. otherSenders and otherMessages count the rest, and nextSenders names the next 20 of them by address with how many messages each has, for another preview to name in senders. A sender whose name screens as a prompt attack is withheld with its group, which takes no number, counted under withheldSenders and withheldMessages; a subject that does leaves its group's subjects, counted under withheldSubjects; a next sender's address that does leaves nextSenders, counted under withheldNextSenders. Flagged mail, drafts, the person's own messages, mail from people they write to, and everything in sent, drafts, deleted or junk is in no group, counted under leftOut instead. At most the newest 10,000 messages of an Outlook folder, or of a mailbox held by its password, are read, and notReadBefore names the date before which a larger folder was not. A mailbox held by its password is cleared out only where its mail server names where it moves each message, and a Gmail held by its password out of its inbox alone. Gmail allows few reads a minute, so only the newest 150 of a Gmail folder are read: they choose the groups, and each group's messages then counts all its sender's mail the preview asks for, up to 10,000 in all, unless the preview narrows by subject; its other figures, otherSenders, otherMessages, nextSenders and leftOut count the messages read, and folderTotal is Gmail's own estimate. actionsLeft is how many actions this account has left in its daily allowance after this call. sweep is the handle sweeps_apply clears what was counted by, held an hour; what an apply moves can be put back until putBackUntil at the earliest. The times it answers with carry their offset in the person's own time zone, which the answer names under now beside their time now in it - UTC where the person has stored no zone, as now says.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Gmail alone: only the mail in this tab of its inbox is counted, as focus counts Outlook's Focused or Other. | |
| list | No | Only mail from this mailing list is counted, by its list id: what a message's listId holds between its angle brackets, as news.example.com. | |
| focus | No | Outlook alone: only the mail Outlook sorts into Focused, or only that in Other, is counted. Outlook sorts its inbox alone. | |
| domain | No | Only mail from this domain or one under it is counted, as example.com. | |
| folder | No | The folder to read, inbox by default; all of sent, drafts, deleted and junk is left out. | |
| unread | No | true counts only unread mail, false only read mail. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| senders | No | Only mail from these addresses is counted. | |
| subject | No | Only mail whose subject holds this phrase, letter case aside, is counted. | |
| keepNewest | No | The newest this many of each sender's messages are left out of the count, so only the rest is counted. | |
| olderThanDays | No | Only mail that arrived more than this many days ago is counted. | |
| excludeSubjects | No | Mail whose subject holds any of these phrases is left out of the count. | |
| largerThanBytes | No | Only mail larger than this many bytes is counted, as 5000000 for mail over 5 MB. |
Output Schema
| Name | Required | Description |
|---|---|---|
| now | Yes | The person's own time zone, in which every time this answer gives is written, and their time now in it. |
| read | Yes | |
| sweep | Yes | |
| groups | Yes | |
| leftOut | Yes | |
| notRead | No | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| actionsLeft | No | |
| folderTotal | Yes | |
| nextSenders | No | |
| otherSenders | Yes | |
| putBackUntil | Yes | |
| notReadBefore | Yes | |
| otherMessages | Yes | |
| withheldSenders | No | |
| withheldMessages | No | |
| withheldNextSenders | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive, but the description adds substantial behavioral context: read caps of 10,000 messages and 150 for Gmail, prompt-attack withholding, leftOut categories, actionsLeft, a one-hour sweep handle, and time-zone offsets. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense, run-on block with many clauses and little structure, making it hard to scan. It contains useful caveats, but it is overlong and poorly front-loaded for its purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter preview tool with an output schema, it covers the important read limits, output fields, withholding behavior, and time-zone handling comprehensively. Nothing essential appears missing, though the density hurts usability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds some meaning beyond the schema by relating senders to nextSenders and subject narrowing, and by noting the default folder and excluded folders, but most parameter semantics are already supplied by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens by stating it counts senders in one mailbox folder before a clear-out and explicitly contrasts with sweeps_apply, which performs the move. The verb, resource, and scope are specific, though the phrase 'Count who fills one folder' is less direct than it could be.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent this is the preview step before sweeps_apply and that nothing is moved, and it names sweeps_apply as the tool that executes approved groups. It does not spell out when-not scenarios beyond the read-only preview/apply split.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sweeps_put_backPut a clear-out backAIdempotentInspect
Return what sweeps_apply moved under a sweep handle - every group, or those named - each message to the Outlook folder, or the folder of a mailbox held by its password, it came from, or in Gmail connected by Google sign-in to the labels it held; mail it marked read is marked unread again, and only that, and mail it filed leaves the label or folder, a label it already carried staying on it. A message moved since the apply is left where it is (changed), and one the provider no longer holds is gone. A call works for about three minutes; the same call again reaches what it did not. Putting back counts no action against the daily allowance.
| Name | Required | Description | Default |
|---|---|---|---|
| sweep | Yes | The sweep handle sweeps_preview answered. | |
| groups | No | ||
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sweep | Yes | |
| failed | Yes | |
| groups | Yes | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: what this put-back could not find there is counted under notReached, never gone, and stays to be put back - a call again reaches it only once that folder holds fewer messages than its provider shows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it specifies that only read-marking is reverted (and only that), that filed mail leaves the label/folder while a pre-existing label stays, that moved and deleted messages are handled distinctly (changed / gone), that a call runs for about three minutes and a repeat call picks up the remainder, and that it consumes no daily quota. None of that is derivable from readOnly/destructive/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a single sprawling sentence chaining restore targets, edge cases, timeouts and quota in one breath. Every clause carries information, yet the nested 'or the folder of a mailbox held by its password, it came from' phrasing forces re-reading; splitting into short statements would preserve content and improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, retryable undo tool with an output schema already defining returns, the description supplies the operationally important facts: scope, partial-completion retry, timeout window, quota exemption, and per-message edge outcomes. The main remaining gap is an explicit precondition tying the call to a still-open apply window.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the undocumented parameter (groups) is exactly the one the description explains: 'every group, or those named', making clear it is an optional subset selector defaulting to all groups. The sweep handle's origin is reinforced, though the mailbox parameter's password/sign-in framing adds only mild clarity beyond the schema's own text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause states a specific verb and resource: return what sweeps_apply moved under a sweep handle, per group, restoring folder/label placement. It clearly names its inverse sibling (sweeps_apply) so an agent can distinguish the pair. The long run-on structure around 'each message to the Outlook folder... or in Gmail...' muddies the read but does not obscure the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it references a prior sweeps_apply and a sweep handle from sweeps_preview, and 'every group, or those named' hints at the default-vs-subset choice. It also gives a partial exclusion ('a message moved since the apply is left where it is'), but there is no explicit when-to-use/when-not framing or statement of prerequisites (e.g., whether an apply must still be in effect).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
threads_archiveArchive a threadADestructiveIdempotentInspect
Take one thread, or one message of it, out of the inbox: a Gmail mailbox, whatever its provider, takes its inbox label off, and an Outlook one moves it into its archive folder. It stays in the mailbox and in search. Any other mailbox whose provider is imap moves its inbox messages into its archive folder, made as Archive where it has none, each under a new id the answer names. With ids in place of id it takes 2 to 100 at once under one call's time, counted as one action: each thread it reached is answered under threads - done; notDone, saying why; or possiblyDone, moved in part or asked with no answer back, which threads_get - or messages_get for a message - reads to check - and each it did not reach, its time spent, its connection lost or the mailbox refusing it whole, is left untouched under notReached, for the same call again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The threadId a search or a read answered, or with scope message the message's id. | |
| ids | No | 2 to 100 threadIds - or with scope message message ids - in place of id, acted on in one call. | |
| scope | No | thread, the default, acts on the whole thread; message acts on that one message alone. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| threads | No | Each thread the call reached, with ids. |
| labelIds | No | |
| messages | No | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| notReached | No | The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint, idempotentHint): it discloses that the item stays in the mailbox and in search, that an Archive folder may be created with new ids returned in the answer, and that batch calls can end partially with done / notDone / possiblyDone / notReached outcomes, including timeout and connection-loss causes. That is substantive operational context an agent could not get from the annotations alone. Note the mild tension with destructiveHint=true since the description stresses the mail remains searchable, but this is a nuance rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the opening clause, which is good, but the rest is one sprawling run-on sentence with dense clauses and informal phrasing ('under one call's time', 'asked with no answer back') that makes the batch and outcome semantics harder to parse than necessary. No filler sentences, but readability suffers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with batch semantics and partial-failure modes, the description covers the essentials: what changes per provider, what persists, what the outcome buckets mean, and the retry path. An output schema exists, so the extra detail on result buckets is bonus rather than obligation; only the relationship to threads_modify and the exact id format are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds real meaning on top: ids is a mutually exclusive alternative to id, is capped at 2-100, and is processed as one action within a single call's time; scope=message targets one message rather than the whole thread. It stops short of documenting the id pattern/format constraints, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource (take a thread or message out of the inbox, i.e. archive) and then spells out the provider-specific effect: Gmail loses its inbox label, Outlook moves to archive folder, IMAP moves inbox messages to an Archive folder created if absent. It also implicitly separates itself from threads_get/messages_get by naming them as the read tools used to verify possiblyDone results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for the two input shapes: a single id for one thread or message, or ids for 2-100 at once counted as one action. It also explains what to do on partial failure (re-run the notReached entries). It never explicitly contrasts with threads_modify (which can also remove the inbox label) or threads_trash, so the sibling choice is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
threads_getRead a threadBRead-onlyInspect
Read every message of one thread in a connected mailbox, oldest first. A message's quote of another the answer carries is left out of its words; a quote of one it does not carry stays. A message whose recipients one answer cannot carry names the first that fit, omittedRecipients counting the rest. The times it answers with carry their offset in the person's own time zone, which the answer names under now beside their time now in it - UTC where the person has stored no zone, as now says.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The threadId a search or a read answered. | |
| view | No | full, the default, carries each message's text and attachments; summary leaves those out; headers leaves out the subject and snippet too. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| now | Yes | The person's own time zone, in which every time this answer gives is written, and their time now in it. |
| link | No | |
| shown | Yes | |
| total | Yes | |
| messages | Yes | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| screeningWait | No | Present where a message is marked not_yet_screened: the seconds to wait before reading those messages by their ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), yet the description still discloses real response-shaping behavior: oldest-first ordering, quote stripping that depends on whether the message carries the quoted answer, recipient truncation with an omittedRecipients count, and per-message timestamps carrying the reader's time-zone offset with a fallback to UTC. That is meaningful context beyond the annotations, though the phrasing is opaque enough to slow an agent down.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is well front-loaded, and each later sentence does carry distinct information, so nothing is filler. However, the sentences are convoluted to the point of near-unparseability ("A message's quote of another the answer carries is left out of its words"), which undermines structure and scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not restate return values, and it still covers ordering, quoting behavior, recipient truncation and timestamp semantics — the non-obvious parts. What is missing is usage context (when this beats reading individual messages) rather than behavioral detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters (id, view, mailbox) are documented in the schema, including the view enum's full/summary/headers semantics. The description adds no additional meaning about these parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Read every message of one thread in a connected mailbox, oldest first" gives a specific verb (read), resource (thread), scope (all messages) and ordering, so an agent knows what it gets. It does not explicitly distinguish itself from the thread-mutating siblings (threads_archive/modify/trash) or from messages_get, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing says to pick threads_get over messages_get or messages_list, and no exclusions or prerequisites are stated. The only routing hint appears in the schema ("The threadId a search or a read answered"), not in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
threads_modifyLabel a threadADestructiveIdempotentInspect
Apply and remove labels on one thread, or one message of it, to file it in a folder, star it or mark it read or unread - an Outlook mailbox's categories and its own folders are its labels. The ids come from labels_list. Adding STARRED to a thread stars its newest message the person received - on an Outlook mailbox, flags it - as their own mail app does, and removing it unstars every message. Adding SPAM junks it, and taking SPAM off brings it back to the inbox. Adding INBOX brings it back from the archive. In a Gmail connected by Google sign-in adding TRASH bins it too; an Outlook mailbox takes UNREAD, STARRED, SPAM and INBOX beside its categories and its folders, and no other id, and junks a thread's inbox messages alone, filing into one folder a call: adding a folder moves the messages into it from whatever folder each is in, and a folder is left only for another folder added - never Deleted Items, Junk or a folder under either, which threads_trash and SPAM own - or for INBOX, which brings them back; a Gmail mailbox whose provider is imap takes only UNREAD, STARRED, SPAM, INBOX and its own labels, several a call, as Gmail does, each message keeping its id; any other mailbox whose provider is imap takes only UNREAD, STARRED, SPAM, INBOX and its folders' labels, filing into one folder a call: adding a label moves the messages into its folder from whatever folder each is in - so removing one label and adding another moves them from one folder to the other - and removing labels alone moves their messages back to the inbox, each message moved taking a new id, which the answer names. There, and in an Outlook mailbox, a thread's sent mail and drafts, and any message in the provider's own scheduled, snoozed or outgoing folder - in an Outlook mailbox its copies of mail it could not sync too - stay where they are, untouched, each answered with skipped saying which. Outlook and a mailbox whose provider is imap take INBOX added, never removed - threads_archive takes a thread out of the inbox - and move nothing out of the bin, which is threads_untrash's: outside a Gmail, a binned message they would have moved is answered with skipped. With ids in place of id it takes 2 to 100 at once under one call's time, counted as one action: each thread it reached is answered under threads - done; notDone, saying why; or possiblyDone, moved in part or asked with no answer back, which threads_get - or messages_get for a message - reads to check - and each it did not reach, its time spent, its connection lost or the mailbox refusing it whole, is left untouched under notReached, for the same call again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The threadId a search or a read answered, or with scope message the message's id. | |
| ids | No | 2 to 100 threadIds - or with scope message message ids - in place of id, acted on in one call. | |
| flag | No | On an Outlook mailbox, a follow-up flag on these days, set as adding STARRED sets one. No other mailbox keeps a date on a flag: adding STARRED flags mail there without one. | |
| scope | No | thread, the default, acts on the whole thread; message acts on that one message alone. | |
| mailbox | Yes | The mailbox's name or its email address. | |
| importance | No | The importance each message it reaches takes: an Outlook mailbox sets its own, and a Gmail connected by Google sign-in marks high as important and normal or low as not. A mailbox whose provider is imap keeps none. | |
| addLabelIds | No | ||
| removeLabelIds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| threads | No | Each thread the call reached, with ids. |
| labelIds | No | |
| messages | No | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| notReached | No | The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true, readOnly=false, but the description goes well beyond that by explaining provider-specific label semantics for STARRED, SPAM, INBOX, TRASH, folder moves, skipped messages, partial outcomes, and untouched sent/drafts. This is rich behavioral context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is a single very long run-on paragraph with repeated clauses and no structural separation, so critical rules are buried mid-sentence. It is comprehensive but poorly organized and difficult to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with nested flag fields and an output schema, the description covers provider differences, batching, result states, and skip/partial cases thoroughly. Nothing material appears missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with descriptions for id, ids, scope, mailbox, importance, flag, and the label arrays. The description adds meaningful semantics for batch behavior (2-100 as one action), scope=message, label-source, and provider restrictions, though it does not add much beyond the schema for importance or flag.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Apply and remove labels on one thread, or one message of it,' and names concrete outcomes (folder, star, read/unread). It distinguishes label ids from labels_list and points to threads_archive, threads_trash, threads_untrash, threads_get, and messages_get for adjacent operations, so the agent can identify the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names alternatives and exclusions: labels_list for ids, threads_archive for removing from the inbox, threads_trash and SPAM for binning, threads_untrash for restoring, plus rules for INBOX and folder moves. However, the guidance is buried in a dense paragraph rather than stated as a clear upfront when-to-use rule, and there is no concise 'use this versus X' summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
threads_trashMove a thread to the trashADestructiveIdempotentInspect
Move one thread, or one message of it, to the trash - Gmail's bin, an Outlook mailbox's Deleted Items, the trash folder of a mailbox whose provider is imap - where it stays until threads_untrash brings it back or the provider's own retention ends it. A Gmail mailbox whose provider is imap keeps every label but the inbox on it and each message its id; in any other mailbox whose provider is imap each moved message takes a new id, which the answer names. With ids in place of id it takes 2 to 100 at once under one call's time, counted as one action: each thread it reached is answered under threads - done; notDone, saying why; or possiblyDone, moved in part or asked with no answer back, which threads_get - or messages_get for a message - reads to check - and each it did not reach, its time spent, its connection lost or the mailbox refusing it whole, is left untouched under notReached, for the same call again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The threadId a search or a read answered, or with scope message the message's id. | |
| ids | No | 2 to 100 threadIds - or with scope message message ids - in place of id, acted on in one call. | |
| scope | No | thread, the default, acts on the whole thread; message acts on that one message alone. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| threads | No | Each thread the call reached, with ids. |
| labelIds | No | |
| messages | No | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| notReached | No | The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive and idempotent annotations, it discloses reversibility, provider-controlled retention, provider-specific label and message-ID effects, partial completion, timeouts, connection failures, and which items remain untouched. These details substantially clarify the side effects and failure behavior of the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the content is relevant, but the final sentence is an excessive run-on covering batching, statuses, verification, failure causes, and retries. Dense phrasing and repeated dashes make otherwise valuable instructions difficult to parse; shorter sentences or bullets would be much clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a provider-dependent, batch-capable destructive operation, the description supplies unusually complete context about scope, persistence, ID changes, partial failures, verification, and safe retries. The input and output schemas cover the remaining structural details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, and the description repeats some of it, including the 2-to-100 batch range and message scope. It nevertheless adds useful meaning about batch action counting, per-item outcomes, newly assigned IDs, and how scope affects the appropriate verification tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clearly states the verb, resource, and scope: moving either a whole thread or one message to the trash. It also maps trash to provider-specific folders and distinguishes the operation from threads_untrash.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete operational guidance for single versus batch calls using id or ids, names threads_untrash for reversal, and directs the agent to threads_get or messages_get after an ambiguous possiblyDone result. It also explains that notReached items can be retried with the same call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
threads_untrashRestore a thread from the trashAIdempotentInspect
Bring one thread, or one message of it, back out of the trash. A Gmail connected by Google sign-in brings it back with every label it carried. A Gmail mailbox whose provider is imap puts a draft back in its drafts, the owner's own mail in sent mail and the rest in the inbox, with every label it carried, each message keeping its id. An Outlook mailbox and any other mailbox whose provider is imap put a message threads_trash moved there back in the folder that move took it from - the latest such move, within 30 days, while that folder is still there outside the trash - and any other message by that same rule; each message they bring back names the folder it went to as restoredTo, and in a mailbox whose provider is imap the new id it took. With ids in place of id it takes 2 to 100 at once under one call's time, counted as one action: each thread it reached is answered under threads - done; notDone, saying why; or possiblyDone, moved in part or asked with no answer back, which threads_get - or messages_get for a message - reads to check - and each it did not reach, its time spent, its connection lost or the mailbox refusing it whole, is left untouched under notReached, for the same call again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The threadId a search or a read answered, or with scope message the message's id. | |
| ids | No | 2 to 100 threadIds - or with scope message message ids - in place of id, acted on in one call. | |
| scope | No | thread, the default, acts on the whole thread; message acts on that one message alone. | |
| mailbox | Yes | The mailbox's name or its email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| threads | No | Each thread the call reached, with ids. |
| labelIds | No | |
| messages | No | |
| newestOnly | No | The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest. |
| notReached | No | The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing provider-specific restore semantics: Google-sign-in Gmail restores with every label, imap Gmail routes drafts/sent/other into different folders while preserving ids, and Outlook/imap returns messages to the folder they were moved from (latest move, within 30 days, folder still existing). It also discloses partial-failure behavior (done/notDone/possiblyDone/notReached) that the annotations do not cover. Nothing contradicts idempotentHint=true or destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the remainder is one dense run-on paragraph with tangled clauses ('which threads_get - or messages_get for a message - reads to check') that must be re-read to parse. The content is relevant, yet it is not structured into scannable segments, hurting readability for an agent skimming the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description covers everything an agent needs: per-provider restore destinations, the 30-day/folder-existence constraint, batch limits of 2-100, idempotency context, and the meaning of each partial-success status. No decision-relevant behavior is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds meaning the schema lacks: it explains that 'ids' replaces 'id' and is batched under one call's time as 'one action', and that 'scope: message' narrows the operation to a single message whose id is accepted. It also explains that restored messages are reported with the folder as restoredTo, linking inputs to output fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: 'Bring one thread, or one message of it, back out of the trash.' It also states the scope alternatives (whole thread vs single message) up front, so an agent can distinguish it from threads_trash, threads_archive, and threads_modify without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: 'possiblyDone ... which threads_get - or messages_get for a message - reads to check' and 'notReached ... for the same call again' tells the agent exactly how to follow up after a partial result. It does not explicitly compare itself to alternative restore paths (e.g. threads_modify removing the TRASH label), so the alternative-selection guidance is implicit rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
messages_list2 fields changed- changed
Output schema / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none." - changed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."
- Changed
messages_list_all_mailboxes2 fields changed- changed
Output schema / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none." - changed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."
- Changed
threads_get1 field changed- changed
Output schema / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none."
3 tool updates
- Changed
messages_list4 fields changed- changed
Output schema / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none." - changed
Output schema / properties / messages / items / properties / withheld / enumPrevious value: -[ - "screening", - "not_yet_screened" -]New value: +[ + "screening", + "not_yet_screened", + "too_large_to_screen" +] - changed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none." - changed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / enumPrevious value: -[ - "screening", - "not_yet_screened" -]New value: +[ + "screening", + "not_yet_screened", + "too_large_to_screen" +]
- Changed
messages_list_all_mailboxes4 fields changed- changed
Output schema / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none." - changed
Output schema / properties / messages / items / properties / withheld / enumPrevious value: -[ - "screening", - "not_yet_screened" -]New value: +[ + "screening", + "not_yet_screened", + "too_large_to_screen" +] - changed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none." - changed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / enumPrevious value: -[ - "screening", - "not_yet_screened" -]New value: +[ + "screening", + "not_yet_screened", + "too_large_to_screen" +]
- Changed
threads_get2 fields changed- changed
Output schema / properties / messages / items / properties / withheld / descriptionPrevious value: -"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment."New value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment; too_large_to_screen, it needs more than that allowance ever holds, so the person opens it at its link, or finds it by its date where it has none." - changed
Output schema / properties / messages / items / properties / withheld / enumPrevious value: -[ - "screening", - "not_yet_screened" -]New value: +[ + "screening", + "not_yet_screened", + "too_large_to_screen" +]
3 tool updates
- Changed
messages_list7 fields changed- removed
Output schema / properties / messages / items / properties / withheld / constRemoved value: -"screening" - added
Output schema / properties / messages / items / properties / withheld / descriptionAdded value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment." - added
Output schema / properties / messages / items / properties / withheld / enumAdded value: +[ + "screening", + "not_yet_screened" +] - added
Output schema / properties / screeningWaitAdded value: +{ + "description": "Present where a message is marked not_yet_screened: the seconds to wait before reading those messages by their ids.", + "type": "number" +} - removed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / constRemoved value: -"screening" - added
Output schema / properties / threads / items / properties / messages / items / properties / withheld / descriptionAdded value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment." - added
Output schema / properties / threads / items / properties / messages / items / properties / withheld / enumAdded value: +[ + "screening", + "not_yet_screened" +]
- Changed
messages_list_all_mailboxes7 fields changed- removed
Output schema / properties / messages / items / properties / withheld / constRemoved value: -"screening" - added
Output schema / properties / messages / items / properties / withheld / descriptionAdded value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment." - added
Output schema / properties / messages / items / properties / withheld / enumAdded value: +[ + "screening", + "not_yet_screened" +] - added
Output schema / properties / screeningWaitAdded value: +{ + "description": "Present where a message is marked not_yet_screened: the seconds to wait before reading those messages by their ids.", + "type": "number" +} - removed
Output schema / properties / threads / items / properties / messages / items / properties / withheld / constRemoved value: -"screening" - added
Output schema / properties / threads / items / properties / messages / items / properties / withheld / descriptionAdded value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment." - added
Output schema / properties / threads / items / properties / messages / items / properties / withheld / enumAdded value: +[ + "screening", + "not_yet_screened" +]
- Changed
threads_get4 fields changed- removed
Output schema / properties / messages / items / properties / withheld / constRemoved value: -"screening" - added
Output schema / properties / messages / items / properties / withheld / descriptionAdded value: +"Why none of its words are here: screening, it screened as an attack; not_yet_screened, the account's screening allowance had no room for it at that moment." - added
Output schema / properties / messages / items / properties / withheld / enumAdded value: +[ + "screening", + "not_yet_screened" +] - added
Output schema / properties / screeningWaitAdded value: +{ + "description": "Present where a message is marked not_yet_screened: the seconds to wait before reading those messages by their ids.", + "type": "number" +}
11 tool updates
- Changed
mailboxes_list1 field changed- added
Output schema / properties / mailboxes / items / properties / inbox / properties / newestOnlyAdded value: +{ + "const": true, + "description": "Present where its provider shows a mail app only the inbox's newest messages: the counts are of those, and the inbox holds more.", + "type": "boolean" +}
- Changed
messages_list1 field changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
messages_list_all_mailboxes1 field changed- added
Output schema / properties / asked / items / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
sweeps_apply1 field changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
sweeps_preview1 field changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
sweeps_put_back1 field changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: what this put-back could not find there is counted under notReached, never gone, and stays to be put back - a call again reaches it only once that folder holds fewer messages than its provider shows.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
threads_archive2 fields changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / threads / items / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
threads_get1 field changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
threads_modify2 fields changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / threads / items / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
threads_trash2 fields changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / threads / items / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
- Changed
threads_untrash2 fields changed- added
Output schema / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / threads / items / properties / newestOnlyAdded value: +{ + "description": "The folders whose provider showed only their newest messages, each with how many it showed: every one holds more, and nothing before those was read, searched, counted or acted on, so finding nothing there says nothing of the rest.", + "items": { + "additionalProperties": false, + "properties": { + "folder": { + "type": "string" + }, + "shown": { + "type": "number" + } + }, + "required": [ + "folder", + "shown" + ], + "type": "object" + }, + "type": "array" +}
18 tool updates
- Changed
drafts_create2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Output schema / properties / unfilledFields / descriptionPrevious 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."
- Changed
drafts_forward2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Output schema / properties / unfilledFields / descriptionPrevious 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."
- Changed
drafts_reply3 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / replyAll / descriptionPrevious value: -"Also address everyone the message was sent to and copied - never its blind copies, never this mailbox."New value: +"true addresses everyone the message was sent to and copied too - never its blind copies, never this mailbox." - changed
Output schema / properties / unfilledFields / descriptionPrevious 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."
- Changed
drafts_send1 field changed- changed
Input schema / properties / afterwards / descriptionPrevious 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."
- Changed
drafts_update3 fields changed- changed
Input schema / properties / attachments / descriptionPrevious value: -"Files to carry, each held by any connected mailbox, written out or 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. Named, they replace the ones it holds - never the pictures inside its words - and an empty list removes them all. An Outlook draft takes on the new files before it gives up the old, so a replacement stopped midway is reported and may leave both. An Outlook draft sent while it is rewritten may lose its old files from the sent copy."New value: +"Files to carry, each held by any connected mailbox, written out or 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. Named, they replace the ones it holds - never the pictures inside its words - and an empty list removes them all. An Outlook draft takes on the new files before it gives up the old, so a replacement stopped midway is reported and may leave both. An Outlook draft sent while it is rewritten may lose its old files from the sent copy." - changed
Input schema / properties / chatFiles / descriptionPrevious value: -"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. Named, they and attachments together replace the files the draft holds: restate in attachments any it should keep."New value: +"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. Named, they and attachments together replace the files the draft holds: one it holds stays only where attachments names it again." - changed
Output schema / properties / unfilledFields / descriptionPrevious 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."
- Changed
messages_forward2 fields changed- changed
Input schema / properties / afterwards / descriptionPrevious 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." - changed
Input schema / properties / attachments / descriptionPrevious 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."
- Changed
messages_list1 field changed- changed
Input schema / properties / q / descriptionPrevious value: -"A Gmail mailbox, whatever its provider, reads Gmail's search operators: from:, to:, cc:, subject:, is:unread, is:starred, in:sent, has:attachment, filename:pdf, after:2026/01/31, before:, newer_than:7d, larger:5M, OR, -word and ( ). An Outlook mailbox reads Microsoft's keyword query language - from:, to:, cc:, subject:, body:, received:, hasAttachments:true, plain words and quoted phrases, AND, OR and NOT in capitals - and never a filter expression such as isRead eq false. A few distinctive words, with OR between alternatives, miss less than a copied subject line or sentence. Any other mailbox whose provider is imap reads only from:, to: and cc: (never me), subject:, plain words and quoted phrases, -word or -\"a phrase\" leaving it out, is:unread, one run of OR between any of those (as a OR b OR c), has:attachment, and larger: and smaller: in bytes or as 500K or 5M, after: and before: as 2026/01/31, newer_than: in days, months or years, and one in: or label: naming one folder, by the name labels_list gives a label of type user or as inbox, sent, archive, drafts, spam or trash, a name holding a space quoted and a quote or backslash inside the quotes taking a backslash before it, with no AND or NOT, and is searched by message in every folder but the bin and junk."New value: +"A Gmail mailbox, whatever its provider, reads Gmail's search operators: from:, to:, cc:, subject:, is:unread, is:starred, in:sent, has:attachment, filename:pdf, after:2026/01/31, before:, newer_than:7d, larger:5M, OR, -word and ( ). An Outlook mailbox reads Microsoft's keyword query language - from:, to:, cc:, subject:, body:, received:, hasAttachments:true, plain words and quoted phrases, AND, OR and NOT in capitals - and never a filter expression such as isRead eq false. A few distinctive words, with OR between alternatives, miss less than a copied subject line or sentence. Any other mailbox whose provider is imap reads only from:, to: and cc: (never me), subject:, plain words and quoted phrases, -word or -\"a phrase\" leaving it out, is:unread, one run of OR between any of those (as a OR b OR c), has:attachment, and larger: and smaller: in bytes or as 500K or 5M, after: and before: as 2026/01/31, newer_than: in days, months or years, and one in: or label: naming one folder, by the name labels_list gives a label of type user or as inbox, sent, archive, drafts, spam or trash, a name holding a space quoted and a quote or backslash inside the quotes taking a backslash before it, with no AND or NOT, and is searched by message in every folder but the bin and junk. after: and before: written as a bare date open at midnight in the person's own time zone, save in an Outlook mailbox's query, whose dates Microsoft reads itself."
- Changed
messages_list_all_mailboxes2 fields changed- changed
Input schema / properties / run / descriptionPrevious value: -"The name of a task this search is one run of, repeated as on a schedule - 1 to 40 letters, digits and hyphens. Each mailbox is then read from ten minutes before the last run under that name began reading it, or for the last 24 hours where none has, its first run, as its asked entry says under run. A mailbox's mark moves only once a run answers its whole period to its last page, so one not reached or not paged to its end is read from its older mark next time: page on with nextPageToken under the same run. An account keeps 50 names, the longest unused forgotten first."New value: +"The name of a task this search is one run of, repeated as on a schedule - 1 to 40 letters, digits and hyphens. Each mailbox is then read from ten minutes before the last run under that name began reading it, or for the last 24 hours where none has, its first run, as its asked entry says under run. A mailbox's mark moves only once a run answers its whole period to its last page, so one not reached or not paged to its end is read from its older mark next time, and nextPageToken under the same run pages on to it. An account keeps 50 names, the longest unused forgotten first." - changed
Input schema / properties / waiting / descriptionPrevious value: -"on_me answers only the threads waiting for the person's reply - their newest message someone else's, addressed to them; on_others only those waiting on another's - their newest message the person's own. Every mailbox is then read by thread, whatever by says, and each thread is answered with its newest message alone, drafts aside; one whose newest message reports a failed delivery is marked bounced and waits on nobody. Judge from each message what it asks. A page holds only what waits, so it can be short while more names a mailbox holding more. A Gmail, whatever its provider, and an Outlook mailbox answer both; any other mailbox whose provider is imap answers on_me by the mail no mail app marked answered and cannot answer on_others."New value: +"on_me answers only the threads waiting for the person's reply - their newest message someone else's, addressed to them; on_others only those waiting on another's - their newest message the person's own. Every mailbox is then read by thread, whatever by says, and each thread is answered with its newest message alone, drafts aside; one whose newest message reports a failed delivery is marked bounced and waits on nobody. A thread is picked by who wrote last and to whom - on any other mailbox whose provider is imap, by its answered mark - never by what its message asks, which its words alone say. A page holds only what waits, so it can be short while more names a mailbox holding more. A Gmail, whatever its provider, and an Outlook mailbox answer both; any other mailbox whose provider is imap answers on_me by the mail no mail app marked answered and cannot answer on_others."
- Changed
messages_reply3 fields changed- changed
Input schema / properties / afterwards / descriptionPrevious 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." - changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / replyAll / descriptionPrevious value: -"Also address everyone the message was sent to and copied - never its blind copies, never this mailbox."New value: +"true addresses everyone the message was sent to and copied too - never its blind copies, never this mailbox."
- Changed
messages_send2 fields changed- changed
Input schema / properties / afterwards / descriptionPrevious 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." - changed
Input schema / properties / attachments / descriptionPrevious 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."
- Changed
settings_filters_create2 fields changed- changed
Input schema / properties / focus / descriptionPrevious value: -"Outlook only: put the senders from names - each an email address, beside no other condition or action - always in Focused (focused) or always in Other (other), instead of making a rule. A sender already placed is moved."New value: +"Outlook only: the senders from names - each an email address, beside no other condition or action - go always in Focused (focused) or always in Other (other), and no rule is made. A sender already placed is moved." - changed
Input schema / properties / stop / descriptionPrevious value: -"Outlook only: keep later rules from acting on what this rule matches."New value: +"Outlook only: true keeps later rules from acting on what this rule matches."
- Changed
settings_filters_update2 fields changed- changed
Input schema / properties / stop / descriptionPrevious value: -"Outlook only: keep later rules from acting on what this rule matches."New value: +"Outlook only: true keeps later rules from acting on what this rule matches." - changed
Output schema / properties / previous / descriptionPrevious value: -"What became of the rule it replaced: removed; gone, already removed elsewhere, so the change is done; or kept, its removal failed or went unanswered, so both may stand - remove that one with settings_filters_delete."New value: +"What became of the rule it replaced: removed; gone, already removed elsewhere, so the change is done; or kept, its removal failed or went unanswered, so both may stand, and settings_filters_delete removes that one."
- Changed
settings_send_as_find1 field changed- changed
Output schema / properties / draftId / descriptionPrevious value: -"The draft holding the signature found, from and to sendAsEmail. Show it to the person, and only on their word keep the signature from it with settings_send_as_patch and fromDraft, before the draft is sent."New value: +"The draft holding the signature found, from and to sendAsEmail. It is the person's to see, and only on their word does settings_send_as_patch with fromDraft keep the signature from it, before the draft is sent."
- Changed
sweeps_preview10 fields changed- changed
Input schema / properties / domain / descriptionPrevious value: -"Count only mail from this domain or one under it, as example.com."New value: +"Only mail from this domain or one under it is counted, as example.com." - changed
Input schema / properties / excludeSubjects / descriptionPrevious value: -"Leave out of the count mail whose subject holds any of these phrases."New value: +"Mail whose subject holds any of these phrases is left out of the count." - changed
Input schema / properties / focus / descriptionPrevious value: -"Outlook alone: count only the mail Outlook sorts into Focused, or only that in Other. Outlook sorts its inbox alone."New value: +"Outlook alone: only the mail Outlook sorts into Focused, or only that in Other, is counted. Outlook sorts its inbox alone." - changed
Input schema / properties / keepNewest / descriptionPrevious value: -"Leave the newest this many of each sender's messages out of the count, so only the rest is counted."New value: +"The newest this many of each sender's messages are left out of the count, so only the rest is counted." - changed
Input schema / properties / largerThanBytes / descriptionPrevious value: -"Count only mail larger than this many bytes, as 5000000 for mail over 5 MB."New value: +"Only mail larger than this many bytes is counted, as 5000000 for mail over 5 MB." - changed
Input schema / properties / list / descriptionPrevious value: -"Count only mail from this mailing list, by its list id: what a message's listId holds between its angle brackets, as news.example.com."New value: +"Only mail from this mailing list is counted, by its list id: what a message's listId holds between its angle brackets, as news.example.com." - changed
Input schema / properties / olderThanDays / descriptionPrevious value: -"Count only mail that arrived more than this many days ago."New value: +"Only mail that arrived more than this many days ago is counted." - changed
Input schema / properties / senders / descriptionPrevious value: -"Count only mail from these addresses."New value: +"Only mail from these addresses is counted." - changed
Input schema / properties / subject / descriptionPrevious value: -"Count only mail whose subject holds this phrase, letter case aside."New value: +"Only mail whose subject holds this phrase, letter case aside, is counted." - changed
Input schema / properties / tab / descriptionPrevious value: -"Gmail alone: count only the mail in this tab of its inbox, as focus counts Outlook's Focused or Other."New value: +"Gmail alone: only the mail in this tab of its inbox is counted, as focus counts Outlook's Focused or Other."
- Changed
threads_archive2 fields changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again." - changed
Output schema / properties / threads / items / properties / outcome / descriptionPrevious value: -"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved: read it again with threads_get, or messages_get for a message, before acting on it again."New value: +"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved, which threads_get, or messages_get for a message, reads before it is acted on again."
- Changed
threads_modify2 fields changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again." - changed
Output schema / properties / threads / items / properties / outcome / descriptionPrevious value: -"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved: read it again with threads_get, or messages_get for a message, before acting on it again."New value: +"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved, which threads_get, or messages_get for a message, reads before it is acted on again."
- Changed
threads_trash2 fields changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again." - changed
Output schema / properties / threads / items / properties / outcome / descriptionPrevious value: -"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved: read it again with threads_get, or messages_get for a message, before acting on it again."New value: +"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved, which threads_get, or messages_get for a message, reads before it is acted on again."
- Changed
threads_untrash2 fields changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched, for the same call again." - changed
Output schema / properties / threads / items / properties / outcome / descriptionPrevious value: -"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved: read it again with threads_get, or messages_get for a message, before acting on it again."New value: +"done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved, which threads_get, or messages_get for a message, reads before it is acted on again."
4 tool updates
- Changed
threads_archive2 fields changed- changed
Output schema / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +] - changed
Output schema / properties / threads / items / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +]
- Changed
threads_modify2 fields changed- changed
Output schema / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +] - changed
Output schema / properties / threads / items / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +]
- Changed
threads_trash2 fields changed- changed
Output schema / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +] - changed
Output schema / properties / threads / items / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +]
- Changed
threads_untrash2 fields changed- changed
Output schema / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +] - changed
Output schema / properties / threads / items / properties / messages / items / properties / skipped / enumPrevious value: -[ - "sent", - "drafts", - "deleted", - "queued" -]New value: +[ + "sent", + "drafts", + "deleted", + "queued", + "unsynced" +]
1 tool update
- Changed
sweeps_apply1 field changed- added
Input schema / properties / onlyIfNewestAdded value: +{ + "description": "true acts only while this sweep's preview is still the newest of its mailbox, refused (sweep_replaced) once a newer one is held.", + "type": "boolean" +}
7 tool updates
- Changed
drafts_create2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / attachments / items / anyOfPrevious 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" + } +]
- Changed
drafts_forward2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / attachments / items / anyOfPrevious 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" + } +]
- Changed
drafts_reply2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / attachments / items / anyOfPrevious 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" + } +]
- Changed
drafts_update2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious value: -"Files to carry, each held by a connected mailbox of the draft's own provider, written out or 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. Named, they replace the ones it holds - never the pictures inside its words - and an empty list removes them all. An Outlook draft takes on the new files before it gives up the old, so a replacement stopped midway is reported and may leave both. An Outlook draft sent while it is rewritten may lose its old files from the sent copy."New value: +"Files to carry, each held by any connected mailbox, written out or 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. Named, they replace the ones it holds - never the pictures inside its words - and an empty list removes them all. An Outlook draft takes on the new files before it gives up the old, so a replacement stopped midway is reported and may leave both. An Outlook draft sent while it is rewritten may lose its old files from the sent copy." - changed
Input schema / properties / attachments / items / anyOfPrevious 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" + } +]
- Changed
messages_forward2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / attachments / items / anyOfPrevious 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" + } +]
- Changed
messages_reply2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / attachments / items / anyOfPrevious 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" + } +]
- Changed
messages_send2 fields changed- changed
Input schema / properties / attachments / descriptionPrevious 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." - changed
Input schema / properties / attachments / items / anyOfPrevious 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" + } +]
7 tool updates
- Changed
drafts_create2 fields changed- added
Input schema / properties / fromAdded 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" +} - added
Output schema / properties / fromAdded value: +{ + "description": "The address the draft goes from once sent.", + "type": "string" +}
- Changed
drafts_forward2 fields changed- added
Input schema / properties / fromAdded 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" +} - added
Output schema / properties / fromAdded value: +{ + "description": "The address the draft goes from once sent.", + "type": "string" +}
- Changed
drafts_reply2 fields changed- added
Input schema / properties / fromAdded value: +{ + "description": "The address it goes from. Left out, a reply goes from the address its message was sent to where Gmail lists that one, else from the mailbox's default. 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" +} - added
Output schema / properties / fromAdded value: +{ + "description": "The address the draft goes from once sent.", + "type": "string" +}
- Changed
drafts_update1 field changed- added
Output schema / properties / fromAdded value: +{ + "description": "The address the draft goes from once sent.", + "type": "string" +}
- Changed
messages_forward2 fields changed- added
Input schema / properties / fromAdded 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" +} - added
Output schema / properties / fromAdded value: +{ + "description": "The address it went from.", + "type": "string" +}
- Changed
messages_reply2 fields changed- added
Input schema / properties / fromAdded value: +{ + "description": "The address it goes from. Left out, a reply goes from the address its message was sent to where Gmail lists that one, else from the mailbox's default. 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" +} - added
Output schema / properties / fromAdded value: +{ + "description": "The address it went from.", + "type": "string" +}
- Changed
messages_send2 fields changed- added
Input schema / properties / fromAdded 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" +} - added
Output schema / properties / fromAdded value: +{ + "description": "The address it went from.", + "type": "string" +}
7 tool updates
- Changed
drafts_create5 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"The message text."New value: +"The message text; html alone is enough, its text read from it." - changed
Input schema / properties / html / descriptionPrevious value: -"The message as HTML, for formatting; body stays its plain-text version. An Outlook mailbox keeps only the HTML and writes the plain version from it."New value: +"The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it." - changed
Input schema / properties / to / descriptionPrevious value: -"Who the message is addressed to."New value: +"Who the message is addressed to. A draft may name nobody yet; it is sent only once it names someone." - removed
Input schema / properties / to / minItemsRemoved value: -1 - changed
Input schema / requiredPrevious value: -[ - "mailbox", - "to", - "subject", - "body" -]New value: +[ + "mailbox", + "subject" +]
- Changed
drafts_forward3 fields changed- changed
Input schema / properties / to / descriptionPrevious 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." - removed
Input schema / properties / to / minItemsRemoved value: -1 - changed
Input schema / requiredPrevious value: -[ - "mailbox", - "messageId", - "to" -]New value: +[ + "mailbox", + "messageId" +]
- Changed
drafts_reply3 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"The reply text."New value: +"The reply text; html alone is enough, its text read from it." - changed
Input schema / properties / html / descriptionPrevious value: -"The message as HTML, for formatting; body stays its plain-text version. An Outlook mailbox keeps only the HTML and writes the plain version from it."New value: +"The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it." - changed
Input schema / requiredPrevious value: -[ - "mailbox", - "messageId", - "body" -]New value: +[ + "mailbox", + "messageId" +]
- Changed
drafts_send2 fields changed- added
Input schema / properties / afterwardsAdded 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" +} - added
Output schema / properties / afterwardsAdded 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" +}
- Changed
messages_forward2 fields changed- added
Input schema / properties / afterwardsAdded 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" +} - added
Output schema / properties / afterwardsAdded 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" +}
- Changed
messages_reply5 fields changed- added
Input schema / properties / afterwardsAdded 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" +} - changed
Input schema / properties / body / descriptionPrevious value: -"The reply text."New value: +"The reply text; html alone is enough, its text read from it." - changed
Input schema / properties / html / descriptionPrevious value: -"The message as HTML, for formatting; body stays its plain-text version. An Outlook mailbox keeps only the HTML and writes the plain version from it."New value: +"The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it." - changed
Input schema / requiredPrevious value: -[ - "mailbox", - "messageId", - "body", - "requestId" -]New value: +[ + "mailbox", + "messageId", + "requestId" +] - added
Output schema / properties / afterwardsAdded 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" +}
- Changed
messages_send5 fields changed- added
Input schema / properties / afterwardsAdded 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" +} - changed
Input schema / properties / body / descriptionPrevious value: -"The message text."New value: +"The message text; html alone is enough, its text read from it." - changed
Input schema / properties / html / descriptionPrevious value: -"The message as HTML, for formatting; body stays its plain-text version. An Outlook mailbox keeps only the HTML and writes the plain version from it."New value: +"The message as HTML, for formatting; body stays its plain-text version, read from it where left out. An Outlook mailbox keeps only the HTML and writes the plain version from it." - changed
Input schema / requiredPrevious value: -[ - "mailbox", - "to", - "subject", - "body", - "requestId" -]New value: +[ + "mailbox", + "to", + "subject", + "requestId" +] - added
Output schema / properties / afterwardsAdded 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" +}
3 tool updates
- Changed
drafts_forward2 fields changed- added
Input schema / properties / attachmentsAdded 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" +} - added
Input schema / properties / chatFilesAdded 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" +}
- Changed
messages_forward6 fields changed- added
Input schema / properties / attachmentsAdded 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" +} - added
Input schema / properties / bccAdded 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" +} - added
Input schema / properties / ccAdded 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" +} - added
Input schema / properties / chatFilesAdded 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" +} - added
Output schema / properties / uploadsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "address": { + "type": "string" + }, + "filename": { + "type": "string" + }, + "upload": { + "type": "string" + } + }, + "required": [ + "filename", + "upload", + "address" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "threadId" -]
- Changed
messages_reply5 fields changed- added
Input schema / properties / attachmentsAdded 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" +} - added
Input schema / properties / bccAdded 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" +} - added
Input schema / properties / chatFilesAdded 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" +} - added
Output schema / properties / uploadsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "address": { + "type": "string" + }, + "filename": { + "type": "string" + }, + "upload": { + "type": "string" + } + }, + "required": [ + "filename", + "upload", + "address" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "threadId" -]
1 tool update
- Changed
sweeps_apply3 fields changed- changed
Input schema / properties / groups / items / properties / action / enumPrevious value: -[ - "bin", - "archive", - "read" -]New value: +[ + "bin", + "archive", + "read", + "file" +] - added
Input schema / properties / groups / items / properties / labelAdded value: +{ + "description": "For file alone: the id labels_list gives the label or folder the group goes into.", + "pattern": "^[A-Za-z0-9_=-]{1,512}$", + "type": "string" +} - changed
Output schema / properties / groups / items / properties / action / enumPrevious value: -[ - "bin", - "archive", - "read" -]New value: +[ + "bin", + "archive", + "read", + "file" +]
1 tool update
- Changed
sweeps_apply3 fields changed- changed
Input schema / properties / groups / items / properties / action / enumPrevious value: -[ - "bin", - "archive" -]New value: +[ + "bin", + "archive", + "read" +] - changed
Output schema / properties / groups / items / properties / action / enumPrevious value: -[ - "bin", - "archive" -]New value: +[ + "bin", + "archive", + "read" +] - added
Output schema / properties / groups / items / properties / alreadyReadAdded value: +{ + "type": "number" +}
1 tool update
- Changed
sweeps_preview6 fields changed- added
Input schema / properties / focusAdded value: +{ + "description": "Outlook alone: count only the mail Outlook sorts into Focused, or only that in Other. Outlook sorts its inbox alone.", + "enum": [ + "focused", + "other" + ], + "type": "string" +} - added
Input schema / properties / largerThanBytesAdded value: +{ + "description": "Count only mail larger than this many bytes, as 5000000 for mail over 5 MB.", + "maximum": 2147483647, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / listAdded value: +{ + "description": "Count only mail from this mailing list, by its list id: what a message's listId holds between its angle brackets, as news.example.com.", + "pattern": "^[a-z0-9_-]+(?:\\.[a-z0-9_-]+)+$", + "type": "string" +} - added
Input schema / properties / tabAdded value: +{ + "description": "Gmail alone: count only the mail in this tab of its inbox, as focus counts Outlook's Focused or Other.", + "enum": [ + "primary", + "social", + "promotions", + "updates", + "forums" + ], + "type": "string" +} - added
Output schema / properties / nextSendersAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "address": { + "type": "string" + }, + "messages": { + "type": "number" + } + }, + "required": [ + "address", + "messages" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / withheldNextSendersAdded value: +{ + "type": "number" +}
4 tool updates
- Changed
threads_archive1 field changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."
- Changed
threads_modify1 field changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."
- Changed
threads_trash1 field changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."
- Changed
threads_untrash1 field changed- changed
Output schema / properties / notReached / descriptionPrevious value: -"The ids the call did not reach - its time ran out, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."New value: +"The ids the call did not reach - its time ran out, its connection to the mailbox was lost, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them."
1 tool update
- Changed
threads_modify5 fields changed- added
Input schema / properties / idsAdded value: +{ + "description": "2 to 100 threadIds - or with scope message message ids - in place of id, acted on in one call.", + "items": { + "description": "The provider's own identifier.", + "pattern": "^[A-Za-z0-9_=-]{1,512}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 2, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "mailbox", - "id" -]New value: +[ + "mailbox" +] - added
Output schema / properties / notReachedAdded value: +{ + "description": "The ids the call did not reach - its time ran out, or the mailbox refused it whole, as the thread that met the refusal says - each left untouched: make the same call again with them.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / threadsAdded value: +{ + "description": "Each thread the call reached, with ids.", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "labelIds": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "messages": { + "items": { + "additionalProperties": false, + "properties": { + "done": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "restoredTo": { + "type": "string" + }, + "skipped": { + "enum": [ + "sent", + "drafts", + "deleted", + "queued" + ], + "type": "string" + } + }, + "required": [ + "id", + "done" + ], + "type": "object" + }, + "type": "array" + }, + "outcome": { + "description": "done, whole; notDone, left as it was, reason saying why; possiblyDone, moved in part - messages saying which were - or asked with no answer back, so it may have moved: read it again with threads_get, or messages_get for a message, before acting on it again.", + "enum": [ + "done", + "notDone", + "possiblyDone" + ], + "type": "string" + }, + "reason": { + "description": "Why it is not done, as a refusal of the whole call names it.", + "type": "string" + } + }, + "required": [ + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "labelIds" -]
Publisher details
- Operator
- Lumman Ltd · Publisher source
- Operator website
- https://lumman.co · Publisher source
- Vendor relationship
- Independent · Publisher source
- Documentation
- https://lumman.co/mcp/multi-mail · Publisher source
- Trust center
- Not available
- Restrictions
- Any number of mailboxes free, with 25 actions a day; a paid plan raises it to 1,000 a day. · Publisher source
Related MCP Connectors
Read, send, file and search email in any Gmail, Microsoft 365 or IMAP mailbox, plus its calendar.
Read, send, organize, watch email on any IMAP mailbox: Gmail, iCloud, OVH, Zoho, Fastmail + CalDAV.
Never-stored live email: read, send and triage Gmail, Outlook / Microsoft 365, or any IMAP mailbox.
Read, search and draft replies across all your mailboxes, Google Chat and Telegram.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables searching, reading, sending, replying to, forwarding, and organizing email across multiple SMTP/IMAP accounts.1,089 npmMIT
- AlicenseNot gradedqualityCmaintenanceRead-only, multi-account access to Proton Mail (via Proton Bridge) and Gmail over IMAP, letting a session search, list, and read messages, threads, folders, and attachments without sending, deleting, or marking anything. Per-process account scoping, Keychain-held passwords, and opt-in sandboxed attachment saving keep multiple mailboxes separated and untouched.MIT
- AlicenseNot gradedqualityCmaintenanceEnables receiving and sending email via IMAP and SMTP across multiple accounts, with tools for listing, searching, reading, replying, and managing messages.MIT
- AlicenseBqualityBmaintenanceYour mailboxes in ChatGPT and Claude: Gmail, iCloud, Fastmail or any IMAP/SMTP account, as many as you like. Search, read, threaded replies, drafts, allowlisted sending and attachments; passwords are encrypted in the browser and the server stores nothing.336 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.