Skip to content

feat(release): ship MCPB bundles and publish them to the MCP Registry (#1246) - #1547

Merged
DeusData merged 2 commits into
mainfrom
feat/mcpb-bundles
Aug 11, 2026
Merged

feat(release): ship MCPB bundles and publish them to the MCP Registry (#1246)#1547
DeusData merged 2 commits into
mainfrom
feat/mcpb-bundles

Conversation

@DeusData

Copy link
Copy Markdown
Owner

Implements the MCPB half of discussion #1246: every release now ships .mcpb one-click-install bundles, and our MCP Registry entry advertises them with per-file SHA-256.

What ships

  • scripts/package-release.sh (the canonical packaging step) builds codebase-memory-mcp-<target>.mcpb for darwin arm64/amd64, windows amd64/arm64, and the static linux builds — manifest.json + the same staged (stripped, composition-gated) binary + LICENSE + third-party notices. The glibc-dynamic linux targets stay archive-only: a dynamic binary defeats the one-click promise.
  • Release pipeline: bundles flow through provenance attestation, checksums.txt, cosign signing, and the release asset list. The verify job's canonical scan matrix grows from 8 to 14 containers, and MCPB manifests are structurally validated (parse, binary server type, entry_point is a member, command binds the entry point). Bundle binaries are byte-identical to the archive binaries, so the VirusTotal scan set dedupes them — the only new scan objects are the three distinct manifest.json files.
  • publish-mcp-registry: a new scripts/ci/gen-mcpb-registry-entries.sh appends one mcpb package entry per bundle (release-asset URL + fileSha256 from the attested checksums, delivered as a same-run workflow artifact) to server.json before mcp-publisher publish. Idempotent on re-runs; a checksums file without bundles is a hard failure rather than a silent un-listing.

Verification

  • Three contracts, each proven RED without the change: Step 0o pins the bundle shape at its single producer on every leg; Step 0p pins the registry entries against the live server.json; the extractor contract covers the 14-container matrix including broken-manifest fail-closed cases.
  • Full local 3-OS ladder green on this tree: macOS 7433/0, Linux (arm64 container) 7271/0, real ARM64 Windows VM all green — contracts included on every leg.
  • The Linux test image gains zip for the packager (the only new tool dependency; the registry-entries generator is pure python3).

The registry mcpb package type requires GitHub-release hosting, a fileSha256 per artifact, and "mcp" in the URL — all satisfied here (clients verify the hash before installation). The end-to-end publish path proves out on the next stable release.

OCI (the other open item from #1246) is intentionally not part of this PR.

…#1246)

Every release now carries .mcpb one-click-install bundles alongside the
archives, and the MCP Registry entry lists them with per-file sha256:

- package-release.sh (canonical) builds codebase-memory-mcp-<target>.mcpb
  for darwin/windows and the STATIC linux builds — manifest.json + the same
  staged (stripped, gated) binary + LICENSE + THIRD_PARTY_NOTICES.md. The
  glibc-dynamic linux targets stay archive-only: a dynamic binary defeats
  the one-click promise.
- _build.yml / release-draft: bundles flow through provenance attestation,
  checksums.txt, cosign signing and the release asset list; checksums.txt
  is also preserved as a same-run artifact for the registry job.
- verify: the canonical scan matrix grows to 14 containers; MCPB manifests
  are validated (parse, binary server, entry_point member, command binds
  the entry point). Bundle binaries dedupe to the archive scan objects, so
  the VT gate gains only the three distinct manifest.json files.
- publish-mcp-registry: gen-mcpb-registry-entries.sh appends one mcpb
  package entry per bundle (release-asset URL + fileSha256 from the
  attested checksums) to server.json before mcp-publisher runs.
  Idempotent; a checksums file without bundles is a hard failure.
- contracts: Step 0o pins the bundle shape at its producer on every leg,
  Step 0p pins the registry entries against the live server.json, and the
  extractor contract covers the 14-container matrix incl. broken-manifest
  fail-closed cases. The linux test image gains zip for the packager.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
core.filemode=false hid the +x here, and release.yml invokes the
registry-entries generator directly — a 644 mode would fail the publish
job the first time it runs.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
@DeusData
DeusData merged commit b7f69d1 into main Aug 11, 2026
61 of 63 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant