Skip to main content
Glama

Server Details

Manage a store locator by chatting: locations, tags, booking buttons, map styling, embed code.

Ownership verified
Status
Healthy
Uptime
99.2% over 44 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL

TDQS

A3.9/5.0

Scored across 28 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions, and the descriptions actively disambiguate tricky pairs (tag_locations vs set_custom_field, list_locations vs find_nearest_locations, describe/propose/apply/rollback_configuration). A few boundaries are subtler, such as tag_locations vs set_tag_style and the several configuration-lifecycle tools, but they remain distinguishable.

Naming Consistency4/5

The set is uniformly snake_case and overwhelmingly follows a verb_noun pattern (create_location, list_tags, delete_territory, update_spotlight_rule). Minor deviations exist—tag_locations uses a noun as a verb, and add_territory_postcodes/explain_territory_owner are longer verb_noun_noun forms—but nothing is ambiguous or mixed-convention.

Tool Count3/5

28 tools is on the heavy side for a locator and crosses into the crowded range, spanning locations, tags, spotlight rules, territories, and configuration. Each tool maps to a real operation, so it is not bloated with filler, but the surface is larger than an agent can hold comfortably.

Completeness4/5

Core lifecycles are well covered: full location CRUD, spotlight-rule CRUD plus enable/disable, territory create/delete/publish/explain, and a complete propose/apply/versions/rollback configuration flow. Minor gaps remain, such as no dedicated tag deletion/rename or territory update/get tool, but agents can work around them.

Available Tools

28 tools
add_territory_postcodesAdd postcodes to a territoryAInspect

Grant (include) or carve out (exclude) postcodes for a territory. Not live until publish_territories.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe territory, for delete and add_postcodes.
opNoFor add_postcodes: whether this list grants coverage or carves it out. Default include.
postcodesYesFor add_postcodes. Full codes or prefixes written like SW1A*. Free text is accepted and split on commas, spaces and newlines.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=false, and destructive=false. The description adds a genuinely important behavioral trait beyond the annotations: changes are not live until publish_territories is called, revealing a draft/staging model. It still omits auth requirements and whether postcodes append to or replace the existing set.

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

Conciseness5/5

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

Two tight sentences with no waste. The core operation and its two modes are front-loaded, and the staging caveat follows immediately.

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

Completeness4/5

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

For a mutation tool with annotations covering the safety profile and a fully documented schema, the description is nearly complete, covering purpose, modes, and the publish dependency. It could be improved by clarifying append-vs-replace semantics, but nothing critical is missing.

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 id, op, and postcodes in detail, including the include/exclude default and the free-text splitting behavior. The description restates the include/exclude concept but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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 and resource — adding postcodes to a territory — and immediately clarifies the two operating modes ('Grant (include) or carve out (exclude)'). An agent can distinguish this from siblings like create_territory or delete_territory 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 Guidelines4/5

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

The description provides a clear workflow context by naming publish_territories as the step required to make changes live, which tells the agent this is a staging operation. However, it doesn't state explicit alternatives or when-not-to-use conditions (e.g., whether another tool adds postcodes differently).

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

apply_configurationApply a configuration proposalA
Destructive
Inspect

Make a prepared proposal live on the customer's website. Only call this after showing the person the differences from propose_configuration and getting their agreement. Refused if the locator changed since the proposal was prepared.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposalIdYesThe id returned by propose_configuration.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the risk profile is covered structurally. The description adds real behavioral context beyond that: a mandatory human-consent workflow and a staleness-based refusal condition, which the agent could not infer from annotations. It stops short of saying whether the change is reversible or how to undo it (rollback_configuration exists but is not referenced).

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

Conciseness5/5

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

Three tight sentences: action first, precondition second, failure mode third. No filler and nothing buried.

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

Completeness4/5

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

For a destructive, non-idempotent, open-world mutation with no output schema, the description covers the action, the consent requirement, and the refusal condition. It could go further by noting recoverability or pointing at rollback_configuration for undoing a bad apply, but nothing needed 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.

Parameters3/5

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

Schema description coverage is 100% and the single parameter's description already states it is 'the id returned by propose_configuration.' The description reinforces the proposal origin but adds no format, validation, or semantics beyond the schema, so baseline 3 applies.

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?

'Make a prepared proposal live on the customer's website' is a specific verb+resource statement, and the pairing with propose_configuration makes clear what artifact it operates on versus its sibling. An agent can distinguish this from propose_configuration, describe_configuration, and rollback_configuration 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?

It gives an explicit precondition ('Only call this after showing the person the differences from propose_configuration and getting their agreement') and an explicit when-not ('Refused if the locator changed since the proposal was prepared'). That is a clear usage gate and failure condition tied directly to the sibling tool.

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

create_locationAdd a locationAInspect

Add one location, or many in a single call. A plain address is geocoded automatically, so lat and lng are only needed to override the result. Pass locations with an array to add a batch: adding ten showrooms is one call, not ten, and the reply says exactly which ones landed. Counts against the plan's location allowance.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude. Supplying lat and lng skips geocoding.
lngNoLongitude.
cityNo
nameNoBusiness or store name.
emailNo
hoursNoOpening hours keyed by ISO weekday, 1 = Monday. Each value is ONE {open, close} in 24h HH:MM, or null for closed — not a list, and a list is rejected. Example: {"1": {"open": "09:00", "close": "17:00"}, "7": null}. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch.
phoneNo
stateNo
addressNoFull address as a person would write it. Geocoded automatically unless lat and lng are supplied.
websiteNo
imageUrlNo
priorityNoHigher sorts first when there is no visitor position.
timezoneNoIANA timezone, for example America/Chicago.
locationsNoSeveral locations to add in one call (at most 50). Use this instead of the top-level fields when adding more than one; each entry takes the same fields.
hoursPatchNoChange only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {"7": {"open": "10:00", "close": "16:00"}} changes Sunday alone, and {"7": null} closes it. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent.
postalCodeNo
visibilityNohidden keeps the location in the account but off the public locator.
countryCodeNoTwo-letter ISO country code.
descriptionNo
markerColorNoHex colour for this location's map marker.
addressLine1NoStreet line, when the address is structured.
customFieldsNoExtra fields, keyed by the label shown to visitors. The value is either a plain string, or an object {value, color, icon, style} where `value` is the URL or text. There is no `label` or `url` key: the label is the key, and the URL goes in `value`. Example: {"Book a table": {"value": "https://example.com/book", "color": "#C2540E"}}. Never use this for tags or categories; use the categories field instead.
locationTypeNopoint is a physical address, service_area covers a radius, online is a stockist with no address.
onlineRegionsNoFor an online location: two-letter country codes it ships to or serves, e.g. ["us", "ca"]. Empty means every visitor sees it.
serviceRadiusKmNoRadius in km, for a service_area location.
serviceAreaCircleVisibleNoFor a service_area location: whether to draw its coverage circle. Null (the default) follows the locator's serviceAreaCircleVisible setting. False draws the pin without the circle.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond that: automatic geocoding, batch semantics, that the reply identifies which entries landed, and that the call consumes the plan's location allowance.

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

Conciseness5/5

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

Four tightly written sentences, front-loaded with the core action, then geocoding behavior, batch guidance, and the quota caveat. Every sentence carries distinct information and none is padding.

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

Completeness4/5

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

For a 26-parameter tool with nested objects and no output schema, the description covers the key call-shaping decisions (single vs batch, geocoding override, quota impact). It omits return-shape detail beyond 'the reply says which ones landed', but the schema carries the field-level burden, so the coverage is nearly complete.

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 coverage is 69% and the schema itself is unusually rich, documenting hours/hoursPatch semantics, locationType, customFields shape, etc. The description's parameter notes (address geocoding, lat/lng override, the `locations` array for batching) largely restate what the schema already states, adding little meaning on top.

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?

The description states a specific verb and resource ('Add one location, or many in a single call') and immediately clarifies the scope, single vs batch, which lets an agent distinguish it from update_location and delete_location without opening the schema.

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

Usage Guidelines4/5

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

It gives clear operational context: use the top-level fields for one location, pass `locations` as an array to add up to a batch, and supply lat/lng only to override geocoding. It stops short of naming the alternative siblings (e.g. update_location for edits), so no explicit exclusions.

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

create_spotlight_ruleCreate a Spotlight ruleAInspect

Add a rule with one trigger (when it applies) and one action (what the visitor sees), switched on immediately and applied after the existing rules. Location ids come from list_locations.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWhat the rule is called, for create and update.
endsAtNoISO timestamp. After it the rule is dormant. Optional.
startsAtNoISO timestamp. Before it the rule is dormant. Optional.
actionKindYesWhat happens. banner = a message above the results; feature = move locations to the top or bottom; only = show just these, taken from the whole network; hide = remove these.
triggerKindYesWhen the rule applies. always = every search; no_results = a search that found nothing; radius = within a distance of a point; polygon = inside a drawn area; postcodes = a postcode list, only matched by a typed search; filter = while a tag filter is on.
actionFieldsNoThe action's own fields: {message, linkUrl, linkLabel} for banner, {locationIds: [...], position: 'top'|'bottom'} for feature, {locationIds: [...]} for only and hide.
triggerFieldsNoThe trigger's own fields: {lat, lng, radiusKm} for radius, {points: [[lat, lng], ...]} for polygon (at least three), {postcodes: [...]} allowing a trailing * for a prefix, {tagId} for filter. Empty for always and no_results.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare it is a non-read-only, non-destructive, open-world, non-idempotent write. The description adds genuinely non-structured behavior: the rule goes live immediately and is evaluated after pre-existing rules, which affects conflict outcomes. It does not cover failure modes or required permissions.

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

Conciseness5/5

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

Two sentences, both front-loaded: the structural contract (trigger + action) comes first, then the enablement/ordering behavior, then the id cross-reference. No filler and nothing redundant.

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

Completeness4/5

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

For a 7-parameter nested write tool with no output schema, the description covers shape, activation state, ordering, and id sourcing, and the annotations carry the safety profile. What is missing is narrower: permission requirements and whether a rule id is returned or must be re-fetched via list_spotlight_rules.

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 coverage is 100% and the enum/nested-object descriptions are unusually thorough, so the baseline is 3. The description adds only the 'one trigger, one action' constraint and the list_locations pointer for location ids — helpful, but marginal against a schema that already documents every field and value.

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

Purpose4/5

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

States a specific verb and resource ('Add a rule') and immediately defines the rule's shape: one trigger, one action. The create_/update_/list_/delete_ naming makes the sibling split inferable, but the description itself never names the adjacent siblings (update_spotlight_rule, list_spotlight_rules), so it stops just short of a 5.

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

Usage Guidelines3/5

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

Gives real operational context — the rule is enabled on creation and ordered after existing rules — and points to list_locations for sourcing location ids. It never says when to use this versus update_spotlight_rule or set_spotlight_rule_enabled, so usage is implied rather than specified.

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

create_territoryCreate a territoryAInspect

Create an empty territory owned by one location (dealer). It covers nothing until postcodes are added with add_territory_postcodes, and nothing reaches a visitor until publish_territories. Polygons and regions are drawn on the map in the dashboard.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWhat the territory is called, for create.
rankNoLower wins when two territories cover the same address. Default 0.
exclusiveNoAn exclusive territory returns only its owner for a covered address; otherwise the owner is pinned to the top and the rest still show.
locationIdYesThe dealer that owns this territory, for create.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so safety is partly covered, but the description adds genuinely useful state behavior: the new territory is inert (covers nothing) and has no visitor effect until two later operations run. It doesn't address authentication, duplicate-name handling, or whether the created record can be rolled back.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and then the lifecycle caveats. Every sentence carries distinct information and none restates the tool name or schema.

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

Completeness4/5

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

With no output schema, the description could have noted that the created territory's identifier is needed for the follow-up add_territory_postcodes call, which is a minor gap. Otherwise it fully explains the entity's initial state and downstream dependencies for a non-destructive mutation.

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 all four parameters are already documented in the schema, including the rank tie-break rule and exclusive routing. The description only mildly reinforces semantics by glossing locationId as the owning dealer; it adds no format or constraint detail beyond the schema.

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 and resource ('Create an empty territory') and immediately qualifies the result with ownership ('owned by one location (dealer)'). It differentiates itself from neighbors by naming add_territory_postcodes and publish_territories as the steps that give the territory meaning.

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

Usage Guidelines4/5

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

Clearly frames this as the first step in a workflow: the territory covers nothing until add_territory_postcodes, and nothing reaches visitors until publish_territories. It does not state any when-not-to-use condition or mention alternatives such as updating an existing territory, so it stops short of full routing guidance.

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

delete_locationDelete a location, or many at onceA
DestructiveIdempotent
Inspect

Remove a location from the locator. This is a soft delete: the row is retained so analytics history stays intact, and it can be restored from the dashboard. Pass ids instead of id to delete up to 200 in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoLocation id.
idsNoSeveral location ids, to apply the same change to all of them in one call (at most 200). Use either id or ids.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is partly supplied. The description adds materially beyond that by disclosing the soft-delete semantics, that the row is retained for analytics history, and that the change is reversible from the dashboard — behavioral context an agent cannot derive from the schema or annotations alone.

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

Conciseness5/5

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

Three short sentences, front-loaded with purpose, then the non-obvious soft-delete behavior, then the parameter choice. No sentence is redundant and nothing important is buried.

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

Completeness4/5

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

With no output schema, the description adequately covers what the operation does and what happens to the data afterwards (retention, restorability). It is slightly short on batch return semantics — e.g., what happens on partial failure when deleting up to 200 ids, or whether a de-eliminated id errors — but for a two-parameter tool this is close to complete.

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 coverage is 100% and both properties are already documented in the schema, including the mutual exclusivity note and the 200 maxItems constraint. The description restates the id/ids choice and the batch limit without adding format or failure-handling detail beyond the schema, so the baseline of 3 applies.

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?

The description opens with a specific verb+resource ('Remove a location from the locator'), and the resource name cleanly separates it from the sibling delete_spotlight_rule and delete_territory tools. It also immediately qualifies the operation as a soft delete, so the agent knows this is not a hard purge.

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

Usage Guidelines3/5

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

The description explains how to choose between the two parameters ('Pass `ids` instead of `id` to delete up to 200 in one call'), which is useful invocation guidance. It gives no guidance about when to delete versus deactivate/update a location, or when this tool should be avoided in favor of update_location or a territory operation, so tool-level routing is left to inference.

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

delete_spotlight_ruleDelete a Spotlight ruleA
DestructiveIdempotent
Inspect

Delete a rule. It stops applying at once and cannot be restored. Get the id from list_spotlight_rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe rule, for update, delete, enable and disable.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so safety is covered. The description adds value beyond them by declaring the effect is immediate and irreversible, which an agent needs to weigh before calling. It does not mention auth/permission requirements or error behavior, keeping it from a 5.

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

Conciseness5/5

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

Two tight sentences with no filler; the destructive consequence is front-loaded and the id source follows. Every clause earns its place.

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

Completeness4/5

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

For a one-parameter destructive tool with full annotations and no output schema, the definition covers purpose, irreversibility, and id sourcing. It omits only permission requirements and any failure modes, which are minor gaps here.

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% on the single id parameter, setting a baseline of 3. The description adds provenance the schema lacks ('Get the id from list_spotlight_rules'), telling the agent how to obtain a valid value rather than only what the field means.

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?

Specific verb (delete) plus resource (a rule), and it goes further by stating the consequence ('stops applying at once and cannot be restored'), which separates it from reversible siblings like set_spotlight_rule_enabled and update_spotlight_rule. An agent can tell instantly this is a permanent removal, not a disable.

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

Usage Guidelines4/5

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

It routes the agent to list_spotlight_rules as the source of the id, giving a concrete precondition for invocation. It implies but does not explicitly state the alternative path for reversible action (disable via set_spotlight_rule_enabled), so it falls slightly short of full when-to-use/when-not guidance.

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

delete_territoryDelete a territoryA
DestructiveIdempotent
Inspect

Delete a territory and its rules. Visitors keep being routed by the published version until publish_territories runs again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe territory, for delete and add_postcodes.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds behavior annotations cannot express: the deletion cascades to the territory's rules, and the change is not visitor-visible until publish_territories runs. That is exactly the 'what gets destroyed / when it takes effect' context that matters for a destructive call.

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

Conciseness5/5

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

Two sentences, zero waste: the action is front-loaded and the publish-lag caveat follows immediately. Every clause earns its place.

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 one-parameter, no-output-schema destructive call, the description plus annotations cover everything needed to invoke it correctly: what is deleted, that rules go with it, and that effects are deferred until publish.

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 single required 'id' parameter is already documented, and the description adds nothing about its format or source. Baseline 3 per the high-coverage rule.

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 and resource ('Delete a territory') and adds the cascade scope ('and its rules'), which distinguishes it from delete_location and delete_spotlight_rule without opening a schema. The destructive scope is unambiguous.

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

Usage Guidelines4/5

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

Names the required follow-up action (publish_territories) and the consequence of skipping it, which is genuine workflow guidance an agent needs. It stops short of explicitly contrasting this tool with delete_location or delete_spotlight_rule, so no exclusion guidance is given.

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

describe_configurationDescribe the locator configurationA
Read-onlyIdempotent
Inspect

The current value of everything on the locator, with the schema beside it: behaviour settings, brand tokens, result-card layouts and visitor-facing wording. Use it to read what is set now. To write a change you do not need it: propose_configuration's own input schema lists every key and allowed value. Pass section to get one part instead of all 30KB.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoWhich part to return. all (default), settings, brand, tokens (what the brand COMPUTES to: the derived muted text, borders, alternate surface and shadow, which are stored nowhere), layouts, labels, or one settings group: search (Search & location), results (Results & sorting), filters (Filter behaviour), hours (Hours & open status), map (Map behaviour), markers (Map markers), layout (Layout & fields), directions (Directions & links), data (Data formatting).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: the tokens are computed values that are stored nowhere, and the full output is roughly 30KB — useful expectations for an agent deciding whether to page through output. No contradiction with annotations.

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

Conciseness5/5

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

Three sentences with zero waste: the first states the output, the second gives use case and routing, the third explains the parameter. The most decision-relevant information (what it returns and when to use it) is front-loaded, and the sibling routing is compact.

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 read-only tool with one optional parameter, no output schema, and annotations covering the safety profile, the description is complete: it states the return content, the size implication, the section scoping, and the write-tool alternative. 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.

Parameters3/5

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

Schema description coverage is 100% and the enum values each carry detailed explanations of what they return, so the schema does the heavy lifting. The description adds modest value beyond that: clarifying the default (all) and framing section as a way to avoid the full 30KB payload, which is useful but does not change the baseline for fully documented parameters.

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?

The description states a specific verb (read/describe) and resource (the locator configuration), and enumerates exactly what is returned: behaviour settings, brand tokens, result-card layouts, and visitor-facing wording, each with the schema beside it. It also distinguishes itself from the write sibling propose_configuration, so an agent can differentiate the tools without opening schemas.

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?

The description explicitly says when to use this tool ('Use it to read what is set now') and when not to ('To write a change you do not need it'), naming propose_configuration as the alternative and explaining why (its input schema lists every key and allowed value). It also gives guidance for the optional section parameter as a way to scope the read.

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

explain_territory_ownerExplain who owns a pointA
Read-onlyIdempotent
Inspect

Which dealer owns a point, and why, answered from the PUBLISHED territories, exactly as a visitor there would be routed.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesFor explain.
lngYesFor explain.
postcodeNoFor explain: the visitor's postcode, when known. Postcode rules cannot match without it.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds value by disclosing that results come only from published territories and reflect visitor routing, i.e. unpublished edits will not affect the answer — a non-obvious behavioral constraint an agent should know.

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?

A single tight sentence with no filler, and the key scoping constraint (PUBLISHED) is front-loaded. It loses a point only because the sentence is a fragment and the object it explains is stated indirectly.

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

Completeness4/5

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

For a 3-parameter, read-only lookup with full schema coverage and no output schema, the description supplies the essential framing: what is being explained, why the answer has rationale, and which territory state it derives from. Only the shape of the returned explanation is left unstated, which is acceptable here.

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 lat, lng and the conditional postcode rule are already documented in the schema (including the warning that postcode rules cannot match without postcode). The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific question it answers ('Which dealer owns a point, and why') and pins the data source to PUBLISHED territories. It reads clearly as a query/explanation tool distinct from list_territories or publish_territories, though it never names a sibling to route against.

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

Usage Guidelines3/5

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

'Answered from the PUBLISHED territories, exactly as a visitor there would be routed' implies when to reach for it (visitor-facing truth, not draft config), which is meaningful context for a repo full of propose/apply/publish tools. But there is no explicit when-not or named alternative, so the selection guidance is left to inference.

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

find_nearest_locationsFind the nearest locationsA
Read-onlyIdempotent
Inspect

Rank locations by distance from a point, the way the widget ranks them for a visitor. Also answers questions about the data when given tag or q without a point.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoMatch against name, address and description.
latNoLatitude of the point to measure from.
lngNoLongitude of the point to measure from.
tagNoOnly locations carrying this category name.
limitNoDefault 25, maximum 200.
unitsNoDefault km.
radiusNoOnly return locations within this distance.
includeHiddenNoInclude locations hidden from the public locator.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, lowering the burden on the description. The description adds useful context beyond the schema: ranking is widget-consistent, and the tool behaves differently without a point. It does not describe output format, but that is a minor gap given the read-only annotations.

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

Conciseness5/5

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

Two sentences with no filler. The primary behavior is front-loaded, and the second sentence efficiently introduces the alternative mode. Every word contributes to understanding.

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

Completeness4/5

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

For a read-only tool with a fully documented schema and zero required parameters, the description provides enough to understand the two invocation patterns. The absence of an output schema is not fully compensated, but 'rank locations' implies the result shape, leaving only minor ambiguity about edge-case calls with no parameters.

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 adds meaning beyond individual parameter docs by revealing the relationship between lat/lng and q/tag: a point drives distance ranking, while q/tag can substitute for it to answer data questions.

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?

The description uses a specific verb ('rank') with a clear resource ('locations') and criterion ('by distance from a point'). It also adds a second mode with 'tag or q without a point', which distinguishes this from a plain listing tool like list_locations.

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

Usage Guidelines4/5

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

It clearly states when the primary ranking behavior applies (when a point is provided) and when the alternative data-question mode applies (tag/q without a point). It does not explicitly compare against sibling tools or state exclusions, so it falls short of a 5.

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

get_embed_codeGet the embed codeA
Read-onlyIdempotent
Inspect

The HTML snippet that puts this locator on a website, plus the public site id it carries. Paste it where the map should appear.

ParametersJSON Schema
NameRequiredDescriptionDefault
nearNoA place to search near when the page opens, e.g. 'Austin, TX'.
tagsNoLock this embed to locations carrying any of these tags (names or slugs), for a page about one product, service or region.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds useful context by disclosing the exact return payload: an HTML snippet carrying a public site ID. This is sufficient for a simple getter.

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

Conciseness5/5

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

Two sentences, front-loaded with the main deliverable and ending with actionable placement guidance. There is no filler or redundant restatement.

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

Completeness4/5

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

For a simple read-only tool with no required parameters and no output schema, the description explains enough about the return value and how to use it. It only lacks minor cross-tool routing context, which is already captured under usage guidelines.

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?

The input schema describes both parameters fully with 100% coverage. The description does not add parameter-level meaning, but the baseline 3 applies because the schema already carries the burden.

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

Purpose4/5

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

The description clearly identifies the resource (embed code for this locator) and what it returns (an HTML snippet plus the public site ID), going beyond the title. However, it does not explicitly contrast with siblings or use a direct retrieval verb.

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

Usage Guidelines2/5

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

The last sentence implies a use case: paste the snippet where the map should appear on a website. But there is no explicit guidance about when to choose this tool over siblings or when to use the optional near/tags parameters.

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

get_locationGet a locationA
Read-onlyIdempotent
Inspect

Full details for one location, including hours and custom fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesLocation id.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds minimal behavioral context beyond that — it mentions the output includes hours and custom fields but does not disclose any side effects, auth needs, or rate limits. It neither enriches nor contradicts the annotations.

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

Conciseness5/5

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

The description is a single, front-loaded sentence: 'Full details for one location, including hours and custom fields.' It conveys the core purpose immediately with zero filler or redundancy.

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

Completeness4/5

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

This is a simple get-by-id tool with one parameter, and annotations cover the safety profile. The description mentions key output fields (hours, custom fields) but does not fully enumerate all return details; however, 'full details' implies completeness. Adequate for the simplicity, though a touch more specificity about output structure would be ideal.

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?

The schema description for the 'id' parameter is clear ('Location id.'), and coverage is 100%. The tool description adds no extra semantic detail about the parameter, so the baseline score of 3 applies.

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?

The description clearly states the tool retrieves full details for one location, including hours and custom fields. This distinguishes it from list_locations (which presumably returns summaries) and find_nearest_locations, and the resource and scope are unambiguous.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like list_locations or find_nearest_locations. The description lacks any context about prerequisites or scenarios, leaving the agent to infer usage from the name alone.

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

list_configuration_versionsList configuration historyA
Read-onlyIdempotent
Inspect

The locator's configuration history, newest first, with what caused each version. Use it to find a version number to roll back to.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 20, maximum 100.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior, so the description adds useful behavioral context beyond them: the result order ('newest first') and the inclusion of causal information. This is meaningful, though it does not detail the full return payload shape.

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

Conciseness5/5

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

The description is two short sentences with no redundancy. The core object and ordering are front-loaded, followed by the practical use case, so every sentence earns its place.

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

Completeness4/5

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

For a simple read-only listing tool with one optional parameter, the description covers what is returned, the ordering, and the typical use case. There is no output schema, so slightly more detail about each version object could help, but the description is sufficient for correct invocation.

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% because the only parameter, limit, is documented with its default and maximum. The description adds no parameter-specific meaning, which is acceptable given the schema already handles it.

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?

The description states a specific verb ('list') and resource ('configuration history'), and immediately specifies ordering and content ('newest first, with what caused each version'). The rollback use case helps distinguish it from sibling configuration tools like describe_configuration and rollback_configuration.

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

Usage Guidelines4/5

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

It explicitly tells the agent when to use the tool: to find a version number to roll back to. It does not name alternatives or state when not to use it, but the intended workflow context is clear enough for tool selection.

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

list_locationsList locationsA
Read-onlyIdempotent
Inspect

List the locations on this locator, newest first. Use search to find one by name or address before editing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 50, maximum 200.
offsetNoFor paging through more than one page of results.
searchNoMatch against name and address.
visibilityNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds useful context beyond annotations: the result ordering ('newest first') and the locator-scoped nature of the list.

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

Conciseness5/5

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

Two concise sentences, with the core purpose and ordering front-loaded, followed by a helpful usage hint. No wasted words.

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

Completeness4/5

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

The description is sufficient for a simple read-only list operation: it states scope, ordering, and a search usage hint. It doesn't explain return shape, but there is no output schema and the operation is low-complexity, so this is an acceptable 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 coverage is 75%, so most parameters already have descriptions. The description adds modest emphasis on using 'search' for finding by name or address, but doesn't meaningfully expand on limit, offset, or visibility semantics beyond what the schema provides.

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?

The description states a specific verb ('List') and resource ('locations on this locator') and adds ordering ('newest first'). This clearly distinguishes it from sibling tools like get_location (single resource) and list_tags (different resource type).

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

Usage Guidelines4/5

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

The description gives clear context for using the search parameter to find a specific location before editing, which is actionable guidance. It doesn't explicitly name alternative tools or exclusion conditions, but the intended use case is reasonably clear.

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

list_spotlight_rulesList Spotlight rulesA
Read-onlyIdempotent
Inspect

Spotlight rules change what a visitor sees depending on where and when they search: a banner for a region or a date range, featured locations, only certain locations, or hidden ones. Lists every rule in the order they apply (after territories), with ids. Call this before changing a rule.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the list is returned in application order (after territories) and includes ids. It says nothing about pagination or result size, which is the only remaining gap.

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?

Two sentences, no filler. The clarifying domain sentence comes first and the action plus guidance follows, which is reasonable front-loading for a concept-heavy resource, though the opening could be tightened slightly.

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

Completeness4/5

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

With no output schema, the description carries the burden of saying what comes back, and it does mention ordering and ids. Nothing prevents a correct zero-arg call; only pagination/volume details are 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?

The tool takes zero parameters, so the baseline of 4 applies. The description correctly describes a call that requires no arguments and does not invent any filtering semantics.

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

Purpose4/5

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

The description gives a specific verb and resource ("Lists every rule") and defines what a spotlight rule is with concrete examples (banner, featured locations, hidden locations). It also distinguishes ordering from territories ("after territories"), but never names a sibling tool, so the differentiation is implied rather than explicit.

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

Usage Guidelines4/5

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

"Call this before changing a rule" clearly establishes the context of use and points at update_spotlight_rule / set_spotlight_rule_enabled / delete_spotlight_rule without naming them. There is no explicit when-not-to-use guidance, but the trigger condition is unambiguous.

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

list_tagsList tagsA
Read-onlyIdempotent
Inspect

The tags (categories) on this locator, with how many locations carry each one. Tags are what visitors filter by on the map.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral detail beyond annotations by stating the output includes how many locations carry each tag, which is not visible from the schema.

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

Conciseness5/5

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

The description is a single, tightly written sentence that conveys the subject, scope, and output detail without wasted words. It is front-loaded with the core purpose and adds context only where it helps.

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 zero-parameter, read-only list tool with no output schema, the description is complete: it states what is listed, the per-tag counts, and the role of tags in the map filtering context. No critical information is missing for an agent to invoke it correctly.

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?

The input schema has no parameters, so the description has no need to explain parameter meaning. The baseline of 4 is appropriate because no parameter documentation burden exists.

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?

The description clearly states the tool lists tags/categories on the locator and includes the count of locations carrying each one. It also distinguishes the resource from sibling tools by explaining tags are what visitors filter by on the map, so it cannot be confused with tag_locations or list_locations.

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

Usage Guidelines4/5

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

The description provides clear context: this tool is for retrieving the tags available for filtering and their usage counts. It doesn't explicitly name alternatives or state when-not-to-use, but the read-only, informational purpose is evident from the description and annotations.

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

list_territoriesList dealer territoriesA
Read-onlyIdempotent
Inspect

Who OWNS an address, as distinct from who can reach it: a service radius says how far a location travels, a territory decides which dealer an enquiry belongs to. Lists every territory with its owner, rank, rules and id, the territory mode, and the published version. Nothing reaches a visitor until publish_territories.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: the returned fields, the existence of a 'published version', and the state relationship that nothing reaches visitors until publish_territories — meaningful behavioral disclosure about domain state.

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?

Three sentences, reasonably front-loaded: it establishes the concept, then the concrete output, then the publish caveat. The opening 'who OWNS an address, as distinct from who can reach it' framing is slightly elaborate for a list tool, but overall it is tight and every sentence carries information.

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

Completeness4/5

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

For a zero-parameter list tool with annotations covering safety and no output schema, the description explains what is returned (owner, rank, rules, id, mode, published version) and the relevant publish state, so an agent knows what it gets. It omits any note on ordering or size limits, which is a minor gap.

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?

The tool takes zero parameters, so per the rubric the baseline is 4. Schema coverage is 100% and there is nothing further a description could add about inputs.

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

Purpose4/5

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

States a specific verb and resource ('Lists every territory with its owner, rank, rules and id, the territory mode, and the published version'), which is concrete and unambiguous. It names the related sibling publish_territories, giving some differentiation, but the opening contrast against a 'service radius' is conceptual framing rather than a clear distinction from a listed sibling tool.

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

Usage Guidelines3/5

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

The description frames what a territory is and notes the publish workflow ('Nothing reaches a visitor until publish_territories'), which implies when this listing is useful. However, it never explicitly states when to use this tool versus siblings like explain_territory_owner or describe_configuration, so usage is only implied.

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

propose_configurationPropose a configuration changeAInspect

Prepare a change to how the locator looks or behaves, WITHOUT applying it. Returns the exact list of differences. Show that list to the person and get their agreement before calling apply_configuration. This tool's input schema lists every key and every allowed value, so write the patch straight from it; a rejected patch names every wrong key and value at once. Only send the keys you want to change.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelsNoVisitor-facing wording overrides. {place} and {count} are substituted where the default uses them.
layoutsNoWhich fields each surface shows, and in what order.
requestYesWhat the person asked for, in their words. Stored with the proposal as its record.
summaryYesOne sentence describing what this change does.
brandingNoBrand changes. accentColor sits at this level; every other token goes inside settings.
settingsNoBehaviour settings to change. Only send the keys you want to change. Heights are two keys: mapHeight for the map and listMaxHeight for the result list.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=false, and the description reinforces that with 'WITHOUT applying it'. It adds genuinely new behavior: the tool returns an exact diff, and a rejected patch reports every wrong key and value at once. It doesn't mention whether proposals expire or are stored beyond the request record, but that is a minor gap.

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

Conciseness5/5

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

Front-loads the non-applying, diff-returning nature, then the confirmation workflow, then the patch-writing rule. Every sentence carries a distinct instruction with no padding.

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 very large nested schema with no output schema, the description covers what matters most: the return value (exact list of differences), validation feedback, and the human-approval gate before apply_configuration. Nothing an agent needs to call this correctly is missing.

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 documents all six parameters and their nested keys. The description adds only the operational rule to send partial patches rather than the full object, which is useful but not syntax or format detail beyond the schema; baseline 3 is appropriate.

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 and resource ('Prepare a change to how the locator looks or behaves') and immediately narrows scope with 'WITHOUT applying it'. An agent can distinguish this from apply_configuration without opening either 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?

Explicit workflow: show the returned diff to the person and get agreement before calling apply_configuration, naming the sibling that does the apply. It also specifies the patch-writing rule ('only send the keys you want to change'), leaving nothing to inference.

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

publish_territoriesPublish territoriesA
DestructiveIdempotent
Inspect

Make the current territories live. Writes a new version and replaces what visitors are routed by once every file is written.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the bar is lower — yet the description still adds real behavior: it creates a new version and only swaps visitor routing 'once every file is written', disclosing an all-or-nothing publish characteristic not expressed by any annotation.

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

Conciseness5/5

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

Two short sentences, no filler, with the core action ('make live') front-loaded and the operational caveat second. Every clause carries information.

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

Completeness4/5

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

For a zero-parameter, no-output-schema tool with a rich annotation set, the description covers what is produced (a new version) and what changes (visitor routing). It stops short of naming the recovery path (rollback_configuration) or any permission requirements, which would make an irreversible-feeling publish fully self-contained.

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?

The tool takes zero parameters, so per the rules the baseline is 4; there is nothing for the description to clarify, and it correctly does not invent parameter semantics.

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?

Specific verb-plus-resource: it states it publishes (makes live) the current territories, which is clearly distinct from siblings like list_territories, create_territory, or rollback_configuration. An agent can identify the operation without opening the schema.

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

Usage Guidelines3/5

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

The phrase 'make the current territories live' implies when this is used, and the sibling set contains adjacent tools (apply_configuration, rollback_configuration, propose_configuration), but the description never names an alternative or states a precondition for choosing this one over them.

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

rollback_configurationRoll back the configurationA
Destructive
Inspect

Restore a previous configuration version. This creates a new version rather than erasing history, so a rollback can itself be rolled back.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetVersionYesVersion number to restore, from list_configuration_versions.

TDQS

A4/5.0
Behavior5/5

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

With destructiveHint=true and idempotentHint=false already declared, the description adds genuinely non-obvious behavior: the rollback is non-erasing because it writes a new version, and is therefore itself reversible. That materially informs the agent's risk assessment beyond what the annotations state.

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

Conciseness5/5

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

Two tight sentences with zero filler; the core action is stated first and the consequence follows as justification. Every clause earns its place.

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

Completeness4/5

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

For a single-parameter mutation with annotations covering the safety profile, the description explains the key outcome (a new version is created). It does not mention failure modes or what the call returns, which is a minor gap given there is no output schema.

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% and the single parameter already documents its format and points at list_configuration_versions as the source. The description adds no further parameter constraints, so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource: restoring a previous configuration version. It is clear what the tool does and implicitly contrasts with version-mutating siblings like apply_configuration and propose_configuration, but it never names an alternative to disambiguate the choice.

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

Usage Guidelines3/5

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

Usage is only implied by 'restore a previous configuration version.' There is no explicit statement of when to prefer rollback over apply_configuration, propose_configuration, or publish_territories, and no prerequisites or exclusions are given.

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

set_custom_fieldSet a custom field across locationsA
DestructiveIdempotent
Inspect

Put the same extra field on many locations at once: a booking button, a social link, or a labelled fact like "Parking: street only". A value that is a URL becomes a clickable button; anything else shows as plain text. NOT for tags or categories, which are a different thing entirely: use tag_locations for those. Set remove to true to take the field off instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe field's name, shown as its label. For example "Book a table".
iconNoOptional glyph on the button.
colorNoHex colour for the button, for example "#C2540E". Ignored for plain text.
styleNoDefault filled. Outline uses the colour as border and text only.
valueNoThe field's value. A URL makes it a button, anything else shows as a labelled fact.
removeNoTake this field off the given locations instead of setting it.
locationIdsYesLocation ids to change. At most 200.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real behavioral detail: URL values render as clickable buttons versus plain text, and the remove flag performs the destructive operation. It does not mention permission requirements or the batch limit, so it falls short of full behavioral disclosure.

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?

Three sentences, front-loaded with the core action before the exclusion and the removal flag. The aside 'which are a different thing entirely' is slightly padded, but nothing important is buried.

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

Completeness4/5

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

With 7 parameters, no output schema, and rich annotations, the description covers rendering behavior, removal, and sibling routing, which is enough to call the tool correctly. It omits the 200-location cap (schema handles it) and any failure/partial-success behavior.

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 every parameter is already documented, including the URL-to-button rule and the remove semantics. The description largely restates those same facts (URL becomes a button, remove takes the field off) rather than adding syntax, defaults, or edge cases beyond the schema. Baseline 3 is appropriate.

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 and resource with scope ('Put the same extra field on many locations at once') and grounds it with concrete examples (booking button, social link, labelled fact). It explicitly separates itself from tag_locations, so an agent can distinguish it from siblings without reading the 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?

Gives an explicit exclusion ('NOT for tags or categories') paired with the named alternative (tag_locations), plus the conditional action for deletion ('Set remove to true to take the field off instead'). Both when-to-use and when-not-to-use are covered.

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

set_spotlight_rule_enabledSwitch a Spotlight rule on or offA
Idempotent
Inspect

Turn a rule on or off without deleting it. Get the id from list_spotlight_rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe rule, for update, delete, enable and disable.
enabledYestrue switches the rule on, false switches it off.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=false and idempotentHint=true, so the safety and repeatability profile is covered structurally. The description reinforces the non-destructive nature with 'without deleting it', but adds no permission, rate-limit, or state-transition detail beyond that.

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

Conciseness5/5

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

Two short sentences, zero padding, and the core action is front-loaded ahead of the id-sourcing tip.

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

Completeness4/5

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

For a trivial two-parameter toggle with full schema coverage and annotations carrying the safety profile, the description covers action, non-destructiveness, and id provenance adequately. Only a note on what happens if the id is invalid would improve it.

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%, and the schema itself explains both `id` and the true/false meaning of `enabled`. The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

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+resource ('Turn a rule on or off') and explicitly distinguishes itself from the delete path with 'without deleting it', which separates it from delete_spotlight_rule and update_spotlight_rule in the sibling list.

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

Usage Guidelines4/5

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

Gives a clear prerequisite/entry point by naming list_spotlight_rules as the way to obtain the id. It does not explicitly say when to prefer this over update_spotlight_rule, but the toggle-vs-edit distinction is implicit in the phrasing.

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

set_tag_styleStyle a tagA
DestructiveIdempotent
Inspect

Change how an existing tag looks on the map's filters: its filter group, chip colour and icon. Only the fields you pass are changed. Tags in the same group show as one labelled filter dropdown. Use the exact tag name. The tag must already exist; to create a tag and style it at once, use tag_locations.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesThe exact name of an existing tag, for example "Ghost pepper".
iconNoOptional glyph shown on the tag's chip.
colorNoHex colour for the tag's chip and, when markers follow tag colour, its map pins. For example "#E64893".
groupNoFilter group to put the tag in, for example "Flavour". Tags that share a group render as one labelled filter dropdown. An empty string removes the grouping.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, destructiveHint=true and openWorldHint=true, so the safety profile is largely covered. The description usefully adds partial-update semantics ('Only the fields you pass are changed'), which reinforces idempotency, but it never explains why a pure styling operation is flagged destructive or what state (prior colour/group) is overwritten.

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

Conciseness5/5

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

Six short sentences, front-loaded with the core action and scoping facts, with the sibling pointer last. Every sentence carries distinct information; no filler.

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

Completeness4/5

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

No output schema exists, but the tool is a simple field-mutating setter and the description plus schema cover inputs, preconditions and the alternative path. The only gap is the unexplained destructive annotation, which is minor given annotations are otherwise present.

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 baseline is 3; the schema already documents tag, color, group and the icon enum. The description largely restates these (exact tag name, same-group rendering, hex colour) rather than adding new semantics such as default values or format rules.

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 and resource ('Change how an existing tag looks') and enumerates the exact stylable facets (filter group, chip colour, icon). It is unmistakably distinct from siblings like tag_locations and list_tags.

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?

Explicitly names the precondition ('The tag must already exist') and routes the create-and-style case to the named alternative 'tag_locations'. Both when-to-use and when-not-to-use are stated, leaving nothing to inference.

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

set_territory_modeSet how territories applyA
Idempotent
Inspect

Choose how territories affect a visitor's results: off, preferred, exclusive or fallback. Applies to the live locator straight away.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesFor set_mode. off ignores territories; preferred pins the owner and keeps the rest; exclusive returns only the owner; fallback shows the owner only when the ordinary search found nothing.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds a genuinely useful behavioral fact beyond that: the change takes effect on the live locator immediately, which tells the agent this is a production-affecting write rather than a staged draft edit.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core purpose front-loaded and the live-application caveat placed second. Every clause carries information an agent needs.

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

Completeness4/5

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

For a single-enum, mutation-flagged tool with annotations covering safety and idempotency and no output schema, the description is nearly complete: it explains what is being set and that it applies immediately. The one real gap is whether this interacts with the draft/publish workflow implied by siblings like propose_configuration, publish_territories and rollback_configuration.

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%, and the schema itself spells out each enum value (off, preferred, exclusive, fallback) in more detail than the description does. The description merely re-lists the four values, adding no syntax or semantics beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and resource ("Choose how territories affect a visitor's results") and names all four mode values, so the agent immediately knows the operation is a territory-scoping configuration switch. It does not explicitly contrast itself with adjacent setters like set_spotlight_rule_enabled or set_tag_style, but the territory framing is distinctive enough to separate it.

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

Usage Guidelines3/5

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

Usage is only implied: the four modes and their effect on visitor results suggest when each choice is appropriate, but there is no explicit when-to-use, when-not-to-use, or alternative routing (e.g. versus explain_territory_owner or publish_territories). An agent can infer intent but is not told the conditions under which this tool should be preferred.

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

tag_locationsTag or untag locationsA
DestructiveIdempotent
Inspect

Add a tag to locations, or remove it from them with action "remove". Adding creates the tag if it does not exist yet. Tags appear as filter chips that visitors use on the map. When adding, you can also pass group, color or icon to style the tag in the same call. Use this for requests like "tag these as X" or "mark these as X"; tags are not custom fields. Get location ids from list_locations first.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesTag name, for example "Flagship". Created if new.
iconNoOptional. Glyph for the tag's chip. Applied in this same call.
colorNoOptional. Hex colour for the tag's chip, for example "#E64893". Applied in this same call.
groupNoOptional. Filter group for the tag, for example "Flavour". Applied in this same call, so a tag can be created, applied and grouped at once.
actionNoDefault add. Use remove to take the tag off these locations.
locationIdsYesLocation ids to change. At most 200.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds genuinely new behavioral context, namely that adding creates the tag when missing and that group/color/icon are applied atomically in the same call. It does not discuss permission requirements or failure behavior.

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 add/remove semantics followed by side effects, styling, disambiguation and prerequisite in a logical order. Slightly repetitive ('Applied in this same call' echoes the schema), but every sentence carries information.

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

Completeness4/5

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

For a mutation tool with no output schema, it covers the creation side effect, the destructive removal path, atomic styling, and the id-sourcing prerequisite. Missing only auth/permission notes and the 200-id cap, which lives in the schema.

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, but the description adds meaning the schema does not: that icon/color/group are applied in this same call rather than requiring a follow-up, i.e. tag creation, application and styling are one atomic operation.

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 (add/remove a tag) and resource (locations), and explicitly separates itself from near-siblings by noting 'tags are not custom fields' and that styling is bundled here rather than in set_tag_style. An agent can pick it out of the list 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 Guidelines4/5

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

Provides concrete user phrasings ('tag these as X', 'mark these as X') and a prerequisite step ('Get location ids from list_locations first'), plus the 'not custom fields' disambiguation. It stops short of naming set_tag_style or list_tags as explicit alternatives for styling/enumeration.

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

update_locationUpdate a location, or many at onceA
DestructiveIdempotent
Inspect

Change one or more fields on an existing location. Only the fields you send are touched. Changing the address re-geocodes it. Pass ids instead of id to apply the same fields to many locations in one call, for example hiding a batch or setting priority across a region; address, coordinates and name stay one-at-a-time.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoLocation id.
idsNoSeveral location ids, to apply the same change to all of them in one call (at most 200). Use either id or ids.
latNoLatitude. Supplying lat and lng skips geocoding.
lngNoLongitude.
cityNo
nameNoBusiness or store name.
emailNo
hoursNoOpening hours keyed by ISO weekday, 1 = Monday. Each value is ONE {open, close} in 24h HH:MM, or null for closed — not a list, and a list is rejected. Example: {"1": {"open": "09:00", "close": "17:00"}, "7": null}. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch.
phoneNo
stateNo
addressNoFull address as a person would write it. Geocoded automatically unless lat and lng are supplied.
websiteNo
imageUrlNo
priorityNoHigher sorts first when there is no visitor position.
timezoneNoIANA timezone, for example America/Chicago.
hoursPatchNoChange only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {"7": {"open": "10:00", "close": "16:00"}} changes Sunday alone, and {"7": null} closes it. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent.
postalCodeNo
visibilityNohidden keeps the location in the account but off the public locator.
countryCodeNoTwo-letter ISO country code.
descriptionNo
markerColorNoHex colour for this location's map marker.
addressLine1NoStreet line, when the address is structured.
customFieldsNoExtra fields, keyed by the label shown to visitors. The value is either a plain string, or an object {value, color, icon, style} where `value` is the URL or text. There is no `label` or `url` key: the label is the key, and the URL goes in `value`. Example: {"Book a table": {"value": "https://example.com/book", "color": "#C2540E"}}. Never use this for tags or categories; use the categories field instead.
locationTypeNopoint is a physical address, service_area covers a radius, online is a stockist with no address.
onlineRegionsNoFor an online location: two-letter country codes it ships to or serves, e.g. ["us", "ca"]. Empty means every visitor sees it.
serviceRadiusKmNoRadius in km, for a service_area location.
serviceAreaCircleVisibleNoFor a service_area location: whether to draw its coverage circle. Null (the default) follows the locator's serviceAreaCircleVisible setting. False draws the pin without the circle.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already supply the safety profile (destructiveHint=true, idempotentHint=true, readOnlyHint=false). The description adds real value on top: partial-update semantics ('only the fields you send are touched'), the re-geocoding side effect of an address change, and the constraint that address/coordinates/name are not batchable. It does not flag the destructive capacity of bulk updates explicitly, which keeps it from a 5.

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

Conciseness5/5

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

Four compact sentences, front-loaded with the core operation, then side effects, then batch mechanics. No filler and no restatement of the tool name or title.

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

Completeness4/5

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

For a 27-parameter mutation tool with no output schema, the description covers the operation model, batch path, and key side effects, while annotations carry the safety profile and the schema carries per-field detail. Coverage of the many optional fields is left entirely to the schema, which is acceptable but leaves the description slightly thin overall.

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 70% and the schema descriptions are already detailed, so the baseline would be 3. The description goes beyond it by defining the id/ids mutual exclusivity and the per-field batching restriction (address, coordinates, name stay one-at-a-time), which is not stated in the schema itself.

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 and resource ('Change one or more fields on an existing location') and immediately covers both single and bulk modes. An agent can distinguish this from create_location/delete_location without opening the schema, and the batch variant is called out in the title and body.

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

Usage Guidelines4/5

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

Explicitly tells the agent when to use `ids` vs `id` and gives concrete batch scenarios (hiding a batch, setting priority across a region). It stops short of naming alternatives like create_location or delete_location, but 'existing location' frames the intended context clearly.

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

update_spotlight_ruleUpdate a Spotlight ruleA
DestructiveIdempotent
Inspect

Replace a rule's name, trigger, action and dates. Send the whole rule, not only the changed part: the previous values are overwritten. Get the id from list_spotlight_rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe rule, for update, delete, enable and disable.
nameYesWhat the rule is called, for create and update.
endsAtNoISO timestamp. After it the rule is dormant. Optional.
startsAtNoISO timestamp. Before it the rule is dormant. Optional.
actionKindYesWhat happens. banner = a message above the results; feature = move locations to the top or bottom; only = show just these, taken from the whole network; hide = remove these.
triggerKindYesWhen the rule applies. always = every search; no_results = a search that found nothing; radius = within a distance of a point; polygon = inside a drawn area; postcodes = a postcode list, only matched by a typed search; filter = while a tag filter is on.
actionFieldsNoThe action's own fields: {message, linkUrl, linkLabel} for banner, {locationIds: [...], position: 'top'|'bottom'} for feature, {locationIds: [...]} for only and hide.
triggerFieldsNoThe trigger's own fields: {lat, lng, radiusKm} for radius, {points: [[lat, lng], ...]} for polygon (at least three), {postcodes: [...]} allowing a trailing * for a prefix, {tagId} for filter. Empty for always and no_results.

TDQS

A4.1/5.0
Behavior4/5

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

Adds real context beyond the annotations: this is a full-replacement (PUT) operation where 'the previous values are overwritten', which sharpens the destructiveHint=true annotation into concrete behavior. It doesn't cover auth requirements or field-level validation, keeping it from a 5.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the replacement semantics and the overwrite warning, with the id-sourcing hint last. No wasted words.

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

Completeness4/5

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

For an 8-param, nested-object, no-output-schema mutation tool, the description covers the key gotcha (full replacement) and id sourcing. Minor gaps remain around auth/permission needs and rejection of unknown fields, but the essentials are present.

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 adds meaningful parameter semantics by framing all fields as a full payload and enumerating the categories (name, trigger, action, dates) that must be sent together, reinforcing how the required fields must be used.

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

Purpose4/5

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

States a specific verb (Replace/update) and resource (a rule) plus the fields touched: name, trigger, action, dates. It is clearly distinguishable from create_spotlight_rule and delete_spotlight_rule, though it doesn't explicitly name those siblings.

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

Usage Guidelines4/5

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

Gives the crucial usage rule ('Send the whole rule, not only the changed part') and routes the agent to list_spotlight_rules to obtain the id. It stops short of explicitly contrasting with create/delete, but the context is clear.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updates
    • Addedadd_territory_postcodes
    • Addedcreate_spotlight_rule
    • Addedcreate_territory
    • Addeddelete_spotlight_rule
    • Addeddelete_territory
    • Addedexplain_territory_owner
    • Addedlist_spotlight_rules
    • Addedlist_territories
    • Addedpublish_territories
    • Addedset_spotlight_rule_enabled
    • Addedset_territory_mode
    • Removedspotlight
    • Removedterritory
    • Addedupdate_spotlight_rule
  2. 1 tool update
    • Changedpropose_configuration2 fields changed
      • addedInput schema / properties / labels / properties / outsideTerritory
        Added value: +{
        +  "description": "results. Default: \"No location covers {place} yet. Showing the nearest instead.\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / settings / properties / territoryAreasOnMap
        Added value: +{
        +  "description": "Show territories on the map. Draw each location's published territory, such as its ZIP codes, instead of a circle. Only applies when locatorLayout is not listOnly or gridOnly.",
        +  "type": "boolean"
        +}
  3. 1 tool update
    • Changedpropose_configuration6 fields changed
      • addedInput schema / properties / labels / properties / resultsCount
        Added value: +{
        +  "description": "results. Default: \"{count} locations\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / labels / properties / resultsCountNear
        Added value: +{
        +  "description": "results. Default: \"{count} locations near {place}\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / labels / properties / sortBy
        Added value: +{
        +  "description": "results. Default: \"Sort by\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / labels / properties / sortName
        Added value: +{
        +  "description": "results. Default: \"Name\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / labels / properties / sortNearest
        Added value: +{
        +  "description": "results. Default: \"Nearest\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / settings / properties / resultsHeader
        Added value: +{
        +  "description": "Results line. A line above the results saying how many there are, such as 12 locations near Chicago. Only applies when locatorLayout is not mapOnly. hidden = Hidden; count = Count; countAndSort = Count and a sort control.",
        +  "enum": [
        +    "hidden",
        +    "count",
        +    "countAndSort"
        +  ],
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedpropose_configuration1 field changed
      • changedInput schema / properties / labels / properties / opensAt / description
        Previous value: -"hours. Default: \"Opens {time}\"."New value: +"hours. Default: \"Opens at {time}\"."
  5. 1 tool update
    • Changeddescribe_configuration2 fields changed
      • changedInput schema / properties / section / description
        Previous value: -"Which part to return. all (default), settings, brand, layouts, labels, or one settings group: search (Search & location), results (Results & sorting), filters (Filter behaviour), hours (Hours & open status), map (Map behaviour), markers (Map markers), layout (Layout & fields), directions (Directions & links), data (Data formatting)."New value: +"Which part to return. all (default), settings, brand, tokens (what the brand COMPUTES to: the derived muted text, borders, alternate surface and shadow, which are stored nowhere), layouts, labels, or one settings group: search (Search & location), results (Results & sorting), filters (Filter behaviour), hours (Hours & open status), map (Map behaviour), markers (Map markers), layout (Layout & fields), directions (Directions & links), data (Data formatting)."
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "all",
        -  "settings",
        -  "brand",
        -  "layouts",
        -  "labels",
        -  "search",
        -  "results",
        -  "filters",
        -  "hours",
        -  "map",
        -  "markers",
        -  "layout",
        -  "directions",
        -  "data"
        -]New value: +[
        +  "all",
        +  "settings",
        +  "brand",
        +  "tokens",
        +  "layouts",
        +  "labels",
        +  "search",
        +  "results",
        +  "filters",
        +  "hours",
        +  "map",
        +  "markers",
        +  "layout",
        +  "directions",
        +  "data"
        +]
  6. 1 tool update
    • Addedterritory
  7. 2 tool updates
    • Changedcreate_location4 fields changed
      • changedInput schema / properties / hours / description
        Previous value: -"Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."New value: +"Opening hours keyed by ISO weekday, 1 = Monday. Each value is ONE {open, close} in 24h HH:MM, or null for closed — not a list, and a list is rejected. Example: {\"1\": {\"open\": \"09:00\", \"close\": \"17:00\"}, \"7\": null}. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."
      • changedInput schema / properties / hoursPatch / description
        Previous value: -"Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": [{\"open\": \"10:00\", \"close\": \"16:00\"}]} changes Sunday alone. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent."New value: +"Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": {\"open\": \"10:00\", \"close\": \"16:00\"}} changes Sunday alone, and {\"7\": null} closes it. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent."
      • changedInput schema / properties / locations / items / properties / hours / description
        Previous value: -"Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."New value: +"Opening hours keyed by ISO weekday, 1 = Monday. Each value is ONE {open, close} in 24h HH:MM, or null for closed — not a list, and a list is rejected. Example: {\"1\": {\"open\": \"09:00\", \"close\": \"17:00\"}, \"7\": null}. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."
      • changedInput schema / properties / locations / items / properties / hoursPatch / description
        Previous value: -"Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": [{\"open\": \"10:00\", \"close\": \"16:00\"}]} changes Sunday alone. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent."New value: +"Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": {\"open\": \"10:00\", \"close\": \"16:00\"}} changes Sunday alone, and {\"7\": null} closes it. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent."
    • Changedupdate_location2 fields changed
      • changedInput schema / properties / hours / description
        Previous value: -"Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."New value: +"Opening hours keyed by ISO weekday, 1 = Monday. Each value is ONE {open, close} in 24h HH:MM, or null for closed — not a list, and a list is rejected. Example: {\"1\": {\"open\": \"09:00\", \"close\": \"17:00\"}, \"7\": null}. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."
      • changedInput schema / properties / hoursPatch / description
        Previous value: -"Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": [{\"open\": \"10:00\", \"close\": \"16:00\"}]} changes Sunday alone. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent."New value: +"Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": {\"open\": \"10:00\", \"close\": \"16:00\"}} changes Sunday alone, and {\"7\": null} closes it. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent."
  8. 6 tool updates
    • Changedcreate_location5 fields changed
      • changedInput schema / properties / hours / description
        Previous value: -"Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed."New value: +"Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."
      • addedInput schema / properties / hoursPatch
        Added value: +{
        +  "description": "Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": [{\"open\": \"10:00\", \"close\": \"16:00\"}]} changes Sunday alone. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent.",
        +  "type": "object"
        +}
      • addedInput schema / properties / locations
        Added value: +{
        +  "description": "Several locations to add in one call (at most 50). Use this instead of the top-level fields when adding more than one; each entry takes the same fields.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "address": {
        +        "description": "Full address as a person would write it. Geocoded automatically unless lat and lng are supplied.",
        +        "type": "string"
        +      },
        +      "addressLine1": {
        +        "description": "Street line, when the address is structured.",
        +        "type": "string"
        +      },
        +      "city": {
        +        "type": "string"
        +      },
        +      "countryCode": {
        +        "description": "Two-letter ISO country code.",
        +        "type": "string"
        +      },
        +      "customFields": {
        +        "description": "Extra fields, keyed by the label shown to visitors. The value is either a plain string, or an object {value, color, icon, style} where `value` is the URL or text. There is no `label` or `url` key: the label is the key, and the URL goes in `value`. Example: {\"Book a table\": {\"value\": \"https://example.com/book\", \"color\": \"#C2540E\"}}. Never use this for tags or categories; use the categories field instead.",
        +        "type": "object"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "email": {
        +        "type": "string"
        +      },
        +      "hours": {
        +        "description": "Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch.",
        +        "type": "object"
        +      },
        +      "hoursPatch": {
        +        "description": "Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": [{\"open\": \"10:00\", \"close\": \"16:00\"}]} changes Sunday alone. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent.",
        +        "type": "object"
        +      },
        +      "imageUrl": {
        +        "type": "string"
        +      },
        +      "lat": {
        +        "description": "Latitude. Supplying lat and lng skips geocoding.",
        +        "type": "number"
        +      },
        +      "lng": {
        +        "description": "Longitude.",
        +        "type": "number"
        +      },
        +      "locationType": {
        +        "description": "point is a physical address, service_area covers a radius, online is a stockist with no address.",
        +        "enum": [
        +          "point",
        +          "service_area",
        +          "online"
        +        ],
        +        "type": "string"
        +      },
        +      "markerColor": {
        +        "description": "Hex colour for this location's map marker.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "Business or store name.",
        +        "type": "string"
        +      },
        +      "onlineRegions": {
        +        "description": "For an online location: two-letter country codes it ships to or serves, e.g. [\"us\", \"ca\"]. Empty means every visitor sees it.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "phone": {
        +        "type": "string"
        +      },
        +      "postalCode": {
        +        "type": "string"
        +      },
        +      "priority": {
        +        "description": "Higher sorts first when there is no visitor position.",
        +        "type": "number"
        +      },
        +      "serviceAreaCircleVisible": {
        +        "description": "For a service_area location: whether to draw its coverage circle. Null (the default) follows the locator's serviceAreaCircleVisible setting. False draws the pin without the circle.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "serviceRadiusKm": {
        +        "description": "Radius in km, for a service_area location.",
        +        "type": "number"
        +      },
        +      "state": {
        +        "type": "string"
        +      },
        +      "timezone": {
        +        "description": "IANA timezone, for example America/Chicago.",
        +        "type": "string"
        +      },
        +      "visibility": {
        +        "description": "hidden keeps the location in the account but off the public locator.",
        +        "enum": [
        +          "visible",
        +          "hidden"
        +        ],
        +        "type": "string"
        +      },
        +      "website": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / serviceAreaCircleVisible
        Added value: +{
        +  "description": "For a service_area location: whether to draw its coverage circle. Null (the default) follows the locator's serviceAreaCircleVisible setting. False draws the pin without the circle.",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • removedInput schema / required
        Removed value: -[
        -  "name"
        -]
    • Changedpropose_configuration6 fields changed
      • addedInput schema / properties / settings / properties / serviceAreaCircleColor
        Added value: +{
        +  "description": "Service area fill. The circle's fill colour. Used only when Service area colour is set to Custom. Only applies when serviceAreaCircleColorSource is custom.",
        +  "type": "string"
        +}
      • addedInput schema / properties / settings / properties / serviceAreaCircleColorSource
        Added value: +{
        +  "description": "Service area colour. Where a coverage circle takes its colour from, independently of the pins. Only applies when serviceAreaCircleVisible is true. marker = Match the pin; accent = Brand accent; custom = Custom colour.",
        +  "enum": [
        +    "marker",
        +    "accent",
        +    "custom"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / settings / properties / serviceAreaCircleOpacity
        Added value: +{
        +  "description": "Service area fill opacity. How solid the circle's fill is. Lower values keep overlapping areas readable. Only applies when serviceAreaCircleVisible is true. In %.",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / settings / properties / serviceAreaCircleStrokeColor
        Added value: +{
        +  "description": "Service area outline. The circle's outline colour. Leave empty to follow the fill colour. Only applies when serviceAreaCircleVisible is true.",
        +  "type": "string"
        +}
      • addedInput schema / properties / settings / properties / serviceAreaCircleStrokeWeight
        Added value: +{
        +  "description": "Service area outline width. Thickness of the circle's outline. Zero removes it, leaving the fill alone. Only applies when serviceAreaCircleVisible is true. In px.",
        +  "maximum": 8,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / settings / properties / serviceAreaCircleVisible
        Added value: +{
        +  "description": "Service area circles. Draw the coverage circle around service-area locations. Only applies when locatorLayout is not listOnly or gridOnly.",
        +  "type": "boolean"
        +}
    • Changedset_custom_field1 field changed
      • changedInput schema / properties / icon / enum
        Previous value: -[
        -  "store",
        -  "shopping-bag",
        -  "shopping-cart",
        -  "coffee",
        -  "utensils",
        -  "wine",
        -  "car",
        -  "truck",
        -  "package",
        -  "fuel",
        -  "circle-parking",
        -  "wifi",
        -  "clock",
        -  "credit-card",
        -  "accessibility",
        -  "dog",
        -  "baby",
        -  "wrench",
        -  "stethoscope",
        -  "pill",
        -  "dumbbell",
        -  "building-2",
        -  "warehouse",
        -  "leaf",
        -  "star"
        -]New value: +[
        +  "store",
        +  "shopping-bag",
        +  "shopping-cart",
        +  "coffee",
        +  "utensils",
        +  "wine",
        +  "car",
        +  "truck",
        +  "package",
        +  "fuel",
        +  "circle-parking",
        +  "wifi",
        +  "clock",
        +  "calendar",
        +  "credit-card",
        +  "accessibility",
        +  "dog",
        +  "baby",
        +  "wrench",
        +  "stethoscope",
        +  "pill",
        +  "dumbbell",
        +  "building-2",
        +  "warehouse",
        +  "leaf",
        +  "star"
        +]
    • Changedset_tag_style1 field changed
      • changedInput schema / properties / icon / enum
        Previous value: -[
        -  "store",
        -  "shopping-bag",
        -  "shopping-cart",
        -  "coffee",
        -  "utensils",
        -  "wine",
        -  "car",
        -  "truck",
        -  "package",
        -  "fuel",
        -  "circle-parking",
        -  "wifi",
        -  "clock",
        -  "credit-card",
        -  "accessibility",
        -  "dog",
        -  "baby",
        -  "wrench",
        -  "stethoscope",
        -  "pill",
        -  "dumbbell",
        -  "building-2",
        -  "warehouse",
        -  "leaf",
        -  "star"
        -]New value: +[
        +  "store",
        +  "shopping-bag",
        +  "shopping-cart",
        +  "coffee",
        +  "utensils",
        +  "wine",
        +  "car",
        +  "truck",
        +  "package",
        +  "fuel",
        +  "circle-parking",
        +  "wifi",
        +  "clock",
        +  "calendar",
        +  "credit-card",
        +  "accessibility",
        +  "dog",
        +  "baby",
        +  "wrench",
        +  "stethoscope",
        +  "pill",
        +  "dumbbell",
        +  "building-2",
        +  "warehouse",
        +  "leaf",
        +  "star"
        +]
    • Changedtag_locations3 fields changed
      • addedInput schema / properties / color
        Added value: +{
        +  "description": "Optional. Hex colour for the tag's chip, for example \"#E64893\". Applied in this same call.",
        +  "type": "string"
        +}
      • addedInput schema / properties / group
        Added value: +{
        +  "description": "Optional. Filter group for the tag, for example \"Flavour\". Applied in this same call, so a tag can be created, applied and grouped at once.",
        +  "type": "string"
        +}
      • addedInput schema / properties / icon
        Added value: +{
        +  "description": "Optional. Glyph for the tag's chip. Applied in this same call.",
        +  "enum": [
        +    "store",
        +    "shopping-bag",
        +    "shopping-cart",
        +    "coffee",
        +    "utensils",
        +    "wine",
        +    "car",
        +    "truck",
        +    "package",
        +    "fuel",
        +    "circle-parking",
        +    "wifi",
        +    "clock",
        +    "calendar",
        +    "credit-card",
        +    "accessibility",
        +    "dog",
        +    "baby",
        +    "wrench",
        +    "stethoscope",
        +    "pill",
        +    "dumbbell",
        +    "building-2",
        +    "warehouse",
        +    "leaf",
        +    "star"
        +  ],
        +  "type": "string"
        +}
    • Changedupdate_location3 fields changed
      • changedInput schema / properties / hours / description
        Previous value: -"Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed."New value: +"Opening hours keyed by ISO weekday, 1 = Monday. Each value is a list of {open, close} in 24h HH:MM, or null for closed. REPLACES the whole week: any day left out is cleared. To change one day without restating the rest, use hoursPatch."
      • addedInput schema / properties / hoursPatch
        Added value: +{
        +  "description": "Change only the days named, leaving every other day exactly as it is. Same shape as hours but partial: {\"7\": [{\"open\": \"10:00\", \"close\": \"16:00\"}]} changes Sunday alone. Use this to edit hours; it cannot silently revert a day you did not mention. Ignored if hours is also sent.",
        +  "type": "object"
        +}
      • addedInput schema / properties / serviceAreaCircleVisible
        Added value: +{
        +  "description": "For a service_area location: whether to draw its coverage circle. Null (the default) follows the locator's serviceAreaCircleVisible setting. False draws the pin without the circle.",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
  9. 1 tool update
    • Removedlocation_pages
  10. 6 tool updates
    • Changedcreate_location1 field changed
      • addedInput schema / properties / onlineRegions
        Added value: +{
        +  "description": "For an online location: two-letter country codes it ships to or serves, e.g. [\"us\", \"ca\"]. Empty means every visitor sees it.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedget_embed_code2 fields changed
      • addedInput schema / properties / near
        Added value: +{
        +  "description": "A place to search near when the page opens, e.g. 'Austin, TX'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Lock this embed to locations carrying any of these tags (names or slugs), for a page about one product, service or region.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Addedlocation_pages
    • Changedpropose_configuration1 field changed
      • addedInput schema / properties / labels / properties / learnMore
        Added value: +{
        +  "description": "results. Default: \"Learn more\".",
        +  "type": "string"
        +}
    • Addedspotlight
    • Changedupdate_location1 field changed
      • addedInput schema / properties / onlineRegions
        Added value: +{
        +  "description": "For an online location: two-letter country codes it ships to or serves, e.g. [\"us\", \"ca\"]. Empty means every visitor sees it.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  11. 4 tool updates
    • Changeddelete_location2 fields changed
      • addedInput schema / properties / ids
        Added value: +{
        +  "description": "Several location ids, to apply the same change to all of them in one call (at most 200). Use either id or ids.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 200,
        +  "type": "array"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "id"
        -]
    • Changeddescribe_configuration1 field changed
      • addedInput schema / properties / section
        Added value: +{
        +  "description": "Which part to return. all (default), settings, brand, layouts, labels, or one settings group: search (Search & location), results (Results & sorting), filters (Filter behaviour), hours (Hours & open status), map (Map behaviour), markers (Map markers), layout (Layout & fields), directions (Directions & links), data (Data formatting).",
        +  "enum": [
        +    "all",
        +    "settings",
        +    "brand",
        +    "layouts",
        +    "labels",
        +    "search",
        +    "results",
        +    "filters",
        +    "hours",
        +    "map",
        +    "markers",
        +    "layout",
        +    "directions",
        +    "data"
        +  ],
        +  "type": "string"
        +}
    • Changedpropose_configuration12 fields changed
      • addedInput schema / properties / branding / additionalProperties
        Added value: +false
      • changedInput schema / properties / branding / description
        Previous value: -"Brand changes: { accentColor?: '#RRGGBB', settings?: { ...brand tokens } }."New value: +"Brand changes. accentColor sits at this level; every other token goes inside settings."
      • addedInput schema / properties / branding / properties
        Added value: +{
        +  "accentColor": {
        +    "description": "The brand accent: markers, links, active controls.",
        +    "pattern": "^#[0-9A-Fa-f]{6}$",
        +    "type": "string"
        +  },
        +  "settings": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "backgroundColor": {
        +        "description": "Six-digit hex colour, e.g. #1F2A44.",
        +        "pattern": "^#[0-9A-Fa-f]{6}$",
        +        "type": "string"
        +      },
        +      "borderColor": {
        +        "anyOf": [
        +          {
        +            "pattern": "^#[0-9A-Fa-f]{6}$",
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "null derives a hairline from the text colour."
        +      },
        +      "borderWeight": {
        +        "enum": [
        +          "hairline",
        +          "standard",
        +          "bold"
        +        ],
        +        "type": "string"
        +      },
        +      "borderWidthPx": {
        +        "anyOf": [
        +          {
        +            "maximum": 8,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Overrides borderWeight."
        +      },
        +      "buttonColor": {
        +        "description": "Six-digit hex colour, e.g. #1F2A44.",
        +        "pattern": "^#[0-9A-Fa-f]{6}$",
        +        "type": "string"
        +      },
        +      "buttonSize": {
        +        "enum": [
        +          "small",
        +          "medium",
        +          "large"
        +        ],
        +        "type": "string"
        +      },
        +      "cornerRadiusPx": {
        +        "anyOf": [
        +          {
        +            "maximum": 48,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Overrides cornerStyle."
        +      },
        +      "cornerStyle": {
        +        "enum": [
        +          "sharp",
        +          "soft",
        +          "pill"
        +        ],
        +        "type": "string"
        +      },
        +      "customFontDisplay": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "faces": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "url": {
        +                      "description": "Public https URL of a .woff2 file.",
        +                      "type": "string"
        +                    },
        +                    "weight": {
        +                      "enum": [
        +                        400,
        +                        600
        +                      ],
        +                      "type": "number"
        +                    }
        +                  },
        +                  "required": [
        +                    "weight",
        +                    "url"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "family": {
        +                "description": "CSS family name, e.g. \"Cormorant Garamond\".",
        +                "type": "string"
        +              },
        +              "source": {
        +                "enum": [
        +                  "google",
        +                  "upload"
        +                ],
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "family",
        +              "faces"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "A self-hosted web font. Also set fontDisplay (or fontText) to \"custom\" for it to be used. null removes it."
        +      },
        +      "customFontText": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "faces": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "url": {
        +                      "description": "Public https URL of a .woff2 file.",
        +                      "type": "string"
        +                    },
        +                    "weight": {
        +                      "enum": [
        +                        400,
        +                        600
        +                      ],
        +                      "type": "number"
        +                    }
        +                  },
        +                  "required": [
        +                    "weight",
        +                    "url"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "family": {
        +                "description": "CSS family name, e.g. \"Cormorant Garamond\".",
        +                "type": "string"
        +              },
        +              "source": {
        +                "enum": [
        +                  "google",
        +                  "upload"
        +                ],
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "family",
        +              "faces"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "A self-hosted web font. Also set fontDisplay (or fontText) to \"custom\" for it to be used. null removes it."
        +      },
        +      "fontDisplay": {
        +        "description": "Headings and the business name.",
        +        "enum": [
        +          "system",
        +          "website",
        +          "humanist",
        +          "serif",
        +          "custom"
        +        ],
        +        "type": "string"
        +      },
        +      "fontFamily": {
        +        "description": "Legacy single font. Prefer fontDisplay and fontText.",
        +        "enum": [
        +          "system",
        +          "website",
        +          "humanist",
        +          "serif",
        +          "custom"
        +        ],
        +        "type": "string"
        +      },
        +      "fontScale": {
        +        "enum": [
        +          "compact",
        +          "standard",
        +          "large"
        +        ],
        +        "type": "string"
        +      },
        +      "fontText": {
        +        "description": "Body copy, addresses and controls.",
        +        "enum": [
        +          "system",
        +          "website",
        +          "humanist",
        +          "serif",
        +          "custom"
        +        ],
        +        "type": "string"
        +      },
        +      "markerImageUrl": {
        +        "anyOf": [
        +          {
        +            "pattern": "^https://",
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "A custom map-marker image, hosted anywhere over https (upload it to your own storage and paste the link, like Webflow). Also set the markerStyle setting to \"custom\" for it to show; null clears it and returns to the pin/dot style."
        +      },
        +      "primaryButtonStyle": {
        +        "enum": [
        +          "filled",
        +          "outline"
        +        ],
        +        "type": "string"
        +      },
        +      "secondaryButtonColor": {
        +        "anyOf": [
        +          {
        +            "pattern": "^#[0-9A-Fa-f]{6}$",
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "null follows the accent colour."
        +      },
        +      "shadowStyle": {
        +        "enum": [
        +          "none",
        +          "soft",
        +          "hard"
        +        ],
        +        "type": "string"
        +      },
        +      "spacing": {
        +        "enum": [
        +          "compact",
        +          "comfortable",
        +          "spacious"
        +        ],
        +        "type": "string"
        +      },
        +      "tagChipBackground": {
        +        "anyOf": [
        +          {
        +            "pattern": "^#[0-9A-Fa-f]{6}$",
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Fill colour of the category chips on result cards. null keeps the faint ink tint. Pair with tagChipTextColor for the neutral grey-pill look."
        +      },
        +      "tagChipTextColor": {
        +        "anyOf": [
        +          {
        +            "pattern": "^#[0-9A-Fa-f]{6}$",
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Text colour inside category chips. null follows the body text colour."
        +      },
        +      "textColor": {
        +        "description": "Six-digit hex colour, e.g. #1F2A44.",
        +        "pattern": "^#[0-9A-Fa-f]{6}$",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / labels / additionalProperties
        Added value: +false
      • changedInput schema / properties / labels / description
        Previous value: -"Visitor-facing wording overrides, by label key."New value: +"Visitor-facing wording overrides. {place} and {count} are substituted where the default uses them."
      • addedInput schema / properties / labels / properties
        Added value: +{
        +  "approximateNear": {
        +    "description": "search. Default: \"Near {place}\".",
        +    "type": "string"
        +  },
        +  "backToResults": {
        +    "description": "results. Default: \"Back to results\".",
        +    "type": "string"
        +  },
        +  "clearGroup": {
        +    "description": "search. Default: \"Clear {group}\".",
        +    "type": "string"
        +  },
        +  "clearSearch": {
        +    "description": "search. Default: \"Clear search\".",
        +    "type": "string"
        +  },
        +  "closedDay": {
        +    "description": "hours. Default: \"Closed\".",
        +    "type": "string"
        +  },
        +  "closedNow": {
        +    "description": "hours. Default: \"Closed now\".",
        +    "type": "string"
        +  },
        +  "closedToday": {
        +    "description": "hours. Default: \"Closed today\".",
        +    "type": "string"
        +  },
        +  "closedUntil": {
        +    "description": "hours. Default: \"Opens {day} at {time}\".",
        +    "type": "string"
        +  },
        +  "directions": {
        +    "description": "links. Default: \"Directions\".",
        +    "type": "string"
        +  },
        +  "email": {
        +    "description": "links. Default: \"Email\".",
        +    "type": "string"
        +  },
        +  "empty": {
        +    "description": "results. Default: \"No locations to show yet.\".",
        +    "type": "string"
        +  },
        +  "emptyInitial": {
        +    "description": "results. Default: \"Search to see locations.\".",
        +    "type": "string"
        +  },
        +  "enquiryCancel": {
        +    "description": "results. Default: \"Cancel\".",
        +    "type": "string"
        +  },
        +  "enquiryEmail": {
        +    "description": "results. Default: \"Your email\".",
        +    "type": "string"
        +  },
        +  "enquiryMessage": {
        +    "description": "results. Default: \"What can we help with?\".",
        +    "type": "string"
        +  },
        +  "enquiryName": {
        +    "description": "results. Default: \"Your name\".",
        +    "type": "string"
        +  },
        +  "enquiryOpen": {
        +    "description": "results. Default: \"Send an enquiry\".",
        +    "type": "string"
        +  },
        +  "enquiryPhone": {
        +    "description": "results. Default: \"Phone (optional)\".",
        +    "type": "string"
        +  },
        +  "enquirySending": {
        +    "description": "results. Default: \"Sending\".",
        +    "type": "string"
        +  },
        +  "enquirySent": {
        +    "description": "results. Default: \"Thanks. Someone will be in touch.\".",
        +    "type": "string"
        +  },
        +  "enquirySubmit": {
        +    "description": "results. Default: \"Send\".",
        +    "type": "string"
        +  },
        +  "enquiryTitle": {
        +    "description": "results. Default: \"We will pass this to the right branch\".",
        +    "type": "string"
        +  },
        +  "expandSearch": {
        +    "description": "search. Default: \"Expand search\".",
        +    "type": "string"
        +  },
        +  "fallback": {
        +    "description": "results. Default: \"No exact matches - showing all {count} locations.\".",
        +    "type": "string"
        +  },
        +  "filterNoMatches": {
        +    "description": "search. Default: \"No matching filters\".",
        +    "type": "string"
        +  },
        +  "hideMap": {
        +    "description": "search. Default: \"Hide map\".",
        +    "type": "string"
        +  },
        +  "loadError": {
        +    "description": "results. Default: \"Couldn’t load locations. Please try again later.\".",
        +    "type": "string"
        +  },
        +  "loading": {
        +    "description": "results. Default: \"Loading locations…\".",
        +    "type": "string"
        +  },
        +  "locateMe": {
        +    "description": "search. Default: \"Use my location\".",
        +    "type": "string"
        +  },
        +  "locationBlocked": {
        +    "description": "search. Default: \"Location is blocked for this site. Allow it in your browser settings, or search for a town or postcode instead.\".",
        +    "type": "string"
        +  },
        +  "locationUnavailable": {
        +    "description": "search. Default: \"We couldn't use your location. Search for a town or postcode instead.\".",
        +    "type": "string"
        +  },
        +  "mapError": {
        +    "description": "results. Default: \"Map failed to load.\".",
        +    "type": "string"
        +  },
        +  "mapKeyMissing": {
        +    "description": "results. Default: \"Map unavailable - a map key has not been added yet.\".",
        +    "type": "string"
        +  },
        +  "nearMe": {
        +    "description": "search. Default: \"Your location\".",
        +    "type": "string"
        +  },
        +  "nearNotFound": {
        +    "description": "search. Default: \"We couldn't find that place. Try a postcode or a town name.\".",
        +    "type": "string"
        +  },
        +  "nearPlaceholder": {
        +    "description": "search. Default: \"Enter a town or postcode\". The search box placeholder while searchBehaviour is nearLocation (the default).",
        +    "type": "string"
        +  },
        +  "nearSubmit": {
        +    "description": "search. Default: \"Search\".",
        +    "type": "string"
        +  },
        +  "nearbyTab": {
        +    "description": "results. Default: \"Nearby locations ({count})\".",
        +    "type": "string"
        +  },
        +  "nearestLocation": {
        +    "description": "results. Default: \"Nearest location\".",
        +    "type": "string"
        +  },
        +  "noMatches": {
        +    "description": "results. Default: \"No locations match your search.\".",
        +    "type": "string"
        +  },
        +  "noNearby": {
        +    "description": "results. Default: \"No locations found near {place}.\".",
        +    "type": "string"
        +  },
        +  "onlineTab": {
        +    "description": "results. Default: \"Online options ({count})\".",
        +    "type": "string"
        +  },
        +  "openNow": {
        +    "description": "search. Default: \"Open now\".",
        +    "type": "string"
        +  },
        +  "openUntil": {
        +    "description": "hours. Default: \"Open until {time}\".",
        +    "type": "string"
        +  },
        +  "opensAt": {
        +    "description": "hours. Default: \"Opens {time}\".",
        +    "type": "string"
        +  },
        +  "radiusAny": {
        +    "description": "search. Default: \"Any distance\".",
        +    "type": "string"
        +  },
        +  "radiusLabel": {
        +    "description": "search. Default: \"Search radius\".",
        +    "type": "string"
        +  },
        +  "radiusOption": {
        +    "description": "search. Default: \"{radius}\".",
        +    "type": "string"
        +  },
        +  "resetAll": {
        +    "description": "search. Default: \"Reset\".",
        +    "type": "string"
        +  },
        +  "searchPlaceholder": {
        +    "description": "search. Default: \"Search by name, city, or zip\". The search box placeholder only while searchBehaviour is filterText.",
        +    "type": "string"
        +  },
        +  "serviceArea": {
        +    "description": "results. Default: \"Serves {radius}km radius\".",
        +    "type": "string"
        +  },
        +  "sheetExpandedLabel": {
        +    "description": "results. Default: \"Tap to view map\".",
        +    "type": "string"
        +  },
        +  "sheetPeekLabel": {
        +    "description": "results. Default: \"{count} results - tap to view list\".",
        +    "type": "string"
        +  },
        +  "showMap": {
        +    "description": "search. Default: \"Show map\".",
        +    "type": "string"
        +  },
        +  "website": {
        +    "description": "links. Default: \"Website\".",
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / layouts / additionalProperties
        Added value: +false
      • changedInput schema / properties / layouts / description
        Previous value: -"Field layout per surface: { card?, popup?, detail? }, each { order, hidden, regions }."New value: +"Which fields each surface shows, and in what order."
      • addedInput schema / properties / layouts / properties
        Added value: +{
        +  "card": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "hidden": {
        +        "description": "Fields not shown on this surface.",
        +        "items": {
        +          "enum": [
        +            "image",
        +            "openStatus",
        +            "serviceArea",
        +            "distance",
        +            "address",
        +            "description",
        +            "categories",
        +            "hours",
        +            "phone",
        +            "email",
        +            "website",
        +            "directions",
        +            "customFields"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "order": {
        +        "description": "The fields to show, top to bottom. Fields you leave out keep their current place.",
        +        "items": {
        +          "enum": [
        +            "image",
        +            "openStatus",
        +            "serviceArea",
        +            "distance",
        +            "address",
        +            "description",
        +            "categories",
        +            "hours",
        +            "phone",
        +            "email",
        +            "website",
        +            "directions",
        +            "customFields"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "detail": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "hidden": {
        +        "description": "Fields not shown on this surface.",
        +        "items": {
        +          "enum": [
        +            "image",
        +            "openStatus",
        +            "serviceArea",
        +            "distance",
        +            "address",
        +            "description",
        +            "categories",
        +            "hours",
        +            "phone",
        +            "email",
        +            "website",
        +            "directions",
        +            "customFields"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "order": {
        +        "description": "The fields to show, top to bottom. Fields you leave out keep their current place.",
        +        "items": {
        +          "enum": [
        +            "image",
        +            "openStatus",
        +            "serviceArea",
        +            "distance",
        +            "address",
        +            "description",
        +            "categories",
        +            "hours",
        +            "phone",
        +            "email",
        +            "website",
        +            "directions",
        +            "customFields"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "popup": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "hidden": {
        +        "description": "Fields not shown on this surface.",
        +        "items": {
        +          "enum": [
        +            "image",
        +            "openStatus",
        +            "serviceArea",
        +            "distance",
        +            "address",
        +            "description",
        +            "categories",
        +            "hours",
        +            "phone",
        +            "email",
        +            "website",
        +            "directions",
        +            "customFields"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "order": {
        +        "description": "The fields to show, top to bottom. Fields you leave out keep their current place.",
        +        "items": {
        +          "enum": [
        +            "image",
        +            "openStatus",
        +            "serviceArea",
        +            "distance",
        +            "address",
        +            "description",
        +            "categories",
        +            "hours",
        +            "phone",
        +            "email",
        +            "website",
        +            "directions",
        +            "customFields"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / settings / additionalProperties
        Added value: +false
      • changedInput schema / properties / settings / description
        Previous value: -"Behaviour settings by key, from describe_configuration."New value: +"Behaviour settings to change. Only send the keys you want to change. Heights are two keys: mapHeight for the map and listMaxHeight for the result list."
      • addedInput schema / properties / settings / properties
        Added value: +{
        +  "addressAutocomplete": {
        +    "description": "Address autocomplete. Suggests real addresses as the visitor types. Requires a geocoding provider to be connected first. Only applies when searchBehaviour is nearLocation. off = Off; full = Full address autocomplete; cityRegion = City and region only.",
        +    "enum": [
        +      "off",
        +      "full",
        +      "cityRegion"
        +    ],
        +    "type": "string"
        +  },
        +  "addressSearchCountries": {
        +    "description": "Address countries. Restricts place and address searches to selected countries, using ISO codes such as US, CA, or GB. Only applies when searchBehaviour is nearLocation.",
        +    "type": "string"
        +  },
        +  "autoLocateVisitors": {
        +    "description": "Visitor location. Ask the browser for the visitor's location as soon as the widget loads, so they see nearby results without typing. Only applies when searchBehaviour is nearLocation.",
        +    "type": "boolean"
        +  },
        +  "autoSelectFirst": {
        +    "description": "After a search. What happens to the closest result once a visitor has searched. none = Leave everything unselected; highlight = Highlight the first result; detail = Open the first result's details; popup = Open its map popup.",
        +    "enum": [
        +      "none",
        +      "highlight",
        +      "detail",
        +      "popup"
        +    ],
        +    "type": "string"
        +  },
        +  "cardClickBehaviour": {
        +    "description": "Result click. Highlight keeps the list in place and moves the map. highlight = Highlight it on the map; detail = Open full details.",
        +    "enum": [
        +      "highlight",
        +      "detail"
        +    ],
        +    "type": "string"
        +  },
        +  "clusterShape": {
        +    "description": "Cluster shape. The shape of the numbered bubble that stands in for overlapping pins. Only applies when markerClustering is true. circle = Circle; rounded = Rounded square; square = Square.",
        +    "enum": [
        +      "circle",
        +      "rounded",
        +      "square"
        +    ],
        +    "type": "string"
        +  },
        +  "deduplicateOnImport": {
        +    "description": "Duplicate rows. Flags an imported row when a location with the same name and address already exists, and leaves it unticked so it is not imported twice.",
        +    "type": "boolean"
        +  },
        +  "defaultMapCenter": {
        +    "description": "Opening centre. Search for the town or region where the locator should open. Only applies when defaultMapView is place.",
        +    "type": "string"
        +  },
        +  "defaultMapView": {
        +    "description": "When the locator opens. Choose what visitors see before they search. locations = Show all locations; approximate = Start approximately near the visitor; place = Start at a place I choose; empty = Wait until the visitor searches.",
        +    "enum": [
        +      "locations",
        +      "approximate",
        +      "place",
        +      "empty"
        +    ],
        +    "type": "string"
        +  },
        +  "defaultMapZoom": {
        +    "description": "Opening zoom. How close the map starts when it opens on a fixed place. Only applies when defaultMapView is place. 4 = Country; 6 = Region; 8 = State; 11 = City; 13 = District; 15 = Neighbourhood.",
        +    "enum": [
        +      "4",
        +      "6",
        +      "8",
        +      "11",
        +      "13",
        +      "15"
        +    ],
        +    "type": "string"
        +  },
        +  "defaultOpenClosedView": {
        +    "description": "Default hours view. What the Open now toggle is set to when the widget first loads. Only applies when openClosedFilter is true. all = Show all locations; openOnly = Show open locations only.",
        +    "enum": [
        +      "all",
        +      "openOnly"
        +    ],
        +    "type": "string"
        +  },
        +  "defaultSearchRadius": {
        +    "description": "Default search radius. The distance searched when a visitor has not picked one. Only applies when showRadiusSelector is true. unlimited = Any distance; 10 = 10; 25 = 25; 50 = 50; 100 = 100.",
        +    "enum": [
        +      "unlimited",
        +      "10",
        +      "25",
        +      "50",
        +      "100"
        +    ],
        +    "type": "string"
        +  },
        +  "directionsProvider": {
        +    "description": "Directions provider. Match the device sends iPhone and iPad visitors to Apple Maps and everyone else to Google Maps. google = Always Google Maps; apple = Always Apple Maps; device = Match the visitor's device.",
        +    "enum": [
        +      "google",
        +      "apple",
        +      "device"
        +    ],
        +    "type": "string"
        +  },
        +  "distanceNumericFormat": {
        +    "description": "Distance format. Choose how many decimal places appear beside locations. default = Smart rounding; whole = Whole numbers; oneDecimal = One decimal.",
        +    "enum": [
        +      "default",
        +      "whole",
        +      "oneDecimal"
        +    ],
        +    "type": "string"
        +  },
        +  "distancePlacement": {
        +    "description": "Distance position. Where the distance sits inside a result card. Only applies when locatorLayout is not mapOnly. details = With the details; afterActions = Below the buttons.",
        +    "enum": [
        +      "details",
        +      "afterActions"
        +    ],
        +    "type": "string"
        +  },
        +  "distanceUnits": {
        +    "description": "Distance units. Autodetect uses miles for visitors in the US, UK, and a few others, and kilometres everywhere else. auto = Autodetect from visitor; mi = Miles; km = Kilometres.",
        +    "enum": [
        +      "auto",
        +      "mi",
        +      "km"
        +    ],
        +    "type": "string"
        +  },
        +  "enquiryForm": {
        +    "description": "Enquiry form. Let a visitor send an enquiry from the locator, routed to the dealer whose territory covers the address they searched. off = Off; afterSearch = Show after a search.",
        +    "enum": [
        +      "off",
        +      "afterSearch"
        +    ],
        +    "type": "string"
        +  },
        +  "exportFormat": {
        +    "description": "Export format. The file type used when you download your locations. csv = CSV; json = JSON.",
        +    "enum": [
        +      "csv",
        +      "json"
        +    ],
        +    "type": "string"
        +  },
        +  "filterBehaviour": {
        +    "description": "Filter matching. Match any is the forgiving default and rarely returns nothing. any = Match any selected filter; all = Match all selected filters.",
        +    "enum": [
        +      "any",
        +      "all"
        +    ],
        +    "type": "string"
        +  },
        +  "filterPlacement": {
        +    "description": "Filter placement. Choose where visitors see category and open-now filters. top = Top row; results = Above results; hidden = Hidden.",
        +    "enum": [
        +      "top",
        +      "results",
        +      "hidden"
        +    ],
        +    "type": "string"
        +  },
        +  "filterStyle": {
        +    "description": "Filter style. Dropdowns keep the toolbar compact when you have many filters. dropdown = Dropdown per group; inline = Inline checkboxes.",
        +    "enum": [
        +      "dropdown",
        +      "inline"
        +    ],
        +    "type": "string"
        +  },
        +  "fullScreenControl": {
        +    "description": "Fullscreen control. Adds a control that expands the map to fill the browser window. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  },
        +  "geolocationErrorAlerts": {
        +    "description": "Location errors. Tells the visitor when an automatic browser location request was refused or failed. Only applies when autoLocateVisitors is true.",
        +    "type": "boolean"
        +  },
        +  "googleMapId": {
        +    "description": "Google map ID. A cloud-styled map ID from the Google Cloud console, used instead of the built-in themes. Only applies when mapProvider is google.",
        +    "type": "string"
        +  },
        +  "gridColumns": {
        +    "description": "Grid columns. Sets how many result cards appear across when a grid layout is selected. Only applies when locatorLayout is gridBelow or gridOnly. In columns.",
        +    "maximum": 6,
        +    "minimum": 1,
        +    "type": "number"
        +  },
        +  "groupedCardTags": {
        +    "description": "Group tags. Puts each tag group's name above its own row of chips.",
        +    "type": "boolean"
        +  },
        +  "hideBodyBeforeSearch": {
        +    "description": "Hide locator body. Hide the map and results until a visitor searches.",
        +    "type": "boolean"
        +  },
        +  "hideMarkersOutsideRadius": {
        +    "description": "Radius marker visibility. Keeps the map showing only what is in the list. Off leaves distant pins visible for context. Only applies when showRadiusSelector is true.",
        +    "type": "boolean"
        +  },
        +  "limitResults": {
        +    "description": "Result limit. Caps how many locations appear in the list at once. Lower numbers keep long lists manageable on mobile. In locations.",
        +    "maximum": 500,
        +    "minimum": 1,
        +    "type": "number"
        +  },
        +  "linkIconStyle": {
        +    "description": "Link style. Icons alone are compact but less obvious. Icons with text is the safest for a general audience. textOnly = Text only; iconsAndText = Icons and text; iconsOnly = Icons only.",
        +    "enum": [
        +      "textOnly",
        +      "iconsAndText",
        +      "iconsOnly"
        +    ],
        +    "type": "string"
        +  },
        +  "listMaxHeight": {
        +    "description": "List height. How tall the scrolling result list is, in pixels. Only applies when locatorLayout is not mapOnly. In px.",
        +    "maximum": 1200,
        +    "minimum": 150,
        +    "type": "number"
        +  },
        +  "listScrollbar": {
        +    "description": "Result list scrollbar. Whether the scrolling result list uses the browser's own scrollbar or a themed one. Only applies when locatorLayout is not mapOnly. auto = Browser default; themed = Match the text colour.",
        +    "enum": [
        +      "auto",
        +      "themed"
        +    ],
        +    "type": "string"
        +  },
        +  "listTextAlign": {
        +    "description": "Result text alignment. Aligns the name, address and details inside each result card. Only applies when locatorLayout is not mapOnly. left = Left; center = Centre.",
        +    "enum": [
        +      "left",
        +      "center"
        +    ],
        +    "type": "string"
        +  },
        +  "locateMeButton": {
        +    "description": "Use my location. Lets visitors use browser location without receiving a permission prompt on page load. Only applies when searchBehaviour is nearLocation. iconText = Icon and text; iconOnly = Icon only; hidden = Hidden.",
        +    "enum": [
        +      "iconText",
        +      "iconOnly",
        +      "hidden"
        +    ],
        +    "type": "string"
        +  },
        +  "locatorFrame": {
        +    "description": "Outer frame. Draws a border around the whole locator and its map. none = No frame; border = Bordered.",
        +    "enum": [
        +      "none",
        +      "border"
        +    ],
        +    "type": "string"
        +  },
        +  "locatorLayout": {
        +    "description": "Locator layout. Where the list sits relative to the map. listLeft = List left of the map; listRight = List right of the map; listBelow = List below the map; gridBelow = Grid below the map; listOnly = List only, no map; gridOnly = Grid only, no map; mapOnly = Map only, no list.",
        +    "enum": [
        +      "listLeft",
        +      "listRight",
        +      "listBelow",
        +      "gridBelow",
        +      "listOnly",
        +      "gridOnly",
        +      "mapOnly"
        +    ],
        +    "type": "string"
        +  },
        +  "mapHeight": {
        +    "description": "Map height. How tall the map area is on wider screens, in pixels. Narrow screens cap it at half the screen height so the results stay reachable. Only applies when locatorLayout is not listOnly or gridOnly. In px.",
        +    "maximum": 900,
        +    "minimum": 150,
        +    "type": "number"
        +  },
        +  "mapProvider": {
        +    "description": "Map provider. Which map renders your locator. Both render on your own account, so you add a key and the map loads bill to you. Only applies when locatorLayout is not listOnly or gridOnly. mapbox = Mapbox (your key); google = Google Maps (your key).",
        +    "enum": [
        +      "mapbox",
        +      "google"
        +    ],
        +    "type": "string"
        +  },
        +  "mapTheme": {
        +    "description": "Map style. Streets is the standard road map; Light, Dark, and Satellite are the alternate tile styles. Only applies when locatorLayout is not listOnly or gridOnly. streets = Streets; light = Light; dark = Dark; satellite = Satellite.",
        +    "enum": [
        +      "streets",
        +      "light",
        +      "dark",
        +      "satellite"
        +    ],
        +    "type": "string"
        +  },
        +  "mapboxStyleUrl": {
        +    "description": "Mapbox style. A style of your own from Mapbox Studio, used instead of the four built-in themes. Only applies when mapProvider is mapbox.",
        +    "type": "string"
        +  },
        +  "markerClustering": {
        +    "description": "Marker clusters. Replaces overlapping pins with a single numbered cluster that splits apart as the visitor zooms in. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  },
        +  "markerColorSource": {
        +    "description": "Marker colour. Tag colour keeps the meaning your tags carry; Brand accent makes the pins match the rest of your locator. Only applies when locatorLayout is not listOnly or gridOnly. category = Tag colour; accent = Brand accent.",
        +    "enum": [
        +      "category",
        +      "accent"
        +    ],
        +    "type": "string"
        +  },
        +  "markerImageAnchor": {
        +    "description": "Artwork anchor. Which point of the artwork sits on the location's coordinate. Only applies when markerStyle is custom. bottom = Bottom edge (like a pin); center = Centre (like a dot).",
        +    "enum": [
        +      "bottom",
        +      "center"
        +    ],
        +    "type": "string"
        +  },
        +  "markerImageWidth": {
        +    "description": "Artwork size. How wide the uploaded marker artwork is drawn, in pixels. Only applies when markerStyle is custom. In px.",
        +    "maximum": 96,
        +    "minimum": 16,
        +    "type": "number"
        +  },
        +  "markerNumbering": {
        +    "description": "Marker numbers. Matches each pin to its position in the list, so a visitor can connect what they see on the map to what they are reading. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  },
        +  "markerRepositionOnClick": {
        +    "description": "Marker position. Moving the clicked pin toward the bottom leaves room for its popup above it, instead of the popup running off the top of the map. Only applies when locatorLayout is not listOnly or gridOnly. center = Centre of the map; bottom = Bottom of the map; none = Do not move the map.",
        +    "enum": [
        +      "center",
        +      "bottom",
        +      "none"
        +    ],
        +    "type": "string"
        +  },
        +  "markerStyle": {
        +    "description": "Marker style. Choose a classic pin, a compact dot or an uploaded custom marker image. Only applies when locatorLayout is not listOnly or gridOnly. pin = Classic pin; dot = Dot; logo = Logo inside a pin; custom = Custom image.",
        +    "enum": [
        +      "pin",
        +      "dot",
        +      "logo",
        +      "custom"
        +    ],
        +    "type": "string"
        +  },
        +  "maxZoomLevel": {
        +    "description": "Maximum zoom. How far in a visitor can zoom. 22 is fully zoomed in. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "maximum": 22,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "minZoomLevel": {
        +    "description": "Minimum zoom. How far out a visitor can zoom. 0 is the whole world. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "maximum": 22,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "mobileTouchPanning": {
        +    "description": "Mobile panning. Two fingers lets a visitor scroll the page past the map with one finger. Only applies when locatorLayout is not listOnly or gridOnly. twoFingers = Two fingers; oneFinger = One finger.",
        +    "enum": [
        +      "twoFingers",
        +      "oneFinger"
        +    ],
        +    "type": "string"
        +  },
        +  "mouseScrollZoom": {
        +    "description": "Wheel zoom. Off stops the map from swallowing the page scroll when a visitor scrolls past the widget. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  },
        +  "nearestLocationSummary": {
        +    "description": "Nearest-location summary. Show a compact summary of the nearest matching location after a visitor searches near a place. hidden = Hidden; afterSearch = Show after search.",
        +    "enum": [
        +      "hidden",
        +      "afterSearch"
        +    ],
        +    "type": "string"
        +  },
        +  "noResultsBehaviour": {
        +    "description": "No results. Showing everything avoids a dead end for the visitor. showAll = Show all locations with a note; empty = Show an empty state.",
        +    "enum": [
        +      "showAll",
        +      "empty"
        +    ],
        +    "type": "string"
        +  },
        +  "openClosedFilter": {
        +    "description": "Open-only filter. Adds an Open now toggle to the toolbar.",
        +    "type": "boolean"
        +  },
        +  "phoneNumberFormatting": {
        +    "description": "Phone format. Reformats imported US and Canadian numbers to (555) 555-0100. Off keeps exactly what was in your file.",
        +    "type": "boolean"
        +  },
        +  "popupColumns": {
        +    "description": "Popup columns. How a location's details are arranged in the popup that opens from a map pin. Two columns also widens the popup, since two narrow columns read worse than one. singleColumn = Single column; twoColumn = Two columns.",
        +    "enum": [
        +      "singleColumn",
        +      "twoColumn"
        +    ],
        +    "type": "string"
        +  },
        +  "printDirectionsButton": {
        +    "description": "Print directions. Adds a print control to the directions panel.",
        +    "type": "boolean"
        +  },
        +  "priorityMaxRadius": {
        +    "description": "Priority radius. Stops a featured location from being pinned to the top when it is unhelpfully far from the visitor. off = No limit; 25 = Within 25; 50 = Within 50; 100 = Within 100.",
        +    "enum": [
        +      "off",
        +      "25",
        +      "50",
        +      "100"
        +    ],
        +    "type": "string"
        +  },
        +  "radiusChoices": {
        +    "description": "Radius options. The distances a visitor can choose from, comma separated, in the units they see. Leave empty for the built-in list. Only applies when showRadiusSelector is true.",
        +    "type": "string"
        +  },
        +  "resetButton": {
        +    "description": "Reset control. Gives visitors one control that clears the search and every filter at once.",
        +    "type": "boolean"
        +  },
        +  "resultColumnWidth": {
        +    "description": "Result column width. How much of the width the result list takes when it sits beside the map. Only applies when locatorLayout is listLeft or listRight. In %.",
        +    "maximum": 75,
        +    "minimum": 25,
        +    "type": "number"
        +  },
        +  "resultLoading": {
        +    "description": "Loading. Immediate renders everything at once. immediate = Immediate; paged = Load more on scroll.",
        +    "enum": [
        +      "immediate",
        +      "paged"
        +    ],
        +    "type": "string"
        +  },
        +  "scrollToStoreOnMarkerClick": {
        +    "description": "Scroll to result. Clicking a pin scrolls the matching entry into view and highlights it, instead of only opening a popup. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  },
        +  "searchBehaviour": {
        +    "description": "Search mode. Decides whether typing filters your existing list, or moves the map to a place the visitor names. filterText = Filter by text; nearLocation = Search near a place.",
        +    "enum": [
        +      "filterText",
        +      "nearLocation"
        +    ],
        +    "type": "string"
        +  },
        +  "searchFields": {
        +    "description": "Search fields. Address-only is the familiar store-locator behaviour. Only applies when searchBehaviour is filterText. address = Address only; details = Address plus location details.",
        +    "enum": [
        +      "address",
        +      "details"
        +    ],
        +    "type": "string"
        +  },
        +  "searchIcon": {
        +    "description": "Search icon. Puts a magnifying glass inside the search box. none = No icon; leading = Magnifying glass.",
        +    "enum": [
        +      "none",
        +      "leading"
        +    ],
        +    "type": "string"
        +  },
        +  "searchPlacement": {
        +    "description": "Search placement. Choose where visitors see the main search field in the locator. top = Top row; results = Above results; hidden = Hidden.",
        +    "enum": [
        +      "top",
        +      "results",
        +      "hidden"
        +    ],
        +    "type": "string"
        +  },
        +  "searchZoomBehaviour": {
        +    "description": "Search zoom. Fitting all results keeps every match on screen. Only applies when locatorLayout is not listOnly or gridOnly. fitAll = Fit all results on screen; fixed = Use a fixed zoom level.",
        +    "enum": [
        +      "fitAll",
        +      "fixed"
        +    ],
        +    "type": "string"
        +  },
        +  "selectedResultEmphasis": {
        +    "description": "Selected result. How the result a visitor has chosen is marked out from the rest. Only applies when locatorLayout is not mapOnly. border = Accent border; stripe = Accent stripe; tint = Tinted background.",
        +    "enum": [
        +      "border",
        +      "stripe",
        +      "tint"
        +    ],
        +    "type": "string"
        +  },
        +  "showFilterCounts": {
        +    "description": "Filter counts. Puts the number of matching locations next to each filter.",
        +    "type": "boolean"
        +  },
        +  "showFilterGroupHeadings": {
        +    "description": "Filter headings. Labels each filter group by name. Turn off when you only have one group and the heading is redundant.",
        +    "type": "boolean"
        +  },
        +  "showMapByDefault": {
        +    "description": "Initial map. Off starts with just the list and a Show map button, which loads faster and suits pages where the list matters more. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  },
        +  "showRadiusSelector": {
        +    "description": "Radius filter. Adds a distance dropdown next to the search box. Only applies when searchBehaviour is nearLocation.",
        +    "type": "boolean"
        +  },
        +  "showSearchLocationMarker": {
        +    "description": "Search marker. Drops a distinct pin where the visitor searched, so they can see what the distances are measured from. Only applies when searchBehaviour is nearLocation.",
        +    "type": "boolean"
        +  },
        +  "showUnassignedFilters": {
        +    "description": "Ungrouped filters. Filters you have not put in a group still appear, under a general heading.",
        +    "type": "boolean"
        +  },
        +  "sortDirection": {
        +    "description": "Sort direction. Ascending puts the nearest, or the earliest alphabetically, first. asc = Ascending; desc = Descending.",
        +    "enum": [
        +      "asc",
        +      "desc"
        +    ],
        +    "type": "string"
        +  },
        +  "sortField": {
        +    "description": "Sort by. Distance needs a search or a visitor location to mean anything. distance = Distance; name = Name; priority = Priority, then name.",
        +    "enum": [
        +      "distance",
        +      "name",
        +      "priority"
        +    ],
        +    "type": "string"
        +  },
        +  "storeNameLinkBehaviour": {
        +    "description": "Location name click. Showing it on the map keeps the visitor inside the widget. showOnMap = Show the location on the map; website = Open the location's website; none = Do nothing.",
        +    "enum": [
        +      "showOnMap",
        +      "website",
        +      "none"
        +    ],
        +    "type": "string"
        +  },
        +  "storeZoomLevel": {
        +    "description": "Location zoom. How far in the map goes when a visitor clicks a single location. Higher is closer. 17 is roughly street level. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "maximum": 22,
        +    "minimum": 1,
        +    "type": "number"
        +  },
        +  "updateListOnMapDrag": {
        +    "description": "Map move updates. Re-sorts the list to match wherever the visitor has panned the map. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  },
        +  "urlState": {
        +    "description": "URL state. Lets a visitor bookmark or share a filtered view, and lets you link straight to one from an ad or email.",
        +    "type": "boolean"
        +  },
        +  "urlStateSearchText": {
        +    "description": "Put the visitor's search in the URL. Also writes what a visitor typed into the address bar, so their exact search can be bookmarked or shared. Only applies when urlState is true.",
        +    "type": "boolean"
        +  },
        +  "websiteLinkTarget": {
        +    "description": "Website links. A new tab keeps the visitor on your page. Same tab sends them away from the locator entirely. newTab = In a new tab; sameTab = In the same tab.",
        +    "enum": [
        +      "newTab",
        +      "sameTab"
        +    ],
        +    "type": "string"
        +  },
        +  "weekBeginsOn": {
        +    "description": "Week begins on. Affects the order days are listed in the hours editor and in the widget's opening-hours table. Display only. Hours stay stored the same way, so switching it never changes a location. monday = Monday; sunday = Sunday.",
        +    "enum": [
        +      "monday",
        +      "sunday"
        +    ],
        +    "type": "string"
        +  },
        +  "widgetWidth": {
        +    "description": "Widget width. Use a percentage to fill the container it is embedded in, or a fixed value like 560px to cap it.",
        +    "type": "string"
        +  },
        +  "wordCapitalization": {
        +    "description": "Capitalization. Converts ALL CAPS or all lowercase names, addresses and cities to title case on import.",
        +    "type": "boolean"
        +  },
        +  "zipCodePrefix": {
        +    "description": "Postcode prefixes. Automatic restores the leading zeros spreadsheets strip from US ZIP codes, so 01234 does not import as 1234. auto = Automatic; none = Leave as imported.",
        +    "enum": [
        +      "auto",
        +      "none"
        +    ],
        +    "type": "string"
        +  },
        +  "zoomMapOnFilterChange": {
        +    "description": "Refit map. Zooms the map to the remaining results after a filter is applied, instead of leaving the visitor looking at empty space. Only applies when locatorLayout is not listOnly or gridOnly.",
        +    "type": "boolean"
        +  }
        +}
    • Changedupdate_location2 fields changed
      • addedInput schema / properties / ids
        Added value: +{
        +  "description": "Several location ids, to apply the same change to all of them in one call (at most 200). Use either id or ids.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 200,
        +  "type": "array"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "id"
        -]
  12. 1 tool update
    • Addedset_tag_style
  13. 15 tool updates
    • First observedapply_configuration
    • First observedcreate_location
    • First observeddelete_location
    • First observeddescribe_configuration
    • First observedfind_nearest_locations
    • First observedget_embed_code
    • First observedget_location
    • First observedlist_configuration_versions
    • First observedlist_locations
    • First observedlist_tags
    • First observedpropose_configuration
    • First observedrollback_configuration
    • First observedset_custom_field
    • First observedtag_locations
    • First observedupdate_location

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables managing Google Business Profiles through natural language: list locations, reply to reviews, create local posts, and fetch performance metrics.
    26
    83 npm
    4
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to search places and addresses, compute driving, walking, and kickboard routes, optimize waypoints, and calculate distance and time matrices. Results can be displayed as interactive maps within conversations.
    12
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to look up businesses, find free appointment slots, book, list and cancel appointments at salons, barbershops, nail and brow studios and clinics. Works read-only without a customer login by returning a pre-filled booking link, and can also run against a built-in demo with sample businesses.
    5
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources