{"server":{"name":"so.coreloop/directory","_meta":{"io.modelcontextprotocol.registry/publisher-provided":{"so.coreloop":{"tools":["search_businesses","check_business_availability","compare_business_services","get_business_agent","get_business_info","get_business_services","send_business_inquiry"],"networkA2aUrl":"https://coreloop.so/api/a2a/coreloop-directory","authentication":"none - public and unauthenticated, rate-limited per client","entryPointTool":"search_businesses","endpointAliasUrl":"https://coreloop.so/api/mcp/directory","humanDirectoryUrl":"https://coreloop.so/discover","platformLlmsTxtUrl":"https://coreloop.so/llms.txt","sideEffectingTools":["send_business_inquiry"],"networkAgentCardUrl":"https://coreloop.so/.well-known/agent-card.json","wellKnownServerCardUrl":"https://coreloop.so/.well-known/mcp.json","perBusinessA2aUrlTemplate":"https://coreloop.so/api/a2a/{slug}","perBusinessMcpUrlTemplate":"https://coreloop.so/api/mcp/{slug}","perBusinessLlmsTxtUrlTemplate":"https://coreloop.so/{slug}/llms.txt","perBusinessAgentCardUrlTemplate":"https://coreloop.so/{slug}/.well-known/agent-card.json"}}},"icons":[{"src":"https://coreloop.so/brand/coreloop-mark-512.png","sizes":["512x512"],"mimeType":"image/png"},{"src":"https://coreloop.so/brand/coreloop-mark.svg","sizes":["any"],"mimeType":"image/svg+xml"}],"title":"CoreLoop Business Network","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://coreloop.so/api/mcp/coreloop-directory","type":"streamable-http"}],"version":"1.2.1","websiteUrl":"https://coreloop.so","description":"Search real businesses, then read profiles, services and hours or contact them, in one endpoint."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-08-19T12:43:41.193961Z","publishedAt":"2026-08-19T12:43:41.193961Z","statusChangedAt":"2026-08-19T12:43:41.193961Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://coreloop.so/api/mcp/coreloop-directory","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2026-07-28","2025-06-18","2025-03-26"],"stateless":true},"health":{"reachable":true,"uptime_30d":1,"latency_ms_p50":1612,"consecutive_failures":0,"last_probe_at":"2026-10-20T00:46:28.747Z","last_ok_at":"2026-10-20T00:46:28.747Z"}}],"packages":[]},"dev.protogrid/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.","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.","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.","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.","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.","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.","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T00:46:28.747Z"}],"dev.protogrid/trust":{"score":80,"components":{"hygiene":80,"liveness":100,"freshness":85,"provenance":55},"drivers":["+dns-namespace","+website","+reachable","+uptime-100%","~updated-62d-ago","-no-repository"],"flags":["no-repository"],"blocked":false,"computed_at":"2026-10-20T05:13:21.130Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":94,"label":"strong","components":{"auth":null,"hygiene":86,"protocol":100,"stability":100,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"supports 2026-07-28 (server/discover)","status":"pass","category":"protocol"},{"id":"protocol.stateless","detail":"answers without a session","status":"pass","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"tool list is cacheable (ttlMs 300000)","status":"pass","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"1 tools have descriptions over 1,024 characters, which crowds the context","status":"warn","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"7 of 7 tools declare readOnlyHint or destructiveHint","status":"pass","category":"hygiene"},{"id":"tools.directory_hints","detail":"1 of 7 tools declare all four hints; missing: search_businesses (destructiveHint, idempotentHint); check_business_availability (destructiveHint, idempotentHint); compare_business_services (destructiveHint, idempotentHint); …","status":"warn","category":"hygiene"},{"id":"tools.token_cost","detail":"about 3,230 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"no tool changes in 30 days","status":"pass","category":"stability"},{"id":"stability.rug_pull","detail":"no tool changed its meaning under the same name","status":"pass","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["~tools.description_length","~tools.directory_hints"],"flags":[],"tool_count":7,"token_estimate":3230,"tools_hash":"62cf52c9564af47ba3bfa49deda04fe8","tools_changed_at":null,"computed_at":"2026-10-20T05:13:30.517Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"so.coreloop/directory","aliases":[],"alias_count":0,"repository_key":null,"owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/so.coreloop%2Fdirectory/tools","arguments":{"name":"so.coreloop/directory"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/so.coreloop%2Fdirectory/connection?target=mcpServers","arguments":{"name":"so.coreloop/directory","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}