cd /news/ai-tools/openledger-local-first-double-entry-… · home topics ai-tools article
[ARTICLE · art-121815] src=github.com ↗ pub= topic=ai-tools verified=true sentiment=· neutral

OpenLedger – Local-first double-entry accounting, MCP-native (Apache 2.0)

OpenLedger, an Apache 2.0-licensed local-first double-entry accounting system with an SQLite backend and a Model Context Protocol (MCP) server exposing 15 tools, has been released by Attri Inc. The ledger enforces immutable transactions, contra-posting corrections, and an append-only audit log, and is designed to be queryable by both humans and AI agents via natural language. The project is part of a family of local-first agent services including open-crm and openwatch.

read3 min views2 publishedSep 7, 2026
OpenLedger – Local-first double-entry accounting, MCP-native (Apache 2.0)
Image: Michielbdejong (auto-discovered)

Local-first double-entry accounting, queryable by humans and agents.

SQLite-backed ledger. MCP server with 15 tools. Immutable transactions, contra-posting corrections, append-only audit log.

Part of a family of local-first agent services: open-crm (memory) · openwatch (observability) · openledger (money).

cd open-ledger
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python scripts/seed.py            # bootstrap a fresh dev DB with sample books
python run_mcp.py                 # stdio transport (default)

For Claude Code:

claude mcp add openledger -s user -- \
  /absolute/path/to/open-ledger/.venv/bin/python \
  /absolute/path/to/open-ledger/run_mcp.py

See docs/claude-connector.md for the full setup.

                ┌─────────────────────────────────────┐
                │          SQLite ledger              │
                │  accounts · transactions ·          │
                │  entry_lines · audit_log · settings │
                └──────────────────┬──────────────────┘
                                   │
                                   ▼
                         MCP server (stdio / SSE :8791)
                         15 tools — reads + safe writes
                                   │
                                   ▼
                         Claude Desktop, Claude Code,
                         agent frameworks

A layered architecture (SOLID): the transport, business rules, and persistence are separated, and each depends only on the layer's abstraction — not its implementation. Swapping SQLite for Postgres later touches only repositories/ and container.py.

src/
├── domain/          pure constants + typed error hierarchy (no I/O)
├── infrastructure/  Database connection, Unit of Work, id/clock helpers
├── repositories/    protocols.py  — narrow Reader/Writer contracts
│                    sqlite.py     — the only code that writes SQL (aiosqlite)
├── services/        accounts · ledger · reports (Strategy) · audit · query
│                    — the only layer with business rules / invariants
├── serialization.py response/error envelope helpers
├── container.py     composition root — wires SQLite repos into services
└── mcp_server.py    thin MCP transport adapter over the services
run_mcp.py           stdio entry point for Claude Desktop / Code
scripts/             seed.py (sample data) · schema.sql · smoke_test.py
tests/               service-level tests of the core invariants

Querying is raw parameterized SQL over aiosqlite (no ORM); all SQL lives behind the repository protocols, so services never see a query.

  1. Every transaction has ≥ 2 entry lines and sum(debits) == sum(credits) — enforced in the write path inside one DB transaction.
  2. All amounts are integer minor units (cents) . No floats anywhere.
  3. Transactions and entry lines are immutable . Corrections happen viareverse_transaction (contra posting), never UPDATE/DELETE.
  4. Every mutation writes an audit-log row in the same DB transaction .
Group Tools
Accounts list_accounts ·get_account ·get_balance ·get_account_ledger ·create_account
Journal get_transaction ·search_transactions ·post_transaction ·transfer_funds ·reverse_transaction
Reports get_trial_balance ·get_profit_loss ·get_balance_sheet
Audit get_audit_log
Escape hatch run_query (SQLSELECT only)
Env var Default Notes
OPENLEDGER_DB ./data/openledger.db SQLite path
MCP_TRANSPORT stdio (viarun_mcp.py ) stdio orsse
MCP_PORT 8791 SSE only
  • "How much cash do we have right now?"
  • "Show me the P&L for January."
  • "Are the books balanced?" (trial balance)
  • "Post a $250 cash sale for today."
  • "Move $500 from Wallet A to Wallet B."
  • "What was reversed recently, and why?"

Contributions welcome — see CONTRIBUTING.md and our Code of Conduct. Report vulnerabilities per SECURITY.md.

Licensed under the Apache License 2.0 — see LICENSE.

── more in #ai-tools 4 stories · sorted by recency
── more on @attri inc. 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/openledger-local-fir…] indexed:0 read:3min 2026-09-07 ·