From 6b7b8414e276690a883c780196289165e6ef2b06 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 23 Oct 2026 10:26:31 +0000 Subject: [PATCH 1/2] Fold the scan report into the server page The scan report repeated the server page's scanner rows with the same status, date and evidence; only the request transcript and the per-level counts were its own. The server page now prints the counts per level in its status panel and "What the scanner asked" after its feature tables. The scanner page carries how the summary is counted and lists every requirement the scanner does not check. /mcp/servers//scan/ forwards to the server page; scan.json stays. - ScanTranscript.astro replaces ScanReport.astro; scan.astro removed - matrix "scan" link opens the server page's #scan section - spec 017 amended (FR-007 to FR-009); README, architecture, scanner docs Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01TGqDwTwUQwBNWtbGzgXsYr --- README.md | 2 +- astro.config.mjs | 4 +- docs/architecture.md | 9 +- docs/scanner.md | 12 +- specs/017-neutral-scan-summary/spec.md | 15 + specs/017-neutral-scan-summary/tasks.md | 9 + src/components/MatrixPage.astro | 4 +- src/components/MatrixTable.astro | 8 +- src/components/ScanReport.astro | 384 ------------------ src/components/ScanTranscript.astro | 179 ++++++++ src/pages/mcp/scanner/index.astro | 34 +- src/pages/mcp/servers/[id].astro | 81 ++-- src/pages/mcp/servers/[id]/scan.astro | 151 ------- .../scanner.spec.ts/report-dark.png | Bin 42911 -> 0 bytes .../scanner.spec.ts/report-light.png | Bin 42627 -> 0 bytes .../scanner.spec.ts/report-phone.png | Bin 36885 -> 0 bytes tests/e2e/matrix.spec.ts | 8 +- tests/e2e/scanner.spec.ts | 97 ++--- 18 files changed, 347 insertions(+), 650 deletions(-) delete mode 100644 src/components/ScanReport.astro create mode 100644 src/components/ScanTranscript.astro delete mode 100644 src/pages/mcp/servers/[id]/scan.astro delete mode 100644 tests/e2e/__screenshots__/scanner.spec.ts/report-dark.png delete mode 100644 tests/e2e/__screenshots__/scanner.spec.ts/report-light.png delete mode 100644 tests/e2e/__screenshots__/scanner.spec.ts/report-phone.png diff --git a/README.md b/README.md index 8d26ec1..041a5ba 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ letsauth keeps one open dataset of what the agent protocols require and what rea | ๐Ÿ•ธ๏ธ | **[Agent auth atlas](https://letsauth.eu/standards/)** | The specifications, drafts and EU acts behind agent authorization as one map of what builds on, profiles, competes with and replaces what, with maturity and dated revisions per document. Export: [`data.json`](https://letsauth.eu/standards/data.json). | | ๐Ÿ”— | **[Delegation chain explorer](https://letsauth.eu/explorer/)** | Scenarios of how authority travels from a person to an agent to an API, step by step, with the decoded token at each hop and toggles for the attacks and misconfigurations that break the chain. Every step cites a specification revision. Export: [`data.json`](https://letsauth.eu/explorer/data.json). | | ๐Ÿฉป | **[Breach anatomy](https://letsauth.eu/breaches/)** | Published vulnerabilities and incidents in how agents were authorized, each written from its advisory and traced to the control that was missing, the atlas requirements that stand for it, and a replay toggle in the explorer. Export: [`data.json`](https://letsauth.eu/breaches/data.json). | -| ๐Ÿ” | **[Scanner](https://letsauth.eu/mcp/scanner/)** | A passive scanner that reads each listed server's public OAuth metadata every night, checks it against the MCP Authorization specification and opens one pull request of observations. Nothing is graded: the atlas shows each status, and every report counts them per requirement level; one report per server at `/mcp/servers//scan/` and `/mcp/servers//scan.json`. | +| ๐Ÿ” | **[Scanner](https://letsauth.eu/mcp/scanner/)** | A passive scanner that reads each listed server's public OAuth metadata every night, checks it against the MCP Authorization specification and opens one pull request of observations. Nothing is graded: the atlas shows each status, and each server page counts them per requirement level and lists the requests behind them; the raw report is at `/mcp/servers//scan.json`. | Next on the [roadmap](docs/roadmap.md): agents under EU rules, and a changelog generated from the data. diff --git a/astro.config.mjs b/astro.config.mjs index d2fa177..3bbd89d 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -24,7 +24,9 @@ export default defineConfig({ "/atlas/standards": "/standards", "/atlas/standards/[id]": "/standards/[id]", "/scanner": "/mcp/scanner", - "/scanner/[id]": "/mcp/servers/[id]/scan", + "/scanner/[id]": "/mcp/servers/[id]", + // the scan report was folded into the server page + "/mcp/servers/[id]/scan": "/mcp/servers/[id]", }, integrations: [svelte(), sitemap(), pagefind()], }); diff --git a/docs/architecture.md b/docs/architecture.md index 34a9792..3922485 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -52,12 +52,11 @@ that has no page of its own. ``` / home /mcp/ MCP auth atlas: the matrix for the current revision -/mcp/servers// one server; .json is its export -/mcp/servers//scan/ the scanner's report for that server; scan.json is its export +/mcp/servers// one server, with its newest passive scan; .json and scan.json are its exports /mcp/features// one requirement /mcp/revisions// the matrix as of an older revision (the current one redirects to /mcp/) /mcp/changes/// what changed between two revisions -/mcp/scanner/ what the scanner reads, how it reports, and every report +/mcp/scanner/ what the scanner reads, how it counts, and what it does not check /mcp/data.json the atlas export /standards/ Agent auth atlas: the standards map /standards// one specification @@ -91,7 +90,7 @@ scripts/ command-line entry points: validate-data, scan, scan-nightly, a and the generators for brand and README assets specs/ Spec Kit artifacts per feature: spec, plan, tasks, contracts src/ - components/ Astro components and the Svelte islands (matrix, standards map, explorer, scan report) + components/ Astro components and the Svelte islands (matrix, standards map, explorer, scan transcript) layouts/ Base (header, footer, theme) and Document (long-form pages); the shared page head and foot every page uses are in styles/global.css lib/ pure functions over the dataset: atlas matrix, standards graph, chains, exports, citations @@ -111,7 +110,7 @@ tests/ - **Astro 7** with strict TypeScript. Content is data-driven: the pages under `src/pages/atlas/`, `src/pages/explorer/` and `src/pages/scanner/` are generated from the dataset at build time. - **Svelte 5** islands only where interaction needs them: the matrix filters, the standards map - and the scan report. Every page reads fully without JavaScript, and no page ships more than + and the scan transcript. Every page reads fully without JavaScript, and no page ships more than 150 kB of compressed JavaScript. - **One design token system** in `src/styles/tokens.css`. Colours are OKLCH pairs resolved with `light-dark()`; `data-theme` only flips `color-scheme`. Type is Geist for headlines and diff --git a/docs/scanner.md b/docs/scanner.md index 7ea9501..e465bac 100644 --- a/docs/scanner.md +++ b/docs/scanner.md @@ -230,10 +230,12 @@ SHOULD 4 checks unsupported 3, unknown 1 MAY 2 checks unsupported 2 ``` -Under the counts, each level names the checks that are not supported, linked to their rows. The -levels are never added up into one number, and nothing on the site sorts servers by a scan. The -atlas matrix shows the cells themselves and a quiet "report" link next to each server name; the -server page shows how many checks ran and when. +The levels are never added up into one number, and nothing on the site sorts servers by a scan. +There is no report page of its own: the server page is where a scan shows. Its status panel +prints the counts and the date, the checks are rows of its feature tables (marked passive scan, +with the metadata each read), and "What the scanner asked" lists the requests behind them. The +atlas matrix shows the cells themselves and a quiet "scan" link next to each server name that +opens that section. `/mcp/servers//scan/` forwards to the server page; `scan.json` stays. `unknown` is counted as unknown, never as unsupported. A MUST the server may meet in either of two ways counts as supported when either way is supported, and as unknown while the other way is @@ -248,7 +250,7 @@ row. Deprecated requirements are counted under their own level. Servers whose `a There is no on-demand scanning. The site has no endpoint that accepts a URL, the scanner pages ship no JavaScript, and no visitor can cause a request to any server. A server owner who wants -to see their server's report asks for it to be listed; a contributor who wants fresh cells runs +to see their server's scan asks for it to be listed; a contributor who wants fresh cells runs `pnpm scan --write` and opens a pull request. ## Opting out diff --git a/specs/017-neutral-scan-summary/spec.md b/specs/017-neutral-scan-summary/spec.md index ae1a9d4..0398644 100644 --- a/specs/017-neutral-scan-summary/spec.md +++ b/specs/017-neutral-scan-summary/spec.md @@ -46,6 +46,21 @@ row already shows every status the grade was derived from. `open`, `notes`) and bumps `version` to 2. The nightly pull request's table and the `pnpm scan` output use the same summary. +## Amendment: the report folded into the server page + +The scan report page repeated the server page's scanner rows with the same status, date and +evidence; only the request transcript and the counts were its own. The report has no page of its +own any more: + +- **FR-007**: The server page MUST show the newest passive scan: the per-level counts and the + date in its status panel (FR-001, FR-005), and "What the scanner asked", the request transcript + (M12), after its feature tables, with the either-or notes of FR-002. The checks are its feature + rows; the ones not supported are the rows that say so, so the counts do not list them again. +- **FR-008**: The summary rule (FR-003) and the full list of requirements the scanner does not + check MUST be published on the scanner page; the server page links it. +- **FR-009**: `/mcp/servers//scan/` MUST forward to the server page. `scan.json` stays, and + the matrix link next to each server name (FR-004) opens the server page's scan section. + ## Success criteria - **SC-001**: No page, JSON file or scanner output contains a grade letter or the word "grade" diff --git a/specs/017-neutral-scan-summary/tasks.md b/specs/017-neutral-scan-summary/tasks.md index 9c3d343..a10b3cb 100644 --- a/specs/017-neutral-scan-summary/tasks.md +++ b/specs/017-neutral-scan-summary/tasks.md @@ -10,3 +10,12 @@ - [x] T08 Unit and e2e tests; `tests/unit/scanner-grade.test.ts` becomes `scanner-summary.test.ts` - [x] T09 Docs: `docs/scanner.md` "The summary", README, architecture, design (M12), development, data model, maintenance; 004 spec and report contract marked superseded; constitution 1.0.1 - [ ] T10 Screenshot baselines for the matrix, report and server pages: `refresh-screenshots` label on the pull request + +## Amendment: the report folded into the server page (FR-007 to FR-009) + +- [x] T11 `src/components/ScanTranscript.astro` replaces `ScanReport.astro`; `src/pages/mcp/servers/[id].astro` shows the counts in the status panel and the transcript after the feature tables +- [x] T12 `src/pages/mcp/servers/[id]/scan.astro` removed; `astro.config.mjs` forwards `/mcp/servers//scan/` (and the older `/scanner//`) to the server page +- [x] T13 `src/pages/mcp/scanner/index.astro`: "Where the results show" points at the server page; "What it does not check" lists every requirement +- [x] T14 Matrix link opens `#scan`; e2e tests move from the report page to the server page; report baselines removed +- [x] T15 Docs: README, architecture, scanner +- [ ] T16 Screenshot baselines for the matrix, scanner and server pages: `refresh-screenshots` label on the pull request diff --git a/src/components/MatrixPage.astro b/src/components/MatrixPage.astro index 606dc2c..a80755d 100644 --- a/src/components/MatrixPage.astro +++ b/src/components/MatrixPage.astro @@ -44,7 +44,7 @@ const usedLevels = new Set( const usedCategories = [...new Set(matrix.columns.map((f) => f.category))]; const hrefFor = (id: string) => (id === current.id ? "/mcp/" : `/mcp/revisions/${id}/`); -// the nightly scanner's view per server: its report is linked next to the name, never sorted on +// the nightly scanner's view per server: its requests are linked next to the name, never sorted on const scans = new Map(matrix.rows.map((s) => [s.id, latestScan(data, s, revisionId)])); const scannerChecks = passiveChecks(data, revisionId).length; @@ -194,7 +194,7 @@ const classWords = (counts: { value: string; count: number }[], label: RecordAS name the party the feature is observed on. The nightly scanner reads {scannerChecks} of these requirements from - public metadata; "report" next to a server's name opens what it asked and what it found. + public metadata; "scan" next to a server's name opens what it asked. Rows are alphabetical. Nothing here is scored or ranked.

diff --git a/src/components/MatrixTable.astro b/src/components/MatrixTable.astro index 0e41d4a..da68ffb 100644 --- a/src/components/MatrixTable.astro +++ b/src/components/MatrixTable.astro @@ -12,7 +12,7 @@ interface Props { diff?: RevisionDiff; /** * The nightly scanner's latest view per server id. A quiet link next to the server's name - * opens the report; the row's cells already show what the scan found, so nothing is added + * opens the requests behind it on the server page; the row's cells already show what the scan found, so nothing is added * here and nothing is a sort key. */ scans?: Map; @@ -210,11 +210,11 @@ const shortLabel = (id: string) => id.split(".").slice(2).join(".") || id; {scan && ( - {server.name} scan report + {server.name} scan )} @@ -513,7 +513,7 @@ const shortLabel = (id: string) => id.split(".").slice(2).join(".") || id; text-underline-offset: 0.2em; } - /* the row's own cells are the scan's result; this only opens the report behind them */ + /* the row's own cells are the scan's result; this only opens the requests behind them */ .matrix .scan-link { flex: none; font-size: var(--tiny); diff --git a/src/components/ScanReport.astro b/src/components/ScanReport.astro deleted file mode 100644 index 7bbcd14..0000000 --- a/src/components/ScanReport.astro +++ /dev/null @@ -1,384 +0,0 @@ ---- -/** - * The scan report (research R10): the summary (status counts per level, spec 017), the request - * ladder as a transcript (M12), then the checks as rows with a StatusCell each. Static HTML; the only script prints the ladder line by - * line once, and the page reads the same without it. - */ -import StatusCell from "@/components/StatusCell.astro"; -import type { LadderLine } from "@/lib/scanner"; -import type { Report } from "@/scanner/report"; - -interface Props { - report: Report; - /** The requests behind the evidence, in ladder order (`requestLadder`). */ - ladder: LadderLine[]; - /** The newest scanner observation date, for recorded reports. */ - scannedAt?: string; -} - -const { report, ladder, scannedAt } = Astro.props; - -const PARTY_LABEL: Record = { - "mcp-server": "MCP server", - "authorization-server": "Authorization server", -}; -const parties = ["mcp-server", "authorization-server"] as const; -const notScanned = !report.checks.some((c) => c.observedAt); -const { summary } = report; -const judged = report.checks.length; - -function splitEvidence(text: string): { url?: string; note: string } { - const m = text.match(/^(https:\/\/\S+)\s*(.*)$/s); - if (!m) return { note: text }; - return { url: m[1], note: (m[2] ?? "").replace(/^\u2014\s*/, "") }; -} ---- - -
-
-

What the scan found

- { - summary.state === "no-oauth" && - summary.notes.map((note) =>

{note}

) - } - { - notScanned ? ( -

- No passive scan recorded yet for this server. The nightly run adds one when it can read - the server's metadata; until then the atlas page shows what documentation says. -

- ) : summary.state !== "scanned" ? null : ( - <> -
- {summary.tallies.map((t) => ( -
-
- {t.level} - - {t.total} {t.total === 1 ? "check" : "checks"} - -
-
-
    - {t.counts.map((c) => ( -
  • - {" "} - {c.n} -
  • - ))} -
- {summary.open.some((c) => c.level === t.level) && ( -
    - {summary.open - .filter((c) => c.level === t.level) - .map((c) => ( -
  • - - {c.name} -
  • - ))} -
- )} -
-
- ))} -
- {summary.notes.map((note) => ( -

{note}

- ))} - - ) - } -
- - { - ladder.length > 0 && ( -
-

What the scanner asked

-

- The requests behind the evidence below, in the order the scanner makes them, each with - the newest answer this report records. None carries a credential or a message. -

-
    - {ladder.map((line, i) => ( -
  1. - {line.method} - {line.url} - {line.answer} - read {line.read.join(", ")} -
  2. - ))} -
  3. - - - {judged} checks, each with its status below - -
  4. -
-
- ) - } - - { - parties.map((party) => { - const rows = report.checks.filter((c) => c.party === party); - return ( - rows.length > 0 && ( -
-

{PARTY_LABEL[party]} requirements

-
    - {rows.map((c) => { - const ev = splitEvidence(c.evidence); - const observed = Boolean(c.observedAt); - return ( -
  • -
    -

    - {c.name} -

    - -
    -

    - - {c.level} - - {c.feature} - - {c.section} - - {c.observedAt ? ( - - ) : ( - not observed - )} -

    -

    - {ev.url ? ( - <> - - source - - {ev.note && {ev.note}} - - ) : ev.note ? ( - ev.note - ) : ( - "No scanner observation." - )} -

    -
  • - ); - })} -
-
- ) - ); - }) - } - -

- Judged against MCP Authorization {report.revision.revision} - { - scannedAt && ( - <> - ยท newest scanner observation - - ) - } - ยท method passive scan ยท {report.scanner} -

-
- - - - diff --git a/src/components/ScanTranscript.astro b/src/components/ScanTranscript.astro new file mode 100644 index 0000000..e5ba502 --- /dev/null +++ b/src/components/ScanTranscript.astro @@ -0,0 +1,179 @@ +--- +/** + * The passive scan of one server, on its server page (folded in from the old scan report): the + * request ladder as a transcript (M12), the counting notes the summary adds, and how to reproduce + * it. The checks themselves are the feature rows above it. Static HTML; the only script prints + * the ladder line by line once, and the page reads the same without it. + */ +import type { LadderLine, ScanView } from "@/lib/scanner"; +import { SCANNER_ID } from "@/scanner/version"; + +interface Props { + view: ScanView; + /** The requests behind the evidence, in ladder order (`requestLadder`). */ + ladder: LadderLine[]; +} + +const { view, ladder } = Astro.props; +const { server, summary } = view; +const repo = "https://github.com/letsauthlab/letsauth"; +--- + +
+

What the scanner asked

+ { + summary.state === "no-oauth" ? ( + summary.notes.map((note) =>

{note}

) + ) : !view.scanned || ladder.length === 0 ? ( +

+ No passive scan recorded yet for this server. The nightly run adds one when it can read the + server's metadata; until then the rows above show what documentation says. +

+ ) : ( + <> +

+ The requests behind the rows marked passive scan above, in the order the scanner makes + them, each with the newest answer recorded. None carries a credential or a message. +

+
    + {ladder.map((line, i) => ( +
  1. + {line.method} + {line.url} + {line.answer} + read {line.read.join(", ")} +
  2. + ))} +
  3. + + {view.checks.length} checks, read into the tables above +
  4. +
+ {summary.notes.map((note) => ( +

{note}

+ ))} + + ) + } +

+ { + view.scannedAt && ( + <> + Newest scanner observation ยท{" "} + + ) + } + {SCANNER_ID} ยท reproduce with pnpm scan {server.id} ยท{" "} + scan JSON ยท{" "} + data file ยท{" "} + how the scanner works +

+
+ + + + diff --git a/src/pages/mcp/scanner/index.astro b/src/pages/mcp/scanner/index.astro index 49ab209..9ac410a 100644 --- a/src/pages/mcp/scanner/index.astro +++ b/src/pages/mcp/scanner/index.astro @@ -144,7 +144,8 @@ const ladder = [ {SUMMARY_RULE.map((line) =>
  • {line}
  • )}

    - The summary belongs to one report at one time and is counted from the statuses shown. + The summary belongs to one server's newest scan and is counted from the statuses its + rows show. The atlas never sorts or ranks servers by it.

    @@ -156,9 +157,10 @@ const ladder = [

    The scanner has no list of its own. Its results live in the{" "} MCP auth atlas: the matrix cells are the latest observations, and - "report" next to each server name, like every server page, links to - the full report at /mcp/servers/<server>/scan/, which lists - each of the {checks.length} checks with the metadata it read. A server without a scanner + "scan" next to each server name opens that server's page. There the {checks.length} checks + are rows of the feature tables, marked passive scan with the metadata each one read; the + status panel counts them per requirement level, and "What the scanner asked" lists the + requests behind them with the answer each got. A server without a scanner observation reads "not scanned": the nightly run has not yet been able to read its metadata, or has not run since it was listed. Servers whose auth class is API key or no authentication read "no OAuth" and are not scanned; a server whose class is not yet @@ -186,15 +188,16 @@ pnpm scan notion --write # append what the nightly rule wouldWhat it does not check

    {unscanned.length} server-side requirements need a token, a scope or a reading of the - implementation and stay out of a passive scan: for example{" "} - {unscanned.slice(0, 3).map((f, i) => ( - <> - {i > 0 && ", "} - {f.name} - - ))}. Their cells come from documentation and manual checks until active probes exist for - verified owners. + implementation and stay out of a passive scan. Their cells come from documentation and + manual checks until active probes exist for verified owners.

    +
      + {unscanned.map((f) => ( +
    • + {f.name} {f.observable} +
    • + ))} +

    Opting out

    If you run a listed server and do not want it scanned,{" "} @@ -295,6 +298,13 @@ pnpm scan notion --write # append what the nightly rule would Math.round((n / columns.length) * 1000) / 10; const scanView = latestScan(data, server); +const ladder = requestLadder(scanView); const access = accessOf(server); const auth = authOf(server); const classes = [ @@ -194,28 +197,34 @@ const classes = [ ))} -

    - Passive scan - {scanView.scanned ? ( - <> - - {scanView.summary.state === "scanned" - ? `${scanView.checks.length} checks` - : scanView.summary.label} - - {" ยท "} - - {" ยท "} - Report - - ) : ( - <> - not scanned yet - {" ยท "} - Report - +

    +

    + Passive scan + {scanView.scanned ? ( + <> + + {" ยท "} + Requests + + ) : ( + <> + {scanView.summary.state === "no-oauth" ? "no OAuth to check" : "not scanned yet"} + {" ยท "} + Why + + )} +

    + {scanView.summary.tallies.length > 0 && ( +
      + {scanView.summary.tallies.map((t) => ( +
    • + {t.level} + {tallyLine(t).slice(t.level.length + 1)} +
    • + ))} +
    )} -

    +

    Contribute a correction @@ -341,6 +350,8 @@ const classes = [ ); })} + + ) } @@ -433,20 +444,38 @@ const classes = [ vertical-align: baseline; } .scan { - display: flex; - flex-wrap: wrap; - align-items: baseline; - gap: var(--space-2); font-size: var(--small); margin: 0 0 var(--space-4); padding-top: var(--space-3); border-top: 1px solid var(--rule); } + .scan__head { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: var(--space-2); + margin: 0; + } .scan__label { font-size: var(--tiny); font-weight: 500; color: var(--ink-2); } + .scan__tally { + list-style: none; + padding: 0; + margin: var(--space-2) 0 0; + display: grid; + gap: var(--space-1); + } + .scan__tally li { + display: grid; + grid-template-columns: 5.5rem 1fr; + align-items: baseline; + } + .scan__tally .level { + justify-self: start; + } .actions { margin: 0; } diff --git a/src/pages/mcp/servers/[id]/scan.astro b/src/pages/mcp/servers/[id]/scan.astro deleted file mode 100644 index c17bab9..0000000 --- a/src/pages/mcp/servers/[id]/scan.astro +++ /dev/null @@ -1,151 +0,0 @@ ---- -import Crumbs from "@/components/Crumbs.astro"; -import ScanReport from "@/components/ScanReport.astro"; -import Base from "@/layouts/Base.astro"; -import { getDataset } from "@/lib/data"; -import { latestScan, reportFromView, requestLadder, unscannedFeatures } from "@/lib/scanner"; -import { SUMMARY_RULE } from "@/scanner/summary"; -import type { Server } from "@/schema"; - -export function getStaticPaths() { - return getDataset().servers.map((server) => ({ params: { id: server.id }, props: { server } })); -} - -const { server } = Astro.props as { server: Server }; -const data = getDataset(); -const view = latestScan(data, server); -const report = reportFromView(view, "1970-01-01T00:00:00Z"); -const ladder = requestLadder(view); -const unscanned = unscannedFeatures(data); -const repo = "https://github.com/letsauthlab/letsauth"; ---- - - -

    - -
    -

    Scan report

    -

    {server.name}

    -

    - {server.url} against MCP Authorization {view.revisionId} - {view.scannedAt && ( - - {" "}ยท newest scanner observation - - )} -

    -

    - Atlas page - {!server.withdrawn && JSON} - Data file -

    -
    - - { - server.withdrawn ? ( -
    -

    Withdrawn from the atlas

    -

    - This server was withdrawn on {" "} - and is not scanned. Reason given: {server.withdrawn.reason}. -

    -
    - ) : ( - <> - - -
    -
    -

    How the summary is counted

    -
      {SUMMARY_RULE.map((line) =>
    1. {line}
    2. )}
    -

    - Counted from the statuses above at build time; never used to sort or rank - servers. About the scanner. -

    -
    -
    -

    Not checked by the scanner

    -

    - These requirements need a token, a scope or a reading of the implementation. Their cells on the atlas page{" "} - come from documentation and manual checks. -

    -
      - {unscanned.map((f) => ( -
    • - {f.name} - {f.observable} -
    • - ))} -
    -
    -
    -
    -

    - Reproduce this report: pnpm scan {server.id} in the{" "} - repository. Corrections are new observations, never - edits; see docs/scanner.md. -

    -
    - - ) - } -
    - - - diff --git a/tests/e2e/__screenshots__/scanner.spec.ts/report-dark.png b/tests/e2e/__screenshots__/scanner.spec.ts/report-dark.png deleted file mode 100644 index 3d8ed2bf408121e69869a352a2a3ad63a8b4691d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42911 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 diff --git a/tests/e2e/__screenshots__/scanner.spec.ts/report-light.png b/tests/e2e/__screenshots__/scanner.spec.ts/report-light.png deleted file mode 100644 index ec1b9ba77e8c782e800db889183bd5f9dd37e369..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42627 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�+I2F#i@*&!k>2JBQaBm(+d90#RL z7%8}2?He`w&MY=x2I#MvKM_KpZocRduOt{|q6#$jp3mPVf8$~Ra|2b-S%ZggH6EY+ z>inUSLc%zMjtUG2 z@4gA#aEpW?7bKCX1jRVZ2BOJ_-b0PUt8_cE50Yt)*euz>Tw8i}{2OmxuLhp>vfiyd zS98aZI%nc{`#?JS8!d8K7xM0~)msS~-c%g;+^xQ3-NtX~w5~Ehtqh^JxR2+J`pOi3 z+sM$Z{&}Cu%gj8;f^_)AO?|t#4mAG(7Unz-e?(@`D#`D?R0%et?ZXbe=n$j zCt9v%Z6k0YH8Mamgj?__pUk=SpzM$ozXhrWE*@_!r%DCrtDjkQ(}`)?iMiA1R^>kC zJ5)i<<*zG&bs%>unrhHK8vGLE@9ey~=QmmV>#mMB5K`u8YZz+1?fYsU&0(q7Ae{#GW$$tusjql}fr=}oC19zfbwCb^;+_Wbw>4q+&IV7%X# zNSdLhpH+W?83eZ6bB$VKJ4&LSId^{pdUyZKbrlP!KmO_$H8Ej{`A3*y7v9^X{nVCB zmcy@jPuRR!n)P?)!Nf-W7~O@KP}!PZ!=Y2~c3&m_{_Zu&cw zV63(51G!A@U_S$IWuoC)_|_<|biU){ClSRS1Z$+iLwxAce2w$Pv0{W{K&A1Xh+?m_ z^W5@{>;H6Klqz^d6%b+Y=I2@`nP~ zdWLUNP`fSG7cEn_SPoqfH&XFp?kGv&Q?28jA!AM&_7l~1;!q7_>?J>C-&>!AEPhYayRvoOzi2EBh{Cxr9R2a&Jb~VVW1!U%3){^4VN?K(O=?Z)ZD`a3(p4Gn7H9D2qm}U zb&!oBJG1B7=&(@k7ddN0tuR(X`NMdMQX`+`GVGqD-cc+qS({h-I?fLCCDrf(9aAz` z|2HU`maREhZBfrKm6i#Vs~aHd2dt3q$uC_EWgK_VQVT(_HMEYoxOrv~r% z2+cCNwlYN+uRee8uo2gbktFSik)UC1NWN3P>c*`_YC~uvOKMT_`)-b`RoK~7i7wq_ ztqwMFfMRd;g*^kd`a7wP*PLIRmwqA)u%D0LpXKD&bQSWP`NuIC@iu&@Q_UDj+`nG0 zJNb8&n45}jVm1}6at-ni$C_i4n|KDihpwT}i%}w@XloR?zT@nODdUcaAO3p*!{n{t z_?3qSJNDez^AJPCs(wk0PDEl2LZy2HXAhO8*lqCEwj8voGn4p3x6u1 z55I5%hsMCzS<5hX8mY8jzc34jE#!H!z0D+(h3s##-%oUcJJuW~0<5pMd9xOW%cGnx z;Gn86KmF}r+QN=VU%nZXTe$Rte!estmn*7TqNvx9fx;wZPlt14$aVdQw6w(Y((8M3 z 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 diff --git a/tests/e2e/matrix.spec.ts b/tests/e2e/matrix.spec.ts index 60fd3ef..18b3ad6 100644 --- a/tests/e2e/matrix.spec.ts +++ b/tests/e2e/matrix.spec.ts @@ -183,18 +183,16 @@ test.describe("matrix page (US1)", () => { await expect(page.locator("#matrix")).not.toContainText(/score|rank/i); }); - test("each server links its latest scan report and shows no grade (017 FR-004)", async ({ - page, - }) => { + test("each server links its latest scan and shows no grade (017 FR-004)", async ({ page }) => { await page.goto("/mcp/"); const links = page.locator("#matrix tbody th[scope='row'] a.scan-link"); await expect(links).toHaveCount(matrix.rows.length); for (const server of matrix.rows.slice(0, 5)) { const scan = latestScan(data, server, revision.id); const link = page.locator(`#matrix tbody tr[data-server="${server.id}"] a.scan-link`); - await expect(link).toHaveAttribute("href", `/mcp/servers/${server.id}/scan/`); + await expect(link).toHaveAttribute("href", `/mcp/servers/${server.id}/#scan`); await expect(link).toHaveAttribute("data-scan", scan.summary.state); - await expect(link).toHaveAccessibleName(`${server.name} scan report`); + await expect(link).toHaveAccessibleName(`${server.name} scan`); } await expect(page.locator("#matrix [data-grade]")).toHaveCount(0); }); diff --git a/tests/e2e/scanner.spec.ts b/tests/e2e/scanner.spec.ts index bd3ba3d..8d9a3ad 100644 --- a/tests/e2e/scanner.spec.ts +++ b/tests/e2e/scanner.spec.ts @@ -1,12 +1,11 @@ import { expect, type Page, test } from "@playwright/test"; import { getDataset } from "../../src/lib/data"; -import { passiveChecks, requestLadder, scannerIndex } from "../../src/lib/scanner"; +import { requestLadder, scannerIndex, unscannedFeatures } from "../../src/lib/scanner"; import { SUMMARY_RULE } from "../../src/scanner/summary"; import { expectEndStateUnderReducedMotion, expectNoSeriousA11yViolations } from "./helpers"; const data = getDataset(); const views = scannerIndex(data); -const checks = passiveChecks(data); const scanned = views.find((v) => v.scanned); const unscanned = views.find((v) => !v.scanned); const first = views[0]; @@ -33,11 +32,9 @@ test.describe("scanner index (US2)", () => { await expect(page.locator("#scanner-index")).toHaveCount(0); await expect(page.locator("table tr[data-server]")).toHaveCount(0); const where = page.locator("[aria-labelledby='where-title']"); - for (const name of ["MCP auth atlas", "server page"]) { - const link = where.getByRole("link", { name, exact: true }); - await expect(link).toBeVisible(); - await expect(link).toHaveAttribute("href", "/mcp/"); - } + const link = where.getByRole("link", { name: "MCP auth atlas", exact: true }); + await expect(link).toBeVisible(); + await expect(link).toHaveAttribute("href", "/mcp/"); await expect(page.locator("[data-nightly]")).toHaveCount(2); }); @@ -62,7 +59,7 @@ test.describe("scanner index (US2)", () => { }); test("has no horizontal page scroll down to 320px (SC-007)", async ({ page }) => { - for (const path of ["/mcp/scanner/", `/mcp/servers/${(scanned ?? first).server.id}/scan/`]) { + for (const path of ["/mcp/scanner/", `/mcp/servers/${(scanned ?? first).server.id}/`]) { for (const width of [320, 412]) { await page.setViewportSize({ width, height: 900 }); await page.goto(path); @@ -76,7 +73,7 @@ test.describe("scanner index (US2)", () => { }); test("offers no way to start a scan from the site (no on-demand scanning)", async ({ page }) => { - for (const path of ["/mcp/scanner/", `/mcp/servers/${first.server.id}/scan/`]) { + for (const path of ["/mcp/scanner/", `/mcp/servers/${first.server.id}/`]) { await page.goto(path); await expect(page.locator("main form, main input, main button")).toHaveCount(0); await expect(page.getByRole("button", { name: /scan/i })).toHaveCount(0); @@ -90,6 +87,11 @@ test.describe("scanner index (US2)", () => { await expect(lines.filter({ hasText: "POST" })).toHaveCount(1); }); + test("lists every requirement the scanner does not check", async ({ page }) => { + await page.goto("/mcp/scanner/"); + await expect(page.locator(".unscanned li")).toHaveCount(unscannedFeatures(data).length); + }); + test("has no serious accessibility violations and looks right", async ({ page }) => { await page.goto("/mcp/scanner/"); await expectNoSeriousA11yViolations(page); @@ -98,21 +100,24 @@ test.describe("scanner index (US2)", () => { }); }); -test.describe("scan report page (US2)", () => { - test("shows one row per passive check with level, status and evidence (FR-009)", async ({ +test.describe("scan on the server page (US2)", () => { + test("the old report address forwards to the server page", async ({ page }) => { + await page.goto(`/mcp/servers/${first.server.id}/scan/`); + await expect(page).toHaveURL(new RegExp(`/mcp/servers/${first.server.id}/$`)); + }); + + test("the status panel counts the checks per level and links the requests (017 FR-005)", async ({ page, }) => { test.skip(!scanned, "no server with a scanner observation in the dataset yet"); - await page.goto(`/mcp/servers/${scanned?.server.id}/scan/`); - const rows = page.locator("[data-report] [data-check]"); - await expect(rows).toHaveCount(checks.length); - await expect(page.locator("[data-report] [data-summary='scanned'] .tally > div")).toHaveCount( - scanned?.summary.tallies.length ?? 0, - ); - const row = rows.first(); - await expect(row.locator(".level")).toHaveCount(1); - await expect(row.locator(".status-cell")).toHaveCount(1); - await expect(row.locator(".evidence")).toHaveCount(1); + await page.goto(`/mcp/servers/${scanned?.server.id}/`); + const line = page.locator("[data-scan='scanned']"); + await expect(line.locator(".scan__tally li")).toHaveCount(scanned?.summary.tallies.length ?? 0); + for (const t of scanned?.summary.tallies ?? []) { + await expect(line.locator(`[data-level="${t.level}"]`)).toContainText(t.level); + } + await expect(line.locator("a[href='#scan']")).toBeVisible(); + await expect(page.locator("#scan")).toBeVisible(); await expect(page.locator("#not-scanned")).toHaveCount(0); }); @@ -120,31 +125,18 @@ test.describe("scan report page (US2)", () => { page, }) => { test.skip(!unscanned, "every server has a scanner observation"); - await page.goto(`/mcp/servers/${unscanned?.server.id}/scan/`); - await expect(page.locator("#not-scanned")).toBeVisible(); - await expect(page.locator("[data-report] .tally")).toHaveCount(0); - const rows = page.locator("[data-report] [data-check]"); - await expect(rows).toHaveCount(checks.length); - await expect(page.locator("[data-report] [data-check][data-status='unsupported']")).toHaveCount( - 0, - ); - await expect(page.locator("[data-report] [data-check][data-status='unknown']")).toHaveCount( - checks.length, - ); + await page.goto(`/mcp/servers/${unscanned?.server.id}/`); + await expect(page.locator("[data-scan='not-scanned']")).not.toContainText(/unsupported/i); + await expect(page.locator("#scan")).not.toContainText(/unsupported/i); await expect(page.locator("[data-transcript]")).toHaveCount(0); }); - test("links the atlas, the server page, the JSON and how the summary is counted", async ({ - page, - }) => { - await page.goto(`/mcp/servers/${first.server.id}/scan/`); - await expect(page.locator(".crumbs a[href='/mcp/']")).toBeVisible(); - await expect(page.locator(`.crumbs a[href='/mcp/servers/${first.server.id}/']`)).toBeVisible(); - await expect(page.locator(`a[href="/mcp/servers/${first.server.id}/"]`).first()).toBeVisible(); - await expect( - page.locator(`a[href="/mcp/servers/${first.server.id}/scan.json"]`).first(), - ).toBeVisible(); - await expect(page.locator("#rule-title")).toBeVisible(); + test("links the scan JSON and how the scanner works", async ({ page }) => { + await page.goto(`/mcp/servers/${first.server.id}/`); + const scan = page.locator("#scan"); + await expect(scan.locator(`a[href="/mcp/servers/${first.server.id}/scan.json"]`)).toBeVisible(); + await expect(scan.locator("a[href='/mcp/scanner/']")).toBeVisible(); + await expect(scan).toContainText(`pnpm scan ${first.server.id}`); const response = await page.request.get(`/mcp/servers/${first.server.id}/scan.json`); expect(response.ok()).toBe(true); const body = await response.json(); @@ -152,21 +144,18 @@ test.describe("scan report page (US2)", () => { expect(body.grade).toBeUndefined(); expect(body.summary.state).toBe(first.summary.state); expect(body.recorded).toBe(true); - expect(body.checks).toHaveLength(checks.length); + expect(body.checks).toHaveLength(first.checks.length); }); - test("has no serious accessibility violations and looks right", async ({ page }) => { - await page.goto(`/mcp/servers/${first.server.id}/scan/`); + test("has no serious accessibility violations once the ladder has printed", async ({ page }) => { + test.skip(!scanned, "no server with a scanner observation in the dataset yet"); + await page.goto(`/mcp/servers/${scanned?.server.id}/`); + await page.locator("[data-ladder]").scrollIntoViewIfNeeded(); // contrast is judged on the end state, not on a ladder line still fading in (M12) await page.waitForFunction(() => document.getAnimations().every((a) => a.playState !== "running"), ); await expectNoSeriousA11yViolations(page); - await hideNightlyData(page); - await expect(page).toHaveScreenshot("report.png", { - fullPage: false, - mask: [page.locator("[data-report]")], - }); }); test("transcript lists every recorded request with method, URL, status and what was read (M12)", async ({ @@ -178,7 +167,7 @@ test.describe("scan report page (US2)", () => { // static HTML: the lines are there without JavaScript const context = await browser.newContext({ javaScriptEnabled: false }); const page = await context.newPage(); - await page.goto(`/mcp/servers/${scanned.server.id}/scan/`); + await page.goto(`/mcp/servers/${scanned.server.id}/`); const lines = page.locator("[data-transcript] [data-request]"); await expect(lines).toHaveCount(ladder.length); for (const [i, line] of ladder.entries()) { @@ -200,7 +189,7 @@ test.describe("scan report page (US2)", () => { page, }) => { test.skip(!scanned, "no server with a scanner observation in the dataset yet"); - await page.goto(`/mcp/servers/${scanned?.server.id}/scan/`); + await page.goto(`/mcp/servers/${scanned?.server.id}/`); const ladder = page.locator("[data-ladder]"); await ladder.scrollIntoViewIfNeeded(); await expect(ladder).toHaveAttribute("data-play", ""); @@ -224,7 +213,7 @@ test.describe("scan report page (US2)", () => { test("under reduced motion the ladder shows in full at once (M12)", async ({ page }) => { test.skip(!scanned, "no server with a scanner observation in the dataset yet"); - await page.goto(`/mcp/servers/${scanned?.server.id}/scan/`); + await page.goto(`/mcp/servers/${scanned?.server.id}/`); await expectEndStateUnderReducedMotion(page, "[data-ladder]"); await expect(page.locator("[data-ladder]")).not.toHaveAttribute("data-armed", ""); await expect(page.locator("[data-verdict]")).toHaveCSS("opacity", "1"); From adaa5440e175ed043e87e7a17344c8eabc6cd69d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 23 Oct 2026 10:34:41 +0000 Subject: [PATCH 2/2] Scan a11y test: wait for the ladder to finish printing before axe runs On the server page the ladder sits below the fold, so the check could run before the ladder started and catch a line mid-fade. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01TGqDwTwUQwBNWtbGzgXsYr --- tests/e2e/scanner.spec.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/e2e/scanner.spec.ts b/tests/e2e/scanner.spec.ts index 8d9a3ad..e80c902 100644 --- a/tests/e2e/scanner.spec.ts +++ b/tests/e2e/scanner.spec.ts @@ -150,8 +150,12 @@ test.describe("scan on the server page (US2)", () => { test("has no serious accessibility violations once the ladder has printed", async ({ page }) => { test.skip(!scanned, "no server with a scanner observation in the dataset yet"); await page.goto(`/mcp/servers/${scanned?.server.id}/`); - await page.locator("[data-ladder]").scrollIntoViewIfNeeded(); - // contrast is judged on the end state, not on a ladder line still fading in (M12) + const ladder = page.locator("[data-ladder]"); + await ladder.scrollIntoViewIfNeeded(); + // contrast is judged on the end state, not on a ladder line still fading in (M12): wait + // until the ladder has started printing, then until its last line has finished + await expect(ladder).toHaveAttribute("data-play", ""); + await expect(page.locator("[data-verdict]")).toHaveCSS("opacity", "1"); await page.waitForFunction(() => document.getAnimations().every((a) => a.playState !== "running"), );