Skip to main content
This reference is for people configuring AI clients or building integrations. For day-to-day bookkeeping, start with the firm workspace guides. You can describe the job to your assistant without typing these tool names.
The hosted workspace exposes one tool surface over MCP at https://api.zenofirm.com/mcp — the same surface the console uses. Connect an AI client once, and everything below is available to it, scoped to your firm and to the companies your firm has connected. There are 125 of them, in the groups below.

The rules every tool follows

  • One shape for every answer. A tool returns its result, or it returns a refusal with a plain-language reason and a hint naming what to do instead. A tool never guesses its way past a problem.
  • Reads never pause. Reading your books, your context, your work log and your history stays available even when a subscription lapses. Only writes pause. Nobody loses sight of data their own ledger contains.
Envelope Response Contract
  • Planning writes nothing. qb_plan_batch, qb_plan_feed, qb_plan_cleanup, qb_import_iif and qb_import_table all resolve, check and render. None of them touches QuickBooks.
  • Only a person approves. No tool lets the AI approve a plan. A person approves with their own click, on the plan’s page in the Zeno console or on the plan page drawn inside the chat when they are signed in, and Zeno refuses to post a plan approved any other way. Saying “go ahead” in the chat is not an approval; the AI points you at the plan’s page. Your decision reaches the conversation through qb_await_verdict, so nobody has to go back and say “now post it”.
  • Apply refuses drift. If the plan or the exclusions changed after the verdict, applying is refused and a new plan is required.
  • The ledger stays authoritative. Read models are labeled copies for search and speed; every write goes through QuickBooks, never around it.
  • Single writes wait for you too. The few tools that change QuickBooks without a plan (voiding, deleting or editing one document, a recurring template that never posts on its own, tax setup, currencies, company settings, attachments, emailing a customer, reversing a run) write nothing on the AI’s first call. It hands you a link to an approval page, also listed on the console’s Plans page, that shows exactly what it will do, and only after you press Approve can that exact call run, once. The same goes for making a knowledge entry or playbook live, closing a period, and approving expense claims. A changed argument means a new approval.

Companies and connection

Reading the books

Most reads answer from the read models, which is why they are fast and why they carry a sync time. Reads marked live go to QuickBooks every call.

The batch loop

Everything that changes the ledger goes through these, in this order. The loop is described in full under plan, review, apply, reverse.

The queue

The queue that turns arriving transactions into coded postings. Statements and live bank connections fill the same queue, and nothing downstream can tell the two apart — which is why a firm can start on downloaded files and add a connection later without re-learning anything. These tools are the only road for coding a line: the console’s Bank feeds page shows the result and takes the verdicts. Working the queue is described in full under the queue.
qb_plan_feed produces an ordinary plan. A person approves it on its page and qb_apply_batch applies it like every other batch — a feed that posted its own entries would be a second path to the ledger, and a second path is a path where the gates are not.

Live bank connections

Optional, and with Stripe and Square below, the only parts of the workspace that reach a third party for transaction data. Setting one up is a settings job, not a daily one.

Stripe, Square and Helcim payouts

A payout reaches the bank as one number. Zeno reads what each one settled from Stripe or Square, once a person has connected the client’s account on Connections. The AI sets where each kind of money goes and plans each payout as one deposit split into its parts, on the bank line it caused. Helcim is recorded through a clearing account instead (why). A charge that pays an invoice, or a payment already recorded, settles it instead of counting as a sale again. Nothing posts until a person approves.

Expense claims

Turn a fed card account into a claim account and every charge on it grows a second lifecycle: draft, submitted by the cardholder, approved or sent back by a reviewer. Only an approved claim can reach a plan. See expense claims.
Approving a claim clears it for planning. It does not post anything. The plan qb_plan_feed builds from those lines still needs its own human approval before qb_apply_batch touches QuickBooks.

Receipts

The linked document is the claim’s evidence: it rides into submission, it stops the coverage report counting the charge, and after posting it is what qb_attach_document puts on the QuickBooks transaction.

Importing a file

The division of labour that makes a large import cheap and safe: the agent works out the shape from fifteen rows, and the engine applies it to every row deterministically. Reading fifty thousand rows through a model burns the customer’s tokens to produce a plausible-but-wrong ledger. See importing and migrating.
qb_import_iif returns warnings that matter: every block that did not reconcile against its own total, every transaction kind QuickBooks Online has no equivalent for, and every payment that will post unapplied. Read them before approving, not after.

Correcting what is already posted

QuickBooks voids invoices, sales receipts, payments, bill payments and check-type purchases only. Everything else is refused by name with delete as the named alternative, rather than letting QuickBooks answer Unsupported Operation. Prefer voiding wherever it is allowed. For a single document those three are the right tools; a batch of one makes an approval table lie about what it is. For duplicate bills, a bad import, a wrong-month batch, a mass recode (a select with a recode rule) or emptying a file, qb_plan_cleanup journals every document’s pre-image before anything happens, so qb_reverse_run puts it back — restoring a void or an edit onto the same document, and re-creating a deleted one under a new id, saying which it did. Emptying an old file is the largest case, and it is still this loop: widen the window with qb_sync_mirror (historyFrom the year the file was opened), then qb_plan_cleanup with a select — every kind, or one at a time — which plans the batch in dependency order (deposits, then the payments they hold, then the invoices and bills those pay, then the rest), five hundred documents a plan. Approve, apply, run the same selection again for the next batch. Keep customers and vendors active until their documents are gone. There is no bulk-delete app to add; the plan is the bulk tool, with an approval table and one reversible run per batch.

Names and lists

QuickBooks Online has no delete for list names. Deactivation is the only undo, and it is not destructive: the row leaves every picker, every posted transaction keeps it, and it can be brought back. Names are created, changed and retired through a plan a person approves, like everything else that touches the ledger.
QuickBooks refuses some of these itself: a vendor with open transactions cannot be deactivated, a bundle cannot be created through the API, and one name index is shared across customers, vendors, and employees, so a display name can only be used once. Each tool says so rather than failing obscurely.

Company settings

Recurring templates

A plan’s recurring section creates, replaces or deletes templates of every type QuickBooks Online supports, scheduled ones that post on their own included. QuickBooks Online cannot edit a template, so a change is a replace: the old template is deleted first and a new one created under a new id. QuickBooks Online’s API makes every template it creates active, so a template is paused in QuickBooks Online itself. The client’s check-up page in the console lists every template, for reading. See Recurring templates.

Sending and attachments

The firm inbox

Today

Today is a short brief for the team: decisions a person needs to make and material changes worth knowing. Assistants revise their own subjects as work moves and remove what is resolved; earlier versions stay in history. qb_guide with topic today has what belongs on the page and the format. Bodies take Markdown, or HTML fragments with inline CSS and SVG; scripts, forms and remote resources are not drawn.

Firm memory

A rule the AI saves is a suggestion until you make it automatic on the Rules page. Knowledge and playbooks wait for a person to confirm them, and editing one returns it to draft.
The run journal records what was posted in enough detail to reverse it. It cannot say which document a batch came from, what was decided, or what is still open — that is what the work log is for.

Asking the client

What the books cannot answer, asked of the client. See Questions for the client for the whole loop.

Questions from a business owner

A business viewer - a client’s owner the firm has given view-only access (see People and roles) - can leave questions for the firm from their own AI or the console. Their AI connection lists only the reads of their own companies’ books and the first two tools below; the firm’s AI answers with the third.

Reaching us

One tool writes to Zeno rather than to a client’s books.