{"server":"so.coreloop/directory","count":7,"tools":[{"name":"check_business_availability","title":null,"description":"One business's opening hours, whether it is open right now, and when it next opens. Phase 1 returns published hours, not bookable slots.","input_schema":{"type":"object","required":["business"],"properties":{"business":{"type":"string","maxLength":200,"minLength":1,"description":"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":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Which location's hours to return (id from get_info locations[]). Defaults to the primary location."}},"additionalProperties":false},"output_schema":{"type":"object","properties":{"locale":{"type":"string"},"business":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"business_id":{"type":"string","format":"uuid"}}},"timezone":{"type":"string"},"always_open":{"type":"boolean"},"data_source":{"type":"string"},"is_open_now":{"type":"boolean"},"location_id":{"type":["string","null"]},"last_updated":{"type":"string","format":"date-time"},"next_open_at":{"type":["string","null"],"format":"date-time"},"location_label":{"type":["string","null"]},"operating_hours":{"type":["object","null"]}}},"annotations":{"readOnlyHint":true,"openWorldHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"},{"name":"compare_business_services","title":null,"description":"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.","input_schema":{"type":"object","required":["business","service_type"],"properties":{"business":{"type":"string","maxLength":200,"minLength":1,"description":"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":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":10,"description":"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":{"type":"string","maxLength":100,"minLength":1,"description":"Service category or keyword to compare. Matches category exactly first, then service name/description contains."}},"additionalProperties":false},"output_schema":{"type":"object","properties":{"locale":{"type":"string"},"business":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"business_id":{"type":"string","format":"uuid"}}},"services":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":["number","null"]},"category":{"type":["string","null"]},"currency":{"type":["string","null"]},"price_max":{"type":["number","null"]},"match_type":{"enum":["exact_category","name_keyword","description_keyword"],"type":"string"},"price_type":{"enum":["fixed","from","range","hourly","free","contact","recurring","by_quote","unpublished",null],"type":["string","null"]},"description":{"type":["string","null"]},"price_display":{"type":["string","null"]},"duration_display":{"type":["string","null"]},"duration_minutes":{"type":["integer","null"]},"price_per_minute":{"type":["number","null"]}}},"maxItems":20},"verified":{"type":"boolean"},"suggestion":{"type":"object"},"data_source":{"type":"string"},"last_updated":{"type":"string","format":"date-time"},"service_type":{"type":"string"},"business_name":{"type":"string"},"comparison_summary":{"type":"object","properties":{"count":{"type":"integer"},"price_range":{"type":["object","null"],"properties":{"max":{"type":"number"},"min":{"type":"number"},"currency":{"type":["string","null"]}}},"duration_range":{"type":["object","null"],"properties":{"max":{"type":"integer"},"min":{"type":"integer"}}}}}}},"annotations":{"readOnlyHint":true,"openWorldHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"},{"name":"get_business_agent","title":null,"description":"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.","input_schema":{"type":"object","required":["business"],"properties":{"business":{"type":"string","maxLength":200,"minLength":1,"description":"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."}},"additionalProperties":false},"output_schema":{"type":"object","properties":{"business":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"business_id":{"type":"string","format":"uuid"}}},"verified":{"type":"boolean"},"protocols":{"type":"array","items":{"type":"string"}},"data_source":{"enum":["profile"],"type":"string"},"resolved_at":{"type":"string","format":"date-time"},"protocol_urls":{"type":"object","properties":{"a2a_url":{"type":["string","null"],"format":"uri"},"mcp_url":{"type":["string","null"],"format":"uri"},"page_url":{"type":["string","null"],"format":"uri"},"llms_txt_url":{"type":["string","null"],"format":"uri"},"agent_card_url":{"type":["string","null"],"format":"uri"}}},"content_locale":{"type":"string"},"tools_available":{"type":"array","items":{"type":"string"}},"available_locales":{"type":"array","items":{"type":"string"}}}},"annotations":{"readOnlyHint":true,"openWorldHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"},{"name":"get_business_info","title":null,"description":"Full profile for one business found through search_businesses: identity, locations, contact, policies, images, public documents and the languages it publishes in.","input_schema":{"type":"object","required":["business"],"properties":{"business":{"type":"string","maxLength":200,"minLength":1,"description":"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":{"type":"array","items":{"enum":["identity","location","contact","policies","all"],"type":"string"},"maxItems":5,"description":"Which sections to include. Defaults to all."}},"additionalProperties":false},"output_schema":{"type":"object","properties":{"name":{"type":"string"},"images":{"type":"object","properties":{"logo":{"type":["string","null"],"format":"uri"},"cover":{"type":["string","null"],"format":"uri"},"photos":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"alt_text":{"type":["string","null"]}}},"maxItems":12}}},"intake":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"}}},"maxItems":20},"instructions":{"type":["string","null"]}}},"locale":{"type":"string"},"contact":{"type":"object"},"tagline":{"type":["string","null"]},"business":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"business_id":{"type":"string","format":"uuid"}}},"category":{"type":"string"},"keywords":{"type":"array","items":{"type":"string"},"maxItems":20},"location":{"type":"object"},"policies":{"type":"object","properties":{"general":{"type":["string","null"]},"accessibility":{"type":["string","null"]},"payment_methods":{"type":"array","items":{"type":"string"}}}},"verified":{"type":"boolean"},"documents":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string"},"preview":{"type":["string","null"]},"mime_type":{"type":"string"},"last_updated":{"type":"string","format":"date-time"},"translation_status":{"enum":["original"],"type":"string"}}}},"locations":{"type":"array"},"data_source":{"enum":["profile","integration","cached"],"type":"string"},"description":{"type":"string"},"last_updated":{"type":"string","format":"date-time"},"subcategories":{"type":"array","items":{"type":"string"},"maxItems":10},"call_to_action":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"label":{"type":"string"},"translation_status":{"enum":["original"],"type":"string"}}},"tools_available":{"type":"array","items":{"type":"string"}},"available_locales":{"type":"array","items":{"type":"string"}},"protocols_available":{"type":"array","items":{"type":"string"}},"asserts_no_physical_location":{"type":"boolean"}}},"annotations":{"readOnlyHint":true,"openWorldHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"},{"name":"get_business_services","title":null,"description":"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.","input_schema":{"type":"object","required":["business"],"properties":{"limit":{"type":"integer","default":20,"maximum":50,"minimum":1},"offset":{"anyOf":[{"type":"integer","maximum":10000,"minimum":0},{"type":"string","maxLength":64,"minLength":1}],"description":"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":{"type":"string","maxLength":50,"description":"Field to sort by. Recognised values: price, duration, name, category (unrecognised values are ignored — results stay unsorted)."},"business":{"type":"string","maxLength":200,"minLength":1,"description":"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":{"type":"string","maxLength":100,"description":"Filter by service category"},"max_price":{"type":"number","minimum":0,"description":"Only services priced at or below this amount"},"min_price":{"type":"number","minimum":0,"description":"Only services priced at or above this amount"},"price_type":{"type":"string","maxLength":50,"description":"Filter by price type (e.g. fixed, from, range, hourly, free, contact, or unpublished for services with no price set)"},"sort_order":{"enum":["asc","desc"],"type":"string","description":"Sort direction (defaults to asc)"},"max_duration":{"type":"integer","maximum":9007199254740991,"minimum":0,"description":"Only services lasting at most this many minutes"},"min_duration":{"type":"integer","maximum":9007199254740991,"minimum":0,"description":"Only services lasting at least this many minutes"}},"additionalProperties":false},"output_schema":{"type":"object","properties":{"limit":{"type":"integer"},"total":{"type":"integer"},"locale":{"type":"string"},"offset":{"type":"integer"},"restart":{"type":"boolean"},"business":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"business_id":{"type":"string","format":"uuid"}}},"has_more":{"type":"boolean"},"services":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":["number","null"]},"category":{"type":["string","null"]},"currency":{"type":["string","null"]},"price_max":{"type":["number","null"]},"price_type":{"enum":["fixed","from","range","hourly","free","contact","recurring","by_quote","unpublished",null],"type":["string","null"]},"description":{"type":["string","null"]},"booking_mode":{"enum":["none","inquiry","external","realtime",null],"type":["string","null"]},"price_display":{"type":["string","null"]},"duration_display":{"type":["string","null"]},"duration_minutes":{"type":["integer","null"]},"price_per_minute":{"type":["number","null"]},"requires_booking":{"type":"boolean"}}}},"data_source":{"type":"string"},"next_offset":{"type":["string","null"]},"last_updated":{"type":"string","format":"date-time"},"returned_count":{"type":"integer"}}},"annotations":{"readOnlyHint":true,"openWorldHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"},{"name":"search_businesses","title":null,"description":"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.","input_schema":{"type":"object","properties":{"city":{"type":"string","maxLength":120,"description":"Filter by city (case-insensitive exact match)"},"limit":{"type":"integer","default":10,"maximum":9007199254740991,"minimum":-9007199254740991,"description":"Maximum results per page (1-20). Out-of-range values are clamped, not rejected."},"query":{"type":"string","maxLength":200,"description":"Search query (business name or keyword)"},"cursor":{"type":"string","maxLength":512,"description":"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":{"enum":["relevance","rating","name"],"type":"string","description":"Sort results. Default: relevance"},"category":{"type":"string","maxLength":120,"description":"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":{"type":"number","description":"Minimum average rating (0-5)"},"capabilities":{"type":"array","items":{"type":"string","maxLength":64},"maxItems":20,"description":"Filter by capability tags (e.g. real_time_booking, live_pricing, verified)"},"service_type":{"type":"string","maxLength":120,"description":"Filter by service type keyword"},"verified_only":{"type":"boolean","description":"Only show verified businesses"},"has_live_booking":{"type":"boolean","description":"Only show businesses with real-time booking"},"has_live_catalog":{"type":"boolean","description":"Only show businesses with live catalog pricing"}},"additionalProperties":false},"output_schema":{"type":"object","properties":{"has_more":{"type":"boolean","description":"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":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"protocols":{"type":"array","items":{"type":"string"}},"business_id":{"type":"string","format":"uuid","description":"Opaque, stable, public routing identifier for this business. Pass it back unchanged as the `business` argument of any other tool on this endpoint. It is safe to store and re-use across sessions and it survives a rename or a slug change; it carries no sensitive information. Treat it as an opaque token: do not parse it, do not infer meaning from its format, and do not construct one."},"data_source":{"enum":["directory"],"type":"string"},"last_updated":{"type":["string","null"],"format":"date-time"},"protocol_urls":{"type":"object","properties":{"a2a_url":{"type":["string","null"],"format":"uri"},"mcp_url":{"type":["string","null"],"format":"uri"},"page_url":{"type":["string","null"],"format":"uri"},"llms_txt_url":{"type":["string","null"],"format":"uri"},"agent_card_url":{"type":["string","null"],"format":"uri"}}}}},"maxItems":20},"next_cursor":{"type":["string","null"],"description":"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":{"type":"integer"},"requested_locale":{"type":["string","null"]}}},"annotations":{"readOnlyHint":true,"openWorldHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"},{"name":"send_business_inquiry","title":null,"description":"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.","input_schema":{"type":"object","required":["business","message","sender_name"],"properties":{"message":{"type":"string","maxLength":2000,"minLength":1,"description":"Inquiry message (plain text, max 2000 chars)"},"subject":{"type":"string","maxLength":200},"business":{"type":"string","maxLength":200,"minLength":1,"description":"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":{"type":"string","maxLength":200,"minLength":1},"sender_email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","maxLength":254},"sender_phone":{"type":"string","maxLength":20}},"additionalProperties":false},"output_schema":{"type":"object","properties":{"status":{"enum":["sent","rate_limited","unavailable","error"],"type":"string"},"message":{"type":"string"},"business":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"business_id":{"type":"string","format":"uuid"}}}}},"annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"}],"next_cursor":null,"next_actions":[{"action":"get_connection","description":"Connection block to call these tools","href":"/v1/servers/so.coreloop%2Fdirectory/connection?target=mcpServers","arguments":{"name":"so.coreloop/directory","target":"mcpServers"}},{"action":"get_server","description":"Full descriptor with trust and connectability","href":"/v1/servers/so.coreloop%2Fdirectory","arguments":{"name":"so.coreloop/directory"}}]}