CoreLoop Business Network
Server Details
Search real businesses, then read profiles, services and hours or contact them, in one endpoint.
- Status
- Healthy
- Uptime
- 100.0% over 41 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 7 tools
Each tool has a clear primary purpose (search, profile, services, availability, agent endpoints, inquiry), and descriptions explain boundaries. However, get_business_services and compare_business_services both deal with a single business's services, and the name 'compare' could mislead agents into expecting cross-business comparison.
All tool names follow a consistent snake_case verb_business_noun pattern (check_business_availability, get_business_info, search_businesses, etc.). Minor singular/plural variation does not break predictability.
Seven tools form a well-scoped set for a business directory: search, profile, services, availability, agent metadata, and inquiry. Each tool has a clear role and none feels redundant or excessive.
The surface covers the core discovery and contact lifecycle for a business directory, including search, detailed profiles, service listings, availability, agent endpoints, and messaging. Minor gaps exist, such as no explicit category listing or aggregated multi-business service comparison, but these are not critical for the stated purpose.
Available Tools
7 toolscheck_business_availabilityARead-onlyInspect
One business's opening hours, whether it is open right now, and when it next opens. Phase 1 returns published hours, not bookable slots.
| Name | Required | Description | Default |
|---|---|---|---|
| business | Yes | Which business to ask: its CoreLoop slug, or the `business_id` returned by search_businesses. `business_id` is an opaque, stable, public routing identifier — safe to store and re-use across sessions, unchanged by a rename or a slug change, and carrying no sensitive information. Pass back exactly the value search_businesses gave you: do not parse it, do not infer meaning from its format, and do not construct one. | |
| location_id | No | Which location's hours to return (id from get_info locations[]). Defaults to the primary location. |
Output Schema
| Name | Required | Description |
|---|---|---|
| locale | No | |
| business | No | |
| timezone | No | |
| always_open | No | |
| data_source | No | |
| is_open_now | No | |
| location_id | No | |
| last_updated | No | |
| next_open_at | No | |
| location_label | No | |
| operating_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already signals a safe read operation. The description adds that it returns published hours not bookable slots, which is a useful limitation, but does not disclose other behaviors like network effects, rate limits, or what happens if the business is not found. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and adds the Phase 1 distinction. Zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema and rich parameter descriptions, the description is sufficient for basic use. The 'Phase 1' note clarifies scope. Slightly missing is explicit guidance on when this tool is preferred over competitors, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are extensively described. The description adds the distinction between published hours and bookable slots, but the schema already covers all parameter semantics including the business_id opaque routing id. The description's 'Phase 1' note adds context but is not necessary for parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a business's opening hours, current open status, and next opening time. It also distinguishes from 'bookable slots' and implicitly from siblings like search_businesses, though it doesn't explicitly differentiate from get_business_info which might also touch hours.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a hint about context ('Phase 1 returns published hours, not bookable slots'), but does not explicitly state when to use this vs. get_business_info or other sibling tools. Usage context is implied for checking availability, but no clear alternatives or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_business_servicesARead-onlyInspect
Compare one business's services within a category or keyword, with a price/duration summary. Each row reports match_type, so you can tell an exact category hit from an incidental keyword.
| Name | Required | Description | Default |
|---|---|---|---|
| business | Yes | Which business to ask: its CoreLoop slug, or the `business_id` returned by search_businesses. `business_id` is an opaque, stable, public routing identifier — safe to store and re-use across sessions, unchanged by a rename or a slug change, and carrying no sensitive information. Pass back exactly the value search_businesses gave you: do not parse it, do not infer meaning from its format, and do not construct one. | |
| compare_by | No | Restrict the comparison to these fields. Recognised values: price, duration, description, includes (name, category and match_type are always present; unrecognised values are ignored). Omit for the full comparison view. | |
| service_type | Yes | Service category or keyword to compare. Matches category exactly first, then service name/description contains. |
Output Schema
| Name | Required | Description |
|---|---|---|
| locale | No | |
| business | No | |
| services | No | |
| verified | No | |
| suggestion | No | |
| data_source | No | |
| last_updated | No | |
| service_type | No | |
| business_name | No | |
| comparison_summary | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description is consistent: 'Compare' and 'summary' are read-oriented operations, so there is no annotation contradiction. The description adds useful behavioral nuance beyond the annotations by explaining that each row reports match_type and that the results distinguish exact category hits from incidental keyword matches. It could disclose more (e.g., behavior when a business has no matching services), but for a read-only comparison tool the bar is met.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place: the first delivers the tool's action and output type, the second highlights a distinguishing behavioral feature of the results. Information is front-loaded; the most decision-relevant detail ('Compare one business's services') comes first. There is no filler, tangential context, or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema presence, and read-only annotations, the description does not need to restate returns or parameter details. It meaningfully covers the usage scenario and the match_type nuance. Minor gap: the description does not explicitly indicate what happens when no services match or when compare_by is omitted, though the schema already covers the compare_by omission case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is 100% covered with rich per-parameter descriptions: business explains slug vs business_id semantics, service_type explains exact-match-then-containswith match order, and compare_by documents recognized values including omission behavior. The description itself adds only a high-level restatement of the 'category or keyword' concept and the price/duration summary, which echo what the schema already documents. With full schema coverage, baseline 3 is appropriate; the description does not meaningfully deepen parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Compare'), a precise resource (one business's services), a scoping dimension (category or keyword), and an explicit result type (price/duration summary), making the core purpose clear. It also adds the match_type detail, which meaningfully distinguishes exact category hits from incidental keyword matches. However, it does not explicitly name its closest sibling alternatives (e.g., get_business_services or search_businesses), so sibling differentiation relies on inference rather than statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys clear context for when the tool is appropriate: when the agent needs a comparative price/duration view of one business's services within a category or keyword, distinguishing exact from incidental matches. It does not, however, provide explicit when-not-to-use guidance or explicitly name alternatives such as get_business_services or search_businesses. The usage scenario is clear enough that the agent is unlikely to misuse it, but exclusions are not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_agentARead-onlyInspect
The canonical ids and endpoint URLs for one business — its own MCP and A2A endpoints, agent card, llms.txt and public page, under protocol_urls. A null URL means that surface is switched off for this business right now: do not construct it yourself, and use one of the non-null surfaces instead.
| Name | Required | Description | Default |
|---|---|---|---|
| business | Yes | Which business to ask: its CoreLoop slug, or the `business_id` returned by search_businesses. `business_id` is an opaque, stable, public routing identifier — safe to store and re-use across sessions, unchanged by a rename or a slug change, and carrying no sensitive information. Pass back exactly the value search_businesses gave you: do not parse it, do not infer meaning from its format, and do not construct one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| business | No | |
| verified | No | |
| protocols | No | |
| data_source | No | |
| resolved_at | No | |
| protocol_urls | No | |
| content_locale | No | |
| tools_available | No | |
| available_locales | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the important null-means-disabled behavior and warns against constructing URLs. This enriches the operational understanding without repeating what the annotation already communicates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two dense sentences: one for core purpose and one for the key behavioral caveat. It is front-loaded, free of filler, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a simple read-only tool with one parameter, a complete input schema, and an output schema, this description covers all operational essentials. The null-URL behavior and non-construction rule are exactly the additional context an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool description itself does not add parameter semantics, but schema description coverage is 100% and the `business` parameter is already richly explained in the input schema with opaque-ID guidance and pass-through instructions. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the function: retrieving canonical IDs and endpoint URLs for one business, including MCP/A2A endpoints, agent card, llms.txt, and public page under `protocol_urls`. This is a specific verb-plus-resource definition that distinguishes it from siblings like search_businesses or get_business_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful within-tool guidance about null URLs: do not construct them and use a non-null surface instead. However, it does not explicitly state when to prefer this tool over siblings such as get_business_info or compare_business_services, so the usage context is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_infoARead-onlyInspect
Full profile for one business found through search_businesses: identity, locations, contact, policies, images, public documents and the languages it publishes in.
| Name | Required | Description | Default |
|---|---|---|---|
| business | Yes | Which business to ask: its CoreLoop slug, or the `business_id` returned by search_businesses. `business_id` is an opaque, stable, public routing identifier — safe to store and re-use across sessions, unchanged by a rename or a slug change, and carrying no sensitive information. Pass back exactly the value search_businesses gave you: do not parse it, do not infer meaning from its format, and do not construct one. | |
| sections | No | Which sections to include. Defaults to all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| images | No | |
| intake | No | |
| locale | No | |
| contact | No | |
| tagline | No | |
| business | No | |
| category | No | |
| keywords | No | |
| location | No | |
| policies | No | |
| verified | No | |
| documents | No | |
| locations | No | |
| data_source | No | |
| description | No | |
| last_updated | No | |
| subcategories | No | |
| call_to_action | No | |
| tools_available | No | |
| available_locales | No | |
| protocols_available | No | |
| asserts_no_physical_location | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the bar for disclosure is lower. The description adds value by listing what the profile includes (identity, locations, contact, policies, images, public documents, languages), which goes beyond the annotations and helps the agent understand the data returned. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, dense sentence that is front-loaded with 'Full profile' and immediately lists contents. Zero filler or redundant phrasing—every word contributes to the meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema and 100% parameter schema coverage, the description does not need to explain return values. It provides a clear overview of the tool's scope, but could mention when to use it over siblings for full completeness; however, that falls more under usage guidance than contextual completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage for both parameters, including detailed guidance on the business field (Opaque, stable, do not parse) and the sections enum. The tool description itself adds no additional parameter details, so per the rubric the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: "Full profile for one business" and enumerates the contents (identity, locations, contact, policies, images, public documents, languages). This clearly distinguishes it from sibling tools like get_business_services or check_business_availability, which have different scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says the tool is 'for one business found through search_businesses', implying it should be used after a search and for a single entity. However, it does not explicitly state when not to use it or how it compares to alternatives like get_business_agent or compare_business_services, so only partial guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_servicesARead-onlyInspect
One business's service catalogue, with filtering, sorting and pagination. Page with offset/limit and read has_more — the order is stable, so a second page will not repeat or skip a service.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | Pagination position: omit for the first page, then pass back the `next_offset` token from the previous response VERBATIM. The token is opaque and bound to the catalogue as it was when the page was issued — if services were added, removed or reordered since, the call returns `cursor_expired` and you should restart without an offset. A plain integer offset is still accepted in EITHER spelling — as a JSON number (20) or as its exact string form ("20") — and skips that many results with no catalogue binding. Only a string that is neither an exact integer nor a token this endpoint issued (for example a mangled or truncated token) is refused with `cursor_expired` rather than resumed. | |
| sort_by | No | Field to sort by. Recognised values: price, duration, name, category (unrecognised values are ignored — results stay unsorted). | |
| business | Yes | Which business to ask: its CoreLoop slug, or the `business_id` returned by search_businesses. `business_id` is an opaque, stable, public routing identifier — safe to store and re-use across sessions, unchanged by a rename or a slug change, and carrying no sensitive information. Pass back exactly the value search_businesses gave you: do not parse it, do not infer meaning from its format, and do not construct one. | |
| category | No | Filter by service category | |
| max_price | No | Only services priced at or below this amount | |
| min_price | No | Only services priced at or above this amount | |
| price_type | No | Filter by price type (e.g. fixed, from, range, hourly, free, contact, or unpublished for services with no price set) | |
| sort_order | No | Sort direction (defaults to asc) | |
| max_duration | No | Only services lasting at most this many minutes | |
| min_duration | No | Only services lasting at least this many minutes |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | |
| total | No | |
| locale | No | |
| offset | No | |
| restart | No | |
| business | No | |
| has_more | No | |
| services | No | |
| data_source | No | |
| next_offset | No | |
| last_updated | No | |
| returned_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint=true by disclosing the pagination contract: stable ordering guarantees no repeats or skips across pages, has_more signals continuation, and the offset schema documents cursor_expired failure behavior and opaque token handling. The sort_by note that unrecognized values are silently ignored is a non-obvious behavioral trait an agent must know to avoid misinterpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the first front-loads purpose and capabilities, the second states the single most important behavioral guarantee (stable ordering preventing repeats/skips). Every clause earns its place, and the critical pagination contract is stated up front.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter read-only catalogue tool, the description plus a 91%-covered schema and an output schema cover the essentials: scope, filtering/sorting/pagination mechanics, cursor error semantics, and return-value shape via the output schema. The only minor gap is no direct statement of error behavior beyond cursor_expired, which the offset parameter documentation largely handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 91%, so the baseline is 3 even though the tool description itself adds minimal parameter detail — it only frames offset/limit/has_more as the pagination mechanism. The heavy lifting is done by the exemplary schema descriptions (cursor token verbatim rules, integer-vs-string offset acceptance, business_id opacity and stability). The description adds no meaning beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'One business's service catalogue' — with explicit capabilities: filtering, sorting, and pagination. The scope qualifier 'One business's' distinguishes it from siblings like search_businesses (multi-business discovery) and compare_business_services (cross-business comparison), so an agent can select it correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'One business's' scope clearly signals the selection condition: use this when a specific business is already identified. The `business` parameter description adds workflow guidance by routing the agent through search_businesses to obtain a business_id. However, there are no explicit exclusions or alternative routing (e.g., when to prefer compare_business_services), so it just misses the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_businessesARead-onlyInspect
Search the CoreLoop business directory. Start here: every other tool on this endpoint needs a business, and each result carries the business_id and slug you pass to them as the business argument. business_id is a PUBLIC, OPAQUE, STABLE routing identifier: it is safe to store and re-use across sessions, it stays the same when a business renames itself or changes its slug, and it carries no sensitive information. Treat it as a token — do not parse it, do not derive meaning from its format, and do not construct one. Pass back exactly the value you were given. A result with asserts_no_physical_location: true has stated that it has no premises (consultants, trades, online-only) — it is intentionally absent from city search rather than missing data. false means no such statement was made; it does NOT imply premises. Results are returned in your requested language when the business has published a translation: send ?locale=<code> on the endpoint URL (takes precedence) or an Accept-Language header. Each result reports the language it is written in (locale), the business's original language (content_locale), and every language it is available in (available_locales). mcp_url, a2a_url and page_url — and every URL inside protocol_urls — are null when that surface is currently switched off for the business: a null is intentional (do not construct the URL yourself), and the business remains reachable through its non-null surfaces. data_source: "directory" marks these rows as the search projection; call get_business_info for the live profile. PAGING: one call returns at most limit results. Read has_more — a short page is not proof of the end — and pass next_cursor back as cursor for the next page. The cursor is opaque and bound to the filters and sort it was issued for: change any of them and it is rejected, so start a new search instead. limit may change between pages.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Filter by city (case-insensitive exact match) | |
| limit | No | Maximum results per page (1-20). Out-of-range values are clamped, not rejected. | |
| query | No | Search query (business name or keyword) | |
| cursor | No | Continuation token from a previous response's `next_cursor`. Omit for the first page. It is opaque and bound to the filters and sort it was issued for: pass it back byte-for-byte, and change nothing except `limit` between pages — any other change makes it invalid and you must start a new search. At most 100 results are reachable by paging; narrow the filters to see beyond that. | |
| sort_by | No | Sort results. Default: relevance | |
| category | No | Filter by business category (case-insensitive exact match). Canonical categories: Accounting & Tax, Agriculture & Farming, Automotive, Beauty & Wellness, Childcare & Family, Cleaning Services, Construction & Renovation, Creative & Arts, Education & Training, Events & Entertainment, Financial Services, Fitness & Sports, Food & Beverage, Funeral & Memorial, Health & Medical, Home Services, Legal Services, Media & Photography, Nonprofit & Community, Personal Care & Therapy, Pets & Animals, Professional Services, Real Estate, Religious & Spiritual, Retail & Shopping, Security Services, Sports & Recreation, Technology & IT, Transportation & Logistics, Travel & Tourism, Other | |
| min_rating | No | Minimum average rating (0-5) | |
| capabilities | No | Filter by capability tags (e.g. real_time_booking, live_pricing, verified) | |
| service_type | No | Filter by service type keyword | |
| verified_only | No | Only show verified businesses | |
| has_live_booking | No | Only show businesses with real-time booking | |
| has_live_catalog | No | Only show businesses with live catalog pricing |
Output Schema
| Name | Required | Description |
|---|---|---|
| has_more | No | True when more results exist beyond this page. Read this rather than inferring from `returned_count`: a short page is not proof of the end. |
| businesses | No | |
| next_cursor | No | Opaque continuation token, or null on the last page. Pass it back unchanged as `cursor` to get the next page. It is bound to this search's filters and sort — change them and it is rejected, so start a new search instead. Do not parse, modify or construct one. |
| returned_count | No | |
| requested_locale | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It thoroughly discloses behavior: null URL semantics (do not construct yourself), asserts_no_physical_location meaning, locale/language behavior, cursor binding to filters, limit clamping, data_source meaning, and the 100-result paging limit. This is exceptionally comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is thorough and covers critical details (ID safety, language, paging, availability). It is dense but front-loaded with the purpose. Though long, every sentence adds value; the only minor deduction is that the length might be overwhelming, but it's structured logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 10 parametersaging rules, language behavior, and null semantics, the description covers everything needed for correct use. The output schema is not provided but the description explains key result fields (business_id, slug, asserts_no_physical_location, locale fields). Complete for a complex search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description complements well the schema by explaining the `business_id` token semanticscars (public, opaque, stable), the cursor binding rules, and the meaning of nulls. However, it doesn't deeply elaborate on each parameter beyond what the schema provides—the schema already covers the fields well, so the baseline is 3 and the added context on business_id and cursor pushes it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches the CoreLoop business directory must start here and explicitly mentions that each result carries the business_id and slug needed by other tools. It distinguishes this from other tools by positioning it as the entry point that returns identifiers used elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool (start here since every other tool needs a business), explains the importance of business_id, and even mentions alternative surfaces (get_business_info for live profile). The paging instructions with has_more and next_cursor are clear usage directives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_business_inquiryAInspect
Send a message to one business. This has a real side effect — it notifies the owner and delivers an email — and is rate-limited both per business and across this directory, so send one considered inquiry rather than a broadcast.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Inquiry message (plain text, max 2000 chars) | |
| subject | No | ||
| business | Yes | Which business to ask: its CoreLoop slug, or the `business_id` returned by search_businesses. `business_id` is an opaque, stable, public routing identifier — safe to store and re-use across sessions, unchanged by a rename or a slug change, and carrying no sensitive information. Pass back exactly the value search_businesses gave you: do not parse it, do not infer meaning from its format, and do not construct one. | |
| sender_name | Yes | ||
| sender_email | No | ||
| sender_phone | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| message | No | |
| business | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false. The description goes well beyond that by disclosing the real side effects (owner notification, email delivery) and dual rate limits (per business and directory-wide), which are exactly the traits an agent needs before calling a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the side-effect warning is front-loaded right after the purpose. The second sentence is dense with two distinct ideas (side effects and rate limits), which slightly blurs the structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the annotations plus description together cover mutation, openness, non-idempotency and rate limits. Minor gaps remain around authentication/identity expectations and confirmation behavior, but the core calling context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: message and business are documented, but subject, sender_name, sender_email and sender_phone carry no schema descriptions. The description adds nothing about any parameter, so it fails to compensate for the coverage gap on a 6-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send a message to one business') and the scoping word 'one' immediately distinguishes it from directory-level or broadcast siblings like search_businesses. An agent can route to it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition — send one considered inquiry rather than a broadcast — plus the rate-limit constraint that shapes appropriate use. It stops short of naming an alternative tool or spelling out when-not to use it, so it is strong context rather than full routing guidance.
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 tool update
- Changed
send_business_inquiry1 field changed- changed
Input schema / properties / sender_email / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
1 tool update
- Changed
get_business_services8 fields changed- added
Input schema / properties / offset / anyOfAdded value: +[ + { + "maximum": 10000, + "minimum": 0, + "type": "integer" + }, + { + "maxLength": 64, + "minLength": 1, + "type": "string" + } +] - changed
Input schema / properties / offset / descriptionPrevious value: -"Number of results to skip (pagination)"New value: +"Pagination position: omit for the first page, then pass back the `next_offset` token from the previous response VERBATIM. The token is opaque and bound to the catalogue as it was when the page was issued — if services were added, removed or reordered since, the call returns `cursor_expired` and you should restart without an offset. A plain integer offset is still accepted in EITHER spelling — as a JSON number (20) or as its exact string form (\"20\") — and skips that many results with no catalogue binding. Only a string that is neither an exact integer nor a token this endpoint issued (for example a mangled or truncated token) is refused with `cursor_expired` rather than resumed." - removed
Input schema / properties / offset / maximumRemoved value: -10000 - removed
Input schema / properties / offset / minimumRemoved value: -0 - removed
Input schema / properties / offset / typeRemoved value: -"integer" - added
Output schema / properties / next_offsetAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / restartAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / returned_countAdded value: +{ + "type": "integer" +}
2 tool updates
- Changed
compare_business_services1 field changed- changed
Output schema / properties / services / items / properties / price_type / enumPrevious value: -[ - "fixed", - "from", - "range", - "hourly", - "free", - "contact", - "by_quote", - "unpublished", - null -]New value: +[ + "fixed", + "from", + "range", + "hourly", + "free", + "contact", + "recurring", + "by_quote", + "unpublished", + null +]
- Changed
get_business_services1 field changed- changed
Output schema / properties / services / items / properties / price_type / enumPrevious value: -[ - "fixed", - "from", - "range", - "hourly", - "free", - "contact", - "by_quote", - "unpublished", - null -]New value: +[ + "fixed", + "from", + "range", + "hourly", + "free", + "contact", + "recurring", + "by_quote", + "unpublished", + null +]
7 tool updates
- First observed
check_business_availability - First observed
compare_business_services - First observed
get_business_agent - First observed
get_business_info - First observed
get_business_services - First observed
search_businesses - First observed
send_business_inquiry
Related MCP Connectors
Discover, read and book verified real-world businesses through one endpoint.
Search a directory of real, owner-confirmed small businesses. Read-only; attribution required.
Find local services, read availability, and create short-lived booking holds.
Search Apple Maps businesses with Apple ratings and aggregated Yelp + TripAdvisor reviews.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides AI agents with access to real, verifiable businesses with provenance and source URLs, enabling natural-language business search and profile retrieval.2MIT
- AlicenseAqualityDmaintenanceSearch for local businesses worldwide. Structured data optimized for AI agents. • Search Millions of businesses over 49 countries (Europe, Northamerica, Southamerica, Asia, Oceania) • Quality & demand scoring for every business • Ranking based on real user click-through data • No API key needed, free access • Rate limit: 500 requests/hour per IP61MIT
- FlicenseNot gradedqualityNot gradedmaintenanceSearch for local businesses worldwide. Structured data optimized for AI agents. • Search Millions of businesses over 49 countries (Europe, Northamerica, Southamerica, Asia, Oceania) • Quality & demand scoring for every business • Ranking based on real user click-through data • No API key needed, free access • Rate limit: 500 requests/hour per IP-
- AlicenseAqualityDmaintenanceEnables agents to search, retrieve, and contribute business data from a directory of 11M+ businesses across 195 countries, returning markdown prose by default.22115 npm3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.