Pipeyard

Xero MCP Connector

Xero
financeStatus: Active4.5 ratingSecurity score: 8/10Context size: Small

Connect AI agents to Xero for accounting, invoicing, bank reconciliation, payroll, and financial reporting.

Auth notes

OAuth 2.0 via Xero Developer Portal at developer.xero.com. Register app and configure redirect URIs. Each connected organization requires separate tenant ID. Access tokens expire every 30 minutes. Refresh tokens valid for 60 days.

Rate limits

60 requests per minute per app per Xero organization. Some endpoints have lower limits — Files API limited to 10 requests per minute. Exceeding limits returns 429 with Retry-After header.

Edge cases

Tenant ID required in every request header — easy to forget when switching between organizations. Xero uses its own currency formatting — do not use standard locale formatting. Archived contacts and accounts still appear in list responses — filter by status field. Bank feed data has up to 24 hour delay.

Sandbox testing

Run test calls against Xero from Pipeyard. Try prompts below to see a simulated response; real MCP integration is coming in a future release.

Have a connector you'd like us to prioritize or a specific test flow you care about? Use the Requests page to submit new ideas.

Quick Start — curl example

curl
curl -X GET "https://api.xero.com/api.xro/2.0/Invoices?Status=AUTHORISED" \
  -H "Authorization: Bearer {access_token}" \
  -H "Xero-tenant-id: {tenant_id}" \
  -H "Accept: application/json"

Credential Setup Guide

  1. 11. Go to developer.xero.com and log in or create a free account
  2. 22. Click "New App" and fill in your app details
  3. 33. Set your Redirect URI for OAuth callback
  4. 44. Copy your Client ID and Client Secret
  5. 55. Direct users to https://login.xero.com/identity/connect/authorize for authorization
  6. 66. Exchange the code for tokens at https://identity.xero.com/connect/token
  7. 77. Get your Tenant ID by calling GET https://api.xero.com/connections after authorization
  8. 88. Include Xero-tenant-id header in every API request

Example API Response

Sample data
curl
{
  "Invoices": [
    {
      "InvoiceID": "uuid-invoice-here",
      "Type": "ACCREC",
      "InvoiceNumber": "INV-0042",
      "Status": "AUTHORISED",
      "DateString": "2025-03-01",
      "DueDateString": "2025-03-31",
      "AmountDue": 3800,
      "AmountPaid": 0,
      "Total": 3800,
      "Contact": {
        "Name": "Meridian Builders Ltd"
      },
      "CurrencyCode": "USD"
    }
  ]
}