MCP server implementation for QuickBooks Online integration
Server has 17 tools with inconsistent schema quality. Most tools use z.any() for complex inputs (create_bill_payment, create_customer, create_employee, create_estimate, create_journal_entry, create_purchase), which provides zero type safety and forces LLMs to guess structure. Three tools (create_account, create_invoice, create_item) have well-defined Zod schemas with proper constraints. Descriptions are present but generic (avg ~60 chars), lacking WHEN/WHY context. No tool annotations (readOnlyHint/destructiveHint). Error handling returns text responses but lacks recovery guidance. No pagination support despite financial data likely returning large result sets. Tool naming is verb-first and clear, but parameter descriptions are minimal.
Create a bill in QuickBooks Online.
Create a vendor in QuickBooks Online.
Create a chart‑of‑accounts entry in QuickBooks Online.
Create a bill payment in QuickBooks Online.
Create a customer in QuickBooks Online.
Create an employee in QuickBooks Online.
Create an estimate in QuickBooks Online.
6 create_* tools use z.any() for complex inputs (bill_payment, customer, employee, estimate, journal_entry, purchase), providing zero type safety. LLMs cannot infer required fields or structure.
5 delete_* tools accept z.any() (idOrEntity) with minimal description. No guidance on whether to pass ID string or full entity object. Ambiguous parameter design.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 5 delete_* tools are destructive but lack destructiveHint annotation. Agents cannot distinguish safe from risky operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
Create an invoice in QuickBooks Online.
Create an item in QuickBooks Online.
Create a journal entry in QuickBooks Online.
Create a purchase in QuickBooks Online.
Delete a bill in QuickBooks Online.
Delete (make inactive) a bill payment in QuickBooks Online.
Delete (make inactive) a customer in QuickBooks Online.
Delete (void) an estimate in QuickBooks Online.
Delete (make inactive) a journal entry in QuickBooks Online.
Delete (make inactive) a purchase in QuickBooks Online.
Error responses return plain text without recovery guidance. E.g. 'Error creating account: ...' tells LLM nothing about retry eligibility or next steps. No error classification.
Descriptions are generic and under 100 chars. E.g. 'Create a bill payment in QuickBooks Online.' lacks WHEN/WHY context, prerequisites, or distinction from similar tools. No guidance on required vs optional fields.