Skip to main content
Glama

booksy_businesses

Read-only

List one page of Booksy's salon and barber marketplace for a country, filtered by a top-level category id, a treatment id, a free-text query or a comma-separated list of business ids, and optionally scoped to a Booksy location. Returns each business's id, name, address and coordinates, distance, aggregate review counters, primary category, promotion and badge flags, and cover image, plus the resolved location node, the marketplace total and whether a further page exists. Get category ids from booksy_categories and treatment ids from booksy_treatment_hints; both are INTEGER ids and a slug is rejected, and they may be combined. The app's own listing filters are accepted too: sort_order is one of distance, score, top_rated or by_ids, where by_ids requires business_ids and returns the businesses in that supplied order, and score is the marketplace default ranking and changes nothing; gender is one of M, F or R and reorders the page for a stated client gender without filtering it, so the total is unchanged; open_now and has_special_offers are booleans that restrict the page to businesses open now or running a special offer; and business_ids is a comma-separated bulk lookup of at most 100 ids that also satisfies the requirement for one of category, treatment or query. At least one of category, treatment, query or business_ids is required. page_size is capped at 100, page 0 is rejected, and a page past the end is an honest empty array with the total intact. total saturates at 10000 and total_capped says when it is a ceiling. Read location in the response rather than trusting location_name, because an unknown name silently resolves to the whole country. Use booksy_business for one business's full record.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "booksy_businesses"
  }
}

Input Schema

NameRequiredDescriptionDefault
pageNo1-based page number, default 1. Page 0 is rejected locally because the upstream answers a validation error; a page past the end is an honest empty businesses array with the total intact.
queryNoOptional free-text search term, for example braids or fades. At least one of category, treatment or query is required.
genderNoOptional ranking personalisation, one of: M (male), F (female), R (refused / not stated, Booksy's own neutral default). It reorders the page for a stated client gender but does NOT filter the match set, so the total is unchanged. Booksy silently ignores an unrecognised value, so it is validated here instead of upstream.
countryNoOptional Booksy market, one of: ar, au, br, ca, cl, co, de, es, fr, gb, ie, it, mx, nl, pl, pt, us, za. Defaults to us. These are the only country hosts that serve this API; the app's other country hosts redirect to the website or do not resolve.
categoryNoOptional top-level category id from booksy_categories, for example 6 for Barber or 1 for Hair. It must be an INTEGER id: the upstream rejects a slug with a validation error. An id outside the 18-value enum answers an empty list rather than an error.
open_nowNoOptional: true restricts the page to businesses open at the moment of the request. A pointer so that omitted and false are distinguishable. It is sent upstream as 1/0 because Booksy rejects true/false on this parameter.
page_sizeNoRecords per page, default 20, maximum 100. Values above 100 are rejected because the upstream silently clamps them to 100.
treatmentNoOptional treatment id from booksy_treatment_hints, for example 363 for Male Haircut. It must be an INTEGER id; a slug is rejected upstream. May be combined with category.
sort_orderNoOptional listing order, one of: distance, score, top_rated, by_ids. distance orders by distance from the requested location, so it is only meaningful with location_id, location_name or location_geo; score is the marketplace's default ranking and returns the same order as sending no sort_order at all; top_rated orders by rating; by_ids returns businesses in business_ids' own order and therefore requires business_ids.
location_idNoOptional Booksy location id (city, region or country node), for example 30067 for New York City. Supply it instead of location_name. Learn ids from a previous response's location_details.
business_idsNoOptional comma-separated Booksy business ids for a bulk lookup, at most 100, for example 421547,646877. Every entry must be a positive integer. The businesses come back in the order supplied and the total is the number of ids that exist. This is the bulk-lookup form of the app client's sort_order=by_ids call, which requires business_ids. Supplying ids also satisfies the requirement for at least one of category, treatment or query.
location_nameNoOptional location name for the server to resolve, for example New York City or Orlando. Supply it instead of location_id. An unknown name is not an error: the server silently falls back to the whole country, so always read the response's location_details to see what was applied.
has_special_offersNoOptional: true restricts the page to businesses running a special offer. A pointer so that omitted and false are distinguishable. It is sent upstream as true/false, which is the form this parameter accepts.

Output Schema

NameRequiredDescriptionDefault
dataYesThe tool result payload (shape varies per tool; see each tool's docs resource).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedInput schema / properties / business_ids
      Added value: +{
      +  "description": "Optional comma-separated Booksy business ids for a bulk lookup, at most 100, for example 421547,646877. Every entry must be a positive integer. The businesses come back in the order supplied and the total is the number of ids that exist. This is the bulk-lookup form of the app client's sort_order=by_ids call, which requires business_ids. Supplying ids also satisfies the requirement for at least one of category, treatment or query.",
      +  "type": "string"
      +}
    • addedInput schema / properties / gender
      Added value: +{
      +  "description": "Optional ranking personalisation, one of: M (male), F (female), R (refused / not stated, Booksy's own neutral default). It reorders the page for a stated client gender but does NOT filter the match set, so the total is unchanged. Booksy silently ignores an unrecognised value, so it is validated here instead of upstream.",
      +  "type": "string"
      +}
    • addedInput schema / properties / has_special_offers
      Added value: +{
      +  "description": "Optional: true restricts the page to businesses running a special offer. A pointer so that omitted and false are distinguishable. It is sent upstream as true/false, which is the form this parameter accepts.",
      +  "type": [
      +    "null",
      +    "boolean"
      +  ]
      +}
    • addedInput schema / properties / open_now
      Added value: +{
      +  "description": "Optional: true restricts the page to businesses open at the moment of the request. A pointer so that omitted and false are distinguishable. It is sent upstream as 1/0 because Booksy rejects true/false on this parameter.",
      +  "type": [
      +    "null",
      +    "boolean"
      +  ]
      +}
    • addedInput schema / properties / sort_order
      Added value: +{
      +  "description": "Optional listing order, one of: distance, score, top_rated, by_ids. distance orders by distance from the requested location, so it is only meaningful with location_id, location_name or location_geo; score is the marketplace's default ranking and returns the same order as sending no sort_order at all; top_rated orders by rating; by_ids returns businesses in business_ids' own order and therefore requires business_ids.",
      +  "type": "string"
      +}
  2. Added

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint and openWorldHint, and the description adds substantial behavior the annotations cannot: page 0 is rejected locally, page_size clamps above 100, a page past the end yields an empty array with the total intact, total saturates at 10000 with total_capped flagging the ceiling, and an unknown location_name silently falls back to the whole country. That last warning is a genuine failure-mode disclosure that prevents a silent wrong answer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the result shape are front-loaded in the first two sentences, then constraints and the sibling pointer follow in a sensible order. It is long for a single tool and overlaps noticeably with the schema's own parameter descriptions, but every sentence carries operational content rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter paginated marketplace search with a real pagination/saturation edge case, nothing an agent needs to call it correctly is missing: id sourcing, filter exclusivity, ordering semantics, page bounds, total capping, and location resolution caveats are all covered. An output schema exists, so the return-value enumeration is arguably surplus, but it does not leave a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 13 parameters in near-identical language, and much of the description's parameter prose (sort_order values, gender semantics, business_ids ordering, location_name fallback) repeats it rather than adding new meaning. The description does add cross-parameter relationships, such as category and treatment being combinable and business_ids satisfying the mandatory-filter requirement, but that is marginal given the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ("List one page of Booksy's salon and barber marketplace") and enumerates the filter axes, then explicitly routes to the sibling: "Use booksy_business for one business's full record." It also names booksy_categories and booksy_treatment_hints as the id sources, so the agent can distinguish this from every booksy_* sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the hard precondition ("At least one of category, treatment, query or business_ids is required"), explains when each ordering applies (distance only meaningful with a location, score is the default, by_ids requires business_ids), and clarifies that gender and score reorder rather than filter. It also names the alternative lookup tool for single-business detail, which is exactly the when-not guidance the rubric rewards.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.