An MCP server for tracking and managing expenses with database persistence
Three tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. Tool names follow verb_noun convention (add_expense, list_expenses, summarize). Descriptions exist but are minimal (10-50 chars, below the 194-char baseline). Input schemas present with types, but parameter descriptions are sparse and lack constraints. No output schema documentation. Error handling returns generic messages without recovery guidance. Missing idempotency hints for write operations.
Add a new expense entry to the database.
List expense entries within an inclusive date range.
Summarize expenses by category within an inclusive date range.
Output schemas not documented. LLMs cannot plan downstream calls or extract fields without knowing response structure. add_expense returns {status, id, message}; list_expenses returns array of {id, date, amount, category, subcategory, note}; summarize returns array of {category, total_amount, count}, none of this is declared in tool metadata.
Parameter descriptions lack format constraints and validation rules. 'date' parameter has no format specification (ISO 8601? YYYY-MM-DD?). 'amount' is unbounded (negative allowed?). 'category' and 'subcategory' have no enum or length limits. LLMs will pass invalid values without guidance.
Tool descriptions are too brief (10-50 chars vs 194-char baseline). 'Add a new expense entry to the database' lacks context on when to use it, what it returns, or side effects. 'List expense entries within an inclusive date range' does not explain date format or result limits. Descriptions should be 50-200 chars and answer WHAT, WHEN, and WHAT IT RETURNS.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
No error recovery guidance. add_expense returns {'status': 'error', 'message': 'Database error: ...'}, raw exception text. LLM cannot determine if error is retryable, user-fixable, or fatal. Missing actionable recovery hints like 'Check file permissions' or 'Retry with a different date format'.
No pagination support. list_expenses and summarize return all matching records without limit or offset. A date range spanning years could return thousands of rows, exhausting context window. Should accept limit and offset parameters and return total_count.