TypeScript QuickBooks Online MCP Server with enhanced features and dual transport support
The server demonstrates solid fundamentals with 12 well-named, verb-leading tools covering a real accounting domain. All tools have non-empty descriptions (10-200 chars range, mostly in the good 50-150 char zone). Input schemas are visible and structured with zod validation. However, critical gaps reduce confidence: (1) Output schemas are NOT documented in tool definitions, only internal TypeScript interfaces exist, forcing LLMs to infer structure. The rubric requires 'Document the output schema' (pattern:tool). (2) Parameter descriptions lack depth, most are 1-2 sentences; none explain format, range, constraints, or dependencies. E.g., 'amount' has no min/max, 'dateFrom'/'dateTo' mention 'natural language' but no examples of what's accepted. (3) Error handling is invisible in the provided code, no recovery guidance, no classification of retryable vs fatal errors. (4) No evidence of idempotency, confirmation steps, or dry-run modes for destructive operations (banking_create_transfer, create_invoice, create_expense, send_invoice). A production tool transferring $25k should have a confirmation pattern. (5) Tool composition is good (each does one thing), but no evidence of response field naming consistency across related tools (e.g., does get_invoices return 'invoice_id' or 'id'?). Per-tool quality is 60-75; averaging ~68.
Query Chart of Accounts. Filter by account type, classification, or name. Returns account details including balances.
Transfer funds between bank accounts. Specify source account, destination account, and amount.
Query vendor bills. Filter by vendor, status, date range, or amount. Returns bill details with payment status.
Create a new expense in QuickBooks with vendor and account lookup
Create a new invoice in QuickBooks with line items and optional auto-email
Get current status and health metrics of the QuickBooks MCP server
Output schemas are not documented in tool definitions, only internal TypeScript interfaces visible. Rubric requires 'Document the output schema' so LLMs know what fields to expect.
Numeric parameters lack min/max constraints. E.g., banking_create_transfer 'amount', create_expense 'amount', get_customers 'limit' have no bounds documented or enforced. Rubric: 'Specify minimum and maximum for numeric parameters.'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 71 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Get detailed balance information for a customer including overdue amounts and payment history
Query customers from QuickBooks with search and filtering options
Query expenses from QuickBooks with filtering options (date, vendor, account, amount)
Query invoices from QuickBooks with filtering options (status, customer, date range, amount)
Generate a Profit & Loss statement for a specified period
Send an invoice email to a customer with optional custom message
Enum-like parameters are described with examples but not declared as formal enums in schema. E.g., bill_get_bills 'status' lists '(unpaid, paid, overdue, all)' in description only. Rubric: 'When a parameter accepts one of a known set of values, declare it as an enum.'
No error handling guidance visible. Tools lack recovery hints, error classification, or actionable error messages. E.g., if banking_create_transfer fails due to insufficient balance, what should the LLM do next? Rubric requires 'Error responses must tell the LLM what to do next.'
Destructive operations (banking_create_transfer, create_invoice, create_expense, send_invoice) lack confirmation/dry-run patterns. Rubric: 'Irreversible operations should support a dry-run or confirmation step.'
Date parameter format not consistently specified. Some tools (get_expenses, create_invoice) mention 'natural language' support; others (bill_get_bills, get_invoices) do not. No formal ISO 8601 or natural-language format declaration. Rubric: 'Describe the expected format...directly in the parameter description.'
No pagination or result-limit enforcement visible for list operations. Rubric: 'Even if the API allows returning thousands of items, cap results at a reasonable limit (e.g. 20-50) and offer pagination.'
Parameter descriptions are sparse and lack dependency documentation. E.g., create_invoice 'items' array has nested object structure but no 'required' fields specified. Rubric: 'When one parameter's valid values depend on another...document this in both parameter descriptions.'