Xero Oauth Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Xero Oauth Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A custom Model Context Protocol server for Xero, using the standard OAuth2 authorization-code + refresh-token flow (no paid Custom Connection required). Supports multiple connected organisations (tenants) — every tool takes an optional org argument.
list_contacts, get_contact, create_contact, update_contactlist_invoices, get_invoice, get_invoice_pdf,download_invoice_pdfs, create_invoice, update_invoice, list_overdue_invoices, list_recurring_invoices
list_organisations, list_accountsEach tool accepts an optional org. It is resolved (case-insensitive) against:
XERO_ORG_ALIASES (e.g. main → a tenantId),tenantId, thenIf org is omitted, the server uses XERO_DEFAULT_ORG (which may itself be an alias), or the first connected org when that is unset.
developer.xero.com → New app → Web app.
http://localhost:49831/callbackNewer Xero apps use granular scopes. This server requestsaccounting.contacts,accounting.invoices, andaccounting.settings.read(plusopenid profile email offline_access). Make sure those are enabled on the app.
npm install
npm run buildXERO_CLIENT_ID=xxx XERO_CLIENT_SECRET=yyy npm run authA browser opens — log in and authorize each organisation you want to use (re-run to add more later). The refresh token and the connected tenant list are saved to ~/.xero-mcp-id/tokens.json (chmod 600). The refresh token rotates automatically on every use.
Example (Claude Code):
claude mcp add xero -s user \
-e XERO_CLIENT_ID=xxx \
-e XERO_CLIENT_SECRET=yyy \
-e XERO_DEFAULT_ORG=main \
-e XERO_ORG_ALIASES='{"main":"<tenant-guid>","secondary":"<tenant-guid>"}' \
-- node /absolute/path/to/dist/index.js| Var | Default | Purpose |
|---|---|---|
XERO_CLIENT_ID / XERO_CLIENT_SECRET | — | App credentials (required) |
XERO_DEFAULT_ORG | first org | Org used when a tool omits org (alias/tenantId/name) |
XERO_ORG_ALIASES | {} | JSON map of friendly alias → tenantId |
XERO_REDIRECT_PORT | 49831 | Local callback port (must match the app's redirect URI) |
XERO_PDF_DIR | ~/Downloads | Where the PDF tools save files when no path is given |
XERO_READONLY | unset | When true, all write tools refuse |
XERO_TOKEN_DIR | ~/.xero-mcp-id | Where the token store lives |
live only in XERO_TOKEN_DIR (default ~/.xero-mcp-id/, chmod 600), which is git-ignored.
create_* / update_*) can be globally disabled withXERO_READONLY=true.
MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.