Cash Runway MCP server
@cashrunway/mcp is a Model Context Protocol server that hands your Cash Runway data to any MCP-capable AI client (Claude Desktop, Cursor, Continue, your own agent harness) over stdio. The server is read-only — it never writes to your Cash Runway account.
Once configured, you can ask the agent things like:
- "How's my business doing today?"
- "What's my YTD revenue?"
- "Who are my top 5 customers?"
- "What invoices are overdue?"
- "How much have I spent on AWS this quarter?"
The server registers 12 tools that map 1:1 onto the Agent API. LLMs are biased toward the first few tools in the list — the three new summary tools sit at the top so an agent asking "how much…" or "who's top…" reaches for an aggregate endpoint before paging through individual records (50× cheaper on tokens).
Install
npm install -g @cashrunway/mcpRequires Node.js ≥ 20. Or run without installing globally via npx -y @cashrunway/mcp.
Get an API token
Sign in to Cash Runway.
Open Settings → API keys and click Create API key.
Give the key a label (e.g. "Claude — finance assistant").
Tick the scopes the agent needs. Pick the narrowest set that does the job — every scope is a separate decision:
Scope What it unlocks READ_BANKBank accounts and balances. READ_FORECASTCash position + 13-week forecast. READ_PIPELINEProjected revenue (pipeline view). READ_INVOICESAR invoices + AP bills, with optional line-item expansion. READ_CONTACTSCustomer / supplier list and the per-contact drill (LTV, cadence, ABC). READ_SUMMARYThe composite daily-summaryendpoint plus the three new aggregate summaries (revenue/summary,expenses/summary,contacts/summary). Strongly recommended starting point.READ_SENSITIVEDanger zone. Lifts the redaction filter on accounts / contacts the operator has flagged sensitive (wages, equity, director loans). Off by default — only enable for keys you fully trust. Copy the secret. The token starts with
cr_live_…and is shown once — Cash Runway stores a one-way hash and cannot reveal it again. See API keys for rotation, audit, and the sensitive-data toggle.
Configure your MCP client
The server reads two environment variables:
| Variable | When | Example |
|---|---|---|
CASHRUNWAY_API_URL | Always | https://api.cashrunway.ai |
CASHRUNWAY_API_KEY | Single company (most users) | cr_live_xxxxxxxxxxxxxxxxxxxx |
CASHRUNWAY_API_KEYS | Multiple companies (advanced) | {"acme":"cr_live_…","globex":"cr_live_…"} |
Set exactly one of CASHRUNWAY_API_KEY or CASHRUNWAY_API_KEYS — setting both is a configuration error.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"cashrunway": {
"command": "cashrunway-mcp",
"env": {
"CASHRUNWAY_API_URL": "https://api.cashrunway.ai",
"CASHRUNWAY_API_KEY": "cr_live_xxxxxxxxxxxxxxxxxxxx"
}
}
}
}If you'd rather not install globally, swap "command": "cashrunway-mcp" for "command": "npx" with "args": ["-y", "@cashrunway/mcp"]. Restart Claude Desktop — the tools appear under the 🔧 icon.
Cursor
Edit ~/.cursor/mcp.json (or the per-project .cursor/mcp.json):
{
"mcpServers": {
"cashrunway": {
"command": "cashrunway-mcp",
"env": {
"CASHRUNWAY_API_URL": "https://api.cashrunway.ai",
"CASHRUNWAY_API_KEY": "cr_live_xxxxxxxxxxxxxxxxxxxx"
}
}
}
}Continue (VS Code / JetBrains)
Edit ~/.continue/config.json:
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "cashrunway-mcp",
"env": {
"CASHRUNWAY_API_URL": "https://api.cashrunway.ai",
"CASHRUNWAY_API_KEY": "cr_live_xxxxxxxxxxxxxxxxxxxx"
}
}
}
]
}
}Tool reference
The 12 tools are registered in the order shown below. Tool ordering is load-bearing — LLMs preferentially pick the first tool that plausibly fits the question, so the three aggregate summary tools sit at the top.
Summary tools (start here)
| Tool | Purpose | Example prompt |
|---|---|---|
cashrunway_get_revenue_summary | AR totals + by-status + by-month + top customers, with no individual records. 50× cheaper on tokens than paging through list_invoices for aggregate questions. | "What's my YTD revenue and who are my top 10 customers?" |
cashrunway_get_expenses_summary | AP-side mirror of get_revenue_summary. | "What did I spend last quarter by month? Top 5 suppliers?" |
cashrunway_get_contacts_summary | Contact-population aggregates: byType, ABC distribution (80/20 tiering), top customers by LTV, top suppliers by spend. | "How many customers do I have? Show me my ABC tier breakdown." |
cashrunway_get_daily_summary | Composite "how's my business going today?" surface — cash today, last-7d activity, AR aging, 13-week forecast headline, prose narrative field. Best single-call session bootstrap for a generic assistant. | "How's my business doing today?" |
Snapshot tools
| Tool | Purpose | Example prompt |
|---|---|---|
cashrunway_get_status | Subscription, quota, key scopes, environment. Exempt from daily quota counting — safe to poll on session start. | "Am I close to my quota?" |
cashrunway_get_cash_position | Today's cash across all bank accounts, with per-account breakdown. | "How much cash do I have right now?" |
cashrunway_get_forecast | 13-week forecast — opening, inflow (with optional guaranteed/forecast split), outflow, net, closing. | "When do I run out of cash?" |
cashrunway_get_bank_accounts | List of configured bank accounts with reconciled + statement balances. | "What bank accounts is Cash Runway tracking?" |
List tools (for record-level drill-in)
| Tool | Purpose | Example prompt |
|---|---|---|
cashrunway_list_invoices | AR invoices, filterable by status / contact / date range. Supports autoPaginate: true (one call, up to 5,000 rows) and totals: true (byStatus + grandTotal across the full filtered set). Add lines: true for line-item expansion. | "List all overdue invoices for Acme Co." |
cashrunway_list_bills | AP bills — same shape and flags as list_invoices. | "Which bills are due this week?" |
cashrunway_list_contacts | Customers and suppliers; sort by revenue_desc / spend_desc / recent_desc. Same autoPaginate + totals flags (totals are count-only for contacts — no $ axis). | "List my top 20 customers by revenue." |
cashrunway_get_contact | Drill into one contact: LTV, payment cadence, payment-days median, ABC tier, last invoice / bill, recent paid invoices. | "Tell me about my relationship with Globex." |
A 13th meta-tool, cashrunway_list_companies, is only registered when the server runs in multi-tenant mode (see below).
Example prompts the agent should reach for first
These five questions cover ~80% of the agent's day-one usage. Each maps to one or two tools; the rest of the surface is for follow-up drills.
- "How's my business doing today?" →
get_daily_summary. - "What's my YTD revenue?" →
get_revenue_summary(nodateFrom/dateTo— defaults to the current financial-year YTD). - "Who are my top 5 customers?" →
get_revenue_summarywithtopN: 5, orget_contacts_summaryfor LTV-based tiering. - "What invoices are overdue?" →
list_invoiceswithstatus: "AUTHORISED"and atodate in the past. - "How much have I billed this month?" →
get_revenue_summarywithdateFrom/dateToset to the calendar month.
Pagination and token savings
Three flags / fields exist on the list tools to keep agent-driven calls cheap and correct:
totalCount(always present in every list response) — the pre-redaction count of rows matching the filter. Cheapest way to answer "how many?" without paying forautoPaginateortotals. May exceed the page array length when sensitive contacts/accounts are dropped — seeredactedItemCountfor the delta.autoPaginate: true— the server walks every page of the filtered set in one response, capped at 5,000 rows. If the cap is hit, the response setstruncated: trueand the agent should dropautoPaginateand fall back to cursor pagination. Replaces the cursor-loop pattern for "give me everything matching this filter".totals: true— folds an opt-inbyStatus+grandTotalaggregation across the full filtered set into the response (not just the current page). Lets an agent answer "how much is outstanding on AR?" without scanning rows. Multi-currency sets short-circuit tomixedCurrency: true(no fake cross-currency sum); matched sets above 100,000 rows settotalsTruncated: trueand the agent should narrow the filter.
When the question is aggregate ("how much / how many / who's top"), the summary tools are still the right answer — they're ~50× cheaper than even a totals: true list call because they don't ship row records at all.
Sensitive-data handling
By default, the server drops contacts and accounts the operator has flagged sensitive from list endpoints and rewrites their display name to "Sensitive contact" / "Sensitive account" on composite endpoints. Totals always reconcile against the operator's ledger — only names are gated. Each response carries a redactedItemCount so the agent knows it's operating on a masked view.
Issue a key with READ_SENSITIVE only when the agent genuinely needs full visibility (e.g. an internal CFO copilot). The scope cannot be added to an existing key — rotate-and-recreate to keep the grant auditable. See Sensitive accounts and contacts for the full audit trail.
Advisory partner keys (multi-client)
Advisors install the same @cashrunway/mcp server — they just authenticate with a partner key instead of a single-org user key. A partner key starts with crun_… and reaches every client org linked to your practice, where a cr_live_… user key is bound to one org. Partner keys are minted in the Partner Portal → API keys, not under an individual business's Settings → API keys. Wire it in exactly like a user key:
{
"mcpServers": {
"cashrunway": {
"command": "cashrunway-mcp",
"env": { "CASHRUNWAY_API_KEY": "crun_…" }
}
}
}Two tools power the partner flow:
cashrunway_list_orgs— call it on connect. It reportskeyKind(PARTNERvsUSER) and the reachable client orgs, returning{ keyKind, orgs: [{ id, name, slug }], summary }. For a partner key the summary reads "Connected as partner → N clients."; for a user key it lists the single org the key belongs to.cashrunway_get_daily_brief— takes a requiredorgargument (anidfromlist_orgs) and returns that client's latest daily brief. Partner keys are multi-client and have no implicit default org, so the agent must name the client per call.
Usage is metered to each client's account. Point the agent at one client at a time by passing its org.
Multi-tenant routing (advanced)
If you manage several Cash Runway companies from one MCP client, set CASHRUNWAY_API_KEYS to a JSON object of {company_key: cr_live_…}. Each tool then exposes an optional company argument that becomes required in multi-tenant mode, and a 13th tool cashrunway_list_companies is registered so the agent can discover the configured keys.
Company keys must match ^[a-z0-9_-]+$. Most users are better served by registering the binary once per company under different MCP names — see the MCP README for both patterns side by side.
Related
- API keys — provisioning, rotation, audit, sensitive scope.
- Agent API — endpoint surface and
daily-summarytour. - API Reference — full schema catalogue.
- CLI — same surface as a
cashrunwayshell binary.