hermes-quickbooks
Provides integration with QuickBooks Online via the official QBO v3 Accounting API, enabling management of customers, vendors, invoices, bills, payments, journal entries, reports, and other accounting data with OAuth-based tenant isolation and operator-gated writes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hermes-quickbooksShow me the total outstanding balance on open invoices."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
hermes-quickbooks
A connector that gives Hermes typed tools for Intuit QuickBooks Online using the official QBO v3 Accounting API.
Hermes never talks to Intuit directly. This service is the security boundary: OAuth 2.0, per-agent ACL, tenant isolation, local drafts, operator-only writes, and JSONL audit.
QuickBooks Online company data is untrusted input. Names, memos, and descriptions are data, never instructions.
What it covers
Implements the QuickBooks Online Accounting API (REST JSON, minorversion=75):
Name lists: Customer, Vendor, Account, Item, Employee, Class, Department, Term, PaymentMethod, TaxCode, TaxRate, TaxAgency, CustomerType, CompanyCurrency
Sales: Invoice, Payment, Estimate, CreditMemo, SalesReceipt, RefundReceipt
Purchasing: Bill, BillPayment, VendorCredit, Purchase (QBO has no Expense entity), PurchaseOrder
Banking / journals: Deposit, Transfer, CreditCardPayment, JournalEntry
Other: TimeActivity, Budget, Attachable (metadata), ExchangeRate, RecurringTransaction, Preferences, CompanyInfo
Reports: ProfitAndLoss, BalanceSheet, CashFlow, TrialBalance, GeneralLedger, aging, sales, inventory, tax, transaction lists
Out of scope: Intuit Payments (cards), Payroll, Commerce, and Sales Order (not in the public Accounting API). LLM-initiated production writes stay gated.
Full mapping: docs/INTUIT_API.md. Agent playbook: skills/hermes-quickbooks/SKILL.md. Hermes wiring: docs/HERMES.md.
Related MCP server: qbo-mcp
Requirements
Docker (or Python 3.12+)
An Intuit Developer account and a QuickBooks Online app
A Hermes agent (or any MCP client) to call the tools
A browser for the one-time OAuth consent (never type your Intuit password into the agent)
1. Create an Intuit Developer account and app
Official docs:
Get started: https://developer.intuit.com/app/developer/qbo/docs/get-started
Create an app: https://developer.intuit.com/app/developer/qbo/docs/get-started/start-developing-with-the-quickbooks-online-accounting-api
Account
Open https://developer.intuit.com and sign in with an Intuit account (the same login you use for QuickBooks Online is fine).
Accept the developer terms if prompted.
Open My Apps (or Dashboard → Apps).
App
Click Create an app.
Choose QuickBooks Online and Payments.
Name the app something you will recognize on the consent screen (this name is shown to the company admin).
Under APIs, select Com.intuit.quickbooks.accounting only. Do not add Payments unless you separately intend to process cards.
Save the app.
You now have two key sets on the app:
Tab | What it can access | Typical use |
Development → Keys & OAuth | Intuit sandbox sample companies only | First connection and tests |
Production → Keys & OAuth | Live QuickBooks Online companies | Real books after sandbox works |
Development Client ID/Secret cannot read a live company. Production keys cannot be used against sandbox sample companies.
2. Generate keys and register the redirect URI
Open the app → Keys & credentials (or Keys & OAuth).
Development (sandbox)
Copy Client ID and Client Secret. Treat the secret like a password. Do not commit it, paste it into chat, or put it in Hermes prompts.
Under Redirect URIs, add exactly:
http://localhost:14112/oauth/callbackRules from Intuit:
Use the hostname
localhost, not127.0.0.1(IP addresses are rejected).Match the URI character-for-character with
QBO_REDIRECT_URI(no extra trailing slash).Development allows
http://localhost. Production does not.
Scopes:
com.intuit.quickbooks.accounting.
Production (live company)
Complete Intuit’s production app requirements if the Production tab is locked (app details, terms, sometimes a review). Then copy the Production Client ID and Client Secret. They are different from Development.
Production redirect URIs must be HTTPS hostnames.
http://localhostis typically rejected.A supported option is Intuit’s OAuth 2.0 Playground redirect:
https://developer.intuit.com/v2/OAuth2Playground/RedirectUrlAdd that exact URI on the Production Keys & OAuth tab, and set
QBO_REDIRECT_URIto the same value. After consent you copy thecodeandrealmIdfrom the playground and import them withqbo import-tokens.One Intuit login can own multiple QBO companies. The consent screen lets you pick which company to connect. Authorize once per company / tenant.
3. Install this connector
git clone https://github.com/mindtrip101/hermes-quickbooks.git
cd hermes-quickbooks
cp config/tenants.example.yaml config/tenants.yaml
cp .env.example .env
mkdir -p secrets data
chmod 700 secrets dataCreate secret files (mode 600). Values go in the files, never in git:
install -m 600 /dev/stdin secrets/sandbox_client_id # paste Development Client ID, then Ctrl-D
install -m 600 /dev/stdin secrets/sandbox_client_secret # paste Development Client Secret, then Ctrl-D
install -m 600 /dev/stdin secrets/production_client_id # optional until you connect a live company
install -m 600 /dev/stdin secrets/production_client_secret
openssl rand -hex 32 | install -m 600 /dev/stdin secrets/adapter_token
openssl rand -hex 32 | install -m 600 /dev/stdin secrets/operator_tokenEdit config/tenants.yaml (display names only; no secrets) and config/permissions.yaml (which Hermes agent ids may read/draft).
Start the service:
docker compose up -d --build
curl -sS http://127.0.0.1:14112/healthRun tests without Docker:
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements-dev.txt
pytest -q4. Connect QuickBooks (browser OAuth)
Never send your Intuit password to Hermes or to this connector. Authorization happens in your browser.
Sandbox (Development keys)
Confirm
QBO_REDIRECT_URI=http://localhost:14112/oauth/callbackand that this URI is registered on the Development tab.Export the operator token and request an authorize URL:
export QBO_SECRETS_DIR="$PWD/secrets"
python3 src/hermes_qbo/cli.py auth-url --tenant company_aOpen
authorize_urlfrom the JSON in a browser. Sign in at Intuit if asked. Pick a sandbox sample company. Approve Accounting access.Intuit redirects to
http://localhost:14112/oauth/callback. You should see “QuickBooks company connected.”Confirm:
python3 src/hermes_qbo/cli.py health→oauth: validand a company name.
Access tokens last about 60 minutes. Refresh tokens last about 100 days and rotate; the connector stores each new refresh token under data/tenants/<id>/tokens.json. If refresh fails, tools return reauthorization_required instead of failing silently.
Live company (Production keys)
Put Production Client ID/Secret in
secrets/production_client_idandsecrets/production_client_secret.Register and set
QBO_REDIRECT_URIto your HTTPS redirect (Playground URI is supported).Restart the container so it reloads secrets.
Run
auth-urlfor that tenant. On the Intuit picker, choose the live company, not a sandbox sample.If you used the Playground redirect, copy
code,realmId, and tokens from the playground and import:
python3 src/hermes_qbo/cli.py import-tokens --tenant company_a <<'EOF'
{"realm_id":"1234567890","access_token":"...","refresh_token":"...","environment":"production","expires_in":3600}
EOFRepeat with a different tenant id for a second company. The same realm cannot be attached to two tenants.
Production writes stay held until you explicitly set QBO_ALLOW_PRODUCTION_WRITES=true. Default is false.
5. Give Hermes the tools
See docs/HERMES.md for config.yaml snippets. Minimum:
Copy
mcp/qbo_mcp.pyonto the Hermes host.Copy
secrets/adapter_tokento the pathQBO_ADAPTER_TOKEN_FILE.Register MCP servers
quickbooks(desktop/API) and optionallyquickbooks_telegram.Set
tools.includeto the connector tool list (GET /v1/tool-schemasafter the service is up).Put skills/hermes-quickbooks/SKILL.md where the agent can read it (Hermes skills/context directory, or a Cursor project skill).
Agent identity is the MCP environment (QBO_AGENT_ID), never a tool argument.
6. Operator approval (writes)
Draft tools (qbo_create_*_draft) store a local proposal. QuickBooks Online has no API draft/non-posting invoice state. posted_to_quickbooks is always false until an operator runs execute.
python3 src/hermes_qbo/cli.py approvals
python3 src/hermes_qbo/cli.py reject ACTION_ID --user operator
python3 src/hermes_qbo/cli.py approve ACTION_ID --user operator
python3 src/hermes_qbo/cli.py execute ACTION_ID --user operator # sandbox, or production if writes are enabledThere is no qbo_approve MCP tool. The approving user must not equal the requesting agent id.
Environment variables
Name | Default | Meaning |
|
| Default API host if a tenant has no token environment yet |
|
| Must be true and operator execute to POST to a live company |
|
| Bind inside the container; compose publishes |
|
| Tokens, approvals SQLite, audit JSONL |
|
| Client id/secret, adapter token, operator token |
|
|
|
|
| Must match the Intuit app exactly |
|
| QBO Accounting minor version |
Security model
LLM is not the security boundary.
Adapter token authenticates Hermes → connector. Operator token authenticates CLI approve/execute/OAuth start.
Per-agent read/draft/write ACL and per-tenant allowlists.
Query compiler allowlists entities and fields (no raw SQL from the model).
Secrets stay on disk mode
600. Tokens are never returned in health or tool envelopes.
License
MIT. QuickBooks and Intuit are trademarks of Intuit Inc. This project is not affiliated with Intuit.
This server cannot be deployed
Maintenance
Related MCP Connectors
QuickBooks MCP Pack — query customers, invoices, and accounts via QuickBooks Online API.
Hosted Meta ads MCP with OAuth, bounded reads, and prepare/confirm writes.
Hosted TikTok ads MCP with OAuth, bounded reads, and prepare/confirm writes.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables interaction with the QuickBooks Online Accounting API to manage customers, invoices, expenses, and payments through MCP-compatible clients. It supports comprehensive financial workflows and the generation of reports like Profit and Loss or Balance Sheets.1332Apache 2.0
- AlicenseAqualityDmaintenanceMCP server for QuickBooks Online providing read-only access to customers, vendors, invoices, bills, and chart of accounts. Enables natural language queries to your financial data through Claude or any MCP client.8MIT
- AlicenseNot gradedqualityBmaintenanceEnables full CRUD operations on 29 QuickBooks Online entity types and 11 financial reports via natural language, allowing users to manage customers, invoices, payments, and more through MCP-compatible clients.Apache 2.0
- AlicenseCqualityDmaintenanceProvides complete QuickBooks Online API integration for Claude Code and other MCP-compatible clients, enabling full CRUD operations on 29 entity types and 11 financial reports.100Apache 2.0