Skip to main content
Glama

Reply Email

reply_email

Use this when the user wants to reply to an email that lives in the Mac's Apple Mail (message ID from list_emails/search_emails). Previews before sending. The reply that is sent holds your text followed by a plain-text quote of the original ("On , wrote:" and the original's lines prefixed with > ), in the same thread; html_body is converted to plain text. If the original has no readable text the reply is sent with your text only and the response says so (quoted_original: false and a warning to relay). To leave the reply in Drafts WITHOUT sending, pass save_as_draft: true: the draft is in the right thread with the Reply/Reply-All recipients and holds the same content (not Mail's styled quote), and send is never called. On either path, if Mail does not keep the text or the quote, the call fails and nothing is sent or saved. create_draft with reply_to_message_id leaves the same kind of draft. For a Microsoft 365 message ID from m365_list_emails, use m365_reply_email. Pass account (from list_emails/search_emails results) to skip scanning other accounts and avoid timeouts on multi-account Macs.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyNoPlain-text reply body.
accountNoAccount (from the listing) the message is in — pass it to skip scanning other accounts and avoid multi-account timeouts.
confirmNoConsent gate: the first call previews the reply; call again with confirm=true to actually SEND it — or to save it when save_as_draft is set.false
html_bodyNoHTML reply body. Takes precedence over `body` when both are given. It is converted to plain text: a reply is sent, or saved, as text with a plain-text quote of the original.
reply_allNoReply to all original recipients instead of just the sender.false
message_idYesId of the message to reply to (from list_emails/search_emails).
save_as_draftNoSave the reply in Drafts instead of sending it: your text followed by a plain-text quote of the original, in the right thread, with the Reply/Reply-All recipients. Nothing is sent on this path.false

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
sentNoFalse on the draft path — stated explicitly so 'no error' is never read as 'it went out'.
repliedNo
warningNoPresent when the reply went out, or was saved, without the quote. Relay it to the user.
message_idNo
draft_mailboxNoWhere the draft was left, so the user knows where to look.
draft_subjectNoSubject of the draft that was created.
saved_as_draftNoTrue when save_as_draft was used: the reply is in Drafts and nothing was sent.
quoted_originalNoTrue when the reply (sent, or saved as a draft) holds your text followed by a plain-text quote of the original; false when the original had no readable text and the reply carries your text only.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / html_body / description
      Previous value: -"HTML reply body. Takes precedence over `body` when both are given."New value: +"HTML reply body. Takes precedence over `body` when both are given. It is converted to plain text: a reply is sent, or saved, as text with a plain-text quote of the original."
    • changedInput schema / properties / save_as_draft / description
      Previous value: -"Save the native reply in Drafts instead of sending it. Keeps Mail's reply template: automatic quote of the original, the right thread, and the Reply/Reply-All recipients. Nothing is sent on this path."New value: +"Save the reply in Drafts instead of sending it: your text followed by a plain-text quote of the original, in the right thread, with the Reply/Reply-All recipients. Nothing is sent on this path."
    • addedOutput schema / properties / quoted_original
      Added value: +{
      +  "description": "True when the reply (sent, or saved as a draft) holds your text followed by a plain-text quote of the original; false when the original had no readable text and the reply carries your text only.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / warning
      Added value: +{
      +  "description": "Present when the reply went out, or was saved, without the quote. Relay it to the user.",
      +  "type": "string"
      +}
  2. Changed6 schema fields changed
    • changedInput schema / properties / confirm / description
      Previous value: -"Consent gate: the first call previews the reply; call again with confirm=true to actually SEND it."New value: +"Consent gate: the first call previews the reply; call again with confirm=true to actually SEND it — or to save it when save_as_draft is set."
    • addedInput schema / properties / save_as_draft
      Added value: +{
      +  "default": "false",
      +  "description": "Save the native reply in Drafts instead of sending it. Keeps Mail's reply template: automatic quote of the original, the right thread, and the Reply/Reply-All recipients. Nothing is sent on this path.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / draft_mailbox
      Added value: +{
      +  "description": "Where the draft was left, so the user knows where to look.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / draft_subject
      Added value: +{
      +  "description": "Subject of the draft that was created.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / saved_as_draft
      Added value: +{
      +  "description": "True when save_as_draft was used: the reply is in Drafts and nothing was sent.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / sent
      Added value: +{
      +  "description": "False on the draft path — stated explicitly so 'no error' is never read as 'it went out'.",
      +  "type": "boolean"
      +}
  3. Changed6 schema fields changed
    • addedInput schema / properties / account / description
      Added value: +"Account (from the listing) the message is in — pass it to skip scanning other accounts and avoid multi-account timeouts."
    • addedInput schema / properties / body / description
      Added value: +"Plain-text reply body."
    • addedInput schema / properties / confirm / description
      Added value: +"Consent gate: the first call previews the reply; call again with confirm=true to actually SEND it."
    • addedInput schema / properties / html_body / description
      Added value: +"HTML reply body. Takes precedence over `body` when both are given."
    • addedInput schema / properties / message_id / description
      Added value: +"Id of the message to reply to (from list_emails/search_emails)."
    • addedInput schema / properties / reply_all / description
      Added value: +"Reply to all original recipients instead of just the sender."
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations are thin (readOnly=false, destructive=false, openWorld=true), and the description carries the real burden: it discloses the preview/confirm gate, the exact quote format appended ('On <date>, <sender> wrote:' with '> ' prefixes), that html_body is downgraded to plain text, the no-readable-text fallback with `quoted_original: false` plus a warning to relay, the save_as_draft path (draft in-thread, send never called), and failure semantics (call fails and nothing is sent/saved if Mail drops the text). This is far beyond what annotations convey.

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?

The use case and confirm gate are front-loaded, and there is almost no dead text, but the single dense paragraph packs many clauses (quote format, draft path, failure semantics, sibling routing) that could be split for scanability. Efficient, if slightly overloaded.

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

Completeness5/5

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

For a send-mutation tool with 7 parameters, an output schema, and sparse annotations, the description covers the safety gate, both send and draft paths, content transformation, failure behavior, and cross-tool routing. An agent has everything needed to call it correctly and interpret a partial result.

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?

Schema coverage is 100%, so the schema documents each parameter, but the description adds non-obvious interplay the schema lacks: `confirm` is a two-call consent gate whose second call sends (or saves when save_as_draft is set), html_body takes precedence over body and is converted to text, and `account` prevents timeouts. It exceeds the baseline-3 for full schema coverage, though it does not restate every parameter.

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?

States a specific verb+resource (reply to an email in Apple Mail) and immediately scopes the source of the message ID (list_emails/search_emails). It explicitly names the sibling it is not (m365_reply_email for Microsoft 365 IDs) and the overlapping alternative (create_draft with reply_to_message_id), so an agent can route correctly without opening other schemas.

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

Usage Guidelines5/5

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

Explicit when-to-use (user wants to reply to a Mac Apple Mail message) and when-not (use m365_reply_email for M365 IDs). It also gives a concrete operational tip (pass `account` to skip scanning and avoid multi-account timeouts) and distinguishes the draft path, covering alternatives and exclusions thoroughly.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources