# Agent Readiness Score (ARS) 3.3 — Methodology

Last updated 2026-10-25 · score_version `ars-3.3.1`
HTML version: https://glintbase.dev/methodology
Source of truth: https://github.com/Glintbase/glintscanner/blob/main/docs/methodology/ars-3.3.md (check registry: `src/lib/scanner/v2/probes/registry.ts`)

## 1. 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 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. Read a score as "readiness signals present and verified", not "agents will succeed". That includes the layer weights and the gate cap below.

## 2. Core rule: points only for observed evidence

| Status | Meaning | Effect on score |
|---|---|---|
| `pass` | The scanner observed the evidence | Earns the check's full registry points |
| `warn` / `fail` | Checked; evidence missing or wrong | Earns 0. Base checks still count in the layer 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: `warn` earns 0.
- Absent surfaces are penalised once, by their existence check (`mcp-server-manifest`, `openapi-spec`, ...). Quality checks for an absent surface are `na`.
- Exception: `llms.txt` is optional. Its absence costs nothing; when present it must be a real index and its links must resolve.
- The registry owns each check's points and base/bonus status; probes only decide the status.

## 3. Scoring

**Archetype and layer weights.** In a URL scan the classifier sees only the URL: `docs.`, `/docs`, `/documentation`, `/kb` → docs; `/api`, `api.` → API / devtool; `/shop`, `/store`, `/cart`, `/checkout`, `/pricing` → e-commerce; `/blog`, `/news`, `/article` → content / media; anything else → API / devtool. Scans run with an explicit archetype override 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 |

- **Layer base** = `round(passed base points / verifiable base points × layer weight)`, where verifiable means `pass`, `warn` or `fail`.
- **Bonus** = points from passed bonus checks. Payments is excluded and uses OR-scoring: in a URL scan it is scored only for e-commerce, where any one verified protocol (ACP, UCP, AP2, x402) earns the full 10 points.
- **Weighted score** = `min(100, round((Σ layer base + bonus) / (denominator + bonus) × 100))`. A bonus can raise a score; a missing bonus never lowers one.
- **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, no gate failed): Discovery 4/6 verifiable base pts → 13; Access 40/50 → 24; Usability 10/30 → 12; bonus 6 → `round((13+24+12+6) / (85+6) × 100) = 60` → grade C. With a failed gate the same scan would score 47.

| 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](https://ora.ai/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](https://glintbase.dev/blog/how-ars-compares-agentready-ora-ietf).

## 4. Evidence coverage and measurement kinds

Every scorecard reports:

- `evidence.checksEvaluated` / `evidence.checksRegistered`: checks with a verdict (pass/warn/fail) vs. the 137 registered checks.
- `evidence.baseCoverage`: verified base points ÷ registered base points across scored layers (Payments excluded).
- `layers.<id>.coverage` and `layers.<id>.lowConfidence`: a layer is low evidence when under 50% of its registered base points could be verified (`MIN_LAYER_COVERAGE`).
- `evidence.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 | 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 measured, not the registry size. 24 registered checks are not probed yet (always `na`/`skip`, or for `mpp-support`, never pass). On URL scans Discovery can verify at most 8 of its 21 base points and is always flagged low evidence; its 20-point weight rests on `registry-branding`, `ard-catalog`, `npm-sdk-package`, `robots-ai-policy-quality`, `mcp-registry-listed` and `skills-sh-listed`.

## 5. 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; Wikidata official-website claim (P856, matched on the registrable domain); an npm package under the brand name that links back to the brand's domain or GitHub org. Brand = registrable domain (`docs.stripe.com` → `stripe`). An HTML page at `/robots.txt` counts as no robots.txt; `#` comments are stripped. Agent rules files are only checked for local codebases (`skip` remotely).

Registry listings only count identities tied to the site. `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 or the brand's GitHub owner. Both are `warn` (0 points) when the registry answered without a match and `skip` when it did not answer.

`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); soft-404 canary (random path must return 404/410); `llms-full.txt`; markdown negotiation; HTTP hygiene headers; sitemap; security.txt; bot challenges (a gate: challenge 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) and `llms-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 an `href` to 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: `Link` headers with `rel="service-desc"` or `rel="describedby"`, `service-desc` links in `/.well-known/api-catalog`, and `<link rel="service-desc">` or links to openapi/swagger files on the homepage. `api-catalog-rfc9727` passes 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, every homepage-derived check is `skip`, and `anti-crawler-challenge-free` is `skip` unless a challenge was observed. If the soft-404 canary does not complete, `anti-spa-404` is `skip`.

**Usability.**
- MCP discovery: standard paths on the site, `docs.` / `api.` / `mcp.` subdomains of the registrable domain, the root plus standard paths of `mcp.` subdomains, and Streamable HTTP remotes declared by a Server Card in the AI Catalog (tried first). A 401/403 counts as MCP only on an MCP-like path or host and with a JSON-RPC envelope or an RFC 9728 `resource_metadata=` challenge.
- Live MCP probe, following the backward-compatibility procedure in MCP 2026-07-28 (the same procedure as our Remote MCP Server Reliability study): `server/discover` with per-request `_meta` and `MCP-Protocol-Version` / `Mcp-Method` headers, then `initialize` (2025-11-25, retried with 2025-03-26) for older servers, then `tools/list` and an unknown-tool canary in the server's era. `mcp-protocol-modern` (1, bonus) passes for 2026-07-28 servers; `mcp-wire-compatibility` (2, bonus) for a modern server that also accepts a legacy `initialize`.
- Tool checks from 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).
- `mcp-server-card` (1, bonus): a Server Card with the v1 required fields listed in `/.well-known/ai-catalog.json` or served at `<mcp-endpoint>/server-card` (SEP-2127, final 2026-10-06). A card only at the old `/.well-known/mcp/server-card.json` path is a `warn`.
- `mcp-auth-scope-challenge` (1, bonus): an auth-gated server's Bearer challenge names a scope (SEP-835). `insufficient_scope` needs a token and is not probed.
- Safety: a real tool is called only if the server annotates it `readOnlyHint: true` and it has no required arguments. Unannotated tools are never called. SSRF behaviour is not probed.
- Transports: Streamable HTTP is base; legacy SSE is bonus only.
- auth.md stage checks are bonus only and each stage must appear in the file. OAuth PRM (RFC 9728) / AS metadata (RFC 8414) must be valid JSON with the expected fields.
- OpenAPI inspection: unique operationIds, JSON request schemas, typed error responses (≥50% of operations), Idempotency-Key, rate-limit headers, versioned URIs, search, cursor pagination, webhooks, problem+json, OpenAPI 3.1.
- WebMCP (bonus): `modelContext` 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`), MPP (detection not implemented; `mpp-support` never passes). Otherwise all six checks are `skip`.

## 6. Safety and etiquette

- Read-only probing: GET for pages, files and metadata (the unscored surface inventory also sends HEAD). The only POSTs are MCP JSON-RPC: `server/discover`, `initialize`, `notifications/initialized`, `tools/list`, one call to a non-existent canary tool, and at most one `tools/call` with empty arguments to a tool annotated `readOnlyHint: true` with no required arguments.
- No SSRF probing of MCP servers (`mcp-ssrf-guard` is `skip`).
- Private-network targets refused: loopback, private, link-local, CGNAT, reserved and cloud-metadata addresses and hosts (`localhost`, `*.local`, `*.internal`), URLs with credentials, non-standard ports. In the scored probes every request and redirect hop (max 5) is re-checked.
- Unreachable sites are not scored: no HTTP response at all (after one retry) → `TARGET_UNREACHABLE`. A failed probe suite → `PROBES_FAILED`; no fallback score.
- Bounded requests: timeouts of 1.5–15 s and size caps (2 MB default, up to 12 MB for OpenAPI); YAML alias expansion is capped; MCP candidates and OpenAPI paths tried 4 at a time, stopping at the first hit; at most 8 llms.txt links. The unscored surface inventory has a 25 s budget.
- Rate limits: hosted scanner 5 scans/hour per IP (`/api/scan`); hosted MCP 60 requests/minute.
- Identification: since `ars-3.3.1`, scored probes declare themselves as `Mozilla/5.0 (compatible; GlintbaseScanner/3.5; +https://glintbase.dev/research/bot)` (see https://glintbase.dev/research/bot). 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 emailing research@glintbase.dev. The surface inventory sends `Glintscanner-V2/2.0`; MCP requests name the client `glintbase-live-probe` or `glintbase-audit`. Discovery queries the Wikidata API, the npm registry, the official MCP Registry and skills.sh by brand name or domain.

## 7. Known limitations

- No outcome validation, including for 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 follows `Link` headers, 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 server answering 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 (an intended, revisitable policy choice).
- Archetype drives rubric: a docs host whose MCP server is a product (action) server is judged by the docs rubric.
- Registry availability: the MCP Registry and skills.sh checks are skipped when those services do not answer in time.
- 24 registered checks are not probed yet; on URL scans Discovery is always low evidence.

## 8. Changes from ARS 3.2

- **Gates:** a failed `anti-crawler-challenge-free` (challenge or HTTP 403) or `content-no-js` caps the score at 47.
- **Not observed:** a blocked homepage skips the checks that read its content.
- **llms.txt** is optional: `llms-txt-exists` and `llms-txt-formatting` become bonus checks (formatting drops from 2 to 1 point), soft-404 bodies are rejected, and reachability needs an `href`.
- **MCP probe** speaks 2026-07-28 (`server/discover`) and falls back to `initialize`.
- **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`. **No longer rewarded:** `mcp-logging-notifications`, `mcp-sampling-support`, `mcp-roots-support` (deprecated in MCP 2026-07-28). The registry has 137 checks.
- **OpenAPI** is found through `Link` headers, 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. History: [ARS 3.2 methodology](https://github.com/Glintbase/glintscanner/blob/main/docs/methodology/ars-3.2.md).

## 9. Links

- Scanner: https://scan.glintbase.dev
- Leaderboard: https://scan.glintbase.dev/leaderboard
- Open-source engine: https://github.com/Glintbase/glintscanner (methodology: `docs/methodology/ars-3.3.md`)
- ARS 2026 errata: https://glintbase.dev/research/data/ARS_2026_ERRATA.md
- Sandboxes Edition 1 errata: https://glintbase.dev/research/sandboxes-edition-1/reports/ERRATA.md

## 10. Check catalog (137 checks)

Columns: id · layer · base/bonus · points · notes. "not yet probed" = the probe code can never return pass.

<!-- catalog:start -->
| Check | Layer | Type | Points | Notes |
|---|---|---|---:|---|
| `registry-branding` | discovery | base | 2 |  |
| `ard-catalog` | discovery | base | 1 |  |
| `ai-catalog-published` | discovery | bonus | 1 |  |
| `poppy-discovery` | discovery | bonus | 0 |  |
| `ard-entries-valid` | discovery | bonus | 2 |  |
| `ard-trust-manifest` | discovery | bonus | 2 |  |
| `chatgpt-app-listed` | discovery | bonus | 2 | not yet probed |
| `brand-search-accuracy` | discovery | base | 3 | not yet probed |
| `agentic-search-specific` | discovery | base | 3 | not yet probed |
| `wikipedia-presence` | discovery | bonus | 4 |  |
| `mcp-registry-listed` | discovery | base | 1 |  |
| `npm-sdk-package` | discovery | base | 1 |  |
| `agent-rules-repo` | discovery | base | 1 | Only checked when scanning a local codebase; skip on remote URL scans. |
| `agent-plugins-repo` | discovery | bonus | 1 |  |
| `skills-sh-listed` | discovery | base | 1 |  |
| `robots-ai-policy-quality` | discovery | base | 2 |  |
| `agentic-search-usecase` | discovery | base | 6 | not yet probed; Held at na (unscored) pending noise reduction. |
| `robots-oai-searchbot` | discovery | bonus | 2 |  |
| `content-no-js` | access | base | 3 |  |
| `page-token-budget` | access | base | 1 |  |
| `anti-spa-404` | access | base | 2 |  |
| `llms-txt-exists` | access | bonus | 1 |  |
| `llms-txt-formatting` | access | bonus | 1 |  |
| `llms-txt-links-resolve` | access | base | 2 |  |
| `markdown-negotiation` | access | base | 1 |  |
| `markdown-negotiation-vary` | access | bonus | 1 |  |
| `markdown-url-fallback` | access | bonus | 2 |  |
| `markdown-alternate-link` | access | bonus | 1 |  |
| `code-fence-validity` | access | base | 1 |  |
| `openapi-spec` | access | base | 7 |  |
| `developer-portal` | access | base | 6 |  |
| `api-catalog-rfc9727` | access | bonus | 2 |  |
| `ssl-tls-enforced` | access | base | 1 |  |
| `http2-support` | access | base | 1 | not yet probed |
| `cors-headers` | access | base | 1 |  |
| `compression-gzip-br` | access | base | 1 |  |
| `clean-semantic-html` | access | base | 1 |  |
| `heading-hierarchy` | access | base | 1 |  |
| `meta-description-quality` | access | base | 1 |  |
| `json-ld-structured-data` | access | base | 1 |  |
| `sitemap-xml-present` | access | base | 1 |  |
| `charset-utf8-declared` | access | base | 1 |  |
| `canonical-url-present` | access | base | 1 |  |
| `content-type-charset` | access | base | 1 |  |
| `etag-caching` | access | base | 1 |  |
| `cache-control-headers` | access | base | 1 |  |
| `response-latency-p95` | access | base | 1 |  |
| `status-code-accuracy` | access | base | 1 |  |
| `text-density-ratio` | access | base | 1 |  |
| `pagination-rel-links` | access | base | 1 | not yet probed |
| `link-header-canonical` | access | base | 1 |  |
| `dns-caa-record` | access | base | 1 | not yet probed |
| `security-headers-csp` | access | base | 1 |  |
| `security-txt-rfc9116` | access | base | 1 |  |
| `llms-full-txt-present` | access | bonus | 1 |  |
| `markdown-table-syntax` | access | base | 1 | not yet probed |
| `relative-link-resolution` | access | base | 1 | not yet probed |
| `image-alt-prose` | access | base | 1 | not yet probed |
| `plain-text-accessible` | access | base | 1 | not yet probed |
| `anti-crawler-challenge-free` | access | base | 2 |  |
| `robots-edge-consistency` | access | bonus | 0 |  |
| `llms-txt-graph-reachability` | access | bonus | 2 |  |
| `markdown-html-parity` | access | bonus | 2 |  |
| `crosspage-policy-consistency` | access | bonus | 2 |  |
| `nojs-fact-integrity` | access | bonus | 2 |  |
| `mcp-server-manifest` | usability | base | 2 |  |
| `mcp-tools-listing` | usability | base | 3 |  |
| `mcp-tools-focus` | usability | bonus | 3 | Docs archetype only (1-3 tools); skip for other archetypes. |
| `mcp-tools-breadth` | usability | base | 3 | Non-docs archetypes only (3+ tools); skip for docs. |
| `mcp-tools-schema-strict` | usability | base | 2 |  |
| `mcp-tools-readonly-hint` | usability | bonus | 2 |  |
| `mcp-tools-destructive-hint` | usability | bonus | 2 |  |
| `mcp-auth-requirement` | usability | base | 2 |  |
| `mcp-transport-streamable` | usability | base | 3 |  |
| `mcp-transport-sse` | usability | bonus | 2 |  |
| `mcp-app-registry` | usability | bonus | 4 | not yet probed |
| `mcp-apps-ui-quality` | usability | bonus | 4 | not yet probed |
| `mcp-view-csp` | usability | bonus | 4 | not yet probed |
| `mcp-prompts-listing` | usability | bonus | 1 |  |
| `mcp-resources-listing` | usability | bonus | 1 |  |
| `mcp-error-reporting` | usability | base | 2 |  |
| `mcp-protocol-version` | usability | base | 1 |  |
| `mcp-sampling-support` | usability | bonus | 0 | not yet probed |
| `mcp-roots-support` | usability | bonus | 0 | not yet probed |
| `mcp-logging-notifications` | usability | bonus | 0 |  |
| `auth-md-structure` | usability | bonus | 2 |  |
| `auth-md-stage-discover` | usability | bonus | 1 |  |
| `auth-md-stage-methods` | usability | bonus | 1 |  |
| `auth-md-stage-register` | usability | bonus | 1 |  |
| `auth-md-stage-claim` | usability | bonus | 1 |  |
| `auth-md-stage-exchange` | usability | bonus | 1 |  |
| `auth-md-stage-use` | usability | bonus | 1 |  |
| `auth-md-stage-errors` | usability | bonus | 1 |  |
| `auth-md-stage-revocation` | usability | bonus | 1 |  |
| `auth-md-walkthrough-simulation` | usability | bonus | 2 |  |
| `agent-auth-www-authenticate` | usability | bonus | 1 |  |
| `oauth-rfc8414-metadata` | usability | bonus | 2 |  |
| `oauth-rfc9728-prm` | usability | bonus | 2 |  |
| `auth-bearer-token-support` | usability | base | 2 |  |
| `auth-scoped-permissions` | usability | base | 1 |  |
| `webmcp` | usability | bonus | 5 |  |
| `webmcp-model-context` | usability | bonus | 2 |  |
| `webmcp-form-attributes` | usability | bonus | 2 |  |
| `api-operation-ids` | usability | base | 2 |  |
| `api-json-schemas` | usability | base | 2 |  |
| `api-error-schemas` | usability | base | 2 |  |
| `api-idempotency-keys` | usability | base | 2 |  |
| `api-rate-limit-headers` | usability | base | 2 |  |
| `api-curl-examples` | usability | base | 1 |  |
| `api-code-samples` | usability | base | 1 |  |
| `api-versioning-in-uri` | usability | base | 1 |  |
| `api-search-endpoint` | usability | base | 1 |  |
| `api-rfc7807-problem-details` | usability | base | 2 |  |
| `api-bulk-batch-operations` | usability | bonus | 1 | not yet probed |
| `api-pagination-cursor` | usability | base | 1 |  |
| `api-webhook-declarations` | usability | base | 1 |  |
| `api-openapi-3-1-strict` | usability | base | 1 |  |
| `api-sandbox-environment` | usability | bonus | 2 | not yet probed |
| `api-sdk-documentation` | usability | base | 1 | not yet probed |
| `api-graphql-schema` | usability | bonus | 1 | not yet probed |
| `api-grpc-reflection` | usability | bonus | 1 | not yet probed |
| `webmcp-js-registration` | usability | bonus | 2 |  |
| `mcp-wire-compatibility` | usability | bonus | 2 |  |
| `mcp-protocol-modern` | usability | bonus | 1 |  |
| `mcp-server-card` | usability | bonus | 1 |  |
| `mcp-tools-menu-size` | usability | bonus | 1 |  |
| `mcp-tools-schema-dialect` | usability | bonus | 1 |  |
| `mcp-auth-scope-challenge` | usability | bonus | 1 |  |
| `mcp-ssrf-guard` | usability | bonus | 2 | not yet probed; Deliberately not probed: it would require sending private-network URLs to the server. |
| `mcp-honest-schemas` | usability | bonus | 2 |  |
| `api-error-actionability` | usability | bonus | 2 | not yet probed |
| `acp-support` | payments | bonus | 3 |  |
| `acp-delegate-payment` | payments | bonus | 3 |  |
| `ucp-support` | payments | bonus | 3 |  |
| `ap2-support` | payments | bonus | 3 |  |
| `x402-support` | payments | bonus | 2 |  |
| `mpp-support` | payments | bonus | 2 | not yet probed; MPP detection is not implemented; this check never passes. |
<!-- catalog:end -->
