{
  "markdown": "# Xero MCP Server\n\nModel Context Protocol (MCP) server for the [Xero Accounting API](https://developer.xero.com/documentation/api/accounting/overview). Enables Claude and other MCP-compatible clients to manage Xero contacts, invoices, payments, accounts, and reports.\n\n## Features\n\n- Contacts, invoices, payments, chart of accounts, and financial reports over stdio, HTTP, or Cloudflare Workers transports\n- Interactive invoice card (MCP Apps, SEP-1865): `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 vars\n- Gateway mode for per-request, multi-tenant credentials\n\n## One-Click Deployment\n\n[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/WYRE-AI/xero-mcp/tree/main)\n\n[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/WYRE-AI/xero-mcp)\n\n> **Note 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 with `read:packages` as a build variable — `NODE_AUTH_TOKEN` for Cloudflare Workers, a build-time `GITHUB_TOKEN` secret for DigitalOcean.)\n>\n> **Installing the published package:** The released package is published to the [GitHub Packages](https://github.com/WYRE-AI/xero-mcp/pkgs/npm/xero-mcp) npm registry, which requires authentication on every install (even for public packages). To install it, authenticate npm to `npm.pkg.github.com` with a GitHub PAT that has `read:packages`:\n>\n> ```bash\n> export NODE_AUTH_TOKEN=$(gh auth token)\n> npm install @wyre-ai/xero-mcp\n> ```\n\n## Quick Start\n\n### Prerequisites\n\n- Node.js >= 20\n- Xero OAuth2 app credentials (requires a [Xero developer account](https://developer.xero.com/))\n\n### Install and Build\n\n```bash\nnpm install\nnpm run build\n```\n\n### Run (stdio mode)\n\n```bash\nXERO_ACCESS_TOKEN=your-access-token XERO_TENANT_ID=your-tenant-id npm start\n```\n\n### Run (HTTP mode)\n\n```bash\nMCP_TRANSPORT=http XERO_ACCESS_TOKEN=your-access-token XERO_TENANT_ID=your-tenant-id npm start\n```\n\nThe server listens on `http://0.0.0.0:8080/mcp` by default.\n\n### Docker\n\n```bash\ndocker build -t xero-mcp .\ndocker run -p 8080:8080 \\\n  -e MCP_TRANSPORT=http \\\n  -e XERO_ACCESS_TOKEN=your-access-token \\\n  -e XERO_TENANT_ID=your-tenant-id \\\n  xero-mcp\n```\n\n## Environment Variables\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n| `XERO_ACCESS_TOKEN` | Yes (env mode) | — | Xero OAuth2 access token |\n| `XERO_TENANT_ID` | Yes (env mode) | — | Xero tenant ID (organisation) |\n| `MCP_TRANSPORT` | No | `stdio` | Transport type: `stdio` or `http` |\n| `MCP_HTTP_PORT` | No | `8080` | HTTP server port |\n| `MCP_HTTP_HOST` | No | `0.0.0.0` | HTTP server bind address |\n| `AUTH_MODE` | No | `env` | Auth mode: `env` or `gateway` |\n\n## Gateway Mode\n\nWhen `AUTH_MODE=gateway`, credentials are passed per-request via HTTP headers instead of environment variables:\n\n- `X-Xero-Access-Token` — OAuth2 access token\n- `X-Xero-Tenant-Id` — Xero tenant ID\n\nThis allows a gateway/proxy to manage multi-tenant credentials.\n\n## Interactive Invoice Card (MCP Apps)\n\n`xero_invoices_get` renders as an interactive card in MCP Apps hosts\n(Claude Desktop/web) showing status, contact, dates, amounts, and line\nitems; plain-JSON behavior is unchanged in other hosts. The card is\nread-only — invoices are financial records, so no write actions are\nexposed from it. It is neutral by default and brandable via\n`window.__BRAND__` injection or `MCP_BRAND_*` env vars (`MCP_BRAND_NAME`,\n`MCP_BRAND_LOGO_URL`, `MCP_BRAND_PRIMARY_COLOR`, `MCP_BRAND_ACCENT_COLOR`,\n`MCP_BRAND_BG`, `MCP_BRAND_TEXT`) — no rebuild needed.\n\n## Available Tools\n\nTools are organized into domains. Use `xero_navigate` to select a domain, then use the domain-specific tools.\n\n### Navigation\n\n- `xero_navigate` — Select a domain (contacts, invoices, payments, accounts, reports)\n- `xero_back` — Return to domain selection\n\n### Contacts\n\n- `xero_contacts_list` — List contacts with pagination and optional filtering\n- `xero_contacts_get` — Get detailed contact information by ID\n- `xero_contacts_create` — Create a new contact (customer or supplier)\n- `xero_contacts_search` — Search contacts by name\n\n### Invoices\n\n- `xero_invoices_list` — List invoices with optional status and type filters\n- `xero_invoices_get` — Get detailed invoice information by ID\n- `xero_invoices_create` — Create a new invoice (sales or bill)\n- `xero_invoices_update_status` — Update invoice status (submit, authorise, void)\n\n### Payments\n\n- `xero_payments_list` — List payments with optional status filter\n- `xero_payments_get` — Get detailed payment information by ID\n- `xero_payments_create` — Record a payment against an invoice\n\n### Accounts\n\n- `xero_accounts_list` — List chart of accounts with optional type/class filter\n- `xero_accounts_get` — Get detailed account information by ID\n\n### Reports\n\n- `xero_reports_profit_and_loss` — Profit and Loss (income statement) for a date range\n- `xero_reports_balance_sheet` — Balance Sheet as of a specific date\n- `xero_reports_aged_receivables` — Aged Receivables by contact\n- `xero_reports_aged_payables` — Aged Payables by contact\n\n## License\n\nApache-2.0\n",
  "bytes": 5488,
  "sha": "c9565283db61dce1f2b8007d3c65a00d2ace1324f1a336428231527a65d349a8",
  "repo_slug": "wyre-ai/xero-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_wyre_ai_xero_mcp_cb1caef0/readme"
}