ExpenseTracker provides 6 tools with basic schemas and minimal descriptions. Tool names follow verb-noun convention (add_expense, list_expenses, etc.), which is correct. However, parameter descriptions are sparse or missing context. Output schemas are not documented anywhere in the code. Error handling is present but provides minimal guidance to LLMs. The `categories` tool is implemented as a resource, not a tool, which creates a composition mismatch. Input validation exists in code but is not documented in parameter descriptions (e.g., date format is never specified). No tool annotations (readOnlyHint, destructiveHint) are present despite clear operation semantics. Parameter names lack type suffixes (e.g., 'cid' should be 'expense_id'; 'amount' lacks min/max bounds). Descriptions are too brief (averaging ~45 chars, below the 194-char baseline for production tools) and lack WHEN/WHY context that helps LLMs select tools correctly.
Add an expense entry
Get available expense categories
Delete expenses based on any column criteria. like id,date,category,subcategory,amount,note,start_date,end_date
list all expenses within an inclusive date range
Summarize expenses by category within a date range
Update an expense.Only provided fields will be updated.
No output schemas documented for any tool. LLMs cannot plan multi-step chains when return types are unknown.
Parameter descriptions are too sparse (<20 chars on average). Lack actionable format guidance (date format, amount bounds, category enum).
Parameter names use opaque/abbreviated IDs ('cid' instead of 'expense_id'). Violates pattern:constrained-input, forces LLM to guess semantics.
Date format never specified in any tool. LLMs will guess (ISO 8601, MM/DD/YYYY, epoch, etc.) and cause failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 37 | - | v1 |
No tool annotations (destructiveHint, readOnlyHint, idempotentHint). Delete tool is irreversible but unlabeled, LLMs may not recognize risk.
Categories implemented as a RESOURCE, not a TOOL. Other tools accept 'category' params but cannot discover valid values via tool calls. Breaks composition chain.
No pagination in list_expenses. Unbounded results can exhaust context window. Missing limit/offset params and total_count in response.
Delete tool requires undocumented mutual exclusivity: date-range (start_date + end_date) vs individual filters. Schema does not enforce this; error handling catches it at runtime.
Error messages in code are helpful (e.g., 'Both start_date and end_date must be provided') but NOT documented in tool descriptions. LLMs cannot anticipate failures and plan recovery.
Category param has default empty string in add_expense/update, but empty string likely invalid. Should be documented or removed from defaults.