Offer the Docker image as an OCI package in server.json - #572
Open
JeroenDeDauw wants to merge 1 commit into
Open
Offer the Docker image as an OCI package in server.json#572JeroenDeDauw wants to merge 1 commit into
JeroenDeDauw wants to merge 1 commit into
Conversation
Docker builds the MCP catalog that Docker Desktop imports from the MCP registry, taking `oci` packages with a stdio transport and skipping npm ones. Our entry had only npm and mcpb packages, so the server was absent from that catalog. The image defaults to the HTTP transport, which serves a deployment rather than one local client, and the deployment docs rely on that default; the package entry pins `MCP_TRANSPORT=stdio` instead of changing the image. It declares only the environment variables that change behaviour on stdio, leaving out the HTTP and OAuth-proxy ones. Three constraints come with the entry: - Ownership of an OCI package is proven by resolving the image and reading an `io.modelcontextprotocol.server.name` label, so the Dockerfile now carries one. - The registry rejects a `version` field on an OCI package, so the released version lives in the image tag, which `scripts/update-server-json-oci.cjs` rewrites like its npm and mcpb siblings do for their identifiers. - Publishing resolves that image, so it has to exist first. The release workflow now calls `publish-image` and waits for it; on v0.17.0 the image landed 105 seconds after the release job had finished, so publishing an OCI package would have failed. The image's cosign identity is unchanged, because a certificate issued to a called workflow carries that workflow's ref, which is what `docs/deployment.md` verifies against. Verified against docker/mcp-gateway's `TransformToDocker`, which rejects the current entry as `incompatible server: no compatible packages` and accepts this one. The published image speaks MCP over stdio with the override: `initialize`, 29 tools, and a `get-page` call against English Wikipedia. Considered, omitted: a bind mount for `config.json`. The server has no environment variable for naming a wiki, so a catalog user gets English Wikipedia plus whatever `add-wiki` registers at runtime. A `--mount` runtime argument would express the mount, but the gateway resolves an unset config variable to the empty string, leaving `:/app/config.json` and a container that refuses to start for everyone who wants the default. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Docker builds the MCP catalog that Docker Desktop imports from the MCP
registry, taking
ocipackages with a stdio transport and skipping npmones. Our entry had only npm and mcpb packages, so the server was absent
from that catalog.
The image defaults to the HTTP transport, which serves a deployment
rather than one local client, and the deployment docs rely on that
default; the package entry pins
MCP_TRANSPORT=stdioinstead ofchanging the image. It declares only the environment variables that
change behaviour on stdio, leaving out the HTTP and OAuth-proxy ones.
Three constraints come with the entry:
reading an
io.modelcontextprotocol.server.namelabel, so theDockerfile now carries one.
versionfield on an OCI package, so thereleased version lives in the image tag, which
scripts/update-server-json-oci.cjsrewrites like its npm and mcpbsiblings do for their identifiers.
workflow now calls
publish-imageand waits for it; on v0.17.0 theimage landed 105 seconds after the release job had finished, so
publishing an OCI package would have failed. The image's cosign
identity is unchanged, because a certificate issued to a called
workflow carries that workflow's ref, which is what
docs/deployment.mdverifies against.Verified against docker/mcp-gateway's
TransformToDocker, which rejectsthe current entry as
incompatible server: no compatible packagesandaccepts this one. The published image speaks MCP over stdio with the
override:
initialize, 29 tools, and aget-pagecall against EnglishWikipedia.
Considered, omitted: a bind mount for
config.json. The server has noenvironment variable for naming a wiki, so a catalog user gets English
Wikipedia plus whatever
add-wikiregisters at runtime. A--mountruntime argument would express the mount, but the gateway resolves an
unset config variable to the empty string, leaving
:/app/config.jsonand a container that refuses to start for everyone who wants the
default.