MCP server for ordering coffee from Calven catering suppliers
Server has well-structured tool definitions with consistent naming (verb_noun pattern), comprehensive parameter descriptions, and proper Zod schema validation. All 7 tools are explicitly registered with descriptions and input schemas. However, output schemas are not documented, LLMs cannot predict response structure. Error handling exists but lacks recovery guidance. Parameter descriptions are solid (avg 60+ chars) but some lack format constraints (e.g., ISO-8601 timestamps, enum values for status filters). No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Missing pagination guidance for list tools.
Cancel an existing Calven order by orderId.
Fetch menu items for a Calven catering supplier.
List the current user's orders for a Calven supplier.
List orderable Calven catering suppliers available to the current user.
Place a Calven catering order. The server mirrors the live webview request shape and blocks delivery times that violate supplier wait-time or opening-hour rules.
Validate and normalize a Calven catering order without placing it. Returns the exact payload shape used by the external Calven client.
Output schemas not documented. LLMs cannot predict response structure for any tool. Responses are returned via okResult() wrapper but structure is opaque to the agent.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. place_order is WRITE, cancel_order is REVERSIBLE, these should be annotated to guide agent planning.
List tools (list_suppliers, list_my_orders, get_menu) lack pagination parameters (limit, offset, cursor). No guidance on result limits or how to handle large datasets.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2025-06-18+ | v2 |
Validate the local Calven session config and show the configured user defaults.
Parameter 'status' in list_my_orders lacks enum constraint. Description says 'e.g. ordered or cancelled' but does not enforce valid values. LLM may pass invalid statuses.
Error handling returns errorResult(error) without recovery guidance. LLM receives raw error but no hint on what to do next (retry, lookup, ask user).