{"name":"CoreLoop Business Network","description":"The CoreLoop business network: one A2A endpoint for every published business on CoreLoop. Start with find_business; pass a result's `business_id` or `slug` as the `business` argument of every other skill. Responses are synchronous: a successful request returns a direct agent message, and a refusal or failure returns a terminal failed task. Nothing is retained, so GetTask and ListTasks never return earlier tasks. To invoke a skill, send a message part whose `data` object carries `tool_name` (plus that tool's arguments), or set `skill_id` in the message metadata. Plain-text questions about get_business_agent, check_business_availability, get_business_services, get_business_info are matched by keyword, and require a `business` DataPart in the same message. Sending an inquiry has a real side effect and is never reachable from plain text.","supportedInterfaces":[{"url":"https://coreloop.so/api/a2a/coreloop-directory","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"provider":{"organization":"CoreLoop","url":"https://coreloop.so"},"version":"1.1.1","capabilities":{"streaming":true,"pushNotifications":false},"defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json"],"skills":[{"id":"find_business","name":"Find a business","description":"Search the CoreLoop business directory by category, city, keyword, rating or capability. Start here: every other skill on this endpoint needs a business, and each result carries the `business_id` and `slug` you pass as the `business` argument. `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, carrying no sensitive information. Pass back exactly the value you were given — do not parse it, infer meaning from its format, or construct one. A null `mcp_url`, `a2a_url` or `page_url` means that surface is switched off for the business right now — do not construct the URL yourself. Maximum 20 results per call: read `has_more` 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, so change them and it is rejected. Structured invocation only: filters cannot be inferred from prose without guessing what you meant.","tags":["directory","search","discovery"],"examples":["{\"messageId\":\"example-message-id-replace-per-message\",\"role\":\"ROLE_USER\",\"parts\":[{\"data\":{\"tool_name\":\"search_businesses\",\"category\":\"professional_services\",\"city\":\"Rotterdam\",\"limit\":5}}]}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"compare_business_services","name":"Compare one business's services","description":"Compare ONE business's own services within a service category or keyword, with a price and duration summary. This does NOT compare two businesses: it takes a single `business` and ranks what that business offers. To weigh several businesses against each other, call find_business and then this skill once per candidate. Each row reports `match_type`, so an exact category hit is distinguishable from an incidental keyword match. Structured invocation only: `service_type` is required and must be stated, never guessed from prose.","tags":["services","comparison","pricing"],"examples":["{\"messageId\":\"example-message-id-replace-per-message\",\"role\":\"ROLE_USER\",\"parts\":[{\"data\":{\"tool_name\":\"compare_business_services\",\"business\":\"example-logistics\",\"service_type\":\"freight forwarding\"}}]}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"route_business_task","name":"Ask a business","description":"Route a task to one business found through find_business: its full profile, its service catalogue, its opening hours, its own endpoint URLs, or an inquiry delivered to its owner. Send a DataPart whose `data` carries `business` (a `business_id` or slug) plus `tool_name` and that tool's arguments. A plain-text question is also accepted WHEN the same message carries a `business` DataPart: the words choose the read, and never supply arguments. Sending an inquiry is a WRITE with a real side effect and is therefore reachable only through an explicit `tool_name: \"send_business_inquiry\"` — never from a plain-text message.","tags":["business","profile","services","hours","inquiry"],"examples":["{\"messageId\":\"example-message-id-replace-per-message\",\"role\":\"ROLE_USER\",\"parts\":[{\"text\":\"What are your opening hours?\"},{\"data\":{\"business\":\"example-logistics\"}}]}","{\"messageId\":\"example-message-id-replace-per-message\",\"role\":\"ROLE_USER\",\"parts\":[{\"text\":\"What services do you offer and what do they cost?\"},{\"data\":{\"business\":\"example-logistics\"}}]}","{\"messageId\":\"example-message-id-replace-per-message\",\"role\":\"ROLE_USER\",\"parts\":[{\"data\":{\"tool_name\":\"get_business_info\",\"business\":\"example-logistics\"}}]}"],"inputModes":["application/json","text/plain"],"outputModes":["application/json"]}],"documentationUrl":"https://coreloop.so/docs","iconUrl":"https://coreloop.so/brand/coreloop-mark-512.png","metadata":{"coreloop.taskRetention":"none","coreloop.syncResponseKind":"message"}}