Model Context Protocol server for Xero Accounting integration, providing tools for contacts, invoices, payments, accounts, and financial reports
Xero MCP server demonstrates above-average definition quality with comprehensive schema coverage, clear naming conventions, and detailed parameter descriptions across 20 tools. All tools follow verb_noun naming patterns (xero_navigate, xero_contacts_list, xero_invoices_create, etc.). Descriptions are consistently present and informative (avg ~150-200 chars), explaining what each tool does and when to use it. Schemas are properly defined with JSON Schema types and constraints (enums for domain/status/type, required fields marked). However, several quality gaps prevent a higher score: (1) output schemas are not documented inline, LLMs cannot see what fields will be returned; (2) tool annotations (readOnlyHint, destructiveHint, idempotentHint) are missing despite clear risk stratification in tool metadata; (3) error handling lacks recovery guidance, tools provide risk classifications (READ_ONLY, WRITE, REVERSIBLE) but tool descriptions do not explain what happens on failure or how to retry; (4) some parameter descriptions could be more prescriptive about formats and constraints (date formats mentioned but not enforced in schema with pattern declarations).
Get detailed information about a specific account by its ID.
List chart of accounts in Xero. Optionally filter by account type or class.
Return to domain selection (no-op in flattened mode). All tools are always available.
Create a new contact in Xero. Name is required; other fields are optional.
Get detailed information about a specific contact by its ID. Returns full contact profile including addresses, phone numbers, and email.
List contacts in Xero with pagination. Optionally filter using a where clause. Returns contact details including name, email, and addresses.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Returns contact details including name, email, and addresses') but no structured schema is provided for responses. LLMs cannot plan downstream tool calls or extract specific fields without knowing the exact output structure.
Tool annotations missing. Tools are classified by risk (READ_ONLY, WRITE, REVERSIBLE) in metadata but not exposed via MCP tool annotations. The MCP spec supports readOnlyHint, destructiveHint, and idempotentHint to communicate safety properties to clients. This metadata should be encoded in the Tool definition.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 74 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 54 | - | v1 |
Search contacts by name. Returns contacts whose name contains the search term.
Create a new invoice in Xero. Requires type, contact, and at least one line item.
Get detailed information about a specific invoice by its ID. Returns full invoice details including line items, amounts, and payment status.
List invoices in Xero with pagination. Optionally filter by status and type (ACCREC for sales, ACCPAY for bills).
Update the status of an existing invoice. Can submit, authorise, or void an invoice.
Discover available Xero tools by domain. Returns tool names and descriptions for the selected domain. All tools are callable at any time — this is a help/discovery aid, not a prerequisite.
Create a new payment in Xero. Records a payment against an invoice.
Get detailed information about a specific payment by its ID.
List payments in Xero with pagination. Optionally filter by status.
Get an Aged Payables report showing outstanding supplier bills by age.
Get an Aged Receivables report showing outstanding customer invoices by age.
Get a Balance Sheet report as of a specific date.
Get a Profit and Loss (income statement) report for a date range.
Show credentials status and available domains
Error handling lacks recovery guidance. Tool descriptions do not explain what to do if a call fails. For example, xero_contacts_search does not mention what happens if no contacts match, or whether the agent should try a broader search or use xero_contacts_list instead. Errors should be actionable.
Date parameter formats not formally constrained. Parameter descriptions mention 'YYYY-MM-DD format' (e.g., in xero_reports_profit_and_loss) but JSON Schema does not enforce this via pattern or format declarations. LLMs may still pass invalid dates.
Pagination guidance incomplete. List tools (xero_contacts_list, xero_invoices_list, etc.) document page-based pagination with 100 items per page but do not return total count or next_cursor in descriptions. LLMs cannot determine when to stop paginating or whether results are truncated.