A command-line email client and local web server for managing email accounts, syncing messages, searching threads, and composing replies with support for multiple email providers (IMAP, Gmail, directory-based).
MailCli exposes 13 HTTP endpoints with basic descriptions but significant structural gaps. Tool names lack action verbs (e.g., 'GET /api/session' instead of 'get_session'). Most parameters have type definitions and descriptions, but output schemas are not documented. Error handling exists (apiError struct with Code/Message/NextStep) but lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Critical operations like POST /api/operations/{id}/confirm lack confirmation/dry-run patterns. Parameter descriptions are present but generic (e.g., 'Account name to sync' without format/constraint details). No pagination documented for list endpoints. Composition is reasonable (separate sync, send/prepare, send/confirm) but tool names do not follow verb_noun convention.
Serve the static web UI for Mail Desk.
List all configured email accounts with redacted credentials.
Search and retrieve indexed email messages.
Retrieve a specific message by account and message ID with full content.
Retrieve all pending and completed email operations from the operation log.
Retrieve details of a specific operation by intent ID.
Tool names do not follow verb_noun convention. Names like 'GET /api/session' and 'POST /api/sync' are HTTP method + path, not action verbs. Should be 'get_session', 'list_accounts', 'sync_mailbox', 'search_messages', 'send_email_confirm'. LLMs rely on verb-first naming to infer intent before reading descriptions.
Output schemas are not documented. The apiEnvelope struct wraps responses (OK, Data, Error) but the Data field type is 'any', LLMs cannot infer what fields to expect from search_messages, get_thread, or list_accounts. Without documented output schemas, agents cannot plan downstream tool calls or extract required IDs for chaining.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2025-06-18+ | v2 |
Retrieve the current session information including version, config path, index path, and operations path.
Search and retrieve email thread summaries.
Retrieve all messages in a specific thread.
Initiate a local session by validating a token and setting a session cookie.
Confirm and execute a prepared email send operation.
Prepare a draft email for sending. Validates recipients and creates an operation log entry.
Synchronize email messages from a mailbox. Fetches new messages, parses them, and indexes them locally.
POST /api/operations/{id}/confirm (IRREVERSIBLE) lacks confirmation/dry-run pattern. Agents can accidentally send emails without a preview or confirmation step. Should support a dry-run mode or require explicit confirmation with a preview of the email content before execution.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). POST /api/sync and POST /api/send/prepare are write operations but lack destructiveHint. GET endpoints lack readOnlyHint. Agents cannot distinguish safe retries from irreversible operations without explicit annotations.
Parameter descriptions lack format/constraint details. 'since' and 'before' parameters in POST /api/sync accept date strings but do not specify format (ISO 8601? RFC 2822?). 'limit' in GET /api/messages has no min/max bounds. LLMs cannot validate inputs without explicit constraints.