Listing, Filters and Fields
The *_list tools use the same pagination as the REST API: by cursor.
| Argument | Default | Max |
|---|---|---|
limit | 25 | 100 (10000 on the *_ids tools) |
cursor | — | — |
{ "name": "finance_payables_list", "arguments": { "limit": 50 } }
The result carries the usual envelope:
{
"data": [ /* ... */ ],
"meta": { "next_cursor": "eyJpZCI6Mn0" }
}
For the next page, send meta.next_cursor as cursor, with the same filters. next_cursor: null means this is the last page. See Listing and pagination in the API.
Filters
filters is an object with exactly the filters the listing accepts — the tool's inputSchema enumerates them, with each one's operators. A filter or operator outside the list is refused before it reaches the endpoint. Pagination, sort and columns (limit, cursor, sort_by, sort_order, fields — and page, per_page and sort, from other APIs) are named arguments: inside filters they are refused with VALIDATION_ERROR, naming the keys, and never override the argument.
| Form | Means | Becomes |
|---|---|---|
"status": "pending" | equals | ?status=pending |
"status": ["pending", "paid"] | is in | ?status[in]=pending,paid |
"due_date": { "gte": "2026-11-01", "lt": "2026-12-01" } | operators | ?due_date[gte]=…&due_date[lt]=… |
{ "name": "finance_payables_list",
"arguments": {
"filters": { "company_id": "…", "status": "pending", "due_date": { "lte": "2026-11-30" } },
"sort_by": "due_date", "sort_order": "asc"
} }
The full grammar is in Filtering and sorting.
Sorting
| Argument | Values | Default |
|---|---|---|
sort_by | One of the columns the listing sorts by (the inputSchema lists them) | varies per resource |
sort_order | asc or desc | asc |
Fields (fields)
The record-read tools accept fields, an array of column names. Omitted, the whole record comes back; given, only those:
{ "name": "finance_payables_list",
"arguments": { "filters": { "status": "pending" }, "fields": ["description", "amount", "due_date"] } }
| Rule | Why |
|---|---|
id always comes back | A projection you cannot follow up on is useless, and silently dropping id would break the next call, not this one. |
| Top level only | fields: ["reconciliation"] returns the whole object; there is no reconciliation.kind syntax. |
| Record reads only | Writes return the whole record; totals, *_ids and download do not offer the argument. |
| An unknown name is an error | 400 with details.unknown and details.available. Ignoring it would return fewer fields than asked, looking as if the record does not have them. |
It is the same ?fields= as the API. And it is the cheapest way to reduce the context an agent spends.
finance_schemas_get — the field catalogue
fields is only useful if you know what to ask for. finance_schemas_get answers from the published contract's schemas:
{ "name": "finance_schemas_get", "arguments": {} }
{ "name": "finance_schemas_get", "arguments": { "schema": "PayableV1" } }
With no argument it returns the catalogue; with schema, that schema's fields — name, type, enum, nullability and description. It is the same OpenAPI that generates the API reference.
Data contract
What holds for the API holds here, because it is the same code:
- snake_case everywhere, arguments and responses.
- Money is a number in BRL, with up to 2 decimals:
1500.5is R$ 1,500.50. Titles and transactions are always positive — direction comes from the type, not the sign. - Dates in ISO 8601.
- Writes accept
idempotency_key— see Idempotency.