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.
| Tool | Purpose |
|---|---|
api_v3_resources | List every resource available, with a short description. |
api_v3_resource_schema | Describe one resource: attributes, filters, operators, relationships. |
api_v3_list | Fetch a paginated list of records from a resource. |
api_v3_get | Fetch 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:
| Argument | Type | Required | Description |
|---|---|---|---|
resource | string | yes | Resource 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 atype, a valueformathint, afilterableflag, and the comparisonoperatorsit accepts.relationships— associated resources, and (forbelongs_to) thefilterkeys/type/operators to filter by them; polymorphic relationships list a companionrequireskey.resource_filters— resource-specific filters accepted as top-level arguments (e.g. bookings'status,from,until).standard_filters—ids,updated_since,limit,offset(available on every resource).sparse_fieldsets— alwaystrue.filter_examples— ready-to-usefilterpayloads 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 attributesAttributes 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:
| Argument | Type | Required | Description |
|---|---|---|---|
resource | string | yes | Resource name (from api_v3_resources). |
account_id | integer | conditional | Account to operate on. Required for multi-account tokens, ignored for single-account ones. See account selection. |
ids | string | no | Comma-separated list of IDs to fetch, e.g. "12,34,56". |
updated_since | string | no | ISO 8601 timestamp; only records updated after this time. |
limit | integer | no | Page size (default 25, max 100). |
offset | integer | no | Pagination offset (default 0). |
filter | object | no | Attribute/relationship filters. See Querying → Filtering. |
fields | array | no | Sparse 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:
| Argument | Type | Required | Description |
|---|---|---|---|
resource | string | yes | Resource name (from api_v3_resources). |
id | integer | yes | The record ID. |
account_id | integer | conditional | Account to operate on. Required for multi-account tokens, ignored for single-account ones. See account selection. |
fields | array | no | Sparse 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"]
}
}
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.