MCP Server
DayZero exposes a Model Context Protocol (MCP) server that lets AI assistants — Claude, Cursor, and other MCP-compatible clients — interact with your accounting data through natural language.
The server is mounted at /mcp and uses the Streamable HTTP transport. It supports two authentication methods:
- OAuth 2.1 (sign in with your browser) — the standard MCP flow. Your client discovers the auth server, registers itself, and opens a browser for you to log in and approve access. No tokens to copy.
- Bearer API token — paste a long-lived DayZero API token into your client config. Simple and good for headless setups.
Just want to connect? Add
https://api.ondayzero.com/mcpto Claude or Cursor with no credentials and you'll be prompted to sign in to DayZero in your browser and approve access. See Connecting Claude Desktop or Connecting Cursor below.
What You Can Do
The MCP server exposes 96 curated tools across core accounting domains. Tools marked (write) mutate data and require write permission; everything else is a read-only query. Call list_mcp_capabilities for a compact category map.
| Category | Highlights | Description |
|---|---|---|
| Discovery | list_my_businesses, list_mcp_capabilities, search_entities |
Find businesses and entities without knowing IDs upfront |
| Snapshots | get_daily_brief, get_ar_snapshot, get_aged_payables, get_ap_snapshot, get_payment_priority_suggestions, get_uncategorized_summary, get_month_end_package |
High-signal summaries — prefer these over paging huge lists |
| Chart of Accounts | list_ledgers, get_ledger |
Browse and inspect ledger accounts |
| Transactions | list_transactions, update_transaction, categorize_transaction, recategorize_by_counterparty, mark_transactions_reconciled (write) |
Search, review, categorize, and mark bank lines reconciled |
| Invoices (AR) | create_invoice, finalize_invoice, send_invoice, mark_invoice_paid, void_invoice, credit memos, payments (write) |
Full AR lifecycle when Stripe is connected (or demo) |
| Bills (AP) | create_bill, approve_bill, mark_bill_received, update_bill, cancel_bill, vendor credits, payments (write) |
AP approval, receive, and payment workflows |
| Estimates | list_estimates, get_estimate, accept_estimate, convert_estimate (write) |
Quote → accept → convert, then create_invoice |
| Journal Entries | list_journal_entries, create_journal_entry (write) |
Read and create journal entries |
| Customers & Vendors | list_*, get_*, create_*, update_* (write) |
CRUD-style contact management |
| Credit Memos & Vendor Credits | list_*, get_* |
View credits and application history |
| Delayed Charges | list_delayed_charges, get_delayed_charge |
Unbilled charges and credits |
| Tags, Budgets, Tax, Products | list_tag_groups, list_budgets, get_budget_vs_actual, list_tax_*, list_products |
Supporting master data |
| Close & Quality | list_anomalies, dismiss_anomaly, list_attention_items, mark_attention_read, month-end packages |
Anomalies, inbox, and close workflows |
| Audit Trail | get_entity_audit_trail |
Change history for any entity |
| Reports | list_report_types, generate_report, get_report |
P&L, balance sheet, and other exports |
| Reconciliation | list_reconciliations, get_reconciliation |
Bank reconciliation status |
| Analytics | get_financial_overview, get_top_expenses, get_cash_flow_totals, get_profit_trends, get_transaction_summary |
Server-side aggregations for analytical questions |
You don't need to know your business ID upfront. The business_id parameter is optional on every tool — the server automatically resolves it:
- One business — selected automatically, zero friction.
- Multiple businesses — the server responds with your business list so the assistant can ask which one to use.
- Explicit ID — you can always pass a
business_iddirectly if you prefer.
The assistant remembers your selection for the rest of the conversation. Say "switch to [business name]" at any time to change.
Note: All monetary amounts are in cents (e.g. $150.00 =
15000). IDs are UUID v7 strings. Pagination is cursor-based — pass thenext_cursorvalue from a response ascursorto get the next page. All date parameters use YYYY-MM-DD format.
34 write tools mutate data (journal entries, transactions, bills, invoices, payments, contacts, credit memos, reconciliation, anomalies, attention, and more). They require the write permission (a viewer-role token cannot call them). The assistant should confirm details with you before calling them.
Every write tool accepts an optional dry_run=true parameter. When set, the server returns a preview of what would happen without committing changes — useful for confirmation flows.
Note:
create_invoicerequires Stripe Connect (or a demo business) — callget_invoice_create_requirementsfirst. Typical flow:create_invoice→finalize_invoice→send_invoiceorlink_invoice_payment.mark_invoice_paidis for manual paid status without a bank match. AP:approve_bill→mark_bill_received(needs expenseledger_id).get_aged_payablespairs withget_ar_snapshot;get_payment_priority_suggestionsuses AI and may take a few seconds.
Reports follow a three-step workflow: list_report_types → generate_report → poll get_report until its status is completed.
Working with Large Datasets
List tools return a total field showing total matching records. Use this to decide how to proceed:
- Analytical questions ("what did we spend the most on?", "are we profitable?", "how much revenue last quarter?") — use the analytics tools (
get_financial_overview,get_top_expenses,get_cash_flow_totals,get_profit_trends,get_transaction_summary). These compute summaries server-side and return small payloads regardless of data volume. - Under ~100 matching records — paginate through them if you need individual details.
- Over ~100 matching records — narrow with filters (date range, search text, ledger_id, status) or use analytics tools. Don't page through thousands of records.
- Full exports — use
generate_reportto create a downloadable file.
Strategy: summarize first, drill down second. Start with aggregate tools to understand the big picture, then use list tools with filters to examine specific subsets.
Prerequisites
- A DayZero account with API access enabled
- Either a DayZero login (for the OAuth browser flow) or an API token (see Authentication)
Connecting Claude Desktop
Option A — OAuth (recommended). Add the server with just its URL. Claude registers itself, opens a browser for you to sign in to DayZero and approve access, then stores the token automatically:
{
"mcpServers": {
"dayzero": {
"url": "https://api.ondayzero.com/mcp"
}
}
}Option B — API token. Paste a token instead of signing in:
{
"mcpServers": {
"dayzero": {
"url": "https://api.ondayzero.com/mcp",
"headers": {
"Authorization": "Bearer dz_your_token_here"
}
}
}
}Config file location:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Restart Claude Desktop after saving. You should see DayZero tools appear in the tools menu.
Connecting Cursor
In Cursor, go to Settings > MCP Servers and add a new server:
- Name: DayZero
- URL:
https://api.ondayzero.com/mcp
Leave the headers blank to use OAuth — Cursor opens a browser for you to sign in and approve. Alternatively, set a header Authorization: Bearer dz_your_token_here to use an API token.
Connecting Other MCP Clients
Any MCP client that supports Streamable HTTP transport can connect. The server implements the full MCP authorization spec, so compatible clients configure themselves automatically from the server URL alone:
- RFC 9728 Protected Resource Metadata —
https://api.ondayzero.com/.well-known/oauth-protected-resource - RFC 8414 Authorization Server Metadata —
https://api.ondayzero.com/.well-known/oauth-authorization-server
These advertise the authorization server, supported scopes, PKCE methods, and the authorize / token / registration endpoints.
Authentication
You can authenticate in one of two ways.
OAuth 2.1 (sign in with DayZero)
This is the standard MCP authorization flow and requires no manual token handling:
- The client connects to
/mcpand receives a401with aWWW-Authenticateheader pointing at the protected-resource metadata. - It discovers the authorization server (
/.well-known/oauth-authorization-server). - It dynamically registers itself (RFC 7591) at
/oauth2/register— no pre-shared client credentials needed. - It opens your browser to
/oauth2/authorize, where you sign in to DayZero and approve the requested access. - It exchanges the resulting code (with PKCE, RFC 7636) at
/oauth2/mcp/tokenfor an access token and refresh token. - The access token is sent as
Authorization: Bearer …on every MCP request, and refreshed automatically when it expires.
Access is scoped (mcp:read, mcp:write, offline_access) and can be revoked anytime from Settings > API Tokens.
Bearer API token
Alternatively, send a DayZero API token directly in the Authorization header — you do not pass a token to individual tools:
Authorization: Bearer dz_your_token_hereTokens are DayZero API keys (JWTs) generated from Settings > API Tokens. Both OAuth access tokens and API tokens are accepted.
If the token is missing or invalid, the server returns a 401 response with a WWW-Authenticate header pointing to the resource metadata endpoint.
Example Conversation
Once connected, just start asking questions — no setup required:
Single business (most common):
You: What invoices are overdue?
Assistant: You have 3 overdue invoices totaling $4,250.00…
The server auto-detected your business behind the scenes. No IDs needed.
Multiple businesses:
You: Show me last month's transactions
Assistant: You have access to 2 businesses:
- Acme LLC — admin
- Beta Corp — viewer
Which one would you like to use?
You: Acme
Assistant: Here are Acme LLC's transactions for last month…
After you pick, the assistant remembers your choice for the rest of the conversation. Say "switch to Beta Corp" at any time to change.
More things you can ask:
- "List all bank accounts"
- "Show me the last 10 transactions from checking"
- "Generate a profit and loss report for Q1 2026"
- "Create a journal entry for $500 rent expense on March 1"
- "Search for anything related to Acme Corp"
- "Compare the operating budget to actuals this quarter"
- "What are our top expenses this year?"
- "Are we cash-flow positive this quarter?"
- "How have profit margins changed over the past 6 months?"
- "How many transactions came in last month?"
- "What should I look at today?" (Daily Brief)
- "Mark that Amazon transaction as reviewed"
- "Add a new vendor called Acme Hosting with email billing@acme.com"
- "Create a $250 bill from Acme Hosting due next Friday"
- "Finalize draft invoice #1042"
- "Email invoice #1042 to the customer"
- "How much do we owe vendors by aging bucket?"
- "Void invoice #1042"
- "Create a $25 credit memo for Acme and issue it"
- "Cancel the draft bill from Acme Hosting"
- "Mark these three bank transactions as reconciled"
- "What's blocking us from creating invoices via API?"
Troubleshooting
| Problem | Solution |
|---|---|
| Tools don't appear | Verify the URL is https://api.ondayzero.com/mcp and restart the client |
| Browser sign-in doesn't open | Ensure your client supports OAuth; otherwise use the Bearer API token method |
| Stuck re-authorizing | Your registered client may have expired — the client re-registers automatically; just retry the connection |
| 401 Unauthorized | Re-run the OAuth sign-in, or check that your API token is valid and not expired |
| 403 Forbidden | Your token doesn't have access to the specified business_id |
| 404 Not Found | Ensure the URL is exactly /mcp — not /mcp/mcp or /api/mcp |
| Connection timeout | Ensure the DayZero API is reachable from your network |
What's Next?
- Authentication — managing API tokens
- First Request — getting started with the REST API
- Reports — available report types and formats