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/mcp to 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_id directly 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 the next_cursor value from a response as cursor to 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_invoice requires Stripe Connect (or a demo business) — call get_invoice_create_requirements first. Typical flow: create_invoicefinalize_invoicesend_invoice or link_invoice_payment. mark_invoice_paid is for manual paid status without a bank match. AP: approve_billmark_bill_received (needs expense ledger_id). get_aged_payables pairs with get_ar_snapshot; get_payment_priority_suggestions uses AI and may take a few seconds.

Reports follow a three-step workflow: list_report_typesgenerate_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_report to 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

  1. A DayZero account with API access enabled
  2. 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:

json
{
  "mcpServers": {
    "dayzero": {
      "url": "https://api.ondayzero.com/mcp"
    }
  }
}

Option B — API token. Paste a token instead of signing in:

json
{
  "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 Metadatahttps://api.ondayzero.com/.well-known/oauth-protected-resource
  • RFC 8414 Authorization Server Metadatahttps://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:

  1. The client connects to /mcp and receives a 401 with a WWW-Authenticate header pointing at the protected-resource metadata.
  2. It discovers the authorization server (/.well-known/oauth-authorization-server).
  3. It dynamically registers itself (RFC 7591) at /oauth2/register — no pre-shared client credentials needed.
  4. It opens your browser to /oauth2/authorize, where you sign in to DayZero and approve the requested access.
  5. It exchanges the resulting code (with PKCE, RFC 7636) at /oauth2/mcp/token for an access token and refresh token.
  6. 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:

plaintext
Authorization: Bearer dz_your_token_here

Tokens 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:

  1. Acme LLC — admin
  2. 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?