{"openapi":"3.1.0","info":{"title":"webmcp-tool.com — Agent Readiness Score","version":"1.0.0","summary":"Score a public website on how usable it is by AI agents.","description":"One GET returns a score out of 100 with the evidence behind every finding. The same engine backs the report pages, so a machine and a person never see different numbers. There is also an MCP server at /api/mcp offering score_site, explain_check, list_checks, get_badge_embed, watch_site.","license":{"name":"Free to call, rate limited per address","identifier":"NOASSERTION"},"contact":{"name":"webmcp-tool.com","url":"https://webmcp-tool.com/contact","email":"hi@webmcp-tool.com"}},"servers":[{"url":"https://webmcp-tool.com"}],"paths":{"/api/scan":{"get":{"operationId":"scoreSite","summary":"Score a public website for agent readiness","description":"Fetches the address with no JavaScript engine, plus robots.txt, the sitemap, llms.txt and a set of well-known discovery paths, then scores the evidence. Reports already cached do not spend the crawl budget.","parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) address, for example example.com","schema":{"type":"string"},"example":"example.com"}],"responses":{"200":{"description":"The score, its axes and pillars, and every check with its evidence.","content":{"application/json":{"schema":{"type":"object","required":["url","host","score","grade","axes","pillars"],"properties":{"url":{"type":"string"},"host":{"type":"string"},"fetchedAt":{"type":"string","format":"date-time"},"score":{"type":"integer","minimum":0,"maximum":100},"grade":{"type":"string","enum":["A","B","C","D","F"]},"axes":{"type":"array","description":"Fitness — does the site work for agents today — and Adoption — which protocols are in place.","items":{"type":"object","properties":{"id":{"type":"string","enum":["fitness","adoption"]},"name":{"type":"string"},"earned":{"type":"number"},"available":{"type":"number"}}}},"pillars":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"axis":{"type":"string"},"earned":{"type":"number"},"available":{"type":"number"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"verdict":{"type":"string","enum":["pass","partial","fail","na"]},"detail":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"earned":{"type":"number"},"available":{"type":"number"}}}}}}},"excluded":{"type":"array","description":"Checks that do not apply to this site, removed from the denominator rather than counted as failures.","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"reason":{"type":"string"}}}},"priorities":{"type":"array","description":"The highest-value fixes, heaviest first, each with what to do about it.","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"detail":{"type":"string"},"fix":{"type":"string"}}}},"advisory":{"type":["object","null"],"description":"What a System One model made of the same crawl, or null when no reading was taken. Beside the score and never inside it: a judgment is not repeatable the way a rule is, so nothing here moves `score`, and a caller comparing two scans should compare scores, not readings. `level` is the level the model chose, counted from zero, out of `levels`; `confidence` is how concentrated its distribution was, which is not a claim about correctness. Words for each level are on the report page, in the reader's language.","properties":{"ok":{"type":"boolean"},"detail":{"type":"string","description":"Why no reading was taken, when ok is false."},"model":{"type":"string"},"ms":{"type":"integer"},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["llms-routing","offer-clarity","content-substance","tool-names"]},"level":{"type":"integer"},"levels":{"type":"integer"},"score":{"type":"number","description":"Probability-weighted position across the levels."},"ratio":{"type":"number","description":"score over the top level, so findings on different scales compare."},"probability":{"type":"number"},"confidence":{"type":"number"},"unsure":{"type":"boolean","description":"The distribution was too spread to read as an answer."}}}}}}}}}}},"400":{"description":"The url parameter is missing or is not a public address.","content":{"application/problem+json":{}}},"429":{"description":"Rate limited. Each scan fetches somebody else's server, so new addresses are budgeted separately from cached reads.","content":{"application/problem+json":{}},"headers":{"retry-after":{"schema":{"type":"integer"},"description":"Seconds to wait."}}}}}}}}