Personal Finance MCP Server — double-entry bookkeeping over Postgres. Manages accounts, journal entries, transactions, and budgets with a complete double-entry accounting system.
Finance MCP demonstrates solid definition quality with comprehensive tool coverage (22 tools), well-structured schemas using FastMCP/Pydantic, and detailed descriptions that guide LLM usage. All tools have explicit input schemas with type definitions and constraints. However, several gaps prevent a higher score: (1) Output schemas are not formally documented in the tool definitions, descriptions mention what's returned but actual response structures are inferred from implementation; (2) Parameter descriptions, while present, could be more prescriptive about constraints and error conditions; (3) Error handling descriptions are generic and don't guide recovery strategies; (4) Some tools combine conceptual concerns that could be split (e.g., finance_record_transaction conflates simple transfers with the full journal entry abstraction). Naming is consistently clear and follows verb_noun patterns (create, list, get, update, delete). All 22 tools have non-empty descriptions ranging from 89 - 1544 characters, within the 10 - 1024 production baseline. Parameter annotations are present and descriptive.
Generate a budget-vs-actual comparison for a given month. Shows budgeted amount, actual spending (from posted journal entries), variance, and percentage used for each budgeted account.
Learn how to set and monitor budgets. **What is a Budget?** A monthly spending limit for a category (usually an expense account). Example: "I want to spend no more than $300/month on groceries." **How to Use Budgets**: 1. Set a budget: `finance_set_budget` with account, year, month, amount 2. Record expenses normally via transactions or journal entries 3. Compare actual vs budget: `finance_budget_vs_actual` for any month **Budget vs Actual Report**: - **Budgeted**: The limit you set - **Actual**: Money actually spent (from posted entries) - **Variance**: Budgeted - Actual (positive = under budget) - **% Used**: (Actual / Budgeted) * 100 **Examples**: - Budget $300/month for Groceries → Actual spending: $280 → Variance: +$20 (under budget — good!) → % Used: 93% - Budget $500/month for Entertainment → Actual spending: $650 → Variance: -$150 (over budget — caution!) → % Used: 130% **Tips**: - Only budgeted accounts appear in the budget-vs-actual report - Budgets are typically set for expense accounts - You can set budgets retroactively (e.g., analyze past months) - Review monthly to adjust future budgets
Create a new account to track money flow. **WHEN TO USE**: Before recording any transactions, set up your accounts. **ACCOUNT TYPES**: - asset: Money you own (Checking, Savings, Cash, Credit Card) - expense: Money you spend (Groceries, Gas, Rent, Entertainment) - income: Money you earn (Salary, Freelance, Bonus) - liability: Money you owe (Credit Card, Loan) - equity: Starting balance / net worth **EXAMPLES**: - "Create a Checking account (asset) to track my bank account" - "Create a Groceries account (expense) to track grocery spending" - "Create a Salary account (income) to track paychecks"
Output schemas not formally documented. Tool descriptions mention return values (e.g., 'Shows budgeted amount, actual spending...') but actual response field definitions are not visible in the provided schema, they are inferred from implementation details only.
Generic list descriptions lack operational guidance. Tools like finance_list_accounts, finance_list_budgets use minimal descriptions ('List all accounts...', 'List all budgets...') without explaining discovery purpose, when to call, or what filters are useful. Should include: 'Call this first to discover available accounts before creating transactions' or 'Use to find budget IDs needed by budget_vs_actual.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Create a new journal entry with balanced debit and credit lines. A journal entry is the core of double-entry bookkeeping: every entry must have total debits = total credits. Optionally post (finalize) immediately.
Delete a transaction and void its associated journal entry. This preserves the audit trail by creating a reversing entry instead of permanently erasing the record.
Retrieve details for a single account by ID.
Check how much money is in an account. **WHEN TO USE**: After recording transactions, check balances to verify. **INTERPRETATION**: - Asset (Checking): Higher balance = more money in the account - Expense (Groceries): Higher balance = more money spent on groceries - Income (Salary): Higher balance = more money earned **EXAMPLES**: - "What's my Checking account balance?" → Shows money available - "How much have I spent on groceries?" → Shows balance in Groceries account
Retrieve the budget for a specific account, year, and month.
Retrieve a single journal entry with all its debit and credit lines.
Get started with the Finance MCP server. **Quick Start (3 steps)**: 1. Create accounts (chart of accounts setup) - Asset: Checking, Savings, Cash - Expense: Groceries, Gas, Utilities - Income: Salary - Optionally: Liability (Credit Card), Equity (Opening Balance) 2. Record transactions - Each transaction debits one account and credits another - Example: "Spent $50 on groceries" = Debit Groceries Expense, Credit Checking 3. Check balances and set budgets - Review account balances - Set monthly budgets - Run budget-vs-actual reports **Key Concepts**: - **Double-Entry**: Every transaction affects two accounts - **Balance**: Debits = Credits (enforced automatically) - **Audit Trail**: All changes are tracked; nothing is deleted (reversals only) - **Accounts**: Chart of accounts is your financial taxonomy
Retrieve a single transaction by ID.
Learn how to record journal entries (the core of accounting). **A Journal Entry is a balanced set of debit and credit lines.** **Key Rules**: 1. Total debits MUST equal total credits 2. Every entry must have at least 2 lines (one debit + one credit) 3. You can have multiple debits and multiple credits in one entry 4. Once posted, an entry cannot be edited — only voided (reversed) **Simple Entry Examples**: - **Record salary payment**: Debit Checking $3000, Credit Income $3000 - **Grocery shopping**: Debit Groceries Expense $50, Credit Checking $50 - **Transfer between accounts**: Debit Savings $100, Credit Checking $100 - **Pay credit card**: Debit Credit Card (Liability) $500, Credit Checking $500 **Complex Entry Example** (multiple lines): "Divided a $100 restaurant bill with a friend. You paid the card." - Debit Dining Out Expense: $50 (your half) - Debit Receivable (Friend): $50 (they owe you) - Credit Checking: $100 (card paid) **Tips**: - Use the `record_transaction` tool for simple two-account transfers - Use `create_journal_entry` for complex multi-line entries - Always verify entries are balanced before posting - Write clear descriptions for audit trail
List all accounts, optionally filtered by type or active status.
List all budgets for a given year (optionally filtered by month).
List journal entries with optional date range, posted status filter, and pagination.
List transactions with optional filters for date range, category, payee, and account.
Post (finalize) a draft journal entry. Posting enforces the balance check: total debits must equal total credits. If the entry is unbalanced, an error is returned with detailed totals.
Record a user-facing transaction. This is a convenience tool that creates a balanced journal entry (one debit + one credit) automatically. Use this for simple money transfers between two accounts.
Set or update the monthly budget for an account. If a budget already exists for the given account/year/month, it will be updated (upsert).
Understand the five fundamental account types in double-entry bookkeeping. **The 5 Account Types** (must balance: Assets = Liabilities + Equity): 1. **Asset** (normal debit balance): Money you own → higher = richer - Examples: Checking, Savings, Cash, Car, House 2. **Liability** (normal credit balance): Money you owe → higher = more debt - Examples: Credit Card, Loan, Mortgage 3. **Equity** (normal credit balance): Your net worth / ownership - Examples: Opening Balance, Retained Earnings 4. **Income** (normal credit balance): Money you earn → higher = more earned - Examples: Salary, Freelance, Bonus, Interest 5. **Expense** (normal debit balance): Money you spend → higher = more spent - Examples: Groceries, Gas, Rent, Utilities **The Fundamental Equation**: Assets = Liabilities + Equity - When you earn income: Debit Cash (Asset), Credit Income - When you spend: Debit Expense, Credit Cash (Asset) - When you get a loan: Debit Cash (Asset), Credit Loan (Liability) **Why Double-Entry?** Every transaction affects two accounts, ensuring the books always balance. This catches errors and fraud.
Update an account's name or active status.
Void a posted journal entry by creating a reversing (contra) entry. The reversing entry swaps debits and credits and is immediately posted. This preserves the audit trail.
Error handling descriptions missing. Tools like finance_post_journal_entry mention balance validation but do not describe recovery paths. Error response should be: 'If unbalanced, returned error includes totals and guidance to add lines totaling the difference.'
Parameter descriptions lack constraint clarity. Numeric parameters (year, month, amount) have min/max bounds in schema but descriptions do not restate them for LLM clarity. Example: 'year' parameter should say 'year (2000 - 2100)' in description, not just 'Budget year'.
No pagination result totals. finance_list_* tools accept limit/offset but responses do not document total_count or has_more fields needed for LLM pagination logic. LLM cannot tell if 25 results = all results or if more exist.