MCP server for Yahoo Mail over IMAP (read, triage, drafts — no sending)
Strong foundation with 11 well-named tools, comprehensive descriptions (avg 150+ chars), and complete JSON Schema input definitions. All tools have clear verb-noun naming (list_, search_, read_, mark_, move_, create_, trash_, delete_). Descriptions explain WHAT, WHEN, and consequences (e.g., delete_emails warns IRREVERSIBLE). Parameters are typed and described. However, output schemas are not documented, LLMs cannot predict response structure for chaining. Error handling is minimal (no recovery guidance). Risk annotations present but incomplete (missing idempotentHint on read-only tools). No pagination guidance for search_emails despite returning arrays.
Compose an email and save it to the Drafts folder. NEVER sends anything — the user reviews and sends from the Yahoo Mail app/webmail.
Create a new folder (optionally under a parent folder).
PERMANENTLY delete messages (flag \Deleted + expunge). IRREVERSIBLE — intended for purging Trash or Bulk Mail. Requires confirm: true. For normal deletion, use trash_emails instead.
List all Yahoo Mail folders with their role when known (inbox, sent, drafts, trash, spam, archive). Note: the Yahoo spam folder is named "Bulk Mail".
Get message and unread counts per folder. Without arguments, covers every folder. Useful to scope an inbox-cleaning session.
Mark messages as read (adds the \Seen flag). Batch by UIDs within one folder.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields search_emails returns, what create_draft returns). This breaks tool chaining and forces agents to guess field names.
search_emails accepts limit (max 100) and offset but no pagination guidance in description. Large result sets risk context window exhaustion. Should document default limit=25 and advise pagination strategy.
Error handling lacks recovery guidance. No tool documents what to do on failure (e.g., 'authentication failed, check YAHOO_APP_PASSWORD' or 'folder not found, call list_folders to see available folders'). Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Mark messages as unread (removes the \Seen flag). Batch by UIDs within one folder.
Move messages to another folder (use toFolder: "archive" to archive, "spam" for Bulk Mail, or any folder path). Source UIDs become invalid after the move.
Read one email: key headers + text body. Attachments are listed (name, type, size) but not downloaded. If the message has no text part, set includeHtmlStripped to extract text from the HTML part.
Search/list emails in a folder, most recent first. Returns compact summaries with UIDs. UIDs are only valid within this folder and while uidValidity is unchanged — never reuse UIDs across folders.
Move messages to the Trash folder (recoverable for ~30 days). This is the safe way to delete — prefer it over delete_emails.
toolAnnotations present (readOnlyHint, destructiveHint) but incomplete. read_email, list_folders, mailbox_stats, search_emails should have readOnlyHint=true. mark_read/mark_unread should have idempotentHint=true (safe to retry).
delete_emails requires confirm=true but no guidance on how to obtain user confirmation. Pattern should document a confirmation-request flow (e.g., 'ask user before setting confirm=true').