Local personal finance engine — domain tools only. No SQL, no Sheets, no unbounded ledger dumps.
Canhoto registers 14 tools with explicit schemas and descriptions. Naming follows verb_noun convention (statement_preview, parser_list, parser_scaffold, etc.). All tools have non-empty descriptions (10 - 200 chars, within baseline). Input schemas are present with typed parameters. However, parameter descriptions are minimal or absent in several tools (e.g., 'patches' in set_categories lacks detail on expected object structure), and output schemas are not documented. Error handling is implicit (delegated to service layer) with no visible recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Review_batch accepts optional cursor/limit but lacks pagination documentation. Parser tools lack dependency hints (e.g., 'parser_test must succeed before parser_enable'). Overall: solid foundation, but parameter documentation and output schemas need strengthening.
Return data-dir health report (no ledger rows).
Export month summary PDF with a built-in visual profile.
Archive, parse, and upsert one or more statement files.
Return aggregate month report (no transaction list).
Enable a parser only after a successful parser_test stamp.
List registered parsers and enable/test status.
Create a stub parser module and register it disabled.
Parameter descriptions missing or minimal. 'patches' in set_categories, 'code' in parser_write, and 'cursor' in review_batch lack detail on expected structure, format, or constraints. LLMs cannot infer object schemas from names alone.
Output schemas not documented. Tools return dict[str, Any] with no visible schema definition. Agents cannot plan downstream calls or extract required fields (e.g., does parser_list return parser_id, enabled status, last_test_date?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Run parser against a sample file and stamp last_test_* on config.
Overwrite a registered parser module (requires allow_parser_writes).
Return a capped, redacted pending-review batch for a month.
Apply deterministic categorization rules for a YYYY-MM month.
Apply classification patches (id + category fields).
Remember merchant_key → category for later rule runs.
Extract and truncate statement text for agent inspection (basename only).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Risk classifications exist (READ_ONLY, WRITE) but are not exposed to the MCP protocol. Agents cannot distinguish safe from destructive operations without reading descriptions.
Dependency hints missing. parser_enable requires a successful parser_test stamp, but this constraint is only documented in the server instructions, not in the tool description. Agents may call parser_enable without testing first.
Error handling not visible. Service layer delegates error responses, but no recovery guidance is documented. If parser_write fails due to allow_parser_writes=false, agents have no guidance on how to proceed.