Invio Xero MCP
Server Details
Every Xero organisation you run, in one AI session. Writes wait for a person to approve them.
- Status
- Healthy
- Uptime
- 92.5% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 38 tools
Each tool targets a distinct resource+action (create/get/list/update per Xero entity), and the propose→approve→reject lifecycle is explicitly documented to distinguish draft-creating tools from the approval tool. Minor overlap exists between get_xero_profit_and_loss / get_xero_balance_sheet and get_xero_group_report, but the group tool's description clearly scopes it to multi-organisation side-by-side reporting, so confusion is unlikely.
Tool names consistently follow the verb_xero_noun pattern (create_xero_invoice, get_xero_quote, list_xero_pay_runs, update_xero_contact, approve_xero_pending_change). Verb choice is predictable (create/get/list/update/post/approve/reject) and applied uniformly across all 38 tools.
38 tools is heavy, exceeding the comfortable range, though the domain (invoicing, contacts, quotes, credit notes, payments, payroll, projects, reports, organisations) is genuinely broad. The surface is largely non-redundant but has grown large enough that discovery and selection cost is significant.
Coverage is strong: create/read/update across invoices and contacts, create for most other entities, plus rich read/report tooling and a full pending-change lifecycle (create→list→approve/reject). Gaps exist (no update/delete for quotes, credit notes, manual journals; no invoice voiding tool), but these are edge operations an agent can largely work around.
Available Tools
38 toolsapprove_xero_pending_changeapprove_xero_pending_changeADestructiveIdempotentInspect
Approves a change YOU (or another assistant on this account) have already proposed to Xero - create_xero_invoice, update_xero_invoice, create_xero_contact, update_xero_contact, create_xero_manual_journal or create_xero_credit_note - and immediately executes it. This is the ONE tool in this connector that actually writes to a live Xero ledger; treat it with the same weight as send_invoice or archive_business, not as a formality. Call this ONLY after the person using this account has clearly said, in their own words, to go ahead with THIS specific change - never infer approval from context, never call this speculatively "to see what happens", and never approve a change without first showing them what it actually says (call list_pending_changes if you do not already have its summary in this conversation). If they seem unsure, or ask what a value means, answer the question and wait - hesitation is not consent. Only once they have clearly agreed, call this with confirm: true. Afterwards, relay the real outcome verbatim: whether the write to Xero actually succeeded (and, if so, the id/number Xero assigned), or exactly why it failed if it did not - you cannot retry a failed write yourself, only draft a new change. Approving in Invio's own Settings > MCP > Xero screen remains available at all times and works exactly the same either way.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true. Set this ONLY after the person using this account has explicitly said, in their own words, to approve (or reject) this specific change - never infer consent from context, and never pass true speculatively "to see what happens". | |
| pendingChangeId | Yes | The pendingChangeId of the row to act on - from list_pending_changes' own result, or the pendingChangeId a draft-creating tool (create_xero_invoice etc.) just returned. Never invent one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds substantial behavioral context beyond those: the write hits a live ledger, a failed write cannot be retried (only a new draft can be created), the real outcome must be relayed verbatim, and hesitation does not count as consent. The idempotentHint=true annotation is not contradicted; the one-shot failure description is consistent with idempotent re-execution producing no new effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is largely justified for a destructive approval tool with safety-critical consent rules; it is front-loaded with purpose and then ordered by consent gate, outcome reporting, and the manual alternative. It is somewhat repetitive across the consent warnings ('never infer... never call speculatively... never approve without...'), which could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter destructive write tool with no output schema, the description covers everything an agent needs: what it executes, the consent precondition, how to obtain the pendingChangeId, failure/retry behavior, what to report back, and the equivalent manual path. The absence of a return-format spec is mitigated because the description explicitly tells the agent to report success and Xero-assigned id/number or the failure reason.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already fully described in the schema, including the consent gate on confirm and where pendingChangeId comes from ('Never invent one'). The description reinforces these constraints in workflow terms but adds no new parameter semantics beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Approves a change... and immediately executes it') and names the exact draft-creating siblings (create_xero_invoice, update_xero_contact, etc.) whose changes it acts on. It also carves out its unique role as 'the ONE tool in this connector that actually writes to a live Xero ledger', clearly distinguishing it from list_pending_changes and reject_xero_pending_change.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not guidance: call ONLY after the user has clearly said in their own words to go ahead, never infer approval from context, never call speculatively, and call list_pending_changes first if the summary is not in context. It also names the manual alternative (Invio Settings > MCP > Xero) as an equivalent path, so the agent knows the tool is optional relative to human-approved workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_contactcreate_xero_contactAInspect
Proposes adding a new contact (customer or supplier) to this Xero organisation - it does NOT create anything in 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. name is the only required field. Once approved and executed, the resulting contactId can be used with create_xero_invoice or update_xero_invoice - but only after this change has actually been approved, never before.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| phone | No | ||
| emailAddress | No | ||
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations: it discloses the tool only proposes, never creates, requires human approval, provides an approvalUrl, and forbids using the contactId before approval. This is exactly the kind of behavioral context annotations cannot convey. No contradiction with readOnlyHint=false since it still creates a pending change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a bit long but front-loads the critical caveat and each sentence adds workflow or usage information. The phrase 'and never will on its own' is slightly redundant with 'does NOT create anything in Xero itself,' but overall it is structured and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, it usefully names the approvalUrl field and the required approval step, and explains downstream use of contactId. It does not describe the full response shape or mention list_pending_changes/approve_xero_pending_change as related workflow steps, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only 'organisation' has a schema description (25% coverage), and the description only restates that 'name' is required, which is already in the schema. It adds no meaning for phone or emailAddress beyond their self-explanatory names, so it does not compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Proposes adding') and resource ('new contact (customer or supplier)') and immediately clarifies it does not create anything in Xero itself, distinguishing it from a plain create tool and from siblings like create_xero_invoice. It also names downstream consumers of the resulting contactId, which further disambiguates its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states this queues a pending change requiring human approval and that the contactId can only be used after approval, giving an agent the context to decide whether to call it. It does not explicitly contrast it with update_xero_contact or list_xero_contacts, so there are no formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_credit_notecreate_xero_credit_noteAInspect
Proposes creating a new credit note in this Xero organisation - it does NOT create anything in 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 (contact, ACCRECCREDIT or ACCPAYCREDIT, line items, total) and that it needs their approval in Invio before it goes anywhere - do not describe it as done, issued, or created. contactId must come from list_xero_contacts (never invented); if the contact doesn't exist yet, propose it with create_xero_contact first and wait for that to be approved and executed. Even once approved, this only ever creates a DRAFT credit note inside Xero - a human still authorises and applies or refunds it from within Xero itself, this connector never does that. You CAN state a currency (currency, e.g. "NZD") when the user names one - it is checked against the organisation's own configured currencies, and refused with the real list if it is not one of them, so a currency is never silently swapped for the base currency. You CAN also say whether the amounts include tax (lineAmountTypes): use "Inclusive" for "$1,500 including GST", "Exclusive" (the default) for "$1,500 plus GST", "NoTax" for no tax at all. Never adjust the numbers yourself to fake either one. 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 credit note 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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Credit note date, YYYY-MM-DD. 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. | |
| type | Yes | ACCRECCREDIT = a credit note against a sales invoice (reduces what this contact owes this business - e.g. a refund or correction on money owed TO the business). ACCPAYCREDIT = a credit note against a bill (reduces what this business owes this contact). | |
| currency | No | The currency this credit note is raised in, e.g. "NZD". Set this whenever the user names a currency or a currency symbol ("NZ$1,500", "credit them in USD") - it is checked against the currencies this organisation is actually set up to invoice in, and the draft is refused, with the real list, if it is not one of them. Omit it only when the user did not say: the credit note is then raised in the organisation's own base currency. | |
| contactId | Yes | The Xero contact this credit note is for. Get this from list_xero_contacts first - never invent one. If the contact does not exist in Xero yet, use create_xero_contact first, wait for it to be approved and executed, then use the contactId it produced. | |
| lineItems | Yes | ||
| reference | No | Free-text reference shown on the credit note. Per Xero, this is only used for ACCRECCREDIT - omit it for an ACCPAYCREDIT (there, the credit note's own auto-assigned number is what shows as its reference instead). | |
| organisation | No | The 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. | |
| lineAmountTypes | No | How to read every unitAmount below. "Exclusive" (the default) = the amounts do NOT include tax and Xero adds it on top - this is what "$1,500 plus GST" means. "Inclusive" = the amounts ALREADY include tax and Xero works the tax out of them - this is what "$1,500 including GST", "$1,500 inc GST" or "$1,500 all up" means. "NoTax" = no tax is calculated at all. If the user says which one they mean, say so here rather than adjusting the numbers yourself. | Exclusive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations (readOnlyHint:false, openWorldHint:true, idempotentHint:false, destructiveHint:false) by disclosing the asynchronous approval workflow, the fact that it never touches Xero on its own, the draft-only outcome after approval, currency validation refusal, and the exact handling of lineAmountTypes and ambiguous dates. It also explains that the tool cannot approve changes itself and tells the agent how to communicate this to the user. These are critical behavioral traits not inferable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: it is front-loaded with the most critical caveat ('does NOT create anything in Xero itself'), then organized into clear thematic blocks (approval, contacts, currency, lineAmountTypes, dates). The length is justified by the tool's complexity and the high risk of user misunderstanding, but it could be tightened by removing some redundancies with the schema, such as repeating the date pattern warning already present in the parameter description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, no output schema, critical safety implications), the description is complete: it covers the full workflow (contact prerequisite, proposal, human approval in Invio, draft-only result), provides all necessary parameter semantics, explains response fields (approvalUrl), and addresses edge cases like ambiguous dates and currency validation. An agent can invoke this tool correctly and communicate its behavior to the user without any missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema already provides detailed descriptions for most parameters (88% coverage), the tool description adds substantial additional meaning: it explains the DATES rules for converting user input, warns about ambiguous bare numeric dates and how to read them in this organisation's region, details the currency check against configured currencies, and clarifies lineAmountTypes with concrete examples ('Inclusive' for 'including GST'). It also provides workflow semantics for contactId (must come from list_xero_contacts and create_xero_contact if needed). This far exceeds the schema's information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Proposes creating a new credit note in this Xero organisation' and immediately clarifies the crucial nuance that it does NOT actually create anything in Xero—it queues a pending change. It clearly distinguishes itself from siblings like create_xero_invoice and approve_xero_pending_change by describing the proposal workflow and prerequisite contact creation, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus alternatives: contactId must come from list_xero_contacts, create_xero_contact should be used first if the contact doesn't exist, and approval is required via Invio (with the approvalUrl in the response). It also includes guidance on currency handling, lineAmountTypes interpretation, and date conversion rules, including a clear directive to confirm ambiguous bare numeric dates with the user. These are precise usage conditions, not just vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_invoicecreate_xero_invoiceAInspect
Proposes creating a new invoice in this Xero organisation - it does NOT create anything in 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 (contact, line items, total) and that it needs their approval in Invio before it goes anywhere - do not describe it as done, sent, or created. contactId must come from list_xero_contacts (never invented); if the contact doesn't exist yet, propose it with create_xero_contact first and wait for that to be approved and executed. Once a human approves it in Invio, it is created in Xero in the state you asked for (status) - or, if you say nothing, AUTHORISED: approved and ready to send, with nothing left for anyone to fill in. That is what an ordinary invoicing request means, and approving the change in Invio is already the approval - do not pass status "DRAFT" out of caution, that only makes the user approve the same invoice again by hand in Xero. Pass status "DRAFT" only when the user actually says they want to check or edit it in Xero first. Either way, THIS CONNECTOR NEVER EMAILS THE INVOICE TO THE CUSTOMER - sending it is a separate action a person takes inside Xero, and you have no tool for it, so never tell a user their customer has been sent anything. You CAN state a currency (currency, e.g. "NZD") when the user names one - it is checked against the organisation's own configured currencies, and refused with the real list if it is not one of them, so a currency is never silently swapped for the base currency. You CAN also say whether the amounts include tax (lineAmountTypes): use "Inclusive" for "$1,500 including GST", "Exclusive" (the default) for "$1,500 plus GST", "NoTax" for no tax at all. Never adjust the numbers yourself to fake either one. DATES: date and dueDate are 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 an invoice 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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Invoice date, YYYY-MM-DD. 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. | |
| type | Yes | ACCREC = a sales invoice (money owed TO this business by the contact). ACCPAY = a bill (money this business owes the contact). | |
| status | No | What state the invoice lands in inside Xero once a human approves this in Invio. Defaults to "AUTHORISED" - approved and ready for them to send from Xero, with nothing left to fill in - because approving this change in Invio is already the approval, and that is what an ordinary "invoice this customer" request means. Do not leave this as "DRAFT" out of caution: doing so makes the user approve the same invoice a second time, by hand, in Xero. Pass "DRAFT" only when the user actually says they want to check or edit it in Xero first - it then lands unapproved and they have to approve it there too. Either way this connector never emails the invoice to the customer; that stays a deliberate action a person takes in Xero. | AUTHORISED |
| dueDate | No | Due date, YYYY-MM-DD. Set it whenever the user says one ("due in 30 days", "by the end of the month"). Omit it and this connector derives one from the organisation's own default payment terms in Xero and tells you which terms it used - but an organisation that has set no default terms cannot have one derived, and you will be told that too, in which case ask the user for a due date rather than leaving it blank. 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. | |
| currency | No | The currency this invoice is raised in, e.g. "NZD". Set this whenever the user names a currency or a currency symbol ("NZ$1,500", "invoice them in USD") - it is checked against the currencies this organisation is actually set up to invoice in, and the draft is refused, with the real list, if it is not one of them. Omit it only when the user did not say: the invoice is then raised in the organisation's own base currency. | |
| contactId | Yes | The Xero contact this invoice is for. Get this from list_xero_contacts first - never invent one. If the contact doesn't exist in Xero yet, use create_xero_contact first, wait for it to be approved and executed, then use the contactId it produced. | |
| lineItems | Yes | ||
| reference | No | Free-text reference shown on the invoice (e.g. a PO number). | |
| organisation | No | The 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. | |
| lineAmountTypes | No | How to read every unitAmount below. "Exclusive" (the default) = the amounts do NOT include tax and Xero adds it on top - this is what "$1,500 plus GST" means. "Inclusive" = the amounts ALREADY include tax and Xero works the tax out of them - this is what "$1,500 including GST", "$1,500 inc GST" or "$1,500 all up" means. "NoTax" = no tax is calculated at all. If the user says which one they mean, say so here rather than adjusting the numbers yourself. | Exclusive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, providing minimal behavioral signal. The description compensates heavily: it discloses that the tool only proposes a pending change requiring human approval, that it never emails the invoice, that currency is validated against org config, and that date interpretation follows a specific rule. This is far beyond what annotations offer, and there is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (over 600 words) but highly structured and each section addresses a real pitfall. It front-loads the core purpose and then systematically covers contact, status, currency, tax, and dates. However, there is some redundancy: the date ambiguity is repeated in the schema for both date and dueDate and also in the description's DATES section. While not wasteful, it could be trimmed slightly. The structure is clear, so it earns a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, no output schema, minimal annotations), the description is exceptionally complete. It covers the approval flow, the meaning of statuses, currency validation, tax handling, date interpretation rules, and even the behavior when default account is needed. An agent has everything required to invoke the tool correctly, including how to phrase responses to the user.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite schema coverage at 90%, the description adds substantial meaning beyond the schema descriptions. For date, it explains the ambiguous bare numeric date rule and how to handle it. For status, it explains the default and why DRAFT should be avoided unless explicitly requested. For currency and lineAmountTypes, it gives concrete examples and clarifies the semantics. This significantly aids correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement: 'Proposes creating a new invoice in this Xero organisation - it does NOT create anything in Xero itself, and never will on its own.' This clearly defines the verb, resource, and the crucial distinction from a direct create. It also implicitly differentiates from sibling tools like create_xero_credit_note and create_xero_quote by naming the invoice and its approval flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: it instructs that contactId must come from list_xero_contacts, tells to use create_xero_contact first if needed, explains when to pass status DRAFT vs AUTHORISED, and clarifies that sending is a separate action with no tool. It also mentions alternatives like list_xero_contacts for getting IDs. No ambiguity is left.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_leave_applicationcreate_xero_leave_applicationAInspect
Proposes a DRAFT leave application for one employee/period, for Australian, New Zealand or United Kingdom organisations - 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. employeeId must come from list_xero_payroll_employees (never invented), and must currently be ACTIVE - this refuses plainly for a terminated employee. leaveTypeId must come from list_xero_payroll_leave_types (never invented) - call that tool first if you do not already have a real id for the leave type the user named. description is required (max 50 characters) and is shown to the human approver; title is an OPTIONAL, Australia-only short title, silently ignored for New Zealand/United Kingdom. Do NOT compute or pass an hours/units figure - none exists on this tool, because Xero itself works out the number of units automatically from the employee's own payroll calendar; guessing at one here would only be wrong. Once approved, the leave application is IMMEDIATELY USABLE in Xero (the same status an ordinary, already-actioned leave application carries on every region this connector serves) - unlike create_xero_timesheet/create_xero_pay_run, there is no further Xero-side draft state left for a human to review afterwards, so approving this change in Invio is the only approval this leave application ever needs.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | A short title for the leave (e.g. "Annual Leave") - AUSTRALIA ONLY. New Zealand and the United Kingdom have no separate title field at all on this operation - this is silently ignored for those two regions if given. | |
| endDate | Yes | End of the leave, YYYY-MM-DD. 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. | |
| startDate | Yes | Start of the leave, YYYY-MM-DD. 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. | |
| employeeId | Yes | Get this from list_xero_payroll_employees first - never invent one. | |
| description | Yes | A short description of the leave (e.g. "Annual leave - family holiday"), up to 50 characters. Required by Xero itself for New Zealand and the United Kingdom, and required here for Australia too, even though Xero itself does not require it there - so every leave application a human reviews names what it is for. | |
| leaveTypeId | Yes | Get this from list_xero_payroll_leave_types first - never invent one. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses the draft/pending-change workflow, the human-approval requirement, the agent's inability to approve, refusal for terminated employees, the region-specific silent ignoring of title, and immediate usability after approval. This is rich behavioral context that the annotations alone do not provide, and there is no contradiction with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but the core behavior is front-loaded and nearly every sentence carries an operational constraint. Some repetition around Xero not being touched and the approval requirement keeps it from a 5 on conciseness, but it is still highly efficient for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers nearly all non-obvious context: approval workflow, prerequisites, regional differences, and post-approval behavior, and even mentions the response's approvalUrl despite there being no output schema. However, it references a 'DATES instruction in this tool's description' that is not actually present in the provided description, leaving ambiguous-date handling slightly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds substantial meaning: employee must be ACTIVE, ids must never be invented, description is shown to the human approver, title is Australia-only, and no hours/units parameter exists. It reinforces and extends what the input schema already specifies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Proposes a DRAFT leave application for one employee/period', scoped to Australian, New Zealand, and United Kingdom organisations. It immediately clarifies the tool does not touch Xero itself, which distinguishes it from the other create_xero_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly prescribes predecessor calls: employeeId must come from list_xero_payroll_employees and leaveTypeId from list_xero_payroll_leave_types, with 'call that tool first if you do not already have a real id'. It also says not to pass an hours/units figure, and contrasts its approval lifecycle with create_xero_timesheet/create_xero_pay_run, giving clear when-to-use and when-not-to guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_manual_journalcreate_xero_manual_journalAInspect
Proposes a manual journal (a general-purpose double-entry adjustment - reallocating an expense between accounts, recording a bank fee, writing off a small balance, and similar) in this Xero organisation - it does NOT create anything in 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. Every line needs a real accountCode from list_xero_accounts - unlike an invoice line, a journal line has no default account to fall back to, so never invent one. lineAmount is SIGNED: positive = a debit, negative = a credit - this is Xero's own convention, and getting it backwards silently swaps a debit for a credit in a real ledger. Every line together must sum to exactly zero - an unbalanced entry is rejected before anything is queued, with the exact imbalance named so you can fix it. Tell the user plainly which accounts are debited and which are credited, by how much, and that it needs their approval in Invio before it goes anywhere - never describe it as posted or done. Even once approved, this only ever creates a DRAFT journal inside Xero - a human still posts it themselves from inside Xero, this connector never does that. You CAN also say whether a taxed line's amount includes tax (lineAmountTypes): use "Inclusive" for "$1,500 including GST", "Exclusive" for "$1,500 plus GST", "NoTax" for no tax at all. This only changes anything on a line that also names a taxType - a line with no taxType is unaffected either way. Omit it and Xero applies its own default for a manual journal, which this connector does not claim to know. Never adjust the amounts yourself to fake a tax treatment. 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 manual journal 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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date the journal is posted, YYYY-MM-DD. 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. | |
| lineItems | Yes | At least two lines, each with a signed lineAmount (positive = debit, negative = credit) and a real accountCode. The lineAmounts across every line must sum to exactly zero - this is checked before anything is queued, not left for Xero to reject after approval. | |
| narration | Yes | ||
| organisation | No | The 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. | |
| lineAmountTypes | No | How Xero reads every lineAmount below on any line that names a taxType. "Exclusive" = the amounts do NOT include tax and Xero adds it on top - "$1,500 plus GST". "Inclusive" = the amounts ALREADY include tax and Xero works the tax out of them - "$1,500 including GST", "$1,500 inc GST", "$1,500 all up". "NoTax" = no tax is calculated on any line. Set this whenever the entry has a tax dimension at all (a GST or VAT correction, a BAS adjustment, reallocating a tax-coded expense) and say which one you used. Omit it only for an entry with no tax in it, where Xero applies its own default. Never adjust the amounts yourself to fake a tax treatment, and never assume a bare "$1,500" is one or the other - ask if the user did not say. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations only saying readOnlyHint=false and openWorldHint=true, the description discloses an exceptional amount of behavior: it queues a pending change requiring human approval (the agent cannot approve), rejection of unbalanced entries before queueing, that even approved entries only become DRAFT journals in Xero, and the signed-debit/credit convention with its silent-failure risk. All of this is beyond what the annotations convey and none of it contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most critical facts (propose-not-create, approval workflow) and every block earns its place operationally, but it is notably verbose — the date section and repeated warnings about the zero-sum and tax rules overlap with the schema, which already states the sign convention, accountCode requirement, and balancing check. It reads more like an operational playbook than a lean tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, side-effecting tool with no output schema, the description covers the approvalUrl response field, failure modes (imbalance rejection with the imbalance named), the draft-only outcome post-approval, and user-communication obligations. Minor gaps: no description of other response fields (e.g., pending-change ID) and no error-format detail beyond the imbalance case, but nothing an agent needs to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 80% schema coverage the baseline is 3, and the description adds real value on top: the DATES section gives a decision procedure for ambiguous bare numeric dates including the day-first country rule and the requirement to state the interpretation aloud; lineAmountTypes gets when-to-set/omit guidance and explicit prohibitions ('Never adjust the amounts yourself to fake a tax treatment'); lineAmount's sign convention is reinforced with the consequence of reversal. This goes beyond the schema's phrasing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Proposes a manual journal') with concrete use-case examples (reallocating an expense, bank fee, writing off a balance), and immediately draws the critical distinction from siblings by clarifying it does NOT create anything in Xero. The 'proposes' vs 'create' framing cleanly separates it from create_xero_invoice, create_xero_credit_note, and the approve/reject_pending_change tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use context via the general-purpose adjustment examples, and explicitly contrasts with a sibling ('unlike an invoice line, a journal line has no default account'), plus names list_xero_accounts as a prerequisite. However, it never systematically states when to prefer a sibling (e.g., invoice for billing customers) — the when-not is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_paymentcreate_xero_paymentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date 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. | |
| amount | Yes | How 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. | |
| currency | No | The 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. | |
| invoiceId | Yes | The 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). | |
| reference | No | Free-text reference for the payment (e.g. "Direct debit", a bank reference). | |
| accountCode | No | This 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. | |
| organisation | No | The 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. | |
| bankAccountName | No | This 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. |
TDQS
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.
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.
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.
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.
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.
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.
create_xero_pay_runcreate_xero_pay_runAInspect
Proposes a DRAFT pay run for one payroll calendar, for Australian or New Zealand organisations - it does NOT touch Xero itself, and never will on its own. Refuses plainly for the United Kingdom: Xero's own Payroll API documents no way to create a pay run there at all (only reading existing ones and creating pay run CALENDARS) - a United Kingdom pay run is generated inside Xero itself, from the pay calendar, and a human needs to open Payroll in Xero directly to start one. 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. payrollCalendarId must come from list_xero_payroll_employees (any employee on that calendar) - never invented. Xero itself computes the period start/end and payment date from the calendar, so none of those are asked for here. The created pay run starts as a Xero-side DRAFT once approved - a human remains free to review it, check the totals, and only later use post_xero_pay_run (a SEPARATE, irreversible step, Australia only) to actually pay it - this tool never posts anything itself.
| Name | Required | Description | Default |
|---|---|---|---|
| organisation | No | The 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. | |
| payrollCalendarId | Yes | Get this from any employee on that calendar via list_xero_payroll_employees. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: the tool only queues a pending change, requires human approval via approvalUrl, never touches Xero itself, and produces a Xero-side DRAFT. This richly supplements readOnlyHint=false, openWorldHint=true, idempotentHint=false, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and contains valuable details, but it is somewhat repetitive around the theme of not touching Xero ('does NOT touch Xero itself', 'before Xero is touched at all', 'never posts anything itself'). Still, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description is remarkably complete: it covers geographic restrictions, the approval workflow, the approvalUrl field, the eventual DRAFT state, and the separation from post_xero_pay_run. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaningful context by explaining that payrollCalendarId must be sourced from list_xero_payroll_employees and never invented, and why period start/end and payment date parameters are absent. The organisation parameter's optionality is also clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Proposes a DRAFT pay run for one payroll calendar'), a geographic scope, and explicitly contrasts itself with post_xero_pay_run. It is unambiguous about what the tool does and does not do, making it easy to distinguish from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: Australian or New Zealand organisations, not the United Kingdom, and not as a posting step. It names post_xero_pay_run as the irreversible final step and even references list_xero_payroll_employees as the source for payrollCalendarId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_quotecreate_xero_quoteAInspect
Proposes creating a new quote in this Xero organisation - it does NOT create anything in 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 (contact, line items, total) and that it needs their approval in Invio before it goes anywhere - do not describe it as created, sent, or delivered. contactId must come from list_xero_contacts (never invented); if the contact doesn't exist yet, propose it with create_xero_contact first and wait for that to be approved and executed. Even once approved, Xero's "SENT" status is only an internal label - this connector has no way to email or deliver the quote to the customer at any status, and never will on its own; a human still shares it from within Xero itself, or another channel, whenever they choose to. You CAN state a currency (currency, e.g. "NZD") when the user names one - it is checked against the organisation's own configured currencies, and refused with the real list if it is not one of them, so a currency is never silently swapped for the base currency. You CAN also say whether the amounts include tax (lineAmountTypes): use "INCLUSIVE" for "$1,500 including GST", "EXCLUSIVE" (the default) for "$1,500 plus GST", "NOTAX" for no tax at all. Never adjust the numbers yourself to fake either one. You CAN also set a quoteNumber, reference, expiryDate, title, summary or terms whenever the user gives you one - every one of them is optional and Xero fills in its own sensible default (an auto-assigned number, no expiry, blank text) when omitted. DATES: date and expiryDate are 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 quote 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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date the quote was issued, YYYY-MM-DD. 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. | |
| terms | No | Terms and conditions text shown on the quote. | |
| title | No | A short title for the quote (e.g. "Kitchen renovation"), shown at the top of it. | |
| status | No | What state the quote lands in inside Xero once a human approves this in Invio. Defaults to "DRAFT". Xero also documents "SENT" as directly creatable, but SENT is only Xero's own internal status label - choosing it does NOT email or deliver the quote to the contact, and this connector has no way to do that at any status. Only pass "SENT" when the user explicitly wants the quote marked that way in Xero (e.g. because they already shared it some other way); otherwise leave this as the default. | DRAFT |
| summary | No | A longer free-text summary of what the quote covers. | |
| currency | No | The currency this quote is raised in, e.g. "NZD". Set this whenever the user names a currency or a currency symbol ("NZ$1,500", "quote them in USD") - it is checked against the currencies this organisation is actually set up to invoice in, and the draft is refused, with the real list, if it is not one of them. Omit it only when the user did not say: the quote is then raised in the organisation's own base currency. | |
| contactId | Yes | The Xero contact this quote is for. Get this from list_xero_contacts first - never invent one. If the contact does not exist in Xero yet, use create_xero_contact first, wait for it to be approved and executed, then use the contactId it produced. | |
| lineItems | Yes | ||
| reference | No | Free-text reference shown on the quote. | |
| expiryDate | No | Date this quote expires, YYYY-MM-DD. Set it whenever the user says one ("valid for 30 days", "expires end of month"). 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. | |
| quoteNumber | No | A specific quote number to use, if the user names one. Omit this and Xero assigns the next number in its own sequence automatically - that is the right choice unless the user explicitly asks for a particular number. | |
| organisation | No | The 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. | |
| lineAmountTypes | No | How to read every unitAmount below. "EXCLUSIVE" (the default) = the amounts do NOT include tax and Xero adds it on top - this is what "$1,500 plus GST" means. "INCLUSIVE" = the amounts ALREADY include tax and Xero works the tax out of them - this is what "$1,500 including GST", "$1,500 inc GST" or "$1,500 all up" means. "NOTAX" = no tax is calculated at all. If the user says which one they mean, say so here rather than adjusting the numbers yourself. | EXCLUSIVE |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only broad hints (readOnlyHint false, openWorldHint true), so the description carries the full burden. It discloses the pending-approval queue, that a human must approve before Xero is touched, that the agent cannot approve it, that no email/delivery is ever possible, and that currency is validated against the organisation's configured list. This is exceptionally transparent behavior disclosure beyond what annotations could express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but its length is earned by the tool's complexity and safety-critical approval model. It is front-loaded with the most important caveat (does NOT create in Xero). There is some repetition around 'no way to email/deliver' and 'do not describe as created/sent/delivered,' which is arguably justified for safety but prevents a perfect conciseness score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no output schema, the description covers everything an agent needs: the pending-change workflow, the approvalUrl field in the response, the required contact lookup flow, date parsing rules, status semantics, and optional field defaults. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema description coverage is 92%, the description adds substantial meaning beyond the schema: it explains bare numeric date ambiguity with the day-first convention, gives concrete examples for lineAmountTypes ('$1,500 plus GST'), clarifies currency validation behavior, and states what Xero defaults apply when optional fields are omitted. This is far more than a minimum-viable complement to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it 'Proposes creating a new quote in this Xero organisation' and immediately clarifies it does NOT create anything in Xero itself. This clearly distinguishes it from create_xero_invoice, create_xero_credit_note, and other creation tools, while also differentiating it from get/list quote tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when and how guidance: it names list_xero_contacts as the source for contactId, instructs using create_xero_contact first if the contact doesn't exist, and explains when 'SENT' status is appropriate versus the default. It also tells the agent what to tell the user and what not to claim, leaving no ambiguity about the approval-gated workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xero_timesheetcreate_xero_timesheetAInspect
Proposes a DRAFT timesheet for one employee/period, for Australian, New Zealand or United Kingdom organisations - 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. employeeId and payrollCalendarId must both come from list_xero_payroll_employees (never invented) - use that SAME employee's own payrollCalendarId field. lines is date-keyed: one entry per day actually worked, each naming an earningsRateId and how many hours. For Australia, use that SAME employee's own ordinaryEarningsRateId (from list_xero_payroll_employees) unless the user names a different rate. For New Zealand and the United Kingdom, an employee record carries no earnings rate of its own - call list_xero_payroll_earnings_rates first and use the RegularEarnings-type rate unless the user names a different one. For New Zealand and the United Kingdom, startDate/endDate must span the employee's WHOLE payroll-calendar period (e.g. Monday to Sunday on a weekly calendar), not just the days actually worked - a shorter period was refused live even though every line inside it was valid; days with no hours simply carry no line (observed live 12 September 2026, not stated in Xero's own spec). The created timesheet starts as a Xero-side DRAFT once approved - a human remains free to review or change it inside Xero afterwards, unlike post_xero_pay_run. This tool cannot say whether Xero will accept the earnings rate or the calendar for this employee - a mismatch is refused, cleanly, only once a human approves.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | One entry per day actually worked - omit days with no hours rather than including a zero. | |
| endDate | Yes | End of the timesheet period, YYYY-MM-DD. 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. For New Zealand and the United Kingdom, this period must span the employee's WHOLE payroll-calendar period (for example, Monday to Sunday on a weekly calendar), not just the days actually worked - a shorter period was refused live even though every line inside it was valid. Days with no hours simply carry no line at all; the period itself still has to cover the full calendar cycle. Observed live 12 September 2026, not stated in Xero's own API specification. | |
| startDate | Yes | Start of the timesheet period, YYYY-MM-DD (AU: exactly 7 days including endDate). 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. For New Zealand and the United Kingdom, this period must span the employee's WHOLE payroll-calendar period (for example, Monday to Sunday on a weekly calendar), not just the days actually worked - a shorter period was refused live even though every line inside it was valid. Days with no hours simply carry no line at all; the period itself still has to cover the full calendar cycle. Observed live 12 September 2026, not stated in Xero's own API specification. | |
| employeeId | Yes | Get this from list_xero_payroll_employees first - never invent one. | |
| organisation | No | The 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. | |
| payrollCalendarId | Yes | Get this from the SAME employee's own payrollCalendarId field on list_xero_payroll_employees - never invent one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses that the tool queues a pending change, never touches Xero itself, cannot be self-approved, results in a Xero-side DRAFT, and that mismatches are refused only after human approval. It even documents an observed live failure (shorter NZ/UK period) that is not in Xero's spec. This is exceptional behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but almost every sentence carries a critical instruction or constraint, and key information is front-loaded in the first sentence. Some repetition exists between the description and the property-level schema descriptions (notably the NZ/UK whole-period rule and date ambiguity), which slightly reduces conciseness but does not undermine usefulness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, no output schema, and a nuanced approval flow, the description covers everything an agent needs: parameter provenance, regional differences, the draft/approval lifecycle, the approvalUrl pointer, and what can go wrong. The absence of an output schema is compensated by explaining the key response element (approvalUrl) and the resulting Xero-side state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description still adds substantial meaning: the source of employeeId/payrollCalendarId, the requirement to use the SAME employee's payrollCalendarId, the AU ordinaryEarningsRateId rule, the NZ/UK earnings-rate lookup path, and the whole-period startDate/endDate requirement. It also flags ambiguous date interpretation, going well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Proposes a DRAFT timesheet for one employee/period'), names the exact resource, and scopes it to Australian, New Zealand or United Kingdom organisations. It also makes explicit what the tool does NOT do ('does NOT touch Xero itself') and contrasts itself with post_xero_pay_run, making it clearly distinguishable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong contextual guidance: it names required prerequisite calls (list_xero_payroll_employees, list_xero_payroll_earnings_rates for NZ/UK), explains that a human must approve via the approvalUrl, and contrasts with post_xero_pay_run. It does not provide an explicit when-to-use vs. every sibling alternative, but the context is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_balance_sheetget_xero_balance_sheetARead-onlyInspect
Balance Sheet report from Xero for the current organisation, as at a date. Read-only. columns gives the as-at period label(s); rows are flattened from Xero's nested section layout (section names the enclosing group, e.g. "Assets" or "Liabilities"; rowType "SummaryRow" marks a subtotal/total, not a line item). currency comes from this organisation's own Xero settings, never assumed - state it whenever relaying a figure from this report. If date was supplied, Xero reports the balance sheet as at the END OF THAT MONTH, not the exact day given - say "as at [end of month]", not the literal date requested. This organisation's financial year is NOT necessarily the calendar year (added 11 September 2026 - see lib/xero/financial-year.ts). financialYear in the result names the organisation's real financial year end and its exact current/previous dates, or says the year end is unknown. Never answer "this financial year", "last financial year", or "year to date" from the calendar year or the organisation's country - use financialYear's current.toDate (or previous.toDate) as date, and state the period you actually used when relaying a figure.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | As-at date, YYYY-MM-DD. Xero reports this as at the END of the month containing this date, not the exact day. Omit for today. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint annotation by explaining the flattened row structure, the meaning of SummaryRow, the organisation-specific currency behavior, the end-of-month reporting quirk, and the non-calendar financial-year caveat. This is rich behavioral disclosure that protects an agent from subtle misreporting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense, and every major sentence adds operational value. It is front-loaded with purpose and safety, followed by output semantics and date/financial-year caveats. A few phrases, like the implementation-file reference, could be trimmed, but there is no real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates thoroughly by explaining result fields (columns, rows, rowType, currency, financialYear) and how to interpret them. It also addresses the most likely misunderstanding—calendar-year assumptions—making the tool safe to invoke and interpret without further probing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds critical parameter meaning: date is interpreted as end-of-month, omitting date means today, and organisation is needed only for multi-organisation connections. It also connects the financialYear result field to parameter selection, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement: 'Balance Sheet report from Xero for the current organisation, as at a date.' It names the specific resource, the verb, and the temporal scope, and clearly distinguishes it from sibling financial-report tools like get_xero_profit_and_loss.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when a balance sheet is requested as at a date) and clarifies its read-only nature, but it does not explicitly contrast it with alternative report tools or state when-not-to-use. There is useful operational guidance, but no explicit sibling-routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_credit_noteget_xero_credit_noteARead-onlyInspect
Full detail on one Xero credit note, including line items - creditNoteId must be a Xero CreditNoteID (a GUID) from list_xero_credit_notes, never an Invio id. Read-only. The currency and every amount come straight from this credit note as Xero stored it - never restate them in a different currency or assume they match Invio's.
| Name | Required | Description | Default |
|---|---|---|---|
| creditNoteId | Yes | ||
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds valuable behavior: it is read-only, and it warns not to restate currency or assume amounts match Invio's. This goes beyond annotations and sets correct expectations about data fidelity. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with high information density. The core purpose is front-loaded, and the caveats about ID source and currency are concise. It is not overly long, though the dash-separated clauses could be slightly more readable, but it earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a get-by-id tool with no output schema, the description adequately covers what the agent gets (full detail, line items), how to obtain the ID, and critical data-handling warnings. It does not cover error cases or pagination, but that is less critical for a single-record retrieval. Overall it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers organisation with a description but not creditNoteId. The description compensates for creditNoteId by specifying it must be a Xero CreditNoteID (GUID) from list_xero_credit_notes, not an Invio id. This adds meaningful semantic context beyond the schema's format field. With 50% schema coverage, the description carries the missing weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Full detail on one Xero credit note, including line items'. It clearly distinguishes from sibling list_xero_credit_notes (which returns summaries) and get_xero_invoice (different document type). The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the ID must come from list_xero_credit_notes and never an Invio id, giving a clear sourcing rule. It also implies use when you need full detail (including line items) of a single credit note, which separates it from list tools. The currency warning further guides correct usage without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_group_reportget_xero_group_reportARead-onlyInspect
Profit and Loss or Balance Sheet for SEVERAL Xero organisations at once, side by side: one row per account, one column per organisation, and a Total column. Read-only. Every figure and every total is added up on Invio's server - relay the returned numbers, never add, subtract or round them yourself. THIS IS A SIDE-BY-SIDE SUM, NOT A CONSOLIDATION. Intercompany balances (loans, sales or recharges between these organisations) are NOT eliminated and are counted on both sides; accounts are matched only by exact account code, or by exact name where an account has no code - there is NO account mapping, so differently-named or differently-numbered accounts stay as separate rows; and NO currency is converted. Never call the result consolidated statements: say "combined" or "side by side", and say plainly that intercompany items are still in it. SINGLE CURRENCY ONLY: if the chosen organisations do not all report in the same base currency the call is refused and each organisation's currency is listed - tell the person, and offer to run it for the organisations that share a currency. By default it covers EVERY organisation this connector token may use within the account's plan limit (organisations outside the limit are named in warnings); pass companies - display names exactly as list_xero_organisations shows them - to choose some. A team member restricted to certain organisations only ever gets those. IF ANY ONE ORGANISATION CANNOT BE READ (access revoked, a missing report permission, a rate limit, a timeout) THE WHOLE CALL FAILS and names it, with the reason - there is NO partial total. Tell the person which organisation failed and why; only if they agree to leave it out, call again with companies naming just the others. report "profit_and_loss" takes fromDate and toDate TOGETHER (YYYY-MM-DD) or neither (Xero then gives the CURRENT calendar month) - never one alone; "balance_sheet" takes date (Xero reports it as at the END of that month, not the exact day - say "as at [end of month]") and uses only the as-at column per organisation, not Xero's prior-year comparison column. One date range is applied to every organisation, but organisations can have different financial year ends: organisationDetails[].financialYear shows each one's - for "this financial year", only use this tool if they agree, otherwise say they differ. Each row's matchedBy says how it was matched ("account_code", "account_name", "report_label" for subtotals, or "single_organisation" when only one organisation has it); values lines up with columns (organisations in order, Total last) and a null means that organisation has no figure on that row - not zero. Always state the currency and the period when relaying a figure, and report every entry in warnings and every row conflicts to the person - do not smooth them over. Where one organisation is wanted on its own, use get_xero_profit_and_loss or get_xero_balance_sheet instead. Up to 30 organisations per call.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | balance_sheet only. As-at date, YYYY-MM-DD. Xero reports the balance sheet as at the END of the month containing this date, not the exact day. Omit for today. | |
| report | Yes | Which report to add up across the organisations: "profit_and_loss" or "balance_sheet". | |
| toDate | No | profit_and_loss only. End date, YYYY-MM-DD. Supply together with fromDate, or omit both. Never alone. | |
| fromDate | No | profit_and_loss only. Start date, YYYY-MM-DD. Supply together with toDate, or omit both (Xero then uses the CURRENT calendar month). Never alone. | |
| companies | No | Which organisations to include, by display name exactly as list_xero_organisations shows them. Omit to include EVERY organisation this connector token may use within the account's plan limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/openWorld, so the description carries the rest and does so richly: server-side summation, no intercompany elimination, account matching only by exact code/name, no currency conversion, all-or-nothing failure with no partial total, plan-limit exclusions surfaced in `warnings`, and the required wording ('combined', not 'consolidated').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense block, but nearly every clause carries load-bearing behavior an agent needs. It could be broken into labeled sections (dates, currency, failure mode, output) to improve scanning, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully covers the return shape: `columns` and `values` alignment, Total last, null meaning 'no figure' rather than zero, `matchedBy` values, and the obligation to relay every `warnings` and `conflicts` entry plus the currency and period.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though schema coverage is 100%, the description adds real semantics beyond it: fromDate/toDate must be supplied together or not at all, the balance-sheet `date` is reported as at month end, `companies` must use exact display names from list_xero_organisations, and organisationDetails[].financialYear matters for one shared date range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and scope: a side-by-side P&L or Balance Sheet for several Xero organisations, one row per account, one column per organisation. It explicitly contrasts itself with siblings by naming get_xero_profit_and_loss and get_xero_balance_sheet as the single-organisation alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (multiple orgs, same base currency) and when-not (single organisation, mixed currencies, financial-year-end mismatches), plus named alternatives. It also spells out recovery behavior: only re-call with `companies` if the user agrees to drop the failing organisation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_invoiceget_xero_invoiceARead-onlyInspect
Full detail on one Xero invoice, including line items - invoiceId must be a Xero InvoiceID (a GUID) from list_xero_invoices, never an Invio invoice id. Read-only. The currency and every amount come straight from this invoice as Xero stored it - never restate them in a different currency or assume they match Invio's.
| Name | Required | Description | Default |
|---|---|---|---|
| invoiceId | Yes | ||
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses read-only behavior, consistent with readOnlyHint, and adds critical behavioral context: amounts and currency come directly from Xero and must not be converted or assumed to match Invio. This goes beyond the annotation and helps prevent incorrect downstream usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary purpose is front-loaded, and the critical ID-source constraint and currency warning are stated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-invoice retrieval tool with no output schema, the description covers the essential return content (full detail, line items) and provides necessary cautions. It is complete enough for an agent to use correctly, though it doesn't describe the exact response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes the organisation parameter but not invoiceId. The description compensates by explaining that invoiceId must be a Xero InvoiceID (GUID) from list_xero_invoices, adding meaning beyond the format field. This addresses the key parameter semantic gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns full detail on one Xero invoice, including line items. It distinguishes itself from list_xero_invoices by specifying single-invoice scope and from other get tools by the resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs that invoiceId must be a Xero InvoiceID from list_xero_invoices, not an Invio ID, which guides correct usage. It implies using this tool when full detail on one invoice is needed, though it doesn't explicitly contrast with sibling tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_leave_balancesget_xero_leave_balancesARead-onlyInspect
This organisation's employee leave balances (annual leave, personal/sick leave and any other leave types Xero has set up) - by name, in the units Xero tracks them in (usually Hours, or Dollars for some New Zealand leave types). Read-only, for Australian, New Zealand and United Kingdom organisations (this refuses plainly for any other country). Also requires Xero's own Payroll setup to be complete for the organisation, and the Xero user who connected to have held payroll administrator access at the time - if either is missing this refuses plainly rather than returning an empty list, so report that rather than implying the organisation has no payroll data. Pass employeeId to get one employee (from list_xero_payroll_employees); omit it for every active employee. For Australia that means up to 100, one page only - use employeeId for anyone beyond that. For New Zealand and the United Kingdom, "every employee" is capped at 25 (leave balances are a separate call per employee for those two regions, unlike Australia) - truncated: true on the result means more active employees exist than were fetched; say so and suggest employeeId for anyone missing rather than presenting the list as complete. Each balance carries negative: true when the employee has taken more of that leave type than they have accrued - point those out plainly, do not just report the raw number. This tool cannot say whether a leave request has been approved, paid, or reported to any tax authority - only the current balance Xero holds.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | No | One employee, by their Xero EmployeeID. Omit for every employee. | |
| organisation | No | The 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. | |
| includeInactive | No | Include terminated employees too. Omit or false for active employees only (Xero's own EmployeeStatus: ACTIVE or TERMINATED). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, but the description adds substantial behavioral context beyond that: it refuses for non-supported countries, requires payroll configuration and admin access, has per-region limits, returns `truncated: true` when more employees exist, and flags negative balances with `negative: true`. It also explicitly states what the tool cannot tell (approval/payment/tax status). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries necessary operational detail. It's front-loaded with the core purpose before diving into regional rules and edge cases. There is some redundancy (e.g., mentioning both 'read-only' and the annotation), but overall it is efficiently structured for the complexity it covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must fully explain return values and interpretation. It covers units, negative balances, truncation, and what data is not provided. It also gives the agent authoritative instructions on how to report refusals and incomplete lists. Everything an agent needs to call and interpret the tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful usage semantics: employeeId should come from list_xero_payroll_employees, omit for all employees, organisation only needed for multi-org connections, and includeInactive includes terminated employees. It also explains implications like regional caps tied to employeeId. This adds value above the schema, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource (employee leave balances), the verb (get), and the scope (by name, in Xero's tracking units). It distinguishes itself from other Xero tools by focusing on leave balances and explicitly listing what it does not do (e.g., cannot indicate approval/payment status). No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use conditions: only for AU/NZ/UK organisations, requires complete payroll setup and admin access. Gives clear guidance on parameter usage (pass employeeId for one, omit for all), regional caps (Australia 100, NZ/UK 25), and how to interpret the `truncated` flag. Also tells the agent how to respond to refusals and missing data, which is exceptional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_outstanding_receivablesget_xero_outstanding_receivablesARead-onlyInspect
Who owes this business money in Xero right now, and how much - aggregated per contact from unpaid and partially-paid sales invoices (Type ACCREC, Status AUTHORISED). Read-only. Chosen over Xero's own AgedReceivablesByContact report because that report requires naming ONE contact per call and cannot answer an organisation-wide question. Amounts are grouped by currency (a Xero organisation can invoice in more than one) - if currencies has more than one entry, report each currency total separately rather than adding them together. truncated: true means more unpaid invoices exist than this tool scanned; say so rather than presenting the totals as exhaustive. unusableAmountCount (when greater than 0) means that many AUTHORISED sales invoices had no reliable amount-due figure from Xero and were EXCLUDED from every total, count and contact below - say so too, and never treat them as paid off just because they are absent from the numbers. OVERDUE MEANS THE DUE DATE IS STRICTLY BEFORE overdueAsOf, the calendar day this call was measured against: an invoice due ON that day is NOT overdue and is not in overdueTotal, because the customer still has that whole day to pay. timeZone is the zone that day was computed in and timeZoneSource says where it came from: 'organisation' means it is the organisation's own timezone from Xero, and any other value means Xero did not give one and the day was computed in UTC instead, so an invoice due within a day of now may be classified against a date up to a day away from the organisation's own. Do not recompute overdue yourself from oldestDueDate and your own clock - your clock is not the organisation's.
| Name | Required | Description | Default |
|---|---|---|---|
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description goes far beyond them. It explains truncation (`truncated: true`), the meaning of `unusableAmountCount`, the precise definition of overdue (strictly before `overdueAsOf`, not on the day), timezone handling, and explicitly warns against recomputing overdue with the agent's own clock. This is rich behavioral disclosure that prevents misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: it covers purpose, comparative advantage, currency grouping, truncation, unusable amounts, overdue semantics, and timezone intricacies. It is front-loaded with the core purpose and structured logically, with no fluff. The density is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining return semantics. It details aggregated per contact, currency handling, truncated flag, unusableAmountCount, overdueTotal, oldestDueDate, timeZone, and timeZoneSource, plus how to present each. It even warns about not treating excluded invoices as paid. This makes the tool fully usable without further assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one optional parameter (`organisation`), and the schema description already covers it at 100%. The description does not add extra meaning to the parameter itself, but it does discuss output semantics heavily. With full schema coverage, the baseline of 3 is appropriate; the description does not need to add more for this single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: aggregates unpaid/partially-paid AUTHORISED sales invoices per contact to answer 'who owes this business money in Xero right now'. It specifies the invoice type (ACCREC) and status, and distinguishes itself from Xero's AgedReceivablesByContact report, making the purpose distinct from any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: this tool is for organisation-wide receivable questions, chosen over a per-contact report. It implicitly indicates when not to use it (if you need a single contact's aged breakdown), but it does not explicitly reference sibling tools like list_xero_invoices or get_xero_invoice. Still, the usage context is clear and useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_pay_run_summaryget_xero_pay_run_summaryARead-onlyInspect
What one pay run cost all-in, its status (DRAFT or POSTED), and a comparison against the PREVIOUS pay run of the SAME payroll calendar: each employee paid in both runs, with their net pay and net change; everyone flagged with largeChange: true when that change is 20% or more either way (this connector's own threshold, not Xero's); anyone paid in this run but not the previous one (newThisRun); anyone paid in the previous run but not this one (notPaidThisRun - could mean terminated, on unpaid leave, or simply not rostered this cycle; this tool cannot tell which). Omit payRunId for the most recent pay run. Read-only, for Australian, New Zealand and United Kingdom organisations (this refuses plainly for any other country - see list_xero_payroll_employees for the same gate). Also requires Xero's own Payroll setup to be complete for the organisation, and the Xero user who connected to have held payroll administrator access at the time - if either is missing this refuses plainly rather than returning an empty list, so report that rather than implying the organisation has no payroll data. wages/tax/super on the pay run itself are Australia only; New Zealand and the United Kingdom instead report totalCost - see list_xero_pay_runs for why. A large swing in net pay often reflects a change in hours worked, but can equally be a bonus, an allowance, leave taken or a tax change - say that it moved, not why. THIS TOOL CANNOT SAY WHETHER A PAY RUN HAS ACTUALLY BEEN PAID OUT OR REPORTED TO ANY TAX AUTHORITY (there is no ATO/IRD/HMRC filing status in any of the three regions' Payroll APIs, and never will be) - only what Xero itself has recorded for the pay run.
| Name | Required | Description | Default |
|---|---|---|---|
| payRunId | No | One pay run, by its Xero PayRunID. Omit for the most recent pay run. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint, it discloses refusal behavior for unsupported countries and missing setup, region-dependent field differences, the connector-specific 20% threshold, ambiguous notPaidThisRun semantics, and the hard limitation about paid-out/tax-filing status. Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core result is front-loaded in the first sentence, followed by the input shortcut, gates, and caveats. Although long, every sentence carries a distinct operational fact, and the capitalized limitation warning is justified by a common misinterpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return semantics, and it does so in detail: employee-level comparison fields, region-specific cost fields, refusal cases, and interpretation warnings. An agent can invoke it safely and phrase the result accurately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters at 100% coverage, so the baseline is 3. The description repeats the omit-payRunId rule but does not add new input-level meaning; its added value is concentrated in output interpretation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact deliverable: all-in cost, DRAFT/POSTED status, and comparison against the previous pay run of the same payroll calendar. Names output markers like largeChange, newThisRun, and notPaidThisRun, making it unmistakable from list_xero_pay_runs or other getters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance (omit payRunId for most recent), hard regional when-not gates (AU/NZ/UK only; refuses otherwise), and prerequisite gates (Payroll setup complete and admin access). It also instructs how to report a refused result rather than misreading it as empty data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_profit_and_lossget_xero_profit_and_lossARead-onlyInspect
Profit and Loss report from Xero for the current organisation, for a date range. Read-only. columns gives the period label(s) for the numbers in each row; rows are flattened from Xero's nested section layout (section names the enclosing group, e.g. "Income" or "Operating Expenses"; rowType "SummaryRow" marks a subtotal/total, not a line item - do not double-count a SummaryRow alongside the rows it totals). currency comes from this organisation's own Xero settings, never assumed from anything about the Invio account asking the question - state it whenever relaying a figure from this report. fromDate and toDate must be supplied TOGETHER or OMITTED TOGETHER - never just one; supplying only one is rejected rather than silently widened (see each argument's own description for why). This organisation's financial year is NOT necessarily the calendar year (added 11 September 2026 - see lib/xero/financial-year.ts). financialYear in the result names the organisation's real financial year end and its exact current/previous dates, or says the year end is unknown. Never answer "this financial year", "last financial year", or "year to date" from the calendar year or the organisation's country - use financialYear's dates as fromDate/toDate, and state the period you actually used when relaying a figure.
| Name | Required | Description | Default |
|---|---|---|---|
| toDate | No | End date, YYYY-MM-DD. Must be supplied together with fromDate, or omitted together with it - never alone, for the identical reason. Omit both to get the CURRENT calendar month. | |
| fromDate | No | Start date, YYYY-MM-DD. Must be supplied together with toDate, or omitted together with it - never alone (Xero would default toDate to the end of the CURRENT month, not the month fromDate is in). Omit both to get the CURRENT calendar month. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and open-world, and the description goes well beyond them by warning that SummaryRow totals must not be double-counted, that supplying only one date is rejected, and that currency comes from the organisation's own Xero settings. It also discloses that the financial year may not match the calendar year and explains how to derive date parameters from financialYear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence addresses a real failure mode, output nuance, or derivation rule, such as double-counting SummaryRows and deriving dates from financialYear. It is front-loaded with the core purpose and structured so that critical warnings are not buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining the result shape, and it names columns, rows, section, rowType, currency, and financialYear. It also tells the agent which period label to state when relaying figures and how to avoid calendar-year assumptions, making it complete enough for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter schema coverage is 100%, so the baseline is 3; the description adds value by explicitly stating the together-or-omit-both rule, the rejection of a single date, and the 'omit both for current calendar month' convention. It does not add new meaning for the organisation parameter beyond the schema's guidance, so 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as a Profit and Loss report from Xero for the current organisation and date range, and adds detail about the columns and rows returned. It does not explicitly contrast it with sibling report tools such as get_xero_balance_sheet, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong when-to-use context: it is a read-only report, requires paired dates or no dates, and explains the effect of omitting both dates. It does not name alternative tools or say 'use this instead of X', but the report name and read-only framing make the primary use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_projectget_xero_projectARead-onlyInspect
Full detail on one Xero Projects job, including what it has cost and what it has earned so far - projectId must be a Xero ProjectID (a GUID) from list_xero_projects, never guessed. Read-only. Covers time logged against tasks (totalTaskAmount), expenses logged (totalExpenseAmount), what has already been invoiced versus what is still to invoice (taskAmountInvoiced/taskAmountToBeInvoiced and the expense equivalents, plus the combined projectAmountInvoiced), any deposit taken and applied, and any credit notes raised against this project. Every money figure carries its own currency straight from Xero - never restate it in a different currency or assume it matches Invio's. If this call fails with an unauthorized/401-style error, it can mean this Xero organisation's plan does not include Xero Projects, or that this connection's Xero Projects access needs to be reconnected - say so rather than treating it as a generic failure.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | ||
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and the description affirms 'Read-only' without contradiction. It adds substantial behavioral context: a currency caveat (never restate or assume currency matches Invio's), error semantics for 401s (plan lacks Xero Projects or reconnect needed), and a summary of the data covered. This goes well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence carries operational value: ID sourcing, read-only confirmation, field coverage, currency rule, and error interpretation. The lead sentence front-loads the core purpose before the details. No filler or repetition of schema-restated facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description enumerates the key return fields (task/expense totals, invoiced vs to-be-invoiced, deposits, credit notes) and highlights the currency and error behaviors. Combined with the input schema and annotations, an agent has everything needed to call this correctly and interpret results. The only minor omission is a full response structure, but the detailed field listing makes that unnecessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 50% schema description coverage, the description compensates for the undocumented projectId by defining it as a Xero ProjectID GUID sourced from list_xero_projects and never guessed. The organisation parameter is already explained in the schema, so the description needn't repeat it. Together, both parameters are adequately documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: full detail on one Xero Projects job, including cost and earned amounts. The phrase 'one Xero Projects job' clearly distinguishes it from list_xero_projects and from get_xero_invoice/quote/credit_note siblings by resource type. Clear and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit source guidance for projectId (must come from list_xero_projects, never guessed) and confirms the operation is read-only. It also gives domain-specific error handling for 401s. However, it does not explicitly enumerate alternative tools or when not to use this one, though the resource distinction makes this mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xero_quoteget_xero_quoteARead-onlyInspect
Full detail on one Xero quote, including line items, title, summary and terms - quoteId must be a Xero QuoteID (a GUID) from list_xero_quotes, never an Invio id. Read-only. The currency and every amount come straight from this quote as Xero stored it - never restate them in a different currency or assume they match Invio's. A status of SENT means Xero has this quote marked as sent - it does NOT prove the quote was ever actually emailed or delivered to the contact.
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | Yes | ||
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reaffirms 'Read-only' consistently. Beyond that, it adds crucial behavioral context: amounts are exactly as stored in Xero (never convert or assume match with Invio) and status SENT does not prove actual delivery. This goes well beyond the structured annotations and prevents misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with every sentence serving a purpose. It front-loads the primary function and return contents, then follows with crucial usage caveats and data interpretation notes. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one required parameter, no output schema, and annotations covering the read-only nature, the description covers all essential aspects: what is returned, how to obtain the correct quoteId, how to treat currency/amounts, and how to interpret status. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides a description only for the 'organisation' parameter, leaving quoteId without one (50% coverage). The description compensates by explaining that quoteId must be a Xero GUID from list_xero_quotes, not an Invio id, adding essential semantic meaning beyond the schema's format hint. It does not add details for organisation, but the schema already covers it adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('get') and resource ('Xero quote') and enumerates the returned contents (line items, title, summary, terms). It clearly distinguishes itself from list_xero_quotes by focusing on a single quote's full detail, and is easily differentiated from sibling get_* tools by naming the specific entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs that quoteId must be a Xero QuoteID from list_xero_quotes and never an Invio id, giving a clear prerequisite and source. It also warns about currency/amount assumptions and the meaning of status SENT, which are important for correct usage. It does not explicitly name alternative tools for other purposes, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pending_changeslist_pending_changesARead-onlyInspect
Lists the changes YOU (or another assistant on this account) have proposed against Xero - across every organisation this token may reach, not just the current one. Read-only; nothing is created or changed. Three groups: "pending" rows are still awaiting approval or rejection; "needsAttention" rows are not (a write that failed, or one stuck mid-execution) but are worth mentioning because something the person authorised did not visibly happen; "history" is the most recent already-resolved rows (approved-but-not-yet-sent, sent, rejected, expired, or cancelled) - use it to answer "what happened to the thing I approved last week" rather than telling the user to go check Xero. A row whose approval window has simply run out is reported here too, as status "expired" - Invio moves it into history on its own within about an hour, and this tool already reports it that way immediately, before that background sweep gets to it; it never counts as still "pending" and never counts toward maxOpenPendingChanges below. A failed or stranded row in needsAttention/history carries errorMessage/errorCode explaining why, and a sent one carries result with the id/number Xero assigned. Every row carries approvalUrl - the same link a draft-creating tool's own result carries - point the user at it rather than inventing a path. Use this when asked "what am I waiting to approve" or "what happened to X", after drafting several changes in one conversation to summarise what is now queued, or before drafting another change against the same invoice/contact to check whether an earlier one is still unresolved. If truncated is true, more pending/needsAttention changes matched than were returned - say so rather than presenting the two lists as everything waiting, and suggest approving or rejecting some before asking again. maxOpenPendingChanges is the most "pending" changes this account may have open at once before drafting a new one is refused - if pending.length is getting close to it, mention that to the user before it becomes a failed draft.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses rich behavioral details: the three groups' semantics, the 'expired' status and its immediate reporting before the background sweep, the presence of errorMessage/errorCode on failed rows, the result field on sent rows, and the approvalUrl linkage. It also explains truncation behavior and the maxOpenPendingChanges constraint. This far exceeds what annotations provide and fully informs the agent of side effects and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~200 words) but every sentence carries essential information given the tool's complexity (three groups, special statuses, truncation, quota). It is structured logically: purpose, group definitions, special cases, usage guidance, and actionable notes. No fluff; each sentence earns its place. For a zero-parameter tool that returns complex data, this is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the full burden of explaining the tool's behavior. It covers the three return groups, the meaning of fields like errorMessage, result, and approvalUrl, the expiration handling, truncation semantics, and the pending-changes quota. It leaves nothing an agent needs to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters (input schema is empty), so the baseline is 4. The description doesn't need to add parameter semantics, but it does clarify the output structure (groups, fields, statuses) which indirectly helps understand what the tool returns. Since there are no parameters, no additional value is required, and the description appropriately omits parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('lists') and resource ('changes YOU (or another assistant) have proposed against Xero'), and explicitly defines three output groups (pending, needsAttention, history). It distinguishes itself from sibling tools like approve_xero_pending_change and the creation tools by focusing on listing proposed changes across all organisations. The inclusion of 'across every organisation this token may reach' adds a precise scope that leaves no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use conditions: 'Use this when asked "what am I waiting to approve" or "what happened to X", after drafting several changes in one conversation to summarise what is now queued, or before drafting another change against the same invoice/contact to check whether an earlier one is still unresolved.' It also gives a negative directive: avoid telling the user to check Xero for history, since this tool covers it. This is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_accountslist_xero_accountsARead-onlyInspect
This organisation's chart of accounts from Xero. Read-only; nothing is created or changed. Some accounts, most often a bank account, have code: null - Xero genuinely has no code for them; use that account's exact name instead wherever a tool accepts one (create_xero_payment's own bankAccountName), never invent a code for it. Use this BEFORE proposing an accountCode on a create_xero_invoice or update_xero_invoice line item - accountCode must be a real code from this list, never invented or guessed (an invented code is rejected before you can even propose the change). If none obviously fits, omit accountCode entirely: for a DRAFT invoice a human fills it in later in Xero; for an AUTHORISED invoice (the default), this connector fills in the organisation's own single active default account automatically when there is exactly one, or asks you to choose from this list when there is more than one. taxType here is each account's OWN default tax type - a useful hint, but not the exhaustive list of every tax rate this organisation has configured, so a line item is free to use a different valid one; if unsure, omit taxType too. Prefer accounts with status ACTIVE for a new line item - an ARCHIVED code still exists but Xero may refuse to post to it, and on an AUTHORISED invoice this connector refuses one outright rather than risk that.
| Name | Required | Description | Default |
|---|---|---|---|
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses crucial behaviors: accounts with `code: null` genuinely lack a code and must be referenced by exact name, invented codes are rejected before proposal, and the connector has distinct fallback behaviors for authorising invoices. It also clarifies that taxType is only a hint and that archived accounts may be refused, all of which add significant non-obvious context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence earns its place by introducing a distinct caveat or rule needed for correct usage. It is front-loaded with the core purpose and read-only note, then progressively covers edge cases. Slight redundancy with the annotation's read-only statement and occasional wordiness prevent a perfect score, but the structure is clear and logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with one optional parameter and no output schema, the description is exceptionally complete. It covers how to handle null codes, how to use the results with invoice tools, when to omit accountCode, the taxType hint, and ACTIVE status preference. Everything an agent needs to call this tool correctly and integrate its output into downstream steps is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional `organisation` parameter is fully documented in the schema (100% coverage), and the description does not add any additional meaning about it beyond the schema. The description's 'This organisation's' wording implicitly references the current/default organisation, but the schema already explains when the parameter is needed, so the description provides no extra value here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as 'This organisation's chart of accounts from Xero' and states the action explicitly as listing, with a specific read-only qualifier. It distinguishes itself from sibling create/update tools by emphasizing it is the source of truth for real account codes, and the title itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use instructions: 'Use this BEFORE proposing an accountCode on a create_xero_invoice or update_xero_invoice line item,' and details what to do when no account fits, including omitting accountCode and letting the connector fill defaults. It also provides concrete alternatives for draft vs authorised invoices and warns about archived accounts, leaving no ambiguity about when to prefer this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_contactslist_xero_contactsARead-onlyInspect
List contacts (customers and/or suppliers) from Xero for the current organisation. Read-only; nothing is created or changed. Where present, accountsReceivableOutstanding/Overdue come straight from Xero for that contact - never sum these yourself across contacts to answer "who owes me the most", use get_xero_outstanding_receivables instead, which already aggregates that correctly (including across pages and currencies). status is this contact's own Xero status - "ACTIVE" or "ARCHIVED" - relayed as Xero has it, never filtered out; mention it if relevant (e.g. before suggesting this contact for a new invoice or contact update) rather than assuming every listed contact is currently usable.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Omit for page 1. | |
| organisation | No | The 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. | |
| includeArchived | No | Include archived contacts. Defaults to false (active contacts only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses unique behavioral traits: accountsReceivableOutstanding/Overdue are passed through from Xero and must not be summed across contacts, and status is relayed unfiltered so archived contacts may appear. This helps the agent avoid a real data-integrity mistake and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then gives two important caveats, each substantive. It is somewhat long and the 'Read-only; nothing is created or changed' sentence is redundant with the readOnlyHint annotation, but the remaining content is dense and worth including.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description covers the main invocation hazards: receivables fields need no aggregation, status may be ARCHIVED, and the correct sibling exists for aggregates. It does not spell out the full response shape or this tool's own pagination behavior, but it gives enough for correct use alongside the well-covered schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3: all three parameters already have clear descriptions in the schema. The prose adds context about the organisation and contact status but does not add new parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('contacts (customers and/or suppliers) from Xero'), and scopes it to the current organisation. It is clearly distinguishable from sibling tools like list_xero_accounts or get_xero_outstanding_receivables because it names the resource and primary purpose directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly warns against using this tool to answer 'who owes me the most' and directs the agent to get_xero_outstanding_receivables instead. It also gives context-level guidance: surface the contact's Xero status before suggesting the contact for invoices or updates. This is concrete when-not and alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_credit_noteslist_xero_credit_notesARead-onlyInspect
List credit notes from Xero for the current organisation - ACCRECCREDIT (against a sales invoice, reduces what a customer owes) or ACCPAYCREDIT (against a bill, reduces what this business owes a supplier), optionally filtered by status, by issue date range (fromDate/toDate, both inclusive), and by reference (exact match with reference, or a partial case-insensitive match with referenceContains - use exactly one, never both). Read-only; nothing is created or changed. Each credit note carries its OWN currency straight from Xero - never assume it matches this user's Invio business currency. Returns up to 100 credit notes for the requested page; if pageCount shows more pages than were returned, say so rather than implying this is the full list. remainingCredit is how much of each credit note has NOT yet been applied against an invoice or refunded. The result always echoes back exactly which filters were applied (appliedFilters) - relay that, not just your own memory of what you asked for. Use get_xero_credit_note for full line-item detail on one credit note.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number - Xero returns up to 100 credit notes per page. Omit for page 1. | |
| type | No | ACCRECCREDIT = credit notes against sales invoices. ACCPAYCREDIT = credit notes against bills. Omit for both. | |
| status | No | Filter to one Xero credit note status (e.g. AUTHORISED, PAID). Omit for every status. | |
| toDate | No | Only include records dated ON OR BEFORE this issue date, YYYY-MM-DD (inclusive - this IS the last date included, not the day after). | |
| fromDate | No | Only include records dated ON OR AFTER this issue date, YYYY-MM-DD (inclusive). Filters on the issue Date, never the due date. | |
| reference | No | Exact match on the Reference field. Use this when you know the reference verbatim - cannot be combined with referenceContains. | |
| organisation | No | The 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. | |
| referenceContains | No | Case-insensitive PARTIAL match on the Reference field (e.g. "1234" matches a reference containing "PO-1234"). Use this when you only know part of the reference. Cannot be combined with reference - if you know the exact text, use reference instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds substantial behavioral detail: pagination limits and pageCount honesty, per-credit-note currency independence, remainingCredit semantics, and the appliedFilters echo requirement. These are exactly the non-obvious behaviors an agent needs to avoid incorrect assumptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence carries operational value, and the most important scoping and behavioral warnings are front-loaded. The only minor redundancy is restating read-only behavior already present in annotations, but this does not significantly bloat the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining key response concepts: page size, pageCount, remainingCredit, appliedFilters, and currency. It also covers filter semantics and points to the sibling tool for deeper detail. An agent has enough context to call this correctly and interpret the result responsibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning beyond the schema: it explains inclusive date boundaries, the exact-match vs partial-match distinction between reference and referenceContains, the 'use exactly one, never both' rule, and the practical meaning of ACCRECCREDIT vs ACCPAYCREDIT. This materially improves correct parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List credit notes from Xero') and immediately clarifies the two credit-note types. It also distinguishes itself from get_xero_credit_note by pointing to that tool for full line-item detail, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: optional filters, read-only behavior, and an explicit pointer to get_xero_credit_note when full line-item detail is needed. It does not explicitly enumerate when not to use this tool versus create_xero_credit_note, but the read-only statement and sibling context make the boundary clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_invoiceslist_xero_invoicesARead-onlyInspect
List invoices from Xero for the current organisation - sales invoices (ACCREC) or bills (ACCPAY), optionally filtered by status, by issue date range (fromDate/toDate, both inclusive), and by reference (exact match with reference, or a partial case-insensitive match with referenceContains - use exactly one, never both). Read-only; nothing is created, sent or changed. Each invoice carries its OWN currency straight from Xero - never assume it matches this user's Invio business currency. Returns up to 100 invoices for the requested page; if pageCount shows more pages than were returned, say so rather than implying this is the full list. The result always echoes back exactly which filters were applied (appliedFilters) - relay that, not just your own memory of what you asked for. Use get_xero_invoice for full line-item detail on one invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number - Xero returns up to 100 invoices per page. Omit for page 1. | |
| type | No | ACCREC = sales invoices (money owed TO this business). ACCPAY = bills (money this business owes). Omit for both. | |
| status | No | Filter to one Xero invoice status (e.g. AUTHORISED for approved-and-unpaid, PAID for settled). Omit for every status. | |
| toDate | No | Only include records dated ON OR BEFORE this issue date, YYYY-MM-DD (inclusive - this IS the last date included, not the day after). | |
| fromDate | No | Only include records dated ON OR AFTER this issue date, YYYY-MM-DD (inclusive). Filters on the issue Date, never the due date. | |
| reference | No | Exact match on the Reference field. Use this when you know the reference verbatim - cannot be combined with referenceContains. | |
| organisation | No | The 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. | |
| referenceContains | No | Case-insensitive PARTIAL match on the Reference field (e.g. "1234" matches a reference containing "PO-1234"). Use this when you only know part of the reference. Cannot be combined with reference - if you know the exact text, use reference instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this with 'Read-only; nothing is created, sent or changed.' It adds valuable behavioral context beyond the annotations: each invoice carries its own currency, results are paginated at 100 per page, and the response echoes appliedFilters. It does not contradict the annotations. A small gap is that it doesn't describe the exact response shape, but the description carries substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core purpose, then filters, then read-only guarantee, then currency/pagination/appliedFilters caveats, then the sibling pointer. Every sentence earns its place, though it is slightly long and could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with 8 optional parameters, no required parameters, and no output schema, the description covers the key operational caveats: pagination, currency independence, appliedFilters echo, and the sibling for detail. It doesn't describe the exact return fields, but the absence of an output schema and the presence of a sibling detail tool make this acceptable. The description is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters. The description adds meaning beyond the schema by clarifying the reference/referenceContains mutual exclusivity ('use exactly one, never both'), the inclusive date range semantics, and the pageCount caveat. It doesn't restate every parameter, but it adds the cross-parameter constraints that the schema alone doesn't express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('invoices from Xero for the current organisation'), and immediately distinguishes the two invoice types (ACCREC sales vs ACCPAY bills). It also names the sibling get_xero_invoice for full line-item detail, so an agent can tell this list tool apart from the detail tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use get_xero_invoice for full line-item detail on one invoice, and it explains the optional filters (status, date range, reference) with clear semantics. It also warns about pagination ('if pageCount shows more pages than were returned, say so') and about relaying appliedFilters, which is actionable usage guidance beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_organisationslist_xero_organisationsARead-onlyInspect
List the Xero organisations this connector token is currently authorised to read AND that this call is permitted to know about (organisation names only - never an internal id). Account-wide: it does not take an organisation argument and answers the same regardless of which organisation you were just discussing - use it to find the exact name to pass as organisation on another tool, when this connection reaches more than one. withinPlanLimit: false on an entry means it is authorised on Xero but outside this account's current Xero-connector plan limit - a call naming that organisation will be refused; say so plainly rather than trying it anyway. A restricted connector token may not see every organisation on the account - that is by design, not an omission. organisations may come back empty - status says exactly why, never leave that unexplained: "not_connected" (no active Xero connection at all - Xero has not been connected in Settings, or the connection was disconnected), "no_organisations" (Xero is connected but currently authorises zero organisations on it - reconnecting in Settings is the fix), "none_authorised_for_you" (organisations exist on this connection, but this specific connector token is restricted to a set that does not include any of them - ask the account owner to check Settings > Xero > Team), or "connected" (the ordinary case, whether or not the list happens to be empty for another reason).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the burden of behavioral detail. It explains account-wide behavior, restricted-token visibility, the plan-limit distinction, and the complete set of possible `status` values with their meanings, going well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and front-loaded: the core purpose comes first, followed by consequential edge cases and status meanings. Every sentence earns its place by carrying operationally important guidance rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return semantics, and it does: it names the `organisations` and `status` fields, explains `withinPlanLimit: false`, and enumerates all status values and their fixes. It is complete enough for an agent to know what to expect and how to react to every outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4 per the rubric. The description adds relevant context by explicitly stating the tool takes no `organisation` argument and is account-wide, which clarifies why parameter-free invocation is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List the Xero organisations this connector token is currently authorised to read AND that this call is permitted to know about.' It clarifies it returns names only, never internal IDs, and is account-wide, which distinguishes it from the many list_xero_* siblings that target other resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: to find the exact organisation name to pass as `organisation` on another tool when the connection reaches more than one organisation. It also gives operational when-not-to guidance by explaining that organisations with `withinPlanLimit: false` will be refused and should be described plainly rather than attempted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_paymentslist_xero_paymentsARead-onlyInspect
List payments already recorded in Xero for the current organisation, optionally filtered by status (AUTHORISED or DELETED), by which invoice they were applied to, and by date range (fromDate/toDate, both inclusive). Read-only; nothing is created or changed - to RECORD a new payment, use create_xero_payment instead. amount is in the linked invoice's own currency, never assume it matches this user's Invio business currency. invoiceId/invoiceNumber are present only when this payment was applied to an invoice specifically - Xero also lets a payment be applied to a credit note, a prepayment or an overpayment, and this tool relays whichever is true rather than guessing. Returns up to 100 payments for the requested page; if pageCount shows more pages than were returned, say so rather than implying this is the full list. The result always echoes back exactly which filters were applied (appliedFilters) - relay that, not just your own memory of what you asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number - Xero returns up to 100 payments per page. Omit for page 1. | |
| status | No | Filter to one Xero payment status: AUTHORISED (the normal, recorded state) or DELETED (reversed). Omit for both. | |
| toDate | No | Only include payments dated ON OR BEFORE this date, YYYY-MM-DD (inclusive). | |
| fromDate | No | Only include payments dated ON OR AFTER this date, YYYY-MM-DD (inclusive). | |
| invoiceId | No | Filter to payments applied to one specific invoice. Omit for every invoice. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint; the description builds on that by revealing important non-obvious behaviors: amounts are in the linked invoice's currency, invoiceId/invoiceNumber appear only when applied to an invoice (not credit notes/prepayments/overpayments), and results echo applied filters. This goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: purpose, alternative, currency caveat, invoiceId behavior, pagination handling, and filter echo. It is logically ordered and front-loaded with the core action before the caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description shoulders the burden of explaining return behavior, and it covers the essentials: pagination limit, pageCount guidance, currency semantics, and when invoiceId/invoiceNumber are present. An agent has everything needed to call this tool and interpret its results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter thoroughly. The description adds a useful high-level summary of the filter options and inclusive date semantics, but most parameter detail remains in the schema; this is adequate without pushing above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List payments already recorded in Xero'), then scopes it precisely: current organisation, optional filters for status, invoice, and date range. It also distinguishes itself from create_xero_payment, so an agent can tell them apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says this is read-only and nothing is created or changed, and names the sibling to use instead (create_xero_payment). It also gives operational guidance such as relaying pagination state and echoing appliedFilters rather than assuming completeness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_payroll_earnings_rateslist_xero_payroll_earnings_ratesARead-onlyInspect
This organisation's payroll earnings rates (Ordinary Time, Overtime and similar) - name, earnings type, rate type and, where set, the rate itself (a per-unit rate, a multiplier of the ordinary earnings rate, or a fixed amount - only one of the three applies, depending on rateType). Read-only, for Australian, New Zealand and United Kingdom organisations. For Australia, each employee's own ordinaryEarningsRateId (from list_xero_payroll_employees) remains the right default for that employee's own ordinary hours - use this tool when you need a DIFFERENT rate (overtime, an allowance, and similar), since Australia's full list is now readable too, not just the one rate an employee record carries. Also requires Xero's own Payroll setup to be complete for the organisation, and the Xero user who connected to have held payroll administrator access at the time - if either is missing this refuses plainly rather than returning an empty list, so report that rather than implying the organisation has no payroll data. Use this before drafting a New Zealand or United Kingdom timesheet (create_xero_timesheet) - each timesheet line needs a real earningsRateId, and an employee record for those two regions carries no earnings rate of its own to fall back on. When the user has not named a specific rate, use the one whose earningsType is RegularEarnings (New Zealand/United Kingdom) for ordinary hours worked; say so rather than guessing at a name. Returns up to 100 rates for the requested page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Omit for page 1. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds meaningful context beyond them: refusal behavior (refuses plainly rather than returning an empty list when prerequisites are missing), prerequisites (Payroll setup complete, admin access at connection time), geographic scope (AU/NZ/UK), and a 100-rate pagination limit. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long (~200 words) but every sentence earns its place given the regional complexity, prerequisites, and fallback logic. Front-loaded with the core purpose before diving into usage guidance. The only minor inefficiency is that the AU/NZ/UK scope is stated early and the geographic detail is re-emphasized in the timesheet context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-format burden and does so adequately: it names the fields returned and the rate-type variants. It also covers prerequisites, refusal behavior, regional scope, pagination, and a default-selection rule. Nearly complete; the only minor gap is not describing the exact response envelope or whether rates are ordered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both parameters (page, organisation) are already documented in the schema. The description adds the pagination limit context ('Returns up to 100 rates for the requested page') which slightly enriches the page parameter, but mostly the schema carries the semantic load, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) + resource (payroll earnings rates) and enumerates the returned fields (name, earnings type, rate type, rate). It distinguishes itself from sibling tools by the three-way rate interpretation (per-unit, multiplier, fixed amount) and by explicitly contrasting with list_xero_payroll_employees' ordinaryEarningsRateId, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Exceptionally explicit: names when to use (Australia needs a DIFFERENT rate; NZ/UK timesheets) and when not to (Australia ordinary hours fall back to employee's own ordinaryEarningsRateId). Names the alternative tools (list_xero_payroll_employees, create_xero_timesheet) and even prescribes a default selection (RegularEarnings) when the user hasn't specified. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_payroll_employeeslist_xero_payroll_employeesARead-onlyInspect
This organisation's payroll employees - name, employment status, and (Australia only) whether Xero has a super fund on file for them and their ordinary earnings rate id. Read-only, for Australian, New Zealand and United Kingdom organisations (this refuses plainly for any other country - Xero's Payroll API covers no other region). Also requires Xero's own Payroll setup to be complete for the organisation, and the Xero user who connected to have held payroll administrator access at the time - if either is missing this refuses plainly rather than returning an empty list, so report that rather than implying the organisation has no payroll data. Active employees only unless includeInactive is set. Employment status comes straight from Xero for Australia; for New Zealand and the United Kingdom, Xero sends no status field at all, so it is derived here from whether Xero has recorded an end date - still accurate, just not Xero's own word for it. Super/pension fund membership is ONLY available for Australia from this tool - for New Zealand and the United Kingdom that fact is simply not returned (never a guessed "no fund"), say so rather than assuming everyone lacks one. NEVER returns a tax file number, a bank account or a home address - this tool does not read them from Xero at all. Does NOT know, and cannot answer, whether an employee has been paid, or whether anything has been reported to the ATO (Australia), IRD (New Zealand) or HMRC (United Kingdom) - Xero has no API for lodgement or payment status in any of the three. Returns up to 100 employees for the requested page; treat a full page of 100 as possibly incomplete and ask for the next page rather than assuming it is everyone.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Omit for page 1. | |
| organisation | No | The 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. | |
| includeInactive | No | Include terminated employees too. Omit or false for active employees only (Xero's own EmployeeStatus: ACTIVE or TERMINATED). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the behavioral burden. It goes far beyond that by disclosing region-based refusal, setup/admin prerequisites, derived employment status for NZ/UK, Australia-only super fund data, explicit non-return of TFN/bank/address, and pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries distinct operational guidance. It is front-loaded with the core purpose and then systematically covers constraints, regional differences, exclusions, and pagination without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return semantics, and it does thoroughly: what fields are returned, what is derived, what is never returned, what cannot be known, and how pagination works. An agent has enough information to call the tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context for page (full page may be incomplete, request next page) and includeInactive (active-only default), which goes beyond the schema's basic field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of what the tool returns: payroll employees with name, employment status, and Australia-only super fund and earnings rate ID. This clearly distinguishes it from sibling list tools like list_xero_payroll_earnings_rates and list_xero_pay_runs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context: read-only, for AU/NZ/UK organisations only, with requirements around Payroll setup and admin access. It also states what the tool cannot answer (payment status, ATO/IRD/HMRC lodgement), but it does not name alternative sibling tools for those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_payroll_leave_typeslist_xero_payroll_leave_typesARead-onlyInspect
This organisation's payroll leave types (Annual Leave, Sick Leave and similar) - name, whether it is paid, whether it shows on a payslip and, where Xero reports it, whether it is currently active. Read-only, for Australian, New Zealand and United Kingdom organisations. Also requires Xero's own Payroll setup to be complete for the organisation, and the Xero user who connected to have held payroll administrator access at the time - if either is missing this refuses plainly rather than returning an empty list, so report that rather than implying the organisation has no leave types. Use this BEFORE drafting a leave application (create_xero_leave_application) - a leave application needs a real leaveTypeId, and Xero has no way to guess one from a name alone. When the user has not named a specific leave type, ask rather than guessing - "Annual Leave" and "Sick Leave" are common names but this connector never assumes one exists under that exact name for every organisation. Returns up to 100 leave types for the requested page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Omit for page 1. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description doesn't repeat that. It adds valuable behavioral context: the tool requires Xero Payroll setup and payroll administrator access, and it refuses plainly rather than returning an empty list when those are missing. It also mentions pagination (up to 100 per page). These are important behavioral disclosures beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, covering purpose, prerequisites, usage guidance, and return limit. The critical usage guidance (use before leave application) is placed prominently. There is some redundancy with the schema's parameter descriptions (e.g., 'Omit for page 1') but overall it is well-structured for an agent reading it before a call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool is a simple list with two well-documented parameters and readOnlyHint=true, the description covers all critical operational aspects: prerequisites, failure mode, usage guidance, and return limit. The absence of an output schema is compensated by listing the returned fields (name, paid, shows on payslip, active) and the pagination limit. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have descriptions in the schema. The description adds context for the 'organisation' parameter ('Only needed if this connection reaches more than one organisation') and hints at pagination. It doesn't fully explain pagination (e.g., that there could be multiple pages), but it is sufficient given the schema already documents the parameters well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists payroll leave types with specific attributes (name, paid status, payslip visibility, active status). It explicitly notes the geographic scope (AU/NZ/UK) and the read-only nature. It is easily distinguishable from siblings like list_xero_payroll_earnings_rates and list_xero_payroll_employees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: 'Use this BEFORE drafting a leave application (create_xero_leave_application)' and explains why a real leaveTypeId is needed. It also instructs to ask the user when no specific leave type is named rather than guessing, and warns about the refusal behavior when prerequisites are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_pay_runslist_xero_pay_runsARead-onlyInspect
This organisation's recent pay runs - period, payment date, status (DRAFT or POSTED) and organisation-wide totals. Read-only, for Australian, New Zealand and United Kingdom organisations (this refuses plainly for any other country). Also requires Xero's own Payroll setup to be complete for the organisation, and the Xero user who connected to have held payroll administrator access at the time - if either is missing this refuses plainly rather than returning an empty list, so report that rather than implying the organisation has no payroll data. Most recent first. netPay (amount actually paid to employees) is reported by every region; Australia additionally breaks out wages/deductions/tax/super, while New Zealand and the United Kingdom instead report totalCost (the full cost to the employer, including employer-side tax/super/NI that Australia reports separately) - do not assume a field is zero just because it is absent, it may simply not be something this region's own Xero API reports at that level. Use get_xero_pay_run_summary for per-employee detail and a comparison against the previous pay run of the same calendar. Returns up to 100 pay runs for the requested page. This tool cannot say whether a POSTED pay run has actually been paid out or reported to any tax authority - Xero has no API for either, in any region.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Omit for page 1. Most recent pay runs come first. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description goes well beyond them: it discloses regional refusal behavior, prerequisites that cause plain refusals, ordering, regional differences in reported fields, pagination limits, and the tool's inability to confirm actual payment or tax reporting. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries essential operational information: purpose, region restrictions, prerequisites, field semantics, sibling routing, pagination, and limitations. It is front-loaded with the core purpose and then layers caveats in a logical order, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining return values. It covers the fields returned, regional variants (netPay vs totalCost), pagination, refusal behavior, and important limitations. An agent has enough to call this tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description adds some useful context, such as 'Most recent first' for page and the single-organisation omission guidance, but it does not substantially extend the schema's parameter explanations. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it lists the organisation's recent pay runs with period, payment date, status, and totals. It also distinguishes itself from get_xero_pay_run_summary by explicitly naming that sibling for per-employee detail, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: 'Use get_xero_pay_run_summary for per-employee detail and a comparison against the previous pay run.' It also specifies when the tool will refuse rather than return data, covering region, Payroll setup, and administrator access prerequisites, which helps an agent decide whether to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_projectslist_xero_projectsARead-onlyInspect
List job/project-costing projects from Xero Projects for the current organisation - the jobs or engagements time, expenses and invoices get tracked against, e.g. "the house on Richmond Road" or a client engagement. Read-only; nothing is created or changed. Optionally filter to one contact (contactId, a Xero ContactID from list_xero_contacts) and/or one state (INPROGRESS or CLOSED). Each project carries its OWN currency straight from Xero - never assume it matches this user's Invio business currency, and every money figure names its own currency alongside its value. Each result includes a headline estimate/invoiced/still-to-invoice figure; use get_xero_project for the full cost-and-earned breakdown on one project. If this call fails with an unauthorized/401-style error, it can mean this Xero organisation's plan does not include Xero Projects, or that this connection's Xero Projects access needs to be reconnected - say so rather than treating it as a generic failure.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Omit for page 1. | |
| state | No | Filter to one project state: INPROGRESS (still running) or CLOSED. Omit for both. | |
| pageSize | No | Projects per page, 1-500. Omit for Xero's own default of 50. | |
| contactId | No | Filter to projects for one Xero contact. Omit for every contact. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint=true, the description goes further: it emphasizes 'nothing is created or changed', warns about per-project currency and the risk of assuming it matches the user's business currency, discloses that results include a headline estimate/invoiced/still-to-invoice figure, and explains the meaning of a 401-style error (plan may lack Xero Projects or the connection needs reconnecting). This adds rich behavioral context beyond the annotations and is directly actionable for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively long but every sentence earns its place: definition, read-only assurance, filter options, currency caveat, result content, alternative tool, and error interpretation. It is front-loaded with the core purpose and safety, then progressively adds operational detail, with no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description compensates by describing what each result contains (headline estimate/invoiced/still-to-invoice figure, currency-named values) and where to go for deeper detail. It also covers error handling, filtering, and multi-organisation setup. For a list tool with five optional parameters and no return schema, the description provides everything an agent needs to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful provenance: contactId is 'a Xero ContactID from list_xero_contacts', and organisation is only needed when the connection reaches more than one organisation, which clarifies parameter semantics beyond the raw schema. It does not repeat every parameter, but the added guidance is valuable and non-redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List job/project-costing projects from Xero Projects for the current organisation', and clarifies what these projects represent with concrete examples. It explicitly distinguishes the tool from the sibling get_xero_project by pointing to it for the full breakdown, making the purpose unambiguous against a large family of list_xero_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: when you need a filtered list of projects with headline figures, use this tool; when you need the full cost-and-earned breakdown on one project, use get_xero_project instead. It also tells the agent where to source contactId (from list_xero_contacts) and how to handle multi-organisation connections, leaving no ambiguity about when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xero_quoteslist_xero_quotesARead-onlyInspect
List quotes from Xero for the current organisation, optionally filtered by status, by one contact, by an exact quote number, or by issue-date range (fromDate/toDate) or expiry-date range (expiryFromDate/expiryToDate) - all inclusive. Read-only; nothing is created or changed. Each quote carries its OWN currency straight from Xero - never assume it matches this user's Invio business currency. Returns up to 100 quotes for the requested page. Xero does NOT report a total page or item count for this endpoint (unlike invoices and credit notes) - if this call returns exactly 100 quotes, say there may be more and ask for the next page rather than treating 100 as the whole list; a shorter result IS the complete list for whatever filters were applied. The result always echoes back exactly which filters were applied (appliedFilters) - relay that, not just your own memory of what you asked for. Use get_xero_quote for full line-item detail on one quote.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number - Xero returns up to 100 quotes per page. Omit for page 1. | |
| status | No | Filter to one Xero quote status (e.g. DRAFT, SENT, ACCEPTED). Omit for every status. | |
| toDate | No | Only include quotes issued ON OR BEFORE this date, YYYY-MM-DD (inclusive). | |
| fromDate | No | Only include quotes issued ON OR AFTER this date, YYYY-MM-DD (inclusive). Filters the issue date, never the expiry date. | |
| contactId | No | Filter to quotes for one specific contact. | |
| quoteNumber | No | Filter to an exact quote number (e.g. "QU-0001"). | |
| expiryToDate | No | Only include quotes expiring ON OR BEFORE this date, YYYY-MM-DD (inclusive). | |
| organisation | No | The 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. | |
| expiryFromDate | No | Only include quotes expiring ON OR AFTER this date, YYYY-MM-DD (inclusive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds substantial behavioral context beyond that: currency is independent of the user's business currency, Xero does not report total counts for this endpoint, and the result echoes applied filters. These are critical behavioral traits the agent must know to avoid misinterpretation. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It front-loads the core purpose and filters, then addresses pagination, currency, appliedFilters, and the sibling pointer in a logical order. There is zero fluff; each clause conveys a distinct, necessary fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 optional parameters, no output schema, and unusual pagination behavior, the description covers everything the agent needs to call it correctly: the filter semantics, inclusive date boundaries, the no-total-count caveat, the 100-per-page limit, the appliedFilters echo, and the currency warning. It even points to get_xero_quote for line-item detail. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by clarifying that date ranges are inclusive, that fromDate/toDate filter the issue date while expiryFromDate/expiryToDate filter the expiry date, and that quoteNumber is an exact match. It does not repeat every parameter but covers the nuances an agent would otherwise miss.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List quotes from Xero') and enumerates the optional filters (status, contact, quote number, date ranges). It also explicitly distinguishes itself from the sibling get_xero_quote ('Use get_xero_quote for full line-item detail on one quote'), making it clear this tool is for listing summaries, not details. No ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes to the sibling get_xero_quote for line-item detail, telling the agent when to use that alternative. It also states this tool is read-only and that it returns up to 100 quotes per page, guiding the agent on pagination. The note about relaying appliedFilters is a direct usage instruction. This is explicit, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_xero_pay_runpost_xero_pay_runADestructiveInspect
Proposes moving an EXISTING DRAFT pay run to POSTED, Australian organisations only (this refuses plainly for New Zealand and the United Kingdom - Xero has no documented way to post a pay run for either region through its API). 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). THIS CANNOT BE UNDONE ONCE APPROVED: Xero's own Payroll API has no way to move a POSTED pay run back to DRAFT, ever - tell the user this plainly before they approve it, in these words, not a softened version. POSTING A PAY RUN DOES NOT LODGE ANYTHING WITH THE ATO AND DOES NOT PAY ANYONE - Single Touch Payroll lodgement, and the actual bank transfer to employees, both happen entirely outside this connector, through whatever process this business already uses; say so if asked whether wages have "gone out" or been "reported" - this tool cannot know either. confirm must be true, set only after the person has explicitly said, in their own words, to post this specific pay run.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true. Set this ONLY after the person using this account has explicitly said, in their own words, to post this specific pay run - posting cannot be undone through Xero's API once approved, never infer consent from context. | |
| payRunId | Yes | Get this from list_xero_pay_runs or get_xero_pay_run_summary - must currently be DRAFT. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that the tool is non-reversible once approved, that it requires explicit user confirmation, and that it does not actually execute the posting or payment—it merely proposes a change. It also clarifies the underlying API limitations. These details significantly enhance the agent's understanding of side effects and safety considerations, fully complementing the destructiveHint and readOnlyHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries essential safety and operational information. While it could be trimmed, the verbosity is justified given the irreversibility and potential consequences of the action. The core purpose is stated upfront, and the critical constraints are front-loaded; the length is a necessary trade-off for completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the absence of an output schema, the description fully explains the tool's behavior: it queues a pending change, requires human approval, and mentions the approvalUrl field in the response. It also covers edge cases like refusing non-AU pay runs and clarifies that it does not handle payroll lodgement or payments. No essential operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for all three parameters (payRunId, confirm, organisation), and the description essentially repeats these details without adding new information. Since schema coverage is 100%, the description adds no extra semantic value beyond what the schema already states. It correctly reinforces constraints like confirm must be true and payRunId must be DRAFT, but does not contribute beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: proposing to move an existing DRAFT pay run to POSTED, with a explicit constraint that it is for Australian organisations only. It distinguishes itself from creation tools by emphasizing it operates on an existing pay run and states it does not touch Xero directly. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: only for Australian organisations, and it refuses for NZ and UK. It also clarifies that this tool only queues a pending change that requires human approval, and it is not for lodging with the ATO or paying employees. This effectively routes the agent to use this tool only under the right conditions and explains prerequisites like obtaining payRunId from list_xero_pay_runs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reject_xero_pending_changereject_xero_pending_changeADestructiveIdempotentInspect
Rejects a change YOU (or another assistant on this account) have proposed to Xero, so it is discarded and never reaches Xero - nothing was ever sent, there is nothing to undo, and this cannot be reversed once called. Call this ONLY after the person using this account has clearly said, in their own words, to discard THIS specific change - never infer that from silence, from a change of topic, or from them simply not mentioning it again. Make sure they know what they are turning down first (call list_pending_changes if you do not already have its summary in this conversation), then call this with confirm: true. reason is optional context for why, if they gave one - Invio does not currently store or display it anywhere, so only mention it back to them in this conversation, never claim it was recorded. Rejecting in Invio's own Settings > MCP > Xero screen remains available at all times and works exactly the same either way.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional - why this is being rejected, if the person gave a reason. Invio does not currently store or display this anywhere - mention it back to them in this conversation if useful, never claim it was recorded against the change. | |
| confirm | Yes | Must be true. Set this ONLY after the person using this account has explicitly said, in their own words, to approve (or reject) this specific change - never infer consent from context, and never pass true speculatively "to see what happens". | |
| pendingChangeId | Yes | The pendingChangeId of the row to act on - from list_pending_changes' own result, or the pendingChangeId a draft-creating tool (create_xero_invoice etc.) just returned. Never invent one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the action as destructive and idempotent, and the description adds meaningful behavioral detail: the change never reaches Xero, there is nothing to undo, the action cannot be reversed, and the optional reason is not stored or displayed by Invio. This materially exceeds what the structured annotations alone convey and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary effect and every sentence earns its place for a destructive, irreversible operation. However, some sentences are long and slightly repetitive when emphasizing irreversibility and consent, so it is not maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to invoke the tool correctly: it explains the preconditions, what counts as valid consent, where pendingChangeId comes from, the meaning of confirm, the irreversibility, the storage behavior of reason, and the manual alternative. Given the high stakes and no output schema, there are no meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all parameters at 100% coverage. The description adds important usage semantics: confirm must be true and only after explicit consent, pendingChangeId must come from list_pending_changes or a draft-creating tool and never be invented, and reason is not persisted. This goes beyond the schema even though much of it reinforces what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it rejects a pending change that was proposed to Xero but never actually sent. It clearly describes the consequence (discarded, never reaches Xero, irreversible) and is easily distinguishable from the sibling approve_xero_pending_change and list_pending_changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: only after the user has clearly said, in their own words, to discard this specific change. It also tells the agent what not to do (never infer consent from silence or topic changes), suggests calling list_pending_changes first if the summary isn't in conversation, and notes that the manual Invio Settings path remains available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_xero_contactupdate_xero_contactAInspect
Proposes a change to an EXISTING Xero contact - it does NOT change anything in 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. contactId must come from list_xero_contacts (never invented). Provide at least one of name, emailAddress, or phone - only the fields you provide change, everything else on the contact is left exactly as it is.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name. Omit to leave unchanged. | |
| phone | No | New phone number. Omit to leave unchanged. | |
| contactId | Yes | Get this from list_xero_contacts first, never guess. | |
| emailAddress | No | New email. Omit to leave unchanged. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses that no Xero change happens until a human approves, that the approval link is in the response's approvalUrl field, and that the agent cannot approve it itself. It also states the partial-update behavior: only provided fields change. These details go well beyond the annotations and are essential for correct use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and each sentence covers a distinct operational fact: approval requirement, approvalUrl location, contactId source, and field-change semantics. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description provides enough context for correct invocation: it explains the pending-change workflow, the approval mechanism, the required source for contactId, and the at-least-one-field constraint. An agent can confidently select and call this tool without needing additional undocumented details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful cross-parameter guidance by requiring at least one of name, emailAddress, or phone, and by reinforcing that omitted fields remain unchanged. This supplements the per-field schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Proposes a change to an EXISTING Xero contact', giving a specific verb and resource while distinguishing it from create_xero_contact. It further clarifies that this tool queues a pending change rather than directly mutating Xero, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool: for existing contacts, with contactId sourced from list_xero_contacts, and requiring at least one of name, emailAddress, or phone. It does not explicitly name alternatives like create_xero_contact for new contacts, but the emphasis on 'EXISTING' and the approval workflow makes the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_xero_employeeupdate_xero_employeeAInspect
Proposes a change to ONE employee's first name, last name, email, phone/mobile, or home address - and STRUCTURALLY NOTHING ELSE - for Australian, New Zealand or United Kingdom organisations. 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. employeeId must come from list_xero_payroll_employees (never invented). Provide at least one of firstName, lastName, email, phone, mobile, or address - only the fields you provide change, everything else about the employee is left exactly as it is. For Australia, phone and mobile are two separate fields and both may be set independently. For New Zealand and the United Kingdom there is only ONE phone number field in Xero - use either phone or mobile (not both to two different values); doing so refuses before anything is drafted. This tool has NO field for bank details, tax numbers, tax settings, pay templates, salary or rates, KiwiSaver/super, date of birth, start date, or termination date - none of those can ever be changed through this connector, by design.
| Name | Required | Description | Default |
|---|---|---|---|
| No | New email address. Omit to leave unchanged. | ||
| phone | No | New phone number. For Australia this is a SEPARATE field from mobile - both may be set independently. For New Zealand and the United Kingdom there is only ONE phone field in Xero - use either phone or mobile, never both to two different values (this is refused before anything is drafted if you do). | |
| mobile | No | New mobile number. Australia has a genuinely separate Mobile field from phone. For New Zealand and the United Kingdom this maps onto the SAME single phone field as phone - use either phone or mobile, never both to two different values. | |
| address | No | New home address - only the fields you provide inside it change, the rest of the address is left exactly as it is. state is Australia-only, suburb is New Zealand-only; both are silently ignored for the other regions. | |
| lastName | No | New last name. Omit to leave unchanged. | |
| firstName | No | New first name. Omit to leave unchanged. | |
| employeeId | Yes | Get this from list_xero_payroll_employees first - never invent one. | |
| organisation | No | The 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals critical behavior: the tool does not touch Xero directly, queues a pending change requiring human approval, and only changes the fields explicitly provided. It also discloses region-specific phone/address behavior and that conflicting phone/mobile values for NZ/UK are refused before drafting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but nearly every sentence carries a necessary constraint or warning for a complex, region-sensitive tool. There is some repetition of the 'only fields you provide change' and 'nothing else' ideas, so it is not maximally concise, but it remains well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, a nested address object, region-specific behavior, and an approval workflow, the description covers everything an agent needs: source of employeeId, minimum required fields, partial update semantics, approval URL, region rules, and explicit exclusions. No output schema exists, but the description adequately explains the pending-change result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds essential semantics: partial update behavior ('only the fields you provide change'), the source requirement for employeeId, the AU/NZ/UK phone field distinction, and the fact that state is Australia-only while suburb is New Zealand-only. These meanings go well beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Proposes a change to ONE employee's first name, last name, email, phone/mobile, or home address' and immediately narrows scope with 'STRUCTURALLY NOTHING ELSE' and the AU/NZ/UK organisation qualifier. This clearly distinguishes it from sibling tools like update_xero_contact or update_xero_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to use it ('Provide at least one of firstName, lastName, email, phone, mobile, or address'), where to get required data ('employeeId must come from list_xero_payroll_employees'), and what it cannot do ('This tool has NO field for bank details, tax numbers...'). It also clarifies the approval workflow and that the agent cannot approve the change itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_xero_invoiceupdate_xero_invoiceAInspect
Proposes a change to an EXISTING Xero invoice - it does NOT change anything in 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. Only works on invoices that are still DRAFT or SUBMITTED in Xero - get_xero_invoice tells you the current status first. Cannot change which contact the invoice is for, or its type - void it and create a new one for that. If you include lineItems at all, it REPLACES every line item on the invoice; to change one, list all of them, or Xero will delete the ones you don't mention. Tell the user exactly what you are proposing to change and that it needs their approval in Invio - never describe it as done. You can also change the invoice currency (currency, checked against the currencies this organisation is actually set up to invoice in) and how its amounts are read (lineAmountTypes: "Exclusive", "Inclusive" or "NoTax"). Omit either to leave it exactly as it is - neither is reset to a default when you leave it out. Changing lineAmountTypes re-interprets EVERY amount already on the invoice and so changes its total: only send it when the user actually asked for that, and say plainly that the total will move. DATES: date and dueDate are 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 an invoice 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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | New invoice date, YYYY-MM-DD. Omit to leave unchanged. 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. | |
| dueDate | No | New due date, YYYY-MM-DD. Omit to leave unchanged. 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. | |
| currency | No | New currency for the invoice, e.g. "NZD". Checked against the currencies this organisation is actually set up to invoice in. Omit to leave the invoice in whatever currency it is already in - this never resets it to the organisation's base currency. | |
| invoiceId | Yes | Get this from list_xero_invoices or get_xero_invoice first, never guess. | |
| lineItems | No | If you include this at all, it REPLACES every line item on the invoice - Xero deletes any line item you do not list here. To change one line item, list ALL of them (the ones you are not changing too), never just the one that changed. Omit this field entirely to leave every line item as it is. | |
| reference | No | New reference text. Omit to leave unchanged. | |
| organisation | No | The 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. | |
| lineAmountTypes | No | Change how this invoice reads its unitAmounts: "Exclusive" (amounts exclude tax), "Inclusive" (amounts already include tax), or "NoTax". Omit to leave it exactly as it is. Changing this re-interprets EVERY amount already on the invoice and so changes its total - only set it when the user actually asks for that (e.g. "those figures were meant to include GST"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses much more than annotations: it does not change Xero directly, it requires human approval via approvalUrl, omitted lineItems will be deleted on replacement, lineAmountTypes reinterpretation changes the total, and bare numeric dates are interpreted day-first. These side effects and constraints add significant safety-relevant context beyond readOnlyHint and destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core approval semantics, then organizes constraints, replacement behavior, and date rules into clear blocks. Every sentence carries actionable guidance with no filler or repetition of what annotations already state.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and the high-stakes propose/approve behavior, the description covers prerequisites, approval flow, parameter pitfalls, and the response's approvalUrl field. An agent has all the information needed to invoke the tool correctly and communicate the outcome honestly to the user.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds decisive meaning for ambiguous parameters: bare numeric date resolution ('I read 9/8 as 9 August'), lineItems as full replacement, currency validation against organisation setup, and lineAmountTypes reinterpreting existing amounts. It also establishes the omit/leave-unchanged behavior for several optional fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Proposes a change to an EXISTING Xero invoice' and immediately distinguishes it from create_xero_invoice and approve_xero_pending_change by clarifying it only queues a human-approved change. It further scopes the tool to DRAFT/SUBMITTED invoices and states what it cannot change, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent to check status first via get_xero_invoice, states the only valid statuses, and gives an explicit when-not with the alternative: 'void it and create a new one' for contact/type changes. It also provides clear directives on when not to send lineAmountTypes and how to handle ambiguous bare-numeric dates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Added
get_xero_group_report
37 tool updates
- First observed
approve_xero_pending_change - First observed
create_xero_contact - First observed
create_xero_credit_note - First observed
create_xero_invoice - First observed
create_xero_leave_application - First observed
create_xero_manual_journal - First observed
create_xero_pay_run - First observed
create_xero_payment - First observed
create_xero_quote - First observed
create_xero_timesheet - First observed
get_xero_balance_sheet - First observed
get_xero_credit_note - First observed
get_xero_invoice - First observed
get_xero_leave_balances - First observed
get_xero_outstanding_receivables - First observed
get_xero_pay_run_summary - First observed
get_xero_profit_and_loss - First observed
get_xero_project - First observed
get_xero_quote - First observed
list_pending_changes - First observed
list_xero_accounts - First observed
list_xero_contacts - First observed
list_xero_credit_notes - First observed
list_xero_invoices - First observed
list_xero_organisations - First observed
list_xero_pay_runs - First observed
list_xero_payments - First observed
list_xero_payroll_earnings_rates - First observed
list_xero_payroll_employees - First observed
list_xero_payroll_leave_types - First observed
list_xero_projects - First observed
list_xero_quotes - First observed
post_xero_pay_run - First observed
reject_xero_pending_change - First observed
update_xero_contact - First observed
update_xero_employee - First observed
update_xero_invoice
Publisher details
- Operator
- Bakhtiyar Duganov trading as Invio (New Zealand) · Publisher source
- Operator website
- https://www.invio.co.nz/xero-mcp
- Vendor relationship
- Not available
- Documentation
- https://www.invio.co.nz/guides/xero-mcp-setup
- Trust center
- Not available
- Restrictions
- Paid plan after a 7-day free trial (no card needed). Requires an Invio account and a Xero organisation you can authorise. Write actions wait in an approval queue until the account owner or an approver approves them.
Related MCP Connectors
Connect Xero to AI agents with secure read or write access across multiple organisations.
AI agents for CRM, mail, calendar, ERP and accounting - you approve. EU-hosted, OAuth.
Your AI and another company's AI on one signed line. People approve; nobody shares logins.
- HeyMetraOAuthcom.heymetra
Ask across your ads, analytics, store, CRM and subscription accounts; writes wait for approval.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables natural-language interaction with Xero accounting data, including invoices and intents, with role-based access control and audit trail.210 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to read an organisation's contacts, invoices and bills, payments, chart of accounts and financial reports, and — only on explicit request — to create contacts, invoices and payments or change an invoice's status.Apache 2.0
- FlicenseNot gradedqualityBmaintenanceEnables accountants to connect Xero, read accounting data, analyze, and execute controlled draft operations after explicit confirmation, with Xero as the source of truth.-
- AlicenseAqualityCmaintenanceEnables natural language interaction with Xero accounting data, managing contacts, invoices, and accounts across multiple organisations via OAuth2.12MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.