Skip to main content
Glama

Apple Mail MCP Server

License: MIT PyPI Python 3.10+ MCP GitHub stars

Star History

An MCP server that gives AI assistants full access to Apple Mail -- read, search, compose, organize, and analyze emails via natural language. Built with FastMCP.

Related MCP server: apple-mail-mcp

Quick Install

Prerequisites: macOS with Apple Mail configured, Python 3.10+

Two commands — gets you the MCP server, /email-management slash command, and the Email Management Expert skill:

claude plugin marketplace add patrickfreyer/apple-mail-mcp
claude plugin install apple-mail@apple-mail-mcp

Then restart Claude Code.

Other Install Methods

claude mcp add apple-mail -- uvx mcp-apple-mail

Or for Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "apple-mail": {
      "command": "uvx",
      "args": ["mcp-apple-mail"]
    }
  }
}
pip install mcp-apple-mail
claude mcp add apple-mail -- mcp-apple-mail

Installs the Email Management Expert skill via the open skills CLI. The skill does not include the MCP server, so install that too (e.g. with uvx above):

npx skills add patrickfreyer/apple-mail-mcp
claude mcp add apple-mail -- uvx mcp-apple-mail

Add -g to install the skill globally, or -a <agent> to target a specific agent.

  1. Download the latest apple-mail-mcp-vX.Y.Z.mcpb from Releases

  2. Open Claude Desktop → Settings → Developer → MCP Servers → Install from file

  3. Select the .mcpb file and grant Mail.app permissions

git clone https://github.com/patrickfreyer/apple-mail-mcp.git
cd apple-mail-mcp/plugin
python3 -m venv venv
venv/bin/pip install -r requirements.txt

claude mcp add apple-mail -- /bin/bash $(pwd)/start_mcp.sh

Tools (22)

Tool

Description

get_inbox_overview

Dashboard with unread counts, folders, and recent emails

list_inbox_emails

List emails with account/read-status filtering and optional content preview

get_mailbox_unread_counts

Unread counts per mailbox or per-account summary

list_accounts

List all configured Mail accounts

search_emails

Unified search — subject, sender, body text, dates, attachments, flag status/color, cross-account

get_email_thread

Conversation thread view

Organization

Tool

Description

list_mailboxes

Folder hierarchy with message counts

create_mailbox

Create new mailboxes (supports nested paths)

move_email

Move/archive emails with filters (subject, sender, date, read status, dry-run)

update_email_status

Mark read/unread, flag/unflag (optional flag color) — by filters or message IDs

manage_trash

Soft delete, permanent delete, empty trash (with dry-run)

Composition

Tool

Description

compose_email

Send new emails (plain text or HTML body)

reply_to_email

Reply or reply-all with optional HTML body

forward_email

Forward with optional message, CC/BCC

manage_drafts

Create, list, send, and delete drafts

create_rich_email_draft

Build a rich HTML .eml draft, open it in Mail, and optionally save it to Drafts

Attachments

Tool

Description

list_email_attachments

List attachments with names and sizes

save_email_attachment

Save attachments to disk

Smart Inbox

Tool

Description

get_awaiting_reply

Find sent emails that haven't received a reply

get_needs_response

Identify emails that likely need your response

get_top_senders

Analyse most frequent senders by count or domain

Analytics & Export

Tool

Description

get_statistics

Email analytics (volume, top senders, read ratios)

export_emails

Export single emails or mailboxes to TXT/HTML

inbox_dashboard

Interactive UI dashboard (requires mcp-ui-server)

Configuration

Read-Only Mode

Pass --read-only to block delivery. Nothing leaves the machine: compose_email and reply_to_email refuse mode="send", manage_drafts refuses action="send", and forward_email is removed entirely because it has no non-sending mode.

The composing tools stay registered so that mode="draft" and mode="open" keep working. Those never deliver anything, and they are the only place in the compose surface that supports attachments — manage_drafts and create_rich_email_draft cannot attach files.

{
  "mcpServers": {
    "apple-mail": {
      "command": "/path/to/venv/bin/python3",
      "args": ["/path/to/apple_mail_mcp.py", "--read-only"]
    }
  }
}

User Preferences (Optional)

Set the USER_EMAIL_PREFERENCES environment variable to give the assistant context about your workflow:

{
  "mcpServers": {
    "apple-mail": {
      "command": "/path/to/venv/bin/python3",
      "args": ["/path/to/apple_mail_mcp.py"],
      "env": {
        "USER_EMAIL_PREFERENCES": "Default to BCG account, show max 50 emails, prefer Archive and Projects folders"
      }
    }
  }
}

For .mcpb installs, configure this in Claude Desktop under Developer > MCP Servers > Apple Mail MCP.

Safety Limits

Batch operations have conservative defaults to prevent accidental bulk actions:

Operation

Default Limit

update_email_status

10 emails

manage_trash

5 emails

move_email

1 email

Override via function parameters when needed.

File Access

By default the server can write and attach files anywhere your user account can, except a hardened denylist of locations an attacker could use for code execution or credential theft. (Attachment bytes come from whoever emailed you, and a prompt-injected email can steer tool arguments.)

Writes (save_email_attachment, export_emails, create_rich_email_draft's output_path) are refused for:

  • any dotfile or dot-folder directly in your home folder: shell startup files (~/.zshrc, ~/.zshenv, ~/.zprofile, ~/.zlogin, ~/.bashrc, ~/.bash_profile, ~/.profile), ~/.ssh, ~/.gnupg, ~/.aws, ~/.config (incl. ~/.config/git), ~/.gitconfig, ~/.netrc, ~/.envrc, ~/.local/bin, ...

  • .git/hooks, .git/config and .envrc in any folder

  • autostart, persistence and app-config folders: ~/Library/LaunchAgents, ~/Library/LaunchDaemons, /Library/LaunchAgents, /Library/LaunchDaemons, ~/Library/Application Support (incl. com.apple.backgroundtaskmanagementagent), ~/Library/Application Scripts, ~/Library/Preferences, ~/Library/Keychains, ~/Library/Mail, ~/Library/Containers, ...

  • folders on PATH: ~/bin, /usr/local/bin, /opt/homebrew/bin, and /etc

Attachments (compose_email, reply_to_email, ...) may be any readable file except secrets: ~/.ssh, ~/.gnupg, ~/.aws, ~/.netrc, ~/.git-credentials, ~/.config/gh, .env files, ~/Library/Keychains, and browser profiles and cookie stores (Safari, Chrome, Firefox, Edge, Brave, Arc, ...).

Paths are resolved (~, .., symlinks) before checking, and matching is case-insensitive like APFS.

Restricting further (opt-in). To confine writes or attachments to specific folders, list them (colon-separated) in the server's env, or pass --write-dir / --attach-dir (repeatable) as arguments. Once set, only those folders are allowed for that side, and the denylist still applies inside them. The tool's own cache (~/Library/Caches/apple-mail-mcp, the default rich-draft location) stays writable.

"env": {
  "APPLE_MAIL_MCP_WRITE_DIRS": "~/Downloads:~/Documents/mail-exports",
  "APPLE_MAIL_MCP_ATTACH_DIRS": "~/Documents:~/Desktop"
}

Usage Examples

Show me an overview of my inbox
Search for emails about "project update" in my Gmail
Reply to the email about "Domain name" with "Thanks for the update!"
Move emails with "invoice" in the subject to my Archive folder
Show me email statistics for the last 30 days
Create a rich HTML draft for a weekly update and open it in Mail

Rich HTML Drafts

Use create_rich_email_draft when you need a visually formatted email, newsletter, or leadership update.

  • It generates an unsent .eml file with multipart plain-text + HTML bodies

  • It can open the draft directly in Mail for editing

  • It can optionally ask Mail to save the opened compose window into Drafts

  • It accepts partial details, so you can start with just an account and subject and fill in the rest later

This is more reliable than injecting raw HTML into AppleScript content, which Mail often stores as literal markup.

Email Management Skill

A companion Claude Code Skill is included that teaches Claude expert email workflows (Inbox Zero, daily triage, folder organization). When installed as a plugin, the skill is loaded automatically. For standalone MCP installs, add it with npx skills add patrickfreyer/apple-mail-mcp or copy it manually:

cp -r plugin/skills/email-management ~/.claude/skills/email-management

Requirements

  • macOS with Apple Mail configured

  • Python 3.7+

  • fastmcp (+ optional mcp-ui-server for dashboard)

  • Claude Desktop or any MCP-compatible client

  • Mail.app permissions: Automation + Mail Data Access (grant in System Settings > Privacy & Security > Automation)

Troubleshooting

Issue

Fix

Mail.app not responding

Ensure Mail.app is running; check Automation permissions in System Settings

Slow searches

Set include_content: false and lower max_results

Mailbox not found

Use exact folder names; nested folders use / separator (e.g., Projects/Alpha)

Permission errors

Grant access in System Settings > Privacy & Security > Automation

Rich draft shows raw HTML

Use create_rich_email_draft instead of pasting HTML into manage_drafts or AppleScript content

Project Structure

apple-mail-mcp/
├── .claude-plugin/
│   └── marketplace.json       # Marketplace manifest (for plugin distribution)
├── plugin/                    # Claude Code plugin
│   ├── .claude-plugin/
│   │   └── plugin.json        # Plugin manifest
│   ├── skills/                # Email Management Expert skill (also invocable as /email-management)
│   ├── apple_mail_mcp/        # Python MCP server package (24 tools)
│   ├── apple_mail_mcp.py      # Entry point
│   ├── start_mcp.sh           # Startup wrapper (auto-creates venv)
│   └── requirements.txt
├── apple-mail-mcpb/           # MCPB build files (Claude Desktop)
├── LICENSE
└── README.md

Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/my-feature)

  3. Commit and push

  4. Open a Pull Request

Releasing

Follow these steps when cutting a new release to keep all version strings in sync:

  1. Bump __version__ in plugin/apple_mail_mcp/__init__.py to the new version.

  2. Update apple-mail-mcpb/manifest.json ("version" field) to match.

  3. Update pyproject.toml (version = ... under [project]) to match.

  4. Update both version fields in server.json ("version" and "packages"[0]["version"]) to match.

  5. Run python3 scripts/check_versions.py — it must print OK before you proceed.

  6. Commit, tag, and push: git tag vX.Y.Z && git push origin vX.Y.Z.

  7. Create a GitHub release from the tag.

  8. Build and publish to PyPI: python -m build && twine upload dist/* (requires PyPI credentials).

The test suite also enforces version consistency (tests/test_version_consistency.py), so any CI run on a branch with mismatched versions will fail fast.

License

MIT -- see LICENSE.

Available Tools

27 tools
compose_emailCompose EmailC

Compose and send a new email from a specific account.

NameRequiredDescriptionDefault
ccNoOptional CC recipients, comma-separated for multiple
toYesRecipient email address(es), comma-separated for multiple
bccNoOptional BCC recipients, comma-separated for multiple
bodyYesEmail body text (used as plain-text fallback when body_html is provided)
modeNoDelivery mode — "send" (send immediately, default), "draft" (save silently to Drafts), or "open" (open compose window for review before sending)send
accountYesAccount name to send from (e.g., "Gmail", "Work", "Personal")
subjectYesEmail subject line
body_htmlNoOptional HTML body for rich formatting (bold, headings, links, colors). When provided, the email is sent as HTML. The plain 'body' field is still required as fallback text.
attachmentsNoOptional file paths to attach, comma-separated for multiple (e.g., "/path/to/file1.png,/path/to/file2.pdf")
from_addressNoOptional sender address to use for this message. Must be one of the account's configured email addresses. When omitted, Mail uses the account's default "Send new messages from" setting.

Output Schema

NameRequiredDescription
resultYes

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. It says "send" but never discloses that sending is an irreversible external side effect, what account/permission prerequisites apply, or that the tool can silently save a draft or open a review window depending on mode. The schema does cover mode, but the description adds no behavioral context of its own.

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 with no filler, and the account scoping is stated up front. It is arguably under-specified rather than concise, but it wastes no words.

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 exists, so return values need not be explained, and the input schema is rich. However, for a mutation tool with zero annotations and a sibling draft-creator, the description omits the mode-dependent behavior and irreversibility that an agent needs before invoking it.

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 10 parameters including cc/bcc/attachments/from_address are already documented with examples and defaults. The description contributes nothing beyond "from a specific account," so the baseline 3 for high schema coverage 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 names a specific verb pair ("compose and send") and resource ("a new email") plus the scoping constraint "from a specific account." It is clear on its own, but it never distinguishes itself from the sibling create_rich_email_draft, which is a near-neighbor given the mode="draft" option.

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 this versus reply_to_email, forward_email, or create_rich_email_draft. The mode parameter's "draft" and "open" values overlap directly with the sibling draft tool, and the description does nothing to disambiguate that choice.

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

create_mailboxCreate MailboxA

Create a new mailbox (folder) in the specified account.

Supports nested paths via the parent_mailbox parameter (e.g., parent_mailbox="Projects" + name="2024" creates Projects/2024). You can also pass a full slash-separated path as name (e.g., "Projects/2024/ClientName") and omit parent_mailbox.

NameRequiredDescriptionDefault
nameYesName for the new mailbox. May contain "/" to create a nested path in one call (each segment is created if needed).
accountYesAccount name (e.g., "Gmail", "Work")
parent_mailboxNoOptional existing parent folder for nesting.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose meaningful behavior: intermediate path segments are created if needed, and the two nesting approaches are mutually alternative. It says nothing about permission requirements, behavior when the mailbox already exists, or failure modes, leaving real gaps for a mutation tool.

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

Conciseness4/5

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

Two short paragraphs, front-loaded with the core action before the nesting detail, and every sentence earns its place. Minor overlap with the schema, which already notes that name may contain '/', keeps it off a 5.

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 exists, so return values need not be described, and all three parameters are covered by the schema. For a mutation tool with zero annotations, however, the absence of any statement about preconditions, duplicate mailboxes, or error behavior leaves the definition only adequate rather than complete.

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 already 100%, so a 3 is the floor. The description adds value the schema does not: it spells out the interaction between parent_mailbox and the slash-in-name form (e.g., parent_mailbox="Projects" + name="2024" yields Projects/2024, and parent_mailbox may be omitted when a full path is given).

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 and resource ('Create a new mailbox (folder) in the specified account'), which is unambiguous and readily separable from the read-oriented siblings like list_mailboxes and get_mailbox_unread_counts. It does not, however, explicitly name or contrast itself with any sibling, so it stops short of a 5.

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 gives conditional guidance for the two creation idioms ('use parent_mailbox + name' vs. 'pass a full slash-separated path as name and omit parent_mailbox'), which is genuinely useful. But it never says when to create a mailbox versus using an existing one or what preconditions apply, so usage is implied rather than fully framed.

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

create_rich_email_draftCreate Rich Email DraftA

Create a rich-text email draft by generating an unsent .eml message and optionally opening it in Mail.

This is the preferred path for HTML or richly formatted emails because Mail reliably renders .eml content, while setting raw HTML through AppleScript often stores the literal markup instead.

NameRequiredDescriptionDefault
ccNoOptional CC recipients, comma-separated for multiple
toNoOptional recipient email address(es), comma-separated for multiple
bccNoOptional BCC recipients, comma-separated for multiple
accountYesAccount name to use for the sender identity (e.g., "Work", "Oracle")
subjectNoSubject line for the draft (optional; defaults to empty)
html_bodyNoOptional HTML body. If omitted but text_body is provided, a basic HTML wrapper is generated.
text_bodyNoOptional plain-text body. If omitted but html_body is provided, a fallback plain body is generated.
output_pathNoOptional path for the generated `.eml` file (same protected-location rules as save_email_attachment; defaults to ~/Library/Caches/apple-mail-mcp/rich-drafts)
from_addressNoOptional sender address to stamp into the `.eml` `From:` header. Must be one of the account's configured email addresses. When omitted, Mail fills the account's default "Send new messages from" address on open.
open_in_mailNoIf True, open the generated `.eml` in Mail (default: True)
save_as_draftNoNot currently supported. Mail opens a `.eml` as a read-only message viewer, not a compose object, so it can never be saved into Drafts this way. Passing True is reported honestly in the output rather than silently ignored; use `compose_email(mode="draft")` or `manage_drafts` for a real, sendable draft.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral burden. It discloses that the result is unsent, that the artifact is a `.eml` file, that opening in Mail is optional, and warns about the AppleScript literal-markup pitfall — useful beyond structured fields. It omits permission requirements and the protected-location file rules, which are only in the schema.

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?

Two sentences, zero filler, with the core action front-loaded and the differentiating rationale second. Every clause 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?

An output schema exists, so return values need not be explained, and the 100%-covered schema handles parameters. The description adequately frames the tool's purpose and safe-usage context for a file-writing, optionally-opening operation, though it stays silent on permissions and the caveat about save_as_draft lives in the schema rather than here.

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% across 11 parameters, so the schema fully documents recipients, bodies, paths, and flags. The description adds no parameter-level syntax or defaults beyond what the schema already states, making the baseline 3 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?

States a specific verb and resource ('Create a rich-text email draft') and immediately explains the mechanism (generating an unsent `.eml` message, optionally opening it in Mail). The rationale about Mail reliably rendering `.eml` versus AppleScript storing literal markup distinguishes it from compose_email/manage_drafts paths.

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?

Explicitly states this is 'the preferred path for HTML or richly formatted emails,' giving a clear when-to-use condition. It stops short of naming the alternative tools (compose_email, manage_drafts) or stating when NOT to use it, so it's strong but not fully routing.

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

export_emailsExport EmailsC

Export emails to files for backup or analysis.

NameRequiredDescriptionDefault
scopeYesExport scope: "single_email" (requires subject_keyword) or "entire_mailbox"
formatNoExport format: "txt", "html" (default: "txt")txt
accountYesAccount name (e.g., "Gmail", "Work")
mailboxNoMailbox to export from (default: "INBOX")INBOX
max_emailsNoMaximum number of emails to export for entire_mailbox (default: 1000, safety cap)
save_directoryNoDirectory to save exports (default: "~/Desktop"). Protected locations (dot-folders in ~, LaunchAgents, ~/Library/Application Support, ...) are rejected.~/Desktop
subject_keywordNoKeyword to find email (required for single_email)

Output Schema

NameRequiredDescription
resultYes

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 behavioral burden. It discloses only that files are produced; it omits that writes touch the local filesystem, that some save locations are rejected, what happens on large mailboxes, and whether existing files are overwritten. These are all material for an agent about to invoke a filesystem-writing tool.

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 zero filler, which is structurally sound. It is arguably undersized for a 7-parameter tool, which keeps it from a 5.

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 a tool that writes to disk, the description leaves out the safety and side-effect profile entirely. The output schema removes the need to explain return values, but the gap in behavioral context is significant for this complexity.

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 (scope, format, account, mailbox, max_emails, save_directory, subject_keyword) is already documented in the schema, including the scope/subject_keyword dependency and the protected-path rejection. The description adds nothing beyond that, 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 (export) and resource (emails) plus the destination (files), which is enough to distinguish it from every read/search/compose sibling. It is clear, but adds no differentiation language because no sibling overlaps its function.

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?

"for backup or analysis" hints at intent but gives no when-to-use criteria, no prerequisites, and no alternatives (e.g., search_emails for targeted retrieval vs. this bulk export). An agent gets no routing guidance.

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

forward_emailForward EmailC

Forward an email to one or more recipients.

NameRequiredDescriptionDefault
ccNoOptional CC recipients, comma-separated for multiple
toYesRecipient email address(es), comma-separated for multiple
bccNoOptional BCC recipients, comma-separated for multiple
accountYesAccount name (e.g., "Gmail", "Work")
mailboxNoMailbox to search in (default: "INBOX")INBOX
messageNoOptional message to add before forwarded content
from_addressNoOptional sender address to use when forwarding. Must be one of the account's configured email addresses. When omitted, Mail uses the account's default "Send new messages from" setting.
subject_keywordYesKeyword to search for in email subjects

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/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 behavioral burden, yet it says nothing about side effects. It does not state that this sends an irreversible outbound message, what happens when the subject keyword matches multiple emails, or whether the original attachments/content are preserved.

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

Conciseness3/5

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

The single sentence is front-loaded and has zero waste, but for an 8-parameter tool with required subject_keyword targeting it is thin, and the key selection mechanism is buried in the schema rather than surfaced up front.

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?

An output schema exists so return values need no explanation, but for a mutation/send tool with zero annotations and an indirect addressing scheme (subject_keyword lookup) the description should clarify how the target email is chosen and what the send actually does. That context is entirely 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% and all 8 parameters are documented in the schema, including the subtle from_address constraint and the mailbox default. The description adds no parameter meaning beyond that, 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?

States a specific verb and resource: forward an email to recipients. However, it does not reveal the non-obvious mechanism that the target email is located via a subject keyword search, nor does it distinguish this from siblings like reply_to_email or compose_email.

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 guidance and no mention of alternatives such as reply_to_email (respond to sender) or compose_email (new message). The agent is left to infer that 'forward' is the right choice.

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

get_awaiting_replyGet Awaiting ReplyA

Find sent emails that haven't received a reply yet.

Scans the Sent mailbox for outgoing emails and cross-references with the Inbox to see if a reply (matching subject) was received from the same recipient. Useful for follow-up tracking.

NameRequiredDescriptionDefault
accountYesAccount name (e.g., "Gmail", "Work", "Personal")
days_backNoHow many days back to check sent emails (default: 7, 0 = all time)
max_resultsNoMaximum results to return (default: 20)
exclude_noreplyNoSkip emails sent to noreply/no-reply addresses (default: True)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does real work: it discloses the mechanism (scan Sent, cross-reference Inbox, match subject from the same recipient), which tells the agent how results are derived. It stops short of noting limitations of subject-matching (false positives/negatives) or that it is a read-only operation.

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?

Three short sentences, front-loaded with the core purpose before the mechanism. Every sentence contributes; it could be marginally tighter but there is no filler.

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?

An output schema exists, so return values need not be described, and the schema fully covers parameters. The description is complete enough to call the tool correctly, with the only real gap being sibling differentiation against get_needs_response.

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 four parameters (account, days_back, max_results, exclude_noreply) are fully documented in the schema itself. The description adds no parameter semantics beyond that, 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?

The description states a specific verb and resource ('Find sent emails that haven't received a reply yet') and explains the underlying scan. However, it never distinguishes itself from the near-twin sibling 'get_needs_response', leaving the agent unable to tell which to pick without opening both schemas.

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?

'Useful for follow-up tracking' implies a use case but gives no explicit when/when-not conditions and names no alternative, despite the existence of the closely related 'get_needs_response' and 'search_emails' siblings. Usage is left to inference.

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

get_email_sourceGet Email SourceA

Return the raw RFC 822 source of a single message.

The MCP's other body-extraction paths return Mail.app's rendered content (HTML collapsed to display text, hrefs dropped, embedded objects replaced with U+FFFC). This tool returns the raw source instead — all headers, all MIME parts, all hrefs intact.

Implementation note:

Wraps the source property of message defined in Mail.sdef (the AppleScript dictionary for Mail.app). That property returns the same RFC 822 text Mail.app writes to the on-disk .partial.emlx file, so the consumer does not need filesystem access or knowledge of the Mail directory layout to recover MIME parts / hrefs / custom headers.

Identifier resolution: message_id is preferred when both are provided (exact match on the RFC 822 Message-Id header via AppleScript's message id property — distinct from id, which is Mail.app's internal numeric id). subject_keyword matches the first message in mailbox whose subject contains the substring.

Output sizing: messages can be large (a plain note is ~200 KB; with attachments far larger). max_bytes caps the returned payload and appends a truncation marker when exceeded. headers_only=True returns only the RFC 822 header block (everything up to and including the first blank line) — usually sufficient for URL/header inspection and avoids returning base64 bodies. Cap applies after the headers_only filter.

NameRequiredDescriptionDefault
accountYesAccount name (e.g., ``"Gmail"``, ``"Work"``).
mailboxNoMailbox name (default: ``"INBOX"``). Resolved via the shared ``build_mailbox_ref`` helper so non-English / Exchange inboxes (Posteingang, Bandeja de entrada, etc.) are found.INBOX
max_bytesNoByte cap on the returned payload (default 256 KB).
message_idNoRFC 822 Message-Id for exact match (preferred when known).
headers_onlyNoWhen ``True``, return only the header block.
subject_keywordNoSubstring to match against subject (first hit).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: output sizing (200 KB notes, larger with attachments), the max_bytes cap with an appended truncation marker, that the cap applies after the headers_only filter, and identifier precedence. It also discloses the underlying AppleScript mechanism, which is useful operational context.

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

Conciseness4/5

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

Front-loaded with the core purpose in the first sentence, and the sizing/identifier sections are well organized. The 'Implementation note' about Mail.sdef and .partial.emlx is somewhat more internal detail than an agent needs for selection, so it is not maximally tight.

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-value description is not required, and the description still covers payload sizing, truncation behavior, and identifier resolution. Nothing an agent needs to call this correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds meaning well beyond it: message_id is preferred when both ids are given and is the RFC 822 Message-Id (distinct from Mail.app's internal numeric id), and subject_keyword matches the first message in mailbox whose subject contains the substring. These precedence and matching semantics are not in the schema.

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

Purpose5/5

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

States a specific verb and resource ('Return the raw RFC 822 source of a single message') and explicitly distinguishes itself from sibling body-extraction paths that return rendered content. An agent can tell exactly what this produces without opening the schema.

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

Usage Guidelines4/5

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

It gives clear context for when this is the right tool (recovering MIME parts, hrefs, custom headers) and steers toward headers_only for header/URL inspection. It does not name a specific sibling tool as an alternative, but the contrast with rendered-content paths is strong enough to route selection correctly.

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

get_email_threadGet Email ThreadA

Get an email conversation thread - messages linked by Message-ID, not just by subject.

Candidates are found by subject (fast, filtered inside Mail), then linked through their Message-ID / In-Reply-To / References headers. Messages that merely share the subject but belong to a different conversation are listed separately instead of being mixed into the thread.

NameRequiredDescriptionDefault
accountYesAccount name (e.g., "Gmail", "Work")
mailboxNoMailbox to search in (default: "INBOX", use "All" for all mailboxes)INBOX
max_messagesNoMaximum number of candidate messages to inspect (default: 50). The cap applies before linking: only the first N subject matches that Mail returns are considered, so the thread is seeded from the newest of those N, not necessarily the newest message overall. Raise it for long-running subjects.
subject_keywordYesKeyword to identify the thread (e.g., "Re: Project Update")

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does substantial work: it discloses the two-phase strategy (subject-filtered candidates, then header linking) and, importantly, that same-subject messages from other conversations are surfaced separately rather than merged. It omits read-only confirmation, permissions, and failure behavior, keeping it from a 5.

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

Conciseness4/5

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

Three sentences, front-loaded with the core definition and then the mechanics; no filler. It is slightly more verbose than strictly required, but every sentence conveys real information about how the thread is assembled.

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?

An output schema exists, so return-value description is unnecessary, and the description compensates well for the absent annotations by explaining the linking heuristic and its edge case. Remaining gaps (auth requirements, behavior when no thread is found) are minor for a read-only getter.

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%, so all four parameters are already documented in the schema. The description's note that candidates are 'found by subject' adds a little color to subject_keyword, but it does not explain the max_messages cap that the schema itself handles in depth. Baseline 3 is appropriate.

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+resource ('Get an email conversation thread') and goes further by defining what constitutes a thread (Message-ID linking, not subject sharing). This implicitly separates it from search_emails, though no sibling is named outright, so it stops short of a 5.

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 conveys the scenario it fits (reconstructing a full conversation rather than finding messages by keyword), but it never states when to prefer it over search_emails or get_email_source, nor any prerequisites. Usage must be inferred from the algorithmic explanation.

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

get_inbox_overviewGet Inbox OverviewB

Get a comprehensive overview of your email inbox status across all accounts.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the key behavioral trait: this is a cross-account aggregate read. It does not state whether it is read-only (though the 'Get'/'overview' framing strongly implies it), nor any cost, freshness, or account-scoping caveats.

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 wasted clauses. It is efficient, though 'comprehensive overview of your email inbox status' is mildly redundant wording rather than maximally precise language.

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, read-only aggregation tool with an output schema already defining the return shape, the description is nearly sufficient — return values need not be explained. The one real gap is the absence of any routing cue among the several similarly named aggregation siblings.

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 takes zero parameters and schema coverage is 100%, so there is nothing for the description to compensate for. Baseline 4 applies; no parameter meaning is required or missing.

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 ('Get') and resource ('overview of your email inbox status across all accounts'), which is clearer than the bare title. However, it does nothing to distinguish itself from sibling aggregators like inbox_dashboard, get_statistics, or get_mailbox_unread_counts, which could plausibly return overlapping information.

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 statement of when to use this tool rather than the adjacent aggregation tools (inbox_dashboard, get_statistics) or the more granular list_inbox_emails / get_mailbox_unread_counts. The agent is left to infer the difference between an 'overview' and a 'dashboard' or 'statistics' entirely on its own.

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

get_mailbox_unread_countsGet Mailbox Unread CountsA

Get unread counts per mailbox for one account or all accounts.

When summary_only=True, returns only per-account inbox unread totals (replaces the former get_unread_count tool).

NameRequiredDescriptionDefault
accountNoOptional account name filter
include_zeroNoWhether to include mailboxes with zero unread messages
summary_onlyNoIf True, return only per-account inbox unread totals (flat dict of account name -> unread count)

Output 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?

No annotations are provided, so the description carries the full burden. It usefully discloses the summary_only behavior change and notes it replaces a former tool, but says nothing about read-only safety, freshness of counts, or account-filtering side effects (e.g., unread counts across all accounts by default). Adequate but incomplete for a zero-annotation tool.

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?

Two sentences, front-loaded with the primary purpose before the mode-specific caveat. Efficient, though the parenthetical about the former tool could be trimmed.

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, return-value detail is unnecessary, and the description covers scope and the summary_only variant. It leaves the account-filter default behavior and relationship to sibling overview/stats tools implicit, which 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%, so account and include_zero are already fully documented in the schema. The description adds meaning only for summary_only (flat per-account inbox totals, replacing get_unread_count), which is marginal beyond the schema text. 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 ('Get unread counts per mailbox') and clarifies scope ('one account or all accounts'), which separates it from list-oriented siblings. It does not explicitly contrast with close siblings like get_inbox_overview or get_statistics, so it stops short of a 5.

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 it (per-mailbox unread retrieval) and flags the summary_only mode, but gives no explicit guidance on when to prefer this over get_inbox_overview, get_statistics, or inbox_dashboard. Usage is inferable rather than stated.

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

get_needs_responseGet Needs ResponseA

Identify unread emails that likely need a response from you.

Filters out newsletters, automated emails, and noreply senders. Prioritises direct emails (To: you) with question marks as likely needing a reply.

NameRequiredDescriptionDefault
accountYesAccount name (e.g., "Gmail", "Work", "Personal")
mailboxNoMailbox to scan (default: "INBOX")INBOX
days_backNoHow many days back to look (default: 7)
max_resultsNoMaximum results to return (default: 20)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations are absent, so the description carries the full burden. It discloses the filtering logic and prioritisation heuristic, which is meaningful behavioral context. However, it does not state that the operation is read-only or mention authentication, rate limits, or side effects.

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?

Three short sentences with the core purpose front-loaded, followed by filtering and prioritisation details. No sentence feels wasted, though the structure could be slightly tighter.

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?

An output schema exists, so return values are covered. The description provides enough context about the logic to call the tool correctly, but it omits whether the operation is read-only or if it has any side effects, which would be valuable given no annotations.

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%, so all four parameters (account, mailbox, days_back, max_results) are documented in the input schema. The description adds no parameter-level information, which is acceptable when the schema does the heavy lifting, 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?

The description clearly states the verb (identify) and the resource (unread emails needing a response), and implies a specific filtering heuristic. However, it does not differentiate from similar siblings like get_awaiting_reply, which an agent might otherwise consider.

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 explains the filtering and prioritisation criteria (excludes newsletters/automated/noreply, prioritises direct emails with question marks), which gives some implied usage context. But it does not state when to choose this tool over alternatives like search_emails or get_awaiting_reply, nor does it provide explicit exclusions or prerequisites.

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

get_statisticsGet StatisticsC

Get comprehensive email statistics and analytics.

NameRequiredDescriptionDefault
scopeNoAnalysis scope: "account_overview", "sender_stats", "mailbox_breakdown"account_overview
senderNoSpecific sender for "sender_stats" scope
accountYesAccount name (e.g., "Gmail", "Work")
mailboxNoSpecific mailbox for "mailbox_breakdown" scope
days_backNoNumber of days to analyze (default: 30, 0 = all time)

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.6/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 disclosure burden, yet it says nothing about being read-only, permission/account requirements, rate limits, or cost of a wide days_back window. "Get" weakly implies a safe read, but nothing is stated explicitly.

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

Conciseness3/5

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

A single short, front-loaded sentence with no wasted words, but it is under-specified rather than genuinely concise – brevity comes at the cost of useful 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?

An output schema exists, so return values need not be explained, and the input schema is fully documented. However, with no annotations and no sibling differentiation among several analytics tools, the definition is only minimally complete for correct tool selection.

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 already documents scope, sender, mailbox, and days_back with defaults and enum-like values. The description adds nothing about the interplay between scope and the optional sender/mailbox params, so baseline 3 applies.

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

Purpose3/5

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

"Get comprehensive email statistics and analytics" names a verb and resource, but "comprehensive" is vague about what is actually returned. It does not distinguish this tool from closely overlapping siblings such as get_inbox_overview, inbox_dashboard, get_top_senders, or get_awaiting_reply, so an agent cannot tell which analytics tool to pick.

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 guidance, no mention of the scope modes, and no routing to or away from sibling analytics tools. The agent is left to infer that this is for aggregate stats rather than per-message or per-mailbox data.

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

get_top_sendersGet Top SendersB

Analyse a mailbox to find the most frequent senders.

Useful for identifying key contacts, high-volume senders to filter, or newsletter sources to unsubscribe from.

NameRequiredDescriptionDefault
top_nNoNumber of top senders to return (default: 10)
accountYesAccount name (e.g., "Gmail", "Work", "Personal")
mailboxNoMailbox to analyse (default: "INBOX")INBOX
days_backNoHow many days back to look (default: 30, 0 = all time)
group_by_domainNoGroup results by domain instead of individual sender (default: False)

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, but it only implies a read ("analyse") without stating read-only safety, permission/auth requirements, or any rate/scope constraints. The use-case framing adds context but no behavioral traits beyond what the name already suggests.

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?

Two short sentences with the core purpose front-loaded and use cases as supporting detail. No filler; sized appropriately for a straightforward analysis tool.

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?

Return values are covered by the output schema and all params are documented, so the description only needs to add behavioral framing. It does not deliver that (no read-only note, no scoping caveats), leaving the definition minimally viable for a no-annotation 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 all five parameters (top_n, account, mailbox, days_back, group_by_domain) are already documented in the schema. The description adds no parameter-level meaning beyond that, 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 (analyse) and resource (mailbox senders) with a clear outcome: the most frequent senders. It's distinguishable from siblings like search_emails or get_statistics, though it doesn't explicitly contrast itself with any of them.

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?

Provides concrete use cases: identifying key contacts, finding high-volume senders to filter, and locating newsletters to unsubscribe from. This is clear when-to-use context, but it names no alternatives or conditions that would select a different tool.

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

inbox_dashboardInbox DashboardA

Get an interactive dashboard view of your email inbox.

Returns an interactive UI dashboard resource that displays:

  • Unread email counts by account (visual cards with badges)

  • Recent emails across all accounts (filterable list)

  • Quick action buttons for common operations (Mark Read, Archive, Delete)

  • Search functionality to filter emails

This tool returns a UIResource that can be rendered by compatible MCP clients (like Claude Desktop with MCP Apps support) to provide an interactive dashboard experience.

Note: Requires mcp-ui-server package and a compatible MCP client.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full disclosure burden and does meaningful work: it states the return is a UIResource, that it renders only in compatible MCP clients, and that mcp-ui-server is a dependency. That environmental constraint is exactly the kind of non-obvious behavior an agent needs. It does not explicitly confirm the operation is read-only, so not a 5.

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

Conciseness4/5

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

Front-loaded with the core purpose, then a scannable bullet list of dashboard contents, then the client-requirement note. Slightly redundant in restating 'interactive dashboard' twice ('interactive dashboard view' / 'interactive UI dashboard'), but otherwise every line 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?

There is no output schema, so the description correctly compensates by describing what the returned UIResource contains. Combined with zero params and explicit client prerequisites, an agent has what it needs to call it. The minor gap is no guidance on failure behavior when the client lacks MCP Apps support.

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 takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to clarify beyond that, and it correctly avoids inventing 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?

States a specific verb and resource: 'Get an interactive dashboard view of your email inbox.' The enumeration of contents (unread counts, recent emails, quick actions, search) makes the scope concrete and distinguishes it from data-returning siblings like list_inbox_emails or get_mailbox_unread_counts. It stops short of naming an alternative sibling explicitly, so it lands at 4 rather than 5.

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 context is implied rather than stated: the note that it needs mcp-ui-server and a compatible MCP client signals this is only useful in UI-capable clients, which is a real gating condition. However, there is no explicit 'use this when you want X, use get_inbox_overview instead when Y' routing against the many overlapping inbox/stats siblings.

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

list_account_addressesList Account AddressesA

List all configured email addresses for each Mail account.

Useful for mapping a Mail.app account name (e.g. "Gmail", "Work") to the actual email address(es) it receives mail at — handy when an integration needs to know which inbox a message landed in by address rather than by Mail.app's display name.

NameRequiredDescriptionDefault

No parameters

Output 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?

No annotations are provided, so the description carries the burden. "List" implies a read-only operation, but there is no explicit safety statement, no pagination or scoping note. The output schema covers return shape, so the remaining gap is modest, but for a tool with zero annotation coverage this is only adequate.

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

Conciseness4/5

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

Front-loaded with the core action in the first sentence, with the rationale following. Slightly verbose in the second sentence but each part earns its place by explaining the practical 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?

Given a zero-parameter read tool with an output schema, the description covers what it does and why it's useful. Missing only explicit safety/scope notes, which is minor here since the output schema handles the return contract.

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 takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly does not invent parameters.

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

Purpose5/5

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

States a specific verb (list) and resource (configured email addresses for each Mail account), and distinguishes itself from the sibling list_accounts by focusing on addresses rather than accounts. An agent can immediately tell what this returns.

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?

Provides a clear motivating use case — mapping a Mail.app display name like "Gmail" or "Work" to actual addresses for integrations. It doesn't explicitly name when to prefer a sibling (e.g. list_accounts), but the context is clear enough to select it.

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

list_accountsList AccountsB

List all available Mail accounts.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description must carry behavioral disclosure. It states only that accounts are listed, without confirming read-only safety, auth requirements, or account scope beyond 'available'.

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, front-loaded sentence with no wasted words. It is appropriately sized for a simple zero-parameter listing 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?

Given zero parameters and an output schema, the description is nearly complete for invocation. It could still clarify its relationship to sibling account- and mailbox-listing tools.

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 takes zero parameters, so per the rubric the baseline is 4. The description adds no parameter details, but none are needed.

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 clear verb and resource: 'List all available Mail accounts.' An agent can identify the operation. However, it does not distinguish this from sibling listing tools such as list_account_addresses or list_mailboxes.

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 when-to-use guidance, no prerequisites, and does not mention alternatives among the many sibling list tools. Usage is only implied by the name and purpose.

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

list_email_attachmentsList Email AttachmentsB

List attachments for emails matching a subject keyword.

NameRequiredDescriptionDefault
accountYesAccount name (e.g., "Gmail", "Work", "Personal")
max_resultsNoMaximum number of matching emails to check (default: 1)
subject_keywordYesKeyword to search for in email subjects

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/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, but it only says it lists attachments. It omits whether the operation is read-only (though 'List' implies it), how max_results bounds the number of matching emails checked, what happens when no email matches, and whether any access permissions are required.

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 front-loaded sentence with no filler; every phrase (list, attachments, subject keyword) contributes to tool selection.

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 listing tool with 100% schema coverage and an output schema, the description identifies the resource and filter sufficiently. It could still say more about max_results' effect, but the structured fields cover the call mechanics.

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%, so account, subject_keyword, and max_results are already documented in the schema. The description reinforces the subject_keyword filter but adds no syntax, default, or constraint beyond the schema, giving the baseline 3.

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 ('List') and resource ('attachments') plus the filtering condition ('emails matching a subject keyword'), so the agent can distinguish it from save_email_attachment or search_emails. It does not explicitly name a sibling alternative, so it falls short of a 5.

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?

Provides no when-to-use or when-not guidance and does not mention alternatives such as search_emails or get_email_source. The subject-keyword filter implies a condition but does not help an agent choose this tool over siblings.

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

list_inbox_emailsList Inbox EmailsA

List all emails from inbox across all accounts or a specific account.

Replaces the former get_recent_emails tool — use account + max_emails to get recent emails from a single account.

NameRequiredDescriptionDefault
accountNoOptional account name to filter (e.g., "Gmail", "Work"). If None, shows all accounts.
max_emailsNoMaximum number of emails to return per account (0 = all)
include_readNoWhether to include read emails (default: True)
output_formatNo"text" (default, human-readable) or "json" (structured list of email dicts)text
include_contentNoWhether to include a content preview for each email (slower, default: False)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden, and it discloses little beyond the account+max_emails combination behavior. It omits ordering, pagination, whether spam/trash are included, and how read/unread filtering interacts, though as a pure read list the safety profile is at least self-evident and an output schema covers return shape.

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?

Two short, front-loaded sentences with no filler; the purpose leads and the usage hint follows. The deprecated-tool note is the least load-bearing element but is still useful for agents migrating from the old name.

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 low-risk listing tool with full schema coverage and an output schema, the description covers what is needed to call it correctly. It stops short of routing among the many inbox-related siblings, which would make it fully complete.

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 five parameters are already documented with defaults and formats. The description adds only the combined account+max_emails intent, which is marginal beyond the schema's per-field descriptions.

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 clear verb+resource ("List all emails from inbox") with scope ("across all accounts or a specific account"). It does not explicitly contrast with the live sibling search_emails, which is the closest alternative, so differentiation is only partial.

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?

Gives one concrete usage recipe ("use account + max_emails to get recent emails from a single account") and notes it replaces get_recent_emails, which is migration info rather than live-sibling guidance. It never states when to prefer search_emails or get_inbox_overview, nor any exclusion conditions.

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

list_mailboxesList MailboxesA

List all mailboxes (folders) for a specific account or all accounts.

NameRequiredDescriptionDefault
accountNoOptional account name to filter (e.g., "Gmail", "Work"). If None, shows all accounts.
include_countsNoWhether to include message counts for each mailbox (default: True)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. 'List' implies a read-only operation, but it does not state permissions, rate limits, pagination, or that it is non-destructive, leaving meaningful behavioral context unstated.

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 redundant or wasted phrasing. It is appropriately sized for a simple list 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?

Given the low complexity, full schema description coverage, and the presence of an output schema, the description provides enough scope information for an agent to call the tool. It is slightly incomplete because it does not mention the include_counts parameter, though the schema covers that.

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 optional parameters have clear descriptions in the schema. The description only echoes the account filtering concept and adds no new semantics beyond what the schema already provides, so this is the baseline score.

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 and resource ('List all mailboxes (folders)') and a scope ('for a specific account or all accounts'). It is clear, but it does not explicitly differentiate this tool from sibling list tools such as list_accounts or list_inbox_emails beyond the resource name.

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 'for a specific account or all accounts' implies how to use the optional account filter, but the description gives no explicit when-to-use guidance, exclusions, or alternatives to consider. Usage is only implied.

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

manage_draftsManage DraftsB

Manage draft emails - list, create, send, open, or delete drafts.

NameRequiredDescriptionDefault
ccNoOptional CC recipients for create
toNoRecipient email(s) for create (comma-separated)
bccNoOptional BCC recipients for create
bodyNoEmail body (required for create)
actionYesAction to perform: "list", "create", "send", "open", "delete". Use "open" to open a draft in a visible compose window for review before sending.
accountYesAccount name (e.g., "Gmail", "Work")
subjectNoEmail subject (required for create)
from_addressNoOptional sender address for new drafts (action="create"). Must be one of the account's configured email addresses. When omitted, Mail uses the account's default "Send new messages from" setting.
draft_subjectNoSubject keyword to find draft (required for send/open/delete)

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full disclosure burden, and it does not meet it. It never states that 'send' is an irreversible outbound action, that 'delete' is destructive, whether deletions are recoverable, or what account/permission requirements apply. The action list merely repeats what the schema already enumerates.

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 front-loaded sentence that states the resource first and the supported operations second, with no filler. Nothing could be cut without losing content.

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 rich input schema and the presence of an output schema mean the description needn't explain parameters or return values, so it is not badly deficient. But for a nine-parameter, five-action mutation tool with zero annotations, the description should at minimum disambiguate against the compose/create siblings and flag the irreversible actions.

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

Parameters3/5

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

Schema description coverage is 100% and the schema itself is unusually rich, including the from_address fallback behavior and the create/send/open/delete requirements. The description adds no syntax, format, or conditional meaning beyond the schema, 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?

The description names the resource (draft emails) and enumerates the five operations it supports (list, create, send, open, delete), so an agent knows exactly what the tool covers. However, it never differentiates itself from overlapping siblings such as create_rich_email_draft or compose_email, which also produce or send mail, so the boundary is left to inference.

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

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 in the description. The agent is not told when to pick this tool over compose_email, create_rich_email_draft, or reply_to_email, nor that 'send' should follow an 'open' review. The only routing hint ('use open to review before sending') lives in the schema's action description, not here.

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

manage_trashManage TrashA

Manage trash operations - delete emails or empty trash.

When dry_run=True (default) and action is "move_to_trash", previews what would be deleted without acting. Set dry_run=False to actually move to trash.

Mail's AppleScript interface has no command that erases a message: delete means "move to Trash", and on a message that already sits in Trash it does nothing. "delete_permanent" and "empty_trash" therefore usually remove nothing at all. Both report the real before/after mailbox count instead of the number of delete calls, and say so when nothing was removed; emptying the trash for good has to happen in Mail itself.

NameRequiredDescriptionDefault
actionYesAction to perform: "move_to_trash", "delete_permanent", "empty_trash"
senderNoOptional sender to filter emails (not used for empty_trash)
accountYesAccount name (e.g., "Gmail", "Work")
dry_runNoIf True (default), preview what would be affected without acting
mailboxNoSource mailbox (default: "INBOX", not used for empty_trash or delete_permanent)INBOX
max_deletesNoMaximum number of emails to delete (safety limit, default: 5)
apply_to_allNoMust be True to allow operations without subject_keyword or sender filter
confirm_emptyNoMust be True to execute "empty_trash" action (safety confirmation)
older_than_daysNoOptional age filter - only affect emails older than N days
subject_keywordNoOptional keyword to filter emails (not used for empty_trash)
subject_keywordsNoOptional list of subject keywords; matches any keyword

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so exceptionally: it discloses that Mail's AppleScript 'delete' only moves to Trash, that delete_permanent and empty_trash usually remove nothing, that results report real before/after mailbox counts rather than call counts, and that permanent emptying must be done in Mail itself. These are non-obvious, high-value behavioral traits an agent could not infer elsewhere.

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 lead sentence is front-loaded and the critical limitation follows immediately. It is somewhat verbose with backticked command names and quotes, but every sentence conveys a distinct, useful fact, so waste is minimal.

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 complex 11-parameter destructive tool, the description covers the essential behavioral caveats, and the existence of an output schema removes the need to explain return values. The only gap is the lack of explicit routing against sibling tools, but otherwise it is complete enough 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 description coverage is 100%, so the schema already documents all 11 parameters, establishing a baseline of 3. The description adds useful context by reinforcing the dry_run default and the semantics of the action values, but does not meaningfully extend parameter meaning 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?

States a specific verb+resource: 'Manage trash operations - delete emails or empty trash.' An agent can tell this concerns trash deletion, but the description does not distinguish it from the sibling move_email, which also relocates messages, so sibling differentiation is incomplete.

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 gives clear operational context for the dry_run flag (default preview, set False to act) and explains what each action does, but it never states when to choose this tool over move_email or delete_permanent-style alternatives, nor are any exclusions drawn. Usage is implied rather than explicitly routed.

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

move_emailMove EmailA

Move email(s) matching filters from one mailbox to another.

Supports subject, sender, and date filters. Use dry_run=True to preview matches without moving. Set only_read=True to skip unread emails (useful for archiving). For archiving to "Archive", just set to_mailbox="Archive". Pass message_ids to move specific messages by exact id (ignores other filters; same fast path as update_email_status).

NameRequiredDescriptionDefault
senderNoOptional sender to filter emails by
accountYesAccount name (e.g., "Gmail", "Work")
dry_runNoIf True, preview what would be moved without acting (default: False)
max_movesNoMaximum number of emails to move (default: 50, safety limit)
only_readNoIf True, only move emails that have been read (default: False)
to_mailboxYesDestination mailbox name. For nested mailboxes, use "/" separator (e.g., "Projects/Amplify Impact")
message_idsNoOptional list of exact Mail message ids for precise targeting. When set, all other filters are ignored.
from_mailboxNoSource mailbox name (default: "INBOX")INBOX
older_than_daysNoOptional age filter - only move emails older than N days
subject_keywordNoOptional keyword to search for in email subjects
subject_keywordsNoOptional list of keywords to match in subjects; matches any keyword

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose real behavior: dry_run previews without acting, message_ids overrides all other filters, and only_read restricts to read mail. It omits whether the destination mailbox must already exist, permission requirements, and whether the move is reversible, which is a meaningful gap for an unannotated mutation tool.

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

Conciseness5/5

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

Five short sentences, front-loaded with the core action and then the highest-value usage hints (dry_run, only_read, Archive shorthand, message_ids precedence). Every sentence contributes; there is no filler or repetition of the tool name.

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?

An output schema exists, so return values need not be explained, and the description covers the key invocation paths for an 11-parameter mutation tool. It is slightly short of complete because the max_moves safety limit and failure behavior (missing destination mailbox, partial moves) go unaddressed given there are no annotations to cover them.

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 already documents all 11 parameters and the baseline is 3. The description restates dry_run/only_read/message_ids semantics that the schema already provides, adding only marginal value (the 'Archive' shorthand and the sibling fast-path reference), so it does not rise above baseline.

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 opening sentence names a specific verb and resource ('Move email(s) ... from one mailbox to another') plus the selection mechanism (filters). It also distinguishes itself from sibling update_email_status by calling out that message_ids uses 'the same fast path', so an agent can route between the two.

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 gives concrete when-to-use guidance: dry_run=True to preview, only_read=True 'useful for archiving', and message_ids for exact-id targeting. It stops short of stating when NOT to use this tool (e.g. versus search_emails or update_email_status for non-move operations), so it is clear context without exclusions.

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

reply_to_emailReply To EmailC

Reply to an email matching a subject keyword.

NameRequiredDescriptionDefault
ccNoOptional CC recipients, comma-separated for multiple
bccNoOptional BCC recipients, comma-separated for multiple
modeNoDelivery mode — "send" (send immediately), "draft" (save silently), or "open" (open compose window for review). Overrides send parameter when set.
sendNoIf True (default), send immediately; if False, save as draft. Ignored if mode is set.
accountYesAccount name (e.g., "Gmail", "Work")
body_htmlNoOptional HTML body for rich formatting (bold, headings, links, colors). When provided, the reply is pasted as HTML. The plain 'reply_body' field is still required as fallback text.
reply_bodyYesThe body text of the reply
attachmentsNoOptional file paths to attach, comma-separated for multiple (e.g., "/path/to/file1.png,/path/to/file2.pdf")
from_addressNoOptional sender address to use for this reply. Must be one of the account's configured email addresses. When omitted, Mail uses the account's default "Send new messages from" setting.
reply_to_allNoIf True, reply to all recipients; if False, reply only to sender (default: False)
subject_keywordYesKeyword to search for in email subjects

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/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 behavioral disclosure. It says nothing about the fact that this is a side-effectful send operation by default (send=true), that it can silently save a draft, or what happens if multiple emails match the subject keyword — all of which matter for a mutation tool with zero 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.

Conciseness3/5

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

It is a single front-loaded sentence with no filler, which is structurally clean, but for an 11-parameter send operation this is under-specification rather than genuine conciseness — it omits information an agent needs rather than trimming noise.

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?

An output schema exists so return values need not be explained, but the description omits the critical context that this tool sends mail by default, may match multiple emails, and requires a configured account. For a high-complexity side-effectful tool with no annotations, the definition is not complete enough to call safely.

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 11 parameters are already documented in the schema (mode, send, reply_to_all, from_address, etc.). The description's only parameter-adjacent content, subject-keyword matching, merely repeats what the schema says, so 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 ("Reply to an email") plus the selection mechanism ("matching a subject keyword"), which is more precise than a name restatement. However it never distinguishes itself from close siblings like compose_email or forward_email, so an agent gets no help picking between them.

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 when-to-use guidance, no prerequisites, and no mention of alternatives (compose_email, forward_email, manage_drafts). The only implied usage is that the target email is identified by subject keyword, which is barely a usage condition.

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

save_email_attachmentSave Email AttachmentC

Save a specific attachment from an email to disk.

NameRequiredDescriptionDefault
accountYesAccount name (e.g., "Gmail", "Work", "Personal")
mailboxNoMailbox to search in (default: "INBOX"). Use e.g. "Archive" for an already archived message; nested mailboxes use "/".INBOX
save_pathYesFull path where to save the attachment. Protected locations (shell startup and dotfiles in ~, .git/hooks, LaunchAgents, ~/Library/Application Support, ...) are rejected; see "File Access" in the README for opt-in restriction to specific folders.
attachment_nameYesName of the attachment to save
subject_keywordYesKeyword to search for in email subjects

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, yet it omits the important traits of a filesystem-writing tool: how the target email is located (subject keyword matching), what happens on multiple matches or missing attachments, and overwrite behavior. Protected-path restrictions appear only in the schema, not the description.

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 zero waste. It is efficient, though arguably under-specified for a 5-parameter, side-effecting tool.

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?

An output schema exists so return values need not be explained, but for a tool that searches by keyword and writes to the filesystem, the description leaves key resolution and failure behaviors undocumented, with no annotations to compensate.

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 already documents every parameter including defaults and path restrictions. The description adds no parameter meaning beyond what the schema provides, 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?

States a specific verb (save), resource (attachment from an email) and destination (to disk), so the agent knows exactly what the tool does. It does not differentiate itself from the sibling list_email_attachments, which an agent might reasonably confuse with it, so it stops short of a 5.

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 this tool versus alternatives like list_email_attachments or get_email_source. The description is a bare purpose statement with no context, prerequisites, or exclusions.

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

search_emailsSearch EmailsA

Unified search tool with JSON output, pagination, and real date filtering.

Consolidates subject search, sender search, body content search, and cross-account search into a single tool.

NameRequiredDescriptionDefault
sortNoResult sort order: "date_desc" or "date_asc"date_desc
limitNoMaximum number of results to return per page
offsetNoNumber of matching results to skip before returning data
senderNoOptional sender email or name to filter by
accountNoAccount name to search in (e.g., "Gmail", "Work"). If None, searches ALL accounts (slower).
date_toNoOptional end date filter (format: "YYYY-MM-DD")
flaggedNoOptional filter for flagged emails (True/False/None)
mailboxNoMailbox to search (default: "INBOX", use "All" for all mailboxes, or specific folder name)INBOX
body_textNoOptional text to search for in email body content (case-insensitive). WARNING: body search is significantly slower as it reads each message body.
date_fromNoOptional start date filter (format: "YYYY-MM-DD")
flag_colorNoOptional filter for a specific flag color: "red", "orange", "yellow", "green", "blue", "purple", or "gray". Implies flagged=True.
max_resultsNoBackward-compatible alias for limit
read_statusNoFilter by read status: "all", "read", "unread" (default: "all")all
output_formatNoOutput format: "text" or "json" (default: "text")text
has_attachmentsNoOptional filter for emails with attachments (True/False/None)
include_contentNoWhether to include email content preview (slower)
subject_keywordNoOptional keyword to search in subject
subject_keywordsNoOptional list of subject keywords; matches any keyword
max_content_lengthNoMaximum content length in characters when include_content=True (default: 500, 0 = unlimited)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It mentions JSON output, pagination, and real date filtering, but omits read-only nature, authorization requirements, and performance implications beyond what individual schema fields already say.

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?

Two tight sentences, front-loaded with scope and capabilities. Every sentence contributes either purpose or differentiation, with no filler.

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 and output schema cover parameters and return values, so the description need not restate them. However, with 19 parameters and no annotations, the description is thin on when to choose this over list_inbox_emails and on behavioral caveats, leaving notable gaps for a complex search 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 baseline is 3. The description adds only a high-level mapping to subject, sender, body, cross-account, and date filtering, without parameter-specific detail beyond what the schema already provides.

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?

Names a specific verb and resource ('search tool' for emails) and lists the search modes it consolidates: subject, sender, body, and cross-account. This distinguishes it from simple listing tools like list_inbox_emails, though it does not name those siblings explicitly.

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?

Implies use for subject, sender, body, and cross-account searches by saying it consolidates them, but gives no explicit when-to-use or when-not guidance. It also does not name alternatives such as list_inbox_emails, so selection guidance is only implied.

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

synchronize_accountSynchronize AccountA

Force Mail.app to synchronize an account (or every account) with its IMAP / Exchange server right now. Equivalent to clicking the refresh button next to the account or selecting Mailbox → Synchronize.

Use after move_email, update_email_status, or manage_trash when downstream clients (iPhone, web mail, etc.) need to see the change immediately. Mail.app's natural sync cadence is "automatic" which can be several minutes — this collapses that to one IMAP push.

Implementation note:

Uses the synchronize with <account> AppleScript verb (per Mail.sdef: "Command to trigger synchronizing of an IMAP account with the server") rather than check for new mail. The latter is receive-only — it pulls new messages but does NOT push pending IMAP commands like queued moves / archives / flag changes. With check for new mail, archives done via move_email could sit in Mail.app's local cache for several minutes before reaching the IMAP server, leaving iPhone Mail (which reads IMAP directly) showing already-archived messages still in INBOX. synchronize with is the bidirectional verb that drains pending IMAP commands AND fetches new mail.

Mail.app's synchronize is potentially long-running. We wrap each invocation in with timeout of N seconds so the AppleScript returns promptly. When the timeout fires (error -1712) Mail.app keeps the sync running in the background — exactly the fire-and-forget semantics callers expect.

NameRequiredDescriptionDefault
accountNoAccount name (e.g., "Gmail", "Work"). Omit to sync every configured account.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: it discloses bidirectional push semantics vs receive-only, long-running behavior, the AppleScript timeout wrapper (error -1712), and fire-and-forget semantics after timeout. This is far more behavioral context than annotations would normally supply.

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

Conciseness4/5

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

Front-loaded with purpose and usage before the implementation note, and the structure is clear. The implementation note is lengthy and somewhat beyond what an agent strictly needs to invoke the tool, but each part does carry real behavioral value.

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

Completeness5/5

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

An output schema exists, so return values need not be explained. Given a single optional param and no annotations, the description supplies everything an agent needs: purpose, timing, push semantics, and timeout behavior.

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 single optional param is already documented ('Omit to sync every configured account'). The description's 'account (or every account)' framing mirrors the schema but adds no new syntax or format detail, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource: force Mail.app to synchronize an account (or all accounts) with its IMAP/Exchange server. It explicitly contrasts with the sibling-ish concept of 'check for new mail', so an agent can distinguish the action from passive polling without opening anything else.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance ('Use after move_email, update_email_status, or manage_trash when downstream clients need to see the change immediately') and names the relevant sibling tools. It also explains the condition (natural cadence of several minutes) that motivates calling it at all.

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

update_email_statusUpdate Email StatusA

Update email status - mark as read/unread or flag/unflag emails.

When message_ids is provided, uses exact ID matching (ignores other filters). Otherwise filters by subject, sender, and/or age.

NameRequiredDescriptionDefault
actionYesAction to perform: "mark_read", "mark_unread", "flag", "unflag"
senderNoOptional sender to filter emails by
accountYesAccount name (e.g., "Gmail", "Work")
mailboxNoMailbox to search in (default: "INBOX")INBOX
flag_colorNoOptional flag color for the "flag" action: "red", "orange", "yellow", "green", "blue", "purple", or "gray". Omit to flag without setting a color — Mail shows its default (red), or the message's previous color if one remains from an earlier flag. Re-colors messages that are already flagged.
max_updatesNoMaximum number of emails to update (safety limit, default: 10)
message_idsNoOptional list of exact Mail message ids for precise targeting
apply_to_allNoMust be True to allow updates without any filter
older_than_daysNoOptional age filter - only update emails older than N days
subject_keywordNoOptional keyword to filter emails by subject
subject_keywordsNoOptional list of subject keywords; matches any keyword

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden, and it only partially delivers: it discloses the message_ids-vs-filters precedence rule. It says nothing about safety limits (max_updates, apply_to_all exist in the schema but their guardrail intent is unexplained), reversibility of the updates, or required permissions.

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?

Two compact sentences, front-loaded with purpose and followed by the precedence behavior; nothing is padded. Slightly more guidance could have been added without waste, but it is efficiently structured.

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?

An output schema exists and parameter coverage is complete, so the agent needs little more than purpose plus filter behavior, both of which are present. The absence of any note on the relationship to sibling mutation tools is the only meaningful 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 the schema already documents all 11 parameters in detail, making 3 the baseline. The description adds only the filter-precedence nuance and no further parameter-level meaning beyond what the schema provides.

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 ('Update email status') and enumerates the concrete actions (mark as read/unread, flag/unflag), so an agent knows exactly what it does. It does not, however, differentiate itself from siblings that also mutate message state (e.g. move_email, manage_trash), so it stops short of a 5.

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 gives one useful routing rule — that supplying message_ids switches to exact-ID matching and ignores other filters — which is genuine conditional guidance. It offers no explanation of when to prefer this tool over its many siblings or when not to use it, leaving usage largely implied.

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. 27 tool updatesv3.2.1
    • Changedcompose_email25 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name to send from (e.g., \"Gmail\", \"Work\", \"Personal\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / attachments / description
        Added value: +"Optional file paths to attach, comma-separated for multiple (e.g., \"/path/to/file1.png,/path/to/file2.pdf\")"
      • removedInput schema / properties / attachments / title
        Removed value: -"Attachments"
      • addedInput schema / properties / bcc / description
        Added value: +"Optional BCC recipients, comma-separated for multiple"
      • removedInput schema / properties / bcc / title
        Removed value: -"Bcc"
      • addedInput schema / properties / body / description
        Added value: +"Email body text (used as plain-text fallback when body_html is provided)"
      • removedInput schema / properties / body / title
        Removed value: -"Body"
      • addedInput schema / properties / body_html / description
        Added value: +"Optional HTML body for rich formatting (bold, headings, links, colors). When provided, the email is sent as HTML. The plain 'body' field is still required as fallback text."
      • removedInput schema / properties / body_html / title
        Removed value: -"Body Html"
      • addedInput schema / properties / cc / description
        Added value: +"Optional CC recipients, comma-separated for multiple"
      • removedInput schema / properties / cc / title
        Removed value: -"Cc"
      • addedInput schema / properties / from_address / description
        Added value: +"Optional sender address to use for this message. Must be one of the account's configured email addresses. When omitted, Mail uses the account's default \"Send new messages from\" setting."
      • removedInput schema / properties / from_address / title
        Removed value: -"From Address"
      • addedInput schema / properties / mode / description
        Added value: +"Delivery mode — \"send\" (send immediately, default), \"draft\" (save silently to Drafts), or \"open\" (open compose window for review before sending)"
      • removedInput schema / properties / mode / title
        Removed value: -"Mode"
      • addedInput schema / properties / subject / description
        Added value: +"Email subject line"
      • removedInput schema / properties / subject / title
        Removed value: -"Subject"
      • addedInput schema / properties / to / description
        Added value: +"Recipient email address(es), comma-separated for multiple"
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • removedInput schema / title
        Removed value: -"compose_emailArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"compose_emailOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedcreate_mailbox11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / name / description
        Added value: +"Name for the new mailbox. May contain \"/\" to create a\n  nested path in one call (each segment is created if needed)."
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • addedInput schema / properties / parent_mailbox / description
        Added value: +"Optional existing parent folder for nesting."
      • removedInput schema / properties / parent_mailbox / title
        Removed value: -"Parent Mailbox"
      • removedInput schema / title
        Removed value: -"create_mailboxArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"create_mailboxOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedcreate_rich_email_draft27 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name to use for the sender identity (e.g., \"Work\", \"Oracle\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / bcc / description
        Added value: +"Optional BCC recipients, comma-separated for multiple"
      • removedInput schema / properties / bcc / title
        Removed value: -"Bcc"
      • addedInput schema / properties / cc / description
        Added value: +"Optional CC recipients, comma-separated for multiple"
      • removedInput schema / properties / cc / title
        Removed value: -"Cc"
      • addedInput schema / properties / from_address / description
        Added value: +"Optional sender address to stamp into the `.eml` `From:` header. Must be one of the account's configured email addresses. When omitted, Mail fills the account's default \"Send new messages from\" address on open."
      • removedInput schema / properties / from_address / title
        Removed value: -"From Address"
      • addedInput schema / properties / html_body / description
        Added value: +"Optional HTML body. If omitted but text_body is provided, a basic HTML wrapper is generated."
      • removedInput schema / properties / html_body / title
        Removed value: -"Html Body"
      • addedInput schema / properties / open_in_mail / description
        Added value: +"If True, open the generated `.eml` in Mail (default: True)"
      • removedInput schema / properties / open_in_mail / title
        Removed value: -"Open In Mail"
      • addedInput schema / properties / output_path / description
        Added value: +"Optional path for the generated `.eml` file (same protected-location\nrules as save_email_attachment; defaults to ~/Library/Caches/apple-mail-mcp/rich-drafts)"
      • removedInput schema / properties / output_path / title
        Removed value: -"Output Path"
      • addedInput schema / properties / save_as_draft / description
        Added value: +"Not currently supported. Mail opens a `.eml` as a read-only message\nviewer, not a compose object, so it can never be saved into Drafts this way.\nPassing True is reported honestly in the output rather than silently ignored;\nuse `compose_email(mode=\"draft\")` or `manage_drafts` for a real, sendable draft."
      • removedInput schema / properties / save_as_draft / title
        Removed value: -"Save As Draft"
      • addedInput schema / properties / subject / description
        Added value: +"Subject line for the draft (optional; defaults to empty)"
      • removedInput schema / properties / subject / title
        Removed value: -"Subject"
      • addedInput schema / properties / text_body / description
        Added value: +"Optional plain-text body. If omitted but html_body is provided, a fallback plain body is generated."
      • removedInput schema / properties / text_body / title
        Removed value: -"Text Body"
      • addedInput schema / properties / to / description
        Added value: +"Optional recipient email address(es), comma-separated for multiple"
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • removedInput schema / title
        Removed value: -"create_rich_email_draftArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"create_rich_email_draftOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedexport_emails19 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / format / description
        Added value: +"Export format: \"txt\", \"html\" (default: \"txt\")"
      • removedInput schema / properties / format / title
        Removed value: -"Format"
      • addedInput schema / properties / mailbox / description
        Added value: +"Mailbox to export from (default: \"INBOX\")"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / max_emails / description
        Added value: +"Maximum number of emails to export for entire_mailbox (default: 1000, safety cap)"
      • removedInput schema / properties / max_emails / title
        Removed value: -"Max Emails"
      • addedInput schema / properties / save_directory / description
        Added value: +"Directory to save exports (default: \"~/Desktop\"). Protected\nlocations (dot-folders in ~, LaunchAgents, ~/Library/Application Support,\n...) are rejected."
      • removedInput schema / properties / save_directory / title
        Removed value: -"Save Directory"
      • addedInput schema / properties / scope / description
        Added value: +"Export scope: \"single_email\" (requires subject_keyword) or \"entire_mailbox\""
      • removedInput schema / properties / scope / title
        Removed value: -"Scope"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Keyword to find email (required for single_email)"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • removedInput schema / title
        Removed value: -"export_emailsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"export_emailsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedforward_email21 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / bcc / description
        Added value: +"Optional BCC recipients, comma-separated for multiple"
      • removedInput schema / properties / bcc / title
        Removed value: -"Bcc"
      • addedInput schema / properties / cc / description
        Added value: +"Optional CC recipients, comma-separated for multiple"
      • removedInput schema / properties / cc / title
        Removed value: -"Cc"
      • addedInput schema / properties / from_address / description
        Added value: +"Optional sender address to use when forwarding. Must be one of the account's configured email addresses. When omitted, Mail uses the account's default \"Send new messages from\" setting."
      • removedInput schema / properties / from_address / title
        Removed value: -"From Address"
      • addedInput schema / properties / mailbox / description
        Added value: +"Mailbox to search in (default: \"INBOX\")"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / message / description
        Added value: +"Optional message to add before forwarded content"
      • removedInput schema / properties / message / title
        Removed value: -"Message"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Keyword to search for in email subjects"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • addedInput schema / properties / to / description
        Added value: +"Recipient email address(es), comma-separated for multiple"
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • removedInput schema / title
        Removed value: -"forward_emailArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"forward_emailOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_awaiting_reply13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / days_back / description
        Added value: +"How many days back to check sent emails (default: 7, 0 = all time)"
      • removedInput schema / properties / days_back / title
        Removed value: -"Days Back"
      • addedInput schema / properties / exclude_noreply / description
        Added value: +"Skip emails sent to noreply/no-reply addresses (default: True)"
      • removedInput schema / properties / exclude_noreply / title
        Removed value: -"Exclude Noreply"
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum results to return (default: 20)"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedInput schema / title
        Removed value: -"get_awaiting_replyArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_awaiting_replyOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Addedget_email_source
    • Changedget_email_thread13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / mailbox / description
        Added value: +"Mailbox to search in (default: \"INBOX\", use \"All\" for all mailboxes)"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / max_messages / description
        Added value: +"Maximum number of candidate messages to inspect (default: 50).\nThe cap applies before linking: only the first N subject matches\nthat Mail returns are considered, so the thread is seeded from the\nnewest of those N, not necessarily the newest message overall.\nRaise it for long-running subjects."
      • removedInput schema / properties / max_messages / title
        Removed value: -"Max Messages"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Keyword to identify the thread (e.g., \"Re: Project Update\")"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • removedInput schema / title
        Removed value: -"get_email_threadArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_email_threadOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_inbox_overview5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"get_inbox_overviewArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_inbox_overviewOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_mailbox_unread_counts12 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Optional account name filter"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / include_zero / description
        Added value: +"Whether to include mailboxes with zero unread messages"
      • removedInput schema / properties / include_zero / title
        Removed value: -"Include Zero"
      • addedInput schema / properties / summary_only / description
        Added value: +"If True, return only per-account inbox unread totals\n          (flat dict of account name -> unread count)"
      • removedInput schema / properties / summary_only / title
        Removed value: -"Summary Only"
      • removedInput schema / title
        Removed value: -"get_mailbox_unread_countsArguments"
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "additionalProperties": true,
        -    "title": "Result",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / title
        Removed value: -"get_mailbox_unread_countsOutput"
    • Changedget_needs_response13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / days_back / description
        Added value: +"How many days back to look (default: 7)"
      • removedInput schema / properties / days_back / title
        Removed value: -"Days Back"
      • addedInput schema / properties / mailbox / description
        Added value: +"Mailbox to scan (default: \"INBOX\")"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum results to return (default: 20)"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedInput schema / title
        Removed value: -"get_needs_responseArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_needs_responseOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_statistics15 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / days_back / description
        Added value: +"Number of days to analyze (default: 30, 0 = all time)"
      • removedInput schema / properties / days_back / title
        Removed value: -"Days Back"
      • addedInput schema / properties / mailbox / description
        Added value: +"Specific mailbox for \"mailbox_breakdown\" scope"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / scope / description
        Added value: +"Analysis scope: \"account_overview\", \"sender_stats\", \"mailbox_breakdown\""
      • removedInput schema / properties / scope / title
        Removed value: -"Scope"
      • addedInput schema / properties / sender / description
        Added value: +"Specific sender for \"sender_stats\" scope"
      • removedInput schema / properties / sender / title
        Removed value: -"Sender"
      • removedInput schema / title
        Removed value: -"get_statisticsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_statisticsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_top_senders15 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / days_back / description
        Added value: +"How many days back to look (default: 30, 0 = all time)"
      • removedInput schema / properties / days_back / title
        Removed value: -"Days Back"
      • addedInput schema / properties / group_by_domain / description
        Added value: +"Group results by domain instead of individual sender (default: False)"
      • removedInput schema / properties / group_by_domain / title
        Removed value: -"Group By Domain"
      • addedInput schema / properties / mailbox / description
        Added value: +"Mailbox to analyse (default: \"INBOX\")"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / top_n / description
        Added value: +"Number of top senders to return (default: 10)"
      • removedInput schema / properties / top_n / title
        Removed value: -"Top N"
      • removedInput schema / title
        Removed value: -"get_top_sendersArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_top_sendersOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedinbox_dashboard2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"inbox_dashboardArguments"
    • Changedlist_account_addresses6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"list_account_addressesArguments"
      • addedOutput schema / additionalProperties
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "additionalProperties": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "title": "Result",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / title
        Removed value: -"list_account_addressesOutput"
    • Changedlist_accounts5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"list_accountsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_accountsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedlist_email_attachments11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum number of matching emails to check (default: 1)"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Keyword to search for in email subjects"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • removedInput schema / title
        Removed value: -"list_email_attachmentsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_email_attachmentsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedlist_inbox_emails15 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Optional account name to filter (e.g., \"Gmail\", \"Work\"). If None, shows all accounts."
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / include_content / description
        Added value: +"Whether to include a content preview for each email (slower, default: False)"
      • removedInput schema / properties / include_content / title
        Removed value: -"Include Content"
      • addedInput schema / properties / include_read / description
        Added value: +"Whether to include read emails (default: True)"
      • removedInput schema / properties / include_read / title
        Removed value: -"Include Read"
      • addedInput schema / properties / max_emails / description
        Added value: +"Maximum number of emails to return per account (0 = all)"
      • removedInput schema / properties / max_emails / title
        Removed value: -"Max Emails"
      • addedInput schema / properties / output_format / description
        Added value: +"\"text\" (default, human-readable) or \"json\" (structured list of email dicts)"
      • removedInput schema / properties / output_format / title
        Removed value: -"Output Format"
      • removedInput schema / title
        Removed value: -"list_inbox_emailsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_inbox_emailsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedlist_mailboxes9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Optional account name to filter (e.g., \"Gmail\", \"Work\"). If None, shows all accounts."
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / include_counts / description
        Added value: +"Whether to include message counts for each mailbox (default: True)"
      • removedInput schema / properties / include_counts / title
        Removed value: -"Include Counts"
      • removedInput schema / title
        Removed value: -"list_mailboxesArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_mailboxesOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedmanage_drafts23 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / action / description
        Added value: +"Action to perform: \"list\", \"create\", \"send\", \"open\", \"delete\". Use \"open\" to open a draft in a visible compose window for review before sending."
      • removedInput schema / properties / action / title
        Removed value: -"Action"
      • addedInput schema / properties / bcc / description
        Added value: +"Optional BCC recipients for create"
      • removedInput schema / properties / bcc / title
        Removed value: -"Bcc"
      • addedInput schema / properties / body / description
        Added value: +"Email body (required for create)"
      • removedInput schema / properties / body / title
        Removed value: -"Body"
      • addedInput schema / properties / cc / description
        Added value: +"Optional CC recipients for create"
      • removedInput schema / properties / cc / title
        Removed value: -"Cc"
      • addedInput schema / properties / draft_subject / description
        Added value: +"Subject keyword to find draft (required for send/open/delete)"
      • removedInput schema / properties / draft_subject / title
        Removed value: -"Draft Subject"
      • addedInput schema / properties / from_address / description
        Added value: +"Optional sender address for new drafts (action=\"create\"). Must be one of the account's configured email addresses. When omitted, Mail uses the account's default \"Send new messages from\" setting."
      • removedInput schema / properties / from_address / title
        Removed value: -"From Address"
      • addedInput schema / properties / subject / description
        Added value: +"Email subject (required for create)"
      • removedInput schema / properties / subject / title
        Removed value: -"Subject"
      • addedInput schema / properties / to / description
        Added value: +"Recipient email(s) for create (comma-separated)"
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • removedInput schema / title
        Removed value: -"manage_draftsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"manage_draftsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedmanage_trash27 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / action / description
        Added value: +"Action to perform: \"move_to_trash\", \"delete_permanent\", \"empty_trash\""
      • removedInput schema / properties / action / title
        Removed value: -"Action"
      • addedInput schema / properties / apply_to_all / description
        Added value: +"Must be True to allow operations without subject_keyword or sender filter"
      • removedInput schema / properties / apply_to_all / title
        Removed value: -"Apply To All"
      • addedInput schema / properties / confirm_empty / description
        Added value: +"Must be True to execute \"empty_trash\" action (safety confirmation)"
      • removedInput schema / properties / confirm_empty / title
        Removed value: -"Confirm Empty"
      • addedInput schema / properties / dry_run / description
        Added value: +"If True (default), preview what would be affected without acting"
      • removedInput schema / properties / dry_run / title
        Removed value: -"Dry Run"
      • addedInput schema / properties / mailbox / description
        Added value: +"Source mailbox (default: \"INBOX\", not used for empty_trash or delete_permanent)"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / max_deletes / description
        Added value: +"Maximum number of emails to delete (safety limit, default: 5)"
      • removedInput schema / properties / max_deletes / title
        Removed value: -"Max Deletes"
      • addedInput schema / properties / older_than_days / description
        Added value: +"Optional age filter - only affect emails older than N days"
      • removedInput schema / properties / older_than_days / title
        Removed value: -"Older Than Days"
      • addedInput schema / properties / sender / description
        Added value: +"Optional sender to filter emails (not used for empty_trash)"
      • removedInput schema / properties / sender / title
        Removed value: -"Sender"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Optional keyword to filter emails (not used for empty_trash)"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • addedInput schema / properties / subject_keywords / description
        Added value: +"Optional list of subject keywords; matches any keyword"
      • removedInput schema / properties / subject_keywords / title
        Removed value: -"Subject Keywords"
      • removedInput schema / title
        Removed value: -"manage_trashArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"manage_trashOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedmove_email27 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / dry_run / description
        Added value: +"If True, preview what would be moved without acting (default: False)"
      • removedInput schema / properties / dry_run / title
        Removed value: -"Dry Run"
      • addedInput schema / properties / from_mailbox / description
        Added value: +"Source mailbox name (default: \"INBOX\")"
      • removedInput schema / properties / from_mailbox / title
        Removed value: -"From Mailbox"
      • addedInput schema / properties / max_moves / description
        Added value: +"Maximum number of emails to move (default: 50, safety limit)"
      • removedInput schema / properties / max_moves / title
        Removed value: -"Max Moves"
      • addedInput schema / properties / message_ids / description
        Added value: +"Optional list of exact Mail message ids for precise targeting. When set, all other filters are ignored."
      • removedInput schema / properties / message_ids / title
        Removed value: -"Message Ids"
      • addedInput schema / properties / older_than_days / description
        Added value: +"Optional age filter - only move emails older than N days"
      • removedInput schema / properties / older_than_days / title
        Removed value: -"Older Than Days"
      • addedInput schema / properties / only_read / description
        Added value: +"If True, only move emails that have been read (default: False)"
      • removedInput schema / properties / only_read / title
        Removed value: -"Only Read"
      • addedInput schema / properties / sender / description
        Added value: +"Optional sender to filter emails by"
      • removedInput schema / properties / sender / title
        Removed value: -"Sender"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Optional keyword to search for in email subjects"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • addedInput schema / properties / subject_keywords / description
        Added value: +"Optional list of keywords to match in subjects; matches any keyword"
      • removedInput schema / properties / subject_keywords / title
        Removed value: -"Subject Keywords"
      • addedInput schema / properties / to_mailbox / description
        Added value: +"Destination mailbox name. For nested mailboxes, use \"/\" separator (e.g., \"Projects/Amplify Impact\")"
      • removedInput schema / properties / to_mailbox / title
        Removed value: -"To Mailbox"
      • removedInput schema / title
        Removed value: -"move_emailArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"move_emailOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedreply_to_email27 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / attachments / description
        Added value: +"Optional file paths to attach, comma-separated for multiple (e.g., \"/path/to/file1.png,/path/to/file2.pdf\")"
      • removedInput schema / properties / attachments / title
        Removed value: -"Attachments"
      • addedInput schema / properties / bcc / description
        Added value: +"Optional BCC recipients, comma-separated for multiple"
      • removedInput schema / properties / bcc / title
        Removed value: -"Bcc"
      • addedInput schema / properties / body_html / description
        Added value: +"Optional HTML body for rich formatting (bold, headings, links, colors). When provided, the reply is pasted as HTML. The plain 'reply_body' field is still required as fallback text."
      • removedInput schema / properties / body_html / title
        Removed value: -"Body Html"
      • addedInput schema / properties / cc / description
        Added value: +"Optional CC recipients, comma-separated for multiple"
      • removedInput schema / properties / cc / title
        Removed value: -"Cc"
      • addedInput schema / properties / from_address / description
        Added value: +"Optional sender address to use for this reply. Must be one of the account's configured email addresses. When omitted, Mail uses the account's default \"Send new messages from\" setting."
      • removedInput schema / properties / from_address / title
        Removed value: -"From Address"
      • addedInput schema / properties / mode / description
        Added value: +"Delivery mode — \"send\" (send immediately), \"draft\" (save silently), or \"open\" (open compose window for review). Overrides send parameter when set."
      • removedInput schema / properties / mode / title
        Removed value: -"Mode"
      • addedInput schema / properties / reply_body / description
        Added value: +"The body text of the reply"
      • removedInput schema / properties / reply_body / title
        Removed value: -"Reply Body"
      • addedInput schema / properties / reply_to_all / description
        Added value: +"If True, reply to all recipients; if False, reply only to sender (default: False)"
      • removedInput schema / properties / reply_to_all / title
        Removed value: -"Reply To All"
      • addedInput schema / properties / send / description
        Added value: +"If True (default), send immediately; if False, save as draft. Ignored if mode is set."
      • removedInput schema / properties / send / title
        Removed value: -"Send"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Keyword to search for in email subjects"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • removedInput schema / title
        Removed value: -"reply_to_emailArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"reply_to_emailOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedsave_email_attachment14 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / attachment_name / description
        Added value: +"Name of the attachment to save"
      • removedInput schema / properties / attachment_name / title
        Removed value: -"Attachment Name"
      • addedInput schema / properties / mailbox
        Added value: +{
        +  "default": "INBOX",
        +  "description": "Mailbox to search in (default: \"INBOX\"). Use e.g. \"Archive\" for an already archived message; nested mailboxes use \"/\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / save_path / description
        Added value: +"Full path where to save the attachment. Protected locations\n(shell startup and dotfiles in ~, .git/hooks, LaunchAgents,\n~/Library/Application Support, ...) are rejected; see \"File Access\"\nin the README for opt-in restriction to specific folders."
      • removedInput schema / properties / save_path / title
        Removed value: -"Save Path"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Keyword to search for in email subjects"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • removedInput schema / title
        Removed value: -"save_email_attachmentArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"save_email_attachmentOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedsearch_emails43 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name to search in (e.g., \"Gmail\", \"Work\").\nIf None, searches ALL accounts (slower)."
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / body_text / description
        Added value: +"Optional text to search for in email body content (case-insensitive).\nWARNING: body search is significantly slower as it reads each message body."
      • removedInput schema / properties / body_text / title
        Removed value: -"Body Text"
      • addedInput schema / properties / date_from / description
        Added value: +"Optional start date filter (format: \"YYYY-MM-DD\")"
      • removedInput schema / properties / date_from / title
        Removed value: -"Date From"
      • addedInput schema / properties / date_to / description
        Added value: +"Optional end date filter (format: \"YYYY-MM-DD\")"
      • removedInput schema / properties / date_to / title
        Removed value: -"Date To"
      • addedInput schema / properties / flag_color / description
        Added value: +"Optional filter for a specific flag color: \"red\", \"orange\",\n\"yellow\", \"green\", \"blue\", \"purple\", or \"gray\". Implies flagged=True."
      • removedInput schema / properties / flag_color / title
        Removed value: -"Flag Color"
      • addedInput schema / properties / flagged / description
        Added value: +"Optional filter for flagged emails (True/False/None)"
      • removedInput schema / properties / flagged / title
        Removed value: -"Flagged"
      • addedInput schema / properties / has_attachments / description
        Added value: +"Optional filter for emails with attachments (True/False/None)"
      • removedInput schema / properties / has_attachments / title
        Removed value: -"Has Attachments"
      • addedInput schema / properties / include_content / description
        Added value: +"Whether to include email content preview (slower)"
      • removedInput schema / properties / include_content / title
        Removed value: -"Include Content"
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of results to return per page"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • addedInput schema / properties / mailbox / description
        Added value: +"Mailbox to search (default: \"INBOX\", use \"All\" for all mailboxes, or specific folder name)"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / max_content_length / description
        Added value: +"Maximum content length in characters when include_content=True (default: 500, 0 = unlimited)"
      • removedInput schema / properties / max_content_length / title
        Removed value: -"Max Content Length"
      • addedInput schema / properties / max_results / description
        Added value: +"Backward-compatible alias for limit"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • addedInput schema / properties / offset / description
        Added value: +"Number of matching results to skip before returning data"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • addedInput schema / properties / output_format / description
        Added value: +"Output format: \"text\" or \"json\" (default: \"text\")"
      • removedInput schema / properties / output_format / title
        Removed value: -"Output Format"
      • addedInput schema / properties / read_status / description
        Added value: +"Filter by read status: \"all\", \"read\", \"unread\" (default: \"all\")"
      • removedInput schema / properties / read_status / title
        Removed value: -"Read Status"
      • addedInput schema / properties / sender / description
        Added value: +"Optional sender email or name to filter by"
      • removedInput schema / properties / sender / title
        Removed value: -"Sender"
      • addedInput schema / properties / sort / description
        Added value: +"Result sort order: \"date_desc\" or \"date_asc\""
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Optional keyword to search in subject"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • addedInput schema / properties / subject_keywords / description
        Added value: +"Optional list of subject keywords; matches any keyword"
      • removedInput schema / properties / subject_keywords / title
        Removed value: -"Subject Keywords"
      • removedInput schema / title
        Removed value: -"search_emailsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"search_emailsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedsynchronize_account7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\"). Omit to sync every\n     configured account."
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • removedInput schema / title
        Removed value: -"synchronize_accountArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"synchronize_accountOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedupdate_email_status27 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / account / description
        Added value: +"Account name (e.g., \"Gmail\", \"Work\")"
      • removedInput schema / properties / account / title
        Removed value: -"Account"
      • addedInput schema / properties / action / description
        Added value: +"Action to perform: \"mark_read\", \"mark_unread\", \"flag\", \"unflag\""
      • removedInput schema / properties / action / title
        Removed value: -"Action"
      • addedInput schema / properties / apply_to_all / description
        Added value: +"Must be True to allow updates without any filter"
      • removedInput schema / properties / apply_to_all / title
        Removed value: -"Apply To All"
      • addedInput schema / properties / flag_color / description
        Added value: +"Optional flag color for the \"flag\" action: \"red\", \"orange\",\n\"yellow\", \"green\", \"blue\", \"purple\", or \"gray\". Omit to flag\nwithout setting a color — Mail shows its default (red), or the\nmessage's previous color if one remains from an earlier flag.\nRe-colors messages that are already flagged."
      • removedInput schema / properties / flag_color / title
        Removed value: -"Flag Color"
      • addedInput schema / properties / mailbox / description
        Added value: +"Mailbox to search in (default: \"INBOX\")"
      • removedInput schema / properties / mailbox / title
        Removed value: -"Mailbox"
      • addedInput schema / properties / max_updates / description
        Added value: +"Maximum number of emails to update (safety limit, default: 10)"
      • removedInput schema / properties / max_updates / title
        Removed value: -"Max Updates"
      • addedInput schema / properties / message_ids / description
        Added value: +"Optional list of exact Mail message ids for precise targeting"
      • removedInput schema / properties / message_ids / title
        Removed value: -"Message Ids"
      • addedInput schema / properties / older_than_days / description
        Added value: +"Optional age filter - only update emails older than N days"
      • removedInput schema / properties / older_than_days / title
        Removed value: -"Older Than Days"
      • addedInput schema / properties / sender / description
        Added value: +"Optional sender to filter emails by"
      • removedInput schema / properties / sender / title
        Removed value: -"Sender"
      • addedInput schema / properties / subject_keyword / description
        Added value: +"Optional keyword to filter emails by subject"
      • removedInput schema / properties / subject_keyword / title
        Removed value: -"Subject Keyword"
      • addedInput schema / properties / subject_keywords / description
        Added value: +"Optional list of subject keywords; matches any keyword"
      • removedInput schema / properties / subject_keywords / title
        Removed value: -"Subject Keywords"
      • removedInput schema / title
        Removed value: -"update_email_statusArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"update_email_statusOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
  2. 3 tool updatesv3.1.8
    • Changedmove_email1 field changed
      • addedInput schema / properties / message_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Message Ids"
        +}
    • Changedsearch_emails2 fields changed
      • addedInput schema / properties / flag_color
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Flag Color"
        +}
      • addedInput schema / properties / flagged
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Flagged"
        +}
    • Changedupdate_email_status1 field changed
      • addedInput schema / properties / flag_color
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Flag Color"
        +}
  3. 6 tool updatesv3.1.4
    • Changedcompose_email1 field changed
      • addedInput schema / properties / from_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "From Address"
        +}
    • Changedcreate_rich_email_draft1 field changed
      • addedInput schema / properties / from_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "From Address"
        +}
    • Changedforward_email1 field changed
      • addedInput schema / properties / from_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "From Address"
        +}
    • Changedmanage_drafts1 field changed
      • addedInput schema / properties / from_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "From Address"
        +}
    • Changedreply_to_email1 field changed
      • addedInput schema / properties / from_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "From Address"
        +}
    • Addedsynchronize_account
  4. 1 tool updatev3.1.3
    • Addedlist_account_addresses
  5. 24 tool updatesv3.1.0
    • First observedcompose_email
    • First observedcreate_mailbox
    • First observedcreate_rich_email_draft
    • First observedexport_emails
    • First observedforward_email
    • First observedget_awaiting_reply
    • First observedget_email_thread
    • First observedget_inbox_overview
    • First observedget_mailbox_unread_counts
    • First observedget_needs_response
    • First observedget_statistics
    • First observedget_top_senders
    • First observedinbox_dashboard
    • First observedlist_accounts
    • First observedlist_email_attachments
    • First observedlist_inbox_emails
    • First observedlist_mailboxes
    • First observedmanage_drafts
    • First observedmanage_trash
    • First observedmove_email
    • First observedreply_to_email
    • First observedsave_email_attachment
    • First observedsearch_emails
    • First observedupdate_email_status

TDQS

B3.2/5.0

Scored across 27 tools

Disambiguation4/5

Most tools have clearly distinct purposes (e.g., search vs. thread vs. source, send vs. reply vs. forward), but several analytics/overview tools—get_inbox_overview, inbox_dashboard, get_statistics, get_top_senders—overlap in the 'summarize my inbox' space. The detailed descriptions help clarify differences, so ambiguity is limited to a few related tools.

Naming Consistency4/5

Names are consistently snake_case with action-first verbs (list_, get_, create_, manage_, move_, update_), which is highly readable. Minor deviations exist, such as the noun-only inbox_dashboard and the less predictable get_awaiting_reply/get_needs_response phrasing.

Tool Count2/5

27 tools is above the typical 3–15 range and crosses the 'too many' threshold; several analytics/insight tools could be consolidated into fewer endpoints. However, each tool does map to a distinct operation, so the set is heavy rather than chaotic.

Completeness4/5

The surface covers core email workflows well: listing accounts/mailboxes, searching/reading, sending/replying/forwarding, moving, flagging, trash, attachments, and sync. Gaps include no delete/rename mailbox operation and no explicit single-email rendered-body fetch, though raw source is available as a workaround.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to read, search, compose, and send emails by connecting to any IMAP/SMTP provider. It supports comprehensive mailbox management, including draft handling and message deletion, directly through natural language.
    10
    154 npm
    11
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to read, search, send, and manage email on macOS through programmatic access to Apple Mail.
    29
    MIT