
Connects Claude to the Xero Accounting API for managing customers, suppliers, invoices, payments, and pulling financial reports. You get domain-organized tools for contacts, invoices, payments, accounts, and reports including P&L, balance sheet, and aged receivables. Supports both stdio for local Claude Desktop use and HTTP mode for multi-tenant deployments. Ships with gateway mode that accepts per-request credentials via headers, useful if you're building a proxy that handles OAuth tokens for multiple Xero organizations. Requires a Xero developer account and OAuth2 credentials. Reach for this when you need Claude to read or write accounting data directly instead of exporting CSV files.
Public tool metadata for what this MCP can expose to an agent.
XERO_CREATE_BANK_TRANSACTIONCreate a bank transaction in Xero. Use SPEND for payments out or RECEIVE for money received.9 paramsCreate a bank transaction in Xero. Use SPEND for payments out or RECEIVE for money received.
BankAccountCodestringContactIDstringCurrencyCodestringDatestringLineItemsarrayReferencestringStatusstringTypestringtenant_idstringXERO_CREATE_CONTACTCreate a new contact in Xero. Contacts can be customers, suppliers, or both.14 paramsCreate a new contact in Xero. Contacts can be customers, suppliers, or both.
AccountNumberstringBankAccountDetailsstringDefaultCurrencystringEmailAddressstringFirstNamestringIsCustomerbooleanIsSupplierbooleanLastNamestringNamestringTaxNumberstringWebsitestringmobile_numberstringphone_numberstringtenant_idstringXERO_CREATE_INVOICECreate a new invoice in Xero. Supports both sales invoices (ACCREC) and bills (ACCPAY).10 paramsCreate a new invoice in Xero. Supports both sales invoices (ACCREC) and bills (ACCPAY).
ContactIDstringCurrencyCodestringDatestringDueDatestringInvoiceNumberstringLineItemsarrayReferencestringStatusstringTypestringtenant_idstringXERO_CREATE_ITEMCreate an inventory item in Xero. Items can be tracked for sales and/or purchases.9 paramsCreate an inventory item in Xero. Items can be tracked for sales and/or purchases.
CodestringIsPurchasedbooleanIsSoldbooleanNamestringPurchaseDetails.AccountCodestringPurchaseDetails.UnitPricenumberSalesDetails.AccountCodestringSalesDetails.UnitPricenumbertenant_idstringXERO_CREATE_PAYMENTCreate a payment in Xero to link an invoice with a bank account transaction.7 paramsCreate a payment in Xero to link an invoice with a bank account transaction.
AccountIDstringAmountnumberCurrencyRatenumberDatestringInvoiceIDstringReferencestringtenant_idstringXERO_CREATE_PURCHASE_ORDERCreate a purchase order in Xero to order goods/services from suppliers.7 paramsCreate a purchase order in Xero to order goods/services from suppliers.
ContactIDstringDatestringDeliveryDatestringLineItemsarrayReferencestringStatusstringtenant_idstringXERO_GET_ACCOUNTRetrieve a specific account from the chart of accounts by ID. Returns account code, name, type, and settings.2 paramsRetrieve a specific account from the chart of accounts by ID. Returns account code, name, type, and settings.
account_idstringtenant_idstringXERO_GET_ASSETRetrieve a specific asset by ID from Xero. Returns depreciation details and book value.2 paramsRetrieve a specific asset by ID from Xero. Returns depreciation details and book value.
asset_idstringtenant_idstringXERO_GET_BALANCE_SHEET_REPORTRetrieve Balance Sheet report from Xero. Shows assets, liabilities, and equity at a specific date.7 paramsRetrieve Balance Sheet report from Xero. Shows assets, liabilities, and equity at a specific date.
datestringpaymentsOnlybooleanperiodsintegerstandardLayoutbooleantenant_idstringtimeframestringtrackingOptionIDstringXERO_GET_BUDGETRetrieve a budget from Xero. Budgets track planned vs actual spending by account.4 paramsRetrieve a budget from Xero. Budgets track planned vs actual spending by account.
DateFromstringDateTostringbudget_idstringtenant_idstringXERO_GET_CONNECTIONSTool to list active Xero connections. Use when you need to retrieve all current tenant connections for the authenticated user.Tool to list active Xero connections. Use when you need to retrieve all current tenant connections for the authenticated user.
No parameter schema in public metadata yet.
XERO_GET_CONTACTRetrieve a specific contact by ID from Xero. Returns full contact details including addresses and phone numbers.2 paramsRetrieve a specific contact by ID from Xero. Returns full contact details including addresses and phone numbers.
contact_idstringtenant_idstringXERO_GET_CONTACTSTool to retrieve a list of contacts. Use when you need up-to-date contact information with filtering, paging, or incremental updates.10 paramsTool to retrieve a list of contacts. Use when you need up-to-date contact information with filtering, paging, or incremental updates.
ContactIDstringIDsarrayIf-Modified-SincestringincludeArchivedbooleanorderstringpageintegerpageSizeintegersearchTermstringsummaryOnlybooleanwherestringXERO_GET_INVOICERetrieve a specific invoice by ID from Xero. Returns full invoice details including line items and status.3 paramsRetrieve a specific invoice by ID from Xero. Returns full invoice details including line items and status.
invoice_idstringtenant_idstringunitdpintegerXERO_GET_ITEMRetrieve a specific item by ID from Xero. Returns item code, name, pricing, and tax details.2 paramsRetrieve a specific item by ID from Xero. Returns item code, name, pricing, and tax details.
item_idstringtenant_idstringXERO_GET_MANUAL_JOURNALRetrieve a specific manual journal by ID from Xero. Returns full details including journal lines.2 paramsRetrieve a specific manual journal by ID from Xero. Returns full details including journal lines.
manual_journal_idstringtenant_idstringXERO_GET_ORGANISATIONRetrieve organisation details from Xero. Returns company info, base currency, timezone, financial year settings, etc.1 paramsRetrieve organisation details from Xero. Returns company info, base currency, timezone, financial year settings, etc.
tenant_idstringXERO_GET_PROFIT_LOSS_REPORTRetrieve Profit & Loss report from Xero. Shows income, expenses, and net profit for a specified period.11 paramsRetrieve Profit & Loss report from Xero. Shows income, expenses, and net profit for a specified period.
fromDatestringpaymentsOnlybooleanperiodsintegerstandardLayoutbooleantenant_idstringtimeframestringtoDatestringtrackingCategoryIDstringtrackingCategoryID2stringtrackingOptionIDstringtrackingOptionID2stringXERO_GET_PROJECTRetrieve a specific project by ID from Xero. Returns project details, deadlines, and status.2 paramsRetrieve a specific project by ID from Xero. Returns project details, deadlines, and status.
project_idstringtenant_idstringXERO_GET_PURCHASE_ORDERRetrieve a specific purchase order by ID from Xero. Returns full details including line items and status.2 paramsRetrieve a specific purchase order by ID from Xero. Returns full details including line items and status.
purchase_order_idstringtenant_idstringXERO_GET_QUOTESTool to retrieve a list of quotes. Use when you need to list, filter, or page through sales quotes. Use after obtaining the tenant ID via connections.11 paramsTool to retrieve a list of quotes. Use when you need to list, filter, or page through sales quotes. Use after obtaining the tenant ID via connections.
ContactIDstringDateFromstringDateTostringExpiryDateFromstringExpiryDateTostringIf-Modified-SincestringQuoteNumberstringStatusstringorderstringpageintegertenant_idstringXERO_LIST_ACCOUNTSRetrieve chart of accounts from Xero. Returns all accounting codes used for categorizing transactions.3 paramsRetrieve chart of accounts from Xero. Returns all accounting codes used for categorizing transactions.
orderstringtenant_idstringwherestringXERO_LIST_ASSETSRetrieve fixed assets from Xero. Assets track depreciation and book value of capital equipment.6 paramsRetrieve fixed assets from Xero. Assets track depreciation and book value of capital equipment.
orderBystringpageintegerpageSizeintegersortDirectionstringstatusstringtenant_idstringXERO_LIST_ATTACHMENTSList all attachments for a specific entity in Xero (invoice, contact, etc.).3 paramsList all attachments for a specific entity in Xero (invoice, contact, etc.).
entity_idstringentity_typestringtenant_idstringXERO_LIST_BANK_TRANSACTIONSRetrieve bank transactions from Xero. Includes spend (payments) and receive (receipts) transactions.6 paramsRetrieve bank transactions from Xero. Includes spend (payments) and receive (receipts) transactions.
If-Modified-Sincestringorderstringpageintegertenant_idstringunitdpintegerwherestringXERO_LIST_CREDIT_NOTESRetrieve list of credit notes from Xero. Credit notes are issued to reduce amounts owed by customers.5 paramsRetrieve list of credit notes from Xero. Credit notes are issued to reduce amounts owed by customers.
If-Modified-Sincestringorderstringpageintegertenant_idstringwherestringXERO_LIST_FILESRetrieve files from Xero Files. Lists documents stored in Xero's file management system.5 paramsRetrieve files from Xero Files. Lists documents stored in Xero's file management system.
folderIdstringpageintegerpagesizeintegersortstringtenant_idstringXERO_LIST_FOLDERSRetrieve folders from Xero Files. Lists document folders in Xero's file management system.2 paramsRetrieve folders from Xero Files. Lists document folders in Xero's file management system.
sortstringtenant_idstringXERO_LIST_INVOICESRetrieve a list of invoices from Xero. Supports filtering by status, contact, date range, and pagination.10 paramsRetrieve a list of invoices from Xero. Supports filtering by status, contact, date range, and pagination.
ContactIDsstringIf-Modified-SincestringInvoiceIDsstringStatusesstringcreatedByMyAppbooleanincludeArchivedbooleanorderstringpageintegertenant_idstringwherestringXERO_LIST_ITEMSRetrieve items (inventory/products) from Xero. Items can be tracked for sales and/or purchases.4 paramsRetrieve items (inventory/products) from Xero. Items can be tracked for sales and/or purchases.
orderstringtenant_idstringunitdpintegerwherestringXERO_LIST_JOURNALSRetrieve journals from Xero. Journals show the accounting entries for all transactions.4 paramsRetrieve journals from Xero. Journals show the accounting entries for all transactions.
If-Modified-SincestringoffsetintegerpaymentsOnlybooleantenant_idstringXERO_LIST_MANUAL_JOURNALSRetrieve manual journals from Xero. Manual journals are used for period-end adjustments and corrections.5 paramsRetrieve manual journals from Xero. Manual journals are used for period-end adjustments and corrections.
If-Modified-Sincestringorderstringpageintegertenant_idstringwherestringXERO_LIST_PAYMENTSRetrieve list of payments from Xero. Payments link invoices to bank transactions.5 paramsRetrieve list of payments from Xero. Payments link invoices to bank transactions.
If-Modified-Sincestringorderstringpageintegertenant_idstringwherestringXERO_LIST_PROJECTSRetrieve projects from Xero. Projects track time and costs for client work.6 paramsRetrieve projects from Xero. Projects track time and costs for client work.
contactIDstringpageintegerpageSizeintegerprojectIdsstringstatesstringtenant_idstringXERO_LIST_PURCHASE_ORDERSRetrieve list of purchase orders from Xero. Purchase orders track goods/services ordered from suppliers.7 paramsRetrieve list of purchase orders from Xero. Purchase orders track goods/services ordered from suppliers.
DateFromstringDateTostringIf-Modified-SincestringStatusstringorderstringpageintegertenant_idstringXERO_LIST_TAX_RATESRetrieve tax rates from Xero. Shows available tax codes and rates for the organization.4 paramsRetrieve tax rates from Xero. Shows available tax codes and rates for the organization.
TaxTypestringorderstringtenant_idstringwherestringXERO_LIST_TRACKING_CATEGORIESRetrieve tracking categories from Xero. Tracking categories are used to segment data for reporting (e.g., departments, regions).4 paramsRetrieve tracking categories from Xero. Tracking categories are used to segment data for reporting (e.g., departments, regions).
includeArchivedbooleanorderstringtenant_idstringwherestringXERO_POST_INVOICE_UPDATETool to update an existing invoice. Use when you need to modify the details of an invoice after it's been created.4 paramsTool to update an existing invoice. Use when you need to modify the details of an invoice after it's been created.
InvoiceIDstringInvoiceNumberstringInvoicesarrayunitdpintegerXERO_UPDATE_CONTACTUpdate an existing contact in Xero. Only provided fields will be updated.12 paramsUpdate an existing contact in Xero. Only provided fields will be updated.
AccountNumberstringBankAccountDetailsstringDefaultCurrencystringEmailAddressstringFirstNamestringLastNamestringNamestringTaxNumberstringcontact_idstringmobile_numberstringphone_numberstringtenant_idstringXERO_UPLOAD_ATTACHMENTUpload a file attachment to a Xero entity (invoice, contact, etc.). Supports PDF, images, and documents.6 paramsUpload a file attachment to a Xero entity (invoice, contact, etc.). Supports PDF, images, and documents.
entity_idstringentity_typestringfile_to_uploadstringfilenamestringinclude_onlinebooleantenant_idstringModel Context Protocol (MCP) server for the Xero Accounting API. Enables Claude and other MCP-compatible clients to manage Xero contacts, invoices, payments, accounts, and reports.
xero_invoices_get renders as a rich, read-only card in MCP Apps hosts — neutral by default, brandable via window.__BRAND__ injection or MCP_BRAND_* env varsNote on registry auth: This server depends only on public npm packages, so the Cloudflare and DigitalOcean cloud builders install its dependencies anonymously — no token is required for one-click deploy. (If a future release adds a private
@wyre-ai/*dependency, you would supply a GitHub PAT withread:packagesas a build variable —NODE_AUTH_TOKENfor Cloudflare Workers, a build-timeGITHUB_TOKENsecret for DigitalOcean.)Installing the published package: The released package is published to the GitHub Packages npm registry, which requires authentication on every install (even for public packages). To install it, authenticate npm to
npm.pkg.github.comwith a GitHub PAT that hasread:packages:export NODE_AUTH_TOKEN=$(gh auth token) npm install @wyre-ai/xero-mcp
npm install
npm run build
XERO_ACCESS_TOKEN=your-access-token XERO_TENANT_ID=your-tenant-id npm start
CONDUIT_S2S_SECRET is required. If it is empty or a known placeholder, the process logs an error and exits non-zero. It never prints the secret.
MCP_TRANSPORT=http \
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
XERO_ACCESS_TOKEN=your-access-token \
XERO_TENANT_ID=your-tenant-id \
npm start
With a secret set and MCP_HTTP_HOST unset, the server listens on http://0.0.0.0:8080/mcp.
Local HTTP without a secret is development-only. It logs a warning, does not check X-Gateway-S2S, and binds 127.0.0.1 only (a non-loopback MCP_HTTP_HOST is ignored):
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm start
The image listens on 0.0.0.0 inside the container. Publish the port on loopback and pass the S2S secret. Gateway mode does not read Xero credentials from the environment:
docker build -t xero-mcp .
docker run \
-e CONDUIT_S2S_SECRET=your-s2s-secret \
-e AUTH_MODE=gateway \
-p 127.0.0.1:8080:8080 \
xero-mcp
Single-tenant HTTP (AUTH_MODE=env) still requires the S2S secret, then uses XERO_ACCESS_TOKEN and XERO_TENANT_ID:
docker run \
-e CONDUIT_S2S_SECRET=your-s2s-secret \
-e AUTH_MODE=env \
-e XERO_ACCESS_TOKEN=your-access-token \
-e XERO_TENANT_ID=your-tenant-id \
-p 127.0.0.1:8080:8080 \
xero-mcp
The checked-in Compose service is gateway mode. It does not set XERO_ACCESS_TOKEN or XERO_TENANT_ID and does not use env_file, so a project .env cannot inject static vendor credentials into the container. Compose refuses to start when CONDUIT_S2S_SECRET is unset or empty, and publishes 127.0.0.1:8080:8080.
CONDUIT_S2S_SECRET=your-s2s-secret docker compose up
Copy .env.example. Leave CONDUIT_S2S_SECRET empty in that file.
| Variable | Required | Default | Description |
|---|---|---|---|
XERO_ACCESS_TOKEN | For stdio and AUTH_MODE=env | — | Xero OAuth2 access token. Not set on the gateway Compose service. |
XERO_TENANT_ID | For stdio and AUTH_MODE=env | — | Xero tenant ID (organisation). Not set on the gateway Compose service. |
MCP_TRANSPORT | No | stdio | Transport type: stdio or http |
MCP_HTTP_PORT | No | 8080 | HTTP server port |
MCP_HTTP_HOST | No | 0.0.0.0 when CONDUIT_S2S_SECRET is set | Bind address. A configured secret honors this value. With no secret, MCP_ALLOW_INSECURE_DEV=1 forces 127.0.0.1. The container image sets 0.0.0.0. |
AUTH_MODE | No | env | env or gateway. Compose sets gateway. |
CONDUIT_S2S_SECRET | Yes for HTTP | — | Service-to-service HMAC secret. HTTP startup exits non-zero when this is empty or a known placeholder. Never commit a real value. The value is never logged. |
MCP_ALLOW_INSECURE_DEV | No | unset | Set to exactly 1 for local HTTP without CONDUIT_S2S_SECRET. Logs a warning, skips X-Gateway-S2S, and binds 127.0.0.1 only. Does not accept a placeholder secret. |
/health stays unauthenticated and does not read credentials. The stdio transport does not use CONDUIT_S2S_SECRET.
With MCP_TRANSPORT=http and CONDUIT_S2S_SECRET set, every /mcp request must include X-Gateway-S2S. The check is verifyS2sHeader in src/s2s-verify.ts.
The header value is t=<unix seconds>,v1=<hex>:
<unix seconds> is the current UTC time.<hex> is HMAC-SHA256 of the literal string t=<unix seconds> (the same t= prefix and digits), keyed with CONDUIT_S2S_SECRET, encoded as 64 lowercase hex characters.A missing or invalid header is HTTP 401, before vendor credentials are read. The secret is never logged.
TS=$(date +%s)
SIG=$(printf 't=%s' "$TS" | openssl dgst -sha256 -hmac "$CONDUIT_S2S_SECRET" -hex | awk '{print $NF}')
curl -sS http://127.0.0.1:8080/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "X-Gateway-S2S: t=${TS},v1=${SIG}" \
-H "X-Xero-Access-Token: $XERO_ACCESS_TOKEN" \
-H "X-Xero-Tenant-Id: $XERO_TENANT_ID" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Known placeholders (replace-with-a-real-secret, your-s2s-secret, your-secret, changeme, change-me, placeholder, secret, example, replace-me, s2s-secret, any case, surrounding whitespace ignored) are refused at startup so a copied example cannot forge that header. Generate a secret with openssl rand -hex 32.
When AUTH_MODE=gateway, credentials are passed per-request via HTTP headers instead of environment variables:
X-Xero-Access-Token — OAuth2 access tokenX-Xero-Tenant-Id — Xero tenant IDA request missing either header gets HTTP 401 and does not fall back to XERO_ACCESS_TOKEN or XERO_TENANT_ID. When CONDUIT_S2S_SECRET is set, the request must also include a valid X-Gateway-S2S header. This allows a gateway/proxy to manage multi-tenant credentials.
xero_invoices_get renders as an interactive card in MCP Apps hosts
(Claude Desktop/web) showing status, contact, dates, amounts, and line
items; plain-JSON behavior is unchanged in other hosts. The card is
read-only — invoices are financial records, so no write actions are
exposed from it. It is neutral by default and brandable via
window.__BRAND__ injection or MCP_BRAND_* env vars (MCP_BRAND_NAME,
MCP_BRAND_LOGO_URL, MCP_BRAND_PRIMARY_COLOR, MCP_BRAND_ACCENT_COLOR,
MCP_BRAND_BG, MCP_BRAND_TEXT) — no rebuild needed.
Tools are organized into domains. Use xero_navigate to select a domain, then use the domain-specific tools.
xero_navigate — Select a domain (contacts, invoices, payments, accounts, reports)xero_back — Return to domain selectionxero_contacts_list — List contacts with pagination and optional filteringxero_contacts_get — Get detailed contact information by IDxero_contacts_create — Create a new contact (customer or supplier)xero_contacts_search — Search contacts by namexero_invoices_list — List invoices with optional status and type filtersxero_invoices_get — Get detailed invoice information by IDxero_invoices_create — Create a new invoice (sales or bill)xero_invoices_update_status — Update invoice status (submit, authorise, void)xero_payments_list — List payments with optional status filterxero_payments_get — Get detailed payment information by IDxero_payments_create — Record a payment against an invoicexero_accounts_list — List chart of accounts with optional type/class filterxero_accounts_get — Get detailed account information by IDxero_reports_profit_and_loss — Profit and Loss (income statement) for a date rangexero_reports_balance_sheet — Balance Sheet as of a specific datexero_reports_aged_receivables — Aged Receivables by contactxero_reports_aged_payables — Aged Payables by contactApache-2.0
XERO_TENANT_ID*Xero tenant ID (organisation). Required when AUTH_MODE is 'env'.
XERO_ACCESS_TOKEN*secretXero OAuth2 access token. Required when AUTH_MODE is 'env'.
MCP_TRANSPORTdefault: stdioTransport mode for the server. Set to 'stdio' for local CLI use; the image defaults to 'http' for gateway hosting.
AUTH_MODEdefault: envCredential source: 'env' reads vars locally, 'gateway' expects header injection from the WYRE MCP Gateway.
LOG_LEVELdefault: infoLog verbosity: debug, info, warn, error