{
 "slug": "xero",
 "name": "Xero",
 "url": "https://xero.com",
 "domain": "xero.com",
 "category": "invoicing",
 "category_name": "Invoicing",
 "tested_at": "2026-10-06",
 "run": "20261006T100520Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261002T070543Z",
   "date": "2026-10-02",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261006T100520Z",
   "date": "2026-10-06",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "level": 1,
 "level_name": "Needs a person",
 "level_selfhost": null,
 "entry": "closed",
 "door": {
  "passed": 0,
  "tries": 2,
  "self_start": false
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: an OpenAPI and an MCP server",
   "have": [
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "person",
   "label": "A person sets it up",
   "routes": [],
   "minutes": null,
   "core": null
  }
 ],
 "minutes": null,
 "next": {
  "to": 2,
  "text": "Next: let an agent sign up on its own"
 },
 "stop": "signup",
 "core": "0/9",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 80,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 80,
  "security": null,
  "standards": [
   {
    "standard": "MCP",
    "state": "behind",
    "behind": 1,
    "value": "2025-11-25"
   },
   {
    "standard": "MCP discovery",
    "state": "behind",
    "behind": null,
    "value": "legacy"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 2,
    "value": "3.0.0"
   }
  ]
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f3d0adeeb256",
  "kb_version": "2+overlay-9e43028a2c",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "start"
 },
 "same_level_drives": 2,
 "drives": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "closed"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-13"
  },
  "browser": {
   "state": "unknown",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "OpenAPI 3.0.0, MCP and CLI READMEs on GitHub read headless; developer.xero.com pages render client-side"
  },
  "signup": {
   "status": "human",
   "via": "",
   "note": "Phone number required on both the one-month-free trial form (Step 2: 'Please supply a valid phone number') and the free developer login ('Country code is required', 'Please supply a valid phone number', 'Choose a location'); we have none"
  },
  "verify": {
   "status": "",
   "note": "no account, so no verification mail",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "OAuth apps are made at developer.xero.com/app/manage after login; no DCR, CIMD or device flow in AS metadata; Custom Connections need a monthly subscription except on the Demo Company",
   "via": "",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "unauthenticated GET /api.xro/2.0/Organisation returns 401 AuthenticationUnsuccessful; no credentials",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "no org",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [
    "web checkout in Xero's sign-up flow, processor not recorded"
   ],
   "rail_ids": [
    "card"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "no-card trial",
   "note": "No 402, x402, MPP or UCP (x402./mpp./agents.xero.com have no DNS; /.well-known/ucp 403). Purchase and the one-month-free trial go through a 4-step web form that asks for a phone number before the payment step; the payment step was not reached, so whether the trial needs a card is unknown",
   "reached": false
  },
  "cancel": {
   "status": "",
   "grade": "n/a",
   "note": "no plan started",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "no account created",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [
   {
    "id": "card",
    "name": "Card checkout",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "card_required": null,
   "free_plan": null
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": false,
  "webhooks": true,
  "sandbox": true
 },
 "surface_notes": {
  "api": "REST Accounting API, 235 operations in xero_accounting.yaml",
  "openapi": "3.0.0 on GitHub (XeroAPI/Xero-OpenAPI)",
  "mcp": "official, stdio, 51 tools, the older 25 Nov 2025 spec",
  "cli": "XeroAPI/xero-command-line, PKCE browser login",
  "sandbox": "Demo Company (free Custom Connection for development)"
 },
 "can_do": [
  "Read Xero's OpenAPI spec and the MCP and CLI docs on GitHub without an account",
  "Install the official MCP server and list its 51 tools without credentials"
 ],
 "cannot_do": [
  {
   "what": "Create a Xero account (trial or developer login)",
   "why": "Both sign-up forms require a phone number"
  },
  {
   "what": "Get API credentials",
   "why": "OAuth apps are created in the developer portal after login; there is no DCR, CIMD or device flow"
  },
  {
   "what": "Any core capability (invoices, quotes, bills, contacts, reports, bank transactions)",
   "why": "No account or org"
  }
 ],
 "blockers": [
  "Phone number required on the trial sign-up and on the developer sign-up"
 ],
 "tips_for_owner": [
  "Make the phone number optional at sign-up",
  "Add a headless OAuth credential path",
  "Serve Protected Resource Metadata on the API",
  "Support MCP (the 28 Jul 2026 spec) and a remote endpoint",
  "Publish llms.txt and markdown docs"
 ],
 "tips_for_agents": [
  "With a human-made account, use the Demo Company with a free Custom Connection (client_credentials) and the official MCP server or the REST API",
  "The MCP server is stdio and answers protocol 2025-11-25: use initialize, not server/discover",
  "Read the docs from GitHub (XeroAPI/Xero-OpenAPI, xero-mcp-server); developer.xero.com needs JavaScript",
  "The CLI's xero login opens a browser for PKCE (callback on localhost:8742)"
 ],
 "selfhost": null,
 "summary": "Xero stops an agent at sign-up: both the free trial and the free developer login require a phone number, so no account, credentials or capability could be reached. The developer surface is strong (official MCP server with 51 tools, CLI, OpenAPI 3.0.0, Demo Company), but every route needs an OAuth client from a logged-in account, and the MCP server is stdio-only on the the older 25 Nov 2025 spec protocol.",
 "wall": "Phone number required at sign-up",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Xero is online accounting software (invoices, bills, bank reconciliation, reports) that an agent can normally reach through an official app, phone app, or web dashboard. In this test, the agent could not even create an account: both the free trial and the free developer sign-up demand a phone number, which the agent didn't have and wouldn't invent. So nothing past sign-up could be tried.",
  "can_do": [
   "Read Xero's technical documentation and setup guides without logging in.",
   "Install Xero's official developer tool and see the list of actions it offers, without needing an account."
  ],
  "cannot_do": [
   {
    "what": "Create a Xero account, trial or developer login",
    "why": "Both sign-up forms require a phone number the agent doesn't have"
   },
   {
    "what": "Get an access key to use Xero's API",
    "why": "Keys are only issued inside a logged-in account, which could not be created"
   },
   {
    "what": "Do anything with invoices, bills, contacts, reports or bank data",
    "why": "No account exists to hold that data"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Invoicing",
   "capability": "Create and send an invoice to a customer",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api.xro/2.0/Invoices",
    "mcp": null,
    "cli": null,
    "ui": "Business > Invoices > New invoice"
   },
   "check": "GET /api.xro/2.0/Invoices/{InvoiceID} shows Status SUBMITTED/AUTHORISED and Type ACCREC",
   "source": "https://www.xero.com/us/pricing-plans/early/; https://developer.xero.com/documentation/api/accounting/invoices"
  },
  {
   "id": "cap-02",
   "group": "Invoicing",
   "capability": "Accept online invoice payments (card, ACH, digital wallet)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api.xro/2.0/Payments",
    "mcp": null,
    "cli": null,
    "ui": "Invoice > Online payment service / Pay Now button"
   },
   "check": "GET /api.xro/2.0/Invoices/{InvoiceID} shows AmountPaid equal to AmountDue and a linked Payment",
   "source": "https://www.xero.com/us/accounting-software/; https://www.xero.com/us/pricing-plans/"
  },
  {
   "id": "cap-03",
   "group": "Invoicing",
   "capability": "Send a quote to a customer",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api.xro/2.0/Quotes",
    "mcp": null,
    "cli": null,
    "ui": "Business > Quotes > New quote"
   },
   "check": "GET /api.xro/2.0/Quotes/{QuoteID} shows Status SENT",
   "source": "https://www.xero.com/us/pricing-plans/early/"
  },
  {
   "id": "cap-04",
   "group": "Bills & payables",
   "capability": "Enter and track a bill to pay (including automated capture)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api.xro/2.0/Invoices (Type ACCPAY)",
    "mcp": null,
    "cli": null,
    "ui": "Business > Bills to pay"
   },
   "check": "GET /api.xro/2.0/Invoices/{InvoiceID} shows Type ACCPAY and Status AUTHORISED",
   "source": "https://www.xero.com/us/pricing-plans/established/; https://www.xero.com/us/accounting-software/"
  },
  {
   "id": "cap-05",
   "group": "Bills & payables",
   "capability": "Make an online bill payment (domestic ACH, cross-border, or international)",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Bill > Schedule payment (Melio-powered)"
   },
   "check": "Bill detail shows Payment status Paid/Scheduled and a payment reference",
   "source": "https://www.xero.com/us/accounting-software/; https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-06",
   "group": "Bank reconciliation",
   "capability": "Connect a bank feed and reconcile bank transactions",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET/POST /api.xro/2.0/BankTransactions",
    "mcp": null,
    "cli": null,
    "ui": "Business > Bank accounts > Reconcile"
   },
   "check": "GET /api.xro/2.0/BankTransactions/{BankTransactionID} shows IsReconciled true",
   "source": "https://www.xero.com/us/accounting-software/; https://www.xero.com/us/pricing-plans/"
  },
  {
   "id": "cap-07",
   "group": "Reporting",
   "capability": "View real-time financial reports (P&L, balance sheet, cash flow)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /api.xro/2.0/Reports/{ReportID}",
    "mcp": null,
    "cli": null,
    "ui": "Accounting > Reports"
   },
   "check": "GET /api.xro/2.0/Reports/ProfitAndLoss returns a report with the current period's rows",
   "source": "https://www.xero.com/us/accounting-software/; https://developer.xero.com/documentation/api/accounting/reports"
  },
  {
   "id": "cap-08",
   "group": "Reporting",
   "capability": "Forecast cash flow (30/60/180-day)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Business > Cash flow"
   },
   "check": "Cash flow page shows a forecast chart covering the plan's day range",
   "source": "https://www.xero.com/us/pricing-plans/; https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-09",
   "group": "Contacts",
   "capability": "Create and manage a contact (customer or supplier)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api.xro/2.0/Contacts",
    "mcp": null,
    "cli": null,
    "ui": "Contacts > New contact"
   },
   "check": "GET /api.xro/2.0/Contacts/{ContactID} returns the created contact record",
   "source": "https://developer.xero.com/documentation/api/accounting/contacts; https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-10",
   "group": "Tax",
   "capability": "Calculate and file sales tax on transactions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /api.xro/2.0/TaxRates",
    "mcp": null,
    "cli": null,
    "ui": "Accounting > Advanced > Tax rates / Sales tax report"
   },
   "check": "Invoice shows a calculated TaxAmount and the Sales Tax report lists it",
   "source": "https://www.xero.com/us/pricing-plans/"
  },
  {
   "id": "cap-11",
   "group": "Tax",
   "capability": "Collect W-9s and generate 1099 reports",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Accounting > Advanced > 1099 reporting"
   },
   "check": "1099 report lists the contractor with collected W-9 data",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-12",
   "group": "Reporting",
   "capability": "Visualize performance with graphs and customizable dashboards",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > widgets"
   },
   "check": "Dashboard shows a chart widget the user added or reordered",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-13",
   "group": "Reporting",
   "capability": "Analyze KPIs, ratios, and financial health scorecards",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Reporting > Analytics (Syft-powered)"
   },
   "check": "Scorecard page renders KPI values for the connected organisation",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-14",
   "group": "Reporting",
   "capability": "Benchmark performance against industry peers",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Reporting > Analytics > Benchmarking"
   },
   "check": "Benchmarking page shows the org's metrics plotted against an industry band",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-15",
   "group": "Budgeting",
   "capability": "Create and edit a budget with smart suggestions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api.xro/2.0/Budgets",
    "mcp": null,
    "cli": null,
    "ui": "Accounting > Reports > Budget Manager"
   },
   "check": "GET /api.xro/2.0/Budgets/{BudgetID} returns the saved budget line amounts",
   "source": "https://www.xero.com/us/pricing-plans/"
  },
  {
   "id": "cap-16",
   "group": "Multi-currency",
   "capability": "Invoice, pay, and track gains/losses in multiple currencies",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /api.xro/2.0/CurrencyRates",
    "mcp": null,
    "cli": null,
    "ui": "Invoice > Currency selector"
   },
   "check": "Invoice created with a non-base CurrencyCode shows converted totals in reports",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-17",
   "group": "Projects",
   "capability": "Track time and costs for a project and bill it",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /projects.xro/2.0/Projects",
    "mcp": null,
    "cli": null,
    "ui": "Projects > New project"
   },
   "check": "GET /projects.xro/2.0/Projects/{projectId} shows accumulated time/cost totals",
   "source": "https://www.xero.com/us/pricing-plans/established/; https://developer.xero.com/documentation/api/projects/overview"
  },
  {
   "id": "cap-18",
   "group": "Expenses",
   "capability": "Submit, approve, and reimburse an employee expense/mileage claim",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api.xro/2.0/ExpenseClaims",
    "mcp": null,
    "cli": null,
    "ui": "Business > Expense claims"
   },
   "check": "GET /api.xro/2.0/ExpenseClaims/{ExpenseClaimID} shows Status PAID after reimbursement",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-19",
   "group": "Documents",
   "capability": "Capture bills/receipts automatically and store documents",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /files.xro/1.0/Files",
    "mcp": null,
    "cli": null,
    "ui": "Business > Bills to pay > Smart Document Capture"
   },
   "check": "GET /files.xro/1.0/Files/{FileId} returns the captured document attached to the created bill",
   "source": "https://www.xero.com/us/pricing-plans/; https://developer.xero.com/documentation/api/files/overview"
  },
  {
   "id": "cap-20",
   "group": "Purchasing",
   "capability": "Create and send a purchase order",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api.xro/2.0/PurchaseOrders",
    "mcp": null,
    "cli": null,
    "ui": "Business > Purchase orders"
   },
   "check": "GET /api.xro/2.0/PurchaseOrders/{PurchaseOrderID} shows Status SUBMITTED/SENT",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-21",
   "group": "Inventory",
   "capability": "Track inventory items and stock levels",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET/PUT /api.xro/2.0/Items",
    "mcp": null,
    "cli": null,
    "ui": "Business > Products and services"
   },
   "check": "GET /api.xro/2.0/Items/{ItemID} shows QuantityOnHand updated after a sale",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-22",
   "group": "Assistant",
   "capability": "Ask JAX (AI assistant) for insights on business data",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > JAX"
   },
   "check": "JAX panel returns a generated answer referencing the org's actual transaction data",
   "source": "https://www.xero.com/us/accounting-software/"
  },
  {
   "id": "cap-23",
   "group": "Fixed assets",
   "capability": "Register and depreciate a fixed asset",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api.xro/2.0/Assets",
    "mcp": null,
    "cli": null,
    "ui": "Accounting > Fixed assets"
   },
   "check": "GET /api.xro/2.0/Assets/{AssetId} shows BookDepreciationSetting applied with reduced book value",
   "source": "https://developer.xero.com/documentation/api/assets/overview"
  },
  {
   "id": "cap-24",
   "group": "Payroll",
   "capability": "Run payroll (via Xero Payroll powered by Gusto)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Payroll (Gusto add-on)"
   },
   "check": "Payroll run summary shows employees paid for the period",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-25",
   "group": "Developer access",
   "capability": "Authorize a third-party app via OAuth2 to access organisation data",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /connections",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Connected apps"
   },
   "check": "GET /connections lists the newly authorized tenantId",
   "source": "https://developer.xero.com/documentation/getting-started-guide/"
  },
  {
   "id": "cap-26",
   "group": "Collaboration",
   "capability": "Invite and manage additional users/advisors on the organisation",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Users"
   },
   "check": "Settings > Users shows the invited user with an assigned role",
   "source": "https://www.xero.com/us/pricing-plans/"
  },
  {
   "id": "cap-27",
   "group": "Integrations",
   "capability": "Connect a third-party app from the Xero App Store",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "apps.xero.com"
   },
   "check": "Connected apps list in Settings shows the installed app",
   "source": "https://www.xero.com/us/accounting-software/; https://apps.xero.com/"
  },
  {
   "id": "cap-28",
   "group": "Branding",
   "capability": "Customize invoice/quote branding theme",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET/PUT /api.xro/2.0/BrandingThemes",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Invoice settings > Branding"
   },
   "check": "GET /api.xro/2.0/BrandingThemes/{BrandingThemeID} returns the updated theme name/logo",
   "source": "https://developer.xero.com/documentation/api/accounting/brandingthemes"
  },
  {
   "id": "cap-29",
   "group": "Support",
   "capability": "Book a free onboarding call with a Xero coach",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Pricing plan page > Book a free call"
   },
   "check": "Confirmation that a coaching session was scheduled on the account",
   "source": "https://www.xero.com/us/pricing-plans/established/"
  },
  {
   "id": "cap-30",
   "group": "Billing",
   "capability": "Add optional add-ons (Inventory Plus) to the subscription",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Subscription > Add-ons"
   },
   "check": "Subscription summary lists Inventory Plus as an active add-on",
   "source": "https://www.xero.com/us/pricing-plans/"
  }
 ],
 "attempts": [
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "robots.txt / aipref",
   "task": "GET https://www.xero.com/robots.txt",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 text/plain; User-Agent: * with Disallow /content/xero/, /media/, /api/*, /downloads/* etc.; no Content-Usage or Content-signal lines",
   "notes": "no aipref preferences"
  },
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "llms.txt",
   "task": "GET www.xero.com/llms.txt and developer.xero.com/llms.txt",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "www.xero.com/llms.txt 503 text/html error page; developer.xero.com/llms.txt 404",
   "notes": "no llms.txt"
  },
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "agent cards / well-known",
   "task": "GET /.well-known/ai-catalog.json, agent-card.json, agent.json, mcp/server-card.json, ucp, /auth.md, /SKILL.md on www.xero.com",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "well-known paths 403 application/xml S3 AccessDenied; /.well-known/ucp 301 then 403; /auth.md 404; /SKILL.md 301 -> /skill.md 404",
   "notes": "no AI catalog, A2A card, MCP card, UCP profile, auth.md or skill file"
  },
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "OAuth metadata",
   "task": "GET identity.xero.com/.well-known/oauth-authorization-server and api.xero.com/.well-known/oauth-protected-resource; unauth GET /api.xro/2.0/Organisation",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "AS metadata 200 JSON: grants authorization_code, client_credentials, refresh_token; PKCE S256; no registration_endpoint, no device_authorization_endpoint, no CIMD flag, no agent_auth. PRM on api.xero.com 404. Unauth API 401 application/json {Title:Unauthorized,Status:401,Detail:AuthenticationUnsuccessful}, WWW-Authenticate: Bearer (no resource_metadata)",
   "notes": "no headless credential path for a new agent: no DCR/CIMD/device flow",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "Markdown docs",
   "task": "GET developer.xero.com accounting overview with Accept: text/markdown and .md URL",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "Accept: text/markdown -> content-type text/html, no Vary: Accept; overview.md -> 200 with body \"Not Authorized.\"; docs pages are client-rendered (curl HTML has no text)",
   "notes": "no markdown docs"
  },
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "OpenAPI",
   "task": "GET github.com/XeroAPI/Xero-OpenAPI xero_accounting.yaml",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "openapi: 3.0.0, 235 operationIds, no x-payment-info",
   "notes": "official OpenAPI on GitHub, linked from MCP README"
  },
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "MCP server",
   "task": "npm @xeroapi/xero-mcp-server 0.0.17 (stdio); send server/discover with 2026-07-28, then initialize",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "server/discover -> JSON-RPC -32601 Method not found; initialize offering 2026-07-28 -> protocolVersion 2025-11-25, serverInfo Xero MCP Server 1.0.0; tools/list -> 51 tools (create-invoice, create-contact, create-quote, create-payment, create-bank-transaction, list-profit-and-loss, list-report-balance-sheet, payroll timesheets...)",
   "notes": "official, stdio only, legacy protocol; auth via Custom Connection client id/secret or XERO_CLIENT_BEARER_TOKEN"
  },
  {
   "t": "02:21",
   "cap": "discovery",
   "capability": "Custom Connections terms",
   "task": "read developer.xero.com custom-connections guide (rendered)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "\"Custom Connections are only available for Xero organisations in Australia, New Zealand, the UK, and the US and require an additional monthly subscription... can be connected to the Xero Demo Company for free for development purposes\"",
   "notes": "client_credentials path is paid except on the Demo Company"
  },
  {
   "t": "07:08",
   "cap": "signup",
   "capability": "Sign up for a free trial",
   "task": "Start the US one-month-free trial (Early plan) at www.xero.com/us/signup/try/early/",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "No sign-up API. Headless GET /us/signup/ redirects to pricing; trial form is a JS SPA (recaptcha script loaded, no visible challenge). Step 2 Account details: name, email, terms filled; submit without phone -> inline error \"Please supply a valid phone number\" under the required Phone field; form stays on Step 2 of 4",
   "notes": "Phone number is required; we have none and will not invent one. Step 4 (payment information) not reached, so whether the trial needs a card is unknown. Country left at the default United States.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "07:49",
   "cap": "signup",
   "capability": "Create a free developer login",
   "task": "Create a free Xero login for the API at www.xero.com/signup/developers/ (linked from developer.xero.com)",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Form fields First name, Last name, Email, Phone (country code + number), Location, terms. Submit without phone/location -> \"Country code is required\", \"Please supply a valid phone number\", \"Choose a location\"; stays on form. reCAPTCHA script present, no visible challenge",
   "notes": "Phone number required on the developer sign-up as well; we have none. Location (a country) also required.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "08:36",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Read developer.xero.com docs, AI toolkit, OpenAPI on GitHub, MCP and CLI READMEs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "developer.xero.com/ai links MCP server (github XeroAPI/xero-mcp-server), CLI (XeroAPI/xero-command-line, PKCE browser login), agent toolkit, prompt library; OpenAPI 3.0.0 on GitHub; docs HTML is client-rendered (curl gets no text), so headless reading needs GitHub sources or a browser",
   "notes": "docs readable headless via GitHub; developer.xero.com pages need JS"
  },
  {
   "t": "08:36",
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Get an OAuth client (Custom Connection client_credentials or PKCE app) for an org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Apps are created at developer.xero.com/app/manage after login; no account (phone required at sign-up). AS metadata has no registration_endpoint, no CIMD, no device flow; Custom Connections need a monthly subscription except on the Demo Company",
   "notes": "blocked by the sign-up phone wall"
  },
  {
   "t": "08:36",
   "cap": "first_call",
   "capability": "First API call",
   "task": "GET /api.xro/2.0/Organisation",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Unauth 401 application/json {\"Title\":\"Unauthorized\",\"Status\":401,\"Detail\":\"AuthenticationUnsuccessful\"}, WWW-Authenticate: Bearer",
   "notes": "no credentials",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "08:36",
   "cap": "first_action",
   "capability": "First create",
   "task": "Create a contact via MCP create-contact",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no org and no credentials",
   "notes": "blocked by the sign-up phone wall"
  },
  {
   "t": "08:36",
   "cap": "pay",
   "capability": "Buy a plan the agent way",
   "task": "Probe 402/agentic rails and the self-serve purchase path",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Unauth API calls return 401 Bearer, not 402; x402./mpp./agents.xero.com have no DNS; /.well-known/ucp 301->403, no x-payment-info in OpenAPI; no Xero entry found in x402 Bazaar first page, mpp.dev/api/services, projects.dev; pricing page: Buy now (80% off 3 months) or one month free trial via a 4-step web signup whose Step 2 requires a phone number; checkout step (\"before you enter your payment information\") not reached",
   "notes": "web checkout only; phone required before payment step"
  },
  {
   "t": "08:36",
   "cap": "cap-01",
   "capability": "Create and send an invoice",
   "task": "Create and send an invoice in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-02",
   "capability": "Accept online invoice payments",
   "task": "Accept online invoice payments in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-03",
   "capability": "Send a quote",
   "task": "Send a quote in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-04",
   "capability": "Enter a bill",
   "task": "Enter a bill in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-05",
   "capability": "Make an online bill payment",
   "task": "Make an online bill payment in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-06",
   "capability": "Bank feed / bank transactions",
   "task": "Bank feed / bank transactions in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-07",
   "capability": "Financial reports",
   "task": "Financial reports in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-08",
   "capability": "Cash flow forecast",
   "task": "Cash flow forecast in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cap-09",
   "capability": "Create a contact",
   "task": "Create a contact in our own org",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Xero account: both sign-up forms (trial and developer) require a phone number",
   "notes": "not reachable without an account"
  },
  {
   "t": "08:36",
   "cap": "cancel",
   "capability": "Cancel plan",
   "task": "Cancel trial/plan",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "no plan started",
   "notes": "n/a"
  },
  {
   "t": "08:36",
   "cap": "delete",
   "capability": "Delete account",
   "task": "Delete account and data",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "no account created",
   "notes": "n/a"
  }
 ],
 "stale": false,
 "icon": "/logos/xero.png",
 "monitored": false,
 "verdict": "Needs a person to sign up: L1 · Needs a person. Our agent stopped at sign-up, where both the free trial and the free developer login ask for a phone number, and it had none. With no account, it never reached verification, an OAuth client, or a first call: a plain GET to the organisation endpoint returned an authentication error with no credentials attached. It never saw a plan, a payment step or a delete option. Once a person signs up and makes an OAuth client, Xero offers an official MCP server, a CLI and OpenAPI docs, plus a Demo Company for testing without a live org.",
 "page": "https://agentdrives.com/tools/xero?via=api"
}