Xero (Accounting) MCP Pack - Read-only access to Xero accounting data via the Xero Accounting API 2.0. Requires OAuth connection with credentials injected via context.
Five read-only tools with solid naming (verb_noun pattern) and comprehensive descriptions (avg 180 chars, within 10-1024 baseline). All tools have proper JSON Schema with typed properties. However, output schemas are completely undocumented, LLMs cannot plan downstream calls or extract fields. Parameter descriptions are good but lack format constraints (e.g., date format, filter syntax). No error handling guidance, no recovery paths. Missing tool annotations (readOnlyHint). Composition is clean (single responsibility per tool), but chaining support is weak due to missing output documentation.
Get the Profit and Loss (income statement) financial report from a Xero accounting organisation for an optional date range. Returns the structured Xero report (report name, date, and row sections covering revenue, expenses, and net profit). Use for financial reporting and bookkeeping analysis.
List the chart of accounts from a Xero accounting organisation. Returns each account's code, name, type, class, and status. Use to understand an organisation's general ledger structure for bookkeeping and financial reporting.
List contacts (customers and suppliers) from a Xero accounting organisation. Returns name, email, status, and customer/supplier flags. Use for accounting, bookkeeping, and accounts-receivable/payable workflows. Supports Xero filter expressions and pagination.
List invoices and bills from a Xero accounting organisation. Returns compact invoice summaries (number, type, status, contact, dates, total, amount due, currency) for bookkeeping, accounts-receivable, and accounts-payable review. Supports Xero filter expressions and pagination.
List the Xero organisations (tenants) the connected account can access, with tenant id, name, and type. Xero accounting is multi-tenant — use this first to discover the tenant_id for a specific organisation, then pass it to the other accounting tools to target that org.
Output schemas completely undocumented. LLMs cannot infer what fields are returned, breaking tool chaining and forcing wasteful discovery calls.
No error handling guidance. Code returns { error: 'connection_required' } and { error: res.status } but tool descriptions do not explain failure modes or recovery steps. LLMs cannot self-correct.
Date parameters (from_date, to_date in get_profit_and_loss) lack format constraints in schema. Description says 'YYYY-MM-DD format' but no JSON Schema pattern or minLength/maxLength. LLMs may pass invalid dates.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Filter parameter (where) accepts Xero filter expressions but no examples or syntax guide in description. LLMs must guess valid syntax like 'Status=="AUTHORISED"' vs 'Status==AUTHORISED'.
No tool annotations (readOnlyHint). All tools are read-only but this is not declared in the tool definition, forcing LLMs to infer safety from descriptions.