Skip to content
PreviewThe Windows download and the public source are in preparation. Request early access.
2000Bring your own agent

Bring your own agent. Keep your own books.

Analytical Ledger runs an MCP server inside your own instance. Connect Claude, ChatGPT, OpenAI Codex or any MCP client and it can read your ledger and draft entries. It cannot post, approve, close or pay, and every call it makes is on the record.

  • ShippedThe MCP server, over HTTPS
  • PreviewOn the Windows app, hosted instances and your phone
Agent connection · ClaudeSample booksGranted by the owner at sign-in. Read and draft, nothing more.
Server
https://books.example.com/api/mcp
Scopes
ledger.read ledger.draft
Entities
Maple Street Holdings, Rentals, Birch Consulting, Household
Fiscal year
2026
Access token
1 hour, stored only as a hash
Refresh token
30 days, replaced each time it is used
Rate limit
60 requests a minute
Audit
every request, in mcp_access_audit
Settings → Agents → Disconnect revokes it.Owner approved

2100Any agent you already use

Your agent, not ours.

We don't sell you an AI. Analytical Ledger gives the agent you already pay for a set of scoped accounting tools over the Model Context Protocol (MCP), and your own instance decides what it may touch.

Claude

Claude Code, Desktop, web and mobile

Claude Code connects by URL from your terminal. On claude.ai, Claude Desktop and the Claude mobile app, it is a custom connector you add once.

ChatGPT

ChatGPT on the web and your phone

Add Analytical Ledger as a custom MCP server on the web, then use it in the mobile app. A workspace admin may need to allow it first.

Codex

OpenAI Codex

Point the Codex CLI at your instance in its config file and log in with OAuth. Good for working against your books from a terminal.

MCP

Any MCP client

Streamable HTTP at /api/mcp, OAuth with S256 PKCE and dynamic client registration. There is no API key to paste anywhere.

2200Connecting

Connect once. Revoke in one click.

Add a card for your agent in Settings, give your agent the server address, then sign in and consent in the browser. You choose the scopes, the entities and the fiscal year it sees. Pick your agent to see the real setup.

Your agent

Where your books live

Claude CodePreviewThe Windows app's agent connection is in preview.

1 · In Analytical Ledger

Settings → Agents: add the Claude card. Read is the default; choose Read + Draft only if you want drafts.

2 · Terminal

claude mcp add --transport http ledger http://127.0.0.1:3000/api/mcp
  1. 3Open Claude Code and run /mcp.
  2. 4Select ledger and sign in to Analytical Ledger in the browser.
  3. 5Check the entities, fiscal year and scopes, then consent.
Replace the sample address and port with yours. Never paste a token into a config file.

Ask for the current context first (al_current_context) and confirm the entities and year before you ask about money. The full connection guide

2300Your agent in your pocket

Your agent, in your pocket.

Connect once on the web and the connection follows your Claude or ChatGPT account to your phone. Ask about cash, the close or a bill from anywhere. Anything your agent drafts waits for a person in the app.

Ask from your phone

Sample books, fictional entities. The tool names are the real ones your agent sees.

Your agent

Connected to Analytical Ledger · read, draft

How much cash do we have across everything?

called al_trial_balance
scope ledger.read · consolidated · cash accounts

$184,310.22 across your entities: Maple Street Rentals $61,902.40, Birch Consulting $88,115.07 and the Household $34,292.75. Intercompany balances are eliminated in this view.

Your instance · agent access log

9:41al_trial_balanceok

Your instance · approvals

Nothing waiting. Agents can draft; only people post.

HostedPreview

On a hosted instance

Your instance already has its own HTTPS address, so there is nothing to set up for the phone. Managed hosting is an invite-only beta.

ServerShipped

On your own server

The agent connection over HTTPS ships today on any deployment your phone's agent can reach. Running your own server waits on the public source release.

TunnelPreview

On the Windows app, through a tunnel

Tailscale Funnel or Cloudflare Tunnel can give the local app a public HTTPS address. For advanced users: the computer has to stay on, and a tunnel is not a lock, so keep sign-in on and grant read first.

We haven't verified every phone client and plan end to end. If the connector doesn't appear on your phone, use the web client; a tunnel can't add a feature your plan lacks.

Phone access guide →

2400What it can read

Every tool, by name.

Two scopes, and nothing between them. ledger.read opens the read tools, limited to the entities and fiscal year you chose at consent. ledger.draft adds exactly one tool, and that tool cannot post.

R1

Context and references

ledger.read
  • al_current_contextThe resolved view, entities, fiscal year and the caller's role.
  • al_entities_listEntities in the authorized view.
  • al_resolve_ledger_refsResolve a pointed-at ledger reference or budget fact.
  • al_navigation_targetAn allowed link back to a scoped record in the app.

R2

Accounts and the journal

ledger.read
  • al_chart_of_accountsAccounts in the granted entities.
  • al_accounts_searchCandidate accounts for a phrase.
  • al_account_registerThe register for one account.
  • al_transactions_searchPosted lines in an exact date window.
  • al_journal_listA bounded list of journal entries.
  • al_journal_detailOne journal entry and its lines.
  • al_pending_approvalsJournal approvals waiting, without approving them.

R3

Statements and planning

ledger.read
  • al_trial_balanceThe trial balance for the granted fiscal year.
  • al_profit_and_lossProfit and loss for the granted view and year.
  • al_board_packKPIs and statement headlines for the year.
  • al_budgets_listBudgets and forecasts in scope.
  • al_budget_vs_actualA budget against actuals, for the year or a month.
  • al_budget_forecastA budget's driver and overlay forecast.
  • al_cash_forecastThe 13-week cash forecast.

R4

Banking, reconciliation and close

ledger.read
  • al_import_batchesImport batch status, without document bodies.
  • al_import_stagingStaging and categorization status for one batch.
  • al_import_exceptionsUncategorized, unmapped, duplicate and failed imports.
  • al_diagnostics_review_backlogHow much import review is waiting.
  • al_reconciliations_listReconciliations in scope.
  • al_reconciliation_stalenessCash accounts with stale or missing locked reconciliations.
  • al_periods_listPeriods in the granted fiscal year.
  • al_period_close_statusWhat is blocking a period's close, with evidence.

R5

Payables and receivables

ledger.read
  • al_ap_billsAccounts-payable bills.
  • al_ap_vendorsVendors, without tax IDs, legal names or tax addresses.
  • al_ap_agingPayables aging buckets.
  • al_ar_invoicesAccounts-receivable invoices.
  • al_ar_customersCustomers, without contact addresses.
  • al_ar_agingReceivables aging buckets.

R6

Assets and loans

ledger.read
  • al_fixed_assetsFixed assets and their book values.
  • al_amortization_schedulesAmortization schedules.
  • al_loansLoans, schedules and balances.
  • al_loan_scheduleOne loan's unpaid installments.

R7

Tax

ledger.read
  • al_tax_rollupA Schedule C or Form 1120 rollup with supporting accounts.
  • al_tax_1099_worksheetReportable vendor totals and boxes, without taxpayer IDs.
  • al_tax_1099_readinessIncomplete 1099 information and filing status.
  • al_tax_navigation_targetAn allowed link to a scoped tax report.

R8

Requests you queue for the agent

ledger.read
  • al_agent_run_claimPick up this connection's oldest queued request from you.
  • al_agent_run_reportReport back on it. Attaching a draft also needs the draft scope.

D1

The one write

ledger.draft
  • al_journal_create_draftOne balanced, unposted journal draft. Retrying never makes a second one.
Needs both scopes. Posts nothing.Draft

Not on the list, under any scope

403 · This agent cannot use that tool.
  • Posting an entry
  • Approving an entry
  • Closing or locking a period
  • Payments
  • Tax filing
  • Arbitrary SQL
  • Running code on the server
  • Batch drafts
  • Users and roles
  • Categorization rules

2500Try the grant

Allowed, refused, and written down.

Choose what the owner grants, then make calls as the agent. Calls inside the grant answer. Everything else is refused with a 403, and both land in the audit log the same way.

1 · The owner grants

scope: ledger.read

2 · The agent calls

3 · mcp_access_audit

No calls under this grant yet. A change of scope always means a new sign-in and consent, so the log starts fresh.

Each row also keeps the connection, a hash of the arguments and any draft id. Raw tokens and arguments are never stored.

Sample books, fictional entities. The tool names, status codes and refusal message are the server's own.

2600Drafts wait for a person

It drafts. You post.

The most an agent can write is one balanced, unposted journal entry. From there it is an ordinary draft: someone with the right role reviews it, approves it and posts it in the app, through the same checks as any entry.

JE-1042Oct 24, 2026 · Maple Street Rentals LLCOctober rent and water, bills due this week
AccountDebitCredit
6100Rent expense2,400.00
6230Utilities310.50
2000Accounts payable2,710.50
Totals2,710.502,710.50
Draft · by your agentBalanced
A sample draft entry created by an agent, balanced and waiting for approval.
  1. 01

    The agent drafts

    al_journal_create_draft saves one balanced draft against the entities in the grant. A retried call doesn't create a second one.

  2. 02

    You review it in the app

    The draft records who created it. Check the lines and the evidence before anything posts. Nothing has touched the books yet.

  3. 03

    A person approves and posts

    Posting runs the balance check and the period gate in the app and again in Postgres. No agent token can post or approve, even if a model asks it to.

  4. 04

    Posted is permanent

    If it was wrong after all, you correct it with a reversing entry, so the draft, the posting and the fix all stay on the record.

Queue work for your agent. You can also leave a request in the app. The agent picks it up with al_agent_run_claim, reports back with al_agent_run_report, and its report appears in Activity with any draft it attached.

2700Controls

Scoped, limited, revocable.

Each agent gets its own connection, and the owner holds every key. These limits are enforced by your instance, whatever the agent or its provider does.

2710

One connection per agent

Each has its own scopes, entities and fiscal year. Read is the default. A connection never gains draft access on its own; changing scope means disconnecting and authorizing again.

2720

Bound to an owner

Only an active owner can consent. Deactivate or demote that owner, or remove their access to an entity, and the agent's access goes with it.

2730

Rate-limited

60 requests a minute per token, counted in the database so a restart doesn't reset it. Past the limit, the agent gets a 429 and Retry-After: 60.

2740

Tokens kept short and hashed

Access tokens last an hour and are stored only as hashes. Requests carrying a foreign browser origin are refused, and callbacks must match the registered address exactly.

2750

Revoked in one click

Settings → Agents → Disconnect revokes the connection, its tokens and unused codes, and ends unfinished runs. Remove it from the client too.

2760

Every call on the record

mcp_access_audit keeps the tool, the outcome, the HTTP status, the connection, a hash of the arguments and any draft id, for allowed and refused calls alike.

What leaves your instance. Your agent's provider receives the financial data its tools return to it, under that provider's retention policy, so review it before you connect. Memos, vendor names and queued requests reach the agent as data, never as instructions that widen its access.

Everything that leaves your instance →

2800Fair Source

Your data, and your code.

Analytical Ledger is Fair Source (FSL-1.1-ALv2), not open source. The source is yours to read, run and change, so the same agent that reads your books can also read the software that keeps them.

2810

Ask how a number is made

Point Claude Code or Codex at the repository and ask how a report is calculated or which trigger refuses an entry. The answer is in code you can read.

2820

Change it to fit how you work

Add the report you wish it had, or change a screen, on your own copy. The license allows any use except offering it as a competing product or service.

2830

Apache 2.0 after two years

Each release converts to Apache 2.0 on its second anniversary, so no version stays restricted.

Preview The public source release is in preparation. What Fair Source permits

c/fCarried forward

Bring your agent. Keep the pen.

Ask for early access to the Windows app and the source, or request a hosted instance your phone can reach.

Bring your own agent | Analytical Ledger