18 tools with mostly complete schemas and descriptions. Naming follows verb_noun pattern consistently (create-, list-, get-, delete-). Descriptions are present and actionable (avg ~150 chars), though some lack context on when to use vs. similar tools. Schemas use Zod with proper types and enums. Key gaps: (1) nested object schemas (lineItems) lack field-level descriptions; (2) no output schemas documented; (3) error handling is generic ('Error creating X') without recovery guidance; (4) some parameters like 'accountCodes' vs 'accountIds' in list-account-transactions lack mutual-exclusivity guidance.
Create a bank transaction in Xero. When a bank transaction is created, a deep link to the bank transaction in Xero is returned. This deep link can be used to view the bank transaction in Xero directly. This link should be displayed to the user.
Create a contact in Xero. When a contact is created, a deep link to the contact in Xero is returned. This deep link can be used to view the contact in Xero directly. This link should be displayed to the user.
Create a credit note in Xero. When a credit note is created, a deep link to the credit note in Xero is returned. This deep link can be used to view the credit note in Xero directly. This link should be displayed to the user.
Create an invoice in Xero. When an invoice is created, a deep link to the invoice in Xero is returned. This deep link can be used to view the invoice in Xero directly. This link should be displayed to the user.
Create an item in Xero.
Nested object schemas lack field-level descriptions. lineItems in create-invoice, create-bank-transaction, create-credit-note, create-quote define properties (description, quantity, unitAmount, accountCode, taxType) without per-field descriptions. LLMs cannot infer what 'accountCode' means or how to obtain it without explicit guidance.
No output schemas documented. Tools return text responses with formatted strings (e.g., 'Bank transaction successfully: ID: ... Date: ...') but no structured schema is declared. Agents cannot reliably extract IDs or deep links for downstream tool chaining.
Error handling is generic and non-actionable. All tools return 'Error creating X: <error>' without recovery guidance. Per pattern:recovery-guide, errors should suggest next steps (e.g., 'Contact not found. Try list-contacts() to find the correct ID.').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Create a manual journal in Xero. Retrieve a list of account codes in Xero to use for the journal lines. Journal lines must contain at least two individual journal lines with account codes, use basic accounting account types pairing when not specified, and make sure journal line pairs have credit and debit balanced.
Create a payment against an invoice in Xero. This tool records a payment transaction against an invoice. You'll need to provide the invoice ID, account ID to make the payment from, and the amount. The amount must be positive and should not exceed the remaining amount due on the invoice. A payment can only be created for an invoice that is status AUTHORIZED A payment can only be created for an invoice that is not fully paid When a payment is created, a deep link to the payment in Xero is returned. This deep link can be used to view the payment in Xero directly. This link should be displayed to the user.
Create a quote in Xero. When a quote is created, a deep link to the quote in Xero is returned. This deep link can be used to view the quote in Xero directly. This link should be displayed to the user.
Create a new payroll timesheet in Xero. This allows you to specify details such as the employee ID, payroll calendar ID, start and end dates, and timesheet lines.
Create a tracking category in Xero.
Create tracking options for a tracking category in Xero.
Delete an existing payroll timesheet in Xero by its ID.
Retrieve a single payroll timesheet from Xero by its ID. This provides details such as the timesheet ID, employee ID, start and end dates, total hours, and the last updated date.
List account transactions from Xero. This produces a per-account ledger showing date, source type, contact, description, reference, debit, credit, net, VAT, and the related account from the other side of each double-entry journal. Fetches from Invoices, Credit Notes, Bank Transactions, and Manual Journals in parallel with date-range filtering, then filters by account code client-side. Ask the user for a date range and one or more account codes (or account IDs) before calling. Both fromDate and toDate are required (YYYY-MM-DD). You can pass multiple account codes or IDs as arrays to get transactions across several accounts in one call. Results are written to a temp file to avoid loading large datasets into context. The response includes a summary header and the file path — use the Read tool to inspect the file. Note: this covers invoices, credit notes, bank transactions, and manual journals. Payroll journals and system-generated entries are not included.
Lists all accounts in Xero. Use this tool to get the account codes and names to be used when creating invoices in Xero
Lists the aged payables in Xero. This shows aged payables for a certain contact up to a report date.
Lists the aged receivables in Xero. This shows aged receivables for a certain contact up to a report date.
List all bank transactions in Xero. Ask the user if they want to see bank transactions for a specific bank account, or to see all bank transactions before running. Ask the user if they want the next page of quotes after running this tool if 10 bank transactions are returned. If they do, call this tool again with the next page number and the bank account if one was provided in the provided in the previous call.
Mutually exclusive parameters not documented. list-account-transactions accepts both 'accountCodes' and 'accountIds' without stating they are alternatives. LLMs may pass both, causing ambiguous behavior.
Minimal descriptions for simple tools. create-tracking-category ('Create a tracking category in Xero.') and create-tracking-options lack context on when to use them or what they enable. Descriptions should explain purpose and dependencies.