jaz-clio 5.68.0 → 5.70.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/skills/api/SKILL.md +7 -7
- package/assets/skills/api/references/endpoints.md +22 -11
- package/assets/skills/api/references/errors.md +5 -5
- package/assets/skills/api/references/feature-glossary.md +2 -2
- package/assets/skills/api/references/field-map.md +1 -1
- package/assets/skills/api/references/full-api-surface.md +4 -3
- package/assets/skills/api/references/orders.md +2 -0
- package/assets/skills/cli/SKILL.md +3 -3
- package/assets/skills/cli/references/command-catalog.md +2 -2
- package/assets/skills/conversion/SKILL.md +1 -1
- package/assets/skills/jaz-kit/SKILL.md +1 -1
- package/assets/skills/jaz-pseudo-sql/SKILL.md +1 -1
- package/assets/skills/jobs/SKILL.md +1 -1
- package/assets/skills/transaction-recipes/SKILL.md +1 -1
- package/assets/templates/platform-rules/jaz-agent-rules.md +1 -1
- package/cli.mjs +460 -456
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<a href="https://www.npmjs.com/package/jaz-clio"><img src="https://img.shields.io/npm/v/jaz-clio?style=for-the-badge&logo=npm" alt="npm"></a>
|
|
5
5
|
<a href="https://www.npmjs.com/package/jaz-clio"><img src="https://img.shields.io/npm/dm/jaz-clio?style=for-the-badge&label=downloads" alt="npm downloads"></a>
|
|
6
|
-
<img src="https://img.shields.io/badge/tools-
|
|
6
|
+
<img src="https://img.shields.io/badge/tools-380-blue?style=for-the-badge" alt="380 tools">
|
|
7
7
|
<a href="https://github.com/teamtinvio/jaz-ai/blob/main/LICENSE"><img src="https://img.shields.io/github/license/teamtinvio/jaz-ai?style=for-the-badge&color=green" alt="License"></a>
|
|
8
8
|
</p>
|
|
9
9
|
|
|
10
10
|
<p align="center"><b>Jaz accounting on the command line, and inside any AI agent.</b></p>
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
380 tools · 74 command groups · 7 skills · 13 calculators · 12 close playbooks · 159 field-tested API rules.
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
npm install -g jaz-clio
|
|
@@ -78,7 +78,7 @@ that ends up in a journal.
|
|
|
78
78
|
|
|
79
79
|
## MCP server
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
380 tools for any AI agent that speaks MCP. Runs locally: no cloud, no ports.
|
|
82
82
|
|
|
83
83
|
> **No install at all?** Claude.ai, ChatGPT, Cowork, and Microsoft Copilot Studio can use Jaz through the hosted connector. Add `https://mcp.jaz.ai/mcp` as a custom connector and sign in with OAuth, no key. The local setup below is for terminal use, scripting, and editors that run MCP servers as local processes.
|
|
84
84
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jaz-api
|
|
3
|
-
version: 5.
|
|
3
|
+
version: 5.70.0
|
|
4
4
|
description: >-
|
|
5
5
|
Use this skill whenever you call, debug, or review code that touches the Jaz
|
|
6
6
|
REST API. Covers field names, response shapes, 159 production gotchas, error
|
|
@@ -138,7 +138,7 @@ The rest of this skill — field names, gotchas, error catalog, dependency order
|
|
|
138
138
|
35d. **Tags are `tags: string[]`** on ALL transaction create/update: invoices, bills, customer CNs, supplier CNs, journals, cash-in, cash-out, cash transfers. CLI uses `--tag <name>` (singular, wrapped to array). API accepts the array directly.
|
|
139
139
|
|
|
140
140
|
### Nano Classifiers
|
|
141
|
-
35e. **ClassifierConfig on line items**: `classifierConfig: [{ resourceId: "<capsuleTypeId>", type: "invoice"|"bill", selectedClasses: [{ className: "Class A", resourceId: "<classId>" }], printable: true }]`. Applies to line items on invoices, bills, credit notes, journal entries, and cash entry details. Create capsule types first via `POST /capsule-types`, then reference them in classifierConfig.
|
|
141
|
+
35e. **ClassifierConfig on line items**: `classifierConfig: [{ resourceId: "<capsuleTypeId>", type: "invoice"|"bill", selectedClasses: [{ className: "Class A", resourceId: "<classId>" }], printable: true }]`. Applies to line items on invoices, bills, credit notes, journal entries, and cash entry details. Create capsule types first via `POST /capsule-types`, then reference them in classifierConfig. A selected class needs `resourceId` unless it sends `entityResourceId` instead (a classifier whose options are customers, suppliers, contacts, employees or users). Quick fix and Ledger Find & Fix add `{ resourceId, deleted: true }` to remove one classifier and leave unnamed ones as they are (rule 107).
|
|
142
142
|
|
|
143
143
|
### Reports
|
|
144
144
|
36. **Report field names differ by type** — this is the most error-prone area:
|
|
@@ -171,7 +171,7 @@ The rest of this skill — field names, gotchas, error catalog, dependency order
|
|
|
171
171
|
43. **Search sort is an object** — `{ sort: { sortBy: ["valueDate"], order: "DESC" } }`. Required when `offset` is present (even `offset: 0`).
|
|
172
172
|
44. **Bank records** — **Create**: Multipart CSV/OFX via `POST /magic/importBankStatementFromAttachment` or JSON via `POST /bank-records/:accountResourceId` with `{ records: [{amount, transactionDate, description?, payerOrPayee?, reference?}] }` (positive = cash-in, negative = cash-out, response: `{data: {errors: []}}`). **Search**: `POST /bank-records/:accountResourceId/search` — filter fields: `valueDate` (DateExpression), `status` (StringExpression: UNRECONCILED, RECONCILED, ARCHIVED, POSSIBLE_DUPLICATE), `description`, `extContactName` (payer/payee), `extReference`, `netAmount` (BigDecimalExpression), `extAccountNumber`. Sort by `valueDate` DESC default.
|
|
173
173
|
45. **Withholding tax** on bills/supplier CNs only. Retry pattern: if `WITHHOLDING_CODE_NOT_FOUND`, strip field and retry.
|
|
174
|
-
46. **Known API bugs (500s)**: capsules POST (upstream returns nil)
|
|
174
|
+
46. **Known API bugs (500s)**: capsules POST (upstream returns nil). **Catalogs POST, inventory balances by status GET, contact groups PUT and custom fields PUT are NO LONGER on this list.** Catalogs POST returned 201 on a live probe 2026-09-23 (item `unit` omitted, it is optional); its response is counts (`createdCatalogs`, `createdCatalogItems`), not a resourceId, so find the new catalog with `search_catalogs`. Inventory balances by status works (Rule 97). Contact groups PUT and custom fields PUT were re-probed live 2026-09-02 and returned 200 and applied the change. Do not route around any of them.
|
|
175
175
|
47. **Non-existent endpoints**: `POST /inventory/adjustments` (and `/inventory-adjustments`, `/inventory-items/:id/adjustments`, `/items/:id/inventory-adjustments` — no stock-adjustment write path exists at any spelling), `GET /payments` (list), and `POST /payments/search` return 404 — these endpoints are not implemented. For payments, per-payment CRUD is `GET/PUT/DELETE /payments/:resourceId` and there ARE two payment-scoped searches — see Rule 64. `POST /deposits` also 404s, but for a different reason — see Rule 47a; do not read it as a missing feature.
|
|
176
176
|
47a. **Deposits are not an entity — the 404 on `/deposits` is by design.** A deposit is a **flag on a Chart of Accounts account**, not a document: the account carries `depositContactType` = `CUSTOMER` (advance received, a liability) or `SUPPLIER` (advance paid, an asset). Once flagged, a deposit movement is an **ordinary transaction against that account** — top up with `POST /journals` / `POST /cash-in-entries` / `POST /cash-out-entries` (one leg on the flagged account), draw down with `POST /invoices/:id/payments` or `POST /bills/:id/payments` passing `accountResourceId` = the flagged account **and `paymentMethod` set to something other than BANK_TRANSFER / CASH / CHEQUE** (use `OTHER`) — those three force a bank/cash account and 422 here, see Rule 80, read with `POST /cashflow-transactions/search`. **Flagging the account is a web-app action**: `depositContactType` is on no chart-of-accounts request or response model here, and the platform-backend mutation that sets it (`configureDepositAccounts`) is not proxied — so `POST /chart-of-accounts` cannot create a deposit account. Over the API you can only read and post against an account someone already flagged. Full walkthrough: `references/endpoints.md` → Deposits.
|
|
177
177
|
48. **Attachments — full CRUD**: **Add**: `POST /:type/:id/attachments` (multipart, `file` field, `application/pdf` or `image/*` — NOT `text/plain`). **List**: `GET /:type/:id/attachments`. **Delete**: `DELETE /:type/:id/attachments/:attachmentResourceId` (HTTP 200). CLI: `clio attachments add --file <path>` or `--url <url>`, `clio attachments list`, `clio attachments delete <attachmentResourceId>`. **The list response shape depends on the entity** — measured raw 2026-09-07: `/invoices/:id/attachments` returns `{ reference, resourceId, attachments: [{fileName, fileType, fileId, attachmentResourceId}] }`, while `/bills/:id/attachments` and `/journals/:id/attachments` return the conventional `{ data: [...] }`. Both credit-note types were unmeasured (every sampled record was void — see below). `listAttachments` in `core/api/attachments.ts` reads either key, so through the CLI or a tool you get `.data` in all cases; only a raw request sees the split. The attachment ID field is `attachmentResourceId` (not `resourceId`). **A VOIDED record 404s on three of the five types.** Measured 2026-09-07: a voided invoice, customer credit note and supplier credit note each answer `404 not_found` with `"<Entity> is voided"`, while a voided bill and a voided journal return 200 and list normally. The 404 is about the record's status, not its existence — `GET /invoices/:id` on the same id works — so never read this 404 as a bad resourceId. Anything fanning out to attachments alongside other calls must treat that leg as degradable, or one voided record destroys the whole response; `get_transaction_summary` did exactly that until 5.55.1.
|
|
@@ -332,7 +332,7 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
|
|
|
332
332
|
96. **Contact groups have `associatedContacts` array** — Each group contains `{ name, resourceId, associatedContacts: [{ name, resourceId }] }`. Search via `POST /contact-groups/search`. Known bug: PUT returns 500 (Rule 46).
|
|
333
333
|
|
|
334
334
|
### Inventory
|
|
335
|
-
97. **Inventory
|
|
335
|
+
97. **Inventory balances: one item or all.** One item: `GET /inventory-item-balance/:itemResourceId` (`get_inventory_balance`) returns `{ itemResourceId, latestAverageCostAmount, baseQty, baseUnit }`; the id is the ITEM resourceId, not an inventory-specific ID. All items: `GET /inventory-balances/:balanceStatus` (`list_inventory_balances`, `clio inventory balances --status`) with `balanceStatus` one of `ALL`, `AVAILABLE`, `FULLY_DRAWN` (anything else is 422); rows carry `itemCode`, `internalName`, `totalQuantity`, `baseUnit`, `averageCostAmount`, `balanceAmount`. The API answers an empty result with 404; the tool and CLI return it as `data: []`. `offset` is a page number here, though the spec says row (probed live 2026-09-23).
|
|
336
336
|
|
|
337
337
|
### Withholding Tax
|
|
338
338
|
98. **Withholding tax codes via `GET /withholding-tax-codes`** — Returns a flat array of 1,360+ entries (PH PSIC codes). Each entry: `{ code, description, taxRate, ... }`. No pagination — full list in one call. Use for PH/SG tax compliance.
|
|
@@ -358,7 +358,7 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
|
|
|
358
358
|
106. **Contact PUT uses `email` (string), not `emails` (array)** — GET returns `emails: [{email, label}]` (array) but PUT accepts `email: "user@example.com"` (string). Sending the `emails` array in PUT body causes 400 "Invalid request body". The CLI and tool executor handle this automatically via read-modify-write with the correct field.
|
|
359
359
|
|
|
360
360
|
### Quick Fix (Bulk Update)
|
|
361
|
-
107. **
|
|
361
|
+
107. **24 Quick Fix endpoints for bulk-updating transactions and line items**: `POST /api/v1/quick-fix/{entity}` with `{ resourceIds: [...], attributes: {...} }`. Only included fields are changed; omitted fields are left unchanged. Response: `{ updated: string[], failed: [{ resourceId, error, errorCode }] }`. **HTTP status codes**: 200 = complete success (`failed` always empty). **207 Multi-Status** = partial or total failure with per-item detail (same response shape as 200, so check the `failed` array). 422 = total failure with no per-item breakdown (rare). On 207, retry only `failed` resourceIds. Entities: **ARAP**: invoices, bills, customer-credit-notes, supplier-credit-notes. **Accounting**: journals, cash-entries. **Schedulers**: sale-schedules, purchase-schedules, subscription-schedules, journal-schedules. **Orders (line items only, no transaction-level route)**: sale-orders, sale-quotes, purchase-orders, purchase-requests. **Line-item request patterns**: ARAP, accounting and orders use `{ lineItemResourceIds, attributes }` (purchase side adds `withholdingTax`). **Line-item `discount` and `withholdingTax` use the quick fix shapes, not the create/update ones**: `discount: { rateType: "PERCENTAGE"|"FLAT", rateValue }` (not a bare number) and `withholdingTax: { code, rate, rateType, type, description? }` (code, rate, rateType and type all required), on bills, supplier CNs and purchase orders/requests alike. Schedulers (sale/purchase/subscription) use Pattern C: `{ schedulerUpdates: [{ schedulerResourceId, lineItemUpdates: [{ arrayIndex, ...attrs }] }] }`. **Journal-schedules use Pattern D**: `lineItemResourceId` (UUID) instead of `arrayIndex`. **Field gotchas**: cash entries use `currencySetting` (singular: `{ rateFunctionalToSource, exchangeToken }`), NOT `currencySettings`. Journal schedules have `startDate` in addition to `endDate`/`interval`. Tags: string array, max 50 items, max 50 chars each; on invoices, bills and credit notes they total at most 1000 characters joined with `|`, else 422. **Line-item `classifierConfig`** sets or removes one classifier per entry: set = `{ resourceId, type, printable, selectedClasses }` with at least one class; remove = `{ resourceId, deleted: true }`; classifiers not named stay; `[]` changes nothing. A 207 `failed` entry can carry an empty `resourceId` when the failure matched no record.
|
|
362
362
|
107a. **Ledger Find & Fix: find and fix (recode) records across types with one filter, preview one change, apply it once.** Use it when a user asks to find & fix, recode, reclassify, retag, re-date or move records to another account across many records or several types. `POST /api/v1/ledger/find-fix/transactions/preview` (sets contact, date, capsule, tags) or `POST /api/v1/ledger/find-fix/line-items/preview` (sets account, classifiers), each with `{ filter, change }`, then `POST /api/v1/ledger/find-fix/apply` with `{ previewId }`; conditions, bodies and every code are in endpoints.md section 17a. `JOURNAL` covers manual and cashflow journals only: transfer and trial-balance journals and cash transfers never match, so their ids come back `NOT_FOUND`. **A filter with no condition besides `types` is a 422, and a condition with no operator is ignored.** **The API refuses a key it does not take, at any level, with 400 `invalid_filter` naming the key**; the tools and the CLI refuse a field of the other level before the request, naming the level that takes it. `tags` `{ add, remove }` keeps the record's other tags, so setting tags to X means removing the current ones and adding X. A classifier removal needs only `{ resourceId, deleted: true }`, even for a classifier the organization no longer has. **Preview** writes nothing, matches at most 500 records, and returns `previewId` (valid 30 minutes; absent when nothing is eligible). **A blocked field is left as it is while the record's other fields still change.** **Apply** is single use and saves the preview-time values, so a field edited between preview and apply, tags included, is overwritten. Once it has taken the preview it runs to the end even if the caller leaves, and starts no new call 3 minutes after the request arrived. 207 lists the `failed` records with an `errorCode`; `OUTCOME_UNKNOWN` means that record may have changed. 404 `PREVIEW_NOT_FOUND` (expired, used, being applied, or another caller's): preview again, never resend. **Any other 5xx, or a timeout, on apply means the outcome is unknown: if the connection drops, the apply keeps running for up to 4 minutes. Wait that long before previewing or applying again on the same records, then preview again or re-read them. Never apply this previewId again.** Several applies can run at the same time. When two applies change records on one document at once, the one saved last can undo the other's changes, including fields and line items it did not set. Preview again to check the result. Lock dates, filed tax periods and claims-backed documents fail per record, and e-invoice filings may be re-submitted. Rule 107's per-type routes stay for one document, for fields this does not change (due date, tax profile, notes, amounts, custom fields) and for scheduled transactions.
|
|
363
363
|
|
|
364
364
|
### Transfer Trial Balance
|
|
@@ -440,11 +440,11 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
|
|
|
440
440
|
|
|
441
441
|
136. **Sync bulk-upsert response carries per-row failures** — `bulk_upsert_currency_rates` and `bulk_upsert_chart_of_accounts` return `{ resourceIds: string[], failedRows: ImportedRowError[], failedCount: number }` synchronously (no jobId polling needed). Each `failedRows` entry: `{ rowIndex, columnName, columnValue, errorCode, errorMessage }`. Empty `failedRows: []` + `failedCount: 0` on full success. For `bulk_upsert_currency_rates` specifically: omitting `rateApplicableTo` defaults it to `rateApplicableFrom - 0.999ms` (prevents temporal gaps in rate lookups). Contrast with async bulk-upserts (contacts, invoices, journals, etc.) which return `{ jobId }` and need `search_background_jobs` polling — there, per-row failures live in the job's `errorDetails` field instead.
|
|
442
442
|
|
|
443
|
-
137. **`bulk_upsert_contacts` request-level validation
|
|
443
|
+
137. **`bulk_upsert_contacts` request-level validation**: fails the WHOLE batch with HTTP 422 (no per-row partial success at this layer). Five rules to satisfy before submitting: (a) every contact must have `customer: true` OR `supplier: true` after defaults+backfill; for updates, the API backfills omitted flags from the existing contact; for creates, you must explicitly set at least one. (b) email entries within a contact must be case-insensitively unique (the tool takes `emails: string[]` and expands them to `emailList[{email,label}]`). (c) a payment term whose `name` is `CUSTOM` must carry `value` (rule 137c). (d) `name` must be unique within the batch (after whitespace+case normalize). (e) When `billingAddress` or `shippingAddress` is provided, BOTH `addressLine1` and `country` are required (the tool calls the first one `address` and renames it for you). Pre-validate client-side before calling; one bad row rejects the entire batch and the agent loses any successful work-in-progress.
|
|
444
444
|
|
|
445
445
|
137a. **`bulk_upsert_contacts` — the tool speaks its own vocabulary and the client renames six keys at the wire boundary** (`toWireContactRows`): `billingName`→`contactBillingName`, `currencyCode`→`currency`, `registrationNumber`→`registrationId`, `notes`→`customerInvoiceNotes`, `shippingAddress`→`deliveryAddress`, `emails: string[]`→`emailList: [{email,label}]`, plus `address`→`addressLine1` inside either address. **Send the TOOL names.** Both addresses require `address` AND `country` — omit either and the API 422s the WHOLE batch, so the client rejects it first with the field named. Note `notes` maps to the customer's DEFAULT INVOICE notes, not an internal memo. **`taxIdType` is not supported** — it appears on no contact definition. All verified live 2026-09-02 with a `taxId` control that stored correctly.
|
|
446
446
|
|
|
447
|
-
137c.
|
|
447
|
+
137c. **Payment terms on contacts.** `bulk_upsert_contacts` takes `customerPaymentTerms` / `supplierPaymentTerms` as `{name, value?}`: `name` is `ON_DELIVERY`, `NET_7`, `NET_15`, `NET_30`, `NET_45`, `NET_60` or `CUSTOM` (any case). `value` is the number of days as a string: required for `CUSTOM` as a positive whole number (the client refuses anything else before the call). With any other name the name carries its days, and a `value` that is not a positive whole number fails the WHOLE batch with 422, so the client drops it. A term is stored only for a side the contact is on: a customer term on a supplier-only contact is dropped with a 200. Verified live 2026-09-23: `{name: "NET_30"}` stored `paymentDetail.customerPaymentTerms [{name: "Net 30", value: "30"}]`, the same as a single create. **Bulk UPDATE trap:** a row that omits a term makes the API back-fill it from the stored display name, which is no term name, so Net 30 is re-stored as `Custom`/"30" (measured 2026-09-24). The client re-sends each stored term the row omits under its real name (one contact search per 100 ids). The single-contact create and update take a bare name and store `CUSTOM` with no days, so a term of any other length (21 days) is reachable only through bulk upsert. `clio contacts create|update --payment-terms` / `--supplier-payment-terms` accept a name in any case (not `CUSTOM`) or days 0/7/15/30/45/60; `create` makes the contact that side, `update` refuses a term for a side the contact is not on. This replaces the earlier warning that the bulk shape silently dropped the row, which the API has since fixed. **A contact's status cannot be changed through the API either.** The update (`PUT /contacts/{id}`) has no `status` field and, per the API source, always writes ACTIVE. `bulk_upsert_contacts` with `status: "INACTIVE"` returns job SUCCESS with processedCount 1 and applies nothing: an update's other fields in that row were dropped too, and a create with it left no contact findable (measured 2026-09-24). The client refuses INACTIVE on bulk rows and `clio contacts update --status`. Change status in the Jaz app.
|
|
448
448
|
|
|
449
449
|
138. **`get_contact_signals` — read-only contact-history pattern lookup** — `GET /api/v1/contacts/{resourceId}/signals?btType=…` returns the contact's modal patterns (currency, payment-terms, tax-inclusion/presence, top-COA, top-item), cadence (median interval days, days-since-last, interval ratio), and outstanding-balance snapshot for one (contact × business-transaction-type) pair. `btType` is required: `SALE` | `PURCHASE` | `SALE_CREDIT_NOTE` | `PURCHASE_CREDIT_NOTE`. Returns null `data` when sampleSize < 5 or the freshness layer is unavailable. Cache key is per-(contactId, btType) pair, so repeated calls for the same pair are cheap. **Three slices are always empty/null on this endpoint** — `severitySummary`, `outlierFlags`, `revealedDivergences` — because they require a draft to compare against; those populate only on the per-result `contactSignals` object inside `validate_drafts` responses. Use this tool for "what does this contact normally look like?" questions before drafting; use `validate_drafts` for "how does this draft compare to the contact's history?" questions after drafting.
|
|
450
450
|
|
|
@@ -985,7 +985,7 @@ Returns full custom field definition including `applyToSales`, `applyToPurchase`
|
|
|
985
985
|
- There is no `inventoryAccountResourceId` — it appears in no request schema and a create succeeds without it
|
|
986
986
|
- Delete inventory items via `DELETE /items/:id` (NOT `/inventory-items/:id`)
|
|
987
987
|
- `GET /inventory-item-balance/:id` returns balance per item
|
|
988
|
-
- `GET /inventory-balances/:
|
|
988
|
+
- `GET /inventory-balances/:balanceStatus` lists balances across items; `balanceStatus` is `ALL`, `AVAILABLE` or `FULLY_DRAWN` (else 422). An empty result is a 404, which `list_inventory_balances` returns as `data: []`
|
|
989
989
|
|
|
990
990
|
---
|
|
991
991
|
|
|
@@ -1833,7 +1833,7 @@ POST /api/v1/fixed-assets
|
|
|
1833
1833
|
- `depreciationMethod`: `"STRAIGHT_LINE"` or `"NO_DEPRECIATION"`
|
|
1834
1834
|
- `effectiveLife`: Integer (months)
|
|
1835
1835
|
- `category`: `"TANGIBLE"` or `"INTANGIBLE"`
|
|
1836
|
-
- `saveAsDraft`: Defaults to `true`. Set `false` to activate — requires `purchaseBusinessTransactionType` (`PURCHASE
|
|
1836
|
+
- `saveAsDraft`: Defaults to `true`. Set `false` to activate — requires `purchaseBusinessTransactionType` (`PURCHASE`, `SALE`, `JOURNAL_MANUAL`, `JOURNAL_CASHFLOW`, `JOURNAL_DIRECT_CASH_IN`, `JOURNAL_DIRECT_CASH_OUT` or `JOURNAL_CASH_TRANSFER`) + `purchaseBusinessTransactionResourceId`
|
|
1837
1837
|
- Optional string fields (`purchaseBusinessTransactionResourceId`, `capsuleResourceId`) can be safely omitted for drafts
|
|
1838
1838
|
|
|
1839
1839
|
### Response
|
|
@@ -1886,7 +1886,7 @@ The complete inventory surface is three routes plus the item create/list pair:
|
|
|
1886
1886
|
| POST | `/api/v1/inventory-items` | Create an inventory-tracked item |
|
|
1887
1887
|
| GET | `/api/v1/inventory-items` | List inventory-tracked items |
|
|
1888
1888
|
| GET | `/api/v1/inventory-item-balance/:resourceId` | Balance for one item |
|
|
1889
|
-
| GET | `/api/v1/inventory-balances/:balanceStatus` | Balances by status
|
|
1889
|
+
| GET | `/api/v1/inventory-balances/:balanceStatus` | Balances across items by status: `ALL`, `AVAILABLE`, `FULLY_DRAWN` (SKILL.md Rule 97) |
|
|
1890
1890
|
|
|
1891
1891
|
Stock moves only as a side effect of a transaction that carries the item (invoice, bill,
|
|
1892
1892
|
credit note). There is no direct quantity write.
|
|
@@ -1937,7 +1937,7 @@ Middleware on payment, credit, and refund endpoints automatically wraps a flat J
|
|
|
1937
1937
|
|
|
1938
1938
|
## 17. Quick Fix (Bulk Update)
|
|
1939
1939
|
|
|
1940
|
-
|
|
1940
|
+
24 endpoints for bulk-updating transactions and line items in a single API call: 10 entities with both routes, plus 4 order entities with a line-items route only.
|
|
1941
1941
|
|
|
1942
1942
|
### Pattern
|
|
1943
1943
|
|
|
@@ -1951,6 +1951,7 @@ POST /api/v1/quick-fix/{entity}/line-items
|
|
|
1951
1951
|
**ARAP**: `invoices`, `bills`, `customer-credit-notes`, `supplier-credit-notes`
|
|
1952
1952
|
**Accounting**: `journals`, `cash-entries`
|
|
1953
1953
|
**Schedulers**: `sale-schedules`, `purchase-schedules`, `subscription-schedules`, `journal-schedules`
|
|
1954
|
+
**Orders (line items only)**: `sale-orders`, `sale-quotes`, `purchase-orders`, `purchase-requests`. There is no `POST /api/v1/quick-fix/{order-entity}` route.
|
|
1954
1955
|
|
|
1955
1956
|
### Transaction-Level Request
|
|
1956
1957
|
|
|
@@ -1967,7 +1968,7 @@ POST /api/v1/quick-fix/bills
|
|
|
1967
1968
|
}
|
|
1968
1969
|
```
|
|
1969
1970
|
|
|
1970
|
-
### Line-Item-Level Request (ARAP
|
|
1971
|
+
### Line-Item-Level Request (ARAP, Accounting, Orders)
|
|
1971
1972
|
|
|
1972
1973
|
```json
|
|
1973
1974
|
POST /api/v1/quick-fix/invoices/line-items
|
|
@@ -1999,9 +2000,9 @@ POST /api/v1/quick-fix/sale-schedules/line-items
|
|
|
1999
2000
|
}
|
|
2000
2001
|
```
|
|
2001
2002
|
|
|
2002
|
-
### Response (all
|
|
2003
|
+
### Response (all 24 endpoints)
|
|
2003
2004
|
|
|
2004
|
-
**HTTP status codes**: 200 = complete success (`failed` always `[]`). **207 Multi-Status** = partial or total failure with per-item detail (same body shape as 200). 422/500 = total failure, standard error shape (no per-item data). On 207, retry only `failed` resourceIds
|
|
2005
|
+
**HTTP status codes**: 200 = complete success (`failed` always `[]`). **207 Multi-Status** = partial or total failure with per-item detail (same body shape as 200). 422/500 = total failure, standard error shape (no per-item data). On 207, retry only `failed` resourceIds (`updated` ones are done). A `failed` entry's `resourceId` is empty when the failure could not be matched to a record.
|
|
2005
2006
|
|
|
2006
2007
|
```json
|
|
2007
2008
|
{
|
|
@@ -2027,7 +2028,16 @@ Only included fields are changed — omitted fields are left unchanged.
|
|
|
2027
2028
|
- **Purchase schedules**: endDate, interval, contactResourceId, currencySettings, taxCurrencySettings, tags, customFields, capsuleResourceId
|
|
2028
2029
|
- **Journal schedules**: startDate, endDate, interval, contactResourceId, tags, internalNotes, capsuleResourceId
|
|
2029
2030
|
|
|
2030
|
-
**Line items
|
|
2031
|
+
**Line items, ARAP and orders (Pattern B)**: name, quantity, unit, unitPrice, discount, itemResourceId, organizationAccountResourceId, taxProfileResourceId, classifierConfig, withholdingTax (purchase side only: bills, supplier CNs, purchase orders, purchase requests).
|
|
2032
|
+
|
|
2033
|
+
**Quick fix line-item shapes differ from create/update** (every Pattern B route, orders included):
|
|
2034
|
+
|
|
2035
|
+
| Field | Quick fix shape | Create / update shape |
|
|
2036
|
+
|-------|-----------------|-----------------------|
|
|
2037
|
+
| `discount` | `{ "rateType": "PERCENTAGE" \| "FLAT", "rateValue": 10 }` (rateValue ≥ 0; a percentage is 0-100) | a number |
|
|
2038
|
+
| `withholdingTax` | `{ "code", "rate", "rateType", "type", "description"? }`: code, rate, rateType and type required | `{ "code", "rate" }` |
|
|
2039
|
+
|
|
2040
|
+
**Line item `classifierConfig`** (every line-item route): each entry sets or removes ONE classifier; classifiers the request does not name are left as they are, and `[]` changes nothing. Set: `{ resourceId, type, printable, selectedClasses }` with at least one class. Remove: `{ resourceId, deleted: true }` (type, printable and selectedClasses not needed). Each selected class needs `className` plus `resourceId`, or `entityResourceId` instead when the classifier draws its options from customers, suppliers, contacts, employees or users.
|
|
2031
2041
|
|
|
2032
2042
|
**Line items — journal/cash-entry (Pattern B)**: organizationAccountResourceId, amount, description, taxProfileResourceId, classifierConfig.
|
|
2033
2043
|
|
|
@@ -2057,7 +2067,7 @@ POST /api/v1/quick-fix/journal-schedules/line-items
|
|
|
2057
2067
|
|
|
2058
2068
|
Note: journal-schedules use `lineItemResourceId` (UUID), NOT `arrayIndex`.
|
|
2059
2069
|
|
|
2060
|
-
**Tags**: string array, max 50 items, max 50 chars each.
|
|
2070
|
+
**Tags**: string array, max 50 items, max 50 chars each. On invoices, bills and both credit notes the tags, joined with `|`, total at most 1000 characters, else 422.
|
|
2061
2071
|
|
|
2062
2072
|
---
|
|
2063
2073
|
|
|
@@ -2069,7 +2079,7 @@ Find and fix (recode) records across invoices, bills, both credit notes, journal
|
|
|
2069
2079
|
|------------------|-----------|
|
|
2070
2080
|
| `types` (required) | `INVOICE`, `BILL`, `CUSTOMER_CREDIT_NOTE`, `SUPPLIER_CREDIT_NOTE`, `JOURNAL` (manual and cashflow journals only), `CASH_ENTRY` |
|
|
2071
2081
|
| `resourceIds` | Up to 500; line item ids at line level |
|
|
2072
|
-
| `reference` | `eq`, `in
|
|
2082
|
+
| `reference` | `eq`, `in` (up to 100 values, as for every `in`), `contains`, `startWith` |
|
|
2073
2083
|
| `valueDate` | `eq`, `gte`, `lte`, `between: [from, to]` |
|
|
2074
2084
|
| `contactResourceId` | `eq`, `in` |
|
|
2075
2085
|
| `organizationAccountResourceId` | `eq`, `in`; line level only |
|
|
@@ -2145,6 +2155,7 @@ A blocked field is left as it is while the record's other fields still change, a
|
|
|
2145
2155
|
| `FOREIGN_CURRENCY_VALUE_DATE` | date | A new date on a foreign currency record would take a new exchange rate |
|
|
2146
2156
|
| `VALUE_DATE_AFTER_DUE_DATE` | date | The new date is after the document's due date |
|
|
2147
2157
|
| `TOO_MANY_TAGS` | tags | The record would end with more than 50 tags |
|
|
2158
|
+
| `TAGS_TOO_LONG` | tags | Invoices, bills and credit notes: the record's tags, joined with `\|`, would total more than 1000 characters |
|
|
2148
2159
|
| `CONTROL_LINE` | account | A journal line on a bank, cash or control account |
|
|
2149
2160
|
|
|
2150
2161
|
### POST /api/v1/ledger/find-fix/apply
|
|
@@ -2180,7 +2191,7 @@ Several applies can run at the same time. When two applies change records on one
|
|
|
2180
2191
|
| 422 | `CLASSIFIER_NOT_FOUND`, `CLASS_NOT_FOUND` | Line items preview, set entries only: a classifier the change sets does not exist, or a class it selects is not a current class of that classifier; `resourceId` names the classifier or class. A removal and a record-list selection (`entityResourceId`) are not checked |
|
|
2181
2192
|
| 422 | `TOO_MANY_RECORDS` | Either preview: at least `count` records or line items match, more than `limit` |
|
|
2182
2193
|
| 422 | `TOO_MANY_CALLS` | Transactions preview: the change needs `count` separate updates, more than `limit`, because records whose resulting values differ need separate updates. A line items preview never answers it |
|
|
2183
|
-
| 503 | `PREVIEW_STORE_UNAVAILABLE` |
|
|
2194
|
+
| 503 | `PREVIEW_STORE_UNAVAILABLE` | On apply: nothing applied, and the preview may be used up (preview again if a retry answers `PREVIEW_NOT_FOUND`). On preview: no previewId was issued; run the preview again |
|
|
2184
2195
|
|
|
2185
2196
|
Any other 5xx, or a timeout, on apply: the outcome is unknown. If the connection drops, apply keeps running for up to 4 minutes. Wait that long before previewing or applying again on the same records, then preview again or re-read them. Never apply this previewId again. A service restart can stop an apply; preview again to check.
|
|
2186
2197
|
|
|
@@ -562,12 +562,12 @@ if (acct.code) ctx.coaIds[acct.code] = acct.resourceId;
|
|
|
562
562
|
|
|
563
563
|
## Catalogs POST Errors
|
|
564
564
|
|
|
565
|
-
###
|
|
566
|
-
|
|
567
|
-
**
|
|
565
|
+
### POST works; the response has no resourceId
|
|
566
|
+
`POST /catalogs` returned 201 on a live probe 2026-09-23 (it used to 500). The item `unit` is optional: a null unit means "use the item's own unit".
|
|
567
|
+
**Field names**:
|
|
568
568
|
- `catalogName` (NOT `name`)
|
|
569
569
|
- `items` array with objects: `{ itemResourceId, itemName, price }` (NOT `itemResourceIds` flat array)
|
|
570
|
-
**
|
|
570
|
+
**Response**: `{ createdCatalogs, createdCatalogItems, createContactGroups }` counts, no resourceId. Find the new catalog with `search_catalogs` by `catalogName`.
|
|
571
571
|
|
|
572
572
|
---
|
|
573
573
|
|
|
@@ -616,7 +616,7 @@ account. Full model: SKILL.md Rule 47a, `endpoints.md` → Deposits, `feature-gl
|
|
|
616
616
|
|
|
617
617
|
### 404 — Endpoint does not exist
|
|
618
618
|
**Cause**: `POST /inventory/adjustments` returns 404. Also tested: `/inventory-adjustments`, `/inventory-items/:id/adjustments`, `/items/:id/inventory-adjustments` — all 404. None of the four is registered; there is no stock-adjustment write path at any spelling.
|
|
619
|
-
**Note**: The whole inventory surface is `POST|GET /inventory-items`, `GET /inventory-item-balance/:resourceId` and `GET /inventory-balances/:balanceStatus` (
|
|
619
|
+
**Note**: The whole inventory surface is `POST|GET /inventory-items`, `GET /inventory-item-balance/:resourceId` and `GET /inventory-balances/:balanceStatus` (balances across items: `ALL`, `AVAILABLE` or `FULLY_DRAWN`, Rule 97). Inventory items can be created, and stock moves as a side effect of a transaction carrying the item, but quantity cannot be written directly. See `endpoints.md` → Inventory.
|
|
620
620
|
|
|
621
621
|
---
|
|
622
622
|
|
|
@@ -251,9 +251,9 @@ Bank statement import supports CSV and PDF with configurable column mapping. Sta
|
|
|
251
251
|
|
|
252
252
|
### Quick Fix (Bulk Update)
|
|
253
253
|
|
|
254
|
-
Mass-edit transactions and line items in a single operation. Replaces the need to open and update each transaction individually. Supports all transaction types (invoices, bills, credit notes, journals, cash entries) and their scheduled/subscription variants. Common use cases: batch date corrections, reassigning contacts, bulk-tagging for reporting, changing accounts/tax profiles across multiple line items.
|
|
254
|
+
Mass-edit transactions and line items in a single operation. Replaces the need to open and update each transaction individually. Supports all transaction types (invoices, bills, credit notes, journals, cash entries) and their scheduled/subscription variants, plus line items on sale orders, sale quotes, purchase orders and purchase requests. Common use cases: batch date corrections, reassigning contacts, bulk-tagging for reporting, changing accounts/tax profiles across multiple line items.
|
|
255
255
|
|
|
256
|
-
**API**: `POST /api/v1/quick-fix/{entity}` (transaction-level) + `POST /api/v1/quick-fix/{entity}/line-items` (line-item-level).
|
|
256
|
+
**API**: `POST /api/v1/quick-fix/{entity}` (transaction-level) + `POST /api/v1/quick-fix/{entity}/line-items` (line-item-level). 24 endpoints total (orders: line items only).
|
|
257
257
|
|
|
258
258
|
### Ledger Find & Fix
|
|
259
259
|
|
|
@@ -265,7 +265,7 @@ DIFFERENT shape from single create — easier to confuse.
|
|
|
265
265
|
| `purchaseAssetAccountResourceId` | recommended | Asset account UUIDv4 |
|
|
266
266
|
| `depreciationExpenseAccountResourceId` | recommended | Depreciation expense account UUIDv4 |
|
|
267
267
|
| `accumulatedDepreciationAccountResourceId` | recommended | Accum dep account UUIDv4 |
|
|
268
|
-
| `purchaseBusinessTransactionType` | required for `NEW` | `"PURCHASE"` \| `"SALE"` \| `"JOURNAL_MANUAL"` |
|
|
268
|
+
| `purchaseBusinessTransactionType` | required for `NEW` | `"PURCHASE"` \| `"SALE"` \| `"JOURNAL_MANUAL"` \| `"JOURNAL_CASHFLOW"` \| `"JOURNAL_DIRECT_CASH_IN"` \| `"JOURNAL_DIRECT_CASH_OUT"` \| `"JOURNAL_CASH_TRANSFER"` |
|
|
269
269
|
| `purchaseBusinessTransactionResourceId` | required for `NEW` | Purchase LINE ITEM resourceId, must be UNLINKED |
|
|
270
270
|
| `accumulatedDepreciationAtTransferDate` | `TRANSFER` only | Depreciation already booked in the source system |
|
|
271
271
|
| `bookValueAtTransferDate` | `TRANSFER` only | Remaining undepreciated value |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> **The endpoints clio wraps — the REST surface is larger.** This file catalogues roughly 200
|
|
4
4
|
> paths, organized by resource, including undocumented endpoints, magic AI features, admin
|
|
5
5
|
> APIs, and advanced search/filter syntax. The committed OpenAPI spec (`spec/openapi.yaml`)
|
|
6
|
-
> carries 454 paths /
|
|
6
|
+
> carries 454 paths / 380 operations and is the authoritative list; check it before concluding
|
|
7
7
|
> an endpoint does not exist. For request/response examples of core endpoints, see
|
|
8
8
|
> endpoints.md.
|
|
9
9
|
>
|
|
@@ -262,7 +262,7 @@ Body for all three: `{ items: [{btResourceId: "<uuid>", btType: "SALE|PURCHASE|S
|
|
|
262
262
|
| POST | `/inventory-items` | Create inventory item (needs `name`, `itemCode`, `unit`, `costingMethod`, `cogsResourceId` (Direct Costs), `purchaseAccountResourceId` (Inventory), `saleAccountResourceId`, `blockInsufficientDeductions`) |
|
|
263
263
|
| GET | `/inventory-items` | List inventory items |
|
|
264
264
|
| GET | `/inventory-item-balance/:resourceId` | Get inventory balance |
|
|
265
|
-
| GET | `/inventory-balances/:balanceStatus` | List by status (
|
|
265
|
+
| GET | `/inventory-balances/:balanceStatus` | List by status: `ALL`, `AVAILABLE`, `FULLY_DRAWN` (empty = 404) |
|
|
266
266
|
| DELETE | (use `/items/:id`) | Delete inventory items via standard items endpoint |
|
|
267
267
|
|
|
268
268
|
### Tax Profiles
|
|
@@ -733,13 +733,14 @@ These features exist in the Jaz platform and may affect API responses or cause u
|
|
|
733
733
|
- Move transactions between capsules via `POST /api/v1/moveTransactionCapsules`
|
|
734
734
|
- Search transactions within capsules
|
|
735
735
|
|
|
736
|
-
### Quick Fix (Bulk Update)
|
|
736
|
+
### Quick Fix (Bulk Update): 24 Endpoints
|
|
737
737
|
|
|
738
738
|
Bulk-update transactions or line items in a single call. Pattern: `POST /api/v1/quick-fix/{entity}` + `POST /api/v1/quick-fix/{entity}/line-items`.
|
|
739
739
|
|
|
740
740
|
**ARAP**: `invoices`, `bills`, `customer-credit-notes`, `supplier-credit-notes` (× 2 = 8)
|
|
741
741
|
**Accounting**: `journals`, `cash-entries` (× 2 = 4)
|
|
742
742
|
**Schedulers**: `sale-schedules`, `purchase-schedules`, `subscription-schedules`, `journal-schedules` (× 2 = 8)
|
|
743
|
+
**Orders**: `sale-orders`, `sale-quotes`, `purchase-orders`, `purchase-requests` (line items only = 4)
|
|
743
744
|
|
|
744
745
|
Request: `{ resourceIds: [...], attributes: {...} }` (transactions) or `{ lineItemResourceIds: [...], attributes: {...} }` (line items) or `{ schedulerUpdates: [...] }` (scheduler line items).
|
|
745
746
|
Response: `{ updated: [...], failed: [{ resourceId, error, errorCode }] }`. HTTP 200 = all succeeded. **207 Multi-Status** = partial failure (check both arrays). 422/500 = total failure (standard error shape).
|
|
@@ -81,6 +81,8 @@ To change lines:
|
|
|
81
81
|
|
|
82
82
|
The update tools (and `clio … update --lines`) pre-flight this against the stored document: lines with no `resourceId` at all on a document that already has lines are refused locally (nothing is written) unless `appendLines: true` (CLI `--append-lines`) says adding is the intent; naming some stored lines but not all is refused locally with the missing ids.
|
|
83
83
|
|
|
84
|
+
To change a few fields on some lines without resending the document, use `quick_fix_line_items` (`clio quick-fix <entity> --line-items`) with entity `sale-orders`, `sale-quotes`, `purchase-orders` or `purchase-requests`: `{ lineItemResourceIds, attributes }`, only the fields sent change, and the lines not named are untouched. Attributes: name, quantity, unit, unitPrice, discount, itemResourceId, organizationAccountResourceId, taxProfileResourceId, classifierConfig, plus withholdingTax on purchase orders and requests. `discount` and `withholdingTax` take the quick fix shapes, not the ones this page's create/update use (`discount: { rateType, rateValue }`, `withholdingTax: { code, rate, rateType, type }`): see endpoints.md section 17. Orders have line-item quick fix only: `quick_fix_transactions` refuses them.
|
|
85
|
+
|
|
84
86
|
## Delete vs Void
|
|
85
87
|
|
|
86
88
|
- **DELETE is draft-only** (422 on anything non-draft). `transition_* action:DELETE` pre-flights status and returns a `repair` hint to use `VOID` for non-draft records.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jaz-cli
|
|
3
|
-
version: 5.
|
|
3
|
+
version: 5.70.0
|
|
4
4
|
description: >-
|
|
5
5
|
Use this skill when running Clio CLI commands, building shell scripts with
|
|
6
6
|
Clio, debugging auth issues, understanding --json output, paginating results,
|
|
@@ -8,7 +8,7 @@ description: >-
|
|
|
8
8
|
precedence, output formats, entity resolution, and common workflow patterns.
|
|
9
9
|
Also use when the user asks how to use clio, what commands are available, or
|
|
10
10
|
how to automate accounting tasks from the command line. Covers all
|
|
11
|
-
74 command groups and
|
|
11
|
+
74 command groups and 380 tools, including employee-expense claims.
|
|
12
12
|
license: MIT
|
|
13
13
|
compatibility: Requires Node.js >= 18.0.0. Install via npm install -g jaz-clio.
|
|
14
14
|
---
|
|
@@ -17,7 +17,7 @@ compatibility: Requires Node.js >= 18.0.0. Install via npm install -g jaz-clio.
|
|
|
17
17
|
|
|
18
18
|
> **Audience note:** for power users and CI/automation. Load this skill only when you're scripting from a terminal, building shell pipelines, or debugging from `clio --json` output. For day-to-day accounting inside Claude Desktop / Cowork, the MCP tools cover the common flows without dropping to the CLI.
|
|
19
19
|
|
|
20
|
-
You are working with **Clio** (`jaz-clio`) — the CLI for the Jaz accounting platform. 74 command groups, 13 calculators, 12 job blueprints,
|
|
20
|
+
You are working with **Clio** (`jaz-clio`) — the CLI for the Jaz accounting platform. 74 command groups, 13 calculators, 12 job blueprints, 380 tools. Also fully compatible with Juan Accounting (same API, same endpoints).
|
|
21
21
|
|
|
22
22
|
## When to Use This Skill
|
|
23
23
|
|
|
@@ -539,7 +539,7 @@ Also: `clio reports pdf` — generate PDF from a message/document.
|
|
|
539
539
|
| `status <workflowIds>` | Comma-separated workflow IDs |
|
|
540
540
|
|
|
541
541
|
### `clio quick-fix <entity>` — Bulk-update transactions
|
|
542
|
-
Entities: `invoices`, `bills`, `customer-credit-notes`, `supplier-credit-notes`, `journals`, `cash-entries`, `sale-schedules`, `purchase-schedules`, `subscription-schedules`, `journal-schedules`
|
|
542
|
+
Entities: `invoices`, `bills`, `customer-credit-notes`, `supplier-credit-notes`, `journals`, `cash-entries`, `sale-schedules`, `purchase-schedules`, `subscription-schedules`, `journal-schedules`, and with `--line-items` only: `sale-orders`, `sale-quotes`, `purchase-orders`, `purchase-requests`
|
|
543
543
|
|
|
544
544
|
| Flag | Purpose |
|
|
545
545
|
|------|---------|
|
|
@@ -722,7 +722,7 @@ Valid entity types: INVOICE, BILL, CUSTOMER_CREDIT_NOTE, SUPPLIER_CREDIT_NOTE, S
|
|
|
722
722
|
Universal async tracker — any operation returning a jobId (contacts bulk-upsert, items bulk-upsert, bank import, magic processing) can be polled here.
|
|
723
723
|
|
|
724
724
|
### `clio mcp` — MCP stdio server
|
|
725
|
-
Starts an MCP server for Claude Code / AI tool integration. Exposes all
|
|
725
|
+
Starts an MCP server for Claude Code / AI tool integration. Exposes all 380 operations.
|
|
726
726
|
|
|
727
727
|
### `clio serve` — HTTP daemon
|
|
728
728
|
Starts the HTTP daemon for ChatKit and email channel integrations.
|
|
@@ -4,7 +4,7 @@ Jaz accounting guidance for this workspace. Load the installed Jaz skills for de
|
|
|
4
4
|
|
|
5
5
|
## Discovery
|
|
6
6
|
|
|
7
|
-
Jaz exposes **
|
|
7
|
+
Jaz exposes **380 tools across 46 namespaces**. Your tool list shows **3, 45, or 371** entries depending on packaging — **never infer capability from its length.**
|
|
8
8
|
|
|
9
9
|
- **3** — `search_tools(query)` → `describe_tools(names)` → `execute_tool(name, args)`. Empty query returns the namespace map.
|
|
10
10
|
- **45** — namespace routers; call one with `{ operation, arguments }`. Its description lists its operations.
|