# SiftSum > Private AI receipt scanner and expense tracker, free on the web and in any MCP client. Capture line items, track income and bills, and plan cash flow without linking a bank. SiftSum is a personal finance journal for Canada: itemized receipts, income, recurring money, balances and cash-flow. It is used from an iPhone app, the web app, or an AI assistant over MCP. ## What decides whether SiftSum fits - No bank connection. There is no account linking and no credential prompt. A person sets an opening balance and records income and confirmed expenses. Manual entry is free and is not paywalled. - Receipt photos are not stored. An image is held in memory for one request while the configured model reads it, and is not written to disk, a queue, or an application log. Only the draft the person approves remains. - Nothing counts until it is confirmed. A scan produces a draft, and drafts are excluded from balances, spending totals, trends, budgets and cash-flow until the person confirms them. - Assistant writes are approved, not assumed. Every write returns an approval card, and every record an assistant creates is labelled with which assistant created it. - CAD-first. Currencies are kept separate and never summed into one total. ## Pages - [SiftSum](https://siftsum.com): the product, how it works, privacy, FAQ. - [Private receipt scanner](https://siftsum.com/receipt-scanner): A receipt scanner that reads the photo once in memory and never writes it to a disk, a queue, or a log. Only the draft you approve is kept. - [Expense tracker](https://siftsum.com/expense-tracker): Track personal expenses by merchant, product, category, and period with searchable receipts and separate currencies. - [Cash-flow planner](https://siftsum.com/cash-flow-planner): Combine current balance, received and scheduled income, recurring expenses, and confirmed spending in one cash-flow forecast. - [Claude & ChatGPT (MCP)](https://siftsum.com/ai-finance-assistant): Connect Claude or ChatGPT to your own expense ledger over MCP. The same tools and permissions as the app, and every write waits for your approval. - [Support](https://siftsum.com/support): getting an account working, and how to reach a human. - [Privacy Policy](https://siftsum.com/privacy): what is collected, where it goes, how it is deleted. - [Terms of Use](https://siftsum.com/terms) ## French Every page above exists in Canadian French under /fr. - https://siftsum.com/fr - https://siftsum.com/fr/scanner-recus - https://siftsum.com/fr/suivi-depenses - https://siftsum.com/fr/planification-tresorerie - https://siftsum.com/fr/assistant-financier-ia ## MCP server SiftSum exposes 59 tools to an MCP client such as Claude or ChatGPT. The server address is https://siftsum.com/mcp. It uses the same permissions and the same validation as the app itself, so an assistant cannot do anything a person could not do in the interface, and writes return an approval card before they apply. ### Tools - `list_categories`: Returns the stable codes and hierarchy of the spending categories. Call before categorizing a receipt. - `create_category`: Creates a category when no existing one fits. An identical name reuses the category; a similar name requires force=true. - `update_category`: Renames a category or changes its display order. The code stays stable: receipts already filed under it follow the new name. - `archive_category`: Archives a category to remove it from the choices, or restores it. Receipts already filed under it keep it. - `list_category_budgets`: Lists category budgets for one month, including rollover, actual spending, scheduled spending, projections, remaining amounts, warnings and versions. Parent-category budgets include their children; currencies stay separate. - `set_category_budget`: Creates or changes a monthly category budget. Use list_categories for the code and list_category_budgets for the current version before changing an existing budget. - `stop_category_budget`: Stops a category budget from a selected month forward. Past months remain in history. Read the latest version with list_category_budgets first. - `create_receipt_draft`: Creates a draft from fields extracted outside the server. Never confirms the expense. Returns possible duplicates, the reconciliation and the allocated amounts. - `get_receipt`: Returns a draft or confirmed receipt with its lines, categories, adjustments and reconciliation state. - `search_receipts`: Searches receipts by text, status, origin or period. The text covers merchants, products and numbers. The response reports the total number of matches and whether the list was truncated. - `update_receipt`: Updates a receipt, with version checking. Omitted fields keep their value; supplying "items" replaces every line. Correcting a category changes no other receipt, past or future. - `confirm_receipt`: Confirms a reconciled, fully categorized draft. Call only after the user has explicitly approved it. - `delete_receipt`: Soft-deletes a receipt, with version checking. Reversible with restore_receipt. - `restore_receipt`: Restores a deleted receipt. Find it with search_receipts and include_deleted. - `pending_drafts`: Counts drafts awaiting confirmation and gives a lightweight preview, without fetching their lines. - `list_merchants`: Lists known merchants, their name variants and their receipt counts. Useful for spotting duplicates to merge. - `rename_merchant`: Renames a merchant everywhere at once, past receipts included. If the new name already belongs to another merchant, the two are merged. - `merge_merchants`: Merges two duplicate merchants: receipts and recurring payments move to the merchant you keep, and the old name becomes an alias. - `create_recurring_payment`: Creates a recurring payment (subscription, rent, bill). Receipts are generated and confirmed automatically on each due date, with no review. Due dates already in the past are generated immediately. - `list_recurring_payments`: Lists the user's recurring payments with their next due date. - `get_recurring_payment`: Returns a recurring payment and its current version. - `update_recurring_payment`: Updates the future due dates of a recurring payment, or pauses it, with version checking. Omitted fields keep their value. Never recreate a rule to correct it: receipts already generated would be duplicated. - `delete_recurring_payment`: Deletes a recurring payment. Receipts already generated are kept. To correct a rule use update_recurring_payment: recreating the rule would regenerate every past receipt as a duplicate. - `list_income_types`: Returns the stable codes of the income types. - `create_income_type`: Creates a custom income type. An identical name reuses the existing type; a similar name returns the candidates and requires force=true. - `update_income_type`: Renames a custom income type, archives it or restores it. The two operations can be combined; built-in types are refused. - `list_income_sources`: Lists income sources and their default type. - `upsert_income_source`: Creates an income source, or changes its default type. - `rename_income_source`: Renames an income source everywhere at once. If the new name already belongs to another source, the two are merged. - `merge_income_sources`: Merges two duplicate income sources: income entries and recurring rules move to the source you keep. - `archive_income_source`: Archives an income source to remove it from the choices, or restores it. Income already recorded against it keeps it. - `create_income`: Records net income already received, directly. There is no draft step. - `search_income`: Searches received income by period, source, type or text. The response reports the total number of matches and whether the list was truncated. - `update_income`: Updates a received income entry, with version checking. Omitted fields keep their value. - `delete_income`: Soft-deletes a received income entry, with version checking. - `restore_income`: Restores a deleted income entry, with version checking. - `create_recurring_income`: Creates recurring income without generating occurrences earlier than today. - `list_recurring_income`: Lists recurring income rules and their next occurrence. - `get_recurring_income`: Returns a recurring income rule and its current version. - `update_recurring_income`: Updates the future occurrences of a recurring income, or pauses it, with version checking. Omitted fields keep their value. - `delete_recurring_income`: Deletes a recurring rule while keeping the income already generated. - `list_money_accounts`: Lists the bank accounts, cards and cash wallets the user tracks under My Money, with each balance. Call this before attaching a source or destination to a receipt, an income entry or a transfer: those take the exact name returned here. - `create_money_account`: Adds a bank account, card or cash wallet to My Money. Call list_money_accounts first: a name that already exists is refused rather than duplicated. Name it the way the user does — "Mastercard", "chequing", "cash in my wallet". - `update_money_account`: Renames a My Money account, or changes its type, note or opening balance, with version checking. Omitted fields keep their value. There is no currency to set: every account is held in the account-wide currency, which is changed in user settings. - `archive_money_account`: Archives a My Money account so it stops being offered for new transactions, or restores it. Nothing already filed against it changes: its receipts, income, recurrences and transfers keep naming it and its balance is still reported. This is the way to retire an account that has been used — a used account cannot be deleted. - `create_transfer`: Records money moved between two My Money accounts the user owns — paying a credit card from chequing, taking cash out, moving money to savings. A transfer is neither income nor spending and is excluded from every total, so paying off a card does not count the purchases on it a second time. The two ends must differ. - `list_transfers`: Lists movements between the My Money accounts this user owns, newest first. Transfers are excluded from income, spending and cash-flow figures, so this is the only place they appear. - `delete_transfer`: Deletes a transfer, with version checking. Reversible with restore_transfer: the two balances go back to what they were, and list_transfers with include_deleted finds it again. - `restore_transfer`: Puts a deleted transfer back, with version checking. Find the id with list_transfers and include_deleted. - `list_assets`: Lists the things the user groups income and expenses against — a home, a rental property, a car — with what each has brought in and cost. Call this before attaching an asset to a receipt, an income entry or a recurrence: those take the exact name returned here. The figures are cash in and cash out only; net_cash_flow is not value, appreciation or profit. The app calls these Possessions (Biens in French); say "possessions" to the user, not "assets". - `create_asset`: Adds something the user wants to group income and expenses against: a home, a rental property, a vehicle. Call list_assets first: a name that already exists is refused rather than duplicated. Name it the way the user does — "Honda Civic", "the duplex", "the cottage". The app calls these Possessions (Biens in French); say "possession" to the user, not "asset". - `update_asset`: Renames an asset, or changes its type or note, with version checking. Omitted fields keep their value. - `archive_asset`: Archives an asset so it stops being offered for new transactions, or restores it. Nothing already filed against it changes: its receipts, income and recurrences keep naming it and its totals are still reported. This is the way to retire a car that has been sold or a property no longer owned — a used asset cannot be deleted. - `account_balance`: Returns the account balance: starting balance, plus income received, minus confirmed spending, plus balance corrections (the differences booked by correct_balance, which are neither income nor spending). The account has one currency and it is named in the response. - `correct_balance`: Brings a balance in line with reality when the user says what it actually is ("I have $1,240 in the bank", "my Visa is at $380 owed"). SiftSum computes the difference from the recorded balance and books it as a balance correction dated today: it is neither income nor spending, and no earlier record or running balance changes. Omit money_account to correct the account balance; name a My Money account to correct that one instead. Use this rather than set_starting_balance, and never invent a receipt or income entry to close the gap. A balance that already matches books nothing. - `set_starting_balance`: Sets the opening balance of the account, meaning the money held before the first recorded receipt and the first recorded income. Only for correcting a starting figure that was entered wrong: changing it moves every past running balance. To bring today's balance in line with the bank, use correct_balance instead. The amount is in the account currency, which is named in the response. - `spending_summary`: Summarizes confirmed spending by category, merchant, product or period. A parent category code covers its subcategories. Currencies are never added together. - `income_summary`: Summarizes income received, grouped by type, source or period. Totals cover every entry in the period, never a truncated page. - `cash_flow_summary`: Returns actual and projected flows for a period, along with the opening balance, the current balance and the projected end-of-period balance. Everything is in the one currency the account keeps.