QuickBooks Online MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| QBO_SCOPES | No | Space-separated OAuth scopes. Defaults to com.intuit.quickbooks.accounting. | |
| QBO_REALM_ID | No | The QuickBooks company ID (realm ID). | |
| QBO_CLIENT_ID | No | The client ID from the Intuit Developer portal. | |
| QBO_ENVIRONMENT | No | The QuickBooks environment: 'sandbox' or 'production'. | sandbox |
| QBO_MAX_RETRIES | No | Maximum number of retries on rate limits or server errors. | |
| QBO_REDIRECT_URI | No | The redirect URI for OAuth, must match the one configured in Intuit. | http://localhost:8765/callback |
| QBO_CLIENT_SECRET | No | The client secret from the Intuit Developer portal. | |
| QBO_REQUESTS_PER_MINUTE | No | Maximum number of API requests per minute. | |
| QBO_REQUESTS_PER_SECOND | No | Maximum number of API requests per second. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_customerA | Create a customer in the connected QuickBooks Online company. Use it before invoicing someone who is not on file yet, and run search_customers first so you do not create a second record for an existing customer. Write operation: it adds one Customer and changes nothing else. Not idempotent, because QuickBooks rejects a duplicate DisplayName with error 6240 rather than returning the existing customer. Returns the created customer with its new Id and SyncToken, or ok=false with an error and a suggested fix. |
| get_customerA | Read one customer by QuickBooks Id, including contact details, billing address, open balance, and the current SyncToken. Use it to inspect a customer, and to obtain the SyncToken that update_customer and delete_customer require. Read-only: nothing in the company file changes. The Id must already exist; an unknown Id returns ok=false with status 404, so resolve names through search_customers or list_customers first. |
| update_customerA | Update an existing customer. Use it to correct contact details, addresses, or the display name. Write operation that overwrites the fields you supply on the live record and leaves omitted fields unchanged, so it is a sparse update rather than a replacement. Not idempotent: a successful write increments the SyncToken, so the same call cannot be replayed. Requires the Id plus the SyncToken from a fresh get_customer; a stale token fails with error 5010. |
| delete_customerA | Deactivate a customer. QuickBooks Online has no hard delete for customers, so this sets Active to false, which hides the customer from pick lists while keeping their invoices, payments, and history intact. Use it to retire a customer, not to erase data. Write operation and not idempotent: it needs the SyncToken from a fresh get_customer, and that token changes on success. Deactivated customers remain readable through search_customers with active=false. |
| list_customersA | List customers, most recently updated first, one page at a time. Use it to browse the roster or to find an Id when you have nothing to filter on; prefer search_customers when you do. Read-only. Paging is caller-driven through start_position and max_results, and the result reports how many rows came back, so keep requesting pages until fewer than max_results rows are returned. Both active and inactive customers are included. |
| search_customersA | Find customers by display-name prefix, exact primary email, or active flag. Use it to turn a name or email an agent was given into a customer Id, and to check for an existing record before create_customer. Read-only. Filters combine with AND, and name_contains is a prefix match because the QuickBooks query language only supports a trailing wildcard. Calling it with no filters returns the whole roster one page at a time. |
| create_invoiceA | Create an invoice for an existing customer with one or more line items. Use it after resolving the customer Id with search_customers or create_customer. Write operation with real accounting effect: it posts a receivable against the company file. Not idempotent, so calling it twice bills the customer twice. Every line needs an amount, and a line without an item_id falls back to the default sales item. QuickBooks assigns the DocNumber, totals, and (unless due_date is given) the due date from the customer's payment terms. |
| get_invoiceA | Read one invoice by QuickBooks Id, including its lines, totals, remaining balance, due date, and the current SyncToken. Use it to check whether an invoice is still open, and to obtain the SyncToken that update_invoice and delete_invoice require. Read-only. An unknown Id returns ok=false with status 404; find the Id with search_invoices (which also matches on DocNumber) or list_invoices. |
| update_invoiceA | Replace the contents of an existing invoice. Use it to correct amounts, dates, or the billing customer. Write operation that overwrites the live record: the line array is replaced wholesale, so send every line the invoice should end with or the omitted ones are dropped and the total changes. Not idempotent, and it requires the Id plus the SyncToken from a fresh get_invoice; a stale token fails with error 5010. Payments already linked to the invoice are not adjusted. |
| delete_invoiceA | Delete an invoice permanently from the company file. Use it only for an invoice raised in error: this server cannot undo it, and voiding or issuing a credit memo is usually the correct accounting action for an invoice the customer has already seen. Write operation and not idempotent: it needs the SyncToken from a fresh get_invoice, and a repeat call for the same Id fails because the invoice no longer exists. Payments linked to it lose that link. |
| list_invoicesA | List invoices, most recent transaction date first, one page at a time. Use it to review recent billing when you have nothing to filter on; prefer search_invoices when you can filter by customer, date, or document number. Read-only. Paging is caller-driven through start_position and max_results, so keep requesting pages until fewer than max_results rows come back. Paid and unpaid invoices are both included; read the Balance field to tell them apart. |
| search_invoicesA | Find invoices by customer Id, transaction-date range, or document number. Use it to answer what a customer was billed in a period, or to turn a document number into an invoice Id. Read-only. Filters combine with AND and the date bounds are inclusive. Payment status cannot be filtered here: read the Balance field on each result, where zero means settled. |
| create_paymentA | Record a payment received from a customer, optionally applied against a specific invoice. Use it once the money has actually arrived, after confirming the invoice Id with get_invoice or search_invoices. Write operation with real accounting effect: it posts cash against the customer and reduces the linked invoice balance. Not idempotent, so a repeated call records a second payment. Supplying invoice_id links the whole total_amount to that invoice; omitting it leaves an unapplied credit on the customer. |
| get_paymentA | Read one payment by QuickBooks Id, including the total, transaction date, linked transactions, and the current SyncToken. Use it to confirm which invoice a payment was applied to, and to obtain the SyncToken that update_payment and delete_payment require. Read-only. An unknown Id returns ok=false with status 404; find the Id with search_payments or list_payments. |
| update_paymentA | Replace the contents of an existing payment. Use it to correct an amount, a date, or the invoice a payment was applied to. Write operation that overwrites the live record: the amount and linked transactions are replaced with what you send, so leaving invoice_id out unlinks the payment and reopens that invoice's balance. Not idempotent, and it requires the Id plus the SyncToken from a fresh get_payment; a stale token fails with error 5010. |
| delete_paymentA | Delete a payment permanently from the company file. Use it only for a payment recorded in error, and expect any invoice it settled to go back to unpaid for that amount. This server cannot undo the deletion. Write operation and not idempotent: it needs the SyncToken from a fresh get_payment, and a repeat call for the same Id fails because the payment no longer exists. |
| list_paymentsA | List payments, most recent transaction date first, one page at a time. Use it to review recent cash receipts when you have nothing to filter on; prefer search_payments when you can filter by customer or date. Read-only. Paging is caller-driven through start_position and max_results, so keep requesting pages until fewer than max_results rows come back. |
| search_paymentsA | Find payments by customer Id or transaction-date range. Use it to reconcile what a customer has paid over a period, or to locate the payment that settled an invoice. Read-only. Filters combine with AND and the date bounds are inclusive. Which invoice a payment was applied to is not a filter: read the LinkedTxn entries on each result. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| company-profile | Company profile and legal address for the connected QuickBooks Online realm. |
| receivables-summary | Accounts-receivable summary: open invoice count and outstanding balance by status. |
| customers-summary | Roster summary of active customers with their outstanding balances. |
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/amin-ale/mcp-quickbooks'
If you have feedback or need assistance with the MCP directory API, please join our Discord server