Problem
The PyPI portion of .github/workflows/publish.yml is deliberately hardened: third-party Actions are pinned to immutable SHAs, PyPI uses Trusted Publishing/OIDC, and build provenance is attested.
The subsequent MCP Registry job breaks that same trust model:
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_...tar.gz" | tar xz mcp-publisher
chmod +x mcp-publisher
./mcp-publisher login github-oidc
./mcp-publisher publish
The job has id-token: write, yet it resolves releases/latest at runtime and immediately executes the downloaded binary without pinning its release identity or verifying its artifact digest/signature.
A new upstream release can therefore change the executable used by an unchanged ContextWeaver release workflow. That is inconsistent with the workflow's own immutable-dependency policy and creates unnecessary release-path supply-chain risk.
Goal
Make the MCP Registry publisher an immutable, reviewable dependency with artifact-integrity verification before it runs in an OIDC-authorized job.
Proposed changes
- Pin an explicit reviewed
mcp-publisher release version rather than releases/latest.
- Download the exact platform artifact for that version.
- Verify an upstream-published checksum/signature/provenance before extracting/executing it. If upstream does not publish a suitable verification artifact, record the expected SHA256 in the repository/workflow and update it through a reviewed dependency PR.
- Fail closed when verification cannot be completed.
- Keep GitHub OIDC authentication; do not replace it with a long-lived registry credential.
- Add a maintenance path (Dependabot-equivalent issue/automation or a documented periodic check) so the pin can be intentionally refreshed.
- Add an explicit
timeout-minutes to the registry publish job while touching the release path; its propagation retry loop is bounded internally but setup/download/auth should also have an outer ceiling.
Acceptance criteria
Non-goals
- Replacing the MCP Registry publisher implementation.
- Storing long-lived registry credentials.
- Removing the retry needed for PyPI metadata propagation.
Priority
P1 release/supply-chain hardening because this executes externally downloaded code in a job with federated publishing authority.
Problem
The PyPI portion of
.github/workflows/publish.ymlis deliberately hardened: third-party Actions are pinned to immutable SHAs, PyPI uses Trusted Publishing/OIDC, and build provenance is attested.The subsequent MCP Registry job breaks that same trust model:
The job has
id-token: write, yet it resolvesreleases/latestat runtime and immediately executes the downloaded binary without pinning its release identity or verifying its artifact digest/signature.A new upstream release can therefore change the executable used by an unchanged ContextWeaver release workflow. That is inconsistent with the workflow's own immutable-dependency policy and creates unnecessary release-path supply-chain risk.
Goal
Make the MCP Registry publisher an immutable, reviewable dependency with artifact-integrity verification before it runs in an OIDC-authorized job.
Proposed changes
mcp-publisherrelease version rather thanreleases/latest.timeout-minutesto the registry publish job while touching the release path; its propagation retry loop is bounded internally but setup/download/auth should also have an outer ceiling.Acceptance criteria
releases/latestresolution for an executable publisher.Non-goals
Priority
P1 release/supply-chain hardening because this executes externally downloaded code in a job with federated publishing authority.