Search and read configured mail accounts. Email changes are draft-only: save, update, and tag drafts for review in Thunderbird; never claim an email was sent.
Strong foundation with 10 well-named tools following verb_noun convention. All tools have descriptions (avg 180 chars, within 10-1024 baseline). Input schemas present for all tools with proper JSON Schema types. However, parameter descriptions are sparse, most lack detail on format, constraints, or dependencies. Output schemas are not documented. Error handling is minimal; no recovery guidance or actionable error messages visible. Tool composition is sound (each does one thing), but some parameter relationships undocumented (e.g., scope/folder interdependency in search_mail). Security posture is good (no secrets in params, keyring-based auth), but audit logging not evident.
Report each account's auth state: 'authenticated' (works), 'no-password' (needs 'mail login'), or 'unauthenticated' (wrong password or IMAP config). Pass an account to check one, or quick=true for a keyring-only check that skips connecting.
Permanently delete a draft identified by its drafts folder + uid. Messages outside the account's Drafts folder are refused. Pass the uidValidity from the draft's save response so a mailbox reindex cannot expunge the wrong message.
List the configured email accounts you can act on.
List IMAP folders for an account.
Read one attachment identified by the part handle returned by read_message. Returns an embedded MCP resource and refuses attachments larger than 10 MiB.
Read one full message by account + folder + uid (from search_mail), including BCC recipients, attachment metadata, and part handles.
Parameter descriptions lack format/constraint details. Most params (e.g., 'account', 'folder', 'query') have null or missing descriptions. LLMs cannot infer valid formats, ranges, or dependencies without explicit guidance.
Output schemas not documented. Tools return structured data (messages, attachments, drafts) but no schema is visible in tool definitions. LLMs cannot plan downstream calls or extract fields reliably.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2025-06-18+ | v2 |
Compose an email/reply and SAVE IT AS A DRAFT (does NOT send; the user reviews and sends from Thunderbird). The user's instructions are intent, not dictation: write an excellent, complete email in their voice, freely rewording and reordering their raw notes to fit the context; copy their exact wording only when they explicitly dictate it. An HTML alternative is generated from 'text' automatically; pass 'html' only for custom markup. For replies pass replySource with the folder + uid from read_message; the original conversation is quoted in the body and its threading headers are preserved automatically. replySource-derived headers take precedence over manual inReplyTo + references.
Search all configured accounts when account is omitted, or one account when it is passed. scope='all' searches each selected account's user mail; scope='folder' searches one exact folder and scope='subtree' includes descendants. Folder-based searches require an account and explicit scope. Global search prefers each server's all-mail mailbox; its fallback includes Inbox, Archive, Sent, and custom mail folders while excluding Drafts, Junk, Trash, and duplicate virtual folders. 'query' matches subject/body/from/to text; narrow with 'from'/'subject'/'since' (ISO date). Results are deduplicated, globally newest-first, limited across accounts, and include account+folder+uid+uidValidity handles for later operations. Cross-account failures are returned alongside partial hits.
Add one Thunderbird tag key or IMAP keyword to existing drafts. Pass each draft's complete account, folder, uid, and uidValidity handle from search_mail; the operation rejects handles from different accounts, folders, or mailbox generations before connecting, then checks that every UID exists and has the tag before reporting success. It refuses messages outside the account's Drafts folder. Built-in Thunderbird keys are $label1 through $label5; custom keywords appear by name only when Thunderbird has a matching custom tag.
Replace an existing draft identified by its drafts folder + uid. Compose the replacement to the same standard as save_draft: the user's instructions are intent, not dictation. Existing BCC recipients are preserved when bcc is omitted; pass an empty bcc string to remove them. The replacement is saved before the old draft is deleted. Messages outside the account's Drafts folder are refused. Pass the uidValidity from the draft's save response so a mailbox reindex cannot expunge the wrong message.
Undocumented parameter interdependencies. search_mail's 'scope' and 'folder' params have a conditional relationship (folder required for 'folder'/'subtree' scopes) but this is buried in the description, not stated in param descriptions.
No error recovery guidance. Tools lack descriptions of failure modes, retryability, or next steps. E.g., 'check_accounts' may fail for auth reasons but no guidance on how to recover.
save_draft and update_draft lack confirmation/dry-run pattern for irreversible composition. Agents could compose incorrect emails without a review step before saving.