An MCP server for managing email sending, recipients, groups, templates, and events with SMTP integration
rmcp-mailer demonstrates solid foundational quality with 29 well-named, verb-prefixed tools organized into logical domains (recipients, groups, templates, email records, events). All tools have descriptions and visible input schemas with typed parameters. However, the server exhibits moderate gaps: (1) descriptions are functional but mostly generic, averaging ~60-80 chars when the baseline suggests 194 chars and optimal 50-200 for LLM reasoning; (2) output schemas are not documented, we cannot verify what fields response objects contain, breaking the chaining principle; (3) error handling is absent from the visible code, no recovery guidance, categorization, or validation error details visible; (4) idempotency and atomic semantics are not declared, creating uncertainty for agent retry logic; (5) some parameter relationships are undocumented (e.g., list_email_records_by_criteria requires 'at least one filter' per description but no mutual exclusion or validation is visible); (6) tool annotations (readOnlyHint, destructiveHint, idempotentHint) are not present in the schema despite the framework supporting them. Risk classification is visible in the assessment but not encoded into the tools themselves. Database-heavy workload is appropriate for the domain, but without response schema documentation and error guidance, downstream LLM reasoning is impaired.
Create a new email history record
Create a new event
Add a recipient as an attendee to an event
Associate a recipient with an email history record
Add a recipient to a group
Find a specific event by ID
Find a group by its name
Output schemas not documented. No visible specification of response object structure (fields, types, nested objects) for any of the 29 tools. LLMs cannot plan downstream tool calls or extract specific fields from responses without this information.
No error handling guidance visible. Code does not show error response schemas, categorization (retryable vs user-fixable vs fatal), recovery hints, or validation error details. Agents cannot self-correct on invalid input.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 26 | - | v1 |
Find a specific recipient by email address
Find recipients by group ID
Find a template by name
List email records filtered by time range and/or recipient ID. At least one filter must be provided
List all attendees for a specific event
List events within a specified time range
List all groups from the database
List all active recipients from the database
List all recipients in a specific group
List all email templates
Create a new group with the specified name
Create a new recipient with name and email
Create a new email template
Remove an event by ID
Remove a group by ID
Remove (deactivate) a recipient by ID
Remove a recipient from a group
Remove a template by ID
Send an email to specified recipients
Update a group's name by ID
Update a recipient's name and email by ID
Update a template by ID
Tool annotations missing. None of the 29 tools declare readOnlyHint, destructiveHint, or idempotentHint in their input schemas, despite rmcp 0.12.0 supporting them. Risk classification is external metadata, not integrated into tool definitions.
Descriptions are generic and brief (avg ~65-70 chars). Baseline suggests 194 chars and optimal 50-200 for LLM reasoning. Most descriptions state WHAT without WHEN or WHY. Examples: 'List all active recipients from the database' lacks context on when to call vs find_recipient_by_email; 'Update a recipient's name and email by ID' does not explain dependencies or side effects.
Undocumented parameter relationships. list_email_records_by_criteria description states 'At least one filter must be provided' but no mutual-exclusion constraint or validation is visible in schema. LLMs may call with both empty or both filled, causing ambiguity.
No idempotency or atomic semantics declared. Agents expect retryable operations to be safe on repeated calls. No tool documents whether calling new_recipient twice with the same input creates one or two records, critical for agent error recovery.
Irreversible operations lack confirmation step. send_email (Risk: IRREVERSIBLE) and remove_* tools have no dry-run or confirmation capability. Agents cannot preview before executing irreversible actions.
Field naming consistency not verified. If find_recipient_by_email returns recipient_id, then update_recipient should accept recipient_id, not recipient.id or other variations. Response schema documentation would clarify this.
No pagination guidance for list tools. list_recipients, list_groups, list_templates, list_events, list_email_records_by_criteria, list_event_attendees lack page, offset, limit, or cursor parameters and do not document result count caps. Large result sets will blow context windows.
Optional parameters not clearly marked in schema. 'format_string' in new_template, 'description' in add_event, 'reply_to' and 'from' in send_email should visibly indicate optional status (not required: true vs required: false, or 'Optional' in description).