feat(cli): official CLI container image + MCP registry entry (2-E4 PR A+B) - #1228
Open
Manuel-Jentic wants to merge 2 commits into
Open
Manuel-Jentic wants to merge 2 commits into
Manuel-Jentic wants to merge 2 commits into
Conversation
… entry The jentic-one half of 2-E4 (#1214), scheduled against the 20 Sep 2026 hosted-MCP sunset: a from-source, multi-arch CLI image and an official MCP registry entry that tracks every release automatically. - deploy/docker/cli.Dockerfile: multi-stage build of the jentic CLI (cross-compiled on the build platform, Ubuntu runtime matching the app images), implementing Recipe 3's container contract (non-root uid 10001, HOME=/home/jentic, pre-owned ~/.config/jentic for named-volume seeding) and carrying the io.modelcontextprotocol.server.name label the registry's OCI ownership verification checks. - release.yml publish-cli-image: mirrors publish-image step-for-step (needs gate+smoke, per-arch Trivy before any push, login after all installers, cosign keyless + syft SBOM by index digest, :latest last on stable tags) plus a pre-push gate asserting jentic --version == tag and label == server.json name; the release job now needs both publish jobs so a release never half-ships. - cli/server.json (schema 2025-12-11): one.jentic/jentic with the OCI package; version-stamped and published by the new publish-registry job running last in the DAG via mcp-publisher login dns (secret: MCP_REGISTRY_ED25519_KEY), stable tags only. - ci.yml mcp-registry-validate: mcp-publisher validate drift gate on PRs touching cli/server.json, wired into ci-status. - docs: Recipe 3 now points at ghcr.io/jentic/jentic-one-cli with the BYO image kept as a fallback. Co-authored-by: Cursor <cursoragent@cursor.com>
…gistry publish, hardened gates Review fixes for the 2-E4 CLI image + MCP registry entry commit: - F1: new path-gated cli-image-scan job in ci.yml (amd64 build + Trivy scan of deploy/docker/cli.Dockerfile on cli/** changes), so the Dockerfile's first-ever build is no longer on a release tag. - F2: publish-registry is dormant-gated — a step checks the env-injected MCP_REGISTRY_ED25519_KEY and every publish step gates on its output, so unprovisioned = green skip (in kind with the ECR tail), configured + broken = loud red. Misleading "fails at login" comment fixed. - F3: both `jentic --version` gates (publish-cli-image + release) now extract the full semver incl. prerelease suffix, so v1.2.3-rc.1 tags can pass. - F4: mcp-publisher downloads verified against the pinned sha256 from upstream's registry_1.8.1_checksums.txt in both workflows, with a lockstep comment tying the two version literals together. - F5/F6/F7: comment fixes — validate's live-registry call acknowledged, the "never argv" secret claim corrected (v1.8.1 login dns offers no env/stdin input), the transitively redundant needs entry annotated. Co-authored-by: Cursor <cursoragent@cursor.com>
Manuel-Jentic
requested review from
DavidAtJentic,
ren-jentic and
sophie-jentic
September 3, 2026 13:59
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Re-proposal of #1224 (merged prematurely, backed out by #1227) — identical content, held for manual review. Do not merge until Manuel signs off.
What this ships (issue #1214, PR A + B)
HOME=/home/jentic, pre-owned~/.config/jentic),CMD ["jentic","mcp"]deploy/docker/cli.Dockerfileio.modelcontextprotocol.server.name=one.jentic/jentic+ OCI labelsdeploy/docker/cli.Dockerfilepublish-cli-imagejob — step-for-step mirror ofpublish-image(per-arch Trivy pre-push, cosign keyless, syft SBOM,:lateston stable tags only) +jentic --version==tag gate + label==server.json assertion.github/workflows/release.ymlreleasewidened to need the CLI image;publish-registrystrictly last in the DAG.github/workflows/release.ymlone.jentic/jentic, OCI package, version stamped at release)cli/server.jsonpublish-registry— pinnedmcp-publisherv1.8.1 (sha256-verified), validate →login dns→ publish, dormant-gated: skips green until the publisher secret is provisioned.github/workflows/release.ymlmcp-registry-validate(path-filtered) +cli-image-scan(amd64 build + Trivy of the CLI Dockerfile).github/workflows/ci.ymldocs/security/mcp-same-host-hardening.mdPR A+B coupling
#1214 sliced this as two PRs; they are landed together deliberately — the image gate reads
cli/server.json, and one commit guarantees the label↔registry-name lockstep lands atomically. Reviewer verdict: coupling safe.Adversarial review (all findings addressed)
cli-image-scanjob (green on this branch, 1m35s).publish-registrywent red when unprovisioned → dormant-gated on the secret's presence; loud red only when configured-and-broken.--versiongates were not prerelease-aware (incl. the pre-existingreleasetwin) → full-semver comparison, verified against0.0.0-ciand1.2.3-rc.1.mcp-publisherdownload now sha256-pinned in both workflows (checksum independently verified against upstream'sregistry_1.8.1_checksums.txt).login dnsargv (no env/stdin alternative in v1.8.1; KMS noted) — comment reworded.needskept, self-documenting.Human prerequisites (due Fri 5 Sep)
MCP_REGISTRY_ED25519_KEY— 64-hex-char Ed25519 private key of the publisher keypair.jentic.one:v=MCPv1; k=ed25519; p=<base64 pubkey>(verify:dig TXT jentic.one).jentic-one-clipackage set public after first push (registry ownership verification pulls anonymously).Until (1) exists,
publish-registryskips green; images and binaries ship regardless.Why
The hosted MCP server sunsets 20 Sep. After that, MCP support means running
jentic mcplocally — a thin shim that speaks MCP on stdio and proxies everything real to your Jentic One instance (default127.0.0.1:8000). The CLI alone does nothing: with no instance,get_startedreturnsno_configand tells the operator to deploy one. That's by design.Why an image: two reasons, neither of which is "people want to run a CLI in Docker".
server.namelabel (hence the label↔server.jsonlockstep gate, and why A+B land in one commit).Why a registry entry: succession, not acquisition. The existing
io.github.jentic/mcp-serverentry points at the hosted server and gets deprecated at sunset; without a replacement, Jentic shows up dead in every MCP client catalog. For people already running Jentic One it's a verified install path instead of copy-pasting JSON from docs. Marginal cost on top of the image: ~20 lines of JSON and one dormant CI job.DNS verification is namespace-ownership proof, nothing is hosted: public key in a TXT record on
jentic.one, CI signs with the private key, the registry checks the signature.Made with Cursor