SAYBOOKS
Saybooks is an ERP where your agent and your interface are the same system — one command registry, one rulebook, one audit trail. Tell Claude to ship the order, or click the button. Same command, same rules, same record of who did what and why.
two ways in
Quotes, orders, a credit gate that counts committed value, partial shipments and backorders, invoicing from what shipped, returns and credit notes, cash application, write-offs, statements, and an aging your controller would open. Plus the part nobody else has: you can hand routine work to Claude and every act it takes is logged, governed by the same rules, and refused in plain sentences when it shouldn't happen.
Every business act is declared once; the MCP tool, the UI form, the guard evaluation and the audit row are all derived — a contract test fails the build if they drift. The order-to-cash area is governed by a written spec: 21 invariants, 25 acts, 9 executable conformance scenarios. Modules own their tables, carry their doctrine, and are held to an 11-gate contributor contract. The endgame is competing implementations of the same area, certified by replaying the same scenarios.
one log, two kinds of hands
The purple rows are Claude, connected over MCP. The blue rows are a person, clicking. They are not two systems reconciled — they are one system, and the log can tell you, for any number in the books, who put it there and the reason they gave.
Refusals are logged too — a blocked agent action is exactly the thing you want to be able to review later.
| claude | confirm_order | ✗ refused — Credit check failed for Contoso Ltd… Short by $1500.00 |
| claude | invoice_shipped | INV-0002, $400.00 — billed what shipped, never what was ordered |
| claude | ship_order | the open 5 × Widget B — carrier left blank rather than invented |
| claude | receive_stock | “Supplier delivery received; no PO reference supplied” |
| sam | record_payment | “bank feed — no remittance advice yet” |
| claude | apply_payment | “remittance confirmed by their AP clerk on the phone” |
| sam | invoice_shipped | “billing what shipped, never what was ordered” |
rules that refuse, in sentences
That sentence is written once, in the rule itself. The greyed-out button shows it as a tooltip. The agent receives it verbatim and relays it. The test suite fails if they ever differ. And the rule's own documentation tells the agent what not to do next: don't split the order, don't invoice early, don't quietly raise the limit — report the shortfall and let a person decide. In our sessions, that is what it does.
why it can't drift
Each business act — confirm an order, apply a payment, write off a balance — is defined one time. The agent's tool, the form in the UI, and its validation are all generated from that single definition.
Enforced: a contract test asserts field-for-field parity. Hand-write a form and the build fails.The order-to-cash area is governed by a written spec: 21 invariants, every act, every lifecycle. Nine executable scenarios prove the implementation follows it — including the refusals.
See it: the demo's Spec tab walks every scenario as filled-in forms, one step at a time, running live.There is exactly one door to the books. A click and a tool call go through the same command, the same guards, the same transaction — and land in the same log, with an actor.
Including no: a refused command is recorded with who asked and why it was refused.a governed agent, end to end
try it in two minutes
Open the demo. You get a private set of books, seeded with a small distributor's morning: a part-shipped order, an open invoice, cash without a remittance, and one draft order left there deliberately — confirming it trips the credit gate. Try it.
Point your own Claude at the same books. The sidebar shows your command —
claude mcp add -t http saybooks https://saybooks.io/mcp/<your-sandbox> —
or add the URL as a custom connector on claude.ai. Then just talk:
“receive 20 Widget B and finish Northwind's order.”
Keep the Audit trail tab open while you do. Watching your own words become attributed, reasoned entries in a ledger — next to the human ones — is the product.
plainly