Skip to main content
Glama

mail_reply

Open a threaded reply draft for review without sending it, optionally including the quoted original message. Use it to prepare email responses in Mail.

Instructions

Reply to a message, opening a threaded draft for review (Automation).

NEVER sends. message_id: the RFC822 id from a mail read. mailbox is REQUIRED: the folder value from the SAME search result, passed back VERBATIM (an opaque imap://<uuid>/<path> token; the five canonical names also work). Mail sets the threading headers natively; include_quote appends the quoted original. Returns a locator dict — save the draft to Drafts and drafts() resolves it by a stable message-id.

THE AUTOSAVE WINDOW: that message-id is stamped only when Mail autosaves the draft, ~10-15 SECONDS after this returns — asynchronously, and nothing can hurry it. So drafts() called immediately shows nothing; that is normal, not a failed create. Wait for the window, then drafts() resolves it. Do NOT retry this call because the draft has not appeared: you get two drafts and the first still arrives. Note a reply draft cannot be sent with send_mail(draft_id=…) — rebuilding it would drop the threading headers, so that call refuses and points you at reply_all(dry_run=False) instead.

Input Schema

NameRequiredDescriptionDefault
mailboxYes
message_idYes
reply_bodyYes
include_quoteNo

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.15.1

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds far more: threading headers are set natively, an async ~10-15 second autosave window applies, and retrying produces duplicate drafts. These are exactly the non-obvious traits an agent cannot infer from structured fields.

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

Conciseness4/5

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

Front-loaded and well-sectioned: purpose first, then parameter guidance, then the autosave caveat. It is dense and the autosave paragraph runs long with emphasis formatting, but nearly every sentence carries operationally necessary information, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description still notes it returns a locator dict and how drafts() resolves it. Combined with the send-path exclusion and the retry hazard, an agent has everything needed to call and chain this tool correctly.

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

Parameters4/5

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

With 0% schema description coverage, the description carries the burden and mostly does: message_id is defined as the RFC822 id from a mail read, and mailbox is explained in detail (REQUIRED, the `folder` value from the same search result, verbatim opaque imap:// token, canonical names also accepted), plus include_quote appends the quoted original. reply_body is left to the parameter name, a minor but real gap.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Reply to a message, opening a threaded draft for review') and immediately adds the key differentiator 'NEVER sends'. An agent can distinguish this from create_draft (new draft) or a send operation without inspecting any schema.

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

Usage Guidelines5/5

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

It gives explicit when-not rules: do NOT retry if the draft does not appear, and the resulting draft cannot be delivered via send_mail(draft_id=…) because that call refuses and redirects to reply_all(dry_run=False). It also names the correct follow-up (save to Drafts, then drafts()) and the required waiting window.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.