MCP server implementation for QuickBooks Online integration
18 tools with consistent verb_noun naming (create_*, all WRITE operations). Descriptions present and substantive (avg ~150 chars), explaining what each tool does. Schemas use Zod with type definitions and parameter descriptions. However, significant gaps: (1) Many tools accept raw 'object' types with minimal nested schema detail (create_bill, create_customer, create_estimate, create_purchase, create_journal_entry, create_bill_payment accept generic 'billPayment'/'customer'/'estimate'/'purchase'/'journalEntry' objects with only high-level descriptions). (2) Output schemas not documented, responses are text-wrapped JSON with no formal schema declaration. (3) No error recovery guidance, errors return plain text messages without actionable next steps. (4) No idempotency hints or confirmation patterns for destructive operations. (5) Tool descriptions lack dependency hints (e.g., 'Call search_tax_codes first if you need a tax code ID'). Strengths: consistent naming, all params described, good use of enums (e.g., create_payment_method.type, create_credit_memo.global_tax_calculation), detailed parameter constraints in descriptions (e.g., create_attachable MIME types, file size limits).
Create a bill in QuickBooks Online.
Create a chart‑of‑accounts entry in QuickBooks Online.
Create an attachable (file attachment) in QuickBooks Online. Without base64_content, creates a metadata-only attachment record. With base64_content, uploads the actual file bytes to QBO's /upload endpoint.
Create a bill payment in QuickBooks Online.
Create a new class in QuickBooks Online for categorizing transactions.
Create a credit memo (customer credit) in QuickBooks Online.
Generic object schemas with minimal nested detail. Six tools (create_bill_payment, create_customer, create_estimate, create_employee, create_journal_entry, create_purchase) accept raw 'object' type parameters with only high-level descriptions. LLMs cannot infer required nested fields, leading to malformed requests.
No output schema documentation. All tools return text-wrapped JSON responses without formal schema declarations. LLMs cannot plan downstream tool calls or extract required fields (e.g., created entity IDs) reliably.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Create a customer in QuickBooks Online. Accepts a raw QBO Customer object (DisplayName required). Tax info for non-US companies: set PrimaryTaxIdentifier to the customer's tax registration number (e.g. EU VAT number / CIF), and optionally Taxable (boolean) and DefaultTaxCodeRef ({ value: <TaxCode Id> }) for their default sales tax code. Responses always return PrimaryTaxIdentifier masked.
Create a new department in QuickBooks Online for location/department tracking.
Create a bank deposit in QuickBooks Online.
Create an employee in QuickBooks Online.
Create an estimate in QuickBooks Online. Accepts a raw QBO Estimate object; per-line tax codes go in Line[].SalesItemLineDetail.TaxCodeRef ({ value: <TaxCode Id> } for non-US companies, 'TAX'/'NON' for US).
Create an invoice in QuickBooks Online.
Create an item in QuickBooks Online.
Create a journal entry in QuickBooks Online.
Create a payment (receive money from customer) in QuickBooks Online.
Create a new payment method in QuickBooks Online (e.g., Cash, Check, Credit Card).
Create a purchase in QuickBooks Online.
Create a purchase order in QuickBooks Online.
Error responses lack recovery guidance. Handlers return plain text error messages (e.g., 'Error creating account: <error>') without actionable next steps or error classification (retryable vs. user-fixable vs. fatal).
No confirmation or dry-run pattern for destructive operations. All 18 tools are WRITE operations that modify QuickBooks state, but none offer a confirmation step or dry-run mode to prevent accidental data loss.
Missing dependency hints in descriptions. Tools like create_invoice and create_credit_memo reference tax codes and items but do not guide users to search_tax_codes or search_items first, forcing discovery detours.