Skip to main content

Tools

The server exposes four generic tools. They are not per-resource — instead, each one takes a resource argument, so the same four tools cover all 77 resources. Two are for discovery, two are for reading data.

ToolPurpose
api_v3_resourcesList every resource available, with a short description.
api_v3_resource_schemaDescribe one resource: attributes, filters, operators, relationships.
api_v3_listFetch a paginated list of records from a resource.
api_v3_getFetch a single record by id.

A typical agent calls them in that order: discover what exists, learn how to query it, then query.


api_v3_resources

Lists every read-only resource exposed via MCP. It's a lightweight index — call it once at the start of a session to learn what exists.

Arguments: none.

Returns an array of resources, each with a name, a one-line description, and a filterable flag (whether the resource supports attribute filters):

{
"resources": [
{
"name": "bookings",
"description": "Reservations and unavailable periods. By default returns visible (non-canceled) bookings.",
"filterable": true
},
{
"name": "bookings_fees",
"description": "Per-booking fees attached to reservations (cleaning, tax, etc.).",
"filterable": true
},
{
"name": "rentals",
"description": "Listings/properties for the account.",
"filterable": true
}
]
}

To learn a specific resource's attributes and filters, follow up with api_v3_resource_schema.


api_v3_resource_schema

Returns the detailed schema of a single resource so the agent knows exactly what it can request and filter on — without trial and error.

Arguments:

ArgumentTypeRequiredDescription
resourcestringyesResource name (from api_v3_resources), e.g. bookings.

Returns an object describing:

  • attributes — every field in the response (this doubles as the response shape). Each has a type, a value format hint, a filterable flag, and the comparison operators it accepts.
  • relationships — associated resources, and (for belongs_to) the filter keys/type/operators to filter by them; polymorphic relationships list a companion requires key.
  • resource_filters — resource-specific filters accepted as top-level arguments (e.g. bookings' status, from, until).
  • standard_filtersids, updated_since, limit, offset (available on every resource).
  • sparse_fieldsets — always true.
  • filter_examples — ready-to-use filter payloads for this resource.

Example (excerpt) for bookings:

{
"name": "bookings",
"description": "Reservations and unavailable periods. By default returns visible (non-canceled) bookings.",
"attributes": [
{ "name": "id", "type": "integer", "format": "integer", "filterable": true, "operators": ["eq","not_eq","gt","gteq","lt","lteq"] },
{ "name": "start_at", "type": "datetime", "format": "ISO 8601", "filterable": true, "operators": ["eq","not_eq","gt","gteq","lt","lteq"] },
{ "name": "end_at", "type": "datetime", "format": "ISO 8601", "filterable": true, "operators": ["eq","not_eq","gt","gteq","lt","lteq"] },
{ "name": "status", "type": "computed", "format": null, "filterable": false, "operators": [] },
{ "name": "reference", "type": "string", "format": "string", "filterable": true, "operators": ["eq","in","not_eq","matches","does_not_match"] }
],
"relationships": [
{
"name": "rental",
"kind": "has_one",
"polymorphic": false,
"resource": "rentals",
"filter": { "keys": ["rental_id", "rental"], "type": "integer", "operators": ["eq","not_eq","gt","gteq","lt","lteq"] }
}
],
"resource_filters": [
{ "name": "status", "type": "string", "description": "Comma-separated: booked, unavailable, tentative" },
{ "name": "from", "type": "string", "description": "Only bookings starting on/after this ISO 8601 date (default: now)" }
],
"standard_filters": ["ids", "updated_since", "limit", "offset"],
"sparse_fieldsets": true,
"filter_examples": [
{ "reference": "..." },
{ "start_at": { "op": "gt", "value": "2026-01-01T00:00:00Z" } },
{ "start_at": [ { "op": "gteq", "value": "2026-01-01T00:00:00Z" }, { "op": "lt", "value": "2026-12-31T00:00:00Z" } ] },
{ "rental_id": 1 }
]
}
computed attributes

Attributes with "type": "computed" are derived values that aren't backed by a database column. They are returned in the response but cannot be filtered on (filterable: false, empty operators).

See Querying for how to turn this schema into actual filter and fields arguments.


api_v3_list

Fetches a paginated list of records from a resource. Returns payloads in the same shape as the API v3 index endpoint.

Arguments:

ArgumentTypeRequiredDescription
resourcestringyesResource name (from api_v3_resources).
account_idintegerconditionalAccount to operate on. Required for multi-account tokens, ignored for single-account ones. See account selection.
idsstringnoComma-separated list of IDs to fetch, e.g. "12,34,56".
updated_sincestringnoISO 8601 timestamp; only records updated after this time.
limitintegernoPage size (default 25, max 100).
offsetintegernoPagination offset (default 0).
filterobjectnoAttribute/relationship filters. See Querying → Filtering.
fieldsarraynoSparse fieldset: return only these attributes. See Querying → Sparse fieldsets.

Resource-specific filters (such as bookings' status, from, until) are passed as top-level arguments alongside the standard ones — api_v3_resource_schema lists them under resource_filters.

Example call (bookings for one rental, two fields, first page):

{
"name": "api_v3_list",
"arguments": {
"resource": "bookings",
"filter": { "rental_id": 42 },
"fields": ["start_at", "end_at", "final_price"],
"limit": 10,
"offset": 0
}
}

Response shape — a key named after the resource, plus a meta object:

{
"bookings": [
{ "id": 123, "start_at": "2026-07-01T00:00:00", "end_at": "2026-07-08T00:00:00", "final_price": "1450.0" }
],
"meta": { "total_count": 1, "limit": 10, "offset": 0 }
}

api_v3_get

Fetches a single record by id. Returns the payload in the same shape as the API v3 show endpoint.

Arguments:

ArgumentTypeRequiredDescription
resourcestringyesResource name (from api_v3_resources).
idintegeryesThe record ID.
account_idintegerconditionalAccount to operate on. Required for multi-account tokens, ignored for single-account ones. See account selection.
fieldsarraynoSparse fieldset: return only these attributes (id always included).

Example call:

{
"name": "api_v3_get",
"arguments": {
"resource": "bookings",
"id": 123,
"fields": ["start_at", "end_at", "final_price"]
}
}
Fetching many records by id

To fetch several specific records in one round-trip, prefer api_v3_list with the ids filter ("ids": "12,34,56") over multiple api_v3_get calls.


How results are returned over MCP

Per the MCP spec, a tools/call result wraps the JSON payload as text content. The JSON shown above is what you'll find inside content[0].text:

{
"content": [
{ "type": "text", "text": "{\"bookings\":[{\"id\":123, ...}],\"meta\":{\"total_count\":1,\"limit\":10,\"offset\":0}}" }
]
}

MCP clients parse and present this for you; you rarely need to handle the envelope directly. See Protocol & transport for the raw JSON-RPC details.