Vitafin money tracker

Money tracker, every account in its own currency: cards, loans, budgets, bills, splits, net worth.

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only

What it can do

  • List Accounts: Accounts with their currency, institution, region and current balance (yours and any a partner shares with you).
  • Create Account: Create an account. One currency per account.
  • Set Account Balance: Make an account's balance equal what the bank shows, by recording one adjustment row for the difference (outside spending). Use after the user reads a balance off their banking ap

What data it sees

Do you need an account

No: the server works without sign-in

Money tracker, every account in its own currency: cards, loans, budgets, bills, splits, net worth.

Vitafin keeps a household's money records: bank and card accounts in any currency (never summed across currencies), loans and EMIs, budgets, recurring bills, split bills and group trips, investments and net worth. The tools log spending, read card statements, reconcile bank statements, draw charts and answer what is due. Remote server with OAuth sign-in; a 14-day trial starts at sign-up, no card. Works with Claude, ChatGPT, Cursor and any MCP client.

How to connect: https://vitafin.io/connect/

How to connect

How to connect Vitafin money tracker to Claude

The server address to paste into Claude settings:

https://vitafin--vitafin.run.tools

  1. Open Claude (claude.ai or the desktop app).
  2. Go to Settings → Connectors.
  3. Click Add custom connector.
  4. Paste the server address copied below into Remote MCP server URL and click Add.
  5. In a chat, click + → Connectors and switch the new connector on.

Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.

Authorization

After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.

How to connect Vitafin money tracker to ChatGPT

The server address to paste into ChatGPT settings:

https://vitafin--vitafin.run.tools

  1. Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
  2. Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
  3. Open Settings → Connectors and click Create.
  4. Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
  5. Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
  6. In a new chat open + → Apps/Connectors and enable the connector.

OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.

Authorization

On first use ChatGPT opens the service's sign-in window. Sign in and approve access.

How to connect Vitafin money tracker to Cursor

The server address to paste into Cursor settings:

https://vitafin--vitafin.run.tools

Fastest: click Open in Cursor below and confirm the prompt.

Manually:

  1. In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
  2. Paste the JSON copied below into ~/.cursor/mcp.json (per project: .cursor/mcp.json in the repo root).
  3. Save the file. The server appears in the MCP list; authorize it there if asked.

Authorization

If the service needs sign-in, an authorize button appears next to the server in the MCP list.

Server tool list (60)

Raw names from tools/list. Only developers need these.

list_accountsAccounts with their currency, institution, region and current balance (yours and any a partner shares with you).
create_accountCreate an account. One currency per account.
set_account_balanceMake an account's balance equal what the bank shows, by recording one adjustment row for the difference (outside spending). Use after the user reads a balance off their banking app; prefer reconcile_statement when a statement is available.
list_categoriesCategory ids, names, kind (expense/income) and parent for sub-categories.
search_transactionsSearch transactions. Each row carries its own currency; do not add rows across currencies.
spending_summarySpent / received totals for a period, ONE BLOCK PER CURRENCY, with a per-category breakdown. Never sums across currencies. Transfer legs are excluded.
log_transactionRecord an expense (negative amount) or income (positive) on an account, in that account's currency. Category is auto-suggested from the merchant when omitted. Lands in the review queue. Money that leaves or arrives but is not really spending or income (a payout on someone's behalf, a reimbursement, a refundable deposit) goes in with excluded=true: it moves the balance but stays out of insights and budgets.
update_transactionChange category, merchant, note, reviewed flag, or whether the row counts as spending/income (excluded). Amount and date are immutable once reviewed.
review_queueTransactions awaiting the user's confirmation (auto-captured or created via MCP).
create_transferMove money between accounts. For different currencies give to_amount or rate; the rate is frozen at creation. Legs are excluded from spending; an optional fee is a real expense.
list_transfersTransfers with their effective rate.
import_statementImport a bank statement (CSV text) into one account. Dry-run by default: returns every parsed row with its status (ready / duplicate / invalid). Pass commit=true to write the ready rows; they land in the review queue. Amounts are read in the account's currency.
budget_statusEvery budget with what its category (and sub-categories) has consumed this calendar month, per currency. Ratio > 1 means over budget.
spending_trendSpent and received per calendar month for the last N months, one series per currency (never summed across). Transfer legs excluded.
list_debtsCredit cards (limit, cycle, current balance from the card account) and loans (borrowed and lent, with payments and simple outstanding = principal − payments). Per currency.
list_holdingsInvestment holdings with quantity held, cost basis, last cached quote and unrealised P/L, per currency. Quotes carry an as-of time; never assume they are live.
upcomingWhat's due in the next N days: recurring rules (next run), planned one-off expenses, reminders, card due dates and loan payment days. Committed outflow per currency (never summed across).
people_balancesWho owes you what from split bills (and what you owe them), per person per currency, with each split and settlement. Positive balance = they owe you.
record_settlementSomeone paid you back (or you paid them) for split bills. Positive amount = they paid you. Optionally also records the money on one of your accounts. The phone picks it up on its next sync.
split_transactionSplit one of your expenses with other people: each owes their share until settled. Amounts omitted → equal split with you included (you keep the rounding). Replaces any existing split on that transaction.
parse_transaction_textRun a bank SMS/email body through the same rule engine the app uses. Returns amount, currency, direction, merchant, last4, date and a confidence; does NOT save. Use log_transaction to record it.
list_groupsYour expense groups (trips, flats, events) with members and, per currency, total spent, each member's net position and the payments that would settle everyone up.
add_group_expenseAdd an expense to a group: who paid and who shares it (equal split unless amounts are given). Members are matched by name; you are the payer unless told otherwise. Optionally also logs it on one of your accounts when you paid.
settle_groupRecord a payment between two group members that squares up part of the group's balance (e.g. Rahul paid you ₹2,000 for the trip). Use list_groups → settle_up for the suggested payments.
reconcile_statementReconcile one account against a bank statement for a period. Give the statement as CSV text or as rows (date, amount, description) you read off a PDF. Reports matched lines, lines the app is missing, ledger rows the bank never saw, and the closing-balance difference. Dry-run unless commit=true; then the missing rows are added as bank-confirmed, the unexplained ledger rows go to the review queue, and the run is recorded.
record_card_statementOne credit-card statement, as the bank printed it. Give the statement date and the closing balance owed and the ledger is anchored to the bank: card terms (limit, statement day, due date, minimum due) are set from the statement, the lines you list are matched or added, and whatever still separates the ledger from the closing balance becomes one dated 'Balance adjustment' row that never counts as spending. Send statements oldest first, one call each; re-sending the same statement date replaces its adjustment instead of stacking. Dry-run unless commit=true.
chartA picture of the numbers, as a PNG you can show the user: spending by month, income vs spending, where the money went (top categories) for a period, or one account's balance over time. One panel per currency, never summed across. The reply also carries the figures as a table so you can quote them exactly.
unparsed_alertsBank alert texts you logged (via log_transaction raw_text) that no parse rule reads yet, grouped by bank, each with the amount/merchant that was logged for it. Use them to write a rule for that bank, then test_parse_rule and save_parse_rule.
test_parse_ruleDry-run a parse rule over your stored alerts (and any extra samples): which match, and whether the parsed amount equals what was logged. Nothing is saved.
save_parse_ruleSave a parse rule for your account. It must match at least one stored alert with the right amount (or pass force=true). Synced to your phone, which then reads that bank's alerts by itself.
list_parse_rulesYour saved parse rules (the bank-alert patterns learned through MCP).
delete_parse_ruleRemove one of your parse rules (the phone drops it on its next sync).
set_category_ruleTeach the categoriser: merchants matching a pattern get this category from now on (on the phone too). Optionally re-categorise the existing transactions that match.
add_holdingCreate an investment holding (a stock, ETF, mutual fund, gold, crypto…) with no lots yet; use record_lot for buys/sells, or import_holdings for a broker export. A live-price source is picked from the kind unless given.
record_lotRecord a buy or sell of a holding: quantity, total amount paid/received (before fee), optional fee, and optionally the bank account the cash moved through (writes the cash row too).
import_holdingsImport a broker's holdings export (Zerodha/Groww/Kite style CSV: instrument, quantity, average cost, optionally LTP) into an investment account. Each row becomes a holding plus one 'buy' lot at the average cost dated as_of, so cost basis and P/L work from day one. Existing holdings (same symbol) are skipped unless replace=true. Dry-run unless commit=true.
set_quoteRecord the current price of a holding by hand (e.g. from the broker app), with an as-of time. The app refreshes live sources on its own; this is for holdings without one.
add_recurring_ruleSet up something that repeats: rent, salary, a subscription, an EMI. Negative amount = expense, positive = income, in the account's currency. mode 'autoPost' logs it on the due day; 'remind' only shows it under Upcoming until you confirm.
list_recurring_rulesYour recurring rules with next run, mode and paused state.
update_recurring_rulePause/resume, change the amount, or delete a recurring rule.
add_planned_expenseA one-off you know is coming (a flight, a fee, a gift): shows under Upcoming until it is logged or skipped. Amount is positive; it is an expense.
resolve_planned_expenseA planned expense happened (log it as a transaction on an account, optionally with the real amount/date) or won't happen (skip).
add_reminderA dated note under Upcoming (renew passport, cancel trial). No money attached.
complete_reminderMark a reminder done (or delete it).
set_budgetSet (or replace) a spending limit for a category in one currency per week/month/year. Pass limit 0 to remove it. budget_status reports progress.
update_accountRename an account, fix its bank/country/last-4, or archive it (archived accounts keep their history but leave every list).
delete_transactionDelete a transaction (and any split on it). Transfer legs: delete the transfer instead.
correct_transactionChange a transaction's amount, date or account — the things update_transaction deliberately leaves alone. Use when the user says the number itself was wrong.
delete_transferRemove a transfer and both of its legs (and the fee row, if any).
set_credit_cardGive a card account its terms so due dates and utilisation work: limit, statement day, days until due, minimum due. Creates or replaces.
add_loanA loan you took (borrowed) or money you lent. EMI loans need term_months (the EMI is computed if omitted); pay-as-you-go loans don't.
record_loan_paymentAn instalment or prepayment on a loan (or money received back on one you lent). Optionally the bank account it moved through, which also writes the cash row.
update_loanClose a loan (fully repaid), reopen it, rename it, or delete it with its payments.
add_categoryA new category (or sub-category under a parent). Id is derived from the name unless given.
update_categoryRename a category, change its icon, or archive it (rows keep their category; it just leaves pickers).
update_personRename someone you split with, set their contact, or archive them.
delete_splitRemove the split on a transaction (the transaction stays); or delete a settlement by id (its bank row, if any, goes too).
create_groupStart a group ledger (a trip, a flat) with you as owner and the other members by name. Members can join from their own phone later with group_invite.
add_group_memberAdd a member by name to a group you are in.
group_inviteAn invite link for a group. With member_id, whoever opens it becomes that named placeholder (keeps its history); without, they join as a new member.