MCP server for email operations with Gmail, Outlook, and Yahoo support
The server has basic tool structure with clear naming (send_email, get_unread_emails, create_draft_reply) following verb_noun convention. All three tools have input schemas with JSON Schema format and descriptions present. However, several critical gaps lower the score: (1) parameter descriptions are minimal, 'Recipient email address' and 'Email subject' lack context about format, constraints, or when to use the tool; (2) no documented output schemas, responses are returned as plain text strings, not structured objects; (3) missing error handling guidance, tools throw generic errors like 'Invalid parameters' with no recovery hints; (4) no parameter validation constraints (enums, min/max, patterns) despite tools accepting free-form strings; (5) the 'email_body' parameter in create_draft_reply is marked required but described as optional context, creating ambiguity. Tool descriptions are generic and do not explain selection criteria (e.g., when to use create_draft_reply vs send_email directly). The server implements basic type guards but provides no guidance to the LLM on expected formats or failure modes.
Save a draft reply to an email in Gmail. Generate the reply content in our conversation first, then use this tool to save it.
Fetch unread emails from inbox
Send an email via SMTP
Missing output schema documentation. Tools return plain text responses (src/index.ts line ~65: `{content: [{type: "text", text: result}]}`), not structured objects. LLMs cannot extract typed fields (email_id, status, timestamp) for downstream tool composition.
Parameter descriptions lack actionable constraints. 'Recipient email address' does not specify format (e.g., 'Valid RFC 5322 email'). 'limit' in get_unread_emails lacks min/max bounds. LLMs cannot self-correct invalid values without explicit constraints in descriptions.
Tool descriptions are generic and do not explain selection criteria or prerequisites. 'Send an email via SMTP' does not clarify when to use this vs create_draft_reply, or what happens if credentials are missing. Missing context forces LLMs to guess tool intent.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Error messages provide no recovery guidance. Generic 'Invalid parameters for send_email' (src/index.ts line ~52) does not hint at valid alternatives (e.g., 'Use get_unread_emails to find email IDs first'). Errors should be actionable per pattern:recovery-guide.
create_draft_reply has confusing parameter semantics. 'email_body' is marked required but described as 'for confirmation/context', implying it is optional. The parameter name suggests original email body, but description states agent should generate reply first, creating ambiguity about what LLM should pass.
No validation of 'limit' parameter bounds in get_unread_emails. Schema shows default=10 but no min/max. LLMs could pass 10000, causing timeout or memory overflow. Numeric parameters must declare ranges.
Credentials passed as environment variables (EMAIL_USER, EMAIL_APP_PASSWORD in src/config/email-config.ts) but no description in tool definitions clarifies that credentials are pre-configured server-side. LLMs may attempt to pass email credentials as tool parameters, creating security risk.
No documented permission model or scope declarations. Tools read/write email but no tool description specifies 'requires read:email' or 'requires write:email'. Audit trails are not evident from code review.