A FastMCP-based expense tracking server with SQLite backend for managing personal expenses with categories and date range filtering
ExpenseTracker provides three well-named tools with clear action verbs (add_, list_, summarize). All three tools have input schemas with typed parameters and descriptions. However, there are significant gaps in output schema documentation, parameter constraint specifications, and error handling guidance. Descriptions are present but generic. No tool annotations (readOnlyHint/destructiveHint) are present despite clear distinctions between write and read-only operations. Parameter descriptions lack detail on format expectations, ranges, and constraints. Error responses return generic messages without actionable recovery guidance.
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.
Missing output schema documentation. Tools return structured responses (dictionaries/lists) but no JSON Schema or description of expected output fields is provided. LLMs cannot plan downstream operations or validate results.
Parameter descriptions lack format specifications and constraints. 'date' parameters have no format (ISO 8601 vs other), 'amount' has no min/max bounds, 'category' has no enum or list of valid values.
Missing tool annotations. add_expense is clearly destructive (writes to database) and list_expenses/summarize are read-only, but no destructiveHint or readOnlyHint annotations are present. LLMs cannot reason about side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 52 | - | v1 |
Error messages provide no recovery guidance. 'Database error: <str(e)>' and 'Error listing expenses: <str(e)>' expose raw exceptions without actionable next steps. LLMs cannot self-correct.
No pagination support or result limits. list_expenses and summarize can return unlimited results, risking context window exhaustion. No limit, offset, or cursor parameters present.
Date parameters lack format specification. No indication whether dates should be ISO 8601 (2024-12-31), US format (12/31/2024), or other. LLMs will guess and send invalid formats.
Missing category validation. add_expense accepts any string for 'category', but a fixed set exists (visible in categories resource). Should use enum constraint or validate against allowed values.
Tool descriptions do not state when to use each tool. 'List expense entries' could be confused with 'Summarize expenses'. Should clarify: use list_expenses for detailed transaction history, summarize for aggregated views.
add_expense returns expense_id in response but list_expenses/summarize do not return IDs. If agent needs to reference a specific expense later, no ID is available to pass to a hypothetical update/delete tool.