{"openapi": "3.0.3", "info": {"title": "MCP answer-quality canary", "version": "1.0.0", "description": "Continuously checks that the MCP servers your agents depend on return correct answers, not just live ones: real MCP protocol canary calls (list + seeded-record search) are cross-checked against independent ground truth, exhausting pagination, and reported as agent-readable verdicts \u2014 PASS, or FAIL with defect classes TRUNCATION / NULL_RESULT / WRONG_VALUE / SEEDED_RECORD_MISSING / OVERSIZE / PAGINATION_LOOP / TIMEOUT / PROTOCOL_FAILURE. With no ground truth the verdict is UNKNOWN (fail-closed), never PASS."}, "servers": [{"url": "https://textforagents.com/products/mcp-answer-quality-canary"}], "components": {"securitySchemes": {"BearerAuth": {"type": "http", "scheme": "bearer"}}, "schemas": {"RegisterRequest": {"type": "object", "properties": {"account_name": {"type": "string"}, "payer_wallet": {"type": "string"}}, "required": ["account_name"]}, "TrialRequest": {"type": "object", "properties": {"account_id": {"type": "string"}, "claim_token": {"type": "string"}}, "required": ["account_id", "claim_token"]}, "WatchRequest": {"type": "object", "properties": {"name": {"type": "string"}, "mode": {"type": "string", "enum": ["good", "truncate", "paginate", "null", "wrong", "seeded_missing", "oversize", "loopy", "hang", "crash", "malformed"]}, "truth_entries": {"type": "array", "nullable": true, "items": {"type": "object", "properties": {"id": {"type": "integer"}, "title": {"type": "string"}, "channel": {"type": "string"}, "body": {"type": "string"}}, "required": ["id"]}}}, "required": ["name", "mode"]}, "Verdict": {"type": "object", "properties": {"status": {"type": "string", "enum": ["PASS", "FAIL", "UNKNOWN"]}, "defects": {"type": "array", "items": {"type": "string"}}, "evidence": {"type": "object"}, "wall_ms": {"type": "number"}, "server_mode": {"type": "string"}}}}}, "paths": {"/": {"get": {"summary": "Product descriptor (public)", "responses": {"200": {"description": "descriptor"}}}}, "/health": {"get": {"summary": "Health (public)", "responses": {"200": {"description": "ok"}}}}, "/openapi.json": {"get": {"summary": "This spec (public)", "responses": {"200": {"description": "spec"}}}}, "/llms.txt": {"get": {"summary": "llms.txt facts (public)", "responses": {"200": {"description": "text"}}}}, "/register": {"post": {"summary": "Create an account, get a claim token", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RegisterRequest"}}}}, "responses": {"200": {"description": "account_id + claim_token"}}}}, "/trial": {"post": {"summary": "Claim the one-time trial, get the API token (shown once)", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TrialRequest"}}}}, "responses": {"200": {"description": "token"}, "403": {"description": "trial already used"}}}}, "/account": {"get": {"summary": "Your account + token state", "security": [{"BearerAuth": []}], "responses": {"200": {"description": "account"}, "401": {"description": "unauthorized"}}}}, "/watches": {"get": {"summary": "List your watches", "security": [{"BearerAuth": []}], "responses": {"200": {"description": "watches"}, "401": {"description": "unauthorized"}}}, "post": {"summary": "Register a watch (fixture mode + optional ground-truth dataset)", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WatchRequest"}}}}, "responses": {"200": {"description": "watch_id"}, "400": {"description": "invalid"}, "401": {"description": "unauthorized"}, "403": {"description": "server cap"}}}}, "/watches/{watch_id}": {"get": {"summary": "One watch + last verdict", "security": [{"BearerAuth": []}], "parameters": [{"name": "watch_id", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "watch"}, "404": {"description": "not found"}}}, "delete": {"summary": "Delete a watch", "security": [{"BearerAuth": []}], "parameters": [{"name": "watch_id", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "deleted"}, "404": {"description": "not found"}}}}, "/watches/{watch_id}/check": {"post": {"summary": "Run the real canary check now; returns the verdict", "security": [{"BearerAuth": []}], "parameters": [{"name": "watch_id", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "verdict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Verdict"}}}}, "404": {"description": "not found"}}}}, "/mcp": {"post": {"summary": "MCP streamable-http endpoint (JSON-RPC: initialize, ping, tools/list, tools/call; also served at POST /)", "security": [{"BearerAuth": []}], "responses": {"200": {"description": "JSON-RPC response"}, "401": {"description": "unauthorized; body names the issuance path"}, "202": {"description": "notification accepted (notifications/initialized)"}}}}, "/tokens/revoke": {"post": {"summary": "Revoke your token", "security": [{"BearerAuth": []}], "responses": {"200": {"description": "revoked"}}}}}}