Skip to main content
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 111 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.
  • 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.
  • Approval relays a human. qb_approve_plan records words a person actually said, under that person’s name; a verdict with no words, or one the agent tries to record as its own, is refused and nothing is saved. A clean plan is not an approval. An approval given in the console reaches the conversation through qb_await_verdict, which holds until the verdict is recorded, 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.
  • The immediate ones ask twice. The few tools that act on one document without a plan — voiding, deleting, editing in place, changing company-wide preferences, emailing a customer — require an explicit confirm: true rather than acting on a first mention.

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. It is approved with qb_approve_plan and applied with qb_apply_batch 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 the only part of the workspace that reaches a third party for transaction data. Setting one up is a settings job, not a daily one.

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

Sending and attachments

The firm inbox

Scheduled work

A recurring engagement can carry a playbook, and an agent on your own machine can work it on its cadence. Zeno cannot start that agent — it calls in — so the machine keeps a daily heartbeat and Zeno keeps the calendar. Binding a playbook and letting it run unattended are separate decisions, and a run still stops at a plan for a person to approve.

Firm memory

Rules apply themselves. 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.

Reaching us

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