QuickBooks Online MCP Server
Provides tools for interacting with the QuickBooks Online Accounting API (v3) for a single company, letting an AI agent read and manage customers, vendors, employees, items, accounts, invoices, estimates, payments, bills, purchases, journal entries, time activities, credit memos, deposits, purchase orders, refund receipts, sales receipts, transfers, vendor credits, tax codes/rates, attachments, and financial reports. Supports listing, searching, retrieving, creating, updating, and voiding records, emailing invoices, uploading attachments, and generating reports such as profit and loss, balance sheet, trial balance, general ledger, cash flow, customer sales, vendor expenses, aged receivables/payables, and customer balances.
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., "@QuickBooks Online MCP Servershow me all unpaid 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.
QuickBooks Online MCP Server
An MCP server for the QuickBooks Online Accounting API (v3). It lets an AI agent read one QuickBooks company's customers, vendors, items, accounts, invoices, estimates, payments, bills, purchases, journal entries, time activities, attachments and financial reports and, on explicit request, create, update and void records, email invoices and upload attachments.
Transport: MCP Streamable HTTP at
POST /mcp, health probe atGET /healthStateless and multi-tenant: the OAuth access token and company (realm) id arrive on every request as HTTP headers and are never stored; every tool is listed from the first
tools/listPython 3.12, uv, FastMCP, httpx
License: Apache-2.0, Copyright 2026 MSPbots.ai
Authentication headers
Header | Required | Type | Default | Allowed values | Description | Example |
| Yes | string | none | - | OAuth 2.0 access token for the company (a leading |
|
| Yes | string | none | digits only | The QuickBooks company id (realm id) |
|
| No | string |
|
| Which QuickBooks API host to call |
|
Where to get them: the access token and realm id come from the OAuth 2.0 authorization of a
QuickBooks Online app (Intuit developer portal) with the com.intuit.quickbooks.accounting
scope. The realm id is returned with the authorization callback. Access tokens expire after
about an hour; the caller (for example a gateway) refreshes them and sends the current one.
This server never refreshes or stores tokens.
How they are sent to QuickBooks: the token as Authorization: Bearer <token> to
https://quickbooks.api.intuit.com/v3/company/<realm>/... (or the sandbox host), with
minorversion=75 on every call. Values that look like unresolved templates (${...}) are
treated as missing.
A request to /mcp without the required headers gets HTTP 401 naming them; a non-numeric realm
id or an unknown environment gets HTTP 400.
Related MCP server: QuickBooks Online MCP Server
Tools
All 138 tools return a JSON string. Names follow qbo_<records>_<action>.
Generic actions, per area:
Action | What it does | Parameters (required in bold) |
| Query records, one page | startPosition (from 1), maxResults (default 100, max 1000); transaction areas also startDate, endDate (YYYY-MM-DD, on TxnDate) |
| One record by id |
|
| Records whose name / number contains a term | term, startPosition, maxResults |
| Create a record (write) | the area's required fields plus optional ones |
| Sparse update; only given fields change (write) |
|
| Void a transaction (write, destructive) |
|
List and search results look like {items, count, startPosition, maxResults, has_more, next_startPosition}.
Area | Tools |
accounts, classes, departments, items, payment_methods, terms | list, get, search, create, update |
customers, vendors, employees | list, get, search, create, update |
tax_codes, tax_rates | list, get, search |
company_info | list, get |
bills | list (dated), get, search (DocNumber), create, update |
bill_payments, credit_memos, deposits, estimates, journal_entries, purchase_orders, purchases, refund_receipts, sales_receipts, time_activities, transfers, vendor_credits | list (dated), get, create, update |
payments | list (dated), get, create, update, void |
invoices | get, create, update, void, plus |
attachables | list, get, create, update, plus |
Special tools:
Tool | Purpose | Parameters (required in bold) |
| List the tools of one area (changes nothing) | domain |
| Check the connection: company name, realm id, environment | - |
| Invoices, newest first, optionally by payment status | status ( |
| Email an invoice to the customer (write) | invoiceId, email (defaults to the invoice's billing email) |
| Upload a file, optionally attached to a record (write) | fileName, contentType, base64Data, attachToType + attachToId (together), includeOnSend, note, category |
| Expenses, newest first | startDate, endDate, startPosition, maxResults |
| One expense | purchaseId / billId |
| Financial reports | start_date, end_date, accounting_method ( |
| Financial reports | start_date, end_date |
| Point-in-time reports | report_date (default today) |
Errors come back as a JSON envelope instead of an exception:
{"error": {"code": "invalid_argument", "message": "QuickBooks rejected customer: Stale Object Error: You and another user were working on this at the same time. (code 5010)", "retryable": false}}code is one of not_configured, unauthorized, not_found, invalid_argument,
rate_limited, upstream_error. A Fault returned with HTTP 200 is also reported as an
error. Reads (including queries) are retried with backoff on 429, 5xx and network errors;
writes only on 429.
Run locally
uv sync
uv run python -m qbo_mcp # listens on 0.0.0.0:8080or with Docker:
docker build --platform linux/amd64 -t qbo-mcp:dev .
docker run --rm -p 8080:8080 qbo-mcp:devConfiguration (environment variables, all optional): MCP_HTTP_HOST (default 0.0.0.0),
MCP_HTTP_PORT (default 8080), LOG_LEVEL (default INFO). Credentials are never read from
the environment.
Testing example
# list tools
curl -s http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-Qbo-Access-Token: <access-token>" \
-H "X-Qbo-Realm-Id: 9130350000000001" \
-H "X-Qbo-Environment: sandbox" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
# unpaid invoices
curl -s http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-Qbo-Access-Token: <access-token>" \
-H "X-Qbo-Realm-Id: 9130350000000001" \
-H "X-Qbo-Environment: sandbox" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"qbo_invoices_list","arguments":{"status":"Unpaid"}}}'Unit tests (no network access needed):
uv run pytestDelivery notes
Same tool contract. All 138 tool names and their required parameters are unchanged from the older version, and the same three
X-Qbo-*headers are used.All tools always listed.
qbo_navigateremains for compatibility and only describes an area's tools.Query escaping. Search terms are escaped the way the QuickBooks query language expects (backslash before
'and\); the older version doubled quotes, which QuickBooks does not treat as an escape.Updates. Updates are always sparse and need the current
SyncToken(from_get); an update with no changed fields is rejected before calling QuickBooks.Not included. The older version's interactive invoice card (an MCP Apps
ui://resource) is not part of this server; invoice tools return plain JSON.Tokens. The server does not refresh OAuth tokens; send a current access token on every request.
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Connect QuickBooks Online to AI agents with secure read or write access across multiple companies.
Connect QuickBooks to ChatGPT, Claude & Grok. Record bills, invoices, journal entries. Run reports.
QuickBooks Online in Claude and ChatGPT: 221 tools, full ledger, multi-company, Canada + US, FR/EN.
Query your books, company data, business health, and ship invoices from your AI assistant.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with QuickBooks Online through OAuth authentication. Supports CRUD operations for financial entities like customers, invoices, bills, estimates, and accounting records through natural language.1MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to query and manage QuickBooks Online data through natural language, including customers, invoices, bills, vendors, accounts, and financial reports.7MIT
- AlicenseAqualityCmaintenanceEnables LLM agents to manage QuickBooks Online invoices, customers, and payments via typed tools with OAuth 2.1 authentication, rate limiting, and retries, plus read-only resources for company and receivables summaries.18MIT
- AlicenseNot gradedqualityCmaintenanceProvides comprehensive CRUD operations for 29 QuickBooks Online entity types and 11 financial reports, enabling full accounting management through natural language.Apache 2.0