v1.7.0
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 unavoidableprotocol_version_latestfailure and a
misleading readiness result based only on unprobed checks. protocol_version_latestnow judges observed lifecycle support. A legacy
handshake capped at2025-11-25passes when gateway probes demonstrate
2026-07-28support, 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 exposereadiness.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 scores25/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 printAudit 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.3and
--package pypi:name==1.2.3fetch 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--stdiofor that.No credential ever reaches a package registry. The fetch builds a bare
request and disables client auth, so a caller'sAuthorization, 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
packaginggroup. 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 apackageblock whoseexecuted: false
records what the score is and is not based on.