How the Agent Readiness Score is computed.
Exactly what the Glintbase scanner checks, how points become a score, and what the score does not claim. Every number on this page comes from the open-source scanner engine and its methodology document.
Last updated 2026-10-25 · score_version ars-3.3.1 · Markdown version
01 / Scope
What ARS measures, and what it does not
ARS 3.3 measures which agent-readiness signals a product publicly exposes, and whether they work when probed: machine-readable docs, specs, MCP servers, auth metadata, and content that agents can read without a browser.
ARS is not validated as a predictor of agent task success. No study correlates ARS with measured agent outcomes yet. Read a score as “readiness signals present and verified”, not “agents will succeed”. That includes the layer weights and the gate cap below.
02 / Core Rule
Points only for observed evidence
Every check ends in one of five states. The registry fixes each check's points and whether it is a base or bonus check; the probes only decide the state.
| Status | Meaning | Effect on score |
|---|---|---|
pass | The scanner observed the evidence | Earns the check's full registry points |
warn / fail | Checked, and the evidence was missing or wrong | Earns 0. Base checks still count in the layer's denominator; bonus checks have no effect |
na | The surface the check inspects does not exist (e.g. no MCP server, no OpenAPI) | Excluded |
skip | The surface exists but this scan could not verify the check | Excluded |
- No check may pass because a related file merely exists, or by assumption.
- No partial credit:
warnearns 0. - Absent surfaces are penalised once, by their existence check (
mcp-server-manifest,openapi-spec, ...). Quality checks for an absent surface arena, so a missing MCP server is not counted again for every MCP quality check. - Exception:
llms.txtis optional. Its absence costs nothing; when present it must be a real index and its links must resolve.
03 / Scoring
From checks to a 0–100 score
1. Archetype. The site is classified into one of four archetypes, which sets each layer's weight. In a URL scan the classifier sees only the URL: docs., /docs, /documentation or /kb point to docs; /api or api. to API / devtool; /shop, /store, /cart, /checkout or /pricing to e-commerce; /blog, /news or /article to content / media. Anything else defaults to API / devtool. A scan can also be run with an explicit archetype; such scans are stored as history only and never replace a company's latest score.
| Archetype | Discovery | Access | Usability | Payments | Denominator |
|---|---|---|---|---|---|
| API / devtool | 20 | 30 | 35 | 0 | 85 |
| Docs / knowledge base | 20 | 30 | 35 | 0 | 85 |
| E-commerce | 20 | 30 | 40 | 10 | 100 |
| Content / media | 20 | 30 | 0 | 0 | 50 |
2. Layer base score. For each layer, only base checks with a verdict (pass, warn or fail) are “verifiable”:
3. Bonus. Bonus = registry points of passed bonus checks. Payments checks are excluded from the bonus: the Payments layer uses its own OR-scoring. In a URL scan it is scored only for the e-commerce archetype (weight 10), where any one verified payment protocol (ACP, UCP, AP2 or x402) earns the full 10 points; otherwise the layer earns 0.
4. Weighted score. Bonus points are added to both the numerator and the denominator, so a bonus can raise a score but a missing bonus never lowers one:
5. Gates. If a gate check fails, the final score is min(weighted score, 47), the top of grade D. The scorecard reports gates[] and uncappedScore.
| Gate check | Fails when |
|---|---|
anti-crawler-challenge-free | The homepage serves a bot challenge (challenge markers or cf-mitigated: challenge) or HTTP 403 to the scanner's request |
content-no-js | The homepage has under 300 characters of prose without JavaScript and relies on scripts to render (an app root, a noscript notice, or far more script than text) |
These are the two failures that stopped retrieval outright in AgentReady.org's controlled experiment (19 configurations of one docs site; only an answer that needs JavaScript and a 403 to agent user-agents stopped retrieval). Weighted points can't offset a site an agent can't read. The cap value is a policy choice.
Illustrative example (API / devtool, denominator 85, no gate failed)
Discovery: 4 of 6 verifiable base pts passed → round(4/6 × 20) = 13
Access: 40 of 50 → round(0.8 × 30) = 24
Usability: 10 of 30 → round(10/30 × 35) = 12
Bonus: 6 pts from passed bonus checks
score = round((13 + 24 + 12 + 6) ÷ (85 + 6) × 100) = round(60.4) = 60 → grade C
With a failed gate: min(60, 47) = 47 → grade D
Grades and bands are defined once; bands are groups of grades, so the two can never disagree.
| Score | Grade | Band |
|---|---|---|
| 95–100 | A+ | Agent-Native |
| 86–94 | A | Agent-Native |
| 70–85 | B | AI-Friendly |
| 48–69 | C | AI-Capable |
| 28–47 | D | Legacy |
| 0–27 | F | Legacy |
Where the weights come from. The four layers, their base weights (20 / 30 / 40 / 10, which ARS keeps for e-commerce) and the grade cut-offs follow the structure ora.ai publishes in its scoring methodology. ARS adds archetype weights, evidence-only scoring, excluded unknowns, evidence coverage and gates. Neither ARS nor its weights have been validated against measured agent outcomes yet; see how ARS compares with AgentReady, ora and the IETF draft.
04 / Evidence
Evidence coverage and measurement kinds
Because unverifiable checks are excluded, a layer with few verifiable checks rests on little evidence. Every scorecard therefore reports how much evidence the score stands on, and the web report, CLI and Markdown report show it alongside the score:
| Field | Meaning |
|---|---|
checksEvaluated / checksRegistered | Checks that reached a verdict (pass, warn or fail) vs. the 137 registered checks |
baseCoverage | Verified base points ÷ registered base points, across the scored layers (Payments excluded) |
layers.<id>.coverage, lowConfidence | Per-layer share of registered base points that could be verified; the layer is flagged low evidence below 50% (MIN_LAYER_COVERAGE) |
homepageBlocked | The homepage served a bot challenge or HTTP 403. Checks that read its content are then skip (“not observed”, the term draft-shah-agent-readiness-evaluation-00 uses) instead of scoring the refusal page |
Each check result also carries a measurement kind:
| Kind | Meaning |
|---|---|
live | The scanner sent a request and the verdict depends on how the target behaved (handshakes, canaries, negotiation, links that resolve, challenges, latency) |
content | The scanner parsed a fetched artifact (HTML, headers, OpenAPI, tool schemas) |
presence | The scanner only knows that something exists or is listed |
declared | The value came from local codebase context |
pillars.runtimeMeasured scores the usability base checks (and payments, where applicable) with live or content evidence only, with no bonus, so a site can't score there on the presence of an MCP endpoint or spec file. It is reported next to the overall score, which it does not change.
Publish the number of checks a scan actually measured, not the registry size. 24 of the 137 registered checks are not probed yet (they report na or skip, or, for mpp-support, can never pass), so no scan evaluates all 137.
Registered base points of unprobed checks still count in the coverage denominator. On a remote URL scan this caps coverage below 100%:
| Layer | Registered base pts | Never verifiable | Why |
|---|---|---|---|
| Discovery | 21 | 13 | 12 pts in unprobed checks (brand-search-accuracy and agentic-search-specific need a search API; agentic-search-usecase is held at na by design); agent-rules-repo (1 pt) is checked only for local codebases |
| Access | 51 | 7 | Seven 1-pt checks not probed yet (e.g. http2-support, dns-caa-record, image-alt-prose) |
| Usability | 41 | 1 | api-sdk-documentation (not probed yet). Docs archetype: mcp-tools-breadth (3 pts) is also skip |
As a consequence, Discovery can verify at most 8 of its 21 registered base points on a URL scan (38%), so it is always flagged low evidence there, and its 20-point weight rests on six checks: registry-branding, ard-catalog, npm-sdk-package, robots-ai-policy-quality, mcp-registry-listed and skills-sh-listed.
05 / Probes
What each layer probes
| Layer | Checks | Base (points) | Bonus (points) | Not yet probed |
|---|---|---|---|---|
| Discovery | 18 | 10 (21) | 8 (14) | 4 |
| Access | 47 | 35 (51) | 12 (17) | 7 |
| Usability | 66 | 24 (41) | 42 (69) | 12 |
| Payments | 6 | 0 | 6 (16) | 1 |
Five checks are worth 0 points and are reported only: poppy-discovery, robots-edge-consistency, and mcp-logging-notifications, mcp-sampling-support and mcp-roots-support (MCP 2026-07-28 deprecates Logging, Sampling and Roots, SEP-2577).
Discovery
robots.txt AI-crawler policy (ClaudeBot, GPTBot, PerplexityBot, Google-Extended, anthropic-ai, cohere-ai, OAI-SearchBot), ARD / AI catalog files (/.well-known/ard.json, /.well-known/ai-catalog.json, /ai-catalog.json), MCP manifest branding, a Wikidata official-website claim (P856, matched on the registrable domain) and an npm package under the brand name that links back to the brand's domain or GitHub org. The brand is derived from the registrable domain (docs.stripe.com → stripe). An HTML page served at /robots.txt counts as no robots.txt, and # comments are stripped before directives are read. Agent rules files are only checked for local codebases (skip on URL scans).
Registry listings only count identities tied to the site, so third-party servers or skills about a brand earn it nothing. mcp-registry-listed passes on an active server in the official MCP Registry whose namespace is the domain (com.stripe/…, granted only after domain verification), whose remote endpoint is hosted on the domain, or whose namespace is the brand's GitHub owner (io.github.stripe/…); a self-declared websiteUrl does not count. skills-sh-listed passes on skills.sh skills published from the domain itself (docs.stripe.com/…) or from the brand's GitHub owner (stripe/…). Both are warn (0 points) when the registry answered without a match and skip when it did not answer, so a registry outage never costs a site points.
poppy-discovery (0 pts, emerging) reports a valid Personal Agent Protocol /.well-known/poppy.json (draft 0.2: protocol_version, organization with a domain equal to the serving host, auth where required, typed HTTPS apis). When auth.issuer is set, the issuer's RFC 8414 metadata must have a matching issuer and list the domain in poppy_domains. It is not scored until a second large vendor adopts the protocol.
Access
Zero-JS content (a gate), a soft-404 canary (a random path that must return 404 or 410), llms-full.txt, markdown content negotiation, HTTP hygiene headers, sitemap, security.txt, and bot challenges (a gate: challenge-page markers, cf-mitigated: challenge, or HTTP 403 on the homepage).
- llms.txt is scored only when present. A 200 counts only if the body is not HTML and has a Markdown heading or link, so soft-404 pages and error strings are rejected.
llms-txt-exists(1, bonus) andllms-txt-formatting(1, bonus) only add points;llms-txt-links-resolve(2, base) fetches up to 8 declared links and needs at least 80% to resolve;llms-txt-graph-reachability(2, bonus) needs anhrefto llms.txt on the homepage. AgentReady's experiment found no retrieval difference from adding the file, and its traces show agents mostly reach llms.txt through links. - Markdown alternate (
markdown-alternate-link, 1, bonus): the homepage declares<link rel="alternate" type="text/markdown">and the link resolves. - OpenAPI: JSON and YAML specs are parsed. Before 13 standard paths, the scanner tries specs the site points to:
Linkheaders withrel="service-desc"orrel="describedby",service-desclinks in/.well-known/api-catalog, and<link rel="service-desc">or links to openapi/swagger files on the homepage.api-catalog-rfc9727passes only for an RFC 9264 linkset. robots-edge-consistency(0 pts) warns when robots.txt allows AI agents but the edge refused the scanner.
If the homepage cannot be fetched (no successful response and no body), every check derived from its HTML or response headers is skip (“Homepage could not be fetched”), and anti-crawler-challenge-free is skip unless a challenge was actually observed. If the soft-404 canary request does not complete, anti-spa-404 is skip.
Usability
- MCP discovery tries standard paths on the site, the
docs./api./mcp.subdomains of the registrable domain (sowww.acme.co.ukprobesdocs.acme.co.uk), the root plus standard paths ofmcp.subdomains, and Streamable HTTP remotes declared by a Server Card in the AI Catalog (tried first). A 401/403 only counts as an MCP server on an MCP-like path or host and when the response is a JSON-RPC envelope or carries an RFC 9728WWW-Authenticate: ... resource_metadata=challenge. A generic 401 is not MCP evidence. When several candidates respond, the first to answer is used. - Live MCP probe, following the backward-compatibility procedure in MCP 2026-07-28 (the same procedure as our Remote MCP Server Reliability study):
server/discoverwith per-request_metaandMCP-Protocol-Version/Mcp-Methodheaders, theninitialize(2025-11-25, retried with 2025-03-26) for older servers, thentools/listand an unknown-tool canary call in the server's era, which must be answered with an in-channel error.mcp-protocol-modern(1, bonus) passes for 2026-07-28 servers;mcp-wire-compatibility(2, bonus) for a modern server that also accepts a legacyinitialize. - Tool checks from the real tool definitions: schema strictness,
readOnlyHint/destructiveHint, capabilities,mcp-tools-menu-size(1, bonus: at most 40 tools and about 10,000 tokens of definitions; a policy choice),mcp-tools-schema-dialect(1, bonus: no schema declares a JSON Schema dialect older than 2020-12, MCP's default since 2025-11-25). - Server Card (
mcp-server-card, 1, bonus): a Server Card with the v1 required fields listed in/.well-known/ai-catalog.jsonor served at<mcp-endpoint>/server-card(SEP-2127, final 2026-10-06). A card only at the old/.well-known/mcp/server-card.jsonpath is awarn. - Scope challenge (
mcp-auth-scope-challenge, 1, bonus): an auth-gated server's Bearer challenge names a scope (SEP-835).insufficient_scopeneeds a token and is not probed. - Safety rule: the prober calls a real tool only if the server annotates it
readOnlyHint: trueand it takes no required arguments. Unannotated tools are never called. SSRF behaviour is not probed. - Transports: Streamable HTTP is a base check; legacy SSE is bonus only.
- auth.md stage checks are bonus only (an emerging proposal) and each stage must appear in the file. OAuth protected-resource (RFC 9728) and authorization-server (RFC 8414) metadata must be valid JSON with the expected fields; the bearer and scope checks read them.
- OpenAPI inspection of the parsed spec: unique operationIds, JSON request schemas, typed error responses (on at least 50% of operations), Idempotency-Key, rate-limit headers, versioned URIs, search, cursor pagination, webhooks, problem+json, OpenAPI 3.1. JSON and YAML specs are both parsed.
- WebMCP (bonus):
modelContexttool registration or declarative form tool attributes in the homepage HTML.
Payments
Only for the e-commerce archetype, or local codebase scans with commerce signals: ACP (/checkout_sessions, /agentic_commerce/delegate_payment), UCP (/.well-known/ucp), AP2 (/.well-known/ap2), x402 (HTTP 402 at /api/payment) and MPP. MPP detection is not implemented yet, so mpp-support never passes. For other archetypes all six checks are skip.
06 / Safety
Safety and etiquette
- Read-only probing. Pages, files and metadata are fetched with GET (the unscored surface inventory also sends HEAD requests). The only POST requests are MCP JSON-RPC messages:
server/discover,initialize,notifications/initialized,tools/list, one call to a non-existent canary tool, and at most onetools/callwith empty arguments. - Tool calls. That one call goes only to a tool the server itself annotates
readOnlyHint: trueand that declares no required arguments. Unannotated tools are never called. - No SSRF probing. The scanner does not send private-network URLs to MCP servers;
mcp-ssrf-guardis reported asskip. - Private-network targets are refused. Loopback, private, link-local, shared (CGNAT), reserved and cloud-metadata addresses and host names (
localhost,*.local,*.internal), URLs with embedded credentials and non-standard ports are rejected before the scan starts. In the scored probes the policy is applied to every request and re-checked on every redirect hop (up to 5). The policy checks host names and IP literals; it does not resolve DNS. - Unreachable sites are not scored. If the homepage never answers (no HTTP response at all, after one retry), the scan stops with
TARGET_UNREACHABLEinstead of producing a score. If the probe suite itself fails, the scan fails withPROBES_FAILED; there is no fallback score. - Bounded requests. Every scored probe request has a timeout (1.5 to 15 seconds) and a response size cap (2 MB by default; up to 12 MB for OpenAPI specs), and YAML alias expansion is capped. MCP endpoint candidates and OpenAPI paths are tried four at a time and probing stops at the first hit; at most 8 llms.txt links are fetched. The unscored surface inventory that runs alongside the probes has a 25-second budget.
- Rate limits. The hosted scanner accepts 5 scans per hour per IP on
/api/scan, and the hosted MCP endpoint 60 requests per minute. - Identification. Since
ars-3.3.1, scored probe requests declare themselves asMozilla/5.0 (compatible; GlintbaseScanner/3.5; +https://glintbase.dev/research/bot)(see the bot page). Scans are user-initiated or weekly re-checks of leaderboard companies, so robots.txt is read as evidence but rules aimed at the scanner's own name are not treated as an opt-out; sites can opt out of re-checks by email. The unscored surface inventory sendsGlintscanner-V2/2.0, and MCP requests name the clientglintbase-live-probeorglintbase-audit. Discovery also queries four third parties by brand name or domain: the Wikidata API, the npm registry, the official MCP Registry and skills.sh.
07 / Registry
All 137 checks
The complete registry at ars-3.3.1: 69 base checks (113 points) and 68 bonus checks (116 points). Descriptions are the registry's own. “Not yet probed” marks the 24 checks the current probe code can never pass; they are excluded from scoring (or, as bonus checks, never add points).
Showing 137 of 137 checks
registry-brandingMCP Registry Branding Metadata
Verifies name, icon, and description are declared in /.well-known/mcp/manifest.json or /mcp.json.
DiscoveryBase2 ptsDiscoveryBase2ard-catalogAgent Resource Discovery (ARD v0.91)
Probes /.well-known/ard.json or fallback ai-catalog.json enforcing urn:air identifiers.
DiscoveryBase1 ptDiscoveryBase1ai-catalog-publishedAgent-Card WG Catalog Specification
Verify /.well-known/ai-catalog.json adhering to the Agent-Card Working Group specification.
DiscoveryBonus1 ptDiscoveryBonus1poppy-discoveryPersonal Agent Protocol (poppy.json)
Emerging, reported but not scored: /.well-known/poppy.json (draft 0.2) is valid and its OAuth issuer metadata lists the domain in poppy_domains.
DiscoveryBonus0 ptsDiscoveryBonus0ard-entries-validARD Catalog Entries Validated
Validates each catalog entry carries displayName, valid mediaType, and resolvable url/data.
DiscoveryBonus2 ptsDiscoveryBonus2ard-trust-manifestCryptographic Trust Manifest
Validates presence of cryptographic signatures or attestation blocks in ARD catalog.
DiscoveryBonus2 ptsDiscoveryBonus2chatgpt-app-listedNot yet probedOpenAI ChatGPT Directory Listing
Checks inclusion and domain verification in the OpenAI ChatGPT App Directory.
DiscoveryBonus2 ptsDiscoveryBonus2brand-search-accuracyNot yet probedBrand Apex Search Resolution
Brand-name queries rank target apex domain as the definitive authoritative origin.
DiscoveryBase3 ptsDiscoveryBase3agentic-search-specificNot yet probedDeveloper Keyword Discoverability
Developer documentation, OpenAPI specs, and MCP endpoints are ranked in top search results.
DiscoveryBase3 ptsDiscoveryBase3wikipedia-presenceWikidata P856 Official Website Claim
Verifies Wikipedia/Wikidata authority record has property P856 mapped to apex domain.
DiscoveryBonus4 ptsDiscoveryBonus4mcp-registry-listedGlobal MCP Registry Listing
Verifies domain or server presence in major MCP registries (Smithery, mcp.so, npm).
DiscoveryBase1 ptDiscoveryBase1npm-sdk-packageOfficial SDK Package Published
Official SDK or CLI package verified under matching package scope or repository link.
DiscoveryBase1 ptDiscoveryBase1agent-rules-repoAutonomous Agent Instruction Rules
Repository contains explicit AI agent guidelines (.claude/, .cursor/, .windsurf/ rules).
Only checked when scanning a local codebase; skip on remote URL scans.
DiscoveryBase1 ptDiscoveryBase1agent-plugins-repoAgent-Plugins Schema Compliance
Verify presence of plugin.json conforming to agent-plugins.org specification.
DiscoveryBonus1 ptDiscoveryBonus1skills-sh-listedSkills.sh Verified Publisher
Checks skills.sh registry for verified agent skills registered to domain organization.
DiscoveryBase1 ptDiscoveryBase1robots-ai-policy-qualityTiered robots.txt AI Policy
Permits answer bots (ClaudeBot, GPTBot, PerplexityBot) while regulating training crawlers.
DiscoveryBase2 ptsDiscoveryBase2agentic-search-usecaseNot yet probedComplex Agentic Query Resolution
Evaluates zero-shot search accuracy for multi-step agent queries (held at N/A in standard mode).
Held at na (unscored) pending noise reduction.
DiscoveryBase6 ptsDiscoveryBase6robots-oai-searchbotRobots.txt OAI-SearchBot Ingress
Verifies robots.txt explicitly permits OAI-SearchBot and user-directed AI agent crawlers.
DiscoveryBonus2 ptsDiscoveryBonus2content-no-jsZero-JS Content Readability
Clean HTML prose (>500 chars, h1 present, valid heading progression, >5% text density).
AccessBase3 ptsAccessBase3page-token-budgetDocumentation Page Token Budget
Extracted text across core documentation stays within the 100k character budget (~25k tokens).
AccessBase1 ptAccessBase1anti-spa-404Anti-SPA Canary 404 Guard
Random canary URLs return genuine HTTP 404/410 rather than soft HTTP 200 SPA shells.
AccessBase2 ptsAccessBase2llms-txt-existsStandard llms.txt Context Index
Standard /llms.txt file is published at apex domain or root directory.
AccessBonus1 ptAccessBonus1llms-txt-formattingllms.txt Structure & Links
llms.txt starts with # Heading, contains >=5 non-empty lines, valid markdown links, 100-30k chars.
AccessBonus1 ptAccessBonus1llms-txt-links-resolvellms.txt Linked Resources Reachable
Canary checks first 5 declared markdown links; all resolve to valid non-SPA content.
AccessBase2 ptsAccessBase2markdown-negotiationAccept: text/markdown Negotiation
Server returns raw markdown payload when client sends Accept: text/markdown.
AccessBase1 ptAccessBase1markdown-negotiation-varyVary: Accept CDN Cache Header
Responses negotiated via Accept send Vary: Accept to prevent CDN cache poisoning.
AccessBonus1 ptAccessBonus1markdown-url-fallbackRaw Markdown (.md) URL Twins
Appending .md to content and doc URLs returns raw clean markdown twins.
AccessBonus2 ptsAccessBonus2markdown-alternate-linkMarkdown Alternate Link (rel=alternate type=text/markdown)
Homepage advertises a Markdown version via <link rel="alternate" type="text/markdown"> and the link resolves to Markdown.
AccessBonus1 ptAccessBonus1code-fence-validityBalanced Column-0 Code Fences
All markdown fenced blocks (``` or ~~~) are strictly balanced and properly closed.
AccessBase1 ptAccessBase1openapi-specOpenAPI 3.x Machine Specification
Valid OpenAPI 3.x schema published at /openapi.json, /swagger.json, or exported in code.
AccessBase7 ptsAccessBase7developer-portalSelf-Serve Developer Portal Path
Self-serve developer route discoverable (/developers, /docs, /dashboard, /api-keys).
AccessBase6 ptsAccessBase6api-catalog-rfc9727RFC 9727 API Catalog Linkset
Publishes /.well-known/api-catalog with Accept: application/linkset+json support.
AccessBonus2 ptsAccessBonus2ssl-tls-enforcedEnforced HTTPS / Valid TLS Certificate
All HTTP traffic permanently redirects (301/308) to HTTPS with valid TLS.
AccessBase1 ptAccessBase1http2-supportNot yet probedHTTP/2 Protocol Support
Web server supports multiplexed HTTP/2 or HTTP/3 transport for agent requests.
AccessBase1 ptAccessBase1cors-headersCORS Access-Control-Allow-Origin
API and catalog endpoints return permissive or configured CORS headers for web agents.
AccessBase1 ptAccessBase1compression-gzip-brPayload Compression (Gzip / Brotli)
Responses support Content-Encoding: gzip or br for efficient token transfer.
AccessBase1 ptAccessBase1clean-semantic-htmlSemantic HTML Landmarks
HTML structure leverages semantic elements (<main>, <article>, <nav>, <header>).
AccessBase1 ptAccessBase1heading-hierarchyStrict Heading Level Progression
Headings do not skip levels (e.g. h1 followed directly by h3 or h4).
AccessBase1 ptAccessBase1meta-description-qualityAuthoritative Meta Description
Meta description exists, length is 50-300 characters, and contains clear descriptive prose.
AccessBase1 ptAccessBase1json-ld-structured-dataJSON-LD Schema.org Metadata
Homepage and doc pages include JSON-LD schema (WebSite, SoftwareApplication, Organization).
AccessBase1 ptAccessBase1sitemap-xml-presentStandard sitemap.xml Index
Valid sitemap.xml file accessible at root or declared in robots.txt.
AccessBase1 ptAccessBase1charset-utf8-declaredExplicit UTF-8 Charset Declaration
Content-Type header or HTML meta tag explicitly declares charset=utf-8.
AccessBase1 ptAccessBase1canonical-url-presentAuthoritative Canonical URL Tag
Every document carries <link rel="canonical"> to eliminate duplicate agent indexing.
AccessBase1 ptAccessBase1content-type-charsetAccurate Content-Type Header
HTTP response Content-Type matches actual payload (text/html, text/markdown, application/json).
AccessBase1 ptAccessBase1etag-cachingETag Cache Validation Support
Server returns ETag header allowing conditional 304 Not Modified requests.
AccessBase1 ptAccessBase1cache-control-headersExplicit Cache-Control Directives
Static and doc assets specify public max-age caching directives.
AccessBase1 ptAccessBase1response-latency-p95Fast First-Byte Latency (TTFB < 800ms)
P95 response time for documentation pages is under 800ms.
AccessBase1 ptAccessBase1status-code-accuracyAuthentic HTTP Status Codes
Server does not return 200 for error states or masking real error semantics.
AccessBase1 ptAccessBase1text-density-ratioHigh Text-to-HTML Markup Ratio
Prose text content represents >= 5% of overall page markup size.
AccessBase1 ptAccessBase1pagination-rel-linksNot yet probedMachine Pagination (rel=next/prev)
List views and paginated feeds include rel="next" and rel="prev" links.
AccessBase1 ptAccessBase1link-header-canonicalLink HTTP Header for Machine Twins
Link header points agents to alternative representations (e.g. rel="alternate" type="text/markdown").
AccessBase1 ptAccessBase1dns-caa-recordNot yet probedDNS CAA Security Records
Domain has CAA records configured for authorized certificate authority issuance.
AccessBase1 ptAccessBase1security-headers-cspStandard Security Headers
Responses include X-Content-Type-Options: nosniff and Referrer-Policy.
AccessBase1 ptAccessBase1security-txt-rfc9116Security Vulnerability Disclosure (security.txt)
Publishes /.well-known/security.txt conforming to RFC 9116.
AccessBase1 ptAccessBase1llms-full-txt-presentComprehensive llms-full.txt Context
Optional /llms-full.txt providing consolidated zero-hop documentation context.
AccessBonus1 ptAccessBonus1markdown-table-syntaxNot yet probedStandard GFM Table Formatting
All markdown tables have matching header and body column counts.
AccessBase1 ptAccessBase1relative-link-resolutionNot yet probedStrict Relative URL Resolution
Documentation markdown avoids unresolvable relative parent hops (../../).
AccessBase1 ptAccessBase1image-alt-proseNot yet probedDescriptive Image Alt Text
Informative diagram and architectural images include descriptive alt prose.
AccessBase1 ptAccessBase1plain-text-accessibleNot yet probedRaw Plain Text Endpoint (/raw or text/plain)
Key documentation articles can be consumed as plain UTF-8 text.
AccessBase1 ptAccessBase1anti-crawler-challenge-freeUnchallenged Agent Scraping for Public Docs
Public documentation endpoints do not trigger Cloudflare/Imperva JavaScript captcha walls for AI agents.
AccessBase2 ptsAccessBase2robots-edge-consistencyrobots.txt vs. Edge Enforcement
Reported, not scored: flags sites whose robots.txt allows AI agents while the edge challenges or refuses the scanner (the refusal itself is scored by the anti-crawler gate).
AccessBonus0 ptsAccessBonus0llms-txt-graph-reachabilityllms.txt Navigation Reachability
Verifies llms.txt is linked from documentation navigation, footer, or sitemap rather than being an isolated orphan file.
AccessBonus2 ptsAccessBonus2markdown-html-parityMarkdown vs HTML Semantic Parity
Verifies markdown representations preserve tables, code schemas, and headings present in corresponding HTML docs.
AccessBonus2 ptsAccessBonus2crosspage-policy-consistencyCross-Page Policy Consistency
Verifies semantic consistency across pricing, rate limits, and authentication across documentation pages.
AccessBonus2 ptsAccessBonus2nojs-fact-integrityNo-JS Critical Fact Integrity
Verifies critical API parameters, endpoints, and authentication directives exist in server-rendered HTML without JS execution.
AccessBonus2 ptsAccessBonus2mcp-server-manifestMCP Server Manifest Available
MCP server endpoint is live and responds to initialization handshake.
UsabilityBase2 ptsUsabilityBase2mcp-tools-listingMCP Tools Catalog (tools/list)
tools/list returns valid array of tools with schema definitions.
UsabilityBase3 ptsUsabilityBase3mcp-tools-focusKind-Aware Focus (Docs MCP: 1-3 Focused Tools)
Docs MCPs provide 1 to 3 focused search/retrieval tools to prevent agent prompt pollution.
Docs archetype only (1-3 tools); skip for other archetypes.
UsabilityBonus3 ptsUsabilityBonus3mcp-tools-breadthKind-Aware Breadth (Product MCP: Rich Toolset)
Product MCPs provide >=3 tools or code-mode dispatcher for complete workflow execution.
Non-docs archetypes only (3+ tools); skip for docs.
UsabilityBase3 ptsUsabilityBase3mcp-tools-schema-strictStrict JSON Schema Typing for MCP Parameters
All tool inputSchema definitions declare type, properties, and required arrays.
UsabilityBase2 ptsUsabilityBase2mcp-tools-readonly-hintMCP Tool readOnlyHint Annotations
Safe query and read tools declare readOnlyHint: true to skip confirmation prompts.
UsabilityBonus2 ptsUsabilityBonus2mcp-tools-destructive-hintMCP Tool destructiveHint Annotations
Mutating or deletion tools declare destructiveHint: true for safety controls.
UsabilityBonus2 ptsUsabilityBonus2mcp-auth-requirementKind-Aware MCP Auth Policy
Docs MCPs must be public zero-auth; Product MCPs must enforce OAuth metadata.
UsabilityBase2 ptsUsabilityBase2mcp-transport-streamableStreamable HTTP MCP Transport (/api/mcp)
Mounts modern Streamable HTTP MCP transport handler for stateless agent queries.
UsabilityBase3 ptsUsabilityBase3mcp-transport-sseServer-Sent Events (SSE) MCP Transport
Supports SSE connection channel for streaming tool updates and execution logs.
UsabilityBonus2 ptsUsabilityBonus2mcp-app-registryNot yet probedMCP App UI Resource Schemas
Declares _meta.ui.resourceUri with ui:// schemes for in-agent visual rendering.
UsabilityBonus4 ptsUsabilityBonus4mcp-apps-ui-qualityNot yet probedMCP App HTML Profile Compliance
Served UI resources adhere to text/html;profile=mcp-app specifications.
UsabilityBonus4 ptsUsabilityBonus4mcp-view-cspNot yet probedIn-Agent UI Frame CSP Policy
CSP frame-ancestors permits chatgpt.com, claude.ai, and approved agent hosts.
UsabilityBonus4 ptsUsabilityBonus4mcp-prompts-listingMCP Prompt Templates (prompts/list)
Exposes curated prompt templates guiding agents on workflow execution patterns.
UsabilityBonus1 ptUsabilityBonus1mcp-resources-listingMCP Dynamic Resources (resources/list)
Exposes structured read-only data files via resources/list.
UsabilityBonus1 ptUsabilityBonus1mcp-error-reportingStandard JSON-RPC 2.0 Error Codes
Tool failures return standard JSON-RPC error codes with clear error messages.
UsabilityBase2 ptsUsabilityBase2mcp-protocol-versionMCP Specification Protocol Versioning
Client/Server handshake negotiates supported protocolVersion string.
UsabilityBase1 ptUsabilityBase1mcp-sampling-supportNot yet probedMCP Sampling Capability
Reported, not scored: deprecated in MCP 2026-07-28 (SEP-2577) and still functional for at least twelve months. Server declares sampling capability allowing server to request LLM generations via client.
UsabilityBonus0 ptsUsabilityBonus0mcp-roots-supportNot yet probedMCP Roots Capability
Reported, not scored: deprecated in MCP 2026-07-28 (SEP-2577) and still functional for at least twelve months. Server advertises roots capability for workspace filesystem context.
UsabilityBonus0 ptsUsabilityBonus0mcp-logging-notificationsMCP Notifications / Logging
Reported, not scored: deprecated in MCP 2026-07-28 (SEP-2577) and still functional for at least twelve months. Server emits structured progress notifications during long-running tool execution.
UsabilityBonus0 ptsUsabilityBonus0auth-md-structureWorkOS auth.md 8-Stage Canonical Structure
Validates 8 canonical stages: Discover, Pick Method, Register, Claim, Exchange, Use, Errors, Revocation.
UsabilityBonus2 ptsUsabilityBonus2auth-md-stage-discoverauth.md Stage 1: Discovery Endpoints
auth.md documents discovery URLs for OAuth / PRM metadata.
UsabilityBonus1 ptUsabilityBonus1auth-md-stage-methodsauth.md Stage 2: Authentication Methods
auth.md specifies supported methods (id-jag, service_auth, anonymous).
UsabilityBonus1 ptUsabilityBonus1auth-md-stage-registerauth.md Stage 3: Client Registration
auth.md contains fenced HTTP request and JSON response blocks for machine registration.
UsabilityBonus1 ptUsabilityBonus1auth-md-stage-claimauth.md Stage 4: Token Claim Protocol
auth.md documents claim_token, user_code, and verification_uri flow.
UsabilityBonus1 ptUsabilityBonus1auth-md-stage-exchangeauth.md Stage 5: Token Exchange Grant
auth.md details JWT-bearer token exchange grant URN and parameters.
UsabilityBonus1 ptUsabilityBonus1auth-md-stage-useauth.md Stage 6: Bearer Header Invocation
auth.md shows clear examples of Authorization: Bearer <token> usage.
UsabilityBonus1 ptUsabilityBonus1auth-md-stage-errorsauth.md Stage 7: Auth Error Enumeration
auth.md enumerates invalid_claim_token, claimed_or_in_flight, authorization_pending.
UsabilityBonus1 ptUsabilityBonus1auth-md-stage-revocationauth.md Stage 8: Token Revocation & Security
auth.md specifies secevent+jwt token revocation endpoints and event formats.
UsabilityBonus1 ptUsabilityBonus1auth-md-walkthrough-simulationauth.md Read-Only GET Simulation
Executes non-mutating GET simulation: reads auth.md, follows RFC 9728 PRM and RFC 8414 AS metadata hops.
UsabilityBonus2 ptsUsabilityBonus2agent-auth-www-authenticateWWW-Authenticate Resource Metadata Header
Inspects 401 responses on API routes for WWW-Authenticate: Bearer resource_metadata="...".
UsabilityBonus1 ptUsabilityBonus1oauth-rfc8414-metadataRFC 8414 OAuth Authorization Server Metadata
Publishes /.well-known/oauth-authorization-server with token_endpoint and agent_auth metadata.
UsabilityBonus2 ptsUsabilityBonus2oauth-rfc9728-prmRFC 9728 Protected Resource Metadata (PRM)
Publishes /.well-known/oauth-protected-resource with authorization_servers array.
UsabilityBonus2 ptsUsabilityBonus2auth-bearer-token-supportStandard Bearer Token API Protection
API routes authenticate incoming requests via Authorization: Bearer header.
UsabilityBase2 ptsUsabilityBase2auth-scoped-permissionsGranular Scope Declarations
API routes and OpenAPI document fine-grained scope permissions (e.g. read:items, write:items).
UsabilityBase1 ptUsabilityBase1webmcpW3C WebMCP DOM & Script Declarations
Inspects HTML/JS for window.modelContext tool registrations and form toolname attributes.
UsabilityBonus5 ptsUsabilityBonus5webmcp-model-contextwindow.modelContext API Registration
Browser client registers tools dynamically via window.modelContext.registerTool().
UsabilityBonus2 ptsUsabilityBonus2webmcp-form-attributesDeclarative HTML Form Agent Attributes
HTML form tags provide declarative toolname and tooldescription attributes for agent interactions.
UsabilityBonus2 ptsUsabilityBonus2api-operation-idsUnique operationId in OpenAPI Specification
All OpenAPI operations declare unique, clean camelCase or snake_case operationIds.
UsabilityBase2 ptsUsabilityBase2api-json-schemasStrict JSON Schemas for Request Payloads
Request bodies declare explicit schema properties and required field constraints.
UsabilityBase2 ptsUsabilityBase2api-error-schemasTyped Error Response Schemas
Error responses declare structured JSON bodies with error codes and diagnostic messages.
UsabilityBase2 ptsUsabilityBase2api-idempotency-keysIdempotency-Key Header Support
POST/PUT mutation routes accept Idempotency-Key header to prevent duplicate execution.
UsabilityBase2 ptsUsabilityBase2api-rate-limit-headersStandard RateLimit-* Response Headers
API responses return RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset headers.
UsabilityBase2 ptsUsabilityBase2api-curl-examplesExecutable cURL Request Examples
Documentation provides copy-paste ready cURL examples with realistic dummy values.
UsabilityBase1 ptUsabilityBase1api-code-samplesMulti-Language SDK Code Samples
Documentation displays TypeScript/JavaScript, Python, and Go code snippets.
UsabilityBase1 ptUsabilityBase1api-versioning-in-uriExplicit API Versioning Strategy
API paths incorporate explicit version segment (/v1/...) or Accept header versioning.
UsabilityBase1 ptUsabilityBase1api-search-endpointGlobal Search / Filter API Endpoint
Provides queryable search/filter endpoint (/search or /filter) for autonomous agent discovery.
UsabilityBase1 ptUsabilityBase1api-rfc7807-problem-detailsRFC 7807 Problem Details for HTTP APIs
Error responses use application/problem+json MIME type with type, title, status, and detail.
UsabilityBase2 ptsUsabilityBase2api-bulk-batch-operationsNot yet probedBatch / Bulk API Endpoints
Offers bulk create/update endpoints (/batch) to conserve agent roundtrips.
UsabilityBonus1 ptUsabilityBonus1api-pagination-cursorCursor-Based Pagination for Large Collections
High-volume list endpoints provide cursor or starting_after pagination.
UsabilityBase1 ptUsabilityBase1api-webhook-declarationsWebhook Event Catalog in OpenAPI
OpenAPI 3.1 webhooks block documents outbound event schemas and HMAC signatures.
UsabilityBase1 ptUsabilityBase1api-openapi-3-1-strictOpenAPI 3.1 Dialect Compliance
Validates schema against full OpenAPI 3.1 specification including JSON Schema 2020-12.
UsabilityBase1 ptUsabilityBase1api-sandbox-environmentNot yet probedPublic Testnet / Mock Sandbox URL
Provides a sandbox or mock environment (api.sandbox.acme.com) for safe agent experimentation.
UsabilityBonus2 ptsUsabilityBonus2api-sdk-documentationNot yet probedSDK Setup & Installation Instructions
Documentation documents npm/pip install commands and client initialization snippets.
UsabilityBase1 ptUsabilityBase1api-graphql-schemaNot yet probedGraphQL Schema Introspection or SDL
GraphQL endpoints provide introspection schema or published schema.graphql.
UsabilityBonus1 ptUsabilityBonus1api-grpc-reflectionNot yet probedgRPC Server Reflection / Protobuf Definitions
gRPC services provide server reflection or downloadable .proto files.
UsabilityBonus1 ptUsabilityBonus1webmcp-js-registrationWebMCP Top-Level JavaScript Registration
Verifies browser tools are registered via document.modelContext.registerTool on top-level window for ChatGPT Site Tools visibility.
UsabilityBonus2 ptsUsabilityBonus2mcp-wire-compatibilityMCP Dual Wire-Form Compatibility
Verifies a 2026-07-28 server (server/discover) also completes a legacy initialize handshake for older clients.
UsabilityBonus2 ptsUsabilityBonus2mcp-protocol-modernMCP 2026-07-28 (server/discover)
Verifies the server answers server/discover with a DiscoverResult, as the stateless MCP 2026-07-28 revision requires.
UsabilityBonus1 ptUsabilityBonus1mcp-server-cardMCP Server Card (SEP-2127)
A valid Server Card ($schema, name, version, description) is listed in /.well-known/ai-catalog.json or served at <mcp-endpoint>/server-card.
UsabilityBonus1 ptUsabilityBonus1mcp-tools-menu-sizeMCP Tool Menu Size
The first tools/list page has at most 40 tools and about 10,000 tokens of definitions, so the menu fits in an agent context without crowding out the task.
UsabilityBonus1 ptUsabilityBonus1mcp-tools-schema-dialectMCP Tool Schema Dialect (JSON Schema 2020-12)
No tool inputSchema declares a JSON Schema dialect older than 2020-12, the MCP default since 2025-11-25 (SEP-1613).
UsabilityBonus1 ptUsabilityBonus1mcp-auth-scope-challengeMCP Scope in Auth Challenge (SEP-835)
An auth-gated MCP server's Bearer WWW-Authenticate challenge names the scope to request, so clients can step up consent.
UsabilityBonus1 ptUsabilityBonus1mcp-ssrf-guardNot yet probedMCP Endpoint Private Network Guard
Verifies MCP tool schemas and endpoints reject private IP loopback/link-local ranges (127.0.0.1, 169.254.169.254).
Deliberately not probed: it would require sending private-network URLs to the server.
UsabilityBonus2 ptsUsabilityBonus2mcp-honest-schemasMCP Tool Schema Honesty
Verifies declared tool schemas match runtime requirements without hidden undeclared parameters or surprise auth gates.
UsabilityBonus2 ptsUsabilityBonus2api-error-actionabilityNot yet probedAgent-Actionable Error Payloads
Verifies API and MCP error messages name the specific missing parameter, remedial tool, or retry endpoint.
UsabilityBonus2 ptsUsabilityBonus2acp-supportAgentic Commerce Protocol (ACP /checkout_sessions)
Implements ACP session creation and preflight validation at /checkout_sessions.
PaymentsBonus3 ptsPaymentsBonus3acp-delegate-paymentACP Delegated Payment Authorization
Implements /agentic_commerce/delegate_payment for autonomous transaction execution.
PaymentsBonus3 ptsPaymentsBonus3ucp-supportUniversal Commerce Protocol (/.well-known/ucp)
Publishes /.well-known/ucp with ISO date versioning and merchant capabilities.
PaymentsBonus3 ptsPaymentsBonus3ap2-supportGoogle Agent Payments Protocol (AP2 Mandates)
Supports SD-JWT signed authorization mandates under Google Agent Payments Protocol.
PaymentsBonus3 ptsPaymentsBonus3x402-supportHTTP 402 Micropayments (x402 Header)
Returns HTTP 402 with PAYMENT-REQUIRED header for per-call autonomous micropayments.
PaymentsBonus2 ptsPaymentsBonus2mpp-supportNot yet probedMachine Payments Protocol (MPP x-payment-info)
Declares x-payment-info OpenAPI extensions for machine pricing tiers.
MPP detection is not implemented; this check never passes.
PaymentsBonus2 ptsPaymentsBonus2
08 / Limitations
Known limitations
- No outcome validation. ARS is not yet shown to predict agent task success, and that includes the gate cap and the layer weights.
- Declared, not verified, identity. The scanner identifies itself honestly but doesn't sign requests (Web Bot Auth) or come from published IP ranges, so the anti-crawler gate measures how a site treats a declared but unverified agent. Verified crawlers may be treated differently, and edge decisions depend on the network the scan runs from.
- Single-sample measurements. Latency and availability come from one request per URL.
- Keyword heuristics. auth.md stage detection and WebMCP detection match keywords and can be gamed.
- OpenAPI discovery. OpenAPI discovery follows
Linkheaders, the API catalog and homepage links, but not llms.txt or deeper pages. - Endpoint choice. When several MCP candidates respond, the first to answer is used.
- Auth-gated MCP without RFC 9728. A gated MCP server that answers 401 with neither a JSON-RPC body nor
resource_metadata=is not detected. - Absent MCP weighs heavily. For API and docs archetypes, a site without an MCP server or OpenAPI spec typically scores 0 on most of the 35-point usability layer. This is intended by the current weights but is a policy choice worth revisiting.
- Archetype drives rubric. A docs host whose MCP server is a product (action) server is judged by the docs rubric (e.g. auth-gated MCP is a
warn). - Registry availability. The MCP Registry and skills.sh checks are skipped when those services do not answer in time, so the same site can show a skipped or a measured result on different scans. Matching a brand to a GitHub owner of the same name assumes the brand owns that account.
- Unprobed registry checks. 24 registered checks are not probed yet; on URL scans the Discovery layer is always low evidence (see Evidence coverage).
09 / Changelog
Changes from ARS 3.2
- Gates: a failed
anti-crawler-challenge-free(challenge or HTTP 403) orcontent-no-jscaps the score at 47. - Not observed: a blocked homepage skips the checks that read its content.
- llms.txt is optional:
llms-txt-existsandllms-txt-formattingbecome bonus checks (formatting drops from 2 to 1 point), soft-404 bodies are rejected, and reachability needs anhref. - MCP probe speaks 2026-07-28 (
server/discover) and falls back toinitialize. - New bonus checks:
markdown-alternate-link,mcp-protocol-modern,mcp-server-card,mcp-tools-menu-size,mcp-tools-schema-dialect,mcp-auth-scope-challenge. New reported (0-pt) checks:poppy-discovery,robots-edge-consistency. The registry has 137 checks. - OpenAPI is found through
Linkheaders, the API catalog and homepage links, and YAML specs are parsed. - Server Cards are found where the final SEP-2127 puts them.
- Measurement kinds on every result, and
pillars.runtimeMeasured.
ARS 3.2 and earlier scores are not comparable with 3.3. Scorecard pages flag older scans and offer a rescan. Every scan is stamped with its score_version; compare scores only within the same version. History: ARS 3.2 methodology.
10 / Sources
Sources and links
Run an ARS 3.3 scan on any public URL.
Published ARS scores.
The scanner and scoring code behind every number on this page.
The methodology specification this page is based on.
Source of each check's points and base / bonus status.
This page as plain Markdown for agents and LLMs.
Corrections to the State of Agent Readiness 2026 report (2026-10-12).
Corrections to the Sandboxes Edition 1 benchmark (2026-10-12).
CLI, MCP servers and API reference.
Last updated 2026-10-25 · score_version ars-3.3.1