Fast local MCP server for Apple Mail: search, read, triage, verified send. Works with Claude, Cursor, VS Code, or any MCP client.
This server implements 21 tools with reasonable verb-noun naming and mostly complete schemas. Descriptions are present and generally adequate (median ~100-150 chars), but lack depth in explaining WHEN to use tools and dependencies between them. Parameter descriptions are sparse, many lack detail about constraints, formats, and valid ranges. Error handling descriptions are minimal. Output schemas are not documented in the definitions; LLMs must infer structure from returned data. The tool set is well-composed (search, get, batch, thread, send, draft, reply, triage, mailbox ops, scheduling) with good separation of concerns. However, several tools lack actionable descriptions: 'triage_plan' and 'triage_plan_delete' don't explain the plan lifecycle; 'doctor' and 'audit' lack context about when to invoke them; 'cancel_scheduled' doesn't explain idempotency or failure modes. Parameter descriptions are often single words (e.g., 'Search query', 'Email ID', 'Thread ID') without format guidance or constraints. No enum constraints on multi-valued fields (e.g., 'state' in list_scheduled, 'action' in triage_plan). The code shows tool registration via fastmcp, but explicit input schemas are not fully visible in the provided excerpt, they appear to be inferred from function signatures.
Query audit log of email operations
Cancel a scheduled email before it is sent
Create a draft email in Apple Mail
Run diagnostic checks on mail configuration, permissions, transports, and dispatcher
Retrieve an email attachment by ID and filename
Retrieve a single email by ID
Retrieve multiple emails in a single batch request
Retrieve an email thread by thread ID
Parameter descriptions lack actionable constraints and formats. Examples: 'Email ID' (no format), 'Schedule state' in list_scheduled (no enum of valid values: pending, sending, sent, failed, cancelled), 'Action type' in triage_plan (no list of valid actions), 'Attachment filename' (no guidance on relative vs absolute paths). LLMs cannot infer constraints from single-word descriptions and will produce invalid inputs.
Tool descriptions do not explain WHEN to use the tool or its relationship to other tools. Example: 'triage_plan' creates a plan, 'triage_plan_delete' deletes it, 'triage_apply' executes it, but descriptions don't explain this three-step lifecycle. 'doctor' is described as 'Run diagnostic checks' without explaining when to call it (e.g., before sending mail, to debug permission issues). LLMs cannot reason about tool sequencing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 51 | 2026-07-28+ | v2 |
List all mailboxes in Apple Mail
List recent emails
List scheduled emails waiting to be sent
Create a new mailbox in Apple Mail
Delete a mailbox from Apple Mail
Trigger Mail.app to check for new mail
Reply to an email
Schedule an email to be sent at a specific time
Search emails in Apple Mail
Send an email via Apple Mail's delivery system
Execute a previously created triage plan
Create a plan to triage emails (move, mark, delete)
Delete a triage plan before execution
Output schemas are not documented. Tools like 'search_emails', 'get_thread', 'list_mailboxes', 'audit', and 'doctor' return complex structured data, but the tool definitions do not describe what fields the LLM should expect. LLMs must infer structure from returned data, risking misinterpretation and wasted context on parsing.
Destructive and irreversible operations (send_email, reply_email, triage_apply, mailbox_delete) lack confirmation/dry-run patterns. Descriptions do not warn that these actions are irreversible. No indication of whether agents should confirm with users before executing. Agents may send emails or delete mailboxes without explicit user consent.
Error handling descriptions are absent. Tools lack guidance on retryability, user-fixable errors, or recovery steps. Example: if 'send_email' fails (invalid recipient, missing attachment file), the tool description does not say how the agent should recover. No enum of possible errors or suggested next steps.
'doctor' is a generic/vague name. Should be 'check_mail_health', 'diagnose_mail_config', or 'validate_permissions'. Current name forces LLM to read description to understand purpose.
Pagination not documented. Tools returning lists (search_emails, get_thread messages, list_mailboxes, list_recent, list_scheduled, audit) may return large results. Descriptions do not mention whether pagination is supported, what limit defaults are, or how to fetch next page.