Skip to content

v1.7.0

Choose a tag to compare

@a-akimov a-akimov released this 19 Aug 13:26
9d38301

Fixed

  • stdio audits now probe the stateless MCP 2026-07-28 lifecycle. Seven
    transport-independent JSON-RPC probes run on one short-lived, no-handshake
    process through the SDK's cross-platform stdio transport; the five
    HTTP-specific probes remain not applicable. A
    dual-era stdio server is therefore reported and scored as dual-era instead
    of being assigned an unavoidable protocol_version_latest failure and a
    misleading readiness result based only on unprobed checks.
  • protocol_version_latest now judges observed lifecycle support. A legacy
    handshake capped at 2025-11-25 passes when gateway probes demonstrate
    2026-07-28 support, fails when those probes explicitly reject it, and skips
    when the modern gateway could not be observed.
  • Readiness summaries disclose skipped checks. The CLI qualifies a readiness
    fraction with the number of checks assessed whenever any were skipped, and
    JSON reports expose readiness.assessed, readiness.skipped, and
    readiness.total.

Changed

  • A partial audit no longer prints a bare N/N. An auth-gated server with a
    correct authorization posture scores 25/25, which read as a perfect result:
    the caveat printed above it does not travel when someone screenshots or pastes
    the number. The score line now carries the qualifier and the check count
    itself:

    Audit finished. PARTIAL score: 25/25 from 9 of 68 checks — not comparable to a full audit.
    

    The count is main-axis on both sides, matching the score it qualifies;
    readiness reports its own totals on its own line. Full audits are unchanged —
    they still print Audit finished. Final score: N/M.

Added

  • --package: score an npm or PyPI package without running it. Half the MCP
    registry — 9,832 of 20,016 active servers in the 2026-08 crawl — ships as a
    package and speaks stdio, with no URL to point an auditor at.
    mcpscore --package npm:@scope/server, --package npm:name@1.2.3 and
    --package pypi:name==1.2.3 fetch the registry's published metadata and score
    how the server is packaged: whether it resolves, whether a pinned version
    exists, whether the release has been withdrawn (PyPI yank / npm deprecate),
    and whether it declares a source repository, a license and a description.

    The package is never downloaded and never executed — no tarball, no wheel,
    no install hook — so this is safe to run against anything, including packages
    you have not reviewed. It therefore says nothing about whether the server
    speaks MCP correctly; run the server with --stdio for that.

    No credential ever reaches a package registry. The fetch builds a bare
    request and disables client auth, so a caller's Authorization, cookies and
    custom headers cannot follow an audit to npm or PyPI — a guarantee that holds
    even when an authenticated client is passed in. The response is read with a
    hard size cap applied while streaming, so an oversized or endless document
    is refused rather than buffered.

    Six new rules in a packaging group. They are the only rules a package
    audit runs, and no server audit runs any of them: the two judge different
    targets, so their scores share no denominator and existing reports are
    unchanged. A dry run against 120 packages listed in the MCP registry measured
    pass rates of 100% (resolves), 99% (version resolves), 95% (not withdrawn),
    93% (license), 83% (repository) and 100% (description) — the pack is lenient
    by design at this stage, with the source-repository check the main
    discriminator. The JSON report gains a package block whose executed: false
    records what the score is and is not based on.