Provider-agnostic, read-only MCP server for reading mail over IMAP
Strong foundation with clear naming, comprehensive descriptions, and well-structured schemas. All 6 tools follow verb_noun convention (list_*, search_*, read_*, get_*). Descriptions are detailed (100-200 chars typical) and explain WHEN to use each tool. Input schemas are complete with types, descriptions, and sensible defaults. However, output schemas are not documented in the source code provided, and error handling guidance is minimal. The server is read-only (5 of 6 tools) with one write operation (get_attachment), which is properly scoped. No tool annotations (readOnlyHint/destructiveHint) visible in the provided code.
Download one attachment into the configured download directory. Returns the path it was saved to. Files are only ever written inside that one directory; the mailbox itself is not modified.
List configured mail accounts and whether each is authenticated. Call this first if another tool reports an authentication problem.
List the folders in a mailbox with message and unread counts. Each folder has a normalized `role` that is stable across providers, so you can ask for 'junk' without knowing the server calls it 'Junk Email'.
Browse messages in a folder, newest first. Returns summaries only (no bodies). Pass a returned `handle` to read_message to get the full text.
Read one message in full: headers, body text, and attachment metadata. HTML-only mail is converted to text. This does NOT mark the message as read.
Output schemas not documented in source code. LLMs cannot plan downstream operations without knowing what fields each tool returns (e.g., does list_messages return message_id, handle, sender, subject, date?).
No tool annotations visible (readOnlyHint, destructiveHint, idempotentHint). While 5 tools are read-only and 1 is write-only, explicit annotations would help clients understand safety properties at a glance.
Error handling guidance absent. No descriptions of what errors each tool can raise or how to recover (e.g., 'If authentication fails, call list_accounts to check credentials').
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | <=2025-11-25 | v2 |
Search a folder. All supplied criteria are combined with AND. Server-side IMAP search, so it works over the whole folder without downloading anything. Results are newest first.
Parameter 'account' is optional with default=null across 5 tools, but behavior when null is not documented. Does it auto-select if only one account exists? Fails? Requires explicit documentation.
Pagination parameters (limit, offset) present but no documentation of total count or next_cursor in response. LLMs cannot determine if more results exist without explicit pagination metadata.