No description
Find a file
Kerry Hatcher 90872e2be6
docs(claude-md): point the superproject link at Forgejo, not the stale GitHub mirror
The GitHub repo is deliberately kept as a mirror, but its main is frozen at
b08f1f0 (pre-thor-deployment) with a .gitmodules that still points every
submodule back at GitHub — the same trap finding 3 caught in install.md.
An agent following this link lands on stale code, not the current tree.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FGisjtKSjUcVGw1jX1Hf8M
2026-08-07 13:39:26 -04:00
.claude-plugin feat: cross-harness treasurer plugin 2026-08-03 14:41:37 -04:00
.plugin feat: cross-harness treasurer plugin 2026-08-03 14:41:37 -04:00
agents feat: cross-harness treasurer plugin 2026-08-03 14:41:37 -04:00
commands feat: cross-harness treasurer plugin 2026-08-03 14:41:37 -04:00
rules feat: cross-harness treasurer plugin 2026-08-03 14:41:37 -04:00
skills feat: cross-harness treasurer plugin 2026-08-03 14:41:37 -04:00
.gitignore Initial commit 2026-08-03 14:21:51 -04:00
.mcp.json feat: send a bearer token to the mcp endpoint 2026-08-03 20:51:52 -04:00
CLAUDE.md docs(claude-md): point the superproject link at Forgejo, not the stale GitHub mirror 2026-08-07 13:39:26 -04:00
LICENSE Initial commit 2026-08-03 14:21:51 -04:00
README.md refactor: point the mcp server at the api's new port 38081 2026-08-03 15:42:16 -04:00

openbooks-agent

Cross-harness agent plugin that turns any coding agent into the treasurer for a family or club: record money in plain language, get the statements for a meeting, and never see a debit or a credit.

Built to the Open Plugins layout, so the same directory installs as a Claude Code plugin, as skills via skills, or by any harness that scans the standard component directories.

It talks to openbooks-api over that API's MCP endpoint — so the ledger rules stay in the database and the agent just drives it.

Install

As a Claude Code plugin

This repository is its own marketplace, so there's nothing else to add:

/plugin marketplace add hatchertechnology/openbooks-agent
/plugin install openbooks@openbooks

That brings the skills, the treasurer agent, the /openbooks:record and /openbooks:report commands, and the MCP server connection in one step.

As skills, in any of 75+ agents

npx skills add hatchertechnology/openbooks-agent --all

Pick a subset with --skill recording-money --agent cursor, or list what's there with --list. This installs the skills only — wire up the MCP server yourself (see below).

Any other Open Plugins host

Point it at the repository. Components live in their default locations, declared in .plugin/plugin.json.

What's in it

Component
skills/recording-money Turns "we paid $45 for pizza from checking" into a balanced posting
skills/meeting-reports Monthly, quarterly, or annual statements, written to be read aloud
skills/checking-the-books Pre-meeting sanity check: duplicates, wrong periods, impossible balances
agents/treasurer.md Subagent that does bookkeeping end to end
commands/record.md /openbooks:record paid $45 for pizza from checking
commands/report.md /openbooks:report Q2 2026
rules/ledger.mdc The money invariants, for any harness that loads rules
.mcp.json The openbooks MCP server

Connecting to your ledger

The MCP server defaults to http://localhost:38081/mcp, which is where just run puts the API. Override it for a different host:

export OPENBOOKS_MCP_URL=https://books.example.com/mcp

Six tools come across: list_accounts, account_balances, income_statement, balance_sheet, list_transactions, and record_transaction.

The design rule

Nobody using this should have to know what a debit is. The skills carry the double-entry mechanics — integer cents, signed entries summing to zero, which account takes the positive side — so the agent handles it and answers in the language the user asked in.

The ledger itself is the backstop: a deferred constraint trigger in Postgres rejects any unbalanced transaction, so a confused agent gets an error rather than writing crooked books.

Manifests

Three, because three ecosystems expect different filenames for the same information:

  • .plugin/plugin.json — Open Plugins manifest
  • .claude-plugin/plugin.json — Claude Code plugin manifest
  • .claude-plugin/marketplace.json — one-entry marketplace pointing at this repo ("source": "./")

Keep the version and description in step across all three; claude plugin validate . and claude plugin tag both check that they agree.

Caveats

Early POC, matching the rest of OpenBooks: the API has no auth, so anything that can reach the MCP endpoint can write to the books. Don't point it at real money.