Apple Mail MCP Server
Summary: An MCP server that gives AI assistants full read/write access to Apple Mail on macOS — search, read, organize, compose, and analyze email via natural language.
Read & search: list inbox emails, accounts, addresses, and mailboxes; unified search by subject, sender, body, dates, attachments, and flag status/color; view conversation threads.
Inbox insight: inbox overview dashboard, per-mailbox unread counts, unread/read ratio analytics, top senders, awaiting-reply and needs-response detection.
Compose & send: send new emails (plain or HTML), reply/reply-all, forward, attach files, and choose from-address per account.
Drafts: create, list, open, send, or delete drafts, plus rich HTML
.emldrafts that render reliably in Mail.Organize: create mailboxes (including nested paths), move/archive emails by filters or message IDs, mark read/unread, flag with colors, and manage trash (soft delete, permanent delete, empty).
Attachments: list attachments with sizes and save them to disk.
Export & reporting: export single emails or whole mailboxes to TXT/HTML and generate statistics reports.
Sync & UI: force IMAP/Exchange synchronization and render an interactive inbox dashboard UI (requires mcp-ui-server).
Safety controls: read-only mode blocks sending, dry-run previews for moves/deletes, conservative batch limits, and hardened path denylists for writes and attachments.
Provides comprehensive integration with Apple Mail, enabling AI assistants to read, search, organize, compose, and manage emails directly through natural language commands. Supports advanced email operations including threading, attachment handling, folder management, and email analytics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Apple Mail MCP Serverfind emails from John about the Alpha project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Apple Mail MCP Server
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+
Claude Code Plugin (Recommended)
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-mcpThen restart Claude Code.
Other Install Methods
claude mcp add apple-mail -- uvx mcp-apple-mailOr 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-mailInstalls 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-mailAdd -g to install the skill globally, or -a <agent> to target a specific agent.
Download the latest
apple-mail-mcp-vX.Y.Z.mcpbfrom ReleasesOpen Claude Desktop → Settings → Developer → MCP Servers → Install from file
Select the
.mcpbfile 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.shTools (22)
Reading & Search
Tool | Description |
| Dashboard with unread counts, folders, and recent emails |
| List emails with account/read-status filtering and optional content preview |
| Unread counts per mailbox or per-account summary |
| List all configured Mail accounts |
| Unified search — subject, sender, body text, dates, attachments, flag status/color, cross-account |
| Conversation thread view |
Organization
Tool | Description |
| Folder hierarchy with message counts |
| Create new mailboxes (supports nested paths) |
| Move/archive emails with filters (subject, sender, date, read status, dry-run) |
| Mark read/unread, flag/unflag (optional flag color) — by filters or message IDs |
| Soft delete, permanent delete, empty trash (with dry-run) |
Composition
Tool | Description |
| Send new emails (plain text or HTML body) |
| Reply or reply-all with optional HTML body |
| Forward with optional message, CC/BCC |
| Create, list, send, and delete drafts |
| Build a rich HTML |
Attachments
Tool | Description |
| List attachments with names and sizes |
| Save attachments to disk |
Smart Inbox
Tool | Description |
| Find sent emails that haven't received a reply |
| Identify emails that likely need your response |
| Analyse most frequent senders by count or domain |
Analytics & Export
Tool | Description |
| Email analytics (volume, top senders, read ratios) |
| Export single emails or mailboxes to TXT/HTML |
| 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 |
| 10 emails |
| 5 emails |
| 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/configand.envrcin any folderautostart, 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 MailRich HTML Drafts
Use create_rich_email_draft when you need a visually formatted email, newsletter, or leadership update.
It generates an unsent
.emlfile with multipart plain-text + HTML bodiesIt 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-managementRequirements
macOS with Apple Mail configured
Python 3.7+
fastmcp(+ optionalmcp-ui-serverfor 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 |
Mailbox not found | Use exact folder names; nested folders use |
Permission errors | Grant access in System Settings > Privacy & Security > Automation |
Rich draft shows raw HTML | Use |
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.mdContributing
Fork the repository
Create a feature branch (
git checkout -b feature/my-feature)Commit and push
Open a Pull Request
Releasing
Follow these steps when cutting a new release to keep all version strings in sync:
Bump
__version__inplugin/apple_mail_mcp/__init__.pyto the new version.Update
apple-mail-mcpb/manifest.json("version"field) to match.Update
pyproject.toml(version = ...under[project]) to match.Update both version fields in
server.json("version"and"packages"[0]["version"]) to match.Run
python3 scripts/check_versions.py— it must print OK before you proceed.Commit, tag, and push:
git tag vX.Y.Z && git push origin vX.Y.Z.Create a GitHub release from the tag.
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.
Links
Available Tools
27 toolscompose_emailCompose EmailC
Compose and send a new email from a specific account.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC recipients, comma-separated for multiple | |
| to | Yes | Recipient email address(es), comma-separated for multiple | |
| bcc | No | Optional BCC recipients, comma-separated for multiple | |
| body | Yes | Email body text (used as plain-text fallback when body_html is provided) | |
| mode | No | Delivery mode — "send" (send immediately, default), "draft" (save silently to Drafts), or "open" (open compose window for review before sending) | send |
| account | Yes | Account name to send from (e.g., "Gmail", "Work", "Personal") | |
| subject | Yes | Email subject line | |
| body_html | No | 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. | |
| attachments | No | Optional file paths to attach, comma-separated for multiple (e.g., "/path/to/file1.png,/path/to/file2.pdf") | |
| from_address | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the new mailbox. May contain "/" to create a nested path in one call (each segment is created if needed). | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| parent_mailbox | No | Optional existing parent folder for nesting. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC recipients, comma-separated for multiple | |
| to | No | Optional recipient email address(es), comma-separated for multiple | |
| bcc | No | Optional BCC recipients, comma-separated for multiple | |
| account | Yes | Account name to use for the sender identity (e.g., "Work", "Oracle") | |
| subject | No | Subject line for the draft (optional; defaults to empty) | |
| html_body | No | Optional HTML body. If omitted but text_body is provided, a basic HTML wrapper is generated. | |
| text_body | No | Optional plain-text body. If omitted but html_body is provided, a fallback plain body is generated. | |
| output_path | No | Optional path for the generated `.eml` file (same protected-location rules as save_email_attachment; defaults to ~/Library/Caches/apple-mail-mcp/rich-drafts) | |
| from_address | No | 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. | |
| open_in_mail | No | If True, open the generated `.eml` in Mail (default: True) | |
| save_as_draft | No | Not 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | Export scope: "single_email" (requires subject_keyword) or "entire_mailbox" | |
| format | No | Export format: "txt", "html" (default: "txt") | txt |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| mailbox | No | Mailbox to export from (default: "INBOX") | INBOX |
| max_emails | No | Maximum number of emails to export for entire_mailbox (default: 1000, safety cap) | |
| save_directory | No | Directory to save exports (default: "~/Desktop"). Protected locations (dot-folders in ~, LaunchAgents, ~/Library/Application Support, ...) are rejected. | ~/Desktop |
| subject_keyword | No | Keyword to find email (required for single_email) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC recipients, comma-separated for multiple | |
| to | Yes | Recipient email address(es), comma-separated for multiple | |
| bcc | No | Optional BCC recipients, comma-separated for multiple | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| mailbox | No | Mailbox to search in (default: "INBOX") | INBOX |
| message | No | Optional message to add before forwarded content | |
| from_address | No | 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. | |
| subject_keyword | Yes | Keyword to search for in email subjects |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name (e.g., "Gmail", "Work", "Personal") | |
| days_back | No | How many days back to check sent emails (default: 7, 0 = all time) | |
| max_results | No | Maximum results to return (default: 20) | |
| exclude_noreply | No | Skip emails sent to noreply/no-reply addresses (default: True) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name (e.g., ``"Gmail"``, ``"Work"``). | |
| mailbox | No | Mailbox 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_bytes | No | Byte cap on the returned payload (default 256 KB). | |
| message_id | No | RFC 822 Message-Id for exact match (preferred when known). | |
| headers_only | No | When ``True``, return only the header block. | |
| subject_keyword | No | Substring to match against subject (first hit). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| mailbox | No | Mailbox to search in (default: "INBOX", use "All" for all mailboxes) | INBOX |
| max_messages | No | Maximum 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_keyword | Yes | Keyword to identify the thread (e.g., "Re: Project Update") |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account name filter | |
| include_zero | No | Whether to include mailboxes with zero unread messages | |
| summary_only | No | If True, return only per-account inbox unread totals (flat dict of account name -> unread count) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name (e.g., "Gmail", "Work", "Personal") | |
| mailbox | No | Mailbox to scan (default: "INBOX") | INBOX |
| days_back | No | How many days back to look (default: 7) | |
| max_results | No | Maximum results to return (default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Analysis scope: "account_overview", "sender_stats", "mailbox_breakdown" | account_overview |
| sender | No | Specific sender for "sender_stats" scope | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| mailbox | No | Specific mailbox for "mailbox_breakdown" scope | |
| days_back | No | Number of days to analyze (default: 30, 0 = all time) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | Number of top senders to return (default: 10) | |
| account | Yes | Account name (e.g., "Gmail", "Work", "Personal") | |
| mailbox | No | Mailbox to analyse (default: "INBOX") | INBOX |
| days_back | No | How many days back to look (default: 30, 0 = all time) | |
| group_by_domain | No | Group results by domain instead of individual sender (default: False) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name (e.g., "Gmail", "Work", "Personal") | |
| max_results | No | Maximum number of matching emails to check (default: 1) | |
| subject_keyword | Yes | Keyword to search for in email subjects |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account name to filter (e.g., "Gmail", "Work"). If None, shows all accounts. | |
| max_emails | No | Maximum number of emails to return per account (0 = all) | |
| include_read | No | Whether to include read emails (default: True) | |
| output_format | No | "text" (default, human-readable) or "json" (structured list of email dicts) | text |
| include_content | No | Whether to include a content preview for each email (slower, default: False) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account name to filter (e.g., "Gmail", "Work"). If None, shows all accounts. | |
| include_counts | No | Whether to include message counts for each mailbox (default: True) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC recipients for create | |
| to | No | Recipient email(s) for create (comma-separated) | |
| bcc | No | Optional BCC recipients for create | |
| body | No | Email body (required for create) | |
| action | Yes | Action to perform: "list", "create", "send", "open", "delete". Use "open" to open a draft in a visible compose window for review before sending. | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| subject | No | Email subject (required for create) | |
| from_address | No | 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. | |
| draft_subject | No | Subject keyword to find draft (required for send/open/delete) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform: "move_to_trash", "delete_permanent", "empty_trash" | |
| sender | No | Optional sender to filter emails (not used for empty_trash) | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| dry_run | No | If True (default), preview what would be affected without acting | |
| mailbox | No | Source mailbox (default: "INBOX", not used for empty_trash or delete_permanent) | INBOX |
| max_deletes | No | Maximum number of emails to delete (safety limit, default: 5) | |
| apply_to_all | No | Must be True to allow operations without subject_keyword or sender filter | |
| confirm_empty | No | Must be True to execute "empty_trash" action (safety confirmation) | |
| older_than_days | No | Optional age filter - only affect emails older than N days | |
| subject_keyword | No | Optional keyword to filter emails (not used for empty_trash) | |
| subject_keywords | No | Optional list of subject keywords; matches any keyword |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| sender | No | Optional sender to filter emails by | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| dry_run | No | If True, preview what would be moved without acting (default: False) | |
| max_moves | No | Maximum number of emails to move (default: 50, safety limit) | |
| only_read | No | If True, only move emails that have been read (default: False) | |
| to_mailbox | Yes | Destination mailbox name. For nested mailboxes, use "/" separator (e.g., "Projects/Amplify Impact") | |
| message_ids | No | Optional list of exact Mail message ids for precise targeting. When set, all other filters are ignored. | |
| from_mailbox | No | Source mailbox name (default: "INBOX") | INBOX |
| older_than_days | No | Optional age filter - only move emails older than N days | |
| subject_keyword | No | Optional keyword to search for in email subjects | |
| subject_keywords | No | Optional list of keywords to match in subjects; matches any keyword |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC recipients, comma-separated for multiple | |
| bcc | No | Optional BCC recipients, comma-separated for multiple | |
| mode | No | Delivery mode — "send" (send immediately), "draft" (save silently), or "open" (open compose window for review). Overrides send parameter when set. | |
| send | No | If True (default), send immediately; if False, save as draft. Ignored if mode is set. | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| body_html | No | 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. | |
| reply_body | Yes | The body text of the reply | |
| attachments | No | Optional file paths to attach, comma-separated for multiple (e.g., "/path/to/file1.png,/path/to/file2.pdf") | |
| from_address | No | 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. | |
| reply_to_all | No | If True, reply to all recipients; if False, reply only to sender (default: False) | |
| subject_keyword | Yes | Keyword to search for in email subjects |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name (e.g., "Gmail", "Work", "Personal") | |
| mailbox | No | Mailbox to search in (default: "INBOX"). Use e.g. "Archive" for an already archived message; nested mailboxes use "/". | INBOX |
| save_path | Yes | Full 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_name | Yes | Name of the attachment to save | |
| subject_keyword | Yes | Keyword to search for in email subjects |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Result sort order: "date_desc" or "date_asc" | date_desc |
| limit | No | Maximum number of results to return per page | |
| offset | No | Number of matching results to skip before returning data | |
| sender | No | Optional sender email or name to filter by | |
| account | No | Account name to search in (e.g., "Gmail", "Work"). If None, searches ALL accounts (slower). | |
| date_to | No | Optional end date filter (format: "YYYY-MM-DD") | |
| flagged | No | Optional filter for flagged emails (True/False/None) | |
| mailbox | No | Mailbox to search (default: "INBOX", use "All" for all mailboxes, or specific folder name) | INBOX |
| body_text | No | Optional text to search for in email body content (case-insensitive). WARNING: body search is significantly slower as it reads each message body. | |
| date_from | No | Optional start date filter (format: "YYYY-MM-DD") | |
| flag_color | No | Optional filter for a specific flag color: "red", "orange", "yellow", "green", "blue", "purple", or "gray". Implies flagged=True. | |
| max_results | No | Backward-compatible alias for limit | |
| read_status | No | Filter by read status: "all", "read", "unread" (default: "all") | all |
| output_format | No | Output format: "text" or "json" (default: "text") | text |
| has_attachments | No | Optional filter for emails with attachments (True/False/None) | |
| include_content | No | Whether to include email content preview (slower) | |
| subject_keyword | No | Optional keyword to search in subject | |
| subject_keywords | No | Optional list of subject keywords; matches any keyword | |
| max_content_length | No | Maximum content length in characters when include_content=True (default: 500, 0 = unlimited) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Account name (e.g., "Gmail", "Work"). Omit to sync every configured account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform: "mark_read", "mark_unread", "flag", "unflag" | |
| sender | No | Optional sender to filter emails by | |
| account | Yes | Account name (e.g., "Gmail", "Work") | |
| mailbox | No | Mailbox to search in (default: "INBOX") | INBOX |
| flag_color | No | Optional 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_updates | No | Maximum number of emails to update (safety limit, default: 10) | |
| message_ids | No | Optional list of exact Mail message ids for precise targeting | |
| apply_to_all | No | Must be True to allow updates without any filter | |
| older_than_days | No | Optional age filter - only update emails older than N days | |
| subject_keyword | No | Optional keyword to filter emails by subject | |
| subject_keywords | No | Optional list of subject keywords; matches any keyword |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
27 tool updates
v3.2.1- Changed
compose_email25 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name to send from (e.g., \"Gmail\", \"Work\", \"Personal\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / attachments / descriptionAdded value: +"Optional file paths to attach, comma-separated for multiple (e.g., \"/path/to/file1.png,/path/to/file2.pdf\")" - removed
Input schema / properties / attachments / titleRemoved value: -"Attachments" - added
Input schema / properties / bcc / descriptionAdded value: +"Optional BCC recipients, comma-separated for multiple" - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / body / descriptionAdded value: +"Email body text (used as plain-text fallback when body_html is provided)" - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body_html / descriptionAdded 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." - removed
Input schema / properties / body_html / titleRemoved value: -"Body Html" - added
Input schema / properties / cc / descriptionAdded value: +"Optional CC recipients, comma-separated for multiple" - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / from_address / descriptionAdded 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." - removed
Input schema / properties / from_address / titleRemoved value: -"From Address" - added
Input schema / properties / mode / descriptionAdded value: +"Delivery mode — \"send\" (send immediately, default), \"draft\" (save silently to Drafts), or \"open\" (open compose window for review before sending)" - removed
Input schema / properties / mode / titleRemoved value: -"Mode" - added
Input schema / properties / subject / descriptionAdded value: +"Email subject line" - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / to / descriptionAdded value: +"Recipient email address(es), comma-separated for multiple" - removed
Input schema / properties / to / titleRemoved value: -"To" - removed
Input schema / titleRemoved value: -"compose_emailArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"compose_emailOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
create_mailbox11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / name / descriptionAdded value: +"Name for the new mailbox. May contain \"/\" to create a\n nested path in one call (each segment is created if needed)." - removed
Input schema / properties / name / titleRemoved value: -"Name" - added
Input schema / properties / parent_mailbox / descriptionAdded value: +"Optional existing parent folder for nesting." - removed
Input schema / properties / parent_mailbox / titleRemoved value: -"Parent Mailbox" - removed
Input schema / titleRemoved value: -"create_mailboxArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"create_mailboxOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
create_rich_email_draft27 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name to use for the sender identity (e.g., \"Work\", \"Oracle\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / bcc / descriptionAdded value: +"Optional BCC recipients, comma-separated for multiple" - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / cc / descriptionAdded value: +"Optional CC recipients, comma-separated for multiple" - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / from_address / descriptionAdded 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." - removed
Input schema / properties / from_address / titleRemoved value: -"From Address" - added
Input schema / properties / html_body / descriptionAdded value: +"Optional HTML body. If omitted but text_body is provided, a basic HTML wrapper is generated." - removed
Input schema / properties / html_body / titleRemoved value: -"Html Body" - added
Input schema / properties / open_in_mail / descriptionAdded value: +"If True, open the generated `.eml` in Mail (default: True)" - removed
Input schema / properties / open_in_mail / titleRemoved value: -"Open In Mail" - added
Input schema / properties / output_path / descriptionAdded 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)" - removed
Input schema / properties / output_path / titleRemoved value: -"Output Path" - added
Input schema / properties / save_as_draft / descriptionAdded 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." - removed
Input schema / properties / save_as_draft / titleRemoved value: -"Save As Draft" - added
Input schema / properties / subject / descriptionAdded value: +"Subject line for the draft (optional; defaults to empty)" - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / text_body / descriptionAdded value: +"Optional plain-text body. If omitted but html_body is provided, a fallback plain body is generated." - removed
Input schema / properties / text_body / titleRemoved value: -"Text Body" - added
Input schema / properties / to / descriptionAdded value: +"Optional recipient email address(es), comma-separated for multiple" - removed
Input schema / properties / to / titleRemoved value: -"To" - removed
Input schema / titleRemoved value: -"create_rich_email_draftArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"create_rich_email_draftOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
export_emails19 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / format / descriptionAdded value: +"Export format: \"txt\", \"html\" (default: \"txt\")" - removed
Input schema / properties / format / titleRemoved value: -"Format" - added
Input schema / properties / mailbox / descriptionAdded value: +"Mailbox to export from (default: \"INBOX\")" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / max_emails / descriptionAdded value: +"Maximum number of emails to export for entire_mailbox (default: 1000, safety cap)" - removed
Input schema / properties / max_emails / titleRemoved value: -"Max Emails" - added
Input schema / properties / save_directory / descriptionAdded value: +"Directory to save exports (default: \"~/Desktop\"). Protected\nlocations (dot-folders in ~, LaunchAgents, ~/Library/Application Support,\n...) are rejected." - removed
Input schema / properties / save_directory / titleRemoved value: -"Save Directory" - added
Input schema / properties / scope / descriptionAdded value: +"Export scope: \"single_email\" (requires subject_keyword) or \"entire_mailbox\"" - removed
Input schema / properties / scope / titleRemoved value: -"Scope" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Keyword to find email (required for single_email)" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - removed
Input schema / titleRemoved value: -"export_emailsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"export_emailsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
forward_email21 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / bcc / descriptionAdded value: +"Optional BCC recipients, comma-separated for multiple" - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / cc / descriptionAdded value: +"Optional CC recipients, comma-separated for multiple" - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / from_address / descriptionAdded 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." - removed
Input schema / properties / from_address / titleRemoved value: -"From Address" - added
Input schema / properties / mailbox / descriptionAdded value: +"Mailbox to search in (default: \"INBOX\")" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / message / descriptionAdded value: +"Optional message to add before forwarded content" - removed
Input schema / properties / message / titleRemoved value: -"Message" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Keyword to search for in email subjects" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - added
Input schema / properties / to / descriptionAdded value: +"Recipient email address(es), comma-separated for multiple" - removed
Input schema / properties / to / titleRemoved value: -"To" - removed
Input schema / titleRemoved value: -"forward_emailArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"forward_emailOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_awaiting_reply13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / days_back / descriptionAdded value: +"How many days back to check sent emails (default: 7, 0 = all time)" - removed
Input schema / properties / days_back / titleRemoved value: -"Days Back" - added
Input schema / properties / exclude_noreply / descriptionAdded value: +"Skip emails sent to noreply/no-reply addresses (default: True)" - removed
Input schema / properties / exclude_noreply / titleRemoved value: -"Exclude Noreply" - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum results to return (default: 20)" - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - removed
Input schema / titleRemoved value: -"get_awaiting_replyArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_awaiting_replyOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Added
get_email_source - Changed
get_email_thread13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / mailbox / descriptionAdded value: +"Mailbox to search in (default: \"INBOX\", use \"All\" for all mailboxes)" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / max_messages / descriptionAdded 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." - removed
Input schema / properties / max_messages / titleRemoved value: -"Max Messages" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Keyword to identify the thread (e.g., \"Re: Project Update\")" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - removed
Input schema / titleRemoved value: -"get_email_threadArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_email_threadOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_inbox_overview5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"get_inbox_overviewArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_inbox_overviewOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_mailbox_unread_counts12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Optional account name filter" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / include_zero / descriptionAdded value: +"Whether to include mailboxes with zero unread messages" - removed
Input schema / properties / include_zero / titleRemoved value: -"Include Zero" - added
Input schema / properties / summary_only / descriptionAdded value: +"If True, return only per-account inbox unread totals\n (flat dict of account name -> unread count)" - removed
Input schema / properties / summary_only / titleRemoved value: -"Summary Only" - removed
Input schema / titleRemoved value: -"get_mailbox_unread_countsArguments" - added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "additionalProperties": true, - "title": "Result", - "type": "object" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / titleRemoved value: -"get_mailbox_unread_countsOutput"
- Changed
get_needs_response13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / days_back / descriptionAdded value: +"How many days back to look (default: 7)" - removed
Input schema / properties / days_back / titleRemoved value: -"Days Back" - added
Input schema / properties / mailbox / descriptionAdded value: +"Mailbox to scan (default: \"INBOX\")" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum results to return (default: 20)" - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - removed
Input schema / titleRemoved value: -"get_needs_responseArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_needs_responseOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_statistics15 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / days_back / descriptionAdded value: +"Number of days to analyze (default: 30, 0 = all time)" - removed
Input schema / properties / days_back / titleRemoved value: -"Days Back" - added
Input schema / properties / mailbox / descriptionAdded value: +"Specific mailbox for \"mailbox_breakdown\" scope" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / scope / descriptionAdded value: +"Analysis scope: \"account_overview\", \"sender_stats\", \"mailbox_breakdown\"" - removed
Input schema / properties / scope / titleRemoved value: -"Scope" - added
Input schema / properties / sender / descriptionAdded value: +"Specific sender for \"sender_stats\" scope" - removed
Input schema / properties / sender / titleRemoved value: -"Sender" - removed
Input schema / titleRemoved value: -"get_statisticsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_statisticsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_top_senders15 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / days_back / descriptionAdded value: +"How many days back to look (default: 30, 0 = all time)" - removed
Input schema / properties / days_back / titleRemoved value: -"Days Back" - added
Input schema / properties / group_by_domain / descriptionAdded value: +"Group results by domain instead of individual sender (default: False)" - removed
Input schema / properties / group_by_domain / titleRemoved value: -"Group By Domain" - added
Input schema / properties / mailbox / descriptionAdded value: +"Mailbox to analyse (default: \"INBOX\")" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / top_n / descriptionAdded value: +"Number of top senders to return (default: 10)" - removed
Input schema / properties / top_n / titleRemoved value: -"Top N" - removed
Input schema / titleRemoved value: -"get_top_sendersArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_top_sendersOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
inbox_dashboard2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"inbox_dashboardArguments"
- Changed
list_account_addresses6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"list_account_addressesArguments" - added
Output schema / additionalPropertiesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / propertiesRemoved value: -{ - "result": { - "additionalProperties": { - "items": { - "type": "string" - }, - "type": "array" - }, - "title": "Result", - "type": "object" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / titleRemoved value: -"list_account_addressesOutput"
- Changed
list_accounts5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"list_accountsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_accountsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
list_email_attachments11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of matching emails to check (default: 1)" - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Keyword to search for in email subjects" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - removed
Input schema / titleRemoved value: -"list_email_attachmentsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_email_attachmentsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
list_inbox_emails15 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Optional account name to filter (e.g., \"Gmail\", \"Work\"). If None, shows all accounts." - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / include_content / descriptionAdded value: +"Whether to include a content preview for each email (slower, default: False)" - removed
Input schema / properties / include_content / titleRemoved value: -"Include Content" - added
Input schema / properties / include_read / descriptionAdded value: +"Whether to include read emails (default: True)" - removed
Input schema / properties / include_read / titleRemoved value: -"Include Read" - added
Input schema / properties / max_emails / descriptionAdded value: +"Maximum number of emails to return per account (0 = all)" - removed
Input schema / properties / max_emails / titleRemoved value: -"Max Emails" - added
Input schema / properties / output_format / descriptionAdded value: +"\"text\" (default, human-readable) or \"json\" (structured list of email dicts)" - removed
Input schema / properties / output_format / titleRemoved value: -"Output Format" - removed
Input schema / titleRemoved value: -"list_inbox_emailsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_inbox_emailsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
list_mailboxes9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Optional account name to filter (e.g., \"Gmail\", \"Work\"). If None, shows all accounts." - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / include_counts / descriptionAdded value: +"Whether to include message counts for each mailbox (default: True)" - removed
Input schema / properties / include_counts / titleRemoved value: -"Include Counts" - removed
Input schema / titleRemoved value: -"list_mailboxesArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_mailboxesOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
manage_drafts23 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / action / descriptionAdded value: +"Action to perform: \"list\", \"create\", \"send\", \"open\", \"delete\". Use \"open\" to open a draft in a visible compose window for review before sending." - removed
Input schema / properties / action / titleRemoved value: -"Action" - added
Input schema / properties / bcc / descriptionAdded value: +"Optional BCC recipients for create" - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / body / descriptionAdded value: +"Email body (required for create)" - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / cc / descriptionAdded value: +"Optional CC recipients for create" - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / draft_subject / descriptionAdded value: +"Subject keyword to find draft (required for send/open/delete)" - removed
Input schema / properties / draft_subject / titleRemoved value: -"Draft Subject" - added
Input schema / properties / from_address / descriptionAdded 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." - removed
Input schema / properties / from_address / titleRemoved value: -"From Address" - added
Input schema / properties / subject / descriptionAdded value: +"Email subject (required for create)" - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / to / descriptionAdded value: +"Recipient email(s) for create (comma-separated)" - removed
Input schema / properties / to / titleRemoved value: -"To" - removed
Input schema / titleRemoved value: -"manage_draftsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"manage_draftsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
manage_trash27 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / action / descriptionAdded value: +"Action to perform: \"move_to_trash\", \"delete_permanent\", \"empty_trash\"" - removed
Input schema / properties / action / titleRemoved value: -"Action" - added
Input schema / properties / apply_to_all / descriptionAdded value: +"Must be True to allow operations without subject_keyword or sender filter" - removed
Input schema / properties / apply_to_all / titleRemoved value: -"Apply To All" - added
Input schema / properties / confirm_empty / descriptionAdded value: +"Must be True to execute \"empty_trash\" action (safety confirmation)" - removed
Input schema / properties / confirm_empty / titleRemoved value: -"Confirm Empty" - added
Input schema / properties / dry_run / descriptionAdded value: +"If True (default), preview what would be affected without acting" - removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - added
Input schema / properties / mailbox / descriptionAdded value: +"Source mailbox (default: \"INBOX\", not used for empty_trash or delete_permanent)" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / max_deletes / descriptionAdded value: +"Maximum number of emails to delete (safety limit, default: 5)" - removed
Input schema / properties / max_deletes / titleRemoved value: -"Max Deletes" - added
Input schema / properties / older_than_days / descriptionAdded value: +"Optional age filter - only affect emails older than N days" - removed
Input schema / properties / older_than_days / titleRemoved value: -"Older Than Days" - added
Input schema / properties / sender / descriptionAdded value: +"Optional sender to filter emails (not used for empty_trash)" - removed
Input schema / properties / sender / titleRemoved value: -"Sender" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Optional keyword to filter emails (not used for empty_trash)" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - added
Input schema / properties / subject_keywords / descriptionAdded value: +"Optional list of subject keywords; matches any keyword" - removed
Input schema / properties / subject_keywords / titleRemoved value: -"Subject Keywords" - removed
Input schema / titleRemoved value: -"manage_trashArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"manage_trashOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
move_email27 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / dry_run / descriptionAdded value: +"If True, preview what would be moved without acting (default: False)" - removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - added
Input schema / properties / from_mailbox / descriptionAdded value: +"Source mailbox name (default: \"INBOX\")" - removed
Input schema / properties / from_mailbox / titleRemoved value: -"From Mailbox" - added
Input schema / properties / max_moves / descriptionAdded value: +"Maximum number of emails to move (default: 50, safety limit)" - removed
Input schema / properties / max_moves / titleRemoved value: -"Max Moves" - added
Input schema / properties / message_ids / descriptionAdded value: +"Optional list of exact Mail message ids for precise targeting. When set, all other filters are ignored." - removed
Input schema / properties / message_ids / titleRemoved value: -"Message Ids" - added
Input schema / properties / older_than_days / descriptionAdded value: +"Optional age filter - only move emails older than N days" - removed
Input schema / properties / older_than_days / titleRemoved value: -"Older Than Days" - added
Input schema / properties / only_read / descriptionAdded value: +"If True, only move emails that have been read (default: False)" - removed
Input schema / properties / only_read / titleRemoved value: -"Only Read" - added
Input schema / properties / sender / descriptionAdded value: +"Optional sender to filter emails by" - removed
Input schema / properties / sender / titleRemoved value: -"Sender" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Optional keyword to search for in email subjects" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - added
Input schema / properties / subject_keywords / descriptionAdded value: +"Optional list of keywords to match in subjects; matches any keyword" - removed
Input schema / properties / subject_keywords / titleRemoved value: -"Subject Keywords" - added
Input schema / properties / to_mailbox / descriptionAdded value: +"Destination mailbox name. For nested mailboxes, use \"/\" separator (e.g., \"Projects/Amplify Impact\")" - removed
Input schema / properties / to_mailbox / titleRemoved value: -"To Mailbox" - removed
Input schema / titleRemoved value: -"move_emailArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"move_emailOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
reply_to_email27 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / attachments / descriptionAdded value: +"Optional file paths to attach, comma-separated for multiple (e.g., \"/path/to/file1.png,/path/to/file2.pdf\")" - removed
Input schema / properties / attachments / titleRemoved value: -"Attachments" - added
Input schema / properties / bcc / descriptionAdded value: +"Optional BCC recipients, comma-separated for multiple" - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / body_html / descriptionAdded 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." - removed
Input schema / properties / body_html / titleRemoved value: -"Body Html" - added
Input schema / properties / cc / descriptionAdded value: +"Optional CC recipients, comma-separated for multiple" - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / from_address / descriptionAdded 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." - removed
Input schema / properties / from_address / titleRemoved value: -"From Address" - added
Input schema / properties / mode / descriptionAdded value: +"Delivery mode — \"send\" (send immediately), \"draft\" (save silently), or \"open\" (open compose window for review). Overrides send parameter when set." - removed
Input schema / properties / mode / titleRemoved value: -"Mode" - added
Input schema / properties / reply_body / descriptionAdded value: +"The body text of the reply" - removed
Input schema / properties / reply_body / titleRemoved value: -"Reply Body" - added
Input schema / properties / reply_to_all / descriptionAdded value: +"If True, reply to all recipients; if False, reply only to sender (default: False)" - removed
Input schema / properties / reply_to_all / titleRemoved value: -"Reply To All" - added
Input schema / properties / send / descriptionAdded value: +"If True (default), send immediately; if False, save as draft. Ignored if mode is set." - removed
Input schema / properties / send / titleRemoved value: -"Send" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Keyword to search for in email subjects" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - removed
Input schema / titleRemoved value: -"reply_to_emailArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"reply_to_emailOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
save_email_attachment14 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\", \"Personal\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / attachment_name / descriptionAdded value: +"Name of the attachment to save" - removed
Input schema / properties / attachment_name / titleRemoved value: -"Attachment Name" - added
Input schema / properties / mailboxAdded value: +{ + "default": "INBOX", + "description": "Mailbox to search in (default: \"INBOX\"). Use e.g. \"Archive\" for an already archived message; nested mailboxes use \"/\".", + "type": "string" +} - added
Input schema / properties / save_path / descriptionAdded 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." - removed
Input schema / properties / save_path / titleRemoved value: -"Save Path" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Keyword to search for in email subjects" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - removed
Input schema / titleRemoved value: -"save_email_attachmentArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"save_email_attachmentOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
search_emails43 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name to search in (e.g., \"Gmail\", \"Work\").\nIf None, searches ALL accounts (slower)." - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / body_text / descriptionAdded value: +"Optional text to search for in email body content (case-insensitive).\nWARNING: body search is significantly slower as it reads each message body." - removed
Input schema / properties / body_text / titleRemoved value: -"Body Text" - added
Input schema / properties / date_from / descriptionAdded value: +"Optional start date filter (format: \"YYYY-MM-DD\")" - removed
Input schema / properties / date_from / titleRemoved value: -"Date From" - added
Input schema / properties / date_to / descriptionAdded value: +"Optional end date filter (format: \"YYYY-MM-DD\")" - removed
Input schema / properties / date_to / titleRemoved value: -"Date To" - added
Input schema / properties / flag_color / descriptionAdded value: +"Optional filter for a specific flag color: \"red\", \"orange\",\n\"yellow\", \"green\", \"blue\", \"purple\", or \"gray\". Implies flagged=True." - removed
Input schema / properties / flag_color / titleRemoved value: -"Flag Color" - added
Input schema / properties / flagged / descriptionAdded value: +"Optional filter for flagged emails (True/False/None)" - removed
Input schema / properties / flagged / titleRemoved value: -"Flagged" - added
Input schema / properties / has_attachments / descriptionAdded value: +"Optional filter for emails with attachments (True/False/None)" - removed
Input schema / properties / has_attachments / titleRemoved value: -"Has Attachments" - added
Input schema / properties / include_content / descriptionAdded value: +"Whether to include email content preview (slower)" - removed
Input schema / properties / include_content / titleRemoved value: -"Include Content" - added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of results to return per page" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / mailbox / descriptionAdded value: +"Mailbox to search (default: \"INBOX\", use \"All\" for all mailboxes, or specific folder name)" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / max_content_length / descriptionAdded value: +"Maximum content length in characters when include_content=True (default: 500, 0 = unlimited)" - removed
Input schema / properties / max_content_length / titleRemoved value: -"Max Content Length" - added
Input schema / properties / max_results / descriptionAdded value: +"Backward-compatible alias for limit" - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - added
Input schema / properties / offset / descriptionAdded value: +"Number of matching results to skip before returning data" - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - added
Input schema / properties / output_format / descriptionAdded value: +"Output format: \"text\" or \"json\" (default: \"text\")" - removed
Input schema / properties / output_format / titleRemoved value: -"Output Format" - added
Input schema / properties / read_status / descriptionAdded value: +"Filter by read status: \"all\", \"read\", \"unread\" (default: \"all\")" - removed
Input schema / properties / read_status / titleRemoved value: -"Read Status" - added
Input schema / properties / sender / descriptionAdded value: +"Optional sender email or name to filter by" - removed
Input schema / properties / sender / titleRemoved value: -"Sender" - added
Input schema / properties / sort / descriptionAdded value: +"Result sort order: \"date_desc\" or \"date_asc\"" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Optional keyword to search in subject" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - added
Input schema / properties / subject_keywords / descriptionAdded value: +"Optional list of subject keywords; matches any keyword" - removed
Input schema / properties / subject_keywords / titleRemoved value: -"Subject Keywords" - removed
Input schema / titleRemoved value: -"search_emailsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"search_emailsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
synchronize_account7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\"). Omit to sync every\n configured account." - removed
Input schema / properties / account / titleRemoved value: -"Account" - removed
Input schema / titleRemoved value: -"synchronize_accountArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"synchronize_accountOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
update_email_status27 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / account / descriptionAdded value: +"Account name (e.g., \"Gmail\", \"Work\")" - removed
Input schema / properties / account / titleRemoved value: -"Account" - added
Input schema / properties / action / descriptionAdded value: +"Action to perform: \"mark_read\", \"mark_unread\", \"flag\", \"unflag\"" - removed
Input schema / properties / action / titleRemoved value: -"Action" - added
Input schema / properties / apply_to_all / descriptionAdded value: +"Must be True to allow updates without any filter" - removed
Input schema / properties / apply_to_all / titleRemoved value: -"Apply To All" - added
Input schema / properties / flag_color / descriptionAdded 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." - removed
Input schema / properties / flag_color / titleRemoved value: -"Flag Color" - added
Input schema / properties / mailbox / descriptionAdded value: +"Mailbox to search in (default: \"INBOX\")" - removed
Input schema / properties / mailbox / titleRemoved value: -"Mailbox" - added
Input schema / properties / max_updates / descriptionAdded value: +"Maximum number of emails to update (safety limit, default: 10)" - removed
Input schema / properties / max_updates / titleRemoved value: -"Max Updates" - added
Input schema / properties / message_ids / descriptionAdded value: +"Optional list of exact Mail message ids for precise targeting" - removed
Input schema / properties / message_ids / titleRemoved value: -"Message Ids" - added
Input schema / properties / older_than_days / descriptionAdded value: +"Optional age filter - only update emails older than N days" - removed
Input schema / properties / older_than_days / titleRemoved value: -"Older Than Days" - added
Input schema / properties / sender / descriptionAdded value: +"Optional sender to filter emails by" - removed
Input schema / properties / sender / titleRemoved value: -"Sender" - added
Input schema / properties / subject_keyword / descriptionAdded value: +"Optional keyword to filter emails by subject" - removed
Input schema / properties / subject_keyword / titleRemoved value: -"Subject Keyword" - added
Input schema / properties / subject_keywords / descriptionAdded value: +"Optional list of subject keywords; matches any keyword" - removed
Input schema / properties / subject_keywords / titleRemoved value: -"Subject Keywords" - removed
Input schema / titleRemoved value: -"update_email_statusArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"update_email_statusOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
3 tool updates
v3.1.8- Changed
move_email1 field changed- added
Input schema / properties / message_idsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Message Ids" +}
- Changed
search_emails2 fields changed- added
Input schema / properties / flag_colorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Flag Color" +} - added
Input schema / properties / flaggedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Flagged" +}
- Changed
update_email_status1 field changed- added
Input schema / properties / flag_colorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Flag Color" +}
6 tool updates
v3.1.4- Changed
compose_email1 field changed- added
Input schema / properties / from_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "From Address" +}
- Changed
create_rich_email_draft1 field changed- added
Input schema / properties / from_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "From Address" +}
- Changed
forward_email1 field changed- added
Input schema / properties / from_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "From Address" +}
- Changed
manage_drafts1 field changed- added
Input schema / properties / from_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "From Address" +}
- Changed
reply_to_email1 field changed- added
Input schema / properties / from_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "From Address" +}
- Added
synchronize_account
1 tool update
v3.1.3- Added
list_account_addresses
24 tool updates
v3.1.0- First observed
compose_email - First observed
create_mailbox - First observed
create_rich_email_draft - First observed
export_emails - First observed
forward_email - First observed
get_awaiting_reply - First observed
get_email_thread - First observed
get_inbox_overview - First observed
get_mailbox_unread_counts - First observed
get_needs_response - First observed
get_statistics - First observed
get_top_senders - First observed
inbox_dashboard - First observed
list_accounts - First observed
list_email_attachments - First observed
list_inbox_emails - First observed
list_mailboxes - First observed
manage_drafts - First observed
manage_trash - First observed
move_email - First observed
reply_to_email - First observed
save_email_attachment - First observed
search_emails - First observed
update_email_status
TDQS
Scored across 27 tools
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.
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.
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.
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
Related MCP Connectors
Email for AI agents: read, search and send from your Gmail, Outlook, Yahoo, iCloud or IMAP inbox.
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Your mailboxes in ChatGPT and Claude: Gmail, iCloud, Fastmail, any IMAP. Passwords stay yours.
Email inboxes and calendars for AI agents: send, receive, search, draft and schedule.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables 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.10154 npm11MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to read, send, search, and manage emails in Apple Mail on macOS.2571 PyPI106MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Gmail and Outlook inboxes through natural language, supporting email search, reading, and reply operations.-
- AlicenseAqualityBmaintenanceEnables AI assistants to read, search, send, and manage email on macOS through programmatic access to Apple Mail.29MIT