MCP server for espresso shot analysis (Decent DE1 -> Decaid -> SQLite -> Claude)
Strong foundation with 12 well-named tools, complete input schemas, and detailed descriptions. All tools follow verb_noun naming (list_, get, update_, compare_, audit_, summarise). Descriptions average ~120 chars and explain WHAT, WHEN, and context. Parameters are typed and described. However, output schemas are not formally documented in the code, only inferred from docstrings. Error handling is minimal (no recovery guidance, no categorization). Tool annotations present (readOnlyHint) but incomplete (missing destructiveHint on write tools). No pagination metadata (total count, next_cursor) on list tools despite DEFAULT_LIMIT=10, MAX_LIMIT=50.
Check four rules across the archive: grind adjustments, bean age, missing ratings, dose outliers
How many shots per batch, sorted by count. Optionally filtered by bean
One bean with all its metadata and batch history
Compare up to four shots side by side: metrics, curve shape, and optionally raw curves
All beans in the archive, with batch counts and roast dates
Shots in the archive, newest first. Optionally filtered by bean, batch, or date range
Output schemas not formally documented. Tool docstrings describe return values narratively (e.g., 'Shots in the archive, newest first') but do not provide structured JSON Schema definitions. LLMs cannot reliably extract fields or plan downstream tool calls without explicit output schemas.
Write tools (update_shot, set_bean_batch, update_bean_batch) lack destructiveHint annotation and error recovery guidance. Descriptions say 'Only on explicit instruction' but do not explain what happens on failure, whether operations are idempotent, or how to undo mistakes.
List tools (list_shots, list_beans, batch_usage) accept limit but do not return pagination metadata (total_count, next_cursor, has_more). With DEFAULT_LIMIT=10 and MAX_LIMIT=50, agents cannot determine if results are truncated or plan multi-page retrieval.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
Assign a batch to a shot. Only on explicit instruction
One shot with all its metadata and metrics. Optionally includes the raw curve data
Server status: sync state, Decaid reachability, archive size, warnings
Summary statistics for shots in a date range or by bean/batch
Update batch metadata: roast date, freeze dates, notes, or quality score. Only on explicit instruction
Update shot metadata: enjoyment, notes, or workflow. Only on explicit instruction
Error handling is minimal. Tools do not return actionable error messages with recovery guidance. E.g., if a shot_id is invalid, the response should suggest 'Try list_shots() to find valid IDs' rather than a bare error code.
Parameter descriptions lack format/constraint details. E.g., 'from_date' and 'to_date' say 'ISO8601 start date' but do not specify timezone (UTC assumed?), whether time is required, or what happens if from_date > to_date. 'limit' lacks min/max bounds in descriptions (only in code).