Async FastMCP server for expense tracking with SQLite database, CRUD operations, aggregation tools, and resource endpoints. Cloud-safe implementation using temporary database path.
ExpenseTracker demonstrates good foundational quality with clear verb-based tool names, complete parameter schemas, and reasonable descriptions. All 5 tools are explicitly registered with input schemas containing types and descriptions. However, there are notable gaps: output schemas are not documented, error handling lacks recovery guidance, and descriptions could be more LLM-optimized per patterns. The server follows basic structuring principles but misses several agentic tool patterns for production-grade quality.
Add a new expense to the database with date, amount, category, optional subcategory and note.
Delete an expense by ID. Returns error if expense not found.
List all expenses within a date range, ordered by date descending.
Generate a summary of total expenses grouped by category within a date range, ordered by total descending.
Update an existing expense by ID with new date, amount, category, subcategory, and note. Returns error if expense not found.
Output schemas not documented. LLMs cannot infer what fields are returned or plan downstream operations. All 5 tools return structured data but lack explicit schema documentation in tool descriptions.
delete_expense lacks confirmation or dry-run protection. This is a destructive operation (RISK: DESTRUCTIVE) that should warn the LLM or require confirmation before executing. The description says 'Returns error if not found' but does not acknowledge irreversible consequences.
Error handling does not guide recovery. delete_expense and update_expense return JSON error objects but lack actionable next steps. 'Expense not found' should suggest alternatives like 'Try list_expenses() to find valid expense IDs' or return matching IDs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
list_expenses and summary_by_category lack pagination. No limit, offset, or pagination parameters provided. If the date range spans many months, results could be very large, wasting context window.
Descriptions are functional but not LLM-optimized. Most tool descriptions are 50-80 characters and answer 'what' but not 'when to use instead of similar tools' or key prerequisites. Baseline for A+ tools is 50-200 chars with explicit decision guidance.
No tool annotations present. The delete_expense tool should be marked with destructiveHint=true; add_expense and update_expense with destructiveHint could be true (modifies state). These annotations help LLMs reason about safety and retry logic.