Skip to main content
Glama

DeepLedger QuickBooks MCP Server for ChatGPT, Claude & AI

qbReports

Read-onlyIdempotent

QuickBooks: run a report by reportType (statements, agings, ledgers, transaction lists, sales, budgets). Dates YYYY-MM-DD: as-of reports (agings, balances, InventoryValuationSummary, BalanceSheet) take endDate only; AccountList none; the rest startDate and endDate. Filters are per report; others are refused (PARAM_NOT_SUPPORTED). TransactionList* take cleared, groupBy and, except WithSplits, printed, amount, memo, arPaid, apPaid, termIds, dueDateStart/End, modifiedStart/End; nameIds, transactionType, sourceAccountType, docNum also work on GeneralLedger and JournalReport; agingPeriod, numPeriods on the aged reports. summarizeBy: P&L, BalanceSheet, CashFlow, TrialBalance, VendorExpenses, Sales reports, BudgetVsActuals. One class or location: classIds/departmentIds; a column each: summarizeBy or ProfitAndLossByClass. One account's transactions: GeneralLedger + accountIds. Page: the rowOffset the message gives. format:"json" adds numeric rowsJson.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "reportType": "<reportType>"
    },
    "name": "qbReports"
  }
}

Input Schema

NameRequiredDescriptionDefault
memoNo
amountNo
apPaidNoAlso VendorBalance[Detail].
arPaidNoAlso CustomerBalance[Detail].
docNumNo
formatNo
sortByNoMoney columns sort alphabetically.
clearedNo
columnsNoDetail/list reports; drops subtotals.
endDateNo
groupByNo
itemIdsNo
maxRowsNo
nameIdsNoCustomer, vendor or employee ids.
pastDueNoAged details.
printedNo
shipViaNoAR aging/balance details.
termIdsNoAlso agings/balance details.
budgetIdNoBudgetVsActuals; omit for the active budget.
classIdsNo
companyIdNo
rowOffsetNo
sortOrderNo
startDateNo
vendorIdsNo
accountIdsNoP&L, GeneralLedger, P&L detail.
dueDateEndNoAlso agings/balance details.
numPeriodsNoBuckets (4).
reportTypeYes
accountTypeNoAccountList, GeneralLedger, P&L detail.
agingPeriodNoDays per bucket (30).
customerIdsNo
dimensionIdNoSalesByDimension.
employeeIdsNoP&L detail.
modifiedEndNoAlso AccountList.
summarizeByNo
dueDateStartNoAlso agings/balance details.
accountStatusNoAccountList.
departmentIdsNo
modifiedStartNoAlso AccountList.
paymentMethodNoMethod NAME. Also P&L detail.
transactionTypeNoOne value.
accountingMethodNoOmit for the company basis.
adjustedGainLossNoMulti-currency P&L and BalanceSheet.
sourceAccountIdsNoGeneralLedger.
sourceAccountTypeNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed48 schema fields changed
    • addedInput schema / $schema
      Added value: +"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / accountIds / description
      Previous value: -"Only these accounts (Account.Id list). For one account's transactions run GeneralLedger with accountIds. Works on: ProfitAndLoss, GeneralLedger, ProfitAndLossDetail."New value: +"P&L, GeneralLedger, P&L detail."
    • changedInput schema / properties / accountStatus / description
      Previous value: -"Deleted or live accounts. Works on: AccountList."New value: +"AccountList."
    • changedInput schema / properties / accountType / description
      Previous value: -"Only accounts of this type. Works on: AccountList, GeneralLedger, ProfitAndLossDetail."New value: +"AccountList, GeneralLedger, P&L detail."
    • changedInput schema / properties / accountingMethod / description
      Previous value: -"Omit for the company default basis (qbCompanyProfile reportBasis). BudgetVsActuals defaults to Accrual. Refused on the agings, balances, transaction lists, JournalReport, AccountList and inventory: same numbers either way."New value: +"Omit for the company basis."
    • changedInput schema / properties / adjustedGainLoss / description
      Previous value: -"Multi-currency companies: include unrealized gains and losses. Works on: ProfitAndLoss, ProfitAndLossByClass, BalanceSheet, ProfitAndLossDetail."New value: +"Multi-currency P&L and BalanceSheet."
    • changedInput schema / properties / agingPeriod / description
      Previous value: -"Days per aging bucket (default 30). Works on: AgedReceivablesDetail, AgedPayablesDetail, AgedReceivables, AgedPayables."New value: +"Days per bucket (30)."
    • removedInput schema / properties / amount / description
      Removed value: -"Exact transaction amount. Works on: the transaction lists except WithSplits."
    • changedInput schema / properties / apPaid / description
      Previous value: -"Payable documents: All, Paid or Unpaid. Works on: the transaction lists except WithSplits, VendorBalance, VendorBalanceDetail."New value: +"Also VendorBalance[Detail]."
    • changedInput schema / properties / arPaid / description
      Previous value: -"Receivable documents: All, Paid or Unpaid. Works on: the transaction lists except WithSplits, CustomerBalance, CustomerBalanceDetail."New value: +"Also CustomerBalance[Detail]."
    • changedInput schema / properties / budgetId / description
      Previous value: -"BudgetVsActuals only. Omit to use the one active budget covering the period; when several or none do, the result lists the budgets to pick from."New value: +"BudgetVsActuals; omit for the active budget."
    • removedInput schema / properties / classIds / description
      Removed value: -"Only these classes (Class.Id list; needs class tracking)."
    • removedInput schema / properties / cleared / description
      Removed value: -"Bank-reconciliation status. Works on: the transaction lists."
    • changedInput schema / properties / columns / description
      Previous value: -"Column keys to return, in QuickBooks' own order. The money key differs per report: subt_nat_amount (TransactionList, GeneralLedger, ProfitAndLossDetail), amount (TransactionListByCustomer, TransactionListWithSplits), nat_amount (TransactionListByVendor), debt_amt/credit_amt (JournalReport). TransactionList has no split or other-account column: use TransactionListWithSplits, or GeneralLedger, where split_acc stands in for account_name (as on ProfitAndLossDetail). Choosing columns on GeneralLedger/ProfitAndLossDetail drops the subtotal rows. Works on: the transaction lists, the aging and balance details, AccountList, GeneralLedger, JournalReport, ProfitAndLossDetail."New value: +"Detail/list reports; drops subtotals."
    • addedInput schema / properties / companyId
      Added value: +{
      +  "type": "string"
      +}
    • removedInput schema / properties / customerIds / description
      Removed value: -"Only these customers (Customer.Id list)."
    • removedInput schema / properties / departmentIds / description
      Removed value: -"Only these locations/departments (Department.Id list; needs location tracking)."
    • changedInput schema / properties / dimensionId / description
      Previous value: -"The dimension to total by. Works on: SalesByDimension."New value: +"SalesByDimension."
    • removedInput schema / properties / docNum / description
      Removed value: -"Document/reference number to match. Works on: the transaction lists, GeneralLedger, JournalReport."
    • changedInput schema / properties / dueDateEnd / description
      Previous value: -"Only documents due on or before this date. Works on: the transaction lists except WithSplits, the aging and balance details."New value: +"Also agings/balance details."
    • changedInput schema / properties / dueDateStart / description
      Previous value: -"Only documents due on or after this date. Works on: the transaction lists except WithSplits, the aging and balance details."New value: +"Also agings/balance details."
    • changedInput schema / properties / employeeIds / description
      Previous value: -"Only these employees (Employee.Id list). Works on: ProfitAndLossDetail."New value: +"P&L detail."
    • removedInput schema / properties / endDate / description
      Removed value: -"Period end, or the as-of date on an as-of report. YYYY-MM-DD. Required except on AccountList."
    • addedInput schema / properties / format
      Added value: +{
      +  "enum": [
      +    "text",
      +    "json"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / groupBy / description
      Removed value: -"Group rows into sections by this field; None = a flat list. Works on: the transaction lists."
    • removedInput schema / properties / itemIds / description
      Removed value: -"Only these products/services (Item.Id list)."
    • removedInput schema / properties / maxRows / description
      Removed value: -"Rows per page (default 500)."
    • removedInput schema / properties / memo / description
      Removed value: -"Memo text to match. GeneralLedger has no text, status or amount filter: pull the account's ledger and filter the rows yourself. Works on: the transaction lists except WithSplits."
    • changedInput schema / properties / modifiedEnd / description
      Previous value: -"Only records last modified on or before this date. Works on: the transaction lists except WithSplits, AccountList."New value: +"Also AccountList."
    • changedInput schema / properties / modifiedStart / description
      Previous value: -"Only records last modified on or after this date. Works on: the transaction lists except WithSplits, AccountList."New value: +"Also AccountList."
    • changedInput schema / properties / nameIds / description
      Previous value: -"Only these names: any Customer, Vendor or Employee Id. Works on: the transaction lists, GeneralLedger, JournalReport."New value: +"Customer, vendor or employee ids."
    • changedInput schema / properties / numPeriods / description
      Previous value: -"Number of aging buckets (default 4). Works on: AgedReceivablesDetail, AgedPayablesDetail, AgedReceivables, AgedPayables."New value: +"Buckets (4)."
    • changedInput schema / properties / pastDue / description
      Previous value: -"Only documents at least this many days past due. Works on: AgedReceivablesDetail, AgedPayablesDetail."New value: +"Aged details."
    • changedInput schema / properties / paymentMethod / description
      Previous value: -"Payment method NAME as QuickBooks shows it (Cash, Check, Visa, ...), not an id. Works on: the transaction lists, ProfitAndLossDetail."New value: +"Method NAME. Also P&L detail."
    • removedInput schema / properties / printed / description
      Removed value: -"Whether checks were printed. Works on: the transaction lists except WithSplits."
    • removedInput schema / properties / reportType / description
      Removed value: -"The report to run."
    • removedInput schema / properties / rowOffset / description
      Removed value: -"0-based row offset for the next page. A page can start mid-section, so [Section] headers from earlier pages still apply."
    • changedInput schema / properties / shipVia / description
      Previous value: -"Shipping method name as stored on the invoice. Works on: AgedReceivablesDetail, CustomerBalanceDetail."New value: +"AR aging/balance details."
    • changedInput schema / properties / sortBy / description
      Previous value: -"Detail/list reports: column key to sort by. A money column sorts alphabetically, not numerically; AccountList ignores account_bal (sort by account_name or detail_acc_type)."New value: +"Money columns sort alphabetically."
    • removedInput schema / properties / sortOrder / description
      Removed value: -"ascend or descend, with or without sortBy."
    • changedInput schema / properties / sourceAccountIds / description
      Previous value: -"Only postings whose source bank/credit-card account is one of these. Works on: GeneralLedger."New value: +"GeneralLedger."
    • removedInput schema / properties / sourceAccountType / description
      Removed value: -"Only transactions whose source account is of this type. Works on: the transaction lists, GeneralLedger, JournalReport."
    • removedInput schema / properties / startDate / description
      Removed value: -"Period start, YYYY-MM-DD. Period reports only: refused on AccountList, ignored on as-of reports."
    • removedInput schema / properties / summarizeBy / description
      Removed value: -"One column per period or entity, plus a Total column. Only on the reports the description lists."
    • changedInput schema / properties / termIds / description
      Previous value: -"Only documents on these payment terms (Term.Id list). Works on: the transaction lists except WithSplits, the aging and balance details."New value: +"Also agings/balance details."
    • changedInput schema / properties / transactionType / description
      Previous value: -"Only this transaction type (one value; a list is rejected). Works on: the transaction lists, GeneralLedger, JournalReport."New value: +"One value."
    • removedInput schema / properties / vendorIds / description
      Removed value: -"Only these vendors (Vendor.Id list)."
    • changedOutput schema / (root)
      Previous value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "company": {
      -      "additionalProperties": false,
      -      "description": "The company this result came from. Read it back to the user by name.",
      -      "properties": {
      -        "name": {
      -          "description": "DeepLedger client name.",
      -          "type": "string"
      -        },
      -        "organizationId": {
      -          "description": "DeepLedger organization id the call operated on.",
      -          "type": "string"
      -        },
      -        "qbCompanyName": {
      -          "description": "QuickBooks company name, when connected.",
      -          "type": "string"
      -        },
      -        "setAt": {
      -          "description": "When the active company was last set (source \"active\" only).",
      -          "type": "string"
      -        },
      -        "setBy": {
      -          "description": "Who last set the active company (source \"active\" only).",
      -          "enum": [
      -            "mcp",
      -            "portal",
      -            "backfill"
      -          ],
      -          "type": "string"
      -        },
      -        "source": {
      -          "description": "How the company was chosen: \"active\" = the user's switchable active company; \"pinned\" = fixed by the credential; \"header\" = fixed by X-Organization-Id; \"system\" = an unattended routine credential.",
      -          "enum": [
      -            "system",
      -            "header",
      -            "pinned",
      -            "active"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "organizationId"
      -      ],
      -      "type": "object"
      -    },
      -    "count": {
      -      "description": "Number of rows returned in this response (after maxRows/rowOffset paging)",
      -      "type": "number"
      -    },
      -    "data": {
      -      "additionalProperties": false,
      -      "description": "Report data with columns and rows",
      -      "properties": {
      -        "columns": {
      -          "description": "Pipe-separated column headers. Authoritative EXCEPT on SalesByProduct, where QuickBooks declares two columns over eight-wide rows and the tool substitutes the real header list.",
      -          "type": "string"
      -        },
      -        "rows": {
      -          "description": "Pipe-separated row data",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "required": [
      -        "columns",
      -        "rows"
      -      ],
      -      "type": "object"
      -    },
      -    "errorCode": {
      -      "description": "Stable code when success=false — QuickBooks codes (e.g. 5020) or one of MISSING_END_DATE, MISSING_START_DATE, INVALID_DATE, DATE_RANGE_INVERTED, PARAM_NOT_SUPPORTED, INVALID_PARAM, DATES_NOT_ALLOWED, MISSING_DIMENSION_ID, DIMENSION_NOT_FOUND, NO_BUDGETS, MULTIPLE_BUDGETS, NO_BUDGET_FOR_PERIOD, BUDGET_NOT_FOUND, BUDGET_TYPE_UNSUPPORTED, BUDGET_LOOKUP_FAILED, REPORT_FAILED, QB_NOT_CONNECTED, TOKEN_EXPIRED. Branch on this instead of parsing the message.",
      -      "type": "string"
      -    },
      -    "message": {
      -      "type": "string"
      -    },
      -    "reportDate": {
      -      "description": "Report date range",
      -      "type": "string"
      -    },
      -    "reportName": {
      -      "description": "Report name from QuickBooks",
      -      "type": "string"
      -    },
      -    "success": {
      -      "type": "boolean"
      -    },
      -    "summary": {
      -      "anyOf": [
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "accountCount": {
      -              "description": "GeneralLedger: number of accounts in the report. TrialBalance: number of accounts listed. NOT a row count — see totalRows for that.",
      -              "type": "number"
      -            },
      -            "balanced": {
      -              "description": "TrialBalance only: whether total debits equal total credits.",
      -              "type": "boolean"
      -            },
      -            "beginningCash": {
      -              "type": "number"
      -            },
      -            "classCount": {
      -              "type": "number"
      -            },
      -            "customerCount": {
      -              "type": "number"
      -            },
      -            "departmentCount": {
      -              "type": "number"
      -            },
      -            "documents": {
      -              "description": "SalesByDimension: documents.",
      -              "type": "number"
      -            },
      -            "endingCash": {
      -              "type": "number"
      -            },
      -            "financingCash": {
      -              "type": "number"
      -            },
      -            "grossProfit": {
      -              "description": "Income minus cost of goods sold. QuickBooks emits a Gross Profit line on every P&L, so on a company with no COGS section this equals totalIncome.",
      -              "type": "number"
      -            },
      -            "investingCash": {
      -              "type": "number"
      -            },
      -            "net": {
      -              "description": "SalesByDimension: net sales.",
      -              "type": "number"
      -            },
      -            "netAssets": {
      -              "description": "GB-style statutory balance sheets have no Total Assets/Total Liabilities lines; net assets (= equity) is the bottom line instead.",
      -              "type": "number"
      -            },
      -            "netCashChange": {
      -              "type": "number"
      -            },
      -            "netIncome": {
      -              "description": "The bottom line (Net Income; \"Net Revenue\" on a nonprofit). Equals totalIncome - totalCogs - totalExpenses + totalOtherIncome - totalOtherExpenses, NOT totalIncome - totalExpenses: the Other Income and Other Expenses sections sit below Net Operating Income and are excluded from those two.",
      -              "type": "number"
      -            },
      -            "netIncomeActual": {
      -              "type": "number"
      -            },
      -            "netIncomeBudget": {
      -              "type": "number"
      -            },
      -            "netIncomeVariance": {
      -              "type": "number"
      -            },
      -            "netOperatingIncome": {
      -              "description": "grossProfit - totalExpenses (\"Net Operating Revenue\" on a nonprofit).",
      -              "type": "number"
      -            },
      -            "netOtherIncome": {
      -              "description": "totalOtherIncome - totalOtherExpenses.",
      -              "type": "number"
      -            },
      -            "notTagged": {
      -              "description": "SalesByDimension: on untagged lines.",
      -              "type": "number"
      -            },
      -            "operatingCash": {
      -              "type": "number"
      -            },
      -            "productCount": {
      -              "type": "number"
      -            },
      -            "rowCount": {
      -              "type": "number"
      -            },
      -            "tagged": {
      -              "description": "SalesByDimension: on tagged lines.",
      -              "type": "number"
      -            },
      -            "totalAssetValue": {
      -              "description": "InventoryValuationSummary: total inventory asset value as of endDate.",
      -              "type": "number"
      -            },
      -            "totalAssets": {
      -              "type": "number"
      -            },
      -            "totalCogs": {
      -              "description": "Total Cost of Goods Sold. Absent when the company has no COGS section.",
      -              "type": "number"
      -            },
      -            "totalCredits": {
      -              "type": "number"
      -            },
      -            "totalDebits": {
      -              "type": "number"
      -            },
      -            "totalEquity": {
      -              "type": "number"
      -            },
      -            "totalExpenses": {
      -              "description": "Total of the Expenses section only; Other Expenses is reported separately in totalOtherExpenses.",
      -              "type": "number"
      -            },
      -            "totalExpensesActual": {
      -              "type": "number"
      -            },
      -            "totalExpensesBudget": {
      -              "type": "number"
      -            },
      -            "totalIncome": {
      -              "description": "Total of the Income section only; Other Income is reported separately in totalOtherIncome.",
      -              "type": "number"
      -            },
      -            "totalIncomeActual": {
      -              "type": "number"
      -            },
      -            "totalIncomeBudget": {
      -              "type": "number"
      -            },
      -            "totalLiabilities": {
      -              "type": "number"
      -            },
      -            "totalOtherExpenses": {
      -              "description": "Total Other Expenses. Absent when the company has no such section.",
      -              "type": "number"
      -            },
      -            "totalOtherIncome": {
      -              "description": "Total Other Income (released from restriction, in-kind, interest, gains). Absent when the company has no such section.",
      -              "type": "number"
      -            },
      -            "totalOutstanding": {
      -              "type": "number"
      -            },
      -            "type": {
      -              "type": "string"
      -            },
      -            "vendorCount": {
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "description": "Key metrics extracted from report. null when QuickBooks returned no rows at all."
      -    },
      -    "totalRows": {
      -      "description": "Total data rows in the full report. When totalRows > count, page with rowOffset.",
      -      "type": "number"
      -    },
      -    "warning": {
      -      "description": "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.",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "success",
      -    "message"
      -  ],
      -  "type": "object"
      -}New value: +null
  2. Changed2 schema fields changed
    • addedInput schema / properties / pastDue / maximum
      Added value: +9007199254740991
    • changedOutput schema / properties / summary / anyOf
      Previous value: -[
      -  {
      -    "anyOf": [
      -      {
      -        "not": {}
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "accountCount": {
      -            "description": "GeneralLedger: number of accounts in the report. TrialBalance: number of accounts listed. NOT a row count — see totalRows for that.",
      -            "type": "number"
      -          },
      -          "balanced": {
      -            "description": "TrialBalance only: whether total debits equal total credits.",
      -            "type": "boolean"
      -          },
      -          "beginningCash": {
      -            "type": "number"
      -          },
      -          "classCount": {
      -            "type": "number"
      -          },
      -          "customerCount": {
      -            "type": "number"
      -          },
      -          "departmentCount": {
      -            "type": "number"
      -          },
      -          "documents": {
      -            "description": "SalesByDimension: documents.",
      -            "type": "number"
      -          },
      -          "endingCash": {
      -            "type": "number"
      -          },
      -          "financingCash": {
      -            "type": "number"
      -          },
      -          "grossProfit": {
      -            "description": "Income minus cost of goods sold. QuickBooks emits a Gross Profit line on every P&L, so on a company with no COGS section this equals totalIncome.",
      -            "type": "number"
      -          },
      -          "investingCash": {
      -            "type": "number"
      -          },
      -          "net": {
      -            "description": "SalesByDimension: net sales.",
      -            "type": "number"
      -          },
      -          "netAssets": {
      -            "description": "GB-style statutory balance sheets have no Total Assets/Total Liabilities lines; net assets (= equity) is the bottom line instead.",
      -            "type": "number"
      -          },
      -          "netCashChange": {
      -            "type": "number"
      -          },
      -          "netIncome": {
      -            "description": "The bottom line (Net Income; \"Net Revenue\" on a nonprofit). Equals totalIncome - totalCogs - totalExpenses + totalOtherIncome - totalOtherExpenses, NOT totalIncome - totalExpenses: the Other Income and Other Expenses sections sit below Net Operating Income and are excluded from those two.",
      -            "type": "number"
      -          },
      -          "netIncomeActual": {
      -            "type": "number"
      -          },
      -          "netIncomeBudget": {
      -            "type": "number"
      -          },
      -          "netIncomeVariance": {
      -            "type": "number"
      -          },
      -          "netOperatingIncome": {
      -            "description": "grossProfit - totalExpenses (\"Net Operating Revenue\" on a nonprofit).",
      -            "type": "number"
      -          },
      -          "netOtherIncome": {
      -            "description": "totalOtherIncome - totalOtherExpenses.",
      -            "type": "number"
      -          },
      -          "notTagged": {
      -            "description": "SalesByDimension: on untagged lines.",
      -            "type": "number"
      -          },
      -          "operatingCash": {
      -            "type": "number"
      -          },
      -          "productCount": {
      -            "type": "number"
      -          },
      -          "rowCount": {
      -            "type": "number"
      -          },
      -          "tagged": {
      -            "description": "SalesByDimension: on tagged lines.",
      -            "type": "number"
      -          },
      -          "totalAssetValue": {
      -            "description": "InventoryValuationSummary: total inventory asset value as of endDate.",
      -            "type": "number"
      -          },
      -          "totalAssets": {
      -            "type": "number"
      -          },
      -          "totalCogs": {
      -            "description": "Total Cost of Goods Sold. Absent when the company has no COGS section.",
      -            "type": "number"
      -          },
      -          "totalCredits": {
      -            "type": "number"
      -          },
      -          "totalDebits": {
      -            "type": "number"
      -          },
      -          "totalEquity": {
      -            "type": "number"
      -          },
      -          "totalExpenses": {
      -            "description": "Total of the Expenses section only; Other Expenses is reported separately in totalOtherExpenses.",
      -            "type": "number"
      -          },
      -          "totalExpensesActual": {
      -            "type": "number"
      -          },
      -          "totalExpensesBudget": {
      -            "type": "number"
      -          },
      -          "totalIncome": {
      -            "description": "Total of the Income section only; Other Income is reported separately in totalOtherIncome.",
      -            "type": "number"
      -          },
      -          "totalIncomeActual": {
      -            "type": "number"
      -          },
      -          "totalIncomeBudget": {
      -            "type": "number"
      -          },
      -          "totalLiabilities": {
      -            "type": "number"
      -          },
      -          "totalOtherExpenses": {
      -            "description": "Total Other Expenses. Absent when the company has no such section.",
      -            "type": "number"
      -          },
      -          "totalOtherIncome": {
      -            "description": "Total Other Income (released from restriction, in-kind, interest, gains). Absent when the company has no such section.",
      -            "type": "number"
      -          },
      -          "totalOutstanding": {
      -            "type": "number"
      -          },
      -          "type": {
      -            "type": "string"
      -          },
      -          "vendorCount": {
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "accountCount": {
      +        "description": "GeneralLedger: number of accounts in the report. TrialBalance: number of accounts listed. NOT a row count — see totalRows for that.",
      +        "type": "number"
      +      },
      +      "balanced": {
      +        "description": "TrialBalance only: whether total debits equal total credits.",
      +        "type": "boolean"
      +      },
      +      "beginningCash": {
      +        "type": "number"
      +      },
      +      "classCount": {
      +        "type": "number"
      +      },
      +      "customerCount": {
      +        "type": "number"
      +      },
      +      "departmentCount": {
      +        "type": "number"
      +      },
      +      "documents": {
      +        "description": "SalesByDimension: documents.",
      +        "type": "number"
      +      },
      +      "endingCash": {
      +        "type": "number"
      +      },
      +      "financingCash": {
      +        "type": "number"
      +      },
      +      "grossProfit": {
      +        "description": "Income minus cost of goods sold. QuickBooks emits a Gross Profit line on every P&L, so on a company with no COGS section this equals totalIncome.",
      +        "type": "number"
      +      },
      +      "investingCash": {
      +        "type": "number"
      +      },
      +      "net": {
      +        "description": "SalesByDimension: net sales.",
      +        "type": "number"
      +      },
      +      "netAssets": {
      +        "description": "GB-style statutory balance sheets have no Total Assets/Total Liabilities lines; net assets (= equity) is the bottom line instead.",
      +        "type": "number"
      +      },
      +      "netCashChange": {
      +        "type": "number"
      +      },
      +      "netIncome": {
      +        "description": "The bottom line (Net Income; \"Net Revenue\" on a nonprofit). Equals totalIncome - totalCogs - totalExpenses + totalOtherIncome - totalOtherExpenses, NOT totalIncome - totalExpenses: the Other Income and Other Expenses sections sit below Net Operating Income and are excluded from those two.",
      +        "type": "number"
      +      },
      +      "netIncomeActual": {
      +        "type": "number"
      +      },
      +      "netIncomeBudget": {
      +        "type": "number"
      +      },
      +      "netIncomeVariance": {
      +        "type": "number"
      +      },
      +      "netOperatingIncome": {
      +        "description": "grossProfit - totalExpenses (\"Net Operating Revenue\" on a nonprofit).",
      +        "type": "number"
      +      },
      +      "netOtherIncome": {
      +        "description": "totalOtherIncome - totalOtherExpenses.",
      +        "type": "number"
      +      },
      +      "notTagged": {
      +        "description": "SalesByDimension: on untagged lines.",
      +        "type": "number"
      +      },
      +      "operatingCash": {
      +        "type": "number"
      +      },
      +      "productCount": {
      +        "type": "number"
      +      },
      +      "rowCount": {
      +        "type": "number"
      +      },
      +      "tagged": {
      +        "description": "SalesByDimension: on tagged lines.",
      +        "type": "number"
      +      },
      +      "totalAssetValue": {
      +        "description": "InventoryValuationSummary: total inventory asset value as of endDate.",
      +        "type": "number"
      +      },
      +      "totalAssets": {
      +        "type": "number"
      +      },
      +      "totalCogs": {
      +        "description": "Total Cost of Goods Sold. Absent when the company has no COGS section.",
      +        "type": "number"
      +      },
      +      "totalCredits": {
      +        "type": "number"
      +      },
      +      "totalDebits": {
      +        "type": "number"
      +      },
      +      "totalEquity": {
      +        "type": "number"
      +      },
      +      "totalExpenses": {
      +        "description": "Total of the Expenses section only; Other Expenses is reported separately in totalOtherExpenses.",
      +        "type": "number"
      +      },
      +      "totalExpensesActual": {
      +        "type": "number"
      +      },
      +      "totalExpensesBudget": {
      +        "type": "number"
      +      },
      +      "totalIncome": {
      +        "description": "Total of the Income section only; Other Income is reported separately in totalOtherIncome.",
      +        "type": "number"
      +      },
      +      "totalIncomeActual": {
      +        "type": "number"
      +      },
      +      "totalIncomeBudget": {
      +        "type": "number"
      +      },
      +      "totalLiabilities": {
      +        "type": "number"
      +      },
      +      "totalOtherExpenses": {
      +        "description": "Total Other Expenses. Absent when the company has no such section.",
      +        "type": "number"
      +      },
      +      "totalOtherIncome": {
      +        "description": "Total Other Income (released from restriction, in-kind, interest, gains). Absent when the company has no such section.",
      +        "type": "number"
      +      },
      +      "totalOutstanding": {
      +        "type": "number"
      +      },
      +      "type": {
      +        "type": "string"
      +      },
      +      "vendorCount": {
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed31 schema fields changed
    • changedInput schema / properties / accountIds / description
      Previous value: -"Only these accounts (Account.Id list): the ledger of one or a few accounts."New value: +"Only these accounts (Account.Id list). For one account's transactions run GeneralLedger with accountIds. Works on: ProfitAndLoss, GeneralLedger, ProfitAndLossDetail."
    • changedInput schema / properties / accountStatus / description
      Previous value: -"AccountList: deleted or live accounts."New value: +"Deleted or live accounts. Works on: AccountList."
    • changedInput schema / properties / accountType / description
      Previous value: -"Only accounts of this type."New value: +"Only accounts of this type. Works on: AccountList, GeneralLedger, ProfitAndLossDetail."
    • changedInput schema / properties / accountingMethod / description
      Previous value: -"Omit for the company default basis (qbCompanyProfile reportBasis). BudgetVsActuals defaults to Accrual."New value: +"Omit for the company default basis (qbCompanyProfile reportBasis). BudgetVsActuals defaults to Accrual. Refused on the agings, balances, transaction lists, JournalReport, AccountList and inventory: same numbers either way."
    • changedInput schema / properties / adjustedGainLoss / description
      Previous value: -"Multi-currency companies: include unrealized gains and losses."New value: +"Multi-currency companies: include unrealized gains and losses. Works on: ProfitAndLoss, ProfitAndLossByClass, BalanceSheet, ProfitAndLossDetail."
    • changedInput schema / properties / agingPeriod / description
      Previous value: -"Aging reports: days per bucket (default 30)."New value: +"Days per aging bucket (default 30). Works on: AgedReceivablesDetail, AgedPayablesDetail, AgedReceivables, AgedPayables."
    • changedInput schema / properties / amount / description
      Previous value: -"Exact transaction amount."New value: +"Exact transaction amount. Works on: the transaction lists except WithSplits."
    • changedInput schema / properties / apPaid / description
      Previous value: -"Payable documents: All, Paid or Unpaid."New value: +"Payable documents: All, Paid or Unpaid. Works on: the transaction lists except WithSplits, VendorBalance, VendorBalanceDetail."
    • changedInput schema / properties / arPaid / description
      Previous value: -"Receivable documents: All, Paid or Unpaid."New value: +"Receivable documents: All, Paid or Unpaid. Works on: the transaction lists except WithSplits, CustomerBalance, CustomerBalanceDetail."
    • changedInput schema / properties / cleared / description
      Previous value: -"Bank-reconciliation status."New value: +"Bank-reconciliation status. Works on: the transaction lists."
    • changedInput schema / properties / columns / description
      Previous value: -"Detail/list reports: QuickBooks column keys to return (tx_date, txn_type, doc_num, name, memo, account_name, subt_nat_amount, ...). They come back in QuickBooks' order, not yours; on GeneralLedger and ProfitAndLossDetail choosing columns also drops the subtotal rows."New value: +"Column keys to return, in QuickBooks' own order. The money key differs per report: subt_nat_amount (TransactionList, GeneralLedger, ProfitAndLossDetail), amount (TransactionListByCustomer, TransactionListWithSplits), nat_amount (TransactionListByVendor), debt_amt/credit_amt (JournalReport). TransactionList has no split or other-account column: use TransactionListWithSplits, or GeneralLedger, where split_acc stands in for account_name (as on ProfitAndLossDetail). Choosing columns on GeneralLedger/ProfitAndLossDetail drops the subtotal rows. Works on: the transaction lists, the aging and balance details, AccountList, GeneralLedger, JournalReport, ProfitAndLossDetail."
    • changedInput schema / properties / dimensionId / description
      Previous value: -"SalesByDimension: the dimension to total by."New value: +"The dimension to total by. Works on: SalesByDimension."
    • changedInput schema / properties / docNum / description
      Previous value: -"Document/reference number to match."New value: +"Document/reference number to match. Works on: the transaction lists, GeneralLedger, JournalReport."
    • changedInput schema / properties / dueDateEnd / description
      Previous value: -"Only documents due on or before this date."New value: +"Only documents due on or before this date. Works on: the transaction lists except WithSplits, the aging and balance details."
    • changedInput schema / properties / dueDateStart / description
      Previous value: -"Only documents due on or after this date."New value: +"Only documents due on or after this date. Works on: the transaction lists except WithSplits, the aging and balance details."
    • changedInput schema / properties / employeeIds / description
      Previous value: -"Only these employees (Employee.Id list). ProfitAndLossDetail."New value: +"Only these employees (Employee.Id list). Works on: ProfitAndLossDetail."
    • changedInput schema / properties / groupBy / description
      Previous value: -"Transaction lists: group rows into sections by this field; None = a flat list."New value: +"Group rows into sections by this field; None = a flat list. Works on: the transaction lists."
    • changedInput schema / properties / memo / description
      Previous value: -"Memo text to match."New value: +"Memo text to match. GeneralLedger has no text, status or amount filter: pull the account's ledger and filter the rows yourself. Works on: the transaction lists except WithSplits."
    • changedInput schema / properties / modifiedEnd / description
      Previous value: -"Only records last modified on or before this date."New value: +"Only records last modified on or before this date. Works on: the transaction lists except WithSplits, AccountList."
    • changedInput schema / properties / modifiedStart / description
      Previous value: -"Only records last modified on or after this date."New value: +"Only records last modified on or after this date. Works on: the transaction lists except WithSplits, AccountList."
    • changedInput schema / properties / nameIds / description
      Previous value: -"Only these names: any Customer, Vendor or Employee Id."New value: +"Only these names: any Customer, Vendor or Employee Id. Works on: the transaction lists, GeneralLedger, JournalReport."
    • changedInput schema / properties / numPeriods / description
      Previous value: -"Aging reports: number of buckets (default 4)."New value: +"Number of aging buckets (default 4). Works on: AgedReceivablesDetail, AgedPayablesDetail, AgedReceivables, AgedPayables."
    • changedInput schema / properties / pastDue / description
      Previous value: -"Aging details: only documents at least this many days past due."New value: +"Only documents at least this many days past due. Works on: AgedReceivablesDetail, AgedPayablesDetail."
    • changedInput schema / properties / paymentMethod / description
      Previous value: -"Payment method NAME as QuickBooks shows it (Cash, Check, Visa, ...), not an id."New value: +"Payment method NAME as QuickBooks shows it (Cash, Check, Visa, ...), not an id. Works on: the transaction lists, ProfitAndLossDetail."
    • changedInput schema / properties / printed / description
      Previous value: -"Whether checks were printed."New value: +"Whether checks were printed. Works on: the transaction lists except WithSplits."
    • changedInput schema / properties / shipVia / description
      Previous value: -"Shipping method name as stored on the invoice."New value: +"Shipping method name as stored on the invoice. Works on: AgedReceivablesDetail, CustomerBalanceDetail."
    • changedInput schema / properties / sourceAccountIds / description
      Previous value: -"GeneralLedger: only postings whose source bank/credit-card account is one of these."New value: +"Only postings whose source bank/credit-card account is one of these. Works on: GeneralLedger."
    • changedInput schema / properties / sourceAccountType / description
      Previous value: -"Only transactions whose source account is of this type."New value: +"Only transactions whose source account is of this type. Works on: the transaction lists, GeneralLedger, JournalReport."
    • changedInput schema / properties / startDate / description
      Previous value: -"Period start, YYYY-MM-DD. Period reports only (see the description)."New value: +"Period start, YYYY-MM-DD. Period reports only: refused on AccountList, ignored on as-of reports."
    • changedInput schema / properties / termIds / description
      Previous value: -"Only documents on these payment terms (Term.Id list)."New value: +"Only documents on these payment terms (Term.Id list). Works on: the transaction lists except WithSplits, the aging and balance details."
    • changedInput schema / properties / transactionType / description
      Previous value: -"Only this transaction type (one value; a list is rejected)."New value: +"Only this transaction type (one value; a list is rejected). Works on: the transaction lists, GeneralLedger, JournalReport."
  4. Changed5 schema fields changed
    • addedInput schema / properties / dimensionId
      Added value: +{
      +  "description": "SalesByDimension: the dimension to total by.",
      +  "pattern": "^[0-9A-Za-z_:-]+$",
      +  "type": "string"
      +}
    • changedInput schema / properties / reportType / enum
      Previous value: -[
      -  "ProfitAndLoss",
      -  "ProfitAndLossByClass",
      -  "BalanceSheet",
      -  "CashFlow",
      -  "AgedReceivables",
      -  "AgedPayables",
      -  "AgedReceivablesDetail",
      -  "AgedPayablesDetail",
      -  "TrialBalance",
      -  "CustomerIncome",
      -  "VendorExpenses",
      -  "TransactionList",
      -  "GeneralLedger",
      -  "ProfitAndLossDetail",
      -  "SalesByCustomer",
      -  "SalesByProduct",
      -  "VendorBalance",
      -  "CustomerBalance",
      -  "BudgetVsActuals",
      -  "AccountList",
      -  "CustomerBalanceDetail",
      -  "VendorBalanceDetail",
      -  "JournalReport",
      -  "TransactionListByCustomer",
      -  "TransactionListByVendor",
      -  "TransactionListWithSplits",
      -  "SalesByClass",
      -  "SalesByDepartment",
      -  "InventoryValuationSummary"
      -]New value: +[
      +  "ProfitAndLoss",
      +  "ProfitAndLossByClass",
      +  "BalanceSheet",
      +  "CashFlow",
      +  "AgedReceivables",
      +  "AgedPayables",
      +  "AgedReceivablesDetail",
      +  "AgedPayablesDetail",
      +  "TrialBalance",
      +  "CustomerIncome",
      +  "VendorExpenses",
      +  "TransactionList",
      +  "GeneralLedger",
      +  "ProfitAndLossDetail",
      +  "SalesByCustomer",
      +  "SalesByProduct",
      +  "VendorBalance",
      +  "CustomerBalance",
      +  "BudgetVsActuals",
      +  "AccountList",
      +  "CustomerBalanceDetail",
      +  "VendorBalanceDetail",
      +  "JournalReport",
      +  "TransactionListByCustomer",
      +  "TransactionListByVendor",
      +  "TransactionListWithSplits",
      +  "SalesByClass",
      +  "SalesByDepartment",
      +  "InventoryValuationSummary",
      +  "SalesByDimension"
      +]
    • removedOutput schema / properties / company / properties / realmId
      Removed value: -{
      -  "description": "QuickBooks realm id, when connected.",
      -  "type": "string"
      -}
    • changedOutput schema / properties / errorCode / description
      Previous value: -"Stable code when success=false — QuickBooks codes (e.g. 5020) or one of MISSING_END_DATE, MISSING_START_DATE, INVALID_DATE, DATE_RANGE_INVERTED, PARAM_NOT_SUPPORTED, INVALID_PARAM, DATES_NOT_ALLOWED, NO_BUDGETS, MULTIPLE_BUDGETS, NO_BUDGET_FOR_PERIOD, BUDGET_NOT_FOUND, BUDGET_TYPE_UNSUPPORTED, BUDGET_LOOKUP_FAILED, REPORT_FAILED, QB_NOT_CONNECTED, TOKEN_EXPIRED. Branch on this instead of parsing the message."New value: +"Stable code when success=false — QuickBooks codes (e.g. 5020) or one of MISSING_END_DATE, MISSING_START_DATE, INVALID_DATE, DATE_RANGE_INVERTED, PARAM_NOT_SUPPORTED, INVALID_PARAM, DATES_NOT_ALLOWED, MISSING_DIMENSION_ID, DIMENSION_NOT_FOUND, NO_BUDGETS, MULTIPLE_BUDGETS, NO_BUDGET_FOR_PERIOD, BUDGET_NOT_FOUND, BUDGET_TYPE_UNSUPPORTED, BUDGET_LOOKUP_FAILED, REPORT_FAILED, QB_NOT_CONNECTED, TOKEN_EXPIRED. Branch on this instead of parsing the message."
    • changedOutput schema / properties / summary / anyOf
      Previous value: -[
      -  {
      -    "anyOf": [
      -      {
      -        "not": {}
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "accountCount": {
      -            "description": "GeneralLedger: number of accounts in the report. TrialBalance: number of accounts listed. NOT a row count — see totalRows for that.",
      -            "type": "number"
      -          },
      -          "balanced": {
      -            "description": "TrialBalance only: whether total debits equal total credits.",
      -            "type": "boolean"
      -          },
      -          "beginningCash": {
      -            "type": "number"
      -          },
      -          "classCount": {
      -            "type": "number"
      -          },
      -          "customerCount": {
      -            "type": "number"
      -          },
      -          "departmentCount": {
      -            "type": "number"
      -          },
      -          "endingCash": {
      -            "type": "number"
      -          },
      -          "financingCash": {
      -            "type": "number"
      -          },
      -          "grossProfit": {
      -            "description": "Income minus cost of goods sold. QuickBooks emits a Gross Profit line on every P&L, so on a company with no COGS section this equals totalIncome.",
      -            "type": "number"
      -          },
      -          "investingCash": {
      -            "type": "number"
      -          },
      -          "netAssets": {
      -            "description": "GB-style statutory balance sheets have no Total Assets/Total Liabilities lines; net assets (= equity) is the bottom line instead.",
      -            "type": "number"
      -          },
      -          "netCashChange": {
      -            "type": "number"
      -          },
      -          "netIncome": {
      -            "description": "The bottom line (Net Income; \"Net Revenue\" on a nonprofit). Equals totalIncome - totalCogs - totalExpenses + totalOtherIncome - totalOtherExpenses, NOT totalIncome - totalExpenses: the Other Income and Other Expenses sections sit below Net Operating Income and are excluded from those two.",
      -            "type": "number"
      -          },
      -          "netIncomeActual": {
      -            "type": "number"
      -          },
      -          "netIncomeBudget": {
      -            "type": "number"
      -          },
      -          "netIncomeVariance": {
      -            "type": "number"
      -          },
      -          "netOperatingIncome": {
      -            "description": "grossProfit - totalExpenses (\"Net Operating Revenue\" on a nonprofit).",
      -            "type": "number"
      -          },
      -          "netOtherIncome": {
      -            "description": "totalOtherIncome - totalOtherExpenses.",
      -            "type": "number"
      -          },
      -          "operatingCash": {
      -            "type": "number"
      -          },
      -          "productCount": {
      -            "type": "number"
      -          },
      -          "rowCount": {
      -            "type": "number"
      -          },
      -          "totalAssetValue": {
      -            "description": "InventoryValuationSummary: total inventory asset value as of endDate.",
      -            "type": "number"
      -          },
      -          "totalAssets": {
      -            "type": "number"
      -          },
      -          "totalCogs": {
      -            "description": "Total Cost of Goods Sold. Absent when the company has no COGS section.",
      -            "type": "number"
      -          },
      -          "totalCredits": {
      -            "type": "number"
      -          },
      -          "totalDebits": {
      -            "type": "number"
      -          },
      -          "totalEquity": {
      -            "type": "number"
      -          },
      -          "totalExpenses": {
      -            "description": "Total of the Expenses section only; Other Expenses is reported separately in totalOtherExpenses.",
      -            "type": "number"
      -          },
      -          "totalExpensesActual": {
      -            "type": "number"
      -          },
      -          "totalExpensesBudget": {
      -            "type": "number"
      -          },
      -          "totalIncome": {
      -            "description": "Total of the Income section only; Other Income is reported separately in totalOtherIncome.",
      -            "type": "number"
      -          },
      -          "totalIncomeActual": {
      -            "type": "number"
      -          },
      -          "totalIncomeBudget": {
      -            "type": "number"
      -          },
      -          "totalLiabilities": {
      -            "type": "number"
      -          },
      -          "totalOtherExpenses": {
      -            "description": "Total Other Expenses. Absent when the company has no such section.",
      -            "type": "number"
      -          },
      -          "totalOtherIncome": {
      -            "description": "Total Other Income (released from restriction, in-kind, interest, gains). Absent when the company has no such section.",
      -            "type": "number"
      -          },
      -          "totalOutstanding": {
      -            "type": "number"
      -          },
      -          "type": {
      -            "type": "string"
      -          },
      -          "vendorCount": {
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "anyOf": [
      +      {
      +        "not": {}
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "accountCount": {
      +            "description": "GeneralLedger: number of accounts in the report. TrialBalance: number of accounts listed. NOT a row count — see totalRows for that.",
      +            "type": "number"
      +          },
      +          "balanced": {
      +            "description": "TrialBalance only: whether total debits equal total credits.",
      +            "type": "boolean"
      +          },
      +          "beginningCash": {
      +            "type": "number"
      +          },
      +          "classCount": {
      +            "type": "number"
      +          },
      +          "customerCount": {
      +            "type": "number"
      +          },
      +          "departmentCount": {
      +            "type": "number"
      +          },
      +          "documents": {
      +            "description": "SalesByDimension: documents.",
      +            "type": "number"
      +          },
      +          "endingCash": {
      +            "type": "number"
      +          },
      +          "financingCash": {
      +            "type": "number"
      +          },
      +          "grossProfit": {
      +            "description": "Income minus cost of goods sold. QuickBooks emits a Gross Profit line on every P&L, so on a company with no COGS section this equals totalIncome.",
      +            "type": "number"
      +          },
      +          "investingCash": {
      +            "type": "number"
      +          },
      +          "net": {
      +            "description": "SalesByDimension: net sales.",
      +            "type": "number"
      +          },
      +          "netAssets": {
      +            "description": "GB-style statutory balance sheets have no Total Assets/Total Liabilities lines; net assets (= equity) is the bottom line instead.",
      +            "type": "number"
      +          },
      +          "netCashChange": {
      +            "type": "number"
      +          },
      +          "netIncome": {
      +            "description": "The bottom line (Net Income; \"Net Revenue\" on a nonprofit). Equals totalIncome - totalCogs - totalExpenses + totalOtherIncome - totalOtherExpenses, NOT totalIncome - totalExpenses: the Other Income and Other Expenses sections sit below Net Operating Income and are excluded from those two.",
      +            "type": "number"
      +          },
      +          "netIncomeActual": {
      +            "type": "number"
      +          },
      +          "netIncomeBudget": {
      +            "type": "number"
      +          },
      +          "netIncomeVariance": {
      +            "type": "number"
      +          },
      +          "netOperatingIncome": {
      +            "description": "grossProfit - totalExpenses (\"Net Operating Revenue\" on a nonprofit).",
      +            "type": "number"
      +          },
      +          "netOtherIncome": {
      +            "description": "totalOtherIncome - totalOtherExpenses.",
      +            "type": "number"
      +          },
      +          "notTagged": {
      +            "description": "SalesByDimension: on untagged lines.",
      +            "type": "number"
      +          },
      +          "operatingCash": {
      +            "type": "number"
      +          },
      +          "productCount": {
      +            "type": "number"
      +          },
      +          "rowCount": {
      +            "type": "number"
      +          },
      +          "tagged": {
      +            "description": "SalesByDimension: on tagged lines.",
      +            "type": "number"
      +          },
      +          "totalAssetValue": {
      +            "description": "InventoryValuationSummary: total inventory asset value as of endDate.",
      +            "type": "number"
      +          },
      +          "totalAssets": {
      +            "type": "number"
      +          },
      +          "totalCogs": {
      +            "description": "Total Cost of Goods Sold. Absent when the company has no COGS section.",
      +            "type": "number"
      +          },
      +          "totalCredits": {
      +            "type": "number"
      +          },
      +          "totalDebits": {
      +            "type": "number"
      +          },
      +          "totalEquity": {
      +            "type": "number"
      +          },
      +          "totalExpenses": {
      +            "description": "Total of the Expenses section only; Other Expenses is reported separately in totalOtherExpenses.",
      +            "type": "number"
      +          },
      +          "totalExpensesActual": {
      +            "type": "number"
      +          },
      +          "totalExpensesBudget": {
      +            "type": "number"
      +          },
      +          "totalIncome": {
      +            "description": "Total of the Income section only; Other Income is reported separately in totalOtherIncome.",
      +            "type": "number"
      +          },
      +          "totalIncomeActual": {
      +            "type": "number"
      +          },
      +          "totalIncomeBudget": {
      +            "type": "number"
      +          },
      +          "totalLiabilities": {
      +            "type": "number"
      +          },
      +          "totalOtherExpenses": {
      +            "description": "Total Other Expenses. Absent when the company has no such section.",
      +            "type": "number"
      +          },
      +          "totalOtherIncome": {
      +            "description": "Total Other Income (released from restriction, in-kind, interest, gains). Absent when the company has no such section.",
      +            "type": "number"
      +          },
      +          "totalOutstanding": {
      +            "type": "number"
      +          },
      +          "type": {
      +            "type": "string"
      +          },
      +          "vendorCount": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  5. Changed41 schema fields changed
    • changedInput schema / properties / accountIds / description
      Previous value: -"Only these accounts (Account.Id list). GeneralLedger and ProfitAndLossDetail: the ledger of one or a few accounts."New value: +"Only these accounts (Account.Id list): the ledger of one or a few accounts."
    • changedInput schema / properties / accountStatus / description
      Previous value: -"AccountList only: Deleted or Not_Deleted accounts."New value: +"AccountList: deleted or live accounts."
    • changedInput schema / properties / accountType / description
      Previous value: -"Only accounts of this type. AccountList, GeneralLedger and ProfitAndLossDetail."New value: +"Only accounts of this type."
    • changedInput schema / properties / accountingMethod / description
      Previous value: -"Accrual or Cash. Honoured by ProfitAndLoss, ProfitAndLossByClass, ProfitAndLossDetail, BalanceSheet, CashFlow, TrialBalance, CustomerIncome, VendorExpenses, GeneralLedger, SalesByCustomer, SalesByProduct. REFUSED on the four aging reports, VendorBalance, CustomerBalance and TransactionList: QuickBooks accepts it there and returns the accrual numbers either way (proven identical), so passing it would promise a cash-basis answer it never gives. On BudgetVsActuals the default is Accrual (a budget is an accrual figure); pass Cash to compare cash-basis actuals instead."New value: +"Omit for the company default basis (qbCompanyProfile reportBasis). BudgetVsActuals defaults to Accrual."
    • changedInput schema / properties / adjustedGainLoss / description
      Previous value: -"Multi-currency companies only: include unrealized gains and losses. P&L family, BalanceSheet and ProfitAndLossDetail (documented by Intuit; not verifiable on the single-currency sandboxes)."New value: +"Multi-currency companies: include unrealized gains and losses."
    • changedInput schema / properties / agingPeriod / description
      Previous value: -"The four aging reports: days per aging bucket (QuickBooks default 30)."New value: +"Aging reports: days per bucket (default 30)."
    • changedInput schema / properties / amount / description
      Previous value: -"Exact transaction amount to match. TransactionList, ByCustomer, ByVendor."New value: +"Exact transaction amount."
    • changedInput schema / properties / apPaid / description
      Previous value: -"Payable side: All, Paid or Unpaid. VendorBalance/Detail and TransactionList, ByCustomer, ByVendor."New value: +"Payable documents: All, Paid or Unpaid."
    • changedInput schema / properties / arPaid / description
      Previous value: -"Receivable side: All, Paid or Unpaid. CustomerBalance/Detail and TransactionList, ByCustomer, ByVendor."New value: +"Receivable documents: All, Paid or Unpaid."
    • changedInput schema / properties / budgetId / description
      Previous value: -"QuickBooks Budget ID. BudgetVsActuals only (refused on any other type). Omit it to let the tool pick the single active budget whose date range covers startDate to endDate. When several cover it (errorCode MULTIPLE_BUDGETS) or none does (NO_BUDGET_FOR_PERIOD) the tool returns the budget list (id|name|startDate|endDate|type|active) so you can retry with budgetId set; an unknown id is BUDGET_NOT_FOUND with the same list."New value: +"BudgetVsActuals only. Omit to use the one active budget covering the period; when several or none do, the result lists the budgets to pick from."
    • changedInput schema / properties / classIds / description
      Previous value: -"Only these classes (Class.Id list; needs class tracking on). Works on the P&L family, BalanceSheet, CashFlow, CustomerIncome, GeneralLedger, ProfitAndLossDetail, the sales reports and VendorExpenses. For one column PER class use summarizeBy=Classes instead."New value: +"Only these classes (Class.Id list; needs class tracking)."
    • changedInput schema / properties / cleared / description
      Previous value: -"TransactionList, ByCustomer, ByVendor: bank-reconciliation status of the transaction."New value: +"Bank-reconciliation status."
    • changedInput schema / properties / columns / description
      Previous value: -"Which columns to return, by QuickBooks column key (tx_date, txn_type, doc_num, name, memo, account_name, subt_nat_amount, create_by, last_mod_date, ...). Only the detail and list reports take it; a key that is not a column of the report is refused with the allowed list. QuickBooks returns the chosen columns in its own order, not yours, and on GeneralLedger and ProfitAndLossDetail choosing columns also drops the subtotal rows, leaving a flat list."New value: +"Detail/list reports: QuickBooks column keys to return (tx_date, txn_type, doc_num, name, memo, account_name, subt_nat_amount, ...). They come back in QuickBooks' order, not yours; on GeneralLedger and ProfitAndLossDetail choosing columns also drops the subtotal rows."
    • changedInput schema / properties / customerIds / description
      Previous value: -"Only these customers (Customer.Id list). Works on the P&L family, BalanceSheet, CashFlow, CustomerIncome, GeneralLedger, ProfitAndLossDetail, the sales reports, VendorExpenses, the receivable agings, CustomerBalance/Detail, TransactionList and TransactionListByCustomer."New value: +"Only these customers (Customer.Id list)."
    • changedInput schema / properties / departmentIds / description
      Previous value: -"Only these departments/locations (Department.Id list; needs location tracking on). Works on the statements, the sales reports, the summary agings, the balance reports and the transaction lists."New value: +"Only these locations/departments (Department.Id list; needs location tracking)."
    • changedInput schema / properties / docNum / description
      Previous value: -"Document/reference number to match (an invoice number, check number). The transaction lists."New value: +"Document/reference number to match."
    • changedInput schema / properties / dueDateStart / description
      Previous value: -"Only documents due on or after this date. The aging and balance detail reports, SalesByProduct and TransactionList, ByCustomer, ByVendor."New value: +"Only documents due on or after this date."
    • changedInput schema / properties / employeeIds / description
      Previous value: -"Only these employees (Employee.Id list). ProfitAndLossDetail only."New value: +"Only these employees (Employee.Id list). ProfitAndLossDetail."
    • changedInput schema / properties / endDate / description
      Previous value: -"End date in YYYY-MM-DD format (e.g., 2025-12-31). Do NOT use natural language dates. REQUIRED for every report except AccountList (refused there: no period). For the as-of reports (VendorBalance, CustomerBalance, AgedReceivables, AgedPayables, AgedReceivablesDetail, AgedPayablesDetail, CustomerBalanceDetail, VendorBalanceDetail, InventoryValuationSummary) this is the as-of date (QuickBooks ignores end_date on those, so the tool sends it as report_date instead)."New value: +"Period end, or the as-of date on an as-of report. YYYY-MM-DD. Required except on AccountList."
    • changedInput schema / properties / groupBy / description
      Previous value: -"The transaction lists only: group rows into sections by this field (Account, Customer, Vendor, Transaction Type, Month, ...); None for a flat list."New value: +"Transaction lists: group rows into sections by this field; None = a flat list."
    • changedInput schema / properties / itemIds / description
      Previous value: -"Only these products/services (Item.Id list). Works on the P&L family, BalanceSheet, CashFlow, the sales reports and InventoryValuationSummary."New value: +"Only these products/services (Item.Id list)."
    • changedInput schema / properties / maxRows / description
      Previous value: -"Maximum data rows returned per call (default 500). Detail reports (GeneralLedger, TransactionList, ProfitAndLossDetail) can run to thousands of rows and overflow result-size limits — page through them with rowOffset. summary is always computed from the FULL report regardless of paging."New value: +"Rows per page (default 500)."
    • changedInput schema / properties / memo / description
      Previous value: -"Memo text to match. TransactionList, ByCustomer, ByVendor."New value: +"Memo text to match."
    • changedInput schema / properties / modifiedStart / description
      Previous value: -"Only records last modified on or after this date. AccountList and TransactionList, ByCustomer, ByVendor."New value: +"Only records last modified on or after this date."
    • changedInput schema / properties / nameIds / description
      Previous value: -"Only these names, any of Customer.Id, Vendor.Id or Employee.Id. The transaction lists only."New value: +"Only these names: any Customer, Vendor or Employee Id."
    • changedInput schema / properties / numPeriods / description
      Previous value: -"The four aging reports: how many aging buckets (QuickBooks default 4)."New value: +"Aging reports: number of buckets (default 4)."
    • changedInput schema / properties / pastDue / description
      Previous value: -"AgedReceivablesDetail and AgedPayablesDetail: keep only documents at least this many days past due."New value: +"Aging details: only documents at least this many days past due."
    • changedInput schema / properties / paymentMethod / description
      Previous value: -"Payment method NAME as QuickBooks shows it (Cash, Check, Visa, ...). ProfitAndLossDetail and the transaction lists."New value: +"Payment method NAME as QuickBooks shows it (Cash, Check, Visa, ...), not an id."
    • changedInput schema / properties / printed / description
      Previous value: -"TransactionList, ByCustomer, ByVendor: whether checks were printed."New value: +"Whether checks were printed."
    • changedInput schema / properties / reportType / description
      Previous value: -"Type of report: ProfitAndLoss, ProfitAndLossByClass, BalanceSheet, CashFlow, AgedReceivables, AgedPayables, AgedReceivablesDetail, AgedPayablesDetail, TrialBalance, CustomerIncome, VendorExpenses, TransactionList, GeneralLedger, ProfitAndLossDetail, SalesByCustomer, SalesByProduct, VendorBalance, CustomerBalance, BudgetVsActuals, AccountList, CustomerBalanceDetail, VendorBalanceDetail, JournalReport, TransactionListByCustomer, TransactionListByVendor, TransactionListWithSplits, SalesByClass, SalesByDepartment, InventoryValuationSummary"New value: +"The report to run."
    • changedInput schema / properties / rowOffset / description
      Previous value: -"0-based row offset for paging. When the message says more rows remain, call again with rowOffset advanced by the number of rows returned. Rows are a window into one flat list — a page may start mid-section, so [Section] headers from earlier pages still apply."New value: +"0-based row offset for the next page. A page can start mid-section, so [Section] headers from earlier pages still apply."
    • changedInput schema / properties / shipVia / description
      Previous value: -"Shipping method name as stored on the invoice. AgedReceivablesDetail and CustomerBalanceDetail."New value: +"Shipping method name as stored on the invoice."
    • changedInput schema / properties / sortBy / description
      Previous value: -"Column key to sort rows by (see columns). The detail and list reports only: AccountList, GeneralLedger, JournalReport, ProfitAndLossDetail, the balance details and the transaction lists. Sorting a money column is alphabetical, not numeric. On AccountList sort by account_name or detail_acc_type; account_bal is ignored."New value: +"Detail/list reports: column key to sort by. A money column sorts alphabetically, not numerically; AccountList ignores account_bal (sort by account_name or detail_acc_type)."
    • changedInput schema / properties / sortOrder / description
      Previous value: -"ascend or descend, on the same detail and list reports as sortBy (alone it reverses the default order). Ignored by QuickBooks on every summary report, so refused there."New value: +"ascend or descend, with or without sortBy."
    • changedInput schema / properties / sourceAccountIds / description
      Previous value: -"Only postings whose source (bank/credit-card) account is one of these (Account.Id list). GeneralLedger only."New value: +"GeneralLedger: only postings whose source bank/credit-card account is one of these."
    • changedInput schema / properties / sourceAccountType / description
      Previous value: -"The transaction lists only: keep transactions whose source account is of this type (Bank, CreditCard, AccountsReceivable, ...)."New value: +"Only transactions whose source account is of this type."
    • changedInput schema / properties / startDate / description
      Previous value: -"Start date in YYYY-MM-DD format (e.g., 2025-01-01). Do NOT use natural language dates. REQUIRED for the period reports: ProfitAndLoss, ProfitAndLossByClass, CashFlow, TrialBalance, CustomerIncome, VendorExpenses, TransactionList, GeneralLedger, ProfitAndLossDetail, SalesByCustomer, SalesByProduct, BudgetVsActuals, JournalReport, TransactionListByCustomer, TransactionListByVendor, TransactionListWithSplits, SalesByClass, SalesByDepartment. Not used for the as-of reports (VendorBalance, CustomerBalance, AgedReceivables, AgedPayables, AgedReceivablesDetail, AgedPayablesDetail, CustomerBalanceDetail, VendorBalanceDetail, InventoryValuationSummary). Refused on AccountList, which has no period."New value: +"Period start, YYYY-MM-DD. Period reports only (see the description)."
    • changedInput schema / properties / summarizeBy / description
      Previous value: -"Split the report into one column per period or entity. Only these report types honour it: ProfitAndLoss, ProfitAndLossByClass, BalanceSheet, CashFlow, TrialBalance, VendorExpenses, SalesByCustomer, SalesByProduct, SalesByClass, SalesByDepartment, BudgetVsActuals — on any other type QuickBooks silently ignores it and returns the unsummarized report, so the tool refuses it there instead. ProfitAndLossByClass is the ready-made per-class P&L; summarizeBy=Classes does the same thing on any supported report."New value: +"One column per period or entity, plus a Total column. Only on the reports the description lists."
    • changedInput schema / properties / termIds / description
      Previous value: -"Only documents on these payment terms (Term.Id list). The aging and balance detail reports, CustomerIncome and the transaction lists."New value: +"Only documents on these payment terms (Term.Id list)."
    • changedInput schema / properties / transactionType / description
      Previous value: -"Keep only this transaction type (one value; QuickBooks rejects a list). The transaction lists, GeneralLedger and JournalReport."New value: +"Only this transaction type (one value; a list is rejected)."
    • changedInput schema / properties / vendorIds / description
      Previous value: -"Only these vendors (Vendor.Id list). Works on the P&L family, BalanceSheet, CashFlow, CustomerIncome, GeneralLedger, ProfitAndLossDetail, VendorExpenses, the payable agings, VendorBalance/Detail, TransactionList and TransactionListByVendor."New value: +"Only these vendors (Vendor.Id list)."
  6. First observed

TDQS

A3.7/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. Beyond that the description adds real behavior: unsupported filter/report combinations are rejected with PARAM_NOT_SUPPORTED, format:"json" returns an additional numeric rowsJson, and paging continues from the rowOffset supplied in the response message. It still says nothing about how truncation at maxRows is surfaced or what a typical response looks like.

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

Conciseness3/5

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

Everything is crammed into one semicolon-chained paragraph; it is front-loaded with purpose, which is good, but the middle becomes a telegraphic matrix that is hard to parse under time pressure. Lines like "One class or location: classIds/departmentIds; a column each: summarizeBy or ProfitAndLossByClass" sacrifice clarity for brevity.

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

Completeness4/5

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

For a 46-parameter report engine with no output schema, the description covers the hard parts: date semantics per report family, which filters are legal where, refusal behavior, summarizeBy scope, and paging. Gaps remain around maxRows/truncation signaling, sortBy interaction with grouping, and the fact that invalid filter combinations are errors rather than being silently ignored at the report level.

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?

With 46 parameters and only 54% schema description coverage, the description does substantial work mapping parameters to report types (cleared/groupBy/printed/amount/memo/arPaid/apPaid/termIds/dates for TransactionList*, nameIds/transactionType/sourceAccountType/docNum also on GeneralLedger and JournalReport, agingPeriod/numPeriods on aged reports). Several arrays (customerIds, vendorIds, itemIds, employeeIds, departmentIds) and controls like sortBy and maxRows are left entirely to the schema, and the phrase "a column each" is ambiguous.

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

Purpose4/5

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

The description opens with a specific verb and resource ("run a report by reportType") and enumerates the report families covered (statements, agings, ledgers, transaction lists, sales, budgets). An agent immediately knows this is the QuickBooks financial-report engine. It does not, however, distinguish itself from siblings like customReports or xeroReports, so the sibling differentiator is absent.

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

Usage Guidelines4/5

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

It gives unusually concrete invocation rules: as-of reports take endDate only, AccountList takes none, everything else takes both; unsupported filters are refused with PARAM_NOT_SUPPORTED; summarizeBy applies to a named set of reports; one class/location at a time; GeneralLedger + accountIds for a single account. What is missing is guidance on when to pick this tool over customReports or qbFetchTransactions for transaction-level data.

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.