Web scorecard schema

A web scorecard is the structured output of the website agent-readiness audit. It scores a website and its MCP server across five visible categories with a fairness-driven two-score model: a check that does not apply to a site is excluded rather than counted against it, and a present-but-broken surface costs more than an absent one. This page documents every field a web scorecard carries.

The web scorecard is site-owned. Its schema_version is 0.2, independent of the CLI scorecard schema (currently 0.7) and of the agentnative spec spec_version. The CLI scorecard schema is documented separately at /scorecard-schema.

Top-level fields

{
  "schema_version": "0.2",
  "spec_version": "...",
  "target_url": "https://example.com/",
  "mcp_endpoint": "https://example.com/mcp",
  "mcp_discovery": [ ... ],
  "tool": { "name": "example.com", "url": "https://example.com/" },
  "audience": null,
  "audit_profile": null,
  "site_type": null,
  "summary": { ... },
  "coverage_summary": { ... },
  "score_pct": 81,
  "score": { "relative": 81, "global": 63 },
  "categories": [ ... ],
  "results": [ ... ]
}
FieldTypeSourceMeaning
schema_versionstringengineVersion of the web-scorecard envelope. Site-owned, independent of the CLI schema.
spec_versionstringengineVersion of the agentnative spec the run scored against. Same value the CLI scorecard carries.
target_urlstringengineThe normalized audited URL: scheme, host, and a trailing slash. Web-specific.
mcp_endpointstring | nullengineThe discovered MCP endpoint, or null when none was found. Web-specific.
mcp_discoveryarrayengineThe discovery trail: each well-known card or common-path probe attempted, and what it returned.
toolobjectengineWeb identity: { name, url }. No binary, install, tier, or language. See tool.
audiencenullengineAlways null for web targets; the audience classifier is a CLI concept.
audit_profilenullengineAlways null for web targets; audit profiles are a CLI concept.
site_typestring | nullengineThe declared site type the run scoped to: content, api, or null (everything ran).
summaryobjectderivedTally of check outcomes by status. See summary.
coverage_summaryobjectderivedMUST / SHOULD / MAY totals and how many were verified. See coverage_summary.
score_pctintegerderivedThe headline RELATIVE score, 0-100. Equals score.relative. See scoring.
scoreobjectderivedThe two-score pair { relative, global }. See scoring.
categoriesarrayderivedPer-category passed/counted rollups in display order. See categories.
resultsarray of result objengineOne entry per check. See results.

tool

Web identity. The CLI-only header fields (tier, language, repo, install) are absent on a web tool object.

"tool": { "name": "example.com", "url": "https://example.com/" }
FieldTypeMeaning
namestringThe audited domain (host), used as the display name.
urlstringThe normalized audited URL. Matches target_url.

The two-score model

Both scores derive from the same per-check outcomes; the engine computes them and consumers read the values straight from the JSON.

Per applicable check, with per-tier difficulty weights (currently 5 for MUST, 3 for SHOULD, 1 for MAY):

categories

Per-category rollups in the fixed display order. counted excludes n_a / skip / error rows, so a category with nothing applicable reads 0/0.

"categories": [
  { "id": "discoverability", "name": "Discoverability", "passed": 4, "counted": 5 },
  { "id": "content-for-agents", "name": "Content for agents", "passed": 7, "counted": 8 },
  { "id": "bot-crawl-policy", "name": "Bot & crawl policy", "passed": 3, "counted": 3 },
  { "id": "mcp-api", "name": "MCP & API", "passed": 6, "counted": 9 },
  { "id": "agent-discovery-auth", "name": "Agent discovery & auth", "passed": 3, "counted": 3 }
]

coverage_summary

How many checks applied at each keyword level and how many passed. n_a / skip / error checks are excluded from the totals.

"coverage_summary": {
  "must":   { "total": 2,  "verified": 2 },
  "should": { "total": 15, "verified": 9 },
  "may":    { "total": 10, "verified": 7 }
}

summary

A tally of every check by its final status.

"summary": { "pass": 23, "broken": 2, "absent": 4, "n_a": 7, "skip": 0, "error": 0 }

results

One object per check.

{
  "id": "llms-txt",
  "label": "/llms.txt present with a summary and link index",
  "category": "content-for-agents",
  "group": "P2",
  "layer": "web",
  "keyword": "should",
  "tier": "recommended",
  "principle": "P2",
  "status": "pass",
  "evidence": "https://example.com/llms.txt -> 200"
}
FieldTypeMeaning
idstringThe check id from the registry (e.g. llms-txt, mcp-initialize). The remediation-catalog and fix-skill key.
labelstringHuman-readable check title.
categorystringThe visible category slug (one of the categories[].id values). Drives the display grouping.
groupstringMirrors principle for shared-renderer compatibility.
layerstringAlways web for a web scorecard row.
keywordstringmust, should, or may, derived from the check's tier.
tierstringrequired, recommended, or optional (the keyword's source).
principlestringInternal principle tag P1 through P8. Kept as data; web surfaces neither display nor link it.
statusstringpass, broken, absent, n_a, skip, or error. broken = present but invalid; absent = not there. See statuses.
na_reasonstringPresent only on n_a rows: antecedent-unmet (the check does not apply to this site) or optional-absent (an applicable MAY not implemented).
evidencestring | nullA compact human-readable summary of what the probe observed.

Statuses

Remediation on the MCP surface

Scorecard rows carry no remediation; the fix guidance is assembled at read time. The audit_website MCP tool returns each row with a derived result line, and non-passing (broken / absent) rows additionally carry an inline remediation object:

"remediation": {
  "goal": "Publish an OpenAPI description so non-MCP agents can call your API",
  "fix": "Publish an OpenAPI 3.1 description at /openapi.json ...",
  "skill_url": "https://anc.dev/web-audit/skill/openapi",
  "resources": [{ "label": "OpenAPI 3.1", "url": "https://spec.openapis.org/oas/latest.html" }],
  "prompt": "Goal: ...\nIssue: <this run's evidence>\nFix: ...\nSkill: ...\nDocs: ..."
}

The same object is available by check id from get_web_remediation(check_id, evidence?), and each skill_url resolves to a fix-skill page with a markdown twin.

Evidence by probe type

Each check runs one of the probe handlers. The compact results[].evidence string is derived from the handler's structured evidence, which differs by handler:

Relationship to the CLI scorecard and the spec

The web scorecard is intentionally site-owned and not part of the agentnative spec. Formalizing the web shape into the spec is deferred until a second consumer exists. Until then, this page is the one published contract for the web scorecard JSON. The parallel CLI contract is /scorecard-schema.