{"id":"d4c9ea1a-a443-4856-9af9-cac0b146ffda","entityType":"agent","slug":"clawhub-xeroapi-xero-command-line","name":"Official Xero skill","canonicalUrl":"https://www.xpersona.co/agent/clawhub-xeroapi-xero-command-line","canonicalPath":"/agent/clawhub-xeroapi-xero-command-line","generatedAt":"2026-10-10T21:41:24.893Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:04:13.291Z","emptyReason":null},"description":"Interact with the Xero accounting API using the `xero` CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17dq8hcd2z58frqmav5j4z6e986grtt:xero-command-line","sourceUrl":"https://clawhub.ai/xeroapi/xero-command-line","homepage":"https://clawhub.ai/xeroapi/skills/xero-command-line","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/xeroapi/xero-command-line","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/xeroapi/skills/xero-command-line","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Official Xero skill technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:04:13.291Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:04:13.291Z","emptyReason":null},"stars":null,"forks":null,"downloads":1347,"packageName":null,"latestVersion":"0.0.6","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:04:13.290Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T16:04:13.291Z","lastCrawledAt":"2026-10-10T16:04:13.290Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T16:04:13.290Z","lastVerifiedAt":null,"highlights":[{"version":"0.0.6","createdAt":"2026-05-25T02:14:59.482Z","changelog":"Version 0.0.6 - Added detailed documentation for Linux, WSL, and SSH token storage and related environment variables. - Warns users when XERO_PROFILE, XERO_CLIENT_ID, XERO_KEY_STORAGE, XERO_KEYRING_FILE_BACKUP, or XERO_TOKEN_PASSPHRASE are set, as these may impact security or profile selection. - Introduced the `--toon` output format option for commands, providing a compact, LLM-friendly encoding for improved efficiency when parsing results. - Revised recommendations for output formats: prefer `--toon` for agent processing, `--json` when explicitly needed, and table output for user-facing messages. - Clarified environment variable usage and added explicit checks and warnings to prevent accidental misconfiguration.","fileCount":3,"zipByteSize":7092},{"version":"0.0.4","createdAt":"2026-05-18T00:30:58.300Z","changelog":"**This release clarifies OAuth login behavior, especially for scope errors, and documents the new override for custom OAuth scopes.** - Added guidance for resolving OAuth login failures, especially `unauthorized_client` or scope-related errors. - Documented the `xero login --scope` flag and usage of the `XERO_SCOPES` environment variable for custom API scopes. - Explained required OAuth scopes and their handling after Xero’s March 2026 scope migration. - Noted that older/deprecated broad scopes may still be available and how to request them when needed. - No functional changes to commands or flag usage; documentation updates only.","fileCount":2,"zipByteSize":4783},{"version":"0.0.3","createdAt":"2026-05-11T21:45:10.705Z","changelog":"**v0.0.3 introduces mandatory safety and verification steps for all commands** - Now requires explicit verification of active profile and Xero organisation before executing any commands. - Enforces confirmation steps before all write operations (create, update, delete), including summarizing changes and waiting for user approval. - Adds detailed warnings about the use of environment variables that may override profiles. - Documentation now includes strict workflow guidance to prevent accidental changes in the wrong organisation. - Minor: Currencies management added to the list of supported resources in the description.","fileCount":2,"zipByteSize":4169},{"version":"0.0.1","createdAt":"2026-03-26T03:27:26.382Z","changelog":"Initial release of xero-command-line - Provides a command-line interface (`xero` CLI) to interact with the Xero accounting API. - Supports managing contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, tax rates, reports, and organisation details. - Includes authentication and profile management via PKCE OAuth flow (requires user to run `xero login` manually). - Allows data input via JSON files for complex records. - Offers flexible output options: JSON, CSV, or standard table. - Detailed documentation for key commands, parameters, and workflows included.","fileCount":2,"zipByteSize":3278}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17dq8hcd2z58frqmav5j4z6e986grtt:xero-command-line","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17dq8hcd2z58frqmav5j4z6e986grtt:xero-command-line` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/xeroapi/xero-command-line before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T21:41:24.893Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xeroapi-xero-command-line/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:04:13.291Z","emptyReason":null},"readme":"Skill: Official Xero skill\n\nOwner: xeroapi\n\nSummary: Interact with the Xero accounting API using the `xero` CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual...\n\nTags: latest:0.0.6\n\nVersion history:\n\nv0.0.6 | 2026-05-25T02:14:59.482Z | user\n\nVersion 0.0.6\n\n- Added detailed documentation for Linux, WSL, and SSH token storage and related environment variables.\n- Warns users when XERO_PROFILE, XERO_CLIENT_ID, XERO_KEY_STORAGE, XERO_KEYRING_FILE_BACKUP, or XERO_TOKEN_PASSPHRASE are set, as these may impact security or profile selection.\n- Introduced the `--toon` output format option for commands, providing a compact, LLM-friendly encoding for improved efficiency when parsing results.\n- Revised recommendations for output formats: prefer `--toon` for agent processing, `--json` when explicitly needed, and table output for user-facing messages.\n- Clarified environment variable usage and added explicit checks and warnings to prevent accidental misconfiguration.\n\nv0.0.4 | 2026-05-18T00:30:58.300Z | user\n\n**This release clarifies OAuth login behavior, especially for scope errors, and documents the new override for custom OAuth scopes.**\n\n- Added guidance for resolving OAuth login failures, especially `unauthorized_client` or scope-related errors.\n- Documented the `xero login --scope` flag and usage of the `XERO_SCOPES` environment variable for custom API scopes.\n- Explained required OAuth scopes and their handling after Xero’s March 2026 scope migration.\n- Noted that older/deprecated broad scopes may still be available and how to request them when needed.\n- No functional changes to commands or flag usage; documentation updates only.\n\nv0.0.3 | 2026-05-11T21:45:10.705Z | user\n\n**v0.0.3 introduces mandatory safety and verification steps for all commands**\n\n- Now requires explicit verification of active profile and Xero organisation before executing any commands.\n- Enforces confirmation steps before all write operations (create, update, delete), including summarizing changes and waiting for user approval.\n- Adds detailed warnings about the use of environment variables that may override profiles.\n- Documentation now includes strict workflow guidance to prevent accidental changes in the wrong organisation.\n- Minor: Currencies management added to the list of supported resources in the description.\n\nv0.0.1 | 2026-03-26T03:27:26.382Z | auto\n\nInitial release of xero-command-line\n\n- Provides a command-line interface (`xero` CLI) to interact with the Xero accounting API.\n- Supports managing contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, tax rates, reports, and organisation details.\n- Includes authentication and profile management via PKCE OAuth flow (requires user to run `xero login` manually).\n- Allows data input via JSON files for complex records.\n- Offers flexible output options: JSON, CSV, or standard table.\n- Detailed documentation for key commands, parameters, and workflows included.\n\nArchive index:\n\nArchive v0.0.6: 3 files, 7092 bytes\n\nFiles: skill-card.md (2593b), SKILL.md (14891b), _meta.json (136b)\n\nFile v0.0.6:SKILL.md\n\n---\nname: xero_command_line\ndescription: Interact with the Xero accounting API using the `xero` CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, currencies, tax rates, reports, and organisation details.\nuser-invocable: true\nmetadata:\n  openclaw:\n    source: \"https://github.com/XeroAPI/xero-command-line\"\n    homepage: \"https://github.com/XeroAPI/xero-command-line#readme\"\n    requires:\n      bins:\n        - xero\n      install: \"npm install -g @xeroapi/xero-command-line\"\n    keywords:\n      - accounting\n      - xero\n      - invoices\n      - bookkeeping\n      - finance\n---\n\n# xero CLI\n\nYou have access to the `xero` CLI — a command-line tool for the Xero accounting API using PKCE OAuth. Use it to read and write accounting data in the user's Xero organisation.\n\n## Authentication & Setup\n\n**Note for Agent:** If the user is not logged in, you must instruct them to run `xero login` in their terminal manually, as it requires a browser-based OAuth flow that you cannot complete. If login fails with `unauthorized_client` or scope-related errors — common for new Xero apps after the March 2026 scope migration, or when the app only grants read scopes — instruct them to re-login with `--scope` listing only the scopes enabled on their app (see [OAuth scopes](#oauth-scopes) below).\n\n```bash\n# Check if logged in / check organization details\nxero org details\n```\n\n### Token storage (Linux / WSL / SSH)\n\nTokens are encrypted in `~/.config/xero-command-line/tokens.json`. By default the encryption key lives **only** in the OS keychain (on Linux: GNOME Keyring / Secret Service over D-Bus). A file copy is **not** written unless the user opts in.\n\n**If the user is on WSL, SSH, or a headless VM** and sees an encryption-key error after a successful `xero login`:\n\n1. **Prefer fixing the keychain:** `sudo apt install gnome-keyring libsecret-tools dbus-x11`, start `gnome-keyring-daemon`, then `xero login` again.\n2. **Flaky keychain** (login OK, next command fails): `export XERO_KEYRING_FILE_BACKUP=1` before `xero login` — mirrors the key to `~/.config/xero-command-line/.encryption-key` (0600) for later reads. Opt-in; weaker than keychain-only.\n3. **No keychain:** `export XERO_KEY_STORAGE=file` before `xero login`.\n4. **Stronger file-based option:** `export XERO_TOKEN_PASSPHRASE='…'` (same value every session) — scrypt-derived key, not stored in plaintext.\n\nWarn if `XERO_PROFILE`, `XERO_CLIENT_ID`, `XERO_KEY_STORAGE`, `XERO_KEYRING_FILE_BACKUP`, or `XERO_TOKEN_PASSPHRASE` are set — they change profile or how keys are stored. Check with `echo $XERO_PROFILE $XERO_CLIENT_ID $XERO_KEY_STORAGE $XERO_KEYRING_FILE_BACKUP`.\n\nThe CLI does **not** wipe `tokens.json` when decryption fails; instruct re-login only after the user confirms.\n\n## IMPORTANT: Profile and identity verification\n\nBefore executing **any** commands (including read-only operations), you **must** verify which Xero organisation is active:\n\n1. **Always run `xero org details` at the start of a session** and display the organisation name to the user before executing any other commands. Do not proceed until the user confirms this is the correct org.\n2. **Use `-p <profile>` explicitly** when the user has specified or confirmed which profile/org to use. Do not silently rely on the default profile or environment variables without confirmation.\n3. **Warn the user if `XERO_PROFILE` or `XERO_CLIENT_ID` environment variables are set**, as these silently override the default profile and may connect to an unintended organisation. Check with `echo $XERO_PROFILE $XERO_CLIENT_ID` if in doubt.\n4. **Never switch profiles or call `xero profile set-default`** without explicit user instruction. Changing the default profile affects all subsequent commands and other tools sharing the same config.\n\n## IMPORTANT: Safety rules for write operations\n\nAny command that **creates, updates, or deletes** data (invoices, contacts, payments, bank transactions, manual journals, credit notes, quotes, items, tracking categories) is a write operation. Before executing a write operation you **must** follow these steps:\n\n1. **Confirm the active profile and organisation.** Run `xero org details` and show the user which organisation will be affected. Never assume the correct org is active.\n2. **Use read-only commands first** to verify IDs and details (e.g. list contacts, invoices, accounts) before referencing them in a write.\n3. **Show the user a summary** of what will be written — include the resource type, key fields, and target organisation — then **wait for explicit user approval** before executing the write command.\n4. **Do not proceed** with the write unless the user confirms. A simple \"yes\" or \"go ahead\" is sufficient, but silence or ambiguity is not approval.\n\nThese rules apply regardless of whether the write is performed via inline flags or `--file`. They exist to prevent accidental creation or modification of financial records in the wrong organisation.\n\n## Global flags\n\nEvery API command supports these flags:\n\n| Flag | Description |\n|---|---|\n| `-p, --profile <name>` | Use a specific named profile (defaults to the default profile) |\n| `--client-id <id>` | Override the profile with an inline OAuth client ID |\n| `--json` | Output raw JSON (useful for piping to `jq` or further processing) |\n| `--csv` | Output as CSV |\n| `--toon` | Output as [TOON](https://github.com/toon-format/toon) (Token Oriented Object Notation) |\n\nEnvironment variables `XERO_PROFILE`, `XERO_CLIENT_ID`, `XERO_KEY_STORAGE`, `XERO_KEYRING_FILE_BACKUP`, and `XERO_TOKEN_PASSPHRASE` are also recognised. The `xero login` command additionally accepts `XERO_SCOPES`. See [Token storage (Linux / WSL / SSH)](#token-storage-linux--wsl--ssh).\n\n### Output format for agents\n\nWhen you run **read/list commands** and need to parse the results yourself, prefer **`--toon`** over the default table, `--json`, or `--csv`. TOON (Token Oriented Object Notation) is a compact, LLM-friendly encoding — typically far fewer tokens than JSON — so it uses the context window and processing budget more efficiently.\n\nUse `--json` only when the user explicitly needs JSON (e.g. piping to `jq`) or a tool requires it. Use the default table when presenting human-readable output to the user in chat.\n\n```bash\nxero contacts list --search \"Acme\" --toon\nxero invoices list --toon\nxero accounts list --toon\n```\n\n## OAuth scopes\n\nBy default, `xero login` requests broad read/write scopes. Override with `--scope` (space-separated API scopes) or `XERO_SCOPES` when the user's Xero wants to grant a narrower set — e.g. read-only dashboards. \n\nAPI credentials created before Xero's March 2026 scope changes where deprecated broader scopes like `accounting.transactions` and `accounting.reports` are available until September 2027 may request those scopes via the `--scope` override as well. `xero login` will request the granular scopes that replaced these deprecated broader scopes by default.\n\nRequired scopes (`openid`, `profile`, `email`, `offline_access`) are prepended automatically. Users only pass Xero API scopes. Re-login is required after changing scopes.\n\n```bash\n# Read-only example (adjust to match scopes enabled on the user's app)\nxero login --scope \"accounting.contacts.read accounting.settings.read accounting.invoices.read accounting.payments.read accounting.banktransactions.read accounting.manualjournals.read accounting.reports.balancesheet.read accounting.reports.profitandloss.read accounting.reports.trialbalance.read accounting.reports.aged.read accounting.budgets.read accounting.attachments.read\"\n\n# Or via environment variable\nXERO_SCOPES=\"accounting.invoices.read accounting.contacts.read\" xero login\n```\n\n## Auth & profiles\n\n```bash\n# Log in (opens browser for OAuth consent)\nxero login\nxero login -p my-profile\nxero login --scope \"accounting.contacts.read accounting.invoices.read\"\n\n# Log out\nxero logout\n\n# Manage profiles (each profile maps to a Xero OAuth app / organisation)\nxero profile add <name>                    # prompts for Client ID\nxero profile add <name> --client-id <id>   # inline\nxero profile list\nxero profile set-default <name>\nxero profile remove <name>\n```\n\n## Key workflow: find IDs first\n\nMost create/update commands need Xero GUIDs. Always list first to find IDs:\n\n```bash\nxero contacts list --search \"Acme\"    # find a contact ID\nxero accounts list                    # find account codes\nxero invoices list                    # find invoice IDs\nxero items list                       # find item codes\n```\n\n## JSON file input\n\nAny create or update command accepts `--file <path.json>` instead of inline flags. Use this for multi-line-item resources. All inputs are validated before being sent to the API.\n\n```bash\nxero invoices create --file invoice.json\nxero contacts update --file contact-update.json\n```\n\n## Commands\n\n### Contacts\n\n```bash\nxero contacts list\nxero contacts list --search \"Acme\" --page 2\nxero contacts create --name \"Acme Corp\" --email acme@example.com --phone \"+1234567890\"\nxero contacts create --file contact.json\nxero contacts update --contact-id <ID> --name \"Acme Corporation\" --email new@acme.com\nxero contacts update --file contact-update.json\n```\n\n### Contact Groups\n\n```bash\nxero contact-groups list\nxero contact-groups list --group-id <ID>\n```\n\n### Accounts\n\n```bash\nxero accounts list\nxero accounts list --json\n```\n\n### Invoices\n\n```bash\nxero invoices list\nxero invoices list --contact-id <ID>\nxero invoices list --invoice-number INV-0001\nxero invoices list --page 2\n\n# Single line item inline\nxero invoices create --contact-id <ID> --type ACCREC \\\n  --description \"Consulting\" --quantity 10 --unit-amount 150 \\\n  --account-code 200 --tax-type OUTPUT2\n\n# Multiple line items via JSON file\nxero invoices create --file invoice.json\n\n# Update a draft invoice\nxero invoices update --invoice-id <ID> --reference \"Updated ref\"\nxero invoices update --file invoice-update.json\n```\n\nInvoice types: `ACCREC` (sales/receivable), `ACCPAY` (purchase/payable).\n\nExample invoice.json:\n```json\n{\n  \"contactId\": \"<CONTACT_ID>\",\n  \"type\": \"ACCREC\",\n  \"date\": \"2025-06-15\",\n  \"reference\": \"REF-001\",\n  \"lineItems\": [\n    {\n      \"description\": \"Consulting\",\n      \"quantity\": 10,\n      \"unitAmount\": 150,\n      \"accountCode\": \"200\",\n      \"taxType\": \"OUTPUT2\"\n    }\n  ]\n}\n```\n\n### Quotes\n\n```bash\nxero quotes list\nxero quotes list --contact-id <ID>\nxero quotes list --quote-number QU-0001\n\nxero quotes create --contact-id <ID> --title \"Project Quote\" \\\n  --date 2025-12-30 --description \"Web design\" --quantity 1 --unit-amount 5000 \\\n  --account-code 200 --tax-type OUTPUT2\nxero quotes create --file quote.json\n\nxero quotes update --file quote-update.json\n```\n\n> **Note:** Xero's API requires `contact` and `date` on quote updates even though the CLI allows them to be omitted. If you get a validation error, ensure your update payload includes both fields.\n\n### Credit Notes\n\n```bash\nxero credit-notes list\nxero credit-notes list --contact-id <ID> --page 2\n\nxero credit-notes create --contact-id <ID> \\\n  --description \"Refund\" --quantity 1 --unit-amount 100 \\\n  --account-code 200 --tax-type OUTPUT2\nxero credit-notes create --file credit-note.json\n\nxero credit-notes update --file credit-note-update.json\n```\n\n### Manual Journals\n\nManual journals require at least two journal lines (debit + credit). Always use `--file`.\n\n```bash\nxero manual-journals list\nxero manual-journals list --manual-journal-id <ID>\nxero manual-journals list --modified-after 2025-01-01\n\nxero manual-journals create --file journal.json\nxero manual-journals update --file journal-update.json\n```\n\nExample journal.json:\n```json\n{\n  \"narration\": \"Reclassify office supplies\",\n  \"manualJournalLines\": [\n    { \"accountCode\": \"200\", \"lineAmount\": 100, \"description\": \"Debit\" },\n    { \"accountCode\": \"400\", \"lineAmount\": -100, \"description\": \"Credit\" }\n  ]\n}\n```\n\n### Bank Transactions\n\n```bash\nxero bank-transactions list\nxero bank-transactions list --bank-account-id <ID>\n\nxero bank-transactions create --type SPEND --bank-account-id <BANK_ID> \\\n  --contact-id <CONTACT_ID> --description \"Office supplies\" \\\n  --quantity 1 --unit-amount 50 --account-code 429 --tax-type INPUT2\nxero bank-transactions create --file bank-transaction.json\n\nxero bank-transactions update --file bank-transaction-update.json\n```\n\nTransaction types: `RECEIVE` (money in), `SPEND` (money out).\n\n### Payments\n\n```bash\nxero payments list\nxero payments list --invoice-id <ID>\nxero payments list --invoice-number INV-0001\nxero payments list --reference \"Payment ref\"\n\nxero payments create --invoice-id <ID> --account-id <ACCOUNT_ID> --amount 500\nxero payments create --file payment.json\n```\n\n### Items\n\n```bash\nxero items list\nxero items list --page 2\n\nxero items create --code WIDGET --name \"Widget\" --sale-price 29.99\nxero items create --file item.json\n\nxero items update --item-id <ID> --code WIDGET --name \"Updated Widget\"\nxero items update --file item-update.json\n```\n\n### Currencies\n\n```bash\nxero currencies list\nxero currencies list --json\n```\n\n### Tax Rates\n\n```bash\nxero tax-rates list\nxero tax-rates list --json\n```\n\n### Tracking Categories & Options\n\n```bash\nxero tracking categories list\nxero tracking categories list --include-archived\n\nxero tracking categories create --name \"Department\"\nxero tracking categories update --category-id <ID> --name \"Region\"\nxero tracking categories update --category-id <ID> --status ARCHIVED\n\nxero tracking options create --category-id <ID> --names \"Sales,Marketing,Engineering\"\nxero tracking options update --category-id <ID> --file tracking-options.json\n```\n\n### Organisation\n\n```bash\nxero org details\nxero org details --json\n```\n\n### Reports\n\n```bash\n# Trial balance\nxero reports trial-balance\nxero reports trial-balance --date 2025-12-31\n\n# Profit and loss\nxero reports profit-and-loss\nxero reports profit-and-loss --from 2025-01-01 --to 2025-12-31\nxero reports profit-and-loss --timeframe QUARTER --periods 4\n\n# Balance sheet\nxero reports balance-sheet\nxero reports balance-sheet --date 2025-12-31\nxero reports balance-sheet --timeframe MONTH --periods 12\n\n# Aged receivables (requires contact ID)\nxero reports aged-receivables --contact-id <ID>\nxero reports aged-receivables --contact-id <ID> --report-date 2025-12-31\n\n# Aged payables (requires contact ID)\nxero reports aged-payables --contact-id <ID>\nxero reports aged-payables --contact-id <ID> --from-date 2025-01-01 --to-date 2025-12-31\n```\n\n## Tips\n\n- Use `--json` and pipe to `jq` when you need to extract specific fields programmatically.\n- Only draft invoices, quotes, and credit notes can be updated.\n- For multi-line-item creates, always use `--file` with a JSON payload.\n- Tax types vary by region. Run `xero tax-rates list` to see what's available.\n- Account codes are needed for line items. Run `xero accounts list` to find them.\n\nFile v0.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn749n1k0dbn5c4nq6g1f9kn2x83mmvf\",\n  \"slug\": \"xero-command-line\",\n  \"version\": \"0.0.6\",\n  \"publishedAt\": 1779675299482\n}\n\nFile v0.0.6:skill-card.md\n\n## Description:\n\nInteract with the Xero accounting API using the `xero` CLI tool to manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, currencies, tax rates, reports, and organisation details.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[xeroapi](https://clawhub.ai/user/xeroapi)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and finance operations users can use this skill to guide an agent in running the Xero CLI for accounting workflows, including reading organisation data and preparing approved changes to financial records.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The CLI can access financial data in a Xero organisation.\n\nMitigation: Use read-only scopes when possible and confirm the active organisation/profile before any command.\n\nRisk: Write commands can create or change accounting records.\n\nMitigation: Review IDs and target records with read-only commands first, then require explicit user approval before each write.\n\nRisk: Token storage settings can weaken credential protection on Linux, WSL, SSH, or headless systems.\n\nMitigation: Prefer OS keychain storage, treat file-based fallback and passphrase settings as sensitive, and review relevant environment variables before use.\n\nRisk: Global npm installation affects the user's local toolchain.\n\nMitigation: Review the npm install command before running it and install only when the user intends to use the Xero CLI.\n\n## Reference(s):\n\n- [Xero command line homepage](https://github.com/XeroAPI/xero-command-line#readme)\n- [Xero command line source](https://github.com/XeroAPI/xero-command-line)\n- [TOON format](https://github.com/toon-format/toon)\n- [ClawHub skill page](https://clawhub.ai/xeroapi/skills/xero-command-line)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON payload snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Guides agents to prefer TOON for parsing CLI read/list results, JSON when explicitly needed, and tables for user-facing summaries.]\n\n## Skill Version(s):\n\n0.0.6 (source: server release metadata, created 2026-05-25)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v0.0.4: 2 files, 4783 bytes\n\nFiles: SKILL.md (12607b), _meta.json (136b)\n\nFile v0.0.4:SKILL.md\n\n---\nname: xero_command_line\ndescription: Interact with the Xero accounting API using the `xero` CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, currencies, tax rates, reports, and organisation details.\nuser-invocable: true\nmetadata:\n  openclaw:\n    source: \"https://github.com/XeroAPI/xero-command-line\"\n    homepage: \"https://github.com/XeroAPI/xero-command-line#readme\"\n    requires:\n      bins:\n        - xero\n      install: \"npm install -g @xeroapi/xero-command-line\"\n    keywords:\n      - accounting\n      - xero\n      - invoices\n      - bookkeeping\n      - finance\n---\n\n# xero CLI\n\nYou have access to the `xero` CLI — a command-line tool for the Xero accounting API using PKCE OAuth. Use it to read and write accounting data in the user's Xero organisation.\n\n## Authentication & Setup\n\n**Note for Agent:** If the user is not logged in, you must instruct them to run `xero login` in their terminal manually, as it requires a browser-based OAuth flow that you cannot complete. If login fails with `unauthorized_client` or scope-related errors — common for new Xero apps after the March 2026 scope migration, or when the app only grants read scopes — instruct them to re-login with `--scope` listing only the scopes enabled on their app (see [OAuth scopes](#oauth-scopes) below).\n\n```bash\n# Check if logged in / check organization details\nxero org details\n```\n\n## IMPORTANT: Profile and identity verification\n\nBefore executing **any** commands (including read-only operations), you **must** verify which Xero organisation is active:\n\n1. **Always run `xero org details` at the start of a session** and display the organisation name to the user before executing any other commands. Do not proceed until the user confirms this is the correct org.\n2. **Use `-p <profile>` explicitly** when the user has specified or confirmed which profile/org to use. Do not silently rely on the default profile or environment variables without confirmation.\n3. **Warn the user if `XERO_PROFILE` or `XERO_CLIENT_ID` environment variables are set**, as these silently override the default profile and may connect to an unintended organisation. Check with `echo $XERO_PROFILE $XERO_CLIENT_ID` if in doubt.\n4. **Never switch profiles or call `xero profile set-default`** without explicit user instruction. Changing the default profile affects all subsequent commands and other tools sharing the same config.\n\n## IMPORTANT: Safety rules for write operations\n\nAny command that **creates, updates, or deletes** data (invoices, contacts, payments, bank transactions, manual journals, credit notes, quotes, items, tracking categories) is a write operation. Before executing a write operation you **must** follow these steps:\n\n1. **Confirm the active profile and organisation.** Run `xero org details` and show the user which organisation will be affected. Never assume the correct org is active.\n2. **Use read-only commands first** to verify IDs and details (e.g. list contacts, invoices, accounts) before referencing them in a write.\n3. **Show the user a summary** of what will be written — include the resource type, key fields, and target organisation — then **wait for explicit user approval** before executing the write command.\n4. **Do not proceed** with the write unless the user confirms. A simple \"yes\" or \"go ahead\" is sufficient, but silence or ambiguity is not approval.\n\nThese rules apply regardless of whether the write is performed via inline flags or `--file`. They exist to prevent accidental creation or modification of financial records in the wrong organisation.\n\n## Global flags\n\nEvery API command supports these flags:\n\n| Flag | Description |\n|---|---|\n| `-p, --profile <name>` | Use a specific named profile (defaults to the default profile) |\n| `--client-id <id>` | Override the profile with an inline OAuth client ID |\n| `--json` | Output raw JSON (useful for piping to `jq` or further processing) |\n| `--csv` | Output as CSV |\n\nEnvironment variables `XERO_PROFILE` and `XERO_CLIENT_ID` are also recognised. The `xero login` command additionally accepts `XERO_SCOPES`.\n\n## OAuth scopes\n\nBy default, `xero login` requests broad read/write scopes. Override with `--scope` (space-separated API scopes) or `XERO_SCOPES` when the user's Xero wants to grant a narrower set — e.g. read-only dashboards. \n\nAPI credentials created before Xero's March 2026 scope changes where deprecated broader scopes like `accounting.transactions` and `accounting.reports` are available until September 2027 may request those scopes via the `--scope` override as well. `xero login` will request the granular scopes that replaced these deprecated broader scopes by default.\n\nRequired scopes (`openid`, `profile`, `email`, `offline_access`) are prepended automatically. Users only pass Xero API scopes. Re-login is required after changing scopes.\n\n```bash\n# Read-only example (adjust to match scopes enabled on the user's app)\nxero login --scope \"accounting.contacts.read accounting.settings.read accounting.invoices.read accounting.payments.read accounting.banktransactions.read accounting.manualjournals.read accounting.reports.balancesheet.read accounting.reports.profitandloss.read accounting.reports.trialbalance.read accounting.reports.aged.read accounting.budgets.read accounting.attachments.read\"\n\n# Or via environment variable\nXERO_SCOPES=\"accounting.invoices.read accounting.contacts.read\" xero login\n```\n\n## Auth & profiles\n\n```bash\n# Log in (opens browser for OAuth consent)\nxero login\nxero login -p my-profile\nxero login --scope \"accounting.contacts.read accounting.invoices.read\"\n\n# Log out\nxero logout\n\n# Manage profiles (each profile maps to a Xero OAuth app / organisation)\nxero profile add <name>                    # prompts for Client ID\nxero profile add <name> --client-id <id>   # inline\nxero profile list\nxero profile set-default <name>\nxero profile remove <name>\n```\n\n## Key workflow: find IDs first\n\nMost create/update commands need Xero GUIDs. Always list first to find IDs:\n\n```bash\nxero contacts list --search \"Acme\"    # find a contact ID\nxero accounts list                    # find account codes\nxero invoices list                    # find invoice IDs\nxero items list                       # find item codes\n```\n\n## JSON file input\n\nAny create or update command accepts `--file <path.json>` instead of inline flags. Use this for multi-line-item resources. All inputs are validated before being sent to the API.\n\n```bash\nxero invoices create --file invoice.json\nxero contacts update --file contact-update.json\n```\n\n## Commands\n\n### Contacts\n\n```bash\nxero contacts list\nxero contacts list --search \"Acme\" --page 2\nxero contacts create --name \"Acme Corp\" --email acme@example.com --phone \"+1234567890\"\nxero contacts create --file contact.json\nxero contacts update --contact-id <ID> --name \"Acme Corporation\" --email new@acme.com\nxero contacts update --file contact-update.json\n```\n\n### Contact Groups\n\n```bash\nxero contact-groups list\nxero contact-groups list --group-id <ID>\n```\n\n### Accounts\n\n```bash\nxero accounts list\nxero accounts list --json\n```\n\n### Invoices\n\n```bash\nxero invoices list\nxero invoices list --contact-id <ID>\nxero invoices list --invoice-number INV-0001\nxero invoices list --page 2\n\n# Single line item inline\nxero invoices create --contact-id <ID> --type ACCREC \\\n  --description \"Consulting\" --quantity 10 --unit-amount 150 \\\n  --account-code 200 --tax-type OUTPUT2\n\n# Multiple line items via JSON file\nxero invoices create --file invoice.json\n\n# Update a draft invoice\nxero invoices update --invoice-id <ID> --reference \"Updated ref\"\nxero invoices update --file invoice-update.json\n```\n\nInvoice types: `ACCREC` (sales/receivable), `ACCPAY` (purchase/payable).\n\nExample invoice.json:\n```json\n{\n  \"contactId\": \"<CONTACT_ID>\",\n  \"type\": \"ACCREC\",\n  \"date\": \"2025-06-15\",\n  \"reference\": \"REF-001\",\n  \"lineItems\": [\n    {\n      \"description\": \"Consulting\",\n      \"quantity\": 10,\n      \"unitAmount\": 150,\n      \"accountCode\": \"200\",\n      \"taxType\": \"OUTPUT2\"\n    }\n  ]\n}\n```\n\n### Quotes\n\n```bash\nxero quotes list\nxero quotes list --contact-id <ID>\nxero quotes list --quote-number QU-0001\n\nxero quotes create --contact-id <ID> --title \"Project Quote\" \\\n  --date 2025-12-30 --description \"Web design\" --quantity 1 --unit-amount 5000 \\\n  --account-code 200 --tax-type OUTPUT2\nxero quotes create --file quote.json\n\nxero quotes update --file quote-update.json\n```\n\n> **Note:** Xero's API requires `contact` and `date` on quote updates even though the CLI allows them to be omitted. If you get a validation error, ensure your update payload includes both fields.\n\n### Credit Notes\n\n```bash\nxero credit-notes list\nxero credit-notes list --contact-id <ID> --page 2\n\nxero credit-notes create --contact-id <ID> \\\n  --description \"Refund\" --quantity 1 --unit-amount 100 \\\n  --account-code 200 --tax-type OUTPUT2\nxero credit-notes create --file credit-note.json\n\nxero credit-notes update --file credit-note-update.json\n```\n\n### Manual Journals\n\nManual journals require at least two journal lines (debit + credit). Always use `--file`.\n\n```bash\nxero manual-journals list\nxero manual-journals list --manual-journal-id <ID>\nxero manual-journals list --modified-after 2025-01-01\n\nxero manual-journals create --file journal.json\nxero manual-journals update --file journal-update.json\n```\n\nExample journal.json:\n```json\n{\n  \"narration\": \"Reclassify office supplies\",\n  \"manualJournalLines\": [\n    { \"accountCode\": \"200\", \"lineAmount\": 100, \"description\": \"Debit\" },\n    { \"accountCode\": \"400\", \"lineAmount\": -100, \"description\": \"Credit\" }\n  ]\n}\n```\n\n### Bank Transactions\n\n```bash\nxero bank-transactions list\nxero bank-transactions list --bank-account-id <ID>\n\nxero bank-transactions create --type SPEND --bank-account-id <BANK_ID> \\\n  --contact-id <CONTACT_ID> --description \"Office supplies\" \\\n  --quantity 1 --unit-amount 50 --account-code 429 --tax-type INPUT2\nxero bank-transactions create --file bank-transaction.json\n\nxero bank-transactions update --file bank-transaction-update.json\n```\n\nTransaction types: `RECEIVE` (money in), `SPEND` (money out).\n\n### Payments\n\n```bash\nxero payments list\nxero payments list --invoice-id <ID>\nxero payments list --invoice-number INV-0001\nxero payments list --reference \"Payment ref\"\n\nxero payments create --invoice-id <ID> --account-id <ACCOUNT_ID> --amount 500\nxero payments create --file payment.json\n```\n\n### Items\n\n```bash\nxero items list\nxero items list --page 2\n\nxero items create --code WIDGET --name \"Widget\" --sale-price 29.99\nxero items create --file item.json\n\nxero items update --item-id <ID> --code WIDGET --name \"Updated Widget\"\nxero items update --file item-update.json\n```\n\n### Currencies\n\n```bash\nxero currencies list\nxero currencies list --json\n```\n\n### Tax Rates\n\n```bash\nxero tax-rates list\nxero tax-rates list --json\n```\n\n### Tracking Categories & Options\n\n```bash\nxero tracking categories list\nxero tracking categories list --include-archived\n\nxero tracking categories create --name \"Department\"\nxero tracking categories update --category-id <ID> --name \"Region\"\nxero tracking categories update --category-id <ID> --status ARCHIVED\n\nxero tracking options create --category-id <ID> --names \"Sales,Marketing,Engineering\"\nxero tracking options update --category-id <ID> --file tracking-options.json\n```\n\n### Organisation\n\n```bash\nxero org details\nxero org details --json\n```\n\n### Reports\n\n```bash\n# Trial balance\nxero reports trial-balance\nxero reports trial-balance --date 2025-12-31\n\n# Profit and loss\nxero reports profit-and-loss\nxero reports profit-and-loss --from 2025-01-01 --to 2025-12-31\nxero reports profit-and-loss --timeframe QUARTER --periods 4\n\n# Balance sheet\nxero reports balance-sheet\nxero reports balance-sheet --date 2025-12-31\nxero reports balance-sheet --timeframe MONTH --periods 12\n\n# Aged receivables (requires contact ID)\nxero reports aged-receivables --contact-id <ID>\nxero reports aged-receivables --contact-id <ID> --report-date 2025-12-31\n\n# Aged payables (requires contact ID)\nxero reports aged-payables --contact-id <ID>\nxero reports aged-payables --contact-id <ID> --from-date 2025-01-01 --to-date 2025-12-31\n```\n\n## Tips\n\n- Use `--json` and pipe to `jq` when you need to extract specific fields programmatically.\n- Only draft invoices, quotes, and credit notes can be updated.\n- For multi-line-item creates, always use `--file` with a JSON payload.\n- Tax types vary by region. Run `xero tax-rates list` to see what's available.\n- Account codes are needed for line items. Run `xero accounts list` to find them.\n\nFile v0.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn749n1k0dbn5c4nq6g1f9kn2x83mmvf\",\n  \"slug\": \"xero-command-line\",\n  \"version\": \"0.0.4\",\n  \"publishedAt\": 1779064258300\n}\n\nArchive v0.0.3: 2 files, 4169 bytes\n\nFiles: SKILL.md (10847b), _meta.json (136b)\n\nFile v0.0.3:SKILL.md\n\n---\nname: xero_command_line\ndescription: Interact with the Xero accounting API using the `xero` CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, currencies, tax rates, reports, and organisation details.\nuser-invocable: true\nmetadata:\n  openclaw:\n    source: \"https://github.com/XeroAPI/xero-command-line\"\n    homepage: \"https://github.com/XeroAPI/xero-command-line#readme\"\n    requires:\n      bins:\n        - xero\n      install: \"npm install -g @xeroapi/xero-command-line\"\n    keywords:\n      - accounting\n      - xero\n      - invoices\n      - bookkeeping\n      - finance\n---\n\n# xero CLI\n\nYou have access to the `xero` CLI — a command-line tool for the Xero accounting API using PKCE OAuth. Use it to read and write accounting data in the user's Xero organisation.\n\n## Authentication & Setup\n\n**Note for Agent:** If the user is not logged in, you must instruct them to run `xero login` in their terminal manually, as it requires a browser-based OAuth flow that you cannot complete.\n\n```bash\n# Check if logged in / check organization details\nxero org details\n```\n\n## IMPORTANT: Profile and identity verification\n\nBefore executing **any** commands (including read-only operations), you **must** verify which Xero organisation is active:\n\n1. **Always run `xero org details` at the start of a session** and display the organisation name to the user before executing any other commands. Do not proceed until the user confirms this is the correct org.\n2. **Use `-p <profile>` explicitly** when the user has specified or confirmed which profile/org to use. Do not silently rely on the default profile or environment variables without confirmation.\n3. **Warn the user if `XERO_PROFILE` or `XERO_CLIENT_ID` environment variables are set**, as these silently override the default profile and may connect to an unintended organisation. Check with `echo $XERO_PROFILE $XERO_CLIENT_ID` if in doubt.\n4. **Never switch profiles or call `xero profile set-default`** without explicit user instruction. Changing the default profile affects all subsequent commands and other tools sharing the same config.\n\n## IMPORTANT: Safety rules for write operations\n\nAny command that **creates, updates, or deletes** data (invoices, contacts, payments, bank transactions, manual journals, credit notes, quotes, items, tracking categories) is a write operation. Before executing a write operation you **must** follow these steps:\n\n1. **Confirm the active profile and organisation.** Run `xero org details` and show the user which organisation will be affected. Never assume the correct org is active.\n2. **Use read-only commands first** to verify IDs and details (e.g. list contacts, invoices, accounts) before referencing them in a write.\n3. **Show the user a summary** of what will be written — include the resource type, key fields, and target organisation — then **wait for explicit user approval** before executing the write command.\n4. **Do not proceed** with the write unless the user confirms. A simple \"yes\" or \"go ahead\" is sufficient, but silence or ambiguity is not approval.\n\nThese rules apply regardless of whether the write is performed via inline flags or `--file`. They exist to prevent accidental creation or modification of financial records in the wrong organisation.\n\n## Global flags\n\nEvery API command supports these flags:\n\n| Flag | Description |\n|---|---|\n| `-p, --profile <name>` | Use a specific named profile (defaults to the default profile) |\n| `--client-id <id>` | Override the profile with an inline OAuth client ID |\n| `--json` | Output raw JSON (useful for piping to `jq` or further processing) |\n| `--csv` | Output as CSV |\n\nEnvironment variables `XERO_PROFILE` and `XERO_CLIENT_ID` are also recognised.\n\n## Auth & profiles\n\n```bash\n# Log in (opens browser for OAuth consent)\nxero login\nxero login -p my-profile\n\n# Log out\nxero logout\n\n# Manage profiles (each profile maps to a Xero OAuth app / organisation)\nxero profile add <name>                    # prompts for Client ID\nxero profile add <name> --client-id <id>   # inline\nxero profile list\nxero profile set-default <name>\nxero profile remove <name>\n```\n\n## Key workflow: find IDs first\n\nMost create/update commands need Xero GUIDs. Always list first to find IDs:\n\n```bash\nxero contacts list --search \"Acme\"    # find a contact ID\nxero accounts list                    # find account codes\nxero invoices list                    # find invoice IDs\nxero items list                       # find item codes\n```\n\n## JSON file input\n\nAny create or update command accepts `--file <path.json>` instead of inline flags. Use this for multi-line-item resources. All inputs are validated before being sent to the API.\n\n```bash\nxero invoices create --file invoice.json\nxero contacts update --file contact-update.json\n```\n\n## Commands\n\n### Contacts\n\n```bash\nxero contacts list\nxero contacts list --search \"Acme\" --page 2\nxero contacts create --name \"Acme Corp\" --email acme@example.com --phone \"+1234567890\"\nxero contacts create --file contact.json\nxero contacts update --contact-id <ID> --name \"Acme Corporation\" --email new@acme.com\nxero contacts update --file contact-update.json\n```\n\n### Contact Groups\n\n```bash\nxero contact-groups list\nxero contact-groups list --group-id <ID>\n```\n\n### Accounts\n\n```bash\nxero accounts list\nxero accounts list --json\n```\n\n### Invoices\n\n```bash\nxero invoices list\nxero invoices list --contact-id <ID>\nxero invoices list --invoice-number INV-0001\nxero invoices list --page 2\n\n# Single line item inline\nxero invoices create --contact-id <ID> --type ACCREC \\\n  --description \"Consulting\" --quantity 10 --unit-amount 150 \\\n  --account-code 200 --tax-type OUTPUT2\n\n# Multiple line items via JSON file\nxero invoices create --file invoice.json\n\n# Update a draft invoice\nxero invoices update --invoice-id <ID> --reference \"Updated ref\"\nxero invoices update --file invoice-update.json\n```\n\nInvoice types: `ACCREC` (sales/receivable), `ACCPAY` (purchase/payable).\n\nExample invoice.json:\n```json\n{\n  \"contactId\": \"<CONTACT_ID>\",\n  \"type\": \"ACCREC\",\n  \"date\": \"2025-06-15\",\n  \"reference\": \"REF-001\",\n  \"lineItems\": [\n    {\n      \"description\": \"Consulting\",\n      \"quantity\": 10,\n      \"unitAmount\": 150,\n      \"accountCode\": \"200\",\n      \"taxType\": \"OUTPUT2\"\n    }\n  ]\n}\n```\n\n### Quotes\n\n```bash\nxero quotes list\nxero quotes list --contact-id <ID>\nxero quotes list --quote-number QU-0001\n\nxero quotes create --contact-id <ID> --title \"Project Quote\" \\\n  --date 2025-12-30 --description \"Web design\" --quantity 1 --unit-amount 5000 \\\n  --account-code 200 --tax-type OUTPUT2\nxero quotes create --file quote.json\n\nxero quotes update --file quote-update.json\n```\n\n> **Note:** Xero's API requires `contact` and `date` on quote updates even though the CLI allows them to be omitted. If you get a validation error, ensure your update payload includes both fields.\n\n### Credit Notes\n\n```bash\nxero credit-notes list\nxero credit-notes list --contact-id <ID> --page 2\n\nxero credit-notes create --contact-id <ID> \\\n  --description \"Refund\" --quantity 1 --unit-amount 100 \\\n  --account-code 200 --tax-type OUTPUT2\nxero credit-notes create --file credit-note.json\n\nxero credit-notes update --file credit-note-update.json\n```\n\n### Manual Journals\n\nManual journals require at least two journal lines (debit + credit). Always use `--file`.\n\n```bash\nxero manual-journals list\nxero manual-journals list --manual-journal-id <ID>\nxero manual-journals list --modified-after 2025-01-01\n\nxero manual-journals create --file journal.json\nxero manual-journals update --file journal-update.json\n```\n\nExample journal.json:\n```json\n{\n  \"narration\": \"Reclassify office supplies\",\n  \"manualJournalLines\": [\n    { \"accountCode\": \"200\", \"lineAmount\": 100, \"description\": \"Debit\" },\n    { \"accountCode\": \"400\", \"lineAmount\": -100, \"description\": \"Credit\" }\n  ]\n}\n```\n\n### Bank Transactions\n\n```bash\nxero bank-transactions list\nxero bank-transactions list --bank-account-id <ID>\n\nxero bank-transactions create --type SPEND --bank-account-id <BANK_ID> \\\n  --contact-id <CONTACT_ID> --description \"Office supplies\" \\\n  --quantity 1 --unit-amount 50 --account-code 429 --tax-type INPUT2\nxero bank-transactions create --file bank-transaction.json\n\nxero bank-transactions update --file bank-transaction-update.json\n```\n\nTransaction types: `RECEIVE` (money in), `SPEND` (money out).\n\n### Payments\n\n```bash\nxero payments list\nxero payments list --invoice-id <ID>\nxero payments list --invoice-number INV-0001\nxero payments list --reference \"Payment ref\"\n\nxero payments create --invoice-id <ID> --account-id <ACCOUNT_ID> --amount 500\nxero payments create --file payment.json\n```\n\n### Items\n\n```bash\nxero items list\nxero items list --page 2\n\nxero items create --code WIDGET --name \"Widget\" --sale-price 29.99\nxero items create --file item.json\n\nxero items update --item-id <ID> --code WIDGET --name \"Updated Widget\"\nxero items update --file item-update.json\n```\n\n### Currencies\n\n```bash\nxero currencies list\nxero currencies list --json\n```\n\n### Tax Rates\n\n```bash\nxero tax-rates list\nxero tax-rates list --json\n```\n\n### Tracking Categories & Options\n\n```bash\nxero tracking categories list\nxero tracking categories list --include-archived\n\nxero tracking categories create --name \"Department\"\nxero tracking categories update --category-id <ID> --name \"Region\"\nxero tracking categories update --category-id <ID> --status ARCHIVED\n\nxero tracking options create --category-id <ID> --names \"Sales,Marketing,Engineering\"\nxero tracking options update --category-id <ID> --file tracking-options.json\n```\n\n### Organisation\n\n```bash\nxero org details\nxero org details --json\n```\n\n### Reports\n\n```bash\n# Trial balance\nxero reports trial-balance\nxero reports trial-balance --date 2025-12-31\n\n# Profit and loss\nxero reports profit-and-loss\nxero reports profit-and-loss --from 2025-01-01 --to 2025-12-31\nxero reports profit-and-loss --timeframe QUARTER --periods 4\n\n# Balance sheet\nxero reports balance-sheet\nxero reports balance-sheet --date 2025-12-31\nxero reports balance-sheet --timeframe MONTH --periods 12\n\n# Aged receivables (requires contact ID)\nxero reports aged-receivables --contact-id <ID>\nxero reports aged-receivables --contact-id <ID> --report-date 2025-12-31\n\n# Aged payables (requires contact ID)\nxero reports aged-payables --contact-id <ID>\nxero reports aged-payables --contact-id <ID> --from-date 2025-01-01 --to-date 2025-12-31\n```\n\n## Tips\n\n- Use `--json` and pipe to `jq` when you need to extract specific fields programmatically.\n- Only draft invoices, quotes, and credit notes can be updated.\n- For multi-line-item creates, always use `--file` with a JSON payload.\n- Tax types vary by region. Run `xero tax-rates list` to see what's available.\n- Account codes are needed for line items. Run `xero accounts list` to find them.\n\nFile v0.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn749n1k0dbn5c4nq6g1f9kn2x83mmvf\",\n  \"slug\": \"xero-command-line\",\n  \"version\": \"0.0.3\",\n  \"publishedAt\": 1778535910705\n}\n\nArchive v0.0.1: 2 files, 3278 bytes\n\nFiles: SKILL.md (8431b), _meta.json (136b)\n\nFile v0.0.1:SKILL.md\n\n---\nname: xero_command_line\ndescription: Interact with the Xero accounting API using the `xero` CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, tax rates, reports, and organisation details.\nuser-invocable: true\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - xero\n      install: \"npm install -g @xeroapi/xero-command-line\"\n    keywords:\n      - accounting\n      - xero\n      - invoices\n      - bookkeeping\n      - finance\n---\n\n# xero CLI\n\nYou have access to the `xero` CLI — a command-line tool for the Xero accounting API using PKCE OAuth. Use it to read and write accounting data in the user's Xero organisation.\n\n## Authentication & Setup\n\n**Note for Agent:** If the user is not logged in, you must instruct them to run `xero login` in their terminal manually, as it requires a browser-based OAuth flow that you cannot complete.\n\n```bash\n# Check if logged in / check organization details\nxero org details\n```\n\n## Global flags\n\nEvery API command supports these flags:\n\n| Flag | Description |\n|---|---|\n| `-p, --profile <name>` | Use a specific named profile (defaults to the default profile) |\n| `--client-id <id>` | Override the profile with an inline OAuth client ID |\n| `--json` | Output raw JSON (useful for piping to `jq` or further processing) |\n| `--csv` | Output as CSV |\n\nEnvironment variables `XERO_PROFILE` and `XERO_CLIENT_ID` are also recognised.\n\n## Auth & profiles\n\n```bash\n# Log in (opens browser for OAuth consent)\nxero login\nxero login -p my-profile\n\n# Log out\nxero logout\n\n# Manage profiles (each profile maps to a Xero OAuth app / organisation)\nxero profile add <name>                    # prompts for Client ID\nxero profile add <name> --client-id <id>   # inline\nxero profile list\nxero profile set-default <name>\nxero profile remove <name>\n```\n\n## Key workflow: find IDs first\n\nMost create/update commands need Xero GUIDs. Always list first to find IDs:\n\n```bash\nxero contacts list --search \"Acme\"    # find a contact ID\nxero accounts list                    # find account codes\nxero invoices list                    # find invoice IDs\nxero items list                       # find item codes\n```\n\n## JSON file input\n\nAny create or update command accepts `--file <path.json>` instead of inline flags. Use this for multi-line-item resources. All inputs are validated before being sent to the API.\n\n```bash\nxero invoices create --file invoice.json\nxero contacts update --file contact-update.json\n```\n\n## Commands\n\n### Contacts\n\n```bash\nxero contacts list\nxero contacts list --search \"Acme\" --page 2\nxero contacts create --name \"Acme Corp\" --email acme@example.com --phone \"+1234567890\"\nxero contacts create --file contact.json\nxero contacts update --contact-id <ID> --name \"Acme Corporation\" --email new@acme.com\nxero contacts update --file contact-update.json\n```\n\n### Contact Groups\n\n```bash\nxero contact-groups list\nxero contact-groups list --group-id <ID>\n```\n\n### Accounts\n\n```bash\nxero accounts list\nxero accounts list --json\n```\n\n### Invoices\n\n```bash\nxero invoices list\nxero invoices list --contact-id <ID>\nxero invoices list --invoice-number INV-0001\nxero invoices list --page 2\n\n# Single line item inline\nxero invoices create --contact-id <ID> --type ACCREC \\\n  --description \"Consulting\" --quantity 10 --unit-amount 150 \\\n  --account-code 200 --tax-type OUTPUT2\n\n# Multiple line items via JSON file\nxero invoices create --file invoice.json\n\n# Update a draft invoice\nxero invoices update --invoice-id <ID> --reference \"Updated ref\"\nxero invoices update --file invoice-update.json\n```\n\nInvoice types: `ACCREC` (sales/receivable), `ACCPAY` (purchase/payable).\n\nExample invoice.json:\n```json\n{\n  \"contactId\": \"<CONTACT_ID>\",\n  \"type\": \"ACCREC\",\n  \"date\": \"2025-06-15\",\n  \"reference\": \"REF-001\",\n  \"lineItems\": [\n    {\n      \"description\": \"Consulting\",\n      \"quantity\": 10,\n      \"unitAmount\": 150,\n      \"accountCode\": \"200\",\n      \"taxType\": \"OUTPUT2\"\n    }\n  ]\n}\n```\n\n### Quotes\n\n```bash\nxero quotes list\nxero quotes list --contact-id <ID>\nxero quotes list --quote-number QU-0001\n\nxero quotes create --contact-id <ID> --title \"Project Quote\" \\\n  --date 2025-12-30 --description \"Web design\" --quantity 1 --unit-amount 5000 \\\n  --account-code 200 --tax-type OUTPUT2\nxero quotes create --file quote.json\n\nxero quotes update --file quote-update.json\n```\n\n> **Note:** Xero's API requires `contact` and `date` on quote updates even though the CLI allows them to be omitted. If you get a validation error, ensure your update payload includes both fields.\n\n### Credit Notes\n\n```bash\nxero credit-notes list\nxero credit-notes list --contact-id <ID> --page 2\n\nxero credit-notes create --contact-id <ID> \\\n  --description \"Refund\" --quantity 1 --unit-amount 100 \\\n  --account-code 200 --tax-type OUTPUT2\nxero credit-notes create --file credit-note.json\n\nxero credit-notes update --file credit-note-update.json\n```\n\n### Manual Journals\n\nManual journals require at least two journal lines (debit + credit). Always use `--file`.\n\n```bash\nxero manual-journals list\nxero manual-journals list --manual-journal-id <ID>\nxero manual-journals list --modified-after 2025-01-01\n\nxero manual-journals create --file journal.json\nxero manual-journals update --file journal-update.json\n```\n\nExample journal.json:\n```json\n{\n  \"narration\": \"Reclassify office supplies\",\n  \"manualJournalLines\": [\n    { \"accountCode\": \"200\", \"lineAmount\": 100, \"description\": \"Debit\" },\n    { \"accountCode\": \"400\", \"lineAmount\": -100, \"description\": \"Credit\" }\n  ]\n}\n```\n\n### Bank Transactions\n\n```bash\nxero bank-transactions list\nxero bank-transactions list --bank-account-id <ID>\n\nxero bank-transactions create --type SPEND --bank-account-id <BANK_ID> \\\n  --contact-id <CONTACT_ID> --description \"Office supplies\" \\\n  --quantity 1 --unit-amount 50 --account-code 429 --tax-type INPUT2\nxero bank-transactions create --file bank-transaction.json\n\nxero bank-transactions update --file bank-transaction-update.json\n```\n\nTransaction types: `RECEIVE` (money in), `SPEND` (money out).\n\n### Payments\n\n```bash\nxero payments list\nxero payments list --invoice-id <ID>\nxero payments list --invoice-number INV-0001\nxero payments list --reference \"Payment ref\"\n\nxero payments create --invoice-id <ID> --account-id <ACCOUNT_ID> --amount 500\nxero payments create --file payment.json\n```\n\n### Items\n\n```bash\nxero items list\nxero items list --page 2\n\nxero items create --code WIDGET --name \"Widget\" --sale-price 29.99\nxero items create --file item.json\n\nxero items update --item-id <ID> --code WIDGET --name \"Updated Widget\"\nxero items update --file item-update.json\n```\n\n### Tax Rates\n\n```bash\nxero tax-rates list\nxero tax-rates list --json\n```\n\n### Tracking Categories & Options\n\n```bash\nxero tracking categories list\nxero tracking categories list --include-archived\n\nxero tracking categories create --name \"Department\"\nxero tracking categories update --category-id <ID> --name \"Region\"\nxero tracking categories update --category-id <ID> --status ARCHIVED\n\nxero tracking options create --category-id <ID> --names \"Sales,Marketing,Engineering\"\nxero tracking options update --category-id <ID> --file tracking-options.json\n```\n\n### Organisation\n\n```bash\nxero org details\nxero org details --json\n```\n\n### Reports\n\n```bash\n# Trial balance\nxero reports trial-balance\nxero reports trial-balance --date 2025-12-31\n\n# Profit and loss\nxero reports profit-and-loss\nxero reports profit-and-loss --from 2025-01-01 --to 2025-12-31\nxero reports profit-and-loss --timeframe QUARTER --periods 4\n\n# Balance sheet\nxero reports balance-sheet\nxero reports balance-sheet --date 2025-12-31\nxero reports balance-sheet --timeframe MONTH --periods 12\n\n# Aged receivables (requires contact ID)\nxero reports aged-receivables --contact-id <ID>\nxero reports aged-receivables --contact-id <ID> --report-date 2025-12-31\n\n# Aged payables (requires contact ID)\nxero reports aged-payables --contact-id <ID>\nxero reports aged-payables --contact-id <ID> --from-date 2025-01-01 --to-date 2025-12-31\n```\n\n## Tips\n\n- Use `--json` and pipe to `jq` when you need to extract specific fields programmatically.\n- Only draft invoices, quotes, and credit notes can be updated.\n- For multi-line-item creates, always use `--file` with a JSON payload.\n- Tax types vary by region. Run `xero tax-rates list` to see what's available.\n- Account codes are needed for line items. Run `xero accounts list` to find them.\n\nFile v0.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn749n1k0dbn5c4nq6g1f9kn2x83mmvf\",\n  \"slug\": \"xero-command-line\",\n  \"version\": \"0.0.1\",\n  \"publishedAt\": 1774495646382\n}","readmeExcerpt":"Skill: Official Xero skill Owner: xeroapi Summary: Interact with the Xero accounting API using the xero CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual... Tags: latest:0.0.6 Version history: v0.0.6 | 2026-05-25T02:14:59.482Z | user Version 0.0.6 - Added detailed documentation for Linux, WSL, and SSH token storage and related environment variables. - Warns users wh","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Check if logged in / check organization details\nxero org details"},{"language":"bash","snippet":"xero contacts list --search \"Acme\" --toon\nxero invoices list --toon\nxero accounts list --toon"},{"language":"bash","snippet":"# Read-only example (adjust to match scopes enabled on the user's app)\nxero login --scope \"accounting.contacts.read accounting.settings.read accounting.invoices.read accounting.payments.read accounting.banktransactions.read accounting.manualjournals.read accounting.reports.balancesheet.read accounting.reports.profitandloss.read accounting.reports.trialbalance.read accounting.reports.aged.read accounting.budgets.read accounting.attachments.read\"\n\n# Or via environment variable\nXERO_SCOPES=\"accounting.invoices.read accounting.contacts.read\" xero login"},{"language":"bash","snippet":"# Log in (opens browser for OAuth consent)\nxero login\nxero login -p my-profile\nxero login --scope \"accounting.contacts.read accounting.invoices.read\"\n\n# Log out\nxero logout\n\n# Manage profiles (each profile maps to a Xero OAuth app / organisation)\nxero profile add <name>                    # prompts for Client ID\nxero profile add <name> --client-id <id>   # inline\nxero profile list\nxero profile set-default <name>\nxero profile remove <name>"},{"language":"bash","snippet":"xero contacts list --search \"Acme\"    # find a contact ID\nxero accounts list                    # find account codes\nxero invoices list                    # find invoice IDs\nxero items list                       # find item codes"},{"language":"bash","snippet":"xero invoices create --file invoice.json\nxero contacts update --file contact-update.json"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: xero_command_line\ndescription: Interact with the Xero accounting API using the `xero` CLI tool. Manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, currencies, tax rates, reports, and organisation details.\nuser-invocable: true\nmetadata:\n  openclaw:\n    source: \"https://github.com/XeroAPI/xero-command-line\"\n    homepage: \"https://github.com/XeroAPI/xero-command-line#readme\"\n    requires:\n      bins:\n        - xero\n      install: \"npm install -g @xeroapi/xero-command-line\"\n    keywords:\n      - accounting\n      - xero\n      - invoices\n      - bookkeeping\n      - finance\n---\n\n# xero CLI\n\nYou have access to the `xero` CLI — a command-line tool for the Xero accounting API using PKCE OAuth. Use it to read and write accounting data in the user's Xero organisation.\n\n## Authentication & Setup\n\n**Note for Agent:** If the user is not logged in, you must instruct them to run `xero login` in their terminal manually, as it requires a browser-based OAuth flow that you cannot complete. If login fails with `unauthorized_client` or scope-related errors — common for new Xero apps after the March 2026 scope migration, or when the app only grants read scopes — instruct them to re-login with `--scope` listing only the scopes enabled on their app (see [OAuth scopes](#oauth-scopes) below).\n\n```bash\n# Check if logged in / check organization details\nxero org details\n```\n\n### Token storage (Linux / WSL / SSH)\n\nTokens are encrypted in `~/.config/xero-command-line/tokens.json`. By default the encryption key lives **only** in the OS keychain (on Linux: GNOME Keyring / Secret Service over D-Bus). A file copy is **not** written unless the user opts in.\n\n**If the user is on WSL, SSH, or a headless VM** and sees an encryption-key error after a successful `xero login`:\n\n1. **Prefer fixing the keychain:** `sudo apt install gnome-keyring libsecret-tools dbus-x11`, start `gnome-keyring-daemon`, then `xero login` again.\n2. **Flaky keychain** (login OK, next command fails): `export XERO_KEYRING_FILE_BACKUP=1` before `xero login` — mirrors the key to `~/.config/xero-command-line/.encryption-key` (0600) for later reads. Opt-in; weaker than keychain-only.\n3. **No keychain:** `export XERO_KEY_STORAGE=file` before `xero login`.\n4. **Stronger file-based option:** `export XERO_TOKEN_PASSPHRASE='…'` (same value every session) — scrypt-derived key, not stored in plaintext.\n\nWarn if `XERO_PROFILE`, `XERO_CLIENT_ID`, `XERO_KEY_STORAGE`, `XERO_KEYRING_FILE_BACKUP`, or `XERO_TOKEN_PASSPHRASE` are set — they change profile or how keys are stored. Check with `echo $XERO_PROFILE $XERO_CLIENT_ID $XERO_KEY_STORAGE $XERO_KEYRING_FILE_BACKUP`.\n\nThe CLI does **not** wipe `tokens.json` when decryption fails; instruct re-login only after the user confirms.\n\n## IMPORTANT: Profile and identity verification\n\nBefore executing **any** commands (including read-only operations), you **must** verify which Xero organisation is active:\n\n1"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn749n1k0dbn5c4nq6g1f9kn2x83mmvf\",\n  \"slug\": \"xero-command-line\",\n  \"version\": \"0.0.6\",\n  \"publishedAt\": 1779675299482\n}"},{"path":"skill-card.md","content":"## Description:\n\nInteract with the Xero accounting API using the `xero` CLI tool to manage contacts, invoices, quotes, credit notes, payments, bank transactions, items, manual journals, tracking categories, currencies, tax rates, reports, and organisation details.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[xeroapi](https://clawhub.ai/user/xeroapi)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and finance operations users can use this skill to guide an agent in running the Xero CLI for accounting workflows, including reading organisation data and preparing approved changes to financial records.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The CLI can access financial data in a Xero organisation.\n\nMitigation: Use read-only scopes when possible and confirm the active organisation/profile before any command.\n\nRisk: Write commands can create or change accounting records.\n\nMitigation: Review IDs and target records with read-only commands first, then require explicit user approval before each write.\n\nRisk: Token storage settings can weaken credential protection on Linux, WSL, SSH, or headless systems.\n\nMitigation: Prefer OS keychain storage, treat file-based fallback and passphrase settings as sensitive, and review relevant environment variables before use.\n\nRisk: Global npm installation affects the user's local toolchain.\n\nMitigation: Review the npm install command before running it and install only when the user intends to use the Xero CLI.\n\n## Reference(s):\n\n- [Xero command line homepage](https://github.com/XeroAPI/xero-command-line#readme)\n- [Xero command line source](https://github.com/XeroAPI/xero-command-line)\n- [TOON format](https://github.com/toon-format/toon)\n- [ClawHub skill page](https://clawhub.ai/xeroapi/skills/xero-command-line)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON payload snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Guides agents to prefer TOON for parsing CLI read/list results, JSON when explicitly needed, and tables for user-facing summaries.]\n\n## Skill Version(s):\n\n0.0.6 (source: server release metadata, created 2026-05-25)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1504,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T16:04:13.291Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T16:04:13.291Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:41:24.893Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}