Skip to main content
Glama

Search local businesses

search_local_businesses
Read-onlyIdempotent

Find local businesses on WRDO in the Western Cape by what they do (or their name), optionally in a town or suburb, optionally narrowed by category, price list, price and whether they are open now. Example: "hairdressers in Paarl under R200 that are open now". Give "what" (words) and/or "category" (an exact slug from list_categories). Returns id, name, category, area, verified (claimed by the owner), page_url, start_url, has_price_list, price_from_rand (cheapest listed price, rand, or null) and open_now (true, false or null when unknown). When any of has_price_list, max_price_rand or open_now is used, only the top 100 matches are checked (a message says so). open_now uses opening hours that verified businesses publish; a business without readable hours is left out when open_now is true. No contact details: to reach a business, give the person its start_url.

Input Schema

NameRequiredDescriptionDefault
whatNoWhat the person needs: a kind of business or service ("plumber", "pizza") or a business name. Optional when "category" is given.
limitNoHow many results, 1 to 20 (default 10).
whereNoA town or suburb in the Western Cape, e.g. "Paarl" or "Val de Vie, Paarl". Leave out for the whole Western Cape.
categoryNoOnly businesses in this category: an exact plural slug such as "restaurants", "hair-salons" or "plumbers" (list_categories returns the valid slugs and which have businesses). An unknown slug returns an error listing the valid ones.
open_nowNotrue: only businesses that are open right now in South Africa (SAST). Only verified businesses with readable hours can match; those without hours are excluded. Leave out when the person does not need it.
has_price_listNotrue: only businesses with a price list or menu on WRDO (so get_price_list will have content). false: only those without. Leave out for both.
max_price_randNoOnly businesses with at least one listed item priced at or under this many rand (e.g. 200). Businesses without a listed price never match. The cheapest price may be unconfirmed (from their website); get_price_list says so.

Output Schema

NameRequiredDescriptionDefault
sourceYes
messageNo
resultsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • addedInput schema / properties / category
      Added value: +{
      +  "description": "Only businesses in this category: an exact plural slug such as \"restaurants\", \"hair-salons\" or \"plumbers\" (list_categories returns the valid slugs and which have businesses). An unknown slug returns an error listing the valid ones.",
      +  "maxLength": 80,
      +  "type": "string"
      +}
    • addedInput schema / properties / has_price_list
      Added value: +{
      +  "description": "true: only businesses with a price list or menu on WRDO (so get_price_list will have content). false: only those without. Leave out for both.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / max_price_rand
      Added value: +{
      +  "description": "Only businesses with at least one listed item priced at or under this many rand (e.g. 200). Businesses without a listed price never match. The cheapest price may be unconfirmed (from their website); get_price_list says so.",
      +  "exclusiveMinimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / open_now
      Added value: +{
      +  "description": "true: only businesses that are open right now in South Africa (SAST). Only verified businesses with readable hours can match; those without hours are excluded. Leave out when the person does not need it.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / what / description
      Previous value: -"What the person needs: a kind of business or service (\"plumber\", \"pizza\") or a business name."New value: +"What the person needs: a kind of business or service (\"plumber\", \"pizza\") or a business name. Optional when \"category\" is given."
    • changedInput schema / properties / where / description
      Previous value: -"A town or suburb, e.g. \"Paarl\" or \"Val de Vie, Paarl\". Leave out to search everywhere."New value: +"A town or suburb in the Western Cape, e.g. \"Paarl\" or \"Val de Vie, Paarl\". Leave out for the whole Western Cape."
    • removedInput schema / required
      Removed value: -[
      -  "what"
      -]
    • addedOutput schema / properties / results / items / properties / has_price_list
      Added value: +{
      +  "description": "True when WRDO holds a price list or menu for this business (see get_price_list).",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / results / items / properties / open_now
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Open right now in South Africa (SAST), from the hours on a verified business page; null when unknown."
      +}
    • addedOutput schema / properties / results / items / properties / price_from_rand
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Cheapest listed item with a price, in rand; null when no item has a price."
      +}
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "id",
      -  "name",
      -  "category",
      -  "area",
      -  "verified",
      -  "page_url",
      -  "start_url"
      -]New value: +[
      +  "id",
      +  "name",
      +  "category",
      +  "area",
      +  "verified",
      +  "page_url",
      +  "start_url",
      +  "has_price_list",
      +  "price_from_rand",
      +  "open_now"
      +]
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial beyond them: the top-100 evaluation cap when has_price_list/max_price_rand/open_now are used, the verified-and-readable-hours requirement for open_now, null semantics for open_now/price_from_rand, and the absence of contact details.

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?

Front-loaded with the core action and example, and each behavioral sentence carries unique information. It is dense and slightly overlong, and the enumerated return fields partly duplicate the existing output schema, which costs a point.

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 7-parameter, zero-required search tool with annotations and an output schema, the description covers invocation rules, filter side effects, and next-step routing. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds real semantics, notably that "what" and "category" are mutually optional but at least one is needed, and how the price-list/price/open-now filters interact with result truncation.

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?

States a specific verb (find) and resource (local businesses) with explicit scope (WRDO, Western Cape) and enumerates the axes it can search on. It is distinguishable from siblings at a glance: get_business is by id, list_categories supplies slugs, start_request handles contact.

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?

Gives a worked example query, tells the agent what must be supplied ("what" and/or "category"), routes slug lookups to list_categories, and explicitly redirects contact attempts to start_url. It also conditions when to pass the costlier filters via the top-100 caveat.

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.