QuickBooks MCP Server
Provides tools for interacting with QuickBooks Online, enabling natural language creation of journal entries, pulling financial reports (P&L, Balance Sheet, Trial Balance), SQL-like querying across entities, and automatic resolution of vendor, account, and department names.
Click on "Install 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 MCP ServerShow me the profit and loss for last quarter"
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 MCP Server
An MCP server for QuickBooks Online — built for bookkeepers, CFOs, and accountants who use AI assistants in their daily workflow.
Ask your AI assistant to pull a P&L report, create a journal entry, or investigate an account balance — using plain language, not API payloads.
Why This Server?
Intuit provides an official MCP server that's a solid starting point for developers exploring the QuickBooks API. This server takes a different approach: it's designed for financial professionals working in production books.
Use natural language, not internal IDs
Intuit's server requires QuickBooks internal IDs for every reference — you need to look up a vendor's ID before creating a bill. This server resolves names automatically:
"Create a bill for PG&E, $450 to Utilities, dated 2025-01-15"
→ Vendor, account, and department names are resolved automaticallyFinancial reports built in
This is the only QuickBooks MCP server with report tools. Pull a P&L, Balance Sheet, or Trial Balance — broken down by month, department, or class — without leaving your AI conversation.
Safe by default
Every create and edit operation defaults to draft/preview mode. You see exactly what will be written to your books before committing. No accidental journal entries or misclassified expenses.
One query tool instead of dozens
Instead of separate search tools for each entity type, a single SQL-like query tool works across all QuickBooks entities. AI assistants write SQL naturally, and QuickBooks validates it — no field whitelists to maintain.
"SELECT * FROM Purchase WHERE TxnDate >= '2025-01-01' AND TxnDate <= '2025-01-31'"Production-ready credential management
Store credentials locally for personal use, or in AWS Secrets Manager for shared environments. OAuth tokens refresh automatically and persist across sessions.
At a glance
Intuit Official | This Server | |
Audience | Developers exploring the API | Bookkeepers, CFOs, accountants |
Name resolution | Requires internal QB IDs | Resolves names automatically |
Financial reports | None | P&L, Balance Sheet, Trial Balance |
Write safety | Executes immediately | Draft preview by default |
Query approach | Entity-specific search tools | SQL-like queries across all entities |
Credentials | Local | Local file or AWS Secrets Manager |
Distribution | Clone from GitHub |
|
Related MCP server: qbo-mcp
Prerequisites
QuickBooks Developer Account: Register at developer.intuit.com
Node.js 18+
Installation Options
Choose the setup that fits your use case:
Setup | Best For |
Quick setup, using your own QuickBooks app | |
Development, customization | |
Shared/production environments |
Option 1: NPM Install
The simplest way to get started. Credentials are stored locally on your machine.
1. Create a QuickBooks App
Go to developer.intuit.com and sign in
Create a new app (or select an existing one)
Go to "Keys & credentials"
Note your Client ID and Client Secret
Under "Redirect URIs", add:
https://developer.intuit.com/v2/OAuth2Playground/RedirectUrl
2. Add to Claude Code
Add to your project's .mcp.json:
{
"mcpServers": {
"quickbooks": {
"command": "npx",
"args": ["-y", "qbo-mcp"]
}
}
}3. Configure Credentials
Create ~/.qbo-mcp/credentials.json:
{
"client_id": "your_client_id",
"client_secret": "your_client_secret"
}4. Authenticate
Once Claude Code is running, use the qbo_authenticate tool:
Call
qbo_authenticatewith no arguments to get an authorization URLOpen the URL in your browser and authorize the app
Copy the
codeandrealmIdfrom the redirect URLCall
qbo_authenticateagain with the authorization code and realm ID
Your OAuth tokens will be saved and automatically refreshed.
Option 2: Local Checkout
For development or customization.
1. Create a QuickBooks App
Follow the same steps as Option 1 above.
2. Clone and Build
git clone https://github.com/shawnro/qbo-mcp.git
cd qbo-mcp
npm install
npm run build3. Add to Claude Code
Add to your project's .mcp.json:
{
"mcpServers": {
"quickbooks": {
"command": "node",
"args": ["/path/to/qbo-mcp/dist/index.js"]
}
}
}4. Configure Credentials
Create ~/.qbo-mcp/credentials.json with your client credentials (same as Option 1), then run qbo_authenticate to complete the OAuth flow.
Option 3: AWS Mode
For shared or production environments. Stores credentials in AWS Secrets Manager.
1. Create AWS Resources
Create the secret in Secrets Manager:
aws secretsmanager create-secret \
--name prod/qbo \
--secret-string '{
"client_id": "your_client_id",
"client_secret": "your_client_secret",
"access_token": "your_access_token",
"refresh_token": "your_refresh_token",
"redirect_url": "https://developer.intuit.com/v2/OAuth2Playground/RedirectUrl"
}'Store Company ID in SSM Parameter Store:
aws ssm put-parameter \
--name /prod/qbo/company_id \
--value "your_company_id" \
--type SecureString2. Configure the Server
Create a .env file in the qbo-mcp directory:
QBO_CREDENTIAL_MODE=aws
AWS_REGION=us-east-2
QBO_SECRET_NAME=prod/qbo
QBO_COMPANY_ID_PARAM=/prod/qbo/company_idNote: Due to a known Claude Code bug, environment variables from
.mcp.jsonare not reliably passed to MCP servers. The.envfile workaround is required.
3. Add to Claude Code
{
"mcpServers": {
"quickbooks": {
"command": "node",
"args": ["/path/to/qbo-mcp/dist/index.js"]
}
}
}4. IAM Permissions
The server needs these AWS permissions:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:PutSecretValue"
],
"Resource": "arn:aws:secretsmanager:*:*:secret:prod/qbo*"
},
{
"Effect": "Allow",
"Action": ["ssm:GetParameter"],
"Resource": "arn:aws:ssm:*:*:parameter/prod/qbo/*"
}
]
}Option 4: Azure Mode
For environments using Azure Key Vault for secret management. Stores all QuickBooks credentials (including company ID) in a single Key Vault secret.
1. Create the Key Vault Secret
Store your QuickBooks credentials as a JSON secret in Azure Key Vault:
az keyvault secret set \
--vault-name myvault \
--name qbo-credentials \
--value '{
"client_id": "your_client_id",
"client_secret": "your_client_secret",
"access_token": "your_access_token",
"refresh_token": "your_refresh_token",
"redirect_url": "https://developer.intuit.com/v2/OAuth2Playground/RedirectUrl",
"company_id": "your_company_id"
}'2. Configure the Server
Create a .env file in the qbo-mcp directory:
QBO_CREDENTIAL_MODE=azure
AZURE_KEY_VAULT_URL=https://myvault.vault.azure.netOptionally override the secret name (default: qbo-credentials):
QBO_SECRET_NAME=my-custom-secret-name3. Azure Identity
The provider uses DefaultAzureCredential from @azure/identity, which supports:
Managed Identity (Azure VMs, App Service, Functions)
Azure CLI (
az login)Environment variables (
AZURE_CLIENT_ID,AZURE_TENANT_ID,AZURE_CLIENT_SECRET)
Ensure the identity has Secret Get and Secret Set permissions on the Key Vault.
4. Add to Claude Code
{
"mcpServers": {
"quickbooks": {
"command": "node",
"args": ["/path/to/qbo-mcp/dist/index.js"]
}
}
}Multi-Company Profiles
If you manage multiple QuickBooks companies, you can configure named profiles to switch between them from a single MCP server instance.
1. Create a Profiles Config File
Create ~/.qbo-mcp/profiles.json (or set QBO_PROFILES_FILE to a custom path):
{
"default": "my-business",
"profiles": {
"my-business": {
"mode": "azure",
"secret_name": "qbo-my-business",
"upload_roots": [
{ "label": "AP Invoices", "path": "C:\\Accounting\\My Business\\AP" },
{ "label": "Receipts", "path": "C:\\Accounting\\My Business\\Receipts" }
]
},
"side-project": {
"mode": "azure",
"secret_name": "qbo-side-project"
},
"division-a": {
"mode": "azure",
"secret_name": "qbo-shared-login",
"company_id": "1234567890"
},
"division-b": {
"mode": "azure",
"secret_name": "qbo-shared-login",
"company_id": "9876543210"
}
}
}Fields:
Field | Required | Description |
| Yes | Credential provider: |
| Yes (aws/azure) | Provider-specific secret name |
| No | Override company ID (useful when one login has multiple companies) |
| No | Labeled absolute folders from which this profile may upload attachments. Paths are not exposed by |
| Yes (top-level) | Profile to use on startup |
2. Use the Profile Tools
list_qbo_profiles— Shows all configured profiles and which is activeswitch_qbo_profile— Switches to a different company (validates the connection)
Notes
If the profiles file does not exist, the server runs in single-company mode (backward compatible)
If the profiles file exists but is malformed, the server fails at startup with a descriptive error
Switching profiles clears all cached data (accounts, departments, etc.)
Attachment paths are checked against the active profile's
upload_roots; different businesses can authorize entirely different folder structuresMissing/offline upload roots do not prevent server startup or use of other configured roots
On switch failure, the server automatically rolls back to the previous profile
Inline Output Mode
By default, large responses (reports, query results) are written to /tmp files and the server returns a file path. This works well for Claude Code in terminal environments but breaks in Claude Desktop and plugin environments where the model cannot read from /tmp.
Set QBO_INLINE_OUTPUT=true to return all responses inline instead.
Option A — via .env file (recommended for local checkout):
Create a .env file in the qbo-mcp directory:
QBO_INLINE_OUTPUT=trueOption B — via .mcp.json env block (recommended for NPM install):
{
"mcpServers": {
"quickbooks": {
"command": "npx",
"args": ["-y", "qbo-mcp"],
"env": {
"QBO_CREDENTIAL_MODE": "local",
"QBO_CREDENTIAL_FILE": "~/.qbo-mcp/credentials.json",
"QBO_INLINE_OUTPUT": "true"
}
}
}
}Note: Due to a known Claude Code bug, environment variables from
.mcp.jsonare not reliably passed to MCP servers in some configurations. If Option B doesn't work, use the.envfile workaround.
Environment Variables
Variable | Default | Description |
|
| Credential storage: |
| - | QuickBooks app Client ID (local mode) |
| - | QuickBooks app Client Secret (local mode) |
|
| Custom credential file path |
|
| Return responses inline instead of writing to |
|
| Use QuickBooks sandbox environment |
|
| AWS region (aws mode) |
|
| Secrets Manager secret name (aws mode) |
|
| SSM parameter path (aws mode) |
| - | Key Vault URI, e.g. |
| - | Fallback company ID if not in Key Vault secret (azure mode) |
|
| Path to multi-company profiles config |
| - | Optional platform-delimited attachment roots for single-company mode (Windows uses |
|
| Hide all |
|
| Hide all |
|
| Hide |
| - | Required canonical base URL for hosted HTTP, including any API Gateway stage path |
| - | Must be |
| - | HTTPS JWKS endpoint for hosted bearer-token validation |
| - | Required JWT audience for hosted authentication |
| - | Required HTTPS JWT issuer for hosted authentication |
| - | Optional required JWT scope |
| - | Optional OAuth authorization-server URL for hosted interactive login proxy |
|
| Display name in protected-resource metadata |
|
| Explicitly allow anonymous hosted MCP access; cannot be combined with auth/OAuth settings |
Hosted HTTP Security and Capabilities
Hosted HTTP deployments require MCP_PUBLIC_BASE_URL. Use the externally reachable base URL and include the stage path for a raw API Gateway endpoint, for example https://abc123.execute-api.us-east-2.amazonaws.com/prod. OAuth and protected-resource URLs are built only from this trusted value, never from an incoming Host header.
Authentication is fail-closed. Configure MCP_AUTH_JWKS_URI, MCP_AUTH_AUDIENCE, and MCP_AUTH_ISSUER together. Missing, partial, malformed, or conflicting settings return a bounded 503 configuration_error; they never make the server anonymous. MCP_AUTH_DISABLED=true is an explicit development option and disables OAuth discovery and proxy routes.
The hosted transport uses one configured QuickBooks company per endpoint. Local stdio retains named profiles, qbo_authenticate, profile switching, and local file uploads. Hosted clients do not see or invoke those process-local tools. create_attachable remains available remotely for notes and entity links, but not for file_path uploads because a hosted process cannot read files from a customer's computer. Multi-company customers can register one hosted endpoint per company; secure in-process hosted multi-company selection requires a later principal-to-company authorization and state-isolation layer.
Hosted deployments must currently run as one process/replica and set MCP_SINGLE_REPLICA=true. Refresh coordination is process-local, so Lambda reserved concurrency and container replica limits must both be one. Do not scale a hosted endpoint beyond one replica until distributed refresh locking is implemented and validated; that work is planned with the Azure deployment adapters.
Remote routing, authentication, OAuth, CORS, MCP lifecycle, and capability policy live in a provider-neutral Web Request to Response application. AWS Lambda is an API Gateway adapter over that application; Azure Functions and Node/container adapters can use the same core without duplicating accounting or security policy.
Available Tools
Tool | Description |
Setup | |
| Set up OAuth credentials (local mode only) |
| Get connected company information |
Query & Reports | |
| Run SQL-like queries against any QuickBooks entity |
| List chart of accounts with filtering |
| Profit & Loss report (by month, department, class, etc.) |
| Balance Sheet report |
| Trial Balance report |
| Authoritative General Ledger postings for an account, with Cash/Accrual and department filters |
| GL period summary for an account (opening/closing balance, normalized debits/credits, count) |
Journal Entries | |
| Create a journal entry (validates debits = credits) |
| Fetch a journal entry by ID |
| Modify an existing journal entry |
Bills | |
| Create a vendor bill; account lines support optional customer/job tracking |
| Fetch a bill by ID, including line customer/job and billable status |
| Modify a bill and preserve, assign, change, or clear account-line customer/jobs |
Expenses | |
| Create an expense (Cash, Check, or Credit Card) with optional line customer/job tracking |
| Fetch an expense by ID, including line customer/job and billable status |
| Modify an expense and preserve, assign, change, or clear account-line customer/jobs |
Sales Receipts | |
| Create a sales receipt with item lines |
| Fetch a sales receipt by ID |
| Modify an existing sales receipt |
Invoices | |
| Create an invoice with item lines (customer required) |
| Fetch an invoice by ID |
| Modify an existing invoice |
Deposits | |
| Create a bank deposit |
| Fetch a deposit by ID |
| Modify an existing deposit |
Vendor Credits | |
| Create a vendor credit with optional line customer/job tracking |
| Fetch a vendor credit by ID, including line customer/job and billable status |
| Modify a vendor credit and preserve, assign, change, or clear account-line customer/jobs |
Bill Payments | |
| Pay bills and apply vendor credits (the QBO "check" / pay-bills flow) |
| Fetch a bill payment by ID; flags unapplied amounts |
Vendors | |
| Create a vendor master record with contact, address, terms, account number, and 1099 details |
| Fetch a vendor by ID with SyncToken, contact details, balance, active state, and metadata |
| Modify vendor details, explicitly clear optional values, or reactivate an inactive vendor |
| Safely deactivate a vendor while preserving historical transactions; draft-first and reversible |
Delete | |
| Delete any transaction (journal entry, bill, invoice, deposit, sales receipt, expense, vendor credit, bill payment, attachable) |
Classes | |
| Create a class for categorizing transactions (supports sub-classes) |
| Fetch a class by ID |
| Modify a class (name, active status, parent). Deactivate instead of delete. |
Attachables | |
| Create an attachable — upload a local file or add a note, optionally linked to a transaction |
| List safe metadata for attachments linked to a QBO transaction or entity |
| Fetch an attachable by ID (includes download URL for files) |
| Safely download QBO attachment content for Claude to inspect (text, images, and PDFs) |
| Update attachable metadata (note, category, entity links). Cannot replace files. |
Profiles | |
| List all configured company profiles and show which is active |
| Switch to a different company profile |
Account Ledger Workflow
query_account_transactions and account_period_summary use QuickBooks' General Ledger report as the accounting source of truth. This includes control-account entries, item-inherited accounts, bill payments, vendor credits, credit memos, and other posting types without reconstructing them from selected entity APIs.
query_account_transactionsreturns read-only postings with QBO transaction IDs, document number, counterparty, memo, split account, debit/credit, amount, running balance, and a direct QBO link when the report type has a known route.Use
accounting_method: "Accrual"(default) or"Cash"; QBO applies the selected basis server-side.Optional department/location filtering is also applied by the report endpoint.
GL report amounts are changes in each account's normal balance. qbo-mcp normalizes them so returned posting amounts use a consistent convention: positive = debit, negative = credit.
rawReportAmountis retained for auditability.Report postings do not contain editable line IDs or SyncTokens. Fetch the source Bill, Invoice, Journal Entry, etc. before any edit.
QBO does not publish report pagination or a total-row/truncation indicator. For high-volume accounts, use narrower date ranges; qbo-mcp reports the row count and warns on large responses rather than silently treating failed entity queries as empty activity.
File Attachment Workflow
create_attachable can upload a file from the computer running qbo-mcp and link it to an existing QBO transaction. A file uploaded only into ordinary Claude Chat is not automatically available to local MCP tools; provide the original absolute local path, or use Claude Cowork with the relevant business folder connected.
Recommended Bill workflow:
Select or confirm the correct QBO profile.
Create the Bill and retain its returned ID.
Call
create_attachablewith the absolutefile_path,entity_type: "Bill", and the Bill ID.Review the draft and call again with
draft: false.Use
get_attachableto verify metadata and the QBO link.
Attachment safeguards and limitations:
Profile-specific
upload_rootscan authorize multiple existing business folders; no shared staging folder is required.Paths must be absolute, canonical, readable, non-symlink files within the active profile's configured roots when roots are present.
QBO-approved business-document types only; maximum 100 MB; dotfiles and credential/secret files are blocked.
entity_typeandentity_idmust be provided together.File upload is performed first, then linking/note/category metadata is applied in one controlled update. If that update fails, the tool returns the created Attachable ID so
edit_attachablecan recover without uploading a duplicate.edit_attachablereplaces the complete entity-link array.Uploaded file bytes cannot be replaced; delete and recreate the Attachable.
QBO temporary download URLs expire after approximately 15 minutes.
Lambda/HTTP servers cannot access files on a user's local computer through
file_path.
To verify a transaction against an attachment already stored in QBO:
Call the transaction getter, such as
get_bill.Call
list_transaction_attachableswith the transaction type and ID.Select the relevant attachment ID and call
read_attachable_content.Ask Claude to compare vendor/payee, document number, dates, total, and line details. Reading is non-mutating; any correction remains a separate draft-first edit.
Content-reading limits:
Text, CSV, and XML must be UTF-8 and are limited to 256 KB to protect Claude's context budget.
JPEG, PNG, GIF, and PDF downloads are limited to 10 MB in default local stdio mode and 4 MB when inline/HTTP output is enabled.
Attachment metadata lists are capped at 20 records in HTTP mode and clearly report when a larger requested limit was reduced.
Images are returned as MCP image content. In the local server, PDFs are rendered to JPEG page images and returned through the same native image channel, including image-only scanned PDFs.
PDF reads render at most three pages per call. Use
page_startto continue with later pages andpage_countto request one to three pages.The stateless Lambda transport returns PDF metadata and directs visual PDF analysis to the local server; native rendering dependencies are not included in the Lambda artifact.
QBO-signed URLs are fetched server-side, are never accepted from user input, and are refreshed once after expiry.
Office and other binary files remain available as metadata but are not yet parsed for Claude.
Line-Level Customer and Job Tracking
Account-based lines on bills, expenses, and vendor credits can be associated with a customer, sub-customer, or job without making the line billable.
On create, provide either
customer_nameorcustomer_idon a line.For nested jobs,
customer_nameaccepts the fully qualified formCustomer:Job:Sub-job.On edit, omitting customer fields preserves the existing
CustomerRef.Use
customer_nameorcustomer_idto assign or replace the reference.Use
clear_customer: trueon an existing line to remove a non-billable reference.Customer mutations apply only to
AccountBasedExpenseLineDetail; item-based expense lines are left unchanged.
Customer/job tracking is independent from QBO's billable-expense workflow. New tagged lines remain NotBillable, writable BillableStatus is not exposed, HasBeenBilled lines cannot be reassigned, and a Billable line cannot have its customer cleared.
Line edits use QBO full updates. The handlers preserve required header references, linked transactions, currency/tax fields, and untouched nested line metadata. Customer/job creation, replacement, and clearing were validated with disposable QBO sandbox bills, expenses, and vendor credits; unrelated header and line metadata remained unchanged.
Token Refresh
The server automatically refreshes OAuth tokens on each request and persists them back to your credential store (local file or AWS Secrets Manager).
Development
npm run dev # Run in development mode
npm run build # Build
npm run typecheck # Type checkTroubleshooting
"QuickBooks credentials not configured"
Run the qbo_authenticate tool to set up OAuth credentials (local mode only).
"Authorization code expired"
Authorization codes are only valid for a few minutes. Start the OAuth flow again.
Token refresh fails
Check that your refresh token hasn't expired (~100 days)
Verify your client credentials are correct
Try re-authenticating with
qbo_authenticate
AWS credential errors
Ensure
.envfile hasQBO_CREDENTIAL_MODE=awsCheck your AWS credentials and permissions
Verify the secret and parameter names match your configuration
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- 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
- Flicense-qualityDmaintenanceAn MCP server for QuickBooks Online that enables managing customers, vendors, invoices, bills, payments, items, and more, along with financial reports, directly from Claude.
- AlicenseAqualityBmaintenanceAn intelligent bookkeeping MCP server for QuickBooks Online that enables natural language control over categorization, reconciliation, monthly close, and anomaly detection.1416MIT
- Alicense-qualityBmaintenanceComprehensive MCP server for QuickBooks Online providing full CRUD operations on 29 entities (customers, invoices, bills, etc.) and 11 financial reports, enabling accounting data management via natural language.Apache 2.0
Related MCP Connectors
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
GibsonAI MCP server: manage your databases with natural language
QuickBooks MCP Pack — query customers, invoices, and accounts via QuickBooks Online API.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/shawnro/qbo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server