Hubmail demonstrates solid tool design with consistent naming (verb_noun pattern), comprehensive parameter descriptions, and structured output schemas. All 9 tools have clear descriptions (avg ~150 chars) and input schemas with type definitions. Account resolution logic is well-documented. However, output schemas are inconsistently documented, some tools return structuredContent but lack formal outputSchema declarations in registration. Error handling provides user-facing guidance (e.g., 'No account named X') but lacks recovery hints for LLMs. No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification in metadata. Parameter descriptions are strong but could benefit from explicit format constraints (e.g., email format for 'to' param in draft_email).
Creates a Gmail label in a connected account. If a label with that name already exists, returns the existing one instead of erroring.
Creates a Gmail filter so future emails matching a search query are automatically labeled (e.g. "from:bytebytego.com" -> label "ByteByteGo"), optionally skipping the Inbox. Applies only to mail that arrives after the filter is created, not existing mail — use label_email or move_email_to_label for mail that already exists. The label must already exist — create it first with create_label.
Moves a single email to Trash by message id. This is recoverable (Gmail keeps trashed messages for 30 days), not a permanent delete.
Creates a draft email in a connected account. Does not send it — the user must review and send it from Gmail themselves.
Tags one or more emails with an existing label, by message id. The emails stay in Inbox — use move_email_to_label instead if they should be moved out of Inbox. The label must already exist — create it first with create_label.
Output schemas not formally declared in tool registration. Tools return structuredContent but lack explicit outputSchema in registerTool() calls, forcing LLMs to infer response structure from text content.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk stratification in metadata. Tools marked READ_ONLY, REVERSIBLE, WRITE should declare hints to guide LLM planning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2025-06-18+ | v2 |
Returns the aliases of Gmail accounts connected for this user. If more than one account is returned, ask the user which account they want to use before proceeding with any email operation.
Moves one or more emails out of Inbox into an existing label, by message id — tags them with the label and archives them (removes the INBOX label), like moving mail into a folder. The label must already exist — create it first with create_label. Use label_email instead if the emails should just be tagged and stay in Inbox.
Fetch the full body/content of a single email by message id.
Search Gmail using Gmail search syntax across one connected account.
Error responses lack recovery guidance for LLMs. Account resolution errors return user-facing text but do not suggest next steps (e.g., 'Try list_accounts() to see available options').
Parameter format constraints not explicitly stated. 'to' param in draft_email lacks email format validation hint; 'query' in search_emails lacks Gmail syntax documentation link.
No pagination support for search_emails despite max_results cap at 50. Large result sets could exhaust context; no next_cursor or offset mechanism documented.