Skip to content

ci: publish to the MCP Registry on every tagged release - #35

Merged
whats2000 merged 1 commit into
mainfrom
ci/publish-to-mcp-registry
Aug 31, 2026
Merged

ci: publish to the MCP Registry on every tagged release#35
whats2000 merged 1 commit into
mainfrom
ci/publish-to-mcp-registry

Conversation

@whats2000

Copy link
Copy Markdown
Owner

What does this PR do?

Adds a publish-registry job to the release workflow so a tagged release updates the MCP Registry listing, instead of leaving it to be hand-published.

The listing was published by hand once, at 0.4.1 in April, and nothing kept it current — 0.5.0, 0.5.1, 0.5.2 and 0.6.0 all shipped to PyPI while the registry went on advertising 39 tools. Everything the registry actually requires was already here: server.json, and the mcp-name: marker in README.md that proves PyPI ownership. The only missing piece was the publish.

The job runs after the PyPI upload and:

  1. Stamps the tag version into both version fields of server.json. This is the part that stops the drift — leaving them to be bumped by hand is what caused it.
  2. Waits for that version to appear on PyPI. Ownership is verified by fetching the exact version's metadata and looking for the marker, so a publish that races the index fails the check.
  3. Installs mcp-publisher, validates, login github-oidc, publishes. OIDC means no stored secret — just id-token: write on the job.

0.6.0 was backfilled to the registry by hand, so the listing is current today; the automation takes over at the next tag.

Also gitignores the mcp-publisher binary, which lands in the repo root if you run the manual publish from there.

Tested Isaac Sim Version(s)

  • Isaac Sim 6.0.x — PhysX (isaac-sim.sh)
  • Isaac Sim 6.0.x — Newton (isaac-sim.newton.sh)
  • Isaac Sim 5.1.x
  • Other (please specify): none — and deliberately so. This PR touches no runtime code: no adapter, handler, tool or extension module is modified, so there is no behavior a running simulator could exercise. Stating the gap rather than implying coverage: this was not run against any Isaac Sim instance.

What was verified, against the real tooling rather than by reading the YAML:

  • The jq stamp step run verbatim with GITHUB_REF_NAME=v0.6.1 → both version fields rewritten to 0.6.1.
  • The curl | tar install line run verbatim → working mcp-publisher, whose login --help lists github-oidc as a supported method.
  • mcp-publisher validate on both the repo's server.json and the stamped copy → ✅ server.json is valid.
  • The PyPI poll against 0.6.0 (found, exits immediately) and against a nonexistent 9.9.9 (retries, then fails loudly).
  • ruff check . && ruff format --check . clean; pytest 271 passed / 43 skipped; workflow parses with the job graph intact (publish-registry needs build-and-publish).

Not verifiable without pushing a tag: the end-to-end publish, and the OIDC-to-namespace grant (io.github.whats2000/* from whats2000/isaacsim-mcp-server) — the docs state it as a pattern. The first tagged release is the real test, and it fails visibly rather than silently if the grant is wrong.

Before submitting

  • This PR fixes a typo or improves the docs (you can dismiss the other checks if that's the case). — release infrastructure only, no runtime code.
  • Did you read the contributor guidelines?
  • Was this discussed/approved via a GitHub issue? Please add a link to it if that's the case.
  • Did you make sure to update the documentation with your changes? — CHANGELOG.md under a new [Unreleased] heading.
  • Did you run the linter (ruff check . && ruff format .)?
  • Did you write any new necessary tests? — no unit test can cover a workflow that only runs on a tag push; the steps were exercised directly instead, as listed above.
  • Did you manually test the behavior in a running Isaac Sim instance? (unit tests alone are not sufficient) — n/a, see above.

Who can review?

@whats2000

🤖 Generated with Claude Code

The registry listing was hand-published once, at 0.4.1, and nothing kept it
current: 0.5.0, 0.5.1, 0.5.2 and 0.6.0 all shipped to PyPI while the registry
went on advertising 39 tools from April. Everything the registry needs was
already in the repo — server.json, and the `mcp-name:` marker in README.md
that proves PyPI ownership — so the only missing piece was the publish itself.

The new job runs after the PyPI upload and derives both version fields in
server.json from the tag, which is the part that actually stops the drift;
leaving them to be bumped by hand is what produced it. It waits for the new
version to appear on PyPI first, because ownership is verified by fetching
that exact version's metadata and looking for the marker, so a publish that
races the index fails the check. Auth is GitHub Actions OIDC — no stored
secret, just id-token: write on the job.

0.6.0 was backfilled to the registry by hand; the automation starts at the
next tag.

Verified locally against the real tooling rather than by inspection: the jq
stamp step with GITHUB_REF_NAME=v0.6.1 rewrites both fields; the curl|tar
install line produces a working binary whose `login --help` lists
github-oidc; `mcp-publisher validate` passes on both the repo's server.json
and the stamped copy; the PyPI poll finds 0.6.0 and correctly retries then
fails on a version that does not exist. The end-to-end publish cannot be
exercised without pushing a tag.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 31, 2026 09:17
@whats2000
whats2000 merged commit ebc42b3 into main Aug 31, 2026
2 checks passed
@whats2000
whats2000 deleted the ci/publish-to-mcp-registry branch August 31, 2026 09:18

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The workflow’s curl | tar install step for mcp-publisher is malformed (missing -f -), and will likely fail on the runner.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds automated publication of this server’s metadata to the MCP Registry as part of the existing tagged-release workflow, keeping the registry listing in sync with PyPI releases without manual intervention.

Changes:

  • Add a publish-registry job to the release workflow to stamp server.json, wait for PyPI propagation, then authenticate via GitHub OIDC and publish with mcp-publisher.
  • Add an [Unreleased] changelog entry documenting the new release automation.
  • Ignore the locally downloaded mcp-publisher binary in .gitignore.
File summaries
File Description
CHANGELOG.md Documents the new MCP Registry publish automation under [Unreleased].
.gitignore Ignores the ad-hoc mcp-publisher binary when downloaded locally.
.github/workflows/release.yml Adds a post-PyPI job to stamp server.json, wait for PyPI, then publish to the MCP Registry via OIDC.
Review details
  • Files reviewed: 2/3 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +102 to +105
- name: Install mcp-publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher

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.

2 participants