An MCP server for tracking and managing expenses with categorization and date-range summaries
Critical issues: duplicate tool names (add_expense, list_expenses appear twice with conflicting schemas), inconsistent implementations across main.py and test.py, missing parameter descriptions for most inputs, no output schema documentation, and no error handling guidance. The server has 5 tools but only 3 unique names. Parameter descriptions exist but are minimal (10-20 chars). No validation constraints, enums, or format specifications. The add_expense tools have conflicting signatures (one lacks 'description' field). list_expenses has two versions with completely different inputs (one requires date range, one takes no params). This inconsistency will confuse LLMs about which tool to call.
Add a new expense record with date, amount, category, optional subcategory and note
Add a new expense with date, amount, description, category, optional subcategory and note
List all expenses within a date range, ordered by date descending
List all expenses from the database
Summarize expenses by category within a date range, optionally filtered by a specific category
Duplicate tool names with conflicting schemas: add_expense appears twice (one with 'description' param, one without); list_expenses appears twice (one requires date range, one takes no params). LLMs cannot disambiguate which version to call.
Inconsistent implementations: main.py uses async/aiosqlite with WAL mode; test.py uses sync sqlite3. Database schemas differ (main.py lacks 'description' column; test.py includes it). This will cause runtime failures depending on which implementation runs.
Parameter descriptions are minimal (10-20 chars) and lack format/constraint guidance. 'Date of the expense' does not specify ISO 8601 format, range, or validation rules. 'Amount of the expense' lacks min/max bounds. LLMs will pass invalid values (negative amounts, malformed dates).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
No output schema documentation. Tools return dicts but LLMs cannot see field names, types, or structure. 'summarize' returns category/total_amount/count but this is undocumented. Agents cannot plan downstream calls or extract data reliably.
No error handling or recovery guidance. If a date is invalid, amount is negative, or category does not exist, tools will fail silently or return cryptic database errors. No actionable error messages to guide LLM retry or correction.