---
title: "Xero MCP server for AI agents - actionlake"
description: "Give Claude 191 Xero actions through one MCP server: invoicing, payments, settings, ledger. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/xero
updated: 2026-10-10
---

Connectors · Accounting & finance

# Xero MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Xero and the rest of your systems. It gives your agent 191 Xero actions (116 reads, 60 writes and 15 that wait for a confirmation) and holds the Xero credential itself, so the agent never does. It paces Xero's limits and records every call. Connecting Xero needs your own Xero OAuth app and one admin sign-in.

[Connect Xero free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "xero.organisation.get",
  intent: "check which Xero account is connected"
}
# Get the organisation · read · 1 upstream call
```

- 191 actions in one signed file
- 116 read look, never change
- 60 write create and update
- 15 wait for a yes destructive, confirmed first

Set up

## Connect Xero in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect Xero.
   OAuth 2.0, authorization code with PKCE. You register your own OAuth app with Xero, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on. actionlake stores what you paste write-only, sealed under your tenant's key.
   Before the first sign-in, Xero needs an OAuth app of your own, registered in its developer portal. actionlake has no Xero app to lend you.
   - `access_token` Access token from one sign-in with your own OAuth app
   - `refresh_token` Refresh token from the same sign-in; the access token is renewed from it
   - `client_id` Your OAuth app's client id
   - `client_secret` Your OAuth app's client secret
   Found for you at connect: the organisations, sites or workspaces the credential can reach. Each one is its own connection.
   ```
   account { op: "connections.requirements", service: "xero" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "xero.organisation.get" }
   # get the organisation · read · 1 upstream call
   check { action: "xero.invoices.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Xero at a glance

**Sign-in**

OAuth 2.0, authorization code with PKCE. You register your own OAuth app with Xero, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on.

**You provide**

`access_token` `refresh_token` `client_id` `client_secret`

**Found for you**

the organisations, sites or workspaces the credential can reach

**Limits we pace to**

60 calls a minute and 5,000 a day, at most 5 at a time, per connection

**API covered**

Xero Accounting API 2.0`api.xero.com/api.xro/2.0`

**Built from**

Xero's documentation, read 14 September 2026[OpenAPI spec (GitHub)](https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero_accounting.yaml) [developer.xero.com](https://developer.xero.com/documentation/api/accounting/overview)

**Service file**

Version 4.0.0, signed (Ed25519)

**Cached reads**

116 of 116 reads, for up to an hour; a write clears what it affects

**Ready-made plans**

8 in the store

**Shared entities**

14, so ask can line Xero up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Xero.

191 actions in 13 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **116** read look, never change
- **60** write create and update
- **15** destructive wait for a confirmation

1. ### Invoicing
   31
   19 read · 10 write · 2 destructive
   List invoices · List credit notes · List repeating invoices · Create an invoice
2. ### Payments
   26
   13 read · 8 write · 5 destructive
   List payments · List batch payments · Create a batch payment · Record a payment against an invoice
3. ### Settings
   23
   13 read · 8 write · 2 destructive
   List users · Get one user · List tax rates · List currencies
4. ### Ledger
   18
   12 read · 5 write · 1 destructive
   List chart of accounts · Create an account · Get one account · Update an account
5. ### Contacts
   17
   9 read · 6 write · 2 destructive
   List contacts · List contact groups · Create a contact · Get one contact
6. ### Banking
   15
   10 read · 4 write · 1 destructive
   List bank transactions · Create a bank transaction · Get one bank transaction · Update a bank transaction
7. ### Expenses
   14
   8 read · 6 write · 0 destructive
   List expense claims · Create an expense claim · List receipts · Get one expense claim
8. ### Reporting
   13
   13 read · 0 write · 0 destructive
   List budgets · Get one budget · List available reports · Get aged payables for a contact

**5 more areas · 34 actions**

- Purchasing **9**
- Sales **9**
- Inventory **7**
- Billing **5**
- Payroll **4**

Xero's own MCP server

## Xero's MCP server, or actionlake?

Xero publishes an MCP server that you run on your own machine (the @xeroapi/xero-mcp-server package), signed in with a Xero custom connection or a bearer token.

Use Xero's server when one person wants to work in Xero through a server they run on their own machine. Use actionlake when you also want Xero behind the same endpoint as your other systems: a key per agent with allowed actions and a spending cap, a named person's approval before destructive actions, a sealed record of every call, and one ask across Xero and another system.

Source: [Xero's documentation](https://github.com/XeroAPI/xero-mcp-server), checked 22 October 2026.

Top actions

## The Xero API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 111 of Xero's 116 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `xero.invoices.list` List invoices | List Xero invoices and bills, filtered by status, contact, number or date. | read | `finance.invoice.list` 101 connectors |
| `xero.payments.list` List payments | List Xero payments made against invoices, credit notes and prepayments. | read | `finance.payment.list` 75 connectors |
| `xero.quotes.list` List quotes | List Xero quotes from the connected organisation, with optional where/order filtering. | read | `finance.quote.list` 52 connectors |
| `xero.purchase_orders.list` List purchase orders | List Xero purchase orders from the connected organisation, with optional where/order filtering. | read | `finance.purchase_order.list` 45 connectors |
| `xero.contacts.list` List contacts | List Xero contacts from the connected organisation, with optional where/order filtering. | read | `crm.company.list` 162 connectors |
| `xero.accounts.list` List chart of accounts | List Xero chart of accounts from the connected organisation, with optional where/order filtering. | read | `finance.ledger_account.list` 36 connectors |
| `xero.credit_notes.list` List credit notes | List Xero credit notes from the connected organisation, with optional where/order filtering. | read | `finance.credit_note.list` 33 connectors |
| `xero.users.list` List users | List Xero users from the connected organisation, with optional where/order filtering. | read | `identity.user.list` 474 connectors |
| `xero.invoices.create` Create an invoice | Create a Xero sales invoice or bill against a contact, with one or more line items. | write | `finance.invoice.create` 74 connectors |
| `xero.payments.create` Record a payment against an invoice | Apply a payment to a Xero invoice or credit note from a bank account. | write | `finance.payment.create` 67 connectors |
| `xero.batch_payments.create` Create a batch payment | Create a new Xero batch payment in the connected organisation. | destructive | `finance.payment.create` 67 connectors |
| `xero.quotes.create` Create a quote | Create a new Xero quote in the connected organisation. | write | `finance.quote.create` 52 connectors |

Try it

## Prompts to paste into Claude.

Each one names the Xero actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   Which Xero invoices are more than 30 days overdue? Group them by customer with the total owed.
   calls `xero.invoices.list`
2. Plan read
   Pull the month-end financial pack in Xero.
   calls `xero.organisation.get` `xero.reports.profit_and_loss` `xero.reports.balance_sheet` `xero.reports.trial_balance` `xero.reports.bank_summary` +1 more
3. Plan write
   Set up a new customer and raise their first invoice in Xero. Ask me before anything is sent or changed.
   calls `xero.contacts.create` `xero.contact_groups.contacts_add` `xero.invoices.create` `xero.invoices.update` `xero.invoices.online_url_get` +1 more
4. Write write
   Create an invoice in Xero. Show me exactly what you will send before you save it.
   calls `xero.invoices.create`
5. Across systems read
   For each customer, how many invoices are in Xero and how many tickets in ConnectWise PSA?
   calls `xero.invoices.list` `connectwise_manage.tickets.list`

Across your systems

## Xero, joined to the rest of your business.

One `ask` fetches from Xero and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.

- For each customer, how many invoices are in Xero and how many tickets in ConnectWise PSA?
  `xero.invoices.list` + `connectwise_manage.tickets.list`, on `crm.company` · [ConnectWise PSA](https://actionlake.com/connectors/connectwise-psa)
- For each customer, how many invoices are in Xero and how many tickets in HubSpot CRM?
  `xero.invoices.list` + `hubspot_crm.tickets.list`, on `crm.company` · [HubSpot CRM](https://actionlake.com/connectors/hubspot-crm)

Also mapped by other connectors `identity.user` **517** `crm.company` **227** `finance.invoice` **91** `hr.employee` **63** `finance.payment` **53** `finance.quote` **45** `finance.purchase_order` **35** `finance.ledger_account` **32**

ask

```
ask {
  intent: "for each customer, how many invoices are in Xero and how many tickets in ConnectWise PSA",
  steps: [
    { action: "xero.invoices.list", as: "inv", input: {}, limit: 100, max_pages: 5 },
    { action: "connectwise_manage.tickets.list", as: "tix", input: {}, limit: 100, max_pages: 5 },
    { join: {
        left: "inv",
        right: "tix",
        on: "crm.company",
        group_by: "inv.company_name",
        select: ["inv.company_name", "count(inv.id) as invoices", "count(tix.id) as tickets"]
    } }
  ]
}
```

Example. Run it through check first: it validates the steps and prices them, and it is free.

The plan store

## Ready-made plans for Xero.

8 plans in the store. Install one and your agent runs it by name; the reply says which connections are still missing. A schedule can run a plan on a timetable. There are no triggers or webhooks, by design.

1. ### Audit recent supplier bills and purchase orders
   Use it when Someone wants to review what has been committed and billed by suppliers over a period.
   **Effect**
   read
   **Steps**
   4 · loops
   **Needs**
   since
   **Install**
   `xero-supplier-bill-audit`
2. ### Pull the month-end financial pack
   Use it when Someone asks for the month-end or period-end financial reports in one go.
   **Effect**
   read
   **Steps**
   6
   **Needs**
   from date and to date
   **Install**
   `xero-month-end-financials`
3. ### Chase overdue invoices by email
   Use it when Someone wants to send payment reminders for invoices that are already overdue.
   A person decides Email a payment reminder for every overdue invoice listed above.
   **Effect**
   write
   **Steps**
   4 · loops
   **Needs**
   cutoff date
   **Install**
   `xero-chase-overdue-invoices`
4. ### Archive contacts with no recent activity
   Use it when The contact list has grown stale and dormant customers should be archived.
   A person decides Archive _number of contact ids_ Xero contacts named by the caller. The dormant candidates and every authorised invoice were listed above — decline if any named contact still has money outstanding.
   **Effect**
   write
   **Steps**
   5 · loops
   **Needs**
   since and contact ids
   **Install**
   `xero-archive-dormant-contacts`
5. ### Record a payment against an invoice
   Use it when A customer payment has landed and needs to be recorded against a specific invoice.
   A person decides Apply _amount_ to invoice _InvoiceNumber_ from _Name_.
   **Effect**
   write
   **Steps**
   6
   **Needs**
   account id, amount, date and invoice id
   **Install**
   `xero-record-invoice-payment`
6. ### Set up a new customer and raise their first invoice
   Use it when A new customer needs to be created in Xero and billed for the first time.
   A person decides Approve and email the first invoice for _name_ totalling _Total_.
   **Effect**
   write
   **Steps**
   7
   **Needs**
   contact group id, due date, email address, line items and name
   **Install**
   `xero-new-customer-first-invoice`
7. ### Turn an accepted quote into an invoice
   Use it when A customer has accepted a quote and it needs to become a real sales invoice.
   A person decides Raise a sales invoice for _Name_ from quote _QuoteNumber_.
   **Effect**
   write
   **Steps**
   7
   **Needs**
   due date and quote id
   **Install**
   `xero-quote-to-invoice`
8. ### Void an invoice raised in error
   Use it when An invoice was raised in error and must be voided rather than edited.
   A person decides Void invoice _InvoiceNumber_ for _Total_. Reason: _reason_.
   **Effect**
   destructive
   **Steps**
   5
   **Needs**
   invoice id and reason
   **Install**
   `xero-void-draft-invoice`

install a plan

```
account { op: "plans.install", slug: "xero-supplier-bill-audit" }
# then ask for it by name; a schedule can run it on a timetable
```

Governance for Xero

## Destructive actions wait for a yes.

15 Xero actions are destructive. These are all of them:

- Create a batch payment `xero.batch_payments.create`
- Delete a draft invoice `xero.invoices.delete`
- Delete a batch payment `xero.batch_payments.delete`
- Void an invoice `xero.invoices.void`
- Delete an account `xero.accounts.delete`
- Delete an item `xero.items.delete`
- Reverse a payment `xero.payments.delete`
- Delete a linked transaction `xero.linked_transactions.delete`
- Create a bank transfer `xero.bank_transfers.create`
- Delete a tracking category `xero.tracking_categories.delete`
- Remove one contact from a group `xero.contact_groups.contact_remove`
- Reverse a prepayment allocation `xero.prepayments.allocations_delete`
- Reverse an overpayment allocation `xero.overpayments.allocations_delete`
- Delete a tracking option `xero.tracking_options.delete`
- Empty a contact group `xero.contact_groups.contacts_remove_all`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do xero.invoices.delete confirm_policy: **human**

Delete a draft invoice?

**intent:** the user asked me to delete a draft invoice

run suspended · waiting for a named person · key _xero-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "xero-agent",
  allowed_actions: ["xero.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "xero.batch_payments.create", approver: "lead@example.com" },
    { match: "xero.invoices.delete", approver: "lead@example.com" },
    { match: "xero.batch_payments.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Xero only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Xero costs on actionlake.

Every Xero action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Xero refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 191 Xero actions
- 11 actions page each page of a long list is one call
- 116 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Xero action.

191 actions by area: the id your agent calls, what it does, and its effect.

**Invoicing 31**

- `xero.credit_notes.attachment_get` Get one credit note attachment read
- `xero.credit_notes.attachments_list` List credit note attachments read
- `xero.credit_notes.create` Create a credit note write
- `xero.credit_notes.get` Get one credit note read
- `xero.credit_notes.history_create` Add a note to a credit note write
- `xero.credit_notes.history_list` List credit note history and notes read
- `xero.credit_notes.list` List credit notes read
- `xero.credit_notes.pdf_get` Get a credit note as PDF read
- `xero.credit_notes.update` Update a credit note write
- `xero.invoice_reminders.settings_get` Get invoice reminder settings read
- `xero.invoices.attachment_get` Get one invoice attachment read
- `xero.invoices.attachments_list` List invoice attachments read
- `xero.invoices.create` Create an invoice write
- `xero.invoices.delete` Delete a draft invoice destructive
- `xero.invoices.email_send` Email an invoice to its contact write
- `xero.invoices.get` Get one invoice read
- `xero.invoices.history_create` Add a note to an invoice write
- `xero.invoices.history_list` List invoice history and notes read
- `xero.invoices.list` List invoices read
- `xero.invoices.online_url_get` Get an invoice's online payment link read
- `xero.invoices.pdf_get` Get an invoice as PDF read
- `xero.invoices.update` Update an invoice write
- `xero.invoices.void` Void an invoice destructive
- `xero.repeating_invoices.attachment_get` Get one repeating invoice attachment read
- `xero.repeating_invoices.attachments_list` List repeating invoice attachments read
- `xero.repeating_invoices.create` Create a repeating invoice write
- `xero.repeating_invoices.get` Get one repeating invoice read
- `xero.repeating_invoices.history_create` Add a note to a repeating invoice write
- `xero.repeating_invoices.history_list` List repeating invoice history and notes read
- `xero.repeating_invoices.list` List repeating invoices read
- `xero.repeating_invoices.update` Update a repeating invoice write

**Payments 26**

- `xero.batch_payments.create` Create a batch payment destructive
- `xero.batch_payments.delete` Delete a batch payment destructive
- `xero.batch_payments.get` Get one batch payment read
- `xero.batch_payments.history_create` Add a note to a batch payment write
- `xero.batch_payments.history_list` List batch payment history and notes read
- `xero.batch_payments.list` List batch payments read
- `xero.overpayments.allocations_create` Allocate an overpayment to an invoice write
- `xero.overpayments.allocations_delete` Reverse an overpayment allocation destructive
- `xero.overpayments.get` Get one overpayment read
- `xero.overpayments.history_create` Add a note to an overpayment write
- `xero.overpayments.history_list` List overpayment history and notes read
- `xero.overpayments.list` List overpayments read
- `xero.payment_services.create` Add a payment service write
- `xero.payment_services.list` List payment services read
- `xero.payments.create` Record a payment against an invoice write
- `xero.payments.delete` Reverse a payment destructive
- `xero.payments.get` Get one payment read
- `xero.payments.history_create` Add a note to a payment write
- `xero.payments.history_list` List payment history and notes read
- `xero.payments.list` List payments read
- `xero.prepayments.allocations_create` Allocate a prepayment to an invoice write
- `xero.prepayments.allocations_delete` Reverse a prepayment allocation destructive
- `xero.prepayments.get` Get one prepayment read
- `xero.prepayments.history_create` Add a note to a prepayment write
- `xero.prepayments.history_list` List prepayment history and notes read
- `xero.prepayments.list` List prepayments read

**Settings 23**

- `xero.branding_themes.get` Get one branding theme read
- `xero.branding_themes.list` List branding themes read
- `xero.branding_themes.payment_services_apply` Apply a payment service to a branding theme write
- `xero.branding_themes.payment_services_list` List a branding theme's payment services read
- `xero.currencies.create` Create a currency write
- `xero.currencies.list` List currencies read
- `xero.organisation.actions_list` List organisation actions read
- `xero.organisation.cis_settings_get` Get organisation CIS settings read
- `xero.organisation.get` Get the organisation read
- `xero.setup.post` Post conversion balances and setup data write
- `xero.tax_rates.create` Create a tax rate write
- `xero.tax_rates.get_by_type` Get one tax rate by tax type read
- `xero.tax_rates.list` List tax rates read
- `xero.tracking_categories.create` Create a tracking category write
- `xero.tracking_categories.delete` Delete a tracking category destructive
- `xero.tracking_categories.get` Get one tracking category read
- `xero.tracking_categories.list` List tracking categories read
- `xero.tracking_categories.update` Update a tracking category write
- `xero.tracking_options.create` Add an option to a tracking category write
- `xero.tracking_options.delete` Delete a tracking option destructive
- `xero.tracking_options.update` Update a tracking option write
- `xero.users.get` Get one user read
- `xero.users.list` List users read

**Ledger 18**

- `xero.accounts.attachment_get` Get one account attachment read
- `xero.accounts.attachments_list` List account attachments read
- `xero.accounts.create` Create an account write
- `xero.accounts.delete` Delete an account destructive
- `xero.accounts.get` Get one account read
- `xero.accounts.list` List chart of accounts read
- `xero.accounts.update` Update an account write
- `xero.journals.get` Get one journal read
- `xero.journals.get_by_number` Get one journal by number read
- `xero.journals.list` List journals read
- `xero.manual_journals.attachment_get` Get one manual journal attachment read
- `xero.manual_journals.attachments_list` List manual journal attachments read
- `xero.manual_journals.create` Create a manual journal write
- `xero.manual_journals.get` Get one manual journal read
- `xero.manual_journals.history_create` Add a note to a manual journal write
- `xero.manual_journals.history_list` List manual journal history and notes read
- `xero.manual_journals.list` List manual journals read
- `xero.manual_journals.update` Update a manual journal write

**Contacts 17**

- `xero.contact_groups.contact_remove` Remove one contact from a group destructive
- `xero.contact_groups.contacts_add` Add contacts to a group write
- `xero.contact_groups.contacts_remove_all` Empty a contact group destructive
- `xero.contact_groups.create` Create a contact group write
- `xero.contact_groups.get` Get one contact group read
- `xero.contact_groups.list` List contact groups read
- `xero.contact_groups.update` Update a contact group write
- `xero.contacts.attachment_get` Get one contact attachment read
- `xero.contacts.attachments_list` List contact attachments read
- `xero.contacts.cis_settings_get` Get a contact's CIS settings read
- `xero.contacts.create` Create a contact write
- `xero.contacts.get` Get one contact read
- `xero.contacts.get_by_number` Get one contact by contact number read
- `xero.contacts.history_create` Add a note to a contact write
- `xero.contacts.history_list` List contact history and notes read
- `xero.contacts.list` List contacts read
- `xero.contacts.update` Update a contact write

**Banking 15**

- `xero.bank_transactions.attachment_get` Get one bank transaction attachment read
- `xero.bank_transactions.attachments_list` List bank transaction attachments read
- `xero.bank_transactions.create` Create a bank transaction write
- `xero.bank_transactions.get` Get one bank transaction read
- `xero.bank_transactions.history_create` Add a note to a bank transaction write
- `xero.bank_transactions.history_list` List bank transaction history and notes read
- `xero.bank_transactions.list` List bank transactions read
- `xero.bank_transactions.update` Update a bank transaction write
- `xero.bank_transfers.attachment_get` Get one bank transfer attachment read
- `xero.bank_transfers.attachments_list` List bank transfer attachments read
- `xero.bank_transfers.create` Create a bank transfer destructive
- `xero.bank_transfers.get` Get one bank transfer read
- `xero.bank_transfers.history_create` Add a note to a bank transfer write
- `xero.bank_transfers.history_list` List bank transfer history and notes read
- `xero.bank_transfers.list` List bank transfers read

**Expenses 14**

- `xero.expense_claims.create` Create an expense claim write
- `xero.expense_claims.get` Get one expense claim read
- `xero.expense_claims.history_create` Add a note to an expense claim write
- `xero.expense_claims.history_list` List expense claim history and notes read
- `xero.expense_claims.list` List expense claims read
- `xero.expense_claims.update` Update an expense claim write
- `xero.receipts.attachment_get` Get one receipt attachment read
- `xero.receipts.attachments_list` List receipt attachments read
- `xero.receipts.create` Create a receipt write
- `xero.receipts.get` Get one receipt read
- `xero.receipts.history_create` Add a note to a receipt write
- `xero.receipts.history_list` List receipt history and notes read
- `xero.receipts.list` List receipts read
- `xero.receipts.update` Update a receipt write

**Reporting 13**

- `xero.budgets.get` Get one budget read
- `xero.budgets.list` List budgets read
- `xero.reports.aged_payables_by_contact` Get aged payables for a contact read
- `xero.reports.aged_receivables_by_contact` Get aged receivables for a contact read
- `xero.reports.balance_sheet` Get the balance sheet read
- `xero.reports.bank_summary` Get the bank summary read
- `xero.reports.budget_summary` Get the budget summary read
- `xero.reports.executive_summary` Get the executive summary read
- `xero.reports.get_by_id` Get a report by id read
- `xero.reports.list` List available reports read
- `xero.reports.profit_and_loss` Get the profit and loss report read
- `xero.reports.ten_ninety_nine` Get the 1099 report read
- `xero.reports.trial_balance` Get the trial balance read

**Purchasing 9**

- `xero.purchase_orders.attachment_get` Get one purchase order attachment read
- `xero.purchase_orders.attachments_list` List purchase order attachments read
- `xero.purchase_orders.create` Create a purchase order write
- `xero.purchase_orders.get` Get one purchase order read
- `xero.purchase_orders.history_create` Add a note to a purchase order write
- `xero.purchase_orders.history_list` List purchase order history and notes read
- `xero.purchase_orders.list` List purchase orders read
- `xero.purchase_orders.pdf_get` Get a purchase order as PDF read
- `xero.purchase_orders.update` Update a purchase order write

**Sales 9**

- `xero.quotes.attachment_get` Get one quote attachment read
- `xero.quotes.attachments_list` List quote attachments read
- `xero.quotes.create` Create a quote write
- `xero.quotes.get` Get one quote read
- `xero.quotes.history_create` Add a note to a quote write
- `xero.quotes.history_list` List quote history and notes read
- `xero.quotes.list` List quotes read
- `xero.quotes.pdf_get` Get a quote as PDF read
- `xero.quotes.update` Update a quote write

**Inventory 7**

- `xero.items.create` Create an item write
- `xero.items.delete` Delete an item destructive
- `xero.items.get` Get one item read
- `xero.items.history_create` Add a note to an item write
- `xero.items.history_list` List item history and notes read
- `xero.items.list` List items read
- `xero.items.update` Update an item write

**Billing 5**

- `xero.linked_transactions.create` Create a linked transaction write
- `xero.linked_transactions.delete` Delete a linked transaction destructive
- `xero.linked_transactions.get` Get one linked transaction read
- `xero.linked_transactions.list` List linked transactions read
- `xero.linked_transactions.update` Update a linked transaction write

**Payroll 4**

- `xero.employees.create` Create an employee write
- `xero.employees.get` Get one employee read
- `xero.employees.list` List employees read
- `xero.employees.update` Update an employee write

Questions

## The Xero MCP server, answered.

**Is there a Xero MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 191 Xero actions across invoicing, payments, settings and ledger, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Xero.

**Does Xero have its own MCP server?**

Xero publishes an MCP server that you run on your own machine (the @xeroapi/xero-mcp-server package), signed in with a Xero custom connection or a bearer token. (Xero's documentation, checked 22 October 2026.) Use Xero's server when one person wants to work in Xero through a server they run on their own machine. Use actionlake when you also want Xero behind the same endpoint as your other systems: a key per agent with allowed actions and a spending cap, a named person's approval before destructive actions, a sealed record of every call, and one ask across Xero and another system.

**What do I need to connect Xero?**

Your own Xero OAuth app, registered with Xero (its client id and client secret), and the access and refresh tokens from one admin sign-in. actionlake has no Xero app of its own, so this is not a one-step consent. actionlake renews the access token as it expires. actionlake finds the organisations, sites or workspaces the credential can reach for you when you connect. Each one is its own connection, so an agent can work across several by name. The free call account { op: "connections.requirements", service: "xero" } lists exactly what to paste.

**Can an AI agent delete or change things in Xero?**

Only if its key allows it, and only with an explicit confirmation. 15 Xero actions are destructive, including create a batch payment, delete a draft invoice and delete a batch payment. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Xero API limit?**

actionlake paces every call to the limits in the Xero service file: 60 calls a minute and 5,000 a day, at most 5 at a time per connection. Repeated reads are answered from cache (116 Xero actions can be), which never reaches Xero.

**What does a Xero action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (11 Xero actions page). Cache hits, searches, dry runs and calls Xero refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which Xero API does it cover?**

The Xero Accounting API 2.0 at api.xero.com/api.xro/2.0. It is built from Xero's documentation as read on 14 September 2026. 191 actions in 13 areas, each one in the signed service file (version 4.0.0).

**Can I combine Xero with my other systems?**

Yes. ask joins Xero to ConnectWise PSA or HubSpot CRM on the same customer and returns the answer rather than every row. Xero maps crm.company, which 227 other connectors also map.

**Does actionlake keep my Xero data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Xero credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like Xero

Shares the most action names with

- [QuickBooks Online 69](https://actionlake.com/connectors/quickbooks-online)
- [FreshBooks 52](https://actionlake.com/connectors/freshbooks)
- [Fortnox 46](https://actionlake.com/connectors/fortnox)
- [Pennylane 38](https://actionlake.com/connectors/pennylane)
- [Wave 35](https://actionlake.com/connectors/wave)
- [Codat 31](https://actionlake.com/connectors/codat)

Joins with, on shared entities

- [HaloPSA 6](https://actionlake.com/connectors/halopsa)
- [Zoho Inventory 6](https://actionlake.com/connectors/zoho-inventory)
- [Rev.io 6](https://actionlake.com/connectors/rev-io)
- [Syncro 6](https://actionlake.com/connectors/syncro)
- [RepairShopr 6](https://actionlake.com/connectors/repairshopr)
- [Zuper 5](https://actionlake.com/connectors/zuper)

Browse

- [All Accounting & finance connectors](https://actionlake.com/connectors/category/accounting-and-finance)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Xero; the name is the vendor's own. Counts are from the Xero service file, version 4.0.0.

## Give your agent Xero today.

[Connect Xero free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/xero
More: https://actionlake.com/llms.txt
