QuickBooks Online MCP server for Laravel — expose QBO as AI-callable tools
Laravel QuickBooks MCP server has well-structured tool definitions with consistent naming (verb_noun pattern), complete JSON schemas with type declarations, and descriptions for all tools and parameters. However, descriptions are often generic and lack actionable guidance for LLM selection. Output schemas are not documented. Error handling returns plain text without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification. Parameter descriptions lack format constraints and validation rules. Missing idempotency guarantees and confirmation patterns for destructive operations.
Create a new account in the QuickBooks chart of accounts. Specify the account type (e.g. Expense, Income, Asset, Liability) and sub-type.
Create a bill payment to pay one or more open bills from a vendor. Pass vendor name or ID, payment type (Check or CreditCard), and the bill IDs to pay.
Create a new bill (accounts payable) in QuickBooks. Pass vendor name or ID. Line items need account name or ID and amount.
Create a new customer in QuickBooks.
Permanently delete a QuickBooks bill payment. This action is irreversible. Use with caution.
Permanently delete a QuickBooks bill. This action is irreversible. Use with caution.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk stratification. DeleteBillTool, DeleteBillPaymentTool, DeleteCustomerTool marked DESTRUCTIVE but lack MCP annotations to signal irreversibility to agents.
Output schemas not documented. Tools return plain text responses (e.g., 'Account created.\nID: {id} | Name: {name}') instead of structured JSON. LLMs cannot parse results reliably or chain tool calls without knowing response structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Deactivate a QuickBooks customer. QBO does not permanently delete customers — this sets Active = false.
Get a single QuickBooks bill payment by its ID.
Get a single QuickBooks bill by its ID.
Get a single QuickBooks customer by their ID.
Search QuickBooks chart of accounts by name or account type.
Search QuickBooks bill payments by vendor name or date range.
Search QuickBooks bills by vendor name, date range, or outstanding balance.
Search QuickBooks customers by name, email, or company name.
Update an existing QuickBooks account. Only pass fields you want to change.
Update an existing QuickBooks bill payment. Only pass fields you want to change.
Update an existing QuickBooks bill. Only pass fields you want to change.
Update an existing QuickBooks customer. Only pass fields you want to change.
Error handling returns generic 'Error: {message}' text without recovery guidance. LLMs cannot determine if errors are retryable, user-fixable, or fatal. No actionable error messages like 'Account name must be unique, try search_accounts() first.'
Parameter descriptions lack format constraints and validation rules. E.g., 'txn_date' described as 'Transaction date (YYYY-MM-DD)' but no minLength, maxLength, or pattern constraint. LLMs cannot validate inputs before submission.
Destructive operations (DeleteBillTool, DeleteBillPaymentTool, DeleteCustomerTool) lack confirmation or dry-run patterns. No mechanism to prevent accidental deletion. Agents cannot safely preview consequences before executing irreversible actions.