MCP server for searching an OpenArchiver email archive (search, read emails, fetch attachments).
Four well-named, read-only tools with clear descriptions (avg 180 chars) and complete input schemas using Zod. All parameters are typed and described. Output schemas are documented in descriptions but not formally declared in JSON Schema. Error handling returns actionable messages via errorResult(). No tool annotations (readOnlyHint, etc.) despite all being read-only. Naming follows verb_noun pattern (search_archive, get_email, check_integrity, get_attachment). Parameter naming is consistent (id, path, keywords). Descriptions explain WHAT, WHEN, and dependencies well. Pagination support (page, limit) on search_archive. Attachment handling includes mode selection and size limits with clear defaults. No security issues detected, credentials injected via environment, not parameters.
Re-compute the SHA-256 hashes of an archived email and each of its attachments and compare them against the hashes stored at archival time. Use this to prove an archived message has not been altered or corrupted in storage. Returns a per-item pass/fail report.
Download an attachment by its `storagePath` (from get_email). mode 'inline' (default): text files are returned as text, images as image content, other binaries (PDF, Office, …) as base64. mode 'file': write the bytes to a server-managed temp file and return only its path — use this for large binaries to avoid huge base64 in the context. The returned path is only usable when this server runs on the same machine as the client (local stdio); the server chooses the path itself, so callers cannot point it at arbitrary files. Tip: for PDFs, the extracted text is also searchable and shown via search_archive/get_email.
Fetch a single archived email by id: metadata, full body text, and the list of attachments (each with a `storagePath` you can pass to `get_attachment`).
Full-text search across archived emails — matches subject, body and extracted attachment text. Returns compact hits, each with an `id`. Use `get_email` with that id to read the full message.
Output schemas not formally declared in JSON Schema. Descriptions document structure (e.g., 'returns compact hits, each with an id'), but no structured outputSchema field in tool registration.
Tool annotations missing. All four tools are read-only and should declare readOnlyHint: true to signal safety to agents and prevent unnecessary confirmation prompts.
check_integrity description lacks clarity on when to use it. 'Re-compute SHA-256 hashes' is technical but doesn't explain the user intent: 'Use this to verify an archived message has not been altered or corrupted in storage.' Current description is present but could better guide LLM selection.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
get_attachment mode parameter description includes implementation detail ('write the bytes to a server-managed temp file') that may confuse agents about when to use 'file' mode. Should emphasize: 'Use file mode for large binaries to avoid base64 bloat in context.'
search_archive limit parameter max is 50, but description says 'default 10' without stating the upper bound. LLMs may attempt to request 100+ results, hitting the constraint and requiring retry.