{"openapi":"3.1.0","info":{"title":"Vibing Agents public API","version":"1.0.0","summary":"Read-only catalog discovery for Vibing Agents (agents.dancingteeth.net). No API keys.","description":"Editorial catalog of vibe coding tools and AI coding agents. Use these endpoints to list tools, fetch llms.txt, or read the OpenAPI document itself. Chat is unofficial and has no SLA. There is no webhook or billed API product.","contact":{"name":"Vibing Agents","email":"privacy@dancingteeth.net","url":"https://agents.dancingteeth.net/developers"},"license":{"name":"Editorial content — see site","url":"https://agents.dancingteeth.net/about"}},"servers":[{"url":"https://agents.dancingteeth.net","description":"Vibing Agents production"}],"tags":[{"name":"Catalog","description":"Public tool directory"},{"name":"Discovery","description":"Agent indexes and handshakes"},{"name":"Chat","description":"Unofficial on-site assistant"}],"paths":{"/openapi.json":{"get":{"operationId":"getOpenApi","tags":["Discovery"],"summary":"OpenAPI 3.1 document","description":"This specification. Function-calling clients should import this URL.","responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["Discovery"],"summary":"Agent instruction file","description":"Markdown/plain-text index with when-to-use guidance and citation URLs.","responses":{"200":{"description":"llms.txt body","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/.well-known/mcp":{"get":{"operationId":"getMcpHandshake","tags":["Discovery"],"summary":"MCP well-known handshake","description":"Server card for MCP clients. POST JSON-RPC 2.0 to /mcp for the live Streamable HTTP MCP (protocol 2025-03-26); OpenAPI and llms.txt remain discovery resources.","responses":{"200":{"description":"MCP server card","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/mcp":{"post":{"operationId":"postMcp","tags":["Discovery"],"summary":"MCP Streamable HTTP endpoint","description":"Single POST endpoint for the public catalog MCP (protocol 2025-03-26). Accepts JSON-RPC 2.0: initialize, notifications/initialized, ping, tools/list (list_catalog_tools, get_catalog_tool), and tools/call. Stateless, no API keys.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"JSON-RPC response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"202":{"description":"Notification accepted — empty body"},"400":{"description":"Malformed JSON body or invalid JSON-RPC request"},"405":{"description":"GET is not supported on /mcp"}}}},"/api/catalog":{"get":{"operationId":"listCatalogTools","tags":["Catalog"],"summary":"List catalog tools","description":"Returns the public directory as JSON: slug, name, kind, catalog page URL, and vendor URL. No authentication.","responses":{"200":{"description":"Catalog list","content":{"application/json":{"schema":{"type":"object","required":["source","count","items"],"properties":{"source":{"type":"string","enum":["cms","fixture"]},"count":{"type":"integer"},"items":{"type":"array","items":{"type":"object","required":["slug","name","pageUrl","productUrl","productKind"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"type":{"type":["string","null"]},"productKind":{"type":"string"},"pageUrl":{"type":"string","format":"uri"},"productUrl":{"type":"string","format":"uri"}}}}}}}}}}}},"/api/catalog/{slug}":{"get":{"operationId":"getCatalogTool","tags":["Catalog"],"summary":"Get one catalog tool","description":"Public card fields for a single slug (pros, cons, free options, page URL).","parameters":[{"name":"slug","in":"path","required":true,"description":"Tool slug from the catalog URL path, e.g. cursor","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Tool detail","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["slug","name","pageUrl","productUrl","productKind"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"type":{"type":["string","null"]},"productKind":{"type":"string"},"pageUrl":{"type":"string","format":"uri"},"productUrl":{"type":"string","format":"uri"}}},{"type":"object","properties":{"pros":{"type":"string"},"cons":{"type":"string"},"freeOptions":{"type":"string"},"agentsMd":{"type":"string"},"skillMd":{"type":"string"}}}]}}}},"404":{"description":"Unknown slug","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","description":"Stable machine code, e.g. not_found"},"message":{"type":"string"},"hint":{"type":"string","description":"Where an agent should look next"},"details":{}}}}}}}}}}},"/api/chat":{"post":{"operationId":"postCatalogChat","tags":["Chat"],"summary":"Ask the on-site catalog assistant","description":"Unofficial streaming chat over the published catalog. No API key, no SLA, not for production automation. Prefer /api/catalog and /llms.txt.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","minLength":1},"history":{"type":"array","items":{"type":"object","required":["role","content"],"properties":{"role":{"type":"string","enum":["user","assistant","system"]},"content":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"Plain-text reply stream","content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Invalid body","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","description":"Stable machine code, e.g. not_found"},"message":{"type":"string"},"hint":{"type":"string","description":"Where an agent should look next"},"details":{}}}}}}}},"500":{"description":"Upstream failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","description":"Stable machine code, e.g. not_found"},"message":{"type":"string"},"hint":{"type":"string","description":"Where an agent should look next"},"details":{}}}}}}}}}}},"/api/compliance/cookie-geo":{"get":{"operationId":"getCookieGeo","tags":["Discovery"],"summary":"Cookie-banner geo hint","description":"Whether the cookie banner is required for the request country. No auth.","parameters":[{"name":"country","in":"query","required":false,"description":"ISO country override for local testing","schema":{"type":"string"}}],"responses":{"200":{"description":"Geo decision","content":{"application/json":{"schema":{"type":"object","required":["requiresBanner","countryCode","source"],"properties":{"requiresBanner":{"type":"boolean"},"countryCode":{"type":["string","null"]},"source":{"type":"string"}}}}}}}}}}}