Local-first email MCP server for Gmail and QQ Mail with OAuth, Windows Credential Manager, IMAP search/read, attachment controls, and preview-confirmed sending.
18 tools with complete input schemas and descriptions. Naming follows verb_noun convention (imap_add_account, imap_search_emails). Descriptions are detailed (100-400 chars) and explain WHEN to use each tool. However, output schemas are not documented, LLMs cannot predict response structure. Parameters lack explicit constraints (enums, ranges, patterns). Error handling guidance is absent. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. Composition is sound: tools chain well (list_accounts → connect → search_emails). Security concern: passwords exposed as parameters (imap_add_account, imap_update_account), should use server-side injection.
Add a new IMAP account configuration
Add a domain to the custom spam list. Emails from this domain will be flagged as spam.
Check emails in a folder for spam. Combines sender-domain checks (known spam/disposable domains, suspicious patterns) with deterministic raw-header analysis: bulk-mailer X-Mailer/User-Agent signatures, Precedence: bulk, DMARC/SPF/DKIM failures in Authentication-Results, and List-Unsubscribe / Reply-To domains that do not match the sender. Header checks catch scam mail from fresh, unlisted domains that pass the domain check. Returns domain-based spam, a separate list of header-flagged mails, and domain statistics.
Connect to an IMAP account
Create a new IMAP folder/mailbox. Most servers also create any missing parent folders (e.g. creating "Archives/2026/2026-05" auto-creates "Archives" and "Archives/2026"). Returns success even if the folder already exists.
Output schemas not documented. LLMs cannot predict response structure or plan downstream tool calls. imap_search_emails, imap_list_folders, imap_preview_send_email lack documented return types.
Passwords exposed as tool parameters (imap_add_account.password, imap_update_account.password, imap_update_account.smtpPassword). Credentials must use server-side secret injection to prevent leakage into logs and traces.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. imap_delete_spam is DESTRUCTIVE, imap_search_emails is READ_ONLY, annotations guide agent safety.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Find and delete emails from known spam/disposable email domains.
Disconnect from an IMAP account
Get statistics about sender domains in a folder. Useful for identifying bulk senders or spam patterns.
Get status information about a folder
Count unread (unseen) emails per folder, plus a total. Use for "how many unread do I have?" overviews. Defaults to all folders; pass a folders list to limit scope and speed it up.
List all configured IMAP accounts
List all folders/mailboxes for an account (names, hierarchy delimiter, attributes, RFC 6154 special-use role). Use this first to discover exact folder names before searching, moving, or creating subfolders — folder naming varies by provider (e.g. "Archive" vs "[Gmail]/All Mail" vs "INBOX.Archive"). The specialUse field ("\\Sent", "\\Drafts", "\\Trash", "\\Junk", "\\Archive") identifies a folder's role independent of its localized name (e.g. "Gesendet" is the Sent folder when specialUse is "\\Sent").
Preview and freeze a threaded reply without sending it. Confirm the returned draftId with imap_confirm_send.
Preview and freeze a new email without sending it. Confirm the returned draftId with imap_confirm_send.
Remove an IMAP account configuration
Remove a domain from the custom spam list.
Note: on some servers a 'flagged' or starred message carries a custom keyword (e.g. an Open-Xchange color label or Apple's $MailFlagBit*) instead of, or in addition to, the \Flagged system flag. After any flagged search, inspect each result's customKeywords field before concluding a message is or isn't flagged — do not rely on the flagged filter alone. Search for emails matching criteria (sender, recipient, subject, body text, date range, read/flagged status). Use this to FIND messages when you know something about them but not their UID — e.g. "emails from amazon last week", "unread invoices". By default searches a single folder (INBOX). Set searchAllFolders=true to scan every mailbox at once — this catches messages filed away by rules (e.g. a receipt routed to a custom folder); Trash/Spam/Drafts are skipped unless you opt in. By default returns lightweight headers (uid, from, subject, date, and folder when searching across folders); set `includeBody=true` to also return the parsed body in one round-trip instead of paying the N+1 cost of calling imap_get_email per match. For the newest messages without criteria, prefer imap_get_latest_emails.
Update an existing IMAP account. Useful for fixing SMTP settings without removing and re-adding the account.
No error handling guidance. Tools lack recovery hints (e.g., 'If account not found, call imap_list_accounts first'). Errors should categorize as retryable, user-fixable, or fatal.
Parameters lack explicit constraints. imap_search_emails.limit, imap_delete_spam.limit, imap_check_spam.limit have no min/max bounds. imap_delete_spam.minConfidence uses enum but others use free-form strings.