Skip to main content
Glama

DeepLedger QuickBooks MCP Server for ChatGPT, Claude & AI

qbInvoice

QuickBooks: create or update a customer Invoice (accounts receivable). Create: customerId (or projectId), txnDate, lines. Update: invoiceId + fields to change. Sent lines replace ALL stored lines: re-send each line's itemId, classId, dimensions and taxCodeId or they are lost (US: omitted taxCodeId drops sales tax to zero); txnTaxCodeId can change without lines. Lines below the amount paid leave unapplied credit (warned). emailStatus "NeedToSend" does not email anything; qbSendEmail does. Before creating: qbFetchTransactions(transactionType:"Invoice", outstandingOnly:true, entityId:customerId), no date window; collect an open match with qbPayment instead. NOT_APPLIED on update: a field you set was not stored; the rest WAS saved.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "qbInvoice"
  }
}

Input Schema

NameRequiredDescriptionDefault
memoNo
linesNo
depositNoPrepayment; 0 on update removes it.
dueDateNo
txnDateNo
billAddrNo
discountNoOn update send it WITH all lines; {percent:0} removes it.
shipAddrNo
shipDateNo
billEmailNo
companyIdNo
docNumberNo
invoiceIdNo
projectIdNoqbProject id; customerId: its customer or omitted.
customerIdNo
dimensionsNoIES dimensions for every line (qbCustomization list).
emailStatusNo
salesTermIdNo
trackingNumNo
currencyCodeNo
customFieldsNoqbCustomization list; "" clears.
customerMemoNoOmitted on create: the company default message; "" for none.
departmentIdNo
exchangeRateNoForeign currency: send it, or QuickBooks uses 1.
txnTaxCodeIdNo
taxCalculationNoNon-US: "TaxExcluded" (net), needed with taxed lines.
allowOnlineACHPaymentNo
applyTaxAfterDiscountNo
allowOnlineCreditCardPaymentNoOmitted: company default (create), unchanged (update); ACH alike. No per-customer setting: keep the policy in agentMemory and pass it on every invoice.

Output Schema

NameRequiredDescriptionDefault
companyNo
messageNo
successNo
warningNo
errorCodeNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed73 schema fields changed
    • addedInput schema / $schema
      Added value: +"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / properties / allowOnlineACHPayment / description
      Removed value: -"\"Pay now\" by bank transfer (ACH); same rules as allowOnlineCreditCardPayment, set independently."
    • changedInput schema / properties / allowOnlineCreditCardPayment / description
      Previous value: -"\"Pay now\" by card on this invoice: true shows, false hides; omitted = company default on create, unchanged on update. QuickBooks has no per-customer setting: keep the policy in agentMemory and pass it on every invoice."New value: +"Omitted: company default (create), unchanged (update); ACH alike. No per-customer setting: keep the policy in agentMemory and pass it on every invoice."
    • removedInput schema / properties / applyTaxAfterDiscount / description
      Removed value: -"US sales tax only: tax the post-discount subtotal. Does nothing on VAT/GST companies (always post-discount)."
    • removedInput schema / properties / billAddr / description
      Removed value: -"Billing address on the invoice (create defaults to the customer's). On update the fields sent merge over the stored address."
    • removedInput schema / properties / billAddr / properties / state / description
      Removed value: -"State/province code"
    • removedInput schema / properties / billEmail / description
      Removed value: -"Address stored on the invoice; sends nothing."
    • addedInput schema / properties / companyId
      Added value: +{
      +  "type": "string"
      +}
    • removedInput schema / properties / currencyCode / description
      Removed value: -"ISO code, multicurrency companies only. Omit to use the customer's currency (normally right)."
    • changedInput schema / properties / customFields / description
      Previous value: -"Custom field values; the definition must be switched on for this transaction type (qbCustomization list). On update only the fields sent change."New value: +"qbCustomization list; \"\" clears."
    • removedInput schema / properties / customFields / items / properties / definitionId / description
      Removed value: -"Numeric id from qbCustomization list."
    • removedInput schema / properties / customFields / items / properties / value / description
      Removed value: -"Text; number; date YYYY-MM-DD; or a dropdown option label. \"\" clears (not dropdowns)."
    • removedInput schema / properties / customerId / description
      Removed value: -"Customer id. Create: this or projectId."
    • changedInput schema / properties / customerMemo / description
      Previous value: -"Message shown on the invoice. Omitted on create: the company's default invoice message (where firms keep payment instructions), as QuickBooks' own screen fills it. \"\" for none."New value: +"Omitted on create: the company default message; \"\" for none."
    • removedInput schema / properties / departmentId / description
      Removed value: -"Location (department) id."
    • changedInput schema / properties / deposit / description
      Previous value: -"Prepayment already collected; reduces the balance due (deposits must be enabled). Credits Undeposited Funds unless a deposit account is stored. 0 on update removes it."New value: +"Prepayment; 0 on update removes it."
    • changedInput schema / properties / dimensions / description
      Previous value: -"IES dimensions for the whole document (e.g. sales rep), written to every line; a line's own value wins. On an invoice, sales receipt, estimate or credit memo update without lines it re-tags the stored lines, changing nothing else; other tools need the lines."New value: +"IES dimensions for every line (qbCustomization list)."
    • removedInput schema / properties / dimensions / items / properties / dimensionId / description
      Removed value: -"qbCustomization list id."
    • removedInput schema / properties / dimensions / items / properties / value / description
      Removed value: -"Value id or full name."
    • changedInput schema / properties / discount / description
      Previous value: -"Discount after the line subtotal, posted as its own line (discounts must be enabled). On update send it WITH all lines; lines replaced without it keep the stored discount; {percent:0} with lines removes it."New value: +"On update send it WITH all lines; {percent:0} removes it."
    • removedInput schema / properties / discount / properties / accountId / description
      Removed value: -"Income account it posts to; default = the company discount account."
    • changedInput schema / properties / discount / properties / amount / description
      Previous value: -"Fixed amount. Send percent OR amount."New value: +"Or percent, not both."
    • removedInput schema / properties / discount / properties / percent / description
      Removed value: -"Percent off the line subtotal (10 = 10%)."
    • removedInput schema / properties / emailStatus / description
      Removed value: -"\"NeedToSend\" does NOT email: it only queues the invoice in QuickBooks' Send later list for a human; it needs billEmail or a customer email."
    • changedInput schema / properties / exchangeRate / description
      Previous value: -"Transaction-to-home-currency rate. Send it on foreign-currency documents: with no rate on file QuickBooks silently uses 1."New value: +"Foreign currency: send it, or QuickBooks uses 1."
    • removedInput schema / properties / invoiceId / description
      Removed value: -"Invoice id: present = update."
    • removedInput schema / properties / lines / description
      Removed value: -"Create: required. Update: omit to keep the stored lines; sent lines REPLACE all of them."
    • removedInput schema / properties / lines / items / properties / amount / description
      Removed value: -"Line amount. Zero and negative lines are allowed (tax is on the net); the invoice total must be 0 or more."
    • changedInput schema / properties / lines / items / properties / dimensions / description
      Previous value: -"IES dimensions on this line, one value per dimension. Re-send them when replacing lines or they are lost."New value: +"IES dimensions; re-send when replacing lines."
    • removedInput schema / properties / lines / items / properties / dimensions / items / properties / dimensionId / description
      Removed value: -"qbCustomization list id."
    • removedInput schema / properties / lines / items / properties / dimensions / items / properties / value / description
      Removed value: -"Value id or full name (\"West:California\")."
    • changedInput schema / properties / lines / items / properties / itemId / description
      Previous value: -"Item id (qbMasterData item). Always send it: without it QuickBooks silently substitutes a default item and its income account."New value: +"Always send it, or QuickBooks uses a default item."
    • changedInput schema / properties / lines / items / properties / taxCodeId / description
      Previous value: -"US: the literal \"TAX\" or \"NON\". Non-US: a TaxCode id (qbMasterData taxCode)."New value: +"US: \"TAX\" or \"NON\". Non-US: a TaxCode id."
    • removedInput schema / properties / memo / description
      Removed value: -"Private note."
    • changedInput schema / properties / projectId / description
      Previous value: -"Project id (qbProject list) for the whole document. QuickBooks moves the document to the project's sub-customer, so customerId must be the project's customer or omitted."New value: +"qbProject id; customerId: its customer or omitted."
    • removedInput schema / properties / salesTermId / description
      Removed value: -"Term id (qbMasterData term)."
    • removedInput schema / properties / shipAddr / description
      Removed value: -"Shipping address. On update the fields sent merge over the invoice's stored address."
    • removedInput schema / properties / shipAddr / properties / state / description
      Removed value: -"State/province code"
    • changedInput schema / properties / taxCalculation / description
      Previous value: -"Non-US only: \"TaxExcluded\" (amounts are NET), required on create with taxed lines; on update the stored setting is kept (adding taxed lines to an untaxed invoice needs it). \"TaxInclusive\" is refused: convert a gross-priced invoice to net first."New value: +"Non-US: \"TaxExcluded\" (net), needed with taxed lines."
    • removedInput schema / properties / txnDate / description
      Removed value: -"YYYY-MM-DD. Create: required."
    • removedInput schema / properties / txnTaxCodeId / description
      Removed value: -"Transaction sales-tax code: a TaxCode id (qbMasterData taxCode), not TAX/NON or a TaxRate id. On update it can change without lines (the tool re-sends the stored lines)."
    • addedOutput schema / $schema
      Added value: +"https://json-schema.org/draft/2020-12/schema"
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • removedOutput schema / properties / allowOnlineACHPayment
      Removed value: -{
      -  "description": "Whether the STORED invoice offers bank-transfer (ACH) payment, as QuickBooks holds it.",
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / allowOnlineCreditCardPayment
      Removed value: -{
      -  "description": "Whether the STORED invoice offers card payment on its \"Pay now\" page, as QuickBooks holds it — read this, not your input, to confirm a toggle landed.",
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / balance
      Removed value: -{
      -  "description": "Open balance: totalAmount minus the deposit minus payments applied. 0 = nothing left to collect.",
      -  "type": "number"
      -}
    • changedOutput schema / properties / company / additionalProperties
      Previous value: -falseNew value: +true
    • removedOutput schema / properties / company / description
      Removed value: -"The company this result came from. Read it back to the user by name."
    • addedOutput schema / properties / company / properties / ledger
      Added value: +{
      +  "description": "The ledger this company keeps its books in (a provider id, or \"none\").",
      +  "type": "string"
      +}
    • addedOutput schema / properties / company / properties / xeroTenantName
      Added value: +{
      +  "description": "Xero organisation name, when the company keeps its books in Xero.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / company / required
      Removed value: -[
      -  "organizationId"
      -]
    • removedOutput schema / properties / customFields
      Removed value: -{
      -  "description": "Custom field values as QuickBooks STORED them after this write (dropdowns shown by option label). Returned only when the call sent customFields — read this to confirm a value landed.",
      -  "items": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "definitionId": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "type": "string"
      -      },
      -      "value": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "definitionId"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • removedOutput schema / properties / customerName
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / deposit
      Removed value: -{
      -  "description": "Customer prepayment recorded on this invoice. Balance is net of it, so without this field a balance below the total cannot be told apart from a payment.",
      -  "type": "number"
      -}
    • removedOutput schema / properties / discountAmount
      Removed value: -{
      -  "description": "Discount applied, as posted by QuickBooks on its own discount line",
      -  "type": "number"
      -}
    • removedOutput schema / properties / dueDate
      Removed value: -{
      -  "description": "Due date",
      -  "type": "string"
      -}
    • removedOutput schema / properties / email
      Removed value: -{
      -  "description": "Bill email address",
      -  "type": "string"
      -}
    • removedOutput schema / properties / emailStatus
      Removed value: -{
      -  "description": "Email status",
      -  "type": "string"
      -}
    • removedOutput schema / properties / errorCode / description
      Removed value: -"QuickBooks error code when success=false (e.g. TOKEN_EXPIRED, SYNC_TOKEN_CONFLICT, 6140). Branch on this instead of parsing the message."
    • removedOutput schema / properties / invoiceId
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / invoiceNumber
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / lineCount
      Removed value: -{
      -  "description": "Number of line items",
      -  "type": "number"
      -}
    • removedOutput schema / properties / lines
      Removed value: -{
      -  "description": "Invoice line details",
      -  "items": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amount": {
      -        "description": "Line amount",
      -        "type": "number"
      -      },
      -      "className": {
      -        "description": "Class name if assigned",
      -        "type": "string"
      -      },
      -      "description": {
      -        "description": "Line description",
      -        "type": "string"
      -      },
      -      "dimensions": {
      -        "description": "Dimension values stored on the line — pass them back as dimensions when replacing lines.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "dimension": {
      -              "type": "string"
      -            },
      -            "dimensionId": {
      -              "type": "string"
      -            },
      -            "value": {
      -              "type": "string"
      -            },
      -            "valueId": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "dimensionId",
      -            "valueId"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "itemName": {
      -        "description": "Item name",
      -        "type": "string"
      -      },
      -      "lineId": {
      -        "description": "QuickBooks line ID",
      -        "type": "string"
      -      },
      -      "quantity": {
      -        "description": "Quantity",
      -        "type": "number"
      -      },
      -      "serviceDate": {
      -        "description": "Service date",
      -        "type": "string"
      -      },
      -      "unitPrice": {
      -        "description": "Unit price",
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "amount"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • removedOutput schema / properties / notApplied
      Removed value: -{
      -  "description": "Fields QuickBooks did NOT store as sent (it answered success anyway). On an update this makes success false with errorCode NOT_APPLIED.",
      -  "items": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "field": {
      -        "type": "string"
      -      },
      -      "reason": {
      -        "type": "string"
      -      },
      -      "sent": {},
      -      "stored": {}
      -    },
      -    "required": [
      -      "field",
      -      "sent",
      -      "stored"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • removedOutput schema / properties / projectId
      Removed value: -{
      -  "description": "Project the STORED invoice is on (QuickBooks project id).",
      -  "type": "string"
      -}
    • removedOutput schema / properties / salesTermName
      Removed value: -{
      -  "description": "Payment terms (e.g., Net 30)",
      -  "type": "string"
      -}
    • removedOutput schema / properties / syncToken
      Removed value: -{
      -  "description": "SyncToken for future updates",
      -  "type": "string"
      -}
    • removedOutput schema / properties / taxAmount
      Removed value: -{
      -  "description": "Total tax amount calculated by QuickBooks",
      -  "type": "number"
      -}
    • removedOutput schema / properties / totalAmount
      Removed value: -{
      -  "type": "number"
      -}
    • removedOutput schema / properties / txnDate
      Removed value: -{
      -  "description": "Invoice date",
      -  "type": "string"
      -}
    • removedOutput schema / properties / txnTaxCodeId
      Removed value: -{
      -  "description": "Transaction tax code QuickBooks STORED.",
      -  "type": "string"
      -}
    • removedOutput schema / properties / warning / description
      Removed value: -"Present once after the active company was changed by something other than this connection (the portal, or another AI client). Confirm the company with the user before writing."
    • removedOutput schema / required
      Removed value: -[
      -  "success",
      -  "message"
      -]
  2. Changed1 schema field changed
    • changedInput schema / properties / customerMemo / description
      Previous value: -"Message shown on the invoice."New value: +"Message shown on the invoice. Omitted on create: the company's default invoice message (where firms keep payment instructions), as QuickBooks' own screen fills it. \"\" for none."
  3. Changed2 schema fields changed
    • changedInput schema / properties / billEmail / pattern
      Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • changedOutput schema / properties / notApplied / items / required
      Previous value: -[
      -  "field"
      -]New value: +[
      +  "field",
      +  "sent",
      +  "stored"
      +]
  4. Changed5 schema fields changed
    • changedInput schema / properties / customFields / description
      Previous value: -"Custom field values; the definition must be switched on for this transaction type (qbCustomField list). On update only the fields sent change."New value: +"Custom field values; the definition must be switched on for this transaction type (qbCustomization list). On update only the fields sent change."
    • changedInput schema / properties / customFields / items / properties / definitionId / description
      Previous value: -"Numeric id from qbCustomField list."New value: +"Numeric id from qbCustomization list."
    • changedInput schema / properties / dimensions / items / properties / dimensionId / description
      Previous value: -"qbDimension list id."New value: +"qbCustomization list id."
    • changedInput schema / properties / lines / items / properties / dimensions / items / properties / dimensionId / description
      Previous value: -"qbDimension list id."New value: +"qbCustomization list id."
    • removedOutput schema / properties / company / properties / realmId
      Removed value: -{
      -  "description": "QuickBooks realm id, when connected.",
      -  "type": "string"
      -}
  5. Changed58 schema fields changed
    • changedInput schema / properties / allowOnlineACHPayment / description
      Previous value: -"Per-invoice \"Pay now\" bank-transfer (ACH) option. Same semantics as allowOnlineCreditCardPayment: true shows it, false hides it, omitted = company default on create / unchanged on update. The two are independent — e.g. allowOnlineACHPayment true + allowOnlineCreditCardPayment false for a customer who may not pay by card."New value: +"\"Pay now\" by bank transfer (ACH); same rules as allowOnlineCreditCardPayment, set independently."
    • changedInput schema / properties / allowOnlineCreditCardPayment / description
      Previous value: -"Per-invoice \"Pay now\" card option. true shows \"pay by credit card\" on the customer-facing invoice, false hides it, omitted = the company default on create / unchanged on update (the tool re-sends the stored value: QuickBooks itself resets an omitted flag to the company default on EVERY sparse update, so a toggle set by hand in QuickBooks survives an unrelated edit only because of this carry). Only has a customer-visible effect when QuickBooks Payments is connected to the company; QuickBooks stores the flag either way (proven live on a Sandbox without Payments) and the response echoes what was stored. QuickBooks has NO per-customer setting for this — keep the customer's policy (e.g. \"no credit card\") in agentMemory and pass the flag on every invoice for that customer."New value: +"\"Pay now\" by card on this invoice: true shows, false hides; omitted = company default on create, unchanged on update. QuickBooks has no per-customer setting: keep the policy in agentMemory and pass it on every invoice."
    • changedInput schema / properties / applyTaxAfterDiscount / description
      Previous value: -"US companies with sales tax only: compute sales tax on the post-discount subtotal instead of the pre-discount subtotal. Proven live on a US company with Automated Sales Tax — a 100.00 line with a 10% discount books 10.50 of tax when false and 9.45 when true. Outside the US it does NOTHING: a VAT/GST company neither stores nor echoes the flag and always taxes the discounted subtotal (GB-proven, matching the same field on CreditMemo)."New value: +"US sales tax only: tax the post-discount subtotal. Does nothing on VAT/GST companies (always post-discount)."
    • changedInput schema / properties / billAddr / description
      Previous value: -"Billing address printed on the invoice (defaults to the customer's on create). ON UPDATE the provided fields are merged over the stored billing address."New value: +"Billing address on the invoice (create defaults to the customer's). On update the fields sent merge over the stored address."
    • removedInput schema / properties / billAddr / properties / city / description
      Removed value: -"City"
    • removedInput schema / properties / billAddr / properties / country / description
      Removed value: -"Country"
    • removedInput schema / properties / billAddr / properties / line1 / description
      Removed value: -"Street address line 1"
    • removedInput schema / properties / billAddr / properties / line2 / description
      Removed value: -"Street address line 2"
    • removedInput schema / properties / billAddr / properties / postalCode / description
      Removed value: -"ZIP/postal code"
    • changedInput schema / properties / billAddr / properties / state / description
      Previous value: -"State/province code (maps to CountrySubDivisionCode)"New value: +"State/province code"
    • changedInput schema / properties / billEmail / description
      Previous value: -"Email address stored on the invoice (BillEmail) — where it goes when sent from QuickBooks"New value: +"Address stored on the invoice; sends nothing."
    • changedInput schema / properties / currencyCode / description
      Previous value: -"ISO currency for this transaction (e.g. \"USD\"). Multicurrency companies only. Omit to let QuickBooks take the customer's currency, which is normally correct."New value: +"ISO code, multicurrency companies only. Omit to use the customer's currency (normally right)."
    • changedInput schema / properties / customFields / description
      Previous value: -"Custom field values (QuickBooks Plus/Advanced custom fields). Only definitions switched on for this transaction type are accepted — check qbCustomField list. On update only the fields sent change; omitted custom fields keep their stored values."New value: +"Custom field values; the definition must be switched on for this transaction type (qbCustomField list). On update only the fields sent change."
    • changedInput schema / properties / customFields / items / properties / definitionId / description
      Previous value: -"Custom field definitionId from qbCustomField list (the numeric id)."New value: +"Numeric id from qbCustomField list."
    • changedInput schema / properties / customFields / items / properties / value / description
      Previous value: -"Value to store. Text as-is; NUMBER fields a number; DATE fields YYYY-MM-DD; dropdown fields one of the option labels qbCustomField lists (case-insensitive). Empty string clears a text, number or date field; a dropdown cannot be cleared through the API."New value: +"Text; number; date YYYY-MM-DD; or a dropdown option label. \"\" clears (not dropdowns)."
    • changedInput schema / properties / customerId / description
      Previous value: -"QuickBooks Customer ID (from qb_master_data tool). Required for create."New value: +"Customer id. Create: this or projectId."
    • changedInput schema / properties / customerMemo / description
      Previous value: -"Message to customer (appears on invoice)"New value: +"Message shown on the invoice."
    • changedInput schema / properties / departmentId / description
      Previous value: -"QB Department/Location ID. Requires location tracking enabled on the company."New value: +"Location (department) id."
    • changedInput schema / properties / deposit / description
      Previous value: -"Customer prepayment already collected against this invoice. Reduces the balance due; requires deposits enabled on the company. Credits Undeposited Funds (QuickBooks' own default) unless the invoice already stores a deposit account. Set 0 on update to remove an existing deposit."New value: +"Prepayment already collected; reduces the balance due (deposits must be enabled). Credits Undeposited Funds unless a deposit account is stored. 0 on update removes it."
    • changedInput schema / properties / dimensions / description
      Previous value: -"Intuit Enterprise Suite dimensions for the WHOLE document (e.g. a sales rep): written to every line, because QuickBooks stores dimensions per line only. A line that sets the same dimension keeps its own value. On update without lines, the stored lines are re-sent unchanged except for these values — a safe way to re-tag an existing document (payments and balances are untouched)."New value: +"IES dimensions for the whole document (e.g. sales rep), written to every line; a line's own value wins. On an invoice, sales receipt, estimate or credit memo update without lines it re-tags the stored lines, changing nothing else; other tools need the lines."
    • changedInput schema / properties / dimensions / items / properties / dimensionId / description
      Previous value: -"Dimension id from qbDimension list."New value: +"qbDimension list id."
    • changedInput schema / properties / dimensions / items / properties / value / description
      Previous value: -"The value: its id or its full name as qbDimension lists it."New value: +"Value id or full name."
    • changedInput schema / properties / discount / description
      Previous value: -"Discount applied after the line subtotal. QuickBooks posts it as its own line so gross revenue and discounts stay separate. Requires the company to have discounts enabled. ON UPDATE: changing the discount requires re-sending ALL lines (QuickBooks replaces the whole line array together); when lines are replaced and discount is omitted, the existing discount is preserved automatically. To REMOVE a discount, re-send lines with discount {percent: 0}."New value: +"Discount after the line subtotal, posted as its own line (discounts must be enabled). On update send it WITH all lines; lines replaced without it keep the stored discount; {percent:0} with lines removes it."
    • changedInput schema / properties / discount / properties / accountId / description
      Previous value: -"Income account the discount posts to (e.g. \"Discounts given\"). Defaults to the company default discount account."New value: +"Income account it posts to; default = the company discount account."
    • changedInput schema / properties / discount / properties / amount / description
      Previous value: -"Fixed discount amount. Provide percent OR amount, not both."New value: +"Fixed amount. Send percent OR amount."
    • changedInput schema / properties / discount / properties / percent / description
      Previous value: -"Percentage discount off the line subtotal (e.g. 10 for 10%)"New value: +"Percent off the line subtotal (10 = 10%)."
    • removedInput schema / properties / docNumber / description
      Removed value: -"Invoice number (max 21 characters)"
    • removedInput schema / properties / dueDate / description
      Removed value: -"Due date in YYYY-MM-DD format (e.g., 2025-02-15)."
    • changedInput schema / properties / emailStatus / description
      Previous value: -"Email status flag. \"NeedToSend\" queues the invoice in QuickBooks' \"Send later\" list — it does NOT email anything by itself; a human sends it from the QuickBooks UI (proven live: after create the invoice has no DeliveryInfo.DeliveryTime, i.e. nothing was delivered). PRECONDITION: \"NeedToSend\" requires an email address — pass billEmail, or the customer must already have one on file (QuickBooks rejects it with 6000 otherwise; the tool checks first and names the fix). \"EmailSent\" and \"NotSet\" need no address."New value: +"\"NeedToSend\" does NOT email: it only queues the invoice in QuickBooks' Send later list for a human; it needs billEmail or a customer email."
    • changedInput schema / properties / exchangeRate / description
      Previous value: -"Rate converting the transaction currency to the company home currency. Supply this on foreign-currency documents: when QuickBooks has no current rate on file it silently uses 1, recording the foreign amount at face value in the home currency. The tool warns when that happens."New value: +"Transaction-to-home-currency rate. Send it on foreign-currency documents: with no rate on file QuickBooks silently uses 1."
    • changedInput schema / properties / invoiceId / description
      Previous value: -"QuickBooks Invoice ID to update. SPARSE UPDATE: only provide fields you want to change — omitted fields (including lines) are preserved unchanged."New value: +"Invoice id: present = update."
    • changedInput schema / properties / lines / description
      Previous value: -"Invoice line items. Required for create. For update: ONLY provide if you want to REPLACE ALL existing lines. Omit entirely to keep existing lines unchanged."New value: +"Create: required. Update: omit to keep the stored lines; sent lines REPLACE all of them."
    • changedInput schema / properties / lines / items / properties / amount / description
      Previous value: -"Line amount. Zero ($0.00 no-charge lines) and NEGATIVE amounts (adjustments, reversals, amounts withheld) are allowed — QuickBooks taxes the net. The invoice total must stay 0 or greater (QuickBooks refuses a negative total)."New value: +"Line amount. Zero and negative lines are allowed (tax is on the net); the invoice total must be 0 or more."
    • removedInput schema / properties / lines / items / properties / classId / description
      Removed value: -"QB Class ID for tracking"
    • removedInput schema / properties / lines / items / properties / description / description
      Removed value: -"Line description"
    • changedInput schema / properties / lines / items / properties / dimensions / description
      Previous value: -"Intuit Enterprise Suite dimensions for this line — at most one value per dimension. Re-send them when replacing lines, or the line loses them."New value: +"IES dimensions on this line, one value per dimension. Re-send them when replacing lines or they are lost."
    • changedInput schema / properties / lines / items / properties / dimensions / items / properties / dimensionId / description
      Previous value: -"Dimension id from qbDimension list."New value: +"qbDimension list id."
    • changedInput schema / properties / lines / items / properties / dimensions / items / properties / value / description
      Previous value: -"The value on this line: its id, or its full name as qbDimension lists it (e.g. \"West:California\", case-insensitive)."New value: +"Value id or full name (\"West:California\")."
    • changedInput schema / properties / lines / items / properties / itemId / description
      Previous value: -"QB Item ID (from qbMasterData entityTypes:[\"item\"]). Effectively REQUIRED: QuickBooks rejects a line whose SalesItemLineDetail is empty, and when omitted alongside other line fields it silently substitutes a default item, sending revenue to that item's income account."New value: +"Item id (qbMasterData item). Always send it: without it QuickBooks silently substitutes a default item and its income account."
    • removedInput schema / properties / lines / items / properties / quantity / description
      Removed value: -"Quantity"
    • removedInput schema / properties / lines / items / properties / serviceDate / description
      Removed value: -"Service date for this line (YYYY-MM-DD)"
    • changedInput schema / properties / lines / items / properties / taxCodeId / description
      Previous value: -"Line taxability. US companies: the literal \"TAX\" or \"NON\" — QB rejects numeric ids there. NON-US companies (CA/GB/AU/...): a real TaxCode id from qbMasterData(entityTypes:[\"taxCode\"]) — \"TAX\"/\"NON\" are meaningless there. The tool knows the company country and rejects the wrong form."New value: +"US: the literal \"TAX\" or \"NON\". Non-US: a TaxCode id (qbMasterData taxCode)."
    • removedInput schema / properties / lines / items / properties / unitPrice / description
      Removed value: -"Unit price"
    • changedInput schema / properties / memo / description
      Previous value: -"Private memo/note (internal only)"New value: +"Private note."
    • changedInput schema / properties / projectId / description
      Previous value: -"QuickBooks project id (from qbProject list) to put this whole document on a project. QuickBooks then bills the PROJECT: the customer on the document becomes the project's own sub-customer, so customerId must be the project's customer or be omitted. Deleted projects are refused."New value: +"Project id (qbProject list) for the whole document. QuickBooks moves the document to the project's sub-customer, so customerId must be the project's customer or omitted."
    • changedInput schema / properties / salesTermId / description
      Previous value: -"QB Sales Term ID for payment terms (e.g., Net 30, Net 15). Look ids up with qbMasterData(entityTypes:[\"term\"])."New value: +"Term id (qbMasterData term)."
    • changedInput schema / properties / shipAddr / description
      Previous value: -"Shipping address. ON UPDATE the provided fields are merged over the invoice's stored shipping address (QuickBooks would otherwise replace the whole address object, wiping omitted fields)."New value: +"Shipping address. On update the fields sent merge over the invoice's stored address."
    • removedInput schema / properties / shipAddr / properties / city / description
      Removed value: -"City"
    • removedInput schema / properties / shipAddr / properties / country / description
      Removed value: -"Country"
    • removedInput schema / properties / shipAddr / properties / line1 / description
      Removed value: -"Street address line 1"
    • removedInput schema / properties / shipAddr / properties / line2 / description
      Removed value: -"Street address line 2"
    • removedInput schema / properties / shipAddr / properties / postalCode / description
      Removed value: -"ZIP/postal code"
    • changedInput schema / properties / shipAddr / properties / state / description
      Previous value: -"State/province code (maps to CountrySubDivisionCode)"New value: +"State/province code"
    • removedInput schema / properties / shipDate / description
      Removed value: -"Ship date (YYYY-MM-DD)"
    • changedInput schema / properties / taxCalculation / description
      Previous value: -"Non-US companies only (CA/GB/AU/...): set \"TaxExcluded\" — line amounts are NET and tax is added on top. QuickBooks requires GlobalTaxCalculation on taxed sales transactions outside the US; required on CREATE with taxed lines. ON UPDATE it may be omitted — the document's stored setting is carried forward (exception: adding taxed lines to a previously untaxed document still requires an explicit \"TaxExcluded\"). \"TaxInclusive\" is REJECTED: QB stores it but ignores it, treating amounts as net anyway, so a gross-priced invoice would post overstated by the tax — convert to net yourself first. Ignored for US companies."New value: +"Non-US only: \"TaxExcluded\" (amounts are NET), required on create with taxed lines; on update the stored setting is kept (adding taxed lines to an untaxed invoice needs it). \"TaxInclusive\" is refused: convert a gross-priced invoice to net first."
    • removedInput schema / properties / trackingNum / description
      Removed value: -"Shipment tracking number"
    • changedInput schema / properties / txnDate / description
      Previous value: -"Invoice date in YYYY-MM-DD format (e.g., 2025-01-15). Required for create."New value: +"YYYY-MM-DD. Create: required."
    • changedInput schema / properties / txnTaxCodeId / description
      Previous value: -"Transaction-level sales-tax code (TxnTaxDetail.TxnTaxCodeRef): a TaxCode id from qbMasterData(entityTypes:[\"taxCode\"]) — not TAX/NON (those are line values) and not a TaxRate id. QuickBooks computes the tax from it and the lines' taxCodeIds. On update it can be changed without re-sending lines (the tool carries the stored lines, because QuickBooks ignores a code sent without them); the result reports the code QuickBooks actually stored."New value: +"Transaction sales-tax code: a TaxCode id (qbMasterData taxCode), not TAX/NON or a TaxRate id. On update it can change without lines (the tool re-sends the stored lines)."
  6. Changed3 schema fields changed
    • addedInput schema / properties / dimensions
      Added value: +{
      +  "description": "Intuit Enterprise Suite dimensions for the WHOLE document (e.g. a sales rep): written to every line, because QuickBooks stores dimensions per line only. A line that sets the same dimension keeps its own value. On update without lines, the stored lines are re-sent unchanged except for these values — a safe way to re-tag an existing document (payments and balances are untouched).",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "dimensionId": {
      +        "description": "Dimension id from qbDimension list.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The value: its id or its full name as qbDimension lists it.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "dimensionId",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / lines / items / properties / amount / description
      Previous value: -"Line amount"New value: +"Line amount. Zero ($0.00 no-charge lines) and NEGATIVE amounts (adjustments, reversals, amounts withheld) are allowed — QuickBooks taxes the net. The invoice total must stay 0 or greater (QuickBooks refuses a negative total)."
    • removedInput schema / properties / lines / items / properties / amount / exclusiveMinimum
      Removed value: -0
  7. Changed5 schema fields changed
    • addedInput schema / properties / billAddr
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Billing address printed on the invoice (defaults to the customer's on create). ON UPDATE the provided fields are merged over the stored billing address.",
      +  "properties": {
      +    "city": {
      +      "description": "City",
      +      "type": "string"
      +    },
      +    "country": {
      +      "description": "Country",
      +      "type": "string"
      +    },
      +    "line1": {
      +      "description": "Street address line 1",
      +      "type": "string"
      +    },
      +    "line2": {
      +      "description": "Street address line 2",
      +      "type": "string"
      +    },
      +    "postalCode": {
      +      "description": "ZIP/postal code",
      +      "type": "string"
      +    },
      +    "state": {
      +      "description": "State/province code (maps to CountrySubDivisionCode)",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / shipAddr / properties / line2
      Added value: +{
      +  "description": "Street address line 2",
      +  "type": "string"
      +}
    • changedInput schema / properties / txnTaxCodeId / description
      Previous value: -"QB Tax Code ID for the entire transaction (sets TxnTaxDetail.TxnTaxCodeRef). Use qbMasterData(entityTypes:[\"taxCode\"]) to look up IDs — TaxCode IDs (e.g. US \"TAX\"/\"NON\"), NOT TaxRate IDs, which QB rejects. When set, QuickBooks auto-calculates tax based on this code and the line-level taxCodeIds."New value: +"Transaction-level sales-tax code (TxnTaxDetail.TxnTaxCodeRef): a TaxCode id from qbMasterData(entityTypes:[\"taxCode\"]) — not TAX/NON (those are line values) and not a TaxRate id. QuickBooks computes the tax from it and the lines' taxCodeIds. On update it can be changed without re-sending lines (the tool carries the stored lines, because QuickBooks ignores a code sent without them); the result reports the code QuickBooks actually stored."
    • addedOutput schema / properties / notApplied
      Added value: +{
      +  "description": "Fields QuickBooks did NOT store as sent (it answered success anyway). On an update this makes success false with errorCode NOT_APPLIED.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "field": {
      +        "type": "string"
      +      },
      +      "reason": {
      +        "type": "string"
      +      },
      +      "sent": {},
      +      "stored": {}
      +    },
      +    "required": [
      +      "field"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / txnTaxCodeId
      Added value: +{
      +  "description": "Transaction tax code QuickBooks STORED.",
      +  "type": "string"
      +}
  8. Changed6 schema fields changed
    • addedInput schema / properties / customFields
      Added value: +{
      +  "description": "Custom field values (QuickBooks Plus/Advanced custom fields). Only definitions switched on for this transaction type are accepted — check qbCustomField list. On update only the fields sent change; omitted custom fields keep their stored values.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "definitionId": {
      +        "description": "Custom field definitionId from qbCustomField list (the numeric id).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Value to store. Text as-is; NUMBER fields a number; DATE fields YYYY-MM-DD; dropdown fields one of the option labels qbCustomField lists (case-insensitive). Empty string clears a text, number or date field; a dropdown cannot be cleared through the API.",
      +        "type": [
      +          "string",
      +          "number"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "definitionId",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / lines / items / properties / dimensions
      Added value: +{
      +  "description": "Intuit Enterprise Suite dimensions for this line — at most one value per dimension. Re-send them when replacing lines, or the line loses them.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "dimensionId": {
      +        "description": "Dimension id from qbDimension list.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The value on this line: its id, or its full name as qbDimension lists it (e.g. \"West:California\", case-insensitive).",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "dimensionId",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / projectId
      Added value: +{
      +  "description": "QuickBooks project id (from qbProject list) to put this whole document on a project. QuickBooks then bills the PROJECT: the customer on the document becomes the project's own sub-customer, so customerId must be the project's customer or be omitted. Deleted projects are refused.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / customFields
      Added value: +{
      +  "description": "Custom field values as QuickBooks STORED them after this write (dropdowns shown by option label). Returned only when the call sent customFields — read this to confirm a value landed.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "definitionId": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "definitionId"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / lines / items / properties / dimensions
      Added value: +{
      +  "description": "Dimension values stored on the line — pass them back as dimensions when replacing lines.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "dimension": {
      +        "type": "string"
      +      },
      +      "dimensionId": {
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "string"
      +      },
      +      "valueId": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "dimensionId",
      +      "valueId"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / projectId
      Added value: +{
      +  "description": "Project the STORED invoice is on (QuickBooks project id).",
      +  "type": "string"
      +}
  9. First observed

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false and openWorldHint=true, and the description goes well beyond them: full line-replacement semantics with the specific fields that are silently lost, the US tax-zeroing trap on omitted taxCodeId, the unapplied-credit outcome when lines fall below amount paid, the partial-save semantics of NOT_APPLIED, and that txnTaxCodeId can change without re-sending lines. That is strong disclosure. However, "sent lines replace ALL stored lines ... or they are lost" describes an overwriting, data-losing operation while the annotation sets destructiveHint=false; the description never reconciles that gap, so an agent could be surprised about irreversibility. Credit for rich context, penalty for leaving that annotation tension unaddressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, create path, update path, then hazards — front-loaded and ordered by what an agent needs first. The telegraphic, parenthetical style packs a lot per sentence with almost no filler, though the dense run-ons ("Create: ... Update: ...") require careful reading and a bulleted hazard list would scan better.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 29-parameter accounting write with nested line objects and an output schema, the description covers what the structured fields cannot: which parameters are required per mode despite 0 declared required fields, the overwrite hazard, tax and email side effects, the pre-flight lookup, and how to interpret NOT_APPLIED. Return values are covered by the output schema, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 31% across 29 parameters, so the description must carry weight, and it does for the highest-risk ones: it defines the create/update parameter sets, explains taxCodeId loss on line replacement, and clarifies that emailStatus is a status flag, not a send action. It still leaves most of the 29 fields (deposit, discount, customFields, exchangeRate, currencyCode, address blocks, allowOnline* flags) to the schema, so the compensation is partial rather than complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource pair ("create or update a customer Invoice") and immediately splits the two modes by their identifying parameters (customerId/projectId+txnDate+lines vs invoiceId+changes). It also names the siblings it is not — qbSendEmail for emailing, qbPayment for applying payment — so an agent can route without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit pre-create procedure (qbFetchTransactions with transactionType:"Invoice", outstandingOnly:true, entityId:customerId, no date window) and the reason to run it (find an open match to collect with qbPayment). It also states an exclusion — emailStatus "NeedToSend" does not send mail, use qbSendEmail — which is exactly the when-not guidance most definitions omit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.