Card snapshot
coreloop.so
·
2026-08-19 23:59:18 UTC
·
176eb01ef761782556706cc4bb9a5fa1213b50f24f7961cf45ae777b0e11b13b
This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.
{
"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 \u2014 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 \u2014 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 \u2014 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\"` \u2014 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"
}
}