Personal finance copilot for Claude Code. Exposes import preview, totals, budget variance, net worth, and tax summary as MCP tools for local .finance/ data access.
Finance-assistant has 12 tools with complete input schemas and descriptions. Naming follows verb_noun convention (import_preview, get_totals, commit_import, etc.). Descriptions are substantive (100-250 chars typical), explaining what each tool does and when to use it. However, output schemas are not documented, LLMs cannot see what fields to expect from responses. Error handling is minimal: tools return generic dicts with 'error' keys but lack recovery guidance or categorization. Parameter descriptions are present but sometimes lack constraints (e.g., account_id accepts any string; no enum of valid accounts). The commit_import tool implements a dry-run-first pattern (requires expected_to_import count), which is excellent for safety. Overall: solid foundation, but missing output documentation and error guidance that would push this to 75+.
Create an account (checking, savings, investment, credit_card, loan, mortgage).
Add one transaction (negative amount = spending). Category is guessed from the description (and past corrections) when omitted.
Record a stated account balance (from a statement) for reconciliation.
Money the ledger can't explain between stated balances, per account.
Commit an import. Run import_preview first and pass its `to_import` count as expected_to_import; a mismatch (file changed, different account) refuses to write and returns the fresh preview instead.
Planned vs. actual spending by category for a budget period.
Output schemas not documented. LLMs cannot see what fields responses contain (e.g., what does get_totals return? Is it {income: {}, expenses: {}} or {categories: [{name, total}]}?). This forces agents to guess structure and wastes tokens on trial-and-error parsing.
Error handling lacks recovery guidance. Tools return {error: 'message'} but do not categorize errors as retryable/user-fixable/fatal or suggest next steps. E.g., import_preview returns 'file_path must be inside project directory' but does not suggest how to resolve or what FINANCE_IMPORT_DIR should be.
Parameter constraints missing. account_id, currency, and locale parameters accept free-form strings with no enum or validation. LLMs may pass invalid values (e.g., currency='XYZ' or locale='fr') without feedback. Descriptions should list valid options or reference a discovery tool.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Realized capital gains (FIFO) for a year plus a simplified tax estimate for the profile's locale (de, uk, ie). Planning aid, not a filing figure.
Current net worth: total assets, total liabilities, and a cash/investments/credit-card/debt breakdown, converted to the profile's primary currency.
Locale-normalized tax summary for the active profile: gross, income_tax, payroll_tax, total_tax, net. Uses the profile's own locale/tax settings.
Income/expense totals grouped by category, converted to the account's currency (or the primary currency for account_id="all", the default). Omit year for the current year.
Preview a bank statement/CSV import WITHOUT committing it. Returns total_parsed, to_import, duplicates_removed, a preview of the first rows, and any multi_account_warning / rows_skipped / transfer_residual flags. Never writes to storage. file_path must be inside the project directory or FINANCE_IMPORT_DIR.
Parse the user's free-text answer for a setup step (basics, employment, housing, goals, debts, investments, accounts, tax, budget), save it, and return the parsed data plus what onboarding still needs.
Destructive operations lack confirmation. commit_import, add_account, add_transaction, and assert_balance modify state but have no dry-run or confirmation step (except commit_import's expected_to_import check). Agents could accidentally create duplicate accounts or transactions.
onboard_step parameter 'step' accepts free-form string but description lists only 9 valid values (basics, employment, housing, goals, debts, investments, accounts, tax, budget). Should be an enum to prevent invalid step names.