Skip to main content
Glama

Invio Xero MCP

create_xero_payment

create_xero_payment
Destructive

Proposes recording a payment against an existing, AUTHORISED invoice in this Xero organisation - it does NOT touch Xero itself, and never will on its own. This queues a pending change that a human must explicitly approve (your Xero MCP connector - the exact link is this response's own approvalUrl field) before Xero is touched at all; you have no way to approve it yourself. Tell the user what you are proposing (which invoice, the amount and currency, which bank account, the date) and that it needs their approval in Invio before it goes anywhere - do not describe it as recorded, applied, or done. invoiceId must come from list_xero_invoices or get_xero_invoice (never invented). For the bank account, give EXACTLY ONE of accountCode or bankAccountName, both from list_xero_accounts (look for type BANK) - never invent either one, and never reuse an invoice line item's accountCode, which is very likely a revenue account, not a bank account. Use accountCode when that account has a real code; use bankAccountName (its exact name) when list_xero_accounts shows it as code: null - a bank account added through Xero's own "Add Bank Account" commonly has no code at all, and that is not a reason to guess one. UNLIKE EVERY OTHER CHANGE THIS CONNECTOR CAN DRAFT, a payment has no draft state in Xero at all - the moment a human approves this, it is applied immediately and the invoice is genuinely, immediately less owed. It can only be reversed by deleting the payment directly inside Xero itself - this connector has no tool that can do that, so make sure the user actually wants this recorded before they approve it. DATES: date is strict YYYY-MM-DD, so you always have to convert whatever the user actually said. A date carrying a month name ("8 Sep", "Sept 8th"), a weekday ("last Tuesday"), or an already-unambiguous full date ("2026-09-08") is yours to convert normally. A BARE NUMERIC date with no month name - "9/8", "08/09", "9-8" - is the one that is not: it means 9 August to most of the world and 8 September in the United States, and getting it wrong puts a payment a month out in a way nobody skimming the approval card will catch. This Invio account is based in a country that writes the DAY first, so read a bare "9/8" as 9 August, not 8 September. Say in plain words how you read it ("I read 9/8 as 9 August") so the user can correct you before they approve. If their own wording points the other way anywhere in the same request, ask them which they meant instead of picking.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dateYesDate the payment was made, YYYY-MM-DD. Cannot be in the future - Xero can only record a payment that has already happened, never a scheduled one, and this is checked against the organisation's own current date (its own timezone, not the server's or your own). If the user wrote a bare numeric date with no month name ("9/8", "08/09"), do NOT settle it on your own judgement - it is 9 August to most of the world and 8 September in the US, and nothing downstream of this field can tell which you meant once it is a date. Follow the DATES instruction in this tool's description.
amountYesHow much was paid, in the invoice's OWN currency - never convert it into a different one. Must not exceed what is currently still owed on the invoice (its AmountDue); a smaller amount is a valid PARTIAL payment and is allowed.
currencyNoThe currency you believe this payment is in, e.g. "NZD" - OPTIONAL, and NOT something this tool sets on the payment (a payment has no currency of its own; it is always in the invoice's own currency). If you provide this, it is checked against the invoice's actual currency and the draft is refused if they do not match - use it as a sanity check when the user names a currency, not to convert anything. Omit it if you are not sure.
invoiceIdYesThe Xero invoice this payment is against. Get this from list_xero_invoices or get_xero_invoice first - never invent one. The invoice must currently be AUTHORISED in Xero (a DRAFT invoice cannot receive a payment) and the amount must not exceed what is currently still owed on it (its AmountDue) - both are re-checked against Xero live, both when this is drafted and again when a human approves it, so a figure that was valid when you drafted it can still be refused later if the invoice has moved in the meantime (another payment, a credit note, a direct edit in Xero).
referenceNoFree-text reference for the payment (e.g. "Direct debit", a bank reference).
accountCodeNoThis tenant's own chart-of-accounts code for the BANK account the money was received into (or paid out of) - e.g. "090". Get one from list_xero_accounts first (look for type BANK), never guess - not every bank account has one (list_xero_accounts shows code: null for an account Xero itself gave no code). Give EXACTLY ONE of accountCode or bankAccountName: accountCode when the account has a real code, bankAccountName (its exact name instead) when it does not. Whichever you give, it must be a BANK account and ACTIVE in Xero - both are checked live, and the draft is refused with the real reason if either is not true.
organisationNoThe Xero organisation to use, by its display name. Only needed if this connection reaches more than one organisation - omit it when there is only one.
bankAccountNameNoThis tenant's own exact name for the BANK account, for when it has no code in Xero at all (see accountCode's own description). Get it from list_xero_accounts first (look for type BANK) - it must match a real BANK account's name exactly (matched case-insensitively, but never a guess, an abbreviation, or a partial name). Give EXACTLY ONE of accountCode or bankAccountName, never both, never neither.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations, disclosing that the tool does not touch Xero itself, requires explicit human approval, has no draft state in Xero once approved, applies immediately, and can only be reversed by deleting the payment inside Xero. It also discloses live re-checking, refusal conditions, and the instruction to narrate the proposed payment to the user rather than describing it as recorded or applied. The destructiveHint annotation is consistent with the irreversibility warning, not contradicted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and approval model, then organized into sourcing, bank account selection, consequences, and date handling. It is long and at times repetitive, especially around bank-account sourcing, but the length is largely justified by high-risk constraints and edge cases. Every block earns its place even if some wording could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an eight-parameter tool with no output schema, this description is unusually complete: it covers all parameters, data sourcing, approval flow, the response's approvalUrl field, live re-checks, refusal reasons, irreversibility, and even cultural date ambiguity. Nothing essential is missing for an agent to invoke this tool correctly and communicate the outcome safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already covers 100% of parameters, the description adds substantial meaning beyond the structured fields: exactly one of accountCode or bankAccountName, never reusing an invoice line item's accountCode, using bankAccountName when list_xero_accounts shows code: null, strict YYYY-MM-DD conversion with a day-first rule for bare numeric dates, and amount/currency constraints such as partial payments and no currency conversion. This significantly exceeds what the schema alone communicates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a precise action and object: proposing to record a payment against an existing, AUTHORISED Xero invoice. It immediately clarifies that this is a queued pending change requiring human approval, not a direct Xero mutation, which distinguishes it clearly from sibling create/update tools. The 'UNLIKE EVERY OTHER CHANGE' line further separates it from the other draftable changes this connector can produce.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about prerequisites and supporting tools: invoiceId must come from list_xero_invoices/get_xero_invoice, and bank account fields must come from list_xero_accounts. It also tells the agent how to present the proposal and what not to claim. However, it does not explicitly name alternative tools for similar situations (e.g., create_xero_credit_note) or give a clear when-not-to-use condition beyond the ambiguous-date case, so the guidance stops short of a full exclusion set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources