CoreLoop Business Network
Search real businesses, then read profiles, services and hours or contact them, in one endpoint.
使うべきか
品質と安全性
検出事項(1)
- LOWget_business_agent 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"directory": {
"url": "https://coreloop.so/api/mcp/coreloop-directory"
}
}
}リモートエンドポイント
https://coreloop.so/api/mcp/coreloop-directorystreamable-httpできること
ツール一覧
ツール(7)
🟢search_businesses(query, category, city, service_type, has_live_booking, ...)
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.
入力スキーマ
{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 200,
"description": "Search query (business name or keyword)"
},
"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"
},
"city": {
"type": "string",
"maxLength": 120,
"description": "Filter by city (case-insensitive exact match)"
},
"service_type": {
"type": "string",
"maxLength": 120,
"description": "Filter by service type keyword"
},
"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"
},
"verified_only": {
"type": "boolean",
"description": "Only show verified businesses"
},
"capabilities": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"description": "Filter by capability tags (e.g. real_time_booking, live_pricing, verified)"
},
"min_rating": {
"type": "number",
"description": "Minimum average rating (0-5)"
},
"sort_by": {
"type": "string",
"enum": [
"relevance",
"rating",
"name"
],
"description": "Sort results. Default: relevance"
},
"limit": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Maximum results per page (1-20). Out-of-range values are clamped, not rejected.",
"default": 10
},
"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."
}
},
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"businesses": {
"type": "array",
"maxItems": 20,
"items": {
"type": "object",
"properties": {
"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."
},
"slug": {
"type": "string"
},
"name": {
"type": "string"
},
"protocols": {
"type": "array",
"items": {
"type": "string"
}
},
"protocol_urls": {
"type": "object",
"properties": {
"mcp_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"a2a_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"agent_card_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"llms_txt_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"page_url": {
"type": [
"string",
"null"
],
"format": "uri"
}
}
},
"data_source": {
"type": "string",
"enum": [
"directory"
]
},
"last_updated": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
},
"returned_count": {
"type": "integer"
},
"requested_locale": {
"type": [
"string",
"null"
]
},
"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."
},
"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."
}
}
}🟢check_business_availability(business, location_id)
One business's opening hours, whether it is open right now, and when it next opens. Phase 1 returns published hours, not bookable slots.
入力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"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."
}
},
"required": [
"business"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "object",
"properties": {
"business_id": {
"type": "string",
"format": "uuid"
},
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"location_id": {
"type": [
"string",
"null"
]
},
"location_label": {
"type": [
"string",
"null"
]
},
"operating_hours": {
"type": [
"object",
"null"
]
},
"is_open_now": {
"type": "boolean"
},
"always_open": {
"type": "boolean"
},
"next_open_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"timezone": {
"type": "string"
},
"data_source": {
"type": "string"
},
"last_updated": {
"type": "string",
"format": "date-time"
},
"locale": {
"type": "string"
}
}
}🟢compare_business_services(business, service_type, compare_by)
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.
入力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"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."
},
"service_type": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Service category or keyword to compare. Matches category exactly first, then service name/description contains."
},
"compare_by": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 50
},
"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."
}
},
"required": [
"business",
"service_type"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "object",
"properties": {
"business_id": {
"type": "string",
"format": "uuid"
},
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"business_name": {
"type": "string"
},
"service_type": {
"type": "string"
},
"services": {
"type": "array",
"maxItems": 20,
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"category": {
"type": [
"string",
"null"
]
},
"match_type": {
"type": "string",
"enum": [
"exact_category",
"name_keyword",
"description_keyword"
]
},
"price": {
"type": [
"number",
"null"
]
},
"price_type": {
"type": [
"string",
"null"
],
"enum": [
"fixed",
"from",
"range",
"hourly",
"free",
"contact",
"recurring",
"by_quote",
"unpublished",
null
]
},
"price_max": {
"type": [
"number",
"null"
]
},
"price_display": {
"type": [
"string",
"null"
]
},
"currency": {
"type": [
"string",
"null"
]
},
"duration_minutes": {
"type": [
"integer",
"null"
]
},
"duration_display": {
"type": [
"string",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"price_per_minute": {
"type": [
"number",
"null"
]
}
}
}
},
"comparison_summary": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"price_range": {
"type": [
"object",
"null"
],
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"currency": {
"type": [
"string",
"null"
]
}
}
},
"duration_range": {
"type": [
"object",
"null"
],
"properties": {
"min": {
"type": "integer"
},
"max": {
"type": "integer"
}
}
}
}
},
"suggestion": {
"type": "object"
},
"last_updated": {
"type": "string",
"format": "date-time"
},
"data_source": {
"type": "string"
},
"locale": {
"type": "string"
},
"verified": {
"type": "boolean"
}
}
}🟢get_business_agent(business)
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.
入力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"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."
}
},
"required": [
"business"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "object",
"properties": {
"business_id": {
"type": "string",
"format": "uuid"
},
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"protocols": {
"type": "array",
"items": {
"type": "string"
}
},
"protocol_urls": {
"type": "object",
"properties": {
"mcp_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"a2a_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"agent_card_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"llms_txt_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"page_url": {
"type": [
"string",
"null"
],
"format": "uri"
}
}
},
"verified": {
"type": "boolean"
},
"content_locale": {
"type": "string"
},
"available_locales": {
"type": "array",
"items": {
"type": "string"
}
},
"tools_available": {
"type": "array",
"items": {
"type": "string"
}
},
"data_source": {
"type": "string",
"enum": [
"profile"
]
},
"resolved_at": {
"type": "string",
"format": "date-time"
}
}
}🟢get_business_info(business, sections)
Full profile for one business found through search_businesses: identity, locations, contact, policies, images, public documents and the languages it publishes in.
入力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"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": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"identity",
"location",
"contact",
"policies",
"all"
]
},
"description": "Which sections to include. Defaults to all."
}
},
"required": [
"business"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "object",
"properties": {
"business_id": {
"type": "string",
"format": "uuid"
},
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"name": {
"type": "string"
},
"tagline": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string"
},
"category": {
"type": "string"
},
"location": {
"type": "object"
},
"locations": {
"type": "array"
},
"asserts_no_physical_location": {
"type": "boolean"
},
"contact": {
"type": "object"
},
"policies": {
"type": "object",
"properties": {
"general": {
"type": [
"string",
"null"
]
},
"payment_methods": {
"type": "array",
"items": {
"type": "string"
}
},
"accessibility": {
"type": [
"string",
"null"
]
}
}
},
"images": {
"type": "object",
"properties": {
"logo": {
"type": [
"string",
"null"
],
"format": "uri"
},
"cover": {
"type": [
"string",
"null"
],
"format": "uri"
},
"photos": {
"type": "array",
"maxItems": 12,
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri"
},
"alt_text": {
"type": [
"string",
"null"
]
}
}
}
}
}
},
"intake": {
"type": "object",
"properties": {
"instructions": {
"type": [
"string",
"null"
]
},
"fields": {
"type": "array",
"maxItems": 20,
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
},
"type": {
"type": "string"
},
"required": {
"type": "boolean"
}
}
}
}
}
},
"call_to_action": {
"type": "object",
"properties": {
"label": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"translation_status": {
"type": "string",
"enum": [
"original"
]
}
}
},
"subcategories": {
"type": "array",
"maxItems": 10,
"items": {
"type": "string"
}
},
"keywords": {
"type": "array",
"maxItems": 20,
"items": {
"type": "string"
}
},
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"preview": {
"type": [
"string",
"null"
]
},
"url": {
"type": "string",
"format": "uri"
},
"last_updated": {
"type": "string",
"format": "date-time"
},
"translation_status": {
"type": "string",
"enum": [
"original"
]
}
}
}
},
"protocols_available": {
"type": "array",
"items": {
"type": "string"
}
},
"tools_available": {
"type": "array",
"items": {
"type": "string"
}
},
"available_locales": {
"type": "array",
"items": {
"type": "string"
}
},
"verified": {
"type": "boolean"
},
"last_updated": {
"type": "string",
"format": "date-time"
},
"data_source": {
"type": "string",
"enum": [
"profile",
"integration",
"cached"
]
},
"locale": {
"type": "string"
}
}
}🟢get_business_services(business, category, min_price, max_price, min_duration, ...)
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.
入力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"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"
},
"min_price": {
"type": "number",
"minimum": 0,
"description": "Only services priced at or above this amount"
},
"max_price": {
"type": "number",
"minimum": 0,
"description": "Only services priced at or below this amount"
},
"min_duration": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Only services lasting at least this many minutes"
},
"max_duration": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Only services lasting at most this many minutes"
},
"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_by": {
"type": "string",
"maxLength": 50,
"description": "Field to sort by. Recognised values: price, duration, name, category (unrecognised values are ignored — results stay unsorted)."
},
"sort_order": {
"type": "string",
"enum": [
"asc",
"desc"
],
"description": "Sort direction (defaults to asc)"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20
},
"offset": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 10000
},
{
"type": "string",
"minLength": 1,
"maxLength": 64
}
],
"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."
}
},
"required": [
"business"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "object",
"properties": {
"business_id": {
"type": "string",
"format": "uuid"
},
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"services": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"price": {
"type": [
"number",
"null"
]
},
"price_type": {
"type": [
"string",
"null"
],
"enum": [
"fixed",
"from",
"range",
"hourly",
"free",
"contact",
"recurring",
"by_quote",
"unpublished",
null
]
},
"price_max": {
"type": [
"number",
"null"
]
},
"currency": {
"type": [
"string",
"null"
]
},
"duration_minutes": {
"type": [
"integer",
"null"
]
},
"category": {
"type": [
"string",
"null"
]
},
"price_display": {
"type": [
"string",
"null"
]
},
"duration_display": {
"type": [
"string",
"null"
]
},
"price_per_minute": {
"type": [
"number",
"null"
]
},
"requires_booking": {
"type": "boolean"
},
"booking_mode": {
"type": [
"string",
"null"
],
"enum": [
"none",
"inquiry",
"external",
"realtime",
null
]
}
}
}
},
"total": {
"type": "integer"
},
"offset": {
"type": "integer"
},
"limit": {
"type": "integer"
},
"returned_count": {
"type": "integer"
},
"has_more": {
"type": "boolean"
},
"next_offset": {
"type": [
"string",
"null"
]
},
"restart": {
"type": "boolean"
},
"data_source": {
"type": "string"
},
"last_updated": {
"type": "string",
"format": "date-time"
},
"locale": {
"type": "string"
}
}
}🟡send_business_inquiry(business, message, sender_name, sender_email, sender_phone, ...)
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.
入力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"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."
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "Inquiry message (plain text, max 2000 chars)"
},
"sender_name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"sender_email": {
"type": "string",
"maxLength": 254,
"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,}$"
},
"sender_phone": {
"type": "string",
"maxLength": 20
},
"subject": {
"type": "string",
"maxLength": 200
}
},
"required": [
"business",
"message",
"sender_name"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"business": {
"type": "object",
"properties": {
"business_id": {
"type": "string",
"format": "uuid"
},
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"status": {
"type": "string",
"enum": [
"sent",
"rate_limited",
"unavailable",
"error"
]
},
"message": {
"type": "string"
}
}
}推奨プロンプト
search_businessessearch_businessesget_business_agentget_business_agentsearch_businessesget_business_agentコミュニティ
エビデンス