Skip to main content
Glama
parasxos

apple-mail-mcp

by parasxos

✉️ apple-mail-mcp

Your Apple Mail, fully agent-operable.

Runs locally on your Mac. It opens the Mail store read-only, returns only what a client asks for, and sends only when the client explicitly calls the send tool. No third-party relay, no cloud copy of your mail.

uvx apple-mailbox-mcp setup

Measured on a 300k-message store: addressing one message 0.1 ms via Mail's own index, against 7 to 10 s for the AppleScript whose-clause; full-text search p95 under 1 ms. Method and script: docs/benchmarks.md.

Use Claude Code, Claude Desktop, Codex, Cursor, VS Code, or any local MCP client to search, read, triage, and send email through Apple Mail — your mailbox becomes something you can ask, search and delegate to — find anything in seconds, file hundreds of messages through a reviewed plan, send polished mail as the right identity, and let Exchange deliver scheduled messages even while your Mac is asleep.

ci tools platform python mcp contract


demo: uvx install, status, and a Claude search over a 298k-message store

✨ What you can do

🔍 Ask your mailbox questions. "What did Maria send me about the memo last week?" Search runs at database speed — sender, mailbox, dates, unread, attachments — and reconstructs whole conversations.

🕳️ Find what Mail itself can't. Mail's built-in search only skims the first line of most messages. apple-mail-mcp indexes every message body on your Mac — and for Exchange accounts it even fetches the bodies Mail never downloaded, straight from your own mailbox on the server. Queries that returned nothing return twenty.

🎭 Send as the right you. Work mail through the work lane, personal through Gmail — one parameter picks the identity. Every message is composed from scratch as clean, standards-correct email that renders everywhere, including Outlook (the AppleScript compose path that arrives blank in Outlook is the reason this project exists).

Schedule like "Send Later", but scriptable. A scheduled message is frozen in full — attachments, identity, exact text. Exchange can execute it server-side at the requested time, lid closed; other providers use a local background sender and deliver on its next pass (or just after the Mac wakes).

🗂️ Triage at scale, without fear. "File these 40 newsletters" becomes a reviewable plan: nothing moves until it is approved, every message is re-checked before it is touched, and the result is verified against Mail's own records afterward. Delete means Mail's Trash — nothing is ever erased.

📝 Draft where your drafts live. Compose into your real Exchange Drafts folder, ready to open in Outlook or OWA — created, never auto-sent.

Related MCP server: apple-mail-readonly-mcp

⚡ Why it's different

Every other Apple-Mail MCP drives AppleScript for both finding and acting. This one doesn't — and it shows:

Operation

AppleScript whose-clause

apple-mailbox-mcp

🔍 Search 300k messages

seconds-to-timeout

milliseconds

🎯 Address one message in a 71k mailbox

7–10 s (measured)

< 0.1 ms

✉️ Send mail

body renders blank in Outlook

renders everywhere, plain+HTML

⏰ Schedule mail

server-side on Exchange; reliable local queue everywhere else

🗂️ Bulk triage

one call per message, fire-and-forget

one reviewed plan, one apply, verified

Every number above was measured on a live ~300,000-message store; the script and full method are in docs/benchmarks.md.

If the benchmarks hold up on your mailbox, a ⭐ helps others find this.

🛡️ Built to be trusted

  • Plan → review → apply → verify. Bulk actions are frozen into a plan you can read before anything happens; the outcome is confirmed against Mail's own store afterward — never assumed.

  • 🗑️ Nothing is ever erased. "Delete" files into Mail's Trash, and destructive plans have their own separate, capped door.

  • 👓 Read-only mail mode. Set EMAIL_MCP_READ_ONLY=1 and only the 11 non-mutating mail tools exist in the session. Search may still maintain its local body index, and attachment retrieval writes the requested file to the configured temporary directory.

  • 💾 A crash-safe scheduled queue. Manifest updates are flushed and atomically replaced, so an interrupted rewrite keeps the last valid record. If a file is damaged independently, diagnostics name it instead of claiming the queue is empty, while healthy scheduled messages keep moving.

  • 🧾 A local, best-effort activity ledger. Sends, schedules, cancellations and triage runs are recorded without making an unwritable log block mail. For reconciliation, the message itself, its Message-ID and its scheduled record remain authoritative.

  • 🔒 No third-party mail relay. Mail content stays local except for mail you send and optional access to your own provider for Exchange/IMAP body backfill, drafts and server-side scheduling. SMTP passwords stay in the macOS Keychain or 1Password; Microsoft OAuth tokens live in a private 0600 cache under ~/.email-mcp/graph/.

  • 📜 A written contract. Since v1.0 every tool's shapes, error codes and caps evolve additively, held in place by 800+ automated tests.

  • 🤝 Clear to every MCP client. All 21 tools identify what they do, explain every input, and declare whether they read, change or can remove data. Newer clients receive structured results; older clients keep the same JSON text. Both the maintained MCP 1.x line and current MCP 2.x are tested.

  • 🧱 Built to evolve without breaking your workflow. Email rules are isolated from MCP, Mail.app, Exchange, delivery, and local storage. Provider or SDK changes stay at the edge while the 21-tool contract remains stable. The dependency rules are enforced in CI and explained in the architecture guide.

  • 📦 Releases you can verify. Every tagged release is built and installed in a clean environment before publishing. GitHub includes the wheel, source archive, SHA-256 checksums and signed build provenance—not just source code.

  • 🩺 Self-diagnosing. apple-mail-mcp status gives one readable readiness, scheduling and recovery screen. apple-mail-mcp doctor provides the complete diagnostic detail and an exact fix for anything red.

🚀 Quick start

  1. Grant Full Disk Access to your terminal app (System Settings → Privacy & Security → Full Disk Access), then quit and reopen the terminal. This is Apple's one manual toggle — there is no pop-up for it.

  2. Install and set up:

    uvx apple-mailbox-mcp setup     # or: pipx install apple-mailbox-mcp
    # or via Homebrew:
    brew install parasxos/tap/apple-mail-mcp && apple-mail-mcp setup
  3. Register with your client — one line for Claude Code:

    claude mcp add --transport stdio --scope user apple-mail -- uvx apple-mailbox-mcp

    or the same JSON block for Claude Desktop / Cursor / VS Code (claude_desktop_config.json / .cursor/mcp.json / .vscode/mcp.json):

    {
      "mcpServers": {
        "apple-mail": { "command": "uvx", "args": ["apple-mailbox-mcp"] }
      }
    }
  4. Verify: uvx apple-mailbox-mcp status prints one readiness screen — or just ask your client to run the doctor tool; every red line comes with its exact fix. The first body-index build on a large mailbox runs in the background and can take a few minutes; search works immediately and completes as the index fills.

Before running setup, grant your terminal app Full Disk Access (System Settings → Privacy & Security → Full Disk Access) — that is how reading stays fast and local. There is no pop-up for this one; it is Apple's one manual toggle, and setup walks you to the exact pane if it finds it missing.

setup asks everything in plain words (bare Enter accepts the recommended answer), offers a sending identity, builds the body-search index, verifies the nightly refresh actually runs, and ends by printing the one block you paste into your MCP client:

{
  "mcpServers": {
    "apple-mail": { "command": "apple-mail-mcp" }
  }
}

Setup ends with a clear ready verdict or numbered recovery steps. Grant Automation → Mail when triage first asks for it. Check the installation, the next scheduled message, and failed scheduled sends anytime with apple-mail-mcp status; use apple-mail-mcp doctor for the full technical detail.

💡 New to the terminal? Three things that look wrong and aren't: brew install pipx wants a typed y (Enter alone is rejected); pipx ensurepath may print a ⚠️ — the "pipx is ready to go!" line after it is the verdict; and after ensurepath, close and reopen the terminal once so apple-mail-mcp is found.

🔌 Works with

Every client below speaks stdio MCP; the command is always uvx apple-mailbox-mcp.

Claude Code

claude mcp add --transport stdio --scope user apple-mail -- uvx apple-mailbox-mcp

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{ "mcpServers": { "apple-mail": { "command": "uvx", "args": ["apple-mailbox-mcp"] } } }

Cursor

Add the same block to ~/.cursor/mcp.json (or per-project .cursor/mcp.json).

VS Code (Copilot MCP)

Add the same block under "servers" in .vscode/mcp.json.

Codex CLI

# ~/.codex/config.toml
[mcp_servers.apple-mail]
command = "uvx"
args = ["apple-mailbox-mcp"]

Any stdio MCP client

Point it at uvx apple-mailbox-mcp. The wire contract is additive-only since v1.0.

🔧 Troubleshooting

Symptom

Fix

Client says the server failed to start, but uvx apple-mailbox-mcp works in your terminal

GUI apps don't inherit your shell PATH. Use the absolute path: "command": "/opt/homebrew/bin/uvx" (find yours with which uvx).

database is locked or empty results

Full Disk Access is missing for the app that launches the server (the client, not the terminal). Grant it, then fully quit and reopen that app.

Search finds recent mail but not bodies of old mail

The body index is still building — first build on a 100k+ mailbox takes minutes. status shows progress.

Send fails with transport_unavailable

Run doctor: it names the failing lane (Keychain item missing, SSH socket cold, SMTP host unreachable) and prints the exact fix.

Triage does nothing the first time

Grant Automation → Mail when macOS asks; the prompt appears on first use, not at install.

🧰 The 21 tools

Group

Tools

🔍 Read (8)

search_emails (full-body search) · get_email · get_emails_batch · get_thread · list_mailboxes · list_recent · get_attachment · refresh_mail

✉️ Send (6)

send_email · reply_email (threaded, quoted) · create_draft · schedule_email · list_scheduled · cancel_scheduled

🗂️ Triage (5)

triage_plan · triage_plan_delete · triage_apply · mailbox_create · mailbox_delete

🩺 Meta (2)

doctor (full diagnostics with fix-it strings) · audit (the local ledger)

Attachments both ways, size-budgeted. Replies thread correctly in every client. Scheduling survives sleep — a message due while the lid was closed goes out on the first tick after wake, or exactly on time via Exchange.

🎭 Your addresses, your lanes

The From: address decides how mail travels. ~/.email-mcp/identities.toml:

default = "work"

[work]                    # sent through a host you already trust, over SSH
from_addr = "you@example.org"
driver    = "ssh_sendmail"
host      = "bastion.example.org"   # any login host you already SSH to

[gmail]                   # classic SMTP — the app password stays in 1Password
from_addr = "you@gmail.com"
driver    = "smtp"
host      = "smtp.gmail.com"
op        = "op://Personal/gmail app password/password"

Exchange identities can add one sign-in to unlock the extras: drafts filed in your real Drafts folder, and scheduled sends executed by the server itself — lid closed, Mac asleep. setup offers it in one plain question. Reading needs no sending configuration at all.


21 tools · 926 tests · additive wire contract since v1.0 Live-calibrated end-to-end on a 305k-message store.

Built for one Mac — and for anyone else whose Mac runs Mail.app.

Available Tools

21 tools
auditRead the activity historyA
Read-onlyIdempotent

Read the local mutation ledger with time, tool, event, plan, and operation filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolNoOnly return activity emitted by this tool name.
eventNoOnly return activity with this event name.
limitNoMaximum number of results to return.
sinceNoInclusive ISO-8601 start bound; calendar prefixes are accepted.
untilNoInclusive ISO-8601 end bound; calendar prefixes are accepted.
plan_idNoTriage plan ID returned by a planning tool.
operation_idNoOperation ID that joins related activity across processes.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context that the resource is a 'local mutation ledger' and enumerates filter dimensions, which is useful beyond annotations. However, it does not describe return format or any additional behavioral nuances, though an output schema exists. This adds moderate value beyond 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.

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the primary action ('Read the local mutation ledger') and then lists the filter dimensions. There is no wasted wording, and every part contributes to understanding the tool's scope.

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

Completeness4/5

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

Given the tool has 7 parameters, an output schema, and annotations fully covering safety, the description is largely complete. It explains the core function and the available filters. It does not explicitly mention output details, but the output schema presumably covers that. The only minor gap is that it doesn't state why one might use this tool (e.g., for debugging), but given its uniqueness among siblings, this is acceptable.

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

Parameters3/5

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

Schema coverage is 100% with each parameter having a description, so the schema fully documents parameters. The description summarizes them as 'time, tool, event, plan, and operation filters', which maps to since/until, tool, event, plan_id, operation_id. This adds minimal meaning beyond the schema's own descriptions, so the baseline of 3 applies.

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 clearly states the tool reads a 'local mutation ledger' and lists the specific filters (time, tool, event, plan, operation). This is a specific verb+resource combination that distinguishes it from all sibling tools, which are email-centric. The title 'Read the activity history' reinforces it, but the description goes further.

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

Usage Guidelines3/5

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

The description implies usage for inspecting mutation history, but does not explicitly state when to use it versus alternatives or provide exclusions. Since no sibling tool is similar, the need for explicit guidance is lower, but the description still lacks an explicit 'use this when...' statement. Thus, usage is implied but not elaborated.

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

cancel_scheduledCancel a scheduled emailA
DestructiveIdempotent

Revoke a pending scheduled email locally and, when needed, in Exchange.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesScheduled-email ID returned when it was created.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false, so the description does not need to restate that. However, it adds valuable context beyond annotations by specifying the cancellation is 'locally and, when needed, in Exchange', disclosing the conditional scope of the operation. This is additional behavioral information not captured in the schema or annotations.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. Every word adds value, specifying the action, the target, and the conditional scope. It is concise yet complete.

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?

Given the tool's low complexity (one parameter, one action), the presence of an output schema, and annotations covering safety (destructive, idempotent), the description is complete enough for an agent to invoke it correctly. It clearly states what will happen and the scope, with no missing critical information.

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

Parameters3/5

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

The schema covers the single parameter 'id' fully (100% description coverage), so the description does not need to add parameter details. It doesn't, and the baseline is 3 given high schema coverage. No additional meaning is provided beyond the schema, but none is required here.

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?

Description states a specific verb ('Revoke'), a specific resource ('pending scheduled email'), and a scope ('locally and, when needed, in Exchange'). This clearly distinguishes it from sibling tools like schedule_email (creating) and list_scheduled (listing). An agent can immediately tell what this tool does without consulting other definitions.

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

Usage Guidelines3/5

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

The description implies usage (cancel scheduled emails) but provides no explicit guidance on when to use it versus alternatives, nor any exclusions or prerequisites. It does not mention, for example, that it should not be used for already-sent emails. Only implied usage is present, no explicit routing.

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

create_draftCreate an email draftA

Create a never-sent draft in the selected identity's server-side Drafts folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoOptional comma-separated Cc recipients.
toYesComma-separated primary recipients, including optional display names.
bodyYesPlain-text email content; paragraph breaks are preserved.
subjectYesEmail subject line.
in_reply_toNoOptional Message-ID used to thread the draft as a reply.
from_identityNoConfigured sending identity; omit it to use the default.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=false (non-read-only) and destructiveHint=false (non-destructive), so the description should clarify side effects. It adds that the draft is stored server-side in the Drafts folder, which is useful, but it does not mention whether a new draft is always created, whether it overwrites, or what the response contains. Given the annotations, the description provides some added context but not comprehensive behavioral disclosure.

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

Conciseness5/5

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

The description is a single sentence that is concise, front-loaded with the core purpose, and contains no redundant or irrelevant information. Every clause adds value, from 'never-sent' to 'selected identity'.

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

Completeness4/5

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

The tool has an output schema, so return values are covered. The description covers the core action and key distinction (draft vs. sent) and mentions 'selected identity,' which relates to the from_identity parameter. Minor gaps exist: it does not explain behavior when from_identity is omitted or clarify whether a fresh draft object is always created, but these are not critical for invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already described in the schema. The tool description adds no additional parameter-level detail beyond the overall purpose. Baseline 3 is appropriate since the schema does the heavy lifting and the description does not add meaning beyond that.

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 states a specific verb ('Create'), a resource ('draft'), and a precise location ('server-side Drafts folder'). It also clarifies the draft is 'never-sent,' which distinguishes it from send_email and reply_email. This makes the tool's purpose unambiguous.

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

Usage Guidelines3/5

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

The description implies usage for drafting rather than sending ('never-sent draft'), but it does not explicitly contrast with alternatives like send_email or reply_email, nor state when to choose this tool over them. There is no explicit 'when not to use' guidance, leaving the routing partially to inference.

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

doctorCheck email setupA
Read-onlyIdempotent

Diagnose permissions, identities, transports, scheduling, storage, and indexing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by enumerating the exact areas under diagnosis (permissions, identities, transports, etc.), which goes beyond what the generic annotations convey. No contradiction detected.

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

Conciseness5/5

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

A single, well-structured sentence that leads with the verb and concisely lists the diagnostic scope. No filler, and every word adds value.

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

Completeness4/5

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

For a zero-parameter tool with an output schema (present but not detailed), the description covers the main intent and what it inspects. It does not describe the return format or how results are presented, but the existence of an output schema shifts that burden, and the summary of diagnostic areas is sufficient 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.

Parameters4/5

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

There are zero parameters, so the baseline is 4. The description correctly does not attempt to explain parameters that don't exist, and the schema confirms no inputs are required.

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

Purpose4/5

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

The description states a specific verb ('Diagnose') and a clear resource scope (permissions, identities, transports, scheduling, storage, indexing). It is not a tautology and conveys the tool's role as a health-check. However, it does not explicitly distinguish it from the sibling tool 'audit', which may have overlapping purpose.

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

Usage Guidelines3/5

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

The description implies the tool is used for diagnosing email setup issues but provides no explicit when-to-use or when-not-to-use guidance, nor does it reference alternatives like 'audit' or other diagnostic siblings. The usage context is implied but not stated.

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

get_attachmentSave an attachment for readingA
Read-onlyIdempotent

Save one attachment to the configured temporary directory for reading.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEnvelope ID of the email containing the attachment.
attachment_idYesAttachment part ID returned by get_email.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds the specific behavior of saving to a configured temporary directory, which is beyond annotations and informs the agent of a side effect (writing a local file) that is still non-destructive. No contradiction with annotations.

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

Conciseness5/5

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

A single sentence that is front-loaded with the core action ('Save one attachment') and provides a concise purpose. No wasted words; every word earns its place.

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

Completeness4/5

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

The tool is simple, has an output schema, and annotations cover safety. The description adds the essential behavior of saving to a temp directory. It lacks an explicit hint about needing to call get_email first, but that is inferable from the schema and sibling names. Overall, sufficient for a low-complexity tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents id and attachment_id. The description does not add extra parameter-level meaning beyond noting 'one attachment' and the temp directory. Baseline 3 is appropriate when schema carries the parameter semantics.

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

Purpose4/5

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

The description states a clear verb ('Save') and resource ('one attachment') with a purpose ('for reading'). It is distinct from siblings like get_email (which retrieves content) and get_thread (which retrieves threads), so the purpose is unambiguous.

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

Usage Guidelines3/5

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

The description implies usage when needing to read an attachment, but it does not explicitly state when not to use it or mention alternatives. There is no guidance on the prerequisite of calling get_email to obtain an attachment_id, though the schema description covers that. Thus, usage context is clear but exclusions/alternatives are absent.

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

get_emailRead an emailA
Read-onlyIdempotent

Read one email by envelope ID at full, metadata, or minimal detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEnvelope ID returned by search, recent, or thread tools.
viewNoPayload size: full, metadata without bodies, or minimal.full

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat the safety profile. The description adds the detail-level options, which are useful, but it does not disclose behavior around missing IDs or failure handling. This is acceptable given the strong annotation coverage.

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

Conciseness5/5

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

The description is one concise sentence that front-loads the core action and resource, then packs the detail-level variants compactly. There is no filler or redundant explanation.

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

Completeness4/5

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

For a simple read operation with strong annotations and well-described parameters, the description is nearly complete. It conveys the resource, ID source, and detail levels, though it does not specify the exact return structure for each view. This is a minor gap for such a straightforward retrieval tool.

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

Parameters3/5

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

The input schema already provides full descriptions for both parameters, including the enum, default, and payload-size explanation for 'view'. The description repeats the view concept but adds little meaning beyond the schema. Baseline 3 is appropriate because schema coverage is high.

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 uses a specific verb ('Read') and resource ('one email by envelope ID'), and specifies the available detail levels. It clearly distinguishes the tool from sibling tools like schedule_email and mailbox_delete, which involve different actions.

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

Usage Guidelines4/5

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

The main description does not name alternatives, but the parameter description for 'id' provides clear context: this tool is used when an envelope ID has been obtained from search, recent, or thread tools. This gives sufficient usage context, though it does not explicitly state when not to use the tool.

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

get_emails_batchRead multiple emailsA
Read-onlyIdempotent

Read up to 50 emails in one bounded request, with per-ID errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesEnvelope IDs returned by search, recent, or thread tools.
viewNoPayload size: full, metadata without bodies, or minimal.full

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat those. It adds value by disclosing a bounded request (limit of 50) and 'per-ID errors', indicating partial failure handling. This goes beyond the annotations and helps the agent predict behavior.

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

Conciseness5/5

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

The description is a single, compact sentence: 'Read up to 50 emails in one bounded request, with per-ID errors.' It front-loads the core action and includes key constraints efficiently without any filler. Every phrase contributes to understanding.

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

Completeness4/5

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

Given the existence of an output schema and thorough parameter documentation, the description covers the essential context: it explains the batch nature, the limit, and error handling. It does not mention what happens if more than 50 IDs are supplied, but the schema's maxItems=50 covers validation. Overall, it's sufficient for an agent to call correctly.

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

Parameters3/5

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

Schema coverage is 100% with rich parameter descriptions (e.g., ids 'Envelope IDs returned by search, recent, or thread tools' and view enum with meanings). The tool description does not add meaning beyond the schema, which already explains both parameters adequately. Base score of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Read'), a resource ('emails'), and a distinctive scope ('up to 50', 'one bounded request'), which clearly separates it from siblings like search_emails (searching) or list_recent (listing). It also mentions 'per-ID errors', adding specificity. This is a clear, non-tautological purpose.

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

Usage Guidelines3/5

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

The description implies a batch operation but does not explicitly state when to use this over get_email (single) or search_emails. It mentions 'bounded request' but lacks explicit guidance on selecting this tool versus alternatives. An agent could infer from the name and 'multiple emails', but explicit when-to-use instructions are absent.

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

get_threadRead an email threadA
Read-onlyIdempotent

Return the messages in one conversation in chronological order.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idYesConversation ID returned on an email reference.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is known. The description adds the chronological ordering and the scope of 'one conversation', but doesn't discuss error cases or pagination. With annotations covering safety, a 3 is appropriate.

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

Conciseness5/5

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

One sentence, under 20 words, states the core action without any filler. Ideal conciseness.

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 simple read-only tool with a single parameter and a comprehensive schema, the description fully covers what the tool does. The output schema presumably details the return structure, and annotations cover safety. Nothing an agent needs is missing.

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

Parameters3/5

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

Schema coverage is 100%, and the schema description for thread_id already explains it as 'Conversation ID returned on an email reference.' The tool description adds no further parameter details, so the baseline of 3 applies.

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 uses a specific verb ('Return') and resource ('messages in one conversation') and specifies order ('chronological'), clearly distinguishing it from sibling tools like get_email which returns a single email.

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

Usage Guidelines4/5

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

It clearly implies usage when you have a thread_id from an email reference. However, it does not explicitly contrast with alternatives like get_email or search_emails, so it misses the explicit when-not guidance for a 5.

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

list_mailboxesList mailboxesA
Read-onlyIdempotent

List configured mailboxes with server and locally readable counts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description only needs to add context beyond that. It does by specifying that the tool returns counts for server and locally readable mailboxes, which is useful but doesn't disclose the full return structure. With annotations handling safety, this adds meaningful context without contradiction.

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

Conciseness5/5

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

A single, clear sentence with no filler. The key action and resource are front-loaded, and the additional count detail is presented efficiently.

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 simple, parameterless list tool, the description is complete. It covers the purpose and the specific output (counts), and the presence of an output schema means return details need no further explanation. No essential information is missing.

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?

The tool has zero parameters, so the baseline of 4 applies. The description correctly has nothing to add about parameters, and the 100% schema coverage (empty properties) confirms no missing information.

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 clearly states the verb 'List' and the resource 'configured mailboxes,' and adds the specific detail that it returns server and locally readable counts. This is distinct from sibling tools like search_emails or get_email, so an agent can easily understand its purpose.

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

Usage Guidelines3/5

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

The description implies when to use the tool (when you need a list of configured mailboxes) but does not explicitly mention alternatives or exclusions. No sibling tool appears to overlap directly, so the guidance is adequate without being explicit.

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

list_recentList recent emailsC
Read-onlyIdempotent

List recent messages, optionally scoped to an account and mailbox.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return.
accountNoAccount UUID; omit it to include every configured account.
mailboxNoMailbox name to search, such as INBOX or Archive.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of disclosing behavioral traits. It implies a read-only operation but does not explain recency ordering, pagination, permission requirements, or what happens with unfiltered accounts. The description adds little beyond what the name already says.

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 description is one wasted-word-free sentence and front-loads the core action. It is efficient, though it remains thin enough that most of the burden is carried by the schema.

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

Completeness2/5

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

With no annotations and no output schema, the description is too sparce to fully contextualize the tool. It does not define 'recent', specify ordering, describe returned fields, or differentiate this from the many email-related sibling tools. An agent would need to infer significant details.

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

Parameters3/5

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

All parameters have helpful schema descriptions, high schema_description_coverage, so the baseline is 3. The description's mention of optional scoping repeats what the schema already states; no additional param meaning or format details are offered.

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

Purpose4/5

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

The description states a clear verb (list) and resource (recent messages), and adds optional account/mailbox scoping. It does not explicitly contrast itself with sibling tools like search_emails or get_emails_bath, so it falls just short of strong differentiation.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this tool over alternatives such as search_emails or get_thread. The phrase 'optimaly scoped' describes parameter behavior rather than usage context, and no exclusion or precondition is offered.

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

list_scheduledList scheduled emailsA
Read-onlyIdempotent

List healthy and damaged scheduled-mail records by lifecycle state.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return.
stateNoScheduled-mail state to return; omit it to include all states.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations only contain a title, so the description must carry behavioral weight. It discloses that both healthy and damaged records are returned, a non-obvious trait. However, it does not confirm read-only safety or describe helper behavior around the 'damaged' category.

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

Conciseness5/5

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

A single sentence with no filler, front-loaded with the verb and resource. Every word contributes to the intended scope.

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

Completeness3/5

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

The tool has a simple two-parameter schema, but no output schema and no behavioral annotations. The description lacks definitions for 'damaged' and does not mention pagination or return format, which an agent might need for correct invocation.

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

Parameters3/5

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

The input schema already documents both parameters well, including the state enum and limit bounds. The description's 'by lifecycle state' only restates the state filter, adding no new parameter meaning.

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

Purpose4/5

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

The description specifies the verb 'List' and the resource 'scheduled-mail records', which distinguishes it from sibling tools like list_mailboxes. The phrase 'healthy and damaged' adds a useful classification but is not fully defined, slightly reducing clarity.

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

Usage Guidelines3/5

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

No explicit when-to-use guidance or alternatives are mentioned. The context implies this is the tool for listing scheduled emails, but no exclusions or comparative guidance is provided.

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

mailbox_createCreate a mailboxA
Idempotent

Create a mailbox idempotently and report live and index verification.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesMailbox path within the account; slashes create nested folders.
accountYesAccount UUID that will own the mailbox.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover idempotency and non-read-only behavior, but the description adds that the tool reports live and index verification after creation. This adds behavioral context beyond the structured data and does not contradict the annotations, even though the exact meaning of 'live and index verification' is not expanded.

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

Conciseness5/5

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

The description is one front-loaded sentence that states the action, the idempotent property, and the verification outcome. Every phrase adds relevant information, with no waste or repetition.

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

Completeness4/5

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

For a tool with only two required scalar parameters, a detailed schema, and annotations covering idempotency and mutation, the description provides enough context for correct invocation. The main gap is that the verification reporting is not described in terms of a concrete return shape, and error behavior for an invalid account is unspecified.

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

Parameters3/5

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

The input schema already fully documents both account and path, including the nested-folder behavior of slashes. Since schema coverage is high, the description does not need to contribute additional parameter meaning; it is at baseline for this situation.

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 states a specific verb and resource — 'Create a mailbox' — and adds idempotency, which distinguishes this tool from siblings like mailbox_delete and create_draft. The phrase 'report live and index verification' also clarifies what the operation does beyond just creation.

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

Usage Guidelines3/5

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

It is clear this tool is for creating mailboxes, and the idempotency qualifier implies it can be used when a mailbox might already exist. However, the description does not explicitly say when to prefer this over listing mailboxes or other related alternatives, so the usage guidance is implied rather than direct.

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

mailbox_deleteDelete a mailboxA
DestructiveIdempotent

Delete an empty mailbox only, with live verification and safe fallback.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesMailbox path within the account; slashes create nested folders.
accountYesAccount UUID that owns the mailbox.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag the tool as destructive and non-read-only. The description adds valuable context: 'live verification' (checks emptiness at call time) and 'safe fallback' (presumably aborts if non-empty). This goes beyond the annotation flags, though the fallback mechanism is somewhat vague.

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

Conciseness5/5

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

A single 11-word sentence with the core action and constraint front-loaded. Every phrase earns its place, and there is no redundancy or fluff.

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

Completeness4/5

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

For a simple two-parameter destructive tool with a full input schema and annotation coverage, the description covers the key condition (empty-only) and the safety behavior. The exact behavior of the 'safe fallback' is unspecified, but the output schema likely documents the return value, so this is a minor gap.

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

Parameters3/5

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

Schema coverage is 100%: both parameters are described in the input schema, including path semantics with slashes and account UUID. The description itself adds no parameter-specific detail, so the baseline of 3 applies.

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 states a specific verb ('Delete'), resource ('mailbox'), and a clear precondition ('empty mailbox only'). This distinguishes it from sibling tools like mailbox_create and triage_plan_delete, and the 'empty only' qualifier precisely scopes the operation.

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

Usage Guidelines4/5

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

'Delete an empty mailbox only' explicitly sets the condition for safe invocation and implies the tool is not for non-empty mailboxes. It doesn't name alternative tools, but no competing mailbox-deletion sibling exists, so the guidance is sufficient for selecting it.

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

refresh_mailRefresh mailA
Read-onlyIdempotent

Ask Mail.app to fetch new mail and report the before/after snapshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
wait_secondsNoSeconds to wait after Mail.app starts refreshing.
timeout_secondsNoMaximum seconds allowed for the Mail.app refresh request.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

The description adds the behavioral detail that it reports a before/after snapshot, which goes beyond the annotations. It also notes that it asks Mail.app, indicating an external app interaction. Since annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, the safety profile is covered. The description provides a bit of extra context but does not disclose any limitations or side effects beyond what the parameters suggest (wait and timeout).

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 description is one sentence with no filler; it gets straight to the point. It front-loads the main action ('fetch new mail') and then adds the snapshot detail. It is concise and structured well, though it could arguably include a bit more structured detail, but it earns its place with its efficiency.

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

Completeness4/5

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

Given the tool's simplicity (two optional parameters, high schema coverage, and annotations covering safety), the description is mostly complete. It mentions the before/after snapshot, which is a key output behavior. The output schema exists, so return values need not be explained. The only minor gap is that it doesn't mention any prerequisites like Mail.app being running, but that is likely implied. Overall, an agent has enough to call it correctly.

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

Parameters3/5

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

The schema description coverage is 100%, with both parameters (wait_seconds and timeout_seconds) fully described in the schema. The tool description does not add any parameter-specific information, but per the rubric, a baseline of 3 is appropriate when the schema covers the parameters comprehensively. No additional semantic value is provided by the description.

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

Purpose4/5

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

The description clearly states that the tool asks Mail.app to fetch new mail and reports a before/after snapshot. This is a specific action on a specific resource, and the snapshot detail adds unique behavior. However, it does not explicitly distinguish itself from sibling tools like search_emails or list_recent, though the verb 'refresh' and the snapshot concept make its role clear enough.

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

Usage Guidelines3/5

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

The description implies that this tool is for fetching new mail, which is a clear context for when to use it. However, it provides no explicit guidance about when not to use it or mentions any alternatives such as search_emails or get_email. The usage is implied by the action itself, but there is no direct comparison or exclusion.

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

reply_emailReply to an emailB

Reply with correct threading, optional history, attachments, and reply-all.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoOptional comma-separated Cc recipients.
idYesEnvelope ID of the email being answered.
bccNoOptional comma-separated Bcc recipients.
bodyYesPlain-text email content; paragraph breaks are preserved.
reply_allNoAlso copy the original To and Cc recipients, excluding yourself.
attachmentsNoOptional list of local file paths, one path per item.
from_identityNoConfigured sending identity; omit it to use the default.
include_historyNoQuote the original message below the new reply.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare the mutable, non-idempotent, open-world nature of the call. The description adds the useful behavioral trait that replies are threaded correctly and history is quoted by default, but it doesn't state side effects like whether a sent reply is also filed in the mailbox or how it interacts with drafts.

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

Conciseness5/5

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

A single compact sentence that front-loads the core action and lists the salient options without filler. Every clause maps to a real capability of the tool.

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

Completeness4/5

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

With an output schema present and full parameter documentation, the description covers the essentials an agent needs. It is only slightly thin on the reply-versus-send routing decision, which is the main remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all eight parameters are already documented in the schema, including reply_all semantics and include_history default. The description adds nothing beyond what the schema states, so the baseline of 3 applies.

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

Purpose4/5

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

The description gives a specific verb (Reply) and resource (email) and enumerates the distinguishing features: threading, optional history, attachments, reply-all. It doesn't explicitly contrast with siblings like send_email or create_draft, so an agent must infer the difference, but the purpose itself is unambiguous.

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

Usage Guidelines2/5

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

No guidance on when to reply versus use send_email or create_draft, and no prerequisites such as requiring a valid envelope ID from a prior read. The agent is left to infer that this is the answer-to-existing-message path.

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

schedule_emailSchedule an emailB

Freeze an email now and schedule local or Exchange-side delivery.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoOptional comma-separated Cc recipients.
toYesComma-separated primary recipients, including optional display names.
bccNoOptional comma-separated Bcc recipients.
bodyYesPlain-text email content; paragraph breaks are preserved.
send_atYesDelivery time in ISO-8601; a timestamp without an offset is local time.
subjectYesEmail subject line.
attachmentsNoOptional list of local file paths, one path per item.
from_identityNoConfigured sending identity; omit it to use the default.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnly=false, idempotent=false, destructive=false and openWorld=true. The description adds a real behavioral nuance – the message content is captured now while delivery is deferred, and delivery may be local or Exchange-side. It omits cancellability, auth requirements, and whether a scheduled item surfaces in list_scheduled.

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?

A single tight sentence that leads with the verb and the key behavioral idea ('freeze... now'). Nothing is wasted, though 'freeze' is slightly jargon-y and could be clarified.

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

Completeness3/5

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

An output schema and annotations exist and the schema fully documents parameters, so the description needn't explain return values. However, for a scheduling mutation the agent would benefit from knowing the result is a cancellable scheduled item and how it relates to list_scheduled/cancel_scheduled, which is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so every one of the 8 parameters is fully documented in the schema. The description contributes no additional parameter meaning (e.g., no notes on send_at timezone handling or attachment paths), so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (schedule) and resource (email) plus the distinctive mechanism ('freeze an email now' with deferred delivery). This implicitly separates it from send_email and create_draft, though it never names the siblings. Clear but no explicit sibling differentiation.

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

Usage Guidelines3/5

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

Usage is only implied: 'freeze now, schedule delivery' suggests this is the choice when you want deferred rather than immediate sending. There is no explicit statement of when to use this over send_email or cancel_scheduled, and no prerequisites are given.

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

search_emailsSearch emailsA
Read-onlyIdempotent

Search local envelope data and full bodies; sender filters are case-insensitive substring matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoOnly include mail after this ISO-8601 date or timestamp.
limitNoMaximum number of results to return.
queryNoWords to find in the subject, sender, snippet, or indexed body.
beforeNoOnly include mail before this ISO-8601 date or timestamp.
offsetNoNumber of matching results to skip for pagination.
accountNoAccount UUID; omit it to include every configured account.
mailboxNoMailbox name to search, such as INBOX or Archive.
to_addrNoRecipient name, address, or address fragment to match.
from_addrNoSender name, address, or address fragment to match.
unread_onlyNoWhen true, include only unread messages.
has_attachmentNoTrue for mail with attachments, false for mail without them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the description does not need to restate side effects. It adds valuable behavior beyond annotations: the tool searches 'local envelope data and full bodies' and sender filters are 'case-insensitive substring matches', which meaningfully shapes expectations. No contradiction with annotations.

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

Conciseness5/5

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

The description is a single, compact sentence that front-loads the operation and scope and follows with a useful behavioral detail. Every word contributes; no filler or repetition of schema content.

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

Completeness4/5

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

With all 11 parameters documented in the schema, an output schema present, and annotations covering side effects, the description adds the missing context an agent needs: local data scope and substring case-insensitivity. It would be stronger with explicit sibling routing, but that gap does not make the invocation unclear.

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 description coverage is 100%, which earns a baseline 3, but the description adds genuine param semantics by specifying that sender filters are case-insensitive substring matches. This clarifies intended behavior for from_addr and to_addr beyond the schema wording.

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

Purpose4/5

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

The description uses a specific verb ('Search') and identifies the resource ('local envelope data and full bodies'), making the operation clear. It does not explicitly contrast with sibling tools like get_email or list_recent, but the 'local' scope plus search semantics prevent major confusion.

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

Usage Guidelines2/5

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

There is no guidance on when to use search_emails versus siblings such as get_email, get_emails_batch, or list_recent; no alternatives are named and no exclusion conditions are given. An agent must infer trigger conditions from the parameter list, which is insufficient for good tool selection.

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

send_emailSend an emailB

Compose standards-correct MIME and send it through the selected identity.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoOptional comma-separated Cc recipients.
toYesComma-separated primary recipients, including optional display names.
bccNoOptional comma-separated Bcc recipients.
bodyYesPlain-text email content; paragraph breaks are preserved.
subjectYesEmail subject line.
attachmentsNoOptional list of local file paths, one path per item.
from_identityNoConfigured sending identity; omit it to use the default.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds a modest detail about MIME composition quality but omits consequences the agent would care about: that sending is irreversible, that repeated calls produce duplicate mail, and whether a copy is retained in Sent.

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?

A single front-loaded sentence with no filler, which is well sized for the tool. The wording is slightly cryptic ('standards-correct MIME', 'selected identity') rather than plainly informative, keeping it short of a 5.

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 no explanation, and the annotations carry the safety profile. For a straightforward send operation with fully described parameters, the description supplies enough to invoke the tool correctly; the remaining gaps (usage routing, irreversibility) are shared with the sibling set rather than blocking correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (to, cc, bcc, body, subject, attachments, from_identity) is already documented in the schema. The description's only parameter-relevant content is the vague reference to 'the selected identity', which adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('send' + email) and adds the mechanism ('compose standards-correct MIME'). However, it does not differentiate from close siblings such as reply_email, schedule_email, or create_draft, so an agent cannot tell from the description alone which send path applies to a reply or a scheduled message.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no named alternative. The phrase 'through the selected identity' hints that from_identity matters, but nothing tells the agent to prefer this over create_draft, schedule_email, or reply_email for the corresponding scenarios.

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

triage_applyApply reviewed mailbox changesA
DestructiveIdempotent

Apply one reviewed plan and verify each resulting mailbox state.

ParametersJSON Schema
NameRequiredDescriptionDefault
plan_idYesTriage plan ID returned by a planning tool.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

The description discloses that the tool applies and verifies, adding value beyond annotations which already indicate destructive, non-read-only, and idempotent behavior. However, it does not detail what 'apply' changes, what happens to the plan (e.g., is it consumed or retained), or what 'verify' returns. Since annotations already cover the safety profile, the description adds some but not rich behavioral context.

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

Conciseness5/5

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

A single sentence with no wasted words, and the primary action is front-loaded ('Apply one reviewed plan'). It efficiently conveys purpose without padding.

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

Completeness3/5

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

The description is short and does not explain what 'apply' does in terms of side effects or what 'verify' produces. Given the destructive and openWorld hints, more context on consequences would be valuable. An output schema exists and may cover return values, but the description alone leaves gaps about the operational impact for an automation agent.

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

Parameters3/5

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

Schema description coverage is 100% - plan_id is fully described as 'Triage plan ID returned by a planning tool.' The tool description does not mention the parameter or add any semantics beyond the schema, so it provides no additional value. Baseline 3 is appropriate when the schema already documents the parameter fully.

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 uses a specific verb 'apply' with a specific resource 'reviewed plan' and adds 'verify each resulting mailbox state', which is clear and distinguishes it from siblings like triage_plan (which likely generates a plan) and triage_plan_delete (which deletes a plan). An agent can immediately infer the tool's core function without ambiguity.

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

Usage Guidelines3/5

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

The phrase 'reviewed plan' implies the tool should be used after a plan has been created and reviewed, but the description does not explicitly state when to use it, when not to use it, or mention alternatives like triage_plan_delete. There is no explicit guidance about preconditions or which sibling to choose over another.

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

triage_planPrepare mailbox changesA

Prepare a reviewable bulk-change plan; sender filters use case-insensitive substring matching.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoOnly include mail after this ISO-8601 date or timestamp.
limitNoMaximum messages to stage; 0 uses the configured safe plan cap.
queryNoWords to find in the subject, sender, snippet, or indexed body.
beforeNoOnly include mail before this ISO-8601 date or timestamp.
accountNoAccount UUID; omit it to include every configured account.
actionsNoMailbox actions to stage for every selected message.
mailboxNoMailbox name to search, such as INBOX or Archive.
to_addrNoRecipient name, address, or address fragment to match.
from_addrNoSender name, address, or address fragment to match.
unread_onlyNoWhen true, include only unread messages.
has_attachmentNoTrue for mail with attachments, false for mail without them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations are all false hints, so they do not clarify side effects. The description adds that the result is a 'reviewable' plan, suggesting changes are not applied immediately, and it adds the case-insensitive substring behavior. However, it does not explicitly state that no mailbox changes are actually made, whether the plan is persisted, or what side effects occur when preparing it.

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

Conciseness5/5

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

The description is a single sentence with two short clauses and no filler. The core action, 'prepare a reviewable bulk-change plan,' is front-loaded, and the matching behavior is added as a useful secondary detail.

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

Completeness3/5

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

The schema richly documents all 11 parameters and an output schema exists, so return-value details are covered. What is missing is workflow context: that the plan should be reviewed and then applied via triage_apply, and that preparing the plan does not itself apply mailbox changes. For a non-read-only tool with this many parameters, the one-sentence description is minimally sufficient but leaves important behavioral gaps.

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 baseline is 3 because parameter descriptions already exist. The description adds meaningful value by specifying that sender filters match case-insensitively as substrings, which is not stated in the from_addr/to_addr schema entries. It doesn't elaborate on every parameter, but the schema already handles those details.

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 verb 'prepare' and the object 'reviewable bulk-change plan' state a specific, concrete function: this tool stages changes for review rather than executing them. This distinguishes it from siblings like triage_apply. The generic title 'Prepare mailbox changes' is clarified by the description's focus on producing a plan.

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

Usage Guidelines2/5

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

The description gives no explicit when-to-use guidance or alternatives. 'Reviewable bulk-change plan' implies a plan-then-apply workflow, and sibling triage_apply exists, but the description never says to use this before triage_apply or that triage_apply should be used afterward. The matching-semantics clause is about filtering behavior, not tool selection.

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

triage_plan_deletePrepare email deletionB

Prepare a capped Trash plan whose sender filter is exact, never a broad substring match.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoOnly include mail after this ISO-8601 date or timestamp.
limitNoMaximum messages to stage; 0 uses the configured deletion cap.
queryNoWords to find in the subject, sender, snippet, or indexed body.
beforeNoOnly include mail before this ISO-8601 date or timestamp.
accountNoAccount UUID; omit it to include every configured account.
mailboxNoMailbox name to search, such as INBOX or Archive.
to_addrNoRecipient name, address, or address fragment to match.
from_addrNoExact sender email address to match; fragments never select mail.
unread_onlyNoWhen true, include only unread messages.
has_attachmentNoTrue for mail with attachments, false for mail without them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already signal read/write and destructive hints, so the description's added 'capped Trash plan' and exact-sender rule provide some extra context. However, it does not explain side effects, what 'capped' means operationally, or what happens when this plan is applied.

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?

A single sentence with no filler, and the central constraint about exact sender matching is placed immediately after the main action. It could be more informative, but it is structured efficiently.

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

Completeness2/5

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

For a 10-parameter tool that prepares a deletion plan, the description is too thin. It omits how a capped plan relates to the limit parameter, whether any deletion is performed immediately, and what distinguishes it from triage_plan or triage_apply.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already documented. The description's main semantic addition, exact sender matching, is also already stated in the from_addr schema, so it adds little beyond the schema.

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

Purpose4/5

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

The description identifies a specific action and object: preparing a capped Trash plan, and adds a concrete selection rule (exact sender match). It is clearer than the name alone, though it does not explicitly contrast with sibling tools such as triage_plan.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool rather than triage_plan, search_emails, or triage_apply. The sentence states a behavior but not a decision context or exclusions.

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.

  1. 3 tool updatesv1.6.0
    • Changedreply_email1 field changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "attachments": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "bcc": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "bootstrapped": {
        -        "type": "boolean"
        -      },
        -      "cc": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "error": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "message_id": {
        -        "type": "string"
        -      },
        -      "ok": {
        -        "type": "boolean"
        -      },
        -      "subject": {
        -        "type": "string"
        -      },
        -      "to": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "ok",
        -      "message_id",
        -      "to",
        -      "cc",
        -      "bcc",
        -      "subject",
        -      "attachments",
        -      "bootstrapped",
        -      "error"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "code": {
        -        "type": "string"
        -      },
        -      "error": {
        -        "type": "string"
        -      },
        -      "fix": {
        -        "type": "string"
        -      },
        -      "ok": {
        -        "const": false
        -      },
        -      "operation_id": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "ok",
        -      "code",
        -      "error"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "accepted": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "attachments": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "bcc": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "bootstrapped": {
        +        "type": "boolean"
        +      },
        +      "cc": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "code": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "error": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "message_id": {
        +        "type": "string"
        +      },
        +      "ok": {
        +        "type": "boolean"
        +      },
        +      "refused": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "subject": {
        +        "type": "string"
        +      },
        +      "to": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "ok",
        +      "message_id",
        +      "to",
        +      "cc",
        +      "bcc",
        +      "subject",
        +      "attachments",
        +      "bootstrapped",
        +      "error",
        +      "accepted",
        +      "refused",
        +      "code"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "fix": {
        +        "type": "string"
        +      },
        +      "ok": {
        +        "const": false
        +      },
        +      "operation_id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ok",
        +      "code",
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedschedule_email1 field changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "attachments": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "attempts": {
        -        "type": "integer"
        -      },
        -      "bcc": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "cc": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "created_at": {
        -        "type": "string"
        -      },
        -      "delivered_at": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "executor": {
        -        "type": "string"
        -      },
        -      "graph_draft_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "identity": {
        -        "type": "string"
        -      },
        -      "last_error": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "message_id": {
        -        "type": "string"
        -      },
        -      "next_attempt_at": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "ok": {
        -        "const": true
        -      },
        -      "send_at": {
        -        "type": "string"
        -      },
        -      "status": {
        -        "type": "string"
        -      },
        -      "subject": {
        -        "type": "string"
        -      },
        -      "to": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "ok",
        -      "id",
        -      "send_at",
        -      "created_at",
        -      "to",
        -      "cc",
        -      "bcc",
        -      "subject",
        -      "attachments",
        -      "message_id",
        -      "status",
        -      "attempts",
        -      "next_attempt_at",
        -      "last_error",
        -      "delivered_at",
        -      "identity",
        -      "executor",
        -      "graph_draft_id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "code": {
        -        "type": "string"
        -      },
        -      "error": {
        -        "type": "string"
        -      },
        -      "fix": {
        -        "type": "string"
        -      },
        -      "ok": {
        -        "const": false
        -      },
        -      "operation_id": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "ok",
        -      "code",
        -      "error"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "accepted": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "attachments": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "attempts": {
        +        "type": "integer"
        +      },
        +      "bcc": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "cc": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "claimed_at": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "code": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "created_at": {
        +        "type": "string"
        +      },
        +      "delivered_at": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "executor": {
        +        "type": "string"
        +      },
        +      "graph_draft_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "identity": {
        +        "type": "string"
        +      },
        +      "last_error": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "message_id": {
        +        "type": "string"
        +      },
        +      "next_attempt_at": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "ok": {
        +        "const": true
        +      },
        +      "refused": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "send_at": {
        +        "type": "string"
        +      },
        +      "status": {
        +        "type": "string"
        +      },
        +      "subject": {
        +        "type": "string"
        +      },
        +      "to": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "ok",
        +      "id",
        +      "send_at",
        +      "created_at",
        +      "to",
        +      "cc",
        +      "bcc",
        +      "subject",
        +      "attachments",
        +      "message_id",
        +      "status",
        +      "attempts",
        +      "next_attempt_at",
        +      "last_error",
        +      "delivered_at",
        +      "identity",
        +      "executor",
        +      "graph_draft_id",
        +      "accepted",
        +      "refused",
        +      "code",
        +      "claimed_at"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "fix": {
        +        "type": "string"
        +      },
        +      "ok": {
        +        "const": false
        +      },
        +      "operation_id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ok",
        +      "code",
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedsend_email1 field changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "attachments": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "bcc": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "bootstrapped": {
        -        "type": "boolean"
        -      },
        -      "cc": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "error": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "message_id": {
        -        "type": "string"
        -      },
        -      "ok": {
        -        "type": "boolean"
        -      },
        -      "subject": {
        -        "type": "string"
        -      },
        -      "to": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "ok",
        -      "message_id",
        -      "to",
        -      "cc",
        -      "bcc",
        -      "subject",
        -      "attachments",
        -      "bootstrapped",
        -      "error"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "code": {
        -        "type": "string"
        -      },
        -      "error": {
        -        "type": "string"
        -      },
        -      "fix": {
        -        "type": "string"
        -      },
        -      "ok": {
        -        "const": false
        -      },
        -      "operation_id": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "ok",
        -      "code",
        -      "error"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "accepted": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "attachments": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "bcc": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "bootstrapped": {
        +        "type": "boolean"
        +      },
        +      "cc": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "code": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "error": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "message_id": {
        +        "type": "string"
        +      },
        +      "ok": {
        +        "type": "boolean"
        +      },
        +      "refused": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "subject": {
        +        "type": "string"
        +      },
        +      "to": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "ok",
        +      "message_id",
        +      "to",
        +      "cc",
        +      "bcc",
        +      "subject",
        +      "attachments",
        +      "bootstrapped",
        +      "error",
        +      "accepted",
        +      "refused",
        +      "code"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "fix": {
        +        "type": "string"
        +      },
        +      "ok": {
        +        "const": false
        +      },
        +      "operation_id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ok",
        +      "code",
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
  2. 21 tool updatesv0.1.0
    • First observedaudit
    • First observedcancel_scheduled
    • First observedcreate_draft
    • First observeddoctor
    • First observedget_attachment
    • First observedget_email
    • First observedget_emails_batch
    • First observedget_thread
    • First observedlist_mailboxes
    • First observedlist_recent
    • First observedlist_scheduled
    • First observedmailbox_create
    • First observedmailbox_delete
    • First observedrefresh_mail
    • First observedreply_email
    • First observedschedule_email
    • First observedsearch_emails
    • First observedsend_email
    • First observedtriage_apply
    • First observedtriage_plan
    • First observedtriage_plan_delete

TDQS

A3.7/5.0

Scored across 21 tools

Disambiguation4/5

Most tools are clearly distinct, but 'triage_apply', 'triage_plan', and 'triage_plan_delete' overlap in bulk-change planning, and 'get_email', 'get_emails_batch', and 'get_thread' could be confused for simple reading. The descriptions help clarify scopes, but the boundaries require careful reading.

Naming Consistency5/5

Tools consistently use verb_noun naming (refresh_mail, create_draft, send_email) or clear noun_verb for triage (triage_apply, triage_plan). All are snake_case with predictable patterns.

Tool Count4/5

21 tools is slightly heavy but justified by a rich domain including email composition, scheduling, triage, and diagnostics. Each tool appears to serve a distinct operational need.

Completeness5/5

The surface covers core email lifecycle (send, draft, reply, schedule, cancel), reading (get, batch, thread, search, attachments), mailbox management, and advanced triage/diagnostics/audit, leaving few gaps for an email client.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that gives AI assistants comprehensive access to Apple Mail accounts, enabling email discovery, reading, flag management, and server-side message retrieval.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A local MCP server for searching and reading downloaded Apple Mail data without changing mail state.
    8
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to search, read, and inspect Apple Mail on macOS, including conversations and attachments. It can create new, reply, reply-all, or forward drafts, but cannot send or modify existing messages.
    MIT