Serveur MCP

CoreLoop Business Network

so.coreloop/directory

Ce que fait ce MCP

Searches a business directory and provides company profiles, services, hours, contact details, agent endpoints, and inquiry messaging.

check_business_availability
One business's opening hours, whether it is open right now, and when it next opens. Phase 1 returns published hours, not bookable slots.
Lecture seule
Schéma d’entrée
{'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}
Schéma de sortie
{'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']}}}
compare_business_services
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.
Lecture seule
Schéma d’entrée
{'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}
Schéma de sortie
{'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', None], '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'}}}}}}}
get_business_agent
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.
Lecture seule
Schéma d’entrée
{'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}
Schéma de sortie
{'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'}}}}
get_business_info
Full profile for one business found through search_businesses: identity, locations, contact, policies, images, public documents and the languages it publishes in.
Lecture seule
Schéma d’entrée
{'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}
Schéma de sortie
{'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'}}}
get_business_services
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.
Lecture seule
Schéma d’entrée
{'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}
Schéma de sortie
{'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', None], 'type': ['string', 'null']}, 'description': {'type': ['string', 'null']}, 'booking_mode': {'enum': ['none', 'inquiry', 'external', 'realtime', None], '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'}}}
search_businesses
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.
Lecture seule
Schéma d’entrée
{'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}
Schéma de sortie
{'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']}}}
send_business_inquiry
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.
Accès externe
Schéma d’entrée
{'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}
Schéma de sortie
{'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'}}}}}
Ajouté
send_business_inquiry
17 September 2026 12:55
Ajouté
get_business_services
17 September 2026 12:55
Ajouté
get_business_info
17 September 2026 12:55
Ajouté
get_business_agent
17 September 2026 12:55
Ajouté
compare_business_services
17 September 2026 12:55
Ajouté
check_business_availability
17 September 2026 12:55
Ajouté
search_businesses
17 September 2026 12:55