mcp protocol bridge to xero accounting api
Implements a Model Context Protocol (MCP) server that translates MCP tool calls into Xero REST API requests and formats responses back to MCP-compliant JSON. Uses stdio transport for bidirectional communication with MCP clients (Claude Desktop, etc.), abstracting away Xero's REST API complexity behind a standardized protocol interface. The server instantiates core components during initialization and registers 49+ tools before accepting client connections.
Unique: Implements a five-layer architecture (protocol → tool management → business logic → API integration) with strategy pattern authentication that selects between BearerTokenXeroClient and CustomConnectionsXeroClient based on environment variables, enabling both multi-tenant and single-org deployments from the same codebase
vs alternatives: Provides native MCP protocol support out-of-the-box (vs REST wrappers), enabling seamless integration with Claude Desktop and other MCP clients without custom adapter code
strategy-pattern authentication with dual credential support
Implements a pluggable authentication system using the strategy pattern, selecting between two client implementations (BearerTokenXeroClient for OAuth tokens, CustomConnectionsXeroClient for client credentials) based on environment variables. Bearer token takes precedence when both credential types are present. The MCPXeroClient abstract base class defines the interface both implementations satisfy, allowing runtime credential selection without code changes.
Unique: Uses abstract base class MCPXeroClient with concrete implementations for each auth strategy, enabling compile-time type safety while maintaining runtime flexibility — bearer token precedence is baked into initialization logic rather than conditional checks throughout the codebase
vs alternatives: Cleaner than conditional auth checks scattered across handlers; more flexible than hard-coded single auth method; supports both OAuth (multi-tenant) and client credentials (development) without separate deployments
xero organization context and multi-tenant isolation
Manages organization context (tenant ID) throughout the request lifecycle, ensuring that all API calls are scoped to the correct Xero organization. The server extracts organization ID from authentication context (OAuth token or client credentials) and passes it to all tool handlers. This prevents cross-tenant data leakage and ensures that each request operates on the correct organization's data.
Unique: Extracts organization ID from authentication context at server initialization and threads it through all tool handlers via dependency injection, preventing accidental cross-tenant queries that would be easy to miss with manual parameter passing
vs alternatives: More secure than passing organization ID as tool parameter (cannot be overridden by client); more efficient than querying organization ID on each request; prevents entire classes of multi-tenant bugs
accounting entity crud operations (invoices, contacts, quotes, credit notes, bank transactions, manual journals)
Provides 36+ tools for creating, reading, updating, and deleting core accounting entities through the Xero API. Each entity type (Invoice, Contact, Quote, CreditNote, BankTransaction, ManualJournal, Item, TrackingCategory) has dedicated handler functions that map MCP tool parameters to Xero REST endpoints, handle validation, and format responses. The handler layer abstracts entity-specific business logic (e.g., invoice line items, contact addresses) from the protocol layer.
Unique: Separates entity handlers into dedicated modules (src/tools/create, src/tools/update, src/tools/list, src/tools/delete, src/tools/get) with consistent parameter validation and error handling patterns, enabling easy addition of new entity types without modifying core protocol logic
vs alternatives: More granular than generic REST proxy (each entity has optimized parameters and validation); more maintainable than monolithic handler (entity-specific logic isolated); supports Xero-specific features like tracking categories and line item arrays that generic CRUD tools miss
financial reporting with calculated metrics (p&l, balance sheet, trial balance, aged receivables/payables)
Exposes 5 financial report tools that retrieve pre-calculated accounting reports from Xero's reporting engine. Reports are fetched via dedicated API endpoints and formatted into structured JSON with line items, subtotals, and period comparisons. The server handles date range filtering, currency conversion, and report-specific parameters (e.g., tracking category breakdown for P&L).
Unique: Leverages Xero's server-side report calculation engine rather than computing reports client-side, eliminating the need to fetch and aggregate raw transactions — reports are pre-calculated and formatted by Xero's reporting infrastructure
vs alternatives: Faster than transaction-level aggregation (no need to fetch 1000+ transactions); more accurate than client-side calculations (uses Xero's official GL); supports Xero-specific features like tracking category breakdowns that generic accounting tools don't expose
payroll operations for nz/uk regions (employees, timesheets, leave)
Provides 8 tools for managing payroll in New Zealand and United Kingdom regions only, covering employee master data, timesheet entry, and leave accrual/usage. Tools interact with Xero Payroll API endpoints that are region-specific and require payroll-enabled organizations. The server validates region context before executing payroll operations and returns region-specific error messages if payroll is not enabled.
Unique: Implements region-aware payroll operations with compile-time region validation, preventing execution of payroll tools in unsupported regions and returning clear error messages — payroll API endpoints are region-specific and require different authentication scopes than accounting API
vs alternatives: Tighter integration with Xero Payroll than generic HR APIs (understands NZ annual leave, UK statutory sick leave rules); prevents cross-region misconfiguration that would fail silently with generic REST clients
deep link generation for xero ui navigation
Generates clickable deep links to specific Xero UI pages (invoice detail, contact profile, report view) that users can follow to view or edit entities in the Xero web app. Links are constructed using entity IDs and organization context, enabling seamless handoff from AI agent to human user for manual review or editing. Helper utility functions format links based on entity type and Xero region.
Unique: Encapsulates Xero URL structure and region-specific routing in helper utilities, preventing hardcoded URLs scattered across handlers — supports multiple Xero regions (AU, NZ, UK, US) with correct domain and path formatting
vs alternatives: More maintainable than embedding URLs in handler logic; supports region-aware routing that generic URL builders miss; enables audit trails showing exactly which Xero UI page was linked for each AI action
structured error handling with xero api error code mapping
Implements a centralized error handling layer that catches Xero API errors, maps them to human-readable messages, and returns structured error responses to MCP clients. Error handler translates Xero-specific error codes (e.g., 'INVALID_CONTACT_STATUS', 'DUPLICATE_INVOICE_NUMBER') into actionable messages with remediation suggestions. Errors are logged with full context (request parameters, API response) for debugging.
Unique: Maps Xero-specific error codes to remediation suggestions (e.g., 'INVALID_CONTACT_STATUS' → 'Contact must be in ACTIVE status; use update_contact to change status first'), enabling agents to self-correct without human intervention
vs alternatives: More actionable than raw API errors; better than generic HTTP status codes (distinguishes between validation errors, permission errors, and system errors); supports Xero-specific error semantics that generic error handlers miss
+3 more capabilities