MCP server for safely managing Zoho ZeptoMail templates across multiple Agents
Strong tool definitions with consistent naming, comprehensive descriptions, and well-structured schemas. All 8 tools follow verb_noun pattern (list_, get_, create_, update_, delete_, find_, export_). Descriptions are detailed (100-250 chars) and include prerequisites and safety guidance. Input schemas use Zod with proper types, constraints, and descriptions. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present on all tools. Key strength: safety-first design with confirmation gates and optimistic locking on write operations. Minor gaps: output schemas not formally documented in code, error handling relies on generic toolError wrapper without recovery guidance.
Create a template in one explicit Agent. Requires agentKey plus expectedAgentName from a fresh zeptomail_list_agents call, server writes enabled, and confirm=true.
Delete a template from one explicit Agent. Requires expectedAgentName and expectedModifiedTime from fresh reads so a stale or wrong-Agent delete is rejected. Requires writes enabled and confirm=true.
Fetch every full template (HTML body, text body, subject, alias, attachments metadata) from one explicit Agent and return them as a single JSON dump. Read-only. Use when the caller wants to back up an Agent templates to local files; the caller writes the files itself — this tool returns the data, it does not write to disk.
Search template name, alias and subject. Omit agentKey to search across every accessible Agent; provide agentKey to restrict the search to one Agent. Results always include the owning Agent.
Fetch one complete template from one explicit Agent by exact template key. Always call this before updating or deleting.
Output schemas not formally documented. While responses are structured JSON, the tool definitions do not declare expected return fields (e.g., agent object structure, template object structure, pagination metadata). LLMs cannot plan downstream calls without knowing what fields to extract.
Error handling lacks recovery guidance. toolError() returns raw API errors or stack traces without actionable next steps. E.g., 'Agent not found' should suggest 'Call zeptomail_list_agents to see available agents.' Current implementation gives LLM no path forward.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | <=2025-11-25 | v2 |
List accessible Agents in the ZeptoMail account. Returns each Agent name and exact mailagent_key (Agent alias). Always use the returned key for template tools; do not guess Agent identifiers.
List templates in one explicit ZeptoMail Agent. Use zeptomail_list_agents first and pass the exact returned mailagent_key.
Partially update a template in one explicit Agent. Requires expectedAgentName and expectedModifiedTime from fresh reads so a stale or wrong-Agent edit is rejected. Requires writes enabled and confirm=true.
Confirmation gates (confirm=true) on write operations are good, but error messages when confirm=false are generic. Should explicitly state what the agent is about to do (e.g., 'This will DELETE template "Welcome Email" from Agent "Sales". Set confirm=true to proceed.').
Pagination on list_templates uses offset/limit but does not return total count or next_cursor. LLMs cannot determine if more results exist or how to fetch them efficiently. Should return {templates: [...], total: N, hasMore: bool}.
agentKey parameter description warns 'Never guess this value' but does not explain what happens if an invalid key is passed. Should state: 'If the key is invalid or inaccessible, the tool returns a 404 error. Call zeptomail_list_agents to retrieve valid keys.'