
List all chart of accounts. Filter by Type or Class using 'where' parameter. Returns account codes needed for invoices and transactions.
Get a single account by ID with full details including reporting codes.
Create a new account in the chart of accounts. Requires Name, Code (unique), and Type. Use list_accounts to check existing codes.
List bank transactions with pagination (100 per page). Filter by type (RECEIVE/SPEND) using 'where' parameter.
Get a single bank transaction by ID with full details including line items.
Create a bank transaction. Requires Type (RECEIVE/SPEND), Contact, BankAccount, and LineItems. Use list_accounts to find bank account IDs.
Update a bank transaction. Only AUTHORISED transactions can be updated. Use getbanktransaction to check status.
List contacts with pagination (100 per page). Supports filtering via 'where' parameter. Use pageinfo.hasnext_page to check for more results.
Get a single contact by ID with full details including addresses and phone numbers.
Create a new contact. Name is required. Use list_contacts to check for duplicates first.
Update an existing contact. Only provided fields are updated. Use get_contact to see current values.
Archive a contact by setting its status to ARCHIVED. Archived contacts can be restored.
List credit notes with pagination (100 per page). ACCRECCREDIT=sales credits, ACCPAYCREDIT=purchase credits.
Get a single credit note by ID with full details including line items and remaining credit.
Create a credit note. Requires Type (ACCRECCREDIT/ACCPAYCREDIT), Contact, and LineItems. Use list_contacts for ContactIDs.
Update a credit note. Only DRAFT or SUBMITTED credit notes can be updated. Use getcreditnote to check status.
List invoices with pagination (100 per page). Filter by status or type. ACCREC=sales invoices, ACCPAY=bills.
Get a single invoice by ID with full details including line items, amounts, and payment status.
Create a new invoice. Requires Type (ACCREC/ACCPAY), Contact, and LineItems. Use list_contacts to find ContactIDs.
Update an existing invoice. Only DRAFT or SUBMITTED invoices can be fully updated. Use get_invoice to check status.
Void an invoice. Only AUTHORISED or SUBMITTED invoices can be voided. This cannot be undone.
Email an invoice to the contact. Invoice must be AUTHORISED before it can be emailed.
List all items (products/services). Returns item codes that can be used on invoices and purchase orders.
Get a single item by ID with full details including purchase and sales details.
Create a new item (product/service). Code is required and must be unique. Use list_items to check existing codes.
Delete an item. This permanently removes the item. Use list_items to find item IDs.
List manual journals with pagination (100 per page). Filter by status using 'where' parameter.
Get a single manual journal by ID with full details including journal lines.
Create a manual journal. Requires Narration and JournalLines (min 2 lines, debits/credits must balance). Use list_accounts for account codes.
Update a manual journal. Only DRAFT journals can be updated. Use getmanualjournal to check status.
Get the current Xero organisation details including name, currency, country, and financial year settings.
List all connected Xero organisations (tenants). Use this to discover available tenant IDs.
List payments with pagination. Supports filtering via 'where' parameter. Use pageinfo.hasnext_page to check for more results.
Get a single payment by ID with full details including related invoice and account info.
Create a payment against an invoice or credit note. Requires Account (bank) and Amount. Use listinvoices and listaccounts to find IDs.
List purchase orders with pagination (100 per page). Filter by status using 'where' parameter.
Get a single purchase order by ID with full details including line items and delivery info.
Create a purchase order. Requires Contact (supplier) and LineItems. Use list_contacts for supplier ContactIDs.
Update a purchase order. Only DRAFT or SUBMITTED orders can be updated. Use getpurchaseorder to check status.
List quotes with pagination (100 per page). Filter by status using 'where' parameter.
Get a single quote by ID with full details including line items and terms.
Create a quote. Requires Contact and LineItems. Use list_contacts to find ContactIDs.
Update a quote. Xero requires Contact, Date, and LineItems on every update. Use get_quote to get current values first.
List all tax rates configured in the organisation. Returns TaxType codes needed for invoices and transactions.
List all tracking categories and their options. Used for cost center and department tracking on transactions.
List all currencies enabled in the organisation. Returns currency codes for multi-currency invoices.
List all branding themes. Returns theme IDs that can be applied to invoices, quotes, and purchase orders.
Validate Xero credentials by listing connected organisations. Returns {success, message}.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}A Xero MCP is an MCP server that gives your agents access to data and functionality inside your Xero organization via tools. Your agents can invoke these tools to create and update invoices, record payments, manage contacts, post journal entries, and more.
Xero offers an official MCP server, but you can also use one from a third-party platform, like Merge Agent Handler.
The use cases naturally depend on the agent you've built, but here are a few common ones:
Here are some of the most commonly used tools:
create_invoice: creates a new invoice in Xero for a given contact, line items, and due date. Use this when an agent needs to bill a client automatically after a trigger event in another systemlist_invoices: retrieves invoices filtered by status, contact, or date range. Helpful when an agent needs to identify outstanding or overdue invoices before taking a collection or reporting actioncreate_payment: records a payment against an invoice or credit note in Xero. Call this when an agent detects an incoming payment in a bank feed or payment processor and needs to reconcile it automaticallycreate_contact: adds a new customer or supplier to Xero's contact list. Good for workflows that onboard a new client in a CRM and need to mirror that record in Xero without manual data entrycreate_bank_transaction: posts a spend or receive money transaction against a bank account in Xero. Call this when an agent processes an approved expense or reimbursement and needs to record it in the ledgercreate_manual_journal: creates a manual journal entry with debit and credit lines. Useful for agents that handle month-end adjustments or intercompany postings triggered by events in another financial systemSeveral factors make Merge Agent Handler's Xero MCP server the stronger choice over building or using an alternative:
You can take the following steps:
1. Create or log into your Merge Agent Handler account and navigate to Tool Packs (collections of connector tools scoped to a specific use case).
2. Create a new Tool Pack, then find and enable the Xero connector. Choose which tools to include: enable read tools for reporting and reconciliation use cases, or add write tools if your agent needs to create invoices, record payments, or post journal entries.
3. Add a Registered User inside the Tool Pack. This is the identity context under which your agent operates. Merge generates a unique MCP URL scoped to this user once it's created.
4. From the Registered User detail page, authenticate Xero by completing the OAuth flow. Merge stores and manages the credentials going forward.
5. Copy the MCP URL from the Tool Pack detail page and generate an API key from Settings. You'll need both to connect your agent.
6. Add the MCP server to your agent or IDE using the MCP URL and API key. Your Xero tools are now accessible through that endpoint.
Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now