Documentation

Cashflow keeps track of your day-to-day money — what came in, what went out, and what’s coming up, and it keeps the statements, receipts and tax forms behind it. Connect it once to Claude, ChatGPT, Gemini, Muse, OpenClaw, Claude Code, Codex, Cursor, VS Code, or any MCP-compatible assistant, and every one of them can answer questions about your money and help keep it tidy.

Server URL

https://cashflow.tech/api/mcp

Every assistant connects to this one address.

  • Claude
  • ChatGPT
  • Gemini
  • Muse
  • OpenClaw
  • Claude Code
  • Codex
  • Cursor
  • VS Code
  • and any MCP app

Connect your assistant

Paste this into your agent. One that can add its own tools, like Claude Code or Codex, sets itself up; a chat app (Claude, ChatGPT, Gemini) adds servers only from its settings, so it walks you through those.

Connect to Cashflow, the app that keeps track of my day-to-day money, as an MCP server at https://cashflow.tech/api/mcp (Streamable HTTP, OAuth 2.1 with PKCE; client ID metadata documents or dynamic client registration; the first call without a token answers 401 with the discovery address). If Cashflow's tools are already available to you, skip to "Once connected". If you have a built-in way to add a remote MCP server with OAuth, use it rather than writing a client of your own (Claude Code: claude mcp add --transport http --scope user cashflow https://cashflow.tech/api/mcp; Codex: codex mcp add cashflow --url https://cashflow.tech/api/mcp, then codex mcp login cashflow). If you can't add one yourself (most chat apps, like Claude, ChatGPT and Gemini, only add them from their settings), don't stop there: tell me how to add it in your app's settings (the steps for each app are at https://cashflow.tech/connect), and continue once I've added it. Before you open the sign-in link, tell me what will happen: I sign in with Google and approve the connection in my browser. Then open the link. Read https://cashflow.tech/docs/llms.txt for how the tools work. Once connected: 1) call query with { digest: true } and tell me in a few lines what needs my attention today and what you can do for me from now on; 2) if no bank account is connected yet, call the accounts tool so I can connect one; 3) ask whether you should use Cashflow whenever I ask about my money, and if I say yes, save this in your memory or instructions: Answer questions about my spending, bills and balances from Cashflow rather than guessing, and ask me before changing anything in it.

Or follow the steps for Claude, ChatGPT, Gemini, Muse, OpenClaw, Claude Code, Codex, Cursor, VS Code and any other MCP app on Connect your assistant.

Authentication

The server speaks the Model Context Protocol over Streamable HTTP. Sign-in is OAuth 2.1 with PKCE, and a client identifies itself with a client ID metadata document or dynamic client registration: a client that follows the protocol's discovery needs nothing else. Point it at the address, sign in with Google, approve, and the tools are there. No API keys needed.

An agent that can't open a browser, like a scheduled job, can skip sign-in: create a personal access token in Settings and send it as a bearer header.

There is no separate REST API. MCP is the interface.

To look around before connecting a bank account, try the demo in your browser. The demo can’t be connected to an MCP client — approving one needs your own account.

What an agent can do

  • Get its bearings in one call. query { digest: true } returns what needs attention today, such as a low balance coming, a missed bill, an unusual charge or a bank connection that stopped working.
  • Answer money questions. Spending summaries, breakdowns by category or merchant, month-over-month trends, income vs. expenses, and a search over every transaction, all from the one query tool.
  • Look ahead. Recurring bills and subscriptions with their next dates, what the person is on track to have, and how they are doing against their plan for the year.
  • Keep it tidy. Recategorize, rename a merchant, tag, or ignore a transaction; write a rule so the next one is handled automatically.
  • Keep the paper trail. File statements, receipts and tax forms against the transactions and accounts they back up, and check a statement against the ledger row by row.
  • Run on a schedule. The digest is cheap and read-only, so it is safe every morning. query { detail: true, since } returns only the transactions that arrived since the last run, with an as_of to pass next time.

What the archive of statements, receipts and tax forms does, and which banks’ statements can be checked line by line: Paper Trail.

Cashflow is about cash. There is no net worth, investment performance or credit score here, and the data is one household's own.

Tools

query read-only

Unified financial query tool with auto-detected modes: spending summaries, grouped breakdowns, trends over time, income vs. expense reports, transaction detail, recurring bill detection, cash flow forecasting, unusual-charge detection, transfers between your accounts, and data health checks. Supports filtering by category, party (the merchant or person on the other side of a transaction), account, tags, date range, and amount.

annotate non-destructive

Classify and organize transactions. Set categories, parties, tags. Mark transfers or ignored transactions. Apply rules in bulk. Detect recurring bills and subscriptions. All changes are reversible — raw bank data is never modified.

admin write

Manage your setup: categories, category groups, parties, tags, accounts, recurring bills, transaction rules, plans and documents, plus bank sync and file import. Supports list, create, update, rename, merge, and delete (activate/deactivate via update). Rules use a specificity-based engine with a preview-before-create workflow.

accounts read-only

An interactive card of your connected banks and accounts, with when each last updated and one-click buttons to sync, reconnect, disconnect, or connect a new bank. Shown in assistants that can display one.

paycheck_plan read-only

An interactive card of your next few paychecks: for each one, the bills due before the next check, what to put aside toward the bigger bills that come less often, and what's left. Built from your detected paycheck and recurring bills. Shown in assistants that can display one; the same plan comes back as data for any agent.

How the server behaves

Every connected agent is told the same working rules on connect. They’re worth knowing before you call the tools:

  • Amounts are in the household's currency (dollars for a US household), never cents; a household outside USD gets ccy on each response. A transaction's amt is signed (money in positive, money out negative); every other total says which way it reads in a sign field.
  • query takes filters at the top level; annotate takes them inside filter. No dates means all time, which for a write means an all-time write.
  • For cash or statement comparisons, use view: "as_booked" with the same accounts, dates and financial-kind scope: it reports recorded activity. view: "adjusted" applies reporting entries without changing those transactions and may differ from cash that moved in the range; reconcile: true shows the bridge. Period sums cover the exact selected dates, even when calendar column labels are wider. P&L operating net is income minus expenses; change in cash also includes investment, financing and transfer activity.
  • Writes over a filter are two steps: preview: true returns the matches and a token, and the same call with that token makes the change. The token is bound to exactly those transactions, so it goes stale if they change.
  • Rules work the same way: admin { entity: "rule", action: "preview" } shows what a rule would catch before create saves it.
  • Look names up before filtering on them: admin { entity: "category" | "party" | "tag", action: "list" }. Category and merchant ("party") filters are exact; search is fuzzy.
  • query { explain: true, transaction_id } answers "why is this categorized that way" before anyone changes it.
  • Responses are terse to save context: short field names (amt, cat, grp, desc, acct, dt) and nothing empty.

Guides

Common jobs as tool sequences, each with the one rule that keeps it safe.

Start every conversation oriented

  1. query {"digest":true} — what needs attention today: a low balance coming, a missed bill, an unusual charge, a broken bank connection

Guardrail: Read-only and bounded, so it is safe to run first, every time.

Fix a wrong category

  1. query {"explain":true,"transaction_id":"00000000-0000-4000-8000-000000000000"} — why it was categorized that way — the bank, a rule, or a person (the id comes from detail: true)
  2. annotate {"action":"categorize","transaction_ids":["00000000-0000-4000-8000-000000000000"],"category_name":"Groceries"} — fix this one transaction

Guardrail: If a rule put it there, change the rule instead, or the next sync puts it back.

Clean up in bulk

  1. annotate {"action":"categorize","filter":{"party":"Starbucks","period":"this_year"},"category_name":"Coffee","preview":true} — see what would change, and get a token
  2. annotate {"action":"categorize","filter":{"party":"Starbucks","period":"this_year"},"category_name":"Coffee","token":"<token from the preview>"} — make exactly that change

Guardrail: A filter with no dates covers all time. Scope it, and check the range the preview echoes.

Turn a fix into a rule

  1. admin {"entity":"rule","action":"preview","description_pattern":"BLUE BOTTLE","set_category_name":"Coffee"} — every past transaction the rule would catch, and a token
  2. admin {"entity":"rule","action":"create","description_pattern":"BLUE BOTTLE","set_category_name":"Coffee","token":"<token from the preview>"} — save it; it applies to new transactions as they arrive

Guardrail: Match on the bank's description, not the merchant name: merchant names can change on a resync.

Review bills and subscriptions

  1. query {"recurring":true} — every bill and subscription, with its next date and amount
  2. admin {"entity":"recurring_series","action":"update","id":"<series id>","active":false} — stop tracking one that ended

Guardrail: Deactivating stops the forecast counting it; it cancels nothing with the merchant.

Can I afford this?

  1. query {"forecast":true,"scenario":{"add":[{"name":"New car payment","amount":450,"freq":"monthly"}]}} — the projected balance with and without the new payment

Guardrail: Nothing is saved: a scenario is a what-if on top of the forecast.

Check the year against the plan

  1. query {"plan_status":true} — income, spending and big events against the plan, and what's running ahead or behind

Guardrail: A real change in plans is a plan revision (with a reason), not a fudged category.

File a receipt against a charge

  1. admin {"entity":"document","action":"request_upload","filename":"receipt.pdf"} — an upload address and a ready-to-run command; the file goes there, not through the conversation
  2. admin {"entity":"document","action":"create","upload_id":"<upload_id from the upload>","doc_type":"receipt","title":"Plumber invoice","link_transaction_ids":["00000000-0000-4000-8000-000000000000"]} — file it against the charge it explains
  3. admin {"entity":"document","action":"substantiate","start":"2026-09-01","end":"2026-09-30"} — which charges in the month still have nothing filed against them

Guardrail: Linking is explicit: name the charge. Nothing is matched for you from the amount or the merchant.

Check a statement against your transactions

  1. admin {"entity":"document","action":"request_upload","filename":"statement.pdf"} — an upload address for the statement PDF
  2. admin {"entity":"document","action":"create","upload_id":"<upload_id from the upload>","doc_type":"statement","title":"Chase card, September","link_account_ids":["00000000-0000-4000-8000-000000000000"]} — file it to its account (the id from admin { entity: "account", action: "list" }); the billing cycle is read off the statement itself
  3. admin {"entity":"document","action":"tie_out","id":"<document id>"} — every statement line against the ledger, both ways: lines with no transaction here, and transactions the statement never printed

Guardrail: Link the statement to its account, or there is nothing to check it against. It compares lines, not balances.

Run a morning check on a schedule

  1. query {"digest":true} — what to flag today
  2. query {"detail":true,"since":"2026-10-07T08:00:00.000Z"} — only what arrived since the last run; store the as_of it returns for next time

Guardrail: Both are reads. Ask the person before any annotate or admin call a schedule wants to make.

Reference

Every query mode and its trigger, every admin entity and which of its actions read or write, and the prompts the server offers, generated from the server itself: Tool reference.

What changed

  • 2026-10-11: account_summary and summary's account list mark a balance stale (with stale_since = when the bank last updated it) while the bank has stopped sending updates for that connection — the balance shown is the last one it sent.
  • 2026-10-11: bank_connection sync and list flag a connection whose bank stopped sending updates (no_update_since, status warning) — last_sync keeps moving while it does, so it is not when the bank last updated.
  • 2026-10-09: New paycheck_plan tool: the next few paychecks as a card — what each has to cover before the next one, what to put aside toward bigger bills, and what's left.
  • 2026-10-08: bank_connection sync and list say when the bank last sent new or changed transactions (last_new), beside when we last checked (last_sync).
  • 2026-10-08: bank_connection sync and list say when each connection is next checked on its own (next_by), and a sync says when there was nothing new. Syncing on a schedule is not needed.
  • 2026-10-07: Connect-time instructions name all four tools and one answer for a household with no bank yet: call the accounts tool, else send the person to setup.url.
  • 2026-10-07: Private holdings: vested_through is the last vested tranche.
  • 2026-10-05: Tool descriptions are shorter: duplicated sections and restated schemas removed.
  • 2026-10-04: admin: a rule gets a default name, and bank_connection gains list.
  • 2026-10-04: Statements from Chase, Citi, Navy Federal and Wells Fargo cards can be read and checked against the ledger.
  • 2026-09-30: Grouped, trend and matrix responses state which way their amounts point in a sign field, and compare the change in cash (net_vs_prior).
  • 2026-09-29: Tag, recurring-series and position lists page with limit/cursor.
  • 2026-09-29: Rule previews flag ignored matches ign:true and show the bank memo as raw.
  • 2026-09-12: The echoed as_of is the moment of the read, so since picks up exactly where the last run stopped.

Usage Examples

In practice you just describe what you want in natural language. These show the underlying query tool parameters for reference.

Monthly spending summary

Returns income, expenses, and net totals with month-over-month comparison and an income-allocation breakdown.

{
  "period": "this_month",
  "compare": "prior_period"
}

Recurring bills audit

Lists all detected recurring charges with frequency, amounts, and a 60-day forecast of upcoming payments.

{
  "recurring": true,
  "forecast_days": 60
}

Category drill-down with anomalies

Breaks down expenses by category group with anomaly detection — spending spikes, unusual charges, and price changes.

{
  "by": [
    "group"
  ],
  "type": "expense",
  "period": "this_month",
  "include": [
    "anomalies"
  ]
}

Tax forms checklist

Which tax forms to expect this year, built from the household's own money (wages mean a W-2, interest a 1099-INT), with the ones already filed marked.

{
  "tax_documents": true
}

Transaction search

Searches transaction descriptions across all time, returning individual transactions with amounts, dates, and categories.

{
  "detail": true,
  "search": "Amazon",
  "period": "last_3_months"
}

Safety

  • The connection acts only as the signed-in person, only on their own household's data.
  • Every tool declares whether it reads or writes, so clients run the read-only ones freely and ask before the rest.
  • Cashflow never edits what the bank reported. Categories, names, tags and rules are kept alongside each transaction, so any change an agent makes can be changed back.
  • Bulk changes need a preview token, and over 20,000 matches are refused. Turning a statement into transactions is a dry run until asked otherwise.
  • Every tool call is logged. The demo account is read-only.

Privacy

Cashflow only accesses financial data you explicitly connect. Your data is stored securely and is never shared with third parties. See the privacy policy for details.

The parts of this page an agent needs are also plain text at /docs/llms.txt, along with the exact instructions the server gives every agent.