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.
https://cashflow.tech/api/mcp
Every assistant connects to this one address.
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.
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.
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.query tool.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.
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.
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.
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.
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.
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.
Every connected agent is told the same working rules on connect. They’re worth knowing before you call the tools:
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.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.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.admin { entity: "rule", action: "preview" } shows what a rule would catch before create saves it.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.amt, cat, grp, desc, acct, dt) and nothing empty.Common jobs as tool sequences, each with the one rule that keeps it safe.
query {"digest":true} — what needs attention today: a low balance coming, a missed bill, an unusual charge, a broken bank connectionGuardrail: Read-only and bounded, so it is safe to run first, every time.
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)annotate {"action":"categorize","transaction_ids":["00000000-0000-4000-8000-000000000000"],"category_name":"Groceries"} — fix this one transactionGuardrail: If a rule put it there, change the rule instead, or the next sync puts it back.
annotate {"action":"categorize","filter":{"party":"Starbucks","period":"this_year"},"category_name":"Coffee","preview":true} — see what would change, and get a tokenannotate {"action":"categorize","filter":{"party":"Starbucks","period":"this_year"},"category_name":"Coffee","token":"<token from the preview>"} — make exactly that changeGuardrail: A filter with no dates covers all time. Scope it, and check the range the preview echoes.
admin {"entity":"rule","action":"preview","description_pattern":"BLUE BOTTLE","set_category_name":"Coffee"} — every past transaction the rule would catch, and a tokenadmin {"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 arriveGuardrail: Match on the bank's description, not the merchant name: merchant names can change on a resync.
query {"recurring":true} — every bill and subscription, with its next date and amountadmin {"entity":"recurring_series","action":"update","id":"<series id>","active":false} — stop tracking one that endedGuardrail: Deactivating stops the forecast counting it; it cancels nothing with the merchant.
query {"forecast":true,"scenario":{"add":[{"name":"New car payment","amount":450,"freq":"monthly"}]}} — the projected balance with and without the new paymentGuardrail: Nothing is saved: a scenario is a what-if on top of the forecast.
query {"plan_status":true} — income, spending and big events against the plan, and what's running ahead or behindGuardrail: A real change in plans is a plan revision (with a reason), not a fudged category.
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 conversationadmin {"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 explainsadmin {"entity":"document","action":"substantiate","start":"2026-09-01","end":"2026-09-30"} — which charges in the month still have nothing filed against themGuardrail: Linking is explicit: name the charge. Nothing is matched for you from the amount or the merchant.
admin {"entity":"document","action":"request_upload","filename":"statement.pdf"} — an upload address for the statement PDFadmin {"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 itselfadmin {"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 printedGuardrail: Link the statement to its account, or there is nothing to check it against. It compares lines, not balances.
query {"digest":true} — what to flag todayquery {"detail":true,"since":"2026-10-07T08:00:00.000Z"} — only what arrived since the last run; store the as_of it returns for next timeGuardrail: Both are reads. Ask the person before any annotate or admin call a schedule wants to make.
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.
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.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.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.bank_connection sync and list say when the bank last sent new or changed transactions (last_new), beside when we last checked (last_sync).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.accounts tool, else send the person to setup.url.vested_through is the last vested tranche.admin: a rule gets a default name, and bank_connection gains list.sign field, and compare the change in cash (net_vs_prior).limit/cursor.ign:true and show the bank memo as raw.as_of is the moment of the read, so since picks up exactly where the last run stopped.In practice you just describe what you want in natural language. These show the underlying query tool parameters for reference.
Returns income, expenses, and net totals with month-over-month comparison and an income-allocation breakdown.
{
"period": "this_month",
"compare": "prior_period"
}Lists all detected recurring charges with frequency, amounts, and a 60-day forecast of upcoming payments.
{
"recurring": true,
"forecast_days": 60
}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"
]
}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
}Searches transaction descriptions across all time, returning individual transactions with amounts, dates, and categories.
{
"detail": true,
"search": "Amazon",
"period": "last_3_months"
}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.