Repository navigation
Publish solr-mcp to the official MCP Registry and the Docker MCP Catalog with the 1.0.0 release #251
Description
Status: needs a PMC member and Infra. Blocked on a passing 1.0.0 vote: the dev@ votes ended FAILED on 2026-05-05 and CANCELLED on 2026-06-21, and none has been called since (dev@ archive, 2026-10-12). The repo-side fixes to server.json and release-publish.yml are specified in #261, and PR #263 implements them. PR #259 fixes the SBOM path that stops publish-docker. Unverified: whether the INFRA ticket is filed. None is linked from #251, Jira search needs a login, and hub.docker.com/v2/repositories/apache/solr-mcp/ returns 404 on 2026-10-12.
Size: S — an INFRA ticket, one job re-run, and one YAML PR to docker/mcp-registry.
Problem
release-publish.yml has a publish-mcp-registry job, but three things outside the code stop it from listing 1.0.0:
- There is no Docker Hub repository
apache/solr-mcp, and the repo has no Docker Hub secrets. Infra provisions both. - A new GHCR package is private. The registry pulls each OCI image anonymously and rejects a private one with "OCI image '…' is private or requires authentication" (oci.go,
remote.WithAuth(authn.Anonymous)). Changing the visibility of a package in theapacheorg needs Infra. - The workflow must run before the registry job can, and it fails today.
publish-dockerreads the SBOM from the pre-3.x path, so it fails after pushing the images.publish-mcp-registryneedspublish-docker, so it never runs (release-publish.yml:261,:274,:520). PR ci: read the SBOM from build/reports/cyclonedx/ #259 fixes this. Theserver.jsonand workflow defects that the registry would reject are listed in Publish 1.0.0 to the official MCP Registry from the ATR release: server.json and release-publish.yml fixes #261.
The Docker MCP Catalog does not read the official registry. It needs its own PR to docker/mcp-registry.
Proposal
Order
- Merge ci: read the SBOM from build/reports/cyclonedx/ #259 and ci(release): publish voted releases to the official MCP Registry #263 (Publish 1.0.0 to the official MCP Registry from the ATR release: server.json and release-publish.yml fixes #261).
- The 1.0.0 vote passes.
- Infra creates the Docker Hub repo and secrets (step 1 of the checklist below). This can happen before the vote.
- The release manager runs
release-publish.yml. On the first release the registry job fails because the GHCR package is still private. - Infra makes
ghcr.io/apache/solr-mcppublic, and the release manager re-runs onlypublish-mcp-registry. - Open the docker/mcp-registry PR.
PMC and Infra checklist
- A PMC member files an INFRA ticket that links the dev@ thread agreeing to publish images, as the Docker Hub policy asks. The ticket asks Infra to:
- create the Docker Hub repository
apache/solr-mcp; - add the
DOCKERHUB_USER/DOCKERHUB_TOKENsecrets, the pair apache/solr reads (docker-nightly.yml); - make the
ghcr.io/apache/solr-mcppackage public after the first release push.
- create the Docker Hub repository
- After the first release, re-run
publish-mcp-registryonce the package is public. Later releases push to the same package.
Namespace
Keep io.github.apache/solr-mcp. mcp-publisher login github-oidc grants io.github.<repository_owner>/* to a workflow running in an apache/* repo (github_oidc.go, buildPermissions). The job already requests id-token: write (release-publish.yml:525), so the registry login needs nothing from Infra. A DNS namespace such as org.apache.solr/solr-mcp would need a TXT record or a /.well-known/mcp-registry-auth file on solr.apache.org, plus a private key held as a secret (authentication). Infra would own both, and the image label io.modelcontextprotocol.server.name (build.gradle.kts:586) would change. Nothing in the issue asks for that.
Docker MCP Catalog (after the release)
Add servers/solr-mcp/server.yaml to docker/mcp-registry with the repo's tooling (CONTRIBUTING.md):
task create -- --category search --image apache/solr-mcp \
https://github.com/apache/solr-mcp -e SOLR_URL=http://host.docker.internal:8983/solr/
task catalog -- solr-mcp- Use a self-provided image (
--image), as thealfrescoandmaven-tools-mcpentries do. Without--image, Docker builds the image from the repo's root Dockerfile into its ownmcp/namespace. solr-mcp builds with Jib and has no Dockerfile, and a Docker-built image would sit outside the ASF release. meta.category: search, the category theelasticsearchentry uses.source.commit: the commit of thev1.0.0tag.config: model it on theelasticsearchentry, withSOLR_URLinenvand as a requiredparametersproperty.task createruns the image and lists its tools, so notools.jsonis needed: over STDIO the server answerstools/list(15 tools) withSOLR_URLpointing at a closed port (checked 2026-10-12 with the JVM jar).- Docker reviews every PR before merging.
Implementation notes
Two release-publish.yml changes that neither #261 nor PR #263 (head 30784db2) makes. Add them there:
:240-244passes the GHCR token as-Djib.to.auth.passwordon the command line. Move it intoJIB_TO_AUTH_USERNAME/JIB_TO_AUTH_PASSWORDenv, as the Docker Hub step does at:209-213.:520makes the registry job wait forpublish-native-manifests, althoughserver.jsonlists no native image. Whether a native build failure should hold back the registry entry is a maintainer choice. The comment at:515-516says the wait is deliberate.
Acceptance criteria
-
https://registry.modelcontextprotocol.io/v0.1/servers/io.github.apache%2Fsolr-mcp/versions/1.0.0returns the entry. -
docker pull ghcr.io/apache/solr-mcp:1.0.0works without logging in. - A docker/mcp-registry PR adding
servers/solr-mcp/server.yamlwithimage: apache/solr-mcpis open, and is linked from Publish solr-mcp to the official MCP Registry and the Docker MCP Catalog with the 1.0.0 release #251.
Out of scope
server.jsonand workflow changes (Publish 1.0.0 to the official MCP Registry from the ATR release: server.json and release-publish.yml fixes #261), and the SBOM path (ci: read the SBOM from build/reports/cyclonedx/ #259).- Listing the native images.
bootBuildImagesets no ownership label (build.gradle.kts:592-605), andpublish-nativedoes not push to Docker Hub (release-publish.yml:364-367). - Snapshots or nightlies. ASF release policy forbids publishing unreleased material, and the nightly PRs (ci: publish nightly Docker image to apache/solr-mcp-nightly #218, feat(build): publish nightly snapshot jars to the ASF Nexus snapshot repository #220) were closed.
File and line references are against main at 7cb39a3d.
Original description
What we want
Once 1.0.0 passes its vote, solr-mcp should be listed in:
- The official MCP Registry (registry.modelcontextprotocol.io) as
io.github.apache/solr-mcp, pointing at the release images on Docker Hub (apache/solr-mcp) and GHCR (ghcr.io/apache/solr-mcp). - The Docker MCP Catalog (hub.docker.com/mcp), the catalog behind Docker Desktop's MCP Toolkit, pointing at
apache/solr-mcp.
Only voted releases get listed. ASF policy says projects "SHALL NOT publish unreleased materials outside the development community", so no snapshots or nightlies. release-publish.yml already publishes to the MCP Registry as part of the post-vote release.
What needs to happen on the ASF side
These steps need a PMC member and ASF Infra. Contributors can't do them.
-
An INFRA ticket. A PMC member files an INFRA Jira ticket, linking the dev@solr.apache.org thread that agrees to publish solr-mcp images. Infra's Docker Hub policy asks for that link. The ticket asks Infra to:
- Create the Docker Hub repository
apache/solr-mcp. - Add the
DOCKERHUB_USER/DOCKERHUB_TOKENsecrets toapache/solr-mcp. These are the names Infra provisions. apache/solr uses the same two to pushapache/solr-nightly(docker-nightly.yml). - Make the
ghcr.io/apache/solr-mcppackage public after the first release push. GHCR packages are private when first published, even when pushed from Actions withGITHUB_TOKEN. The MCP Registry only accepts images it can pull anonymously. Changing a package's visibility needs admin on it, which in theapacheorg means Infra.
- Create the Docker Hub repository
-
A re-run on the first release. The release manager runs
release-publish.ymlafter the vote as usual. On the first release only, the MCP Registry step fails, because the new GHCR package is still private. Once Infra has made it public, re-run that one job. Later releases push to the same package, which is public by then.
Nothing is needed from Infra for the MCP Registry login itself. The io.github.apache/* namespace is authorized through GitHub OIDC from the workflow, with no stored secret.
Contributor side
These need no ASF permissions:
- bringing
server.jsonup to the registry's current format and the image names the workflow actually pushes; - switching
release-publish.ymlto the secret names above; - the docker/mcp-registry submission, after the release.
Activity