@bossforce.ai/mcp-xero
v0.1.0
Published
MCP server for the Xero **Accounting API**. List and create invoices and contacts in a Xero organisation. Authenticated with OAuth2 using the refresh-token grant; the server exchanges a refresh token for short-lived access tokens and sends the organisatio
Readme
@bossforce.ai/mcp-xero
MCP server for the Xero Accounting API. List and create invoices and contacts in a Xero organisation. Authenticated with OAuth2 using the refresh-token grant; the server exchanges a refresh token for short-lived access tokens and sends the organisation (tenant) id on every call.
Credentials
| Env | How to obtain |
| -------------------- | -------------------------------------------------------------------------------------------- |
| XERO_CLIENT_ID | Client id of the Xero app (provided by the platform as the OAuth client_id). |
| XERO_CLIENT_SECRET | Client secret of the Xero app (the OAuth client_secret). |
| XERO_REFRESH_TOKEN | Obtained automatically when you authorize access. Exchanged for access tokens. |
| XERO_TENANT_ID | The Xero organisation (tenant) id. Sent as the required xero-tenant-id header. Not secret. |
The credentials are read lazily, so the server boots and answers tools/list
without them; calls fail with an auth error until they are set. On the first
call the client POSTs the refresh token to
https://identity.xero.com/connect/token (grant_type=refresh_token, with the
app authenticated via HTTP Basic base64(client_id:client_secret) and the body
form-encoded), caches the returned access_token, and re-fetches once on a
401. The Accounting API base is https://api.xero.com/api.xro/2.0; every
request sends the xero-tenant-id header and Accept: application/json.
Tools
| Tool | Arguments | Returns |
| ---------------- | ----------------------------------------------------- | ---------------------------- |
| list_invoices | where?, order? | the Invoices array |
| list_contacts | where?, order? | the Contacts array |
| create_contact | name, email_address?, first_name?, last_name? | the created Contacts array |
| create_invoice | type, contact_id, line_items | the created Invoices array |
create_invoice uses type ACCREC for a sales invoice or ACCPAY for a
bill, and references an existing contact by its ContactID. Responses are
Xero's native JSON payloads, returned as structuredContent.
Develop
pnpm --filter @bossforce.ai/mcp-xero build
pnpm --filter @bossforce.ai/mcp-xero test