Skip to content

Publish the server entry to the MCP Registry, and let it backfill - #63

Merged
jmc-wander merged 2 commits into
mainfrom
ci/publish-to-mcp-registry
Sep 23, 2026
Merged

jmc-wander merged 2 commits into
mainfrom
ci/publish-to-mcp-registry

Conversation

@jmc-wander

Copy link
Copy Markdown
Contributor

The gap: PyPI publishing is automated; MCP Registry publishing never was. io.github.wandercom/kindex sits at 0.38.0 while 0.39 through 0.44 shipped to PyPI, so every MCP client discovers a version six releases behind what users can install.

This PR: .github/workflows/publish-mcp.yml publishes the server entry on a tag, and via workflow_dispatch for a release already tagged and on PyPI that never reached the registry — so catching up doesn't require inventing a version number.

It refuses a server.json that doesn't name the tag, and refuses to advertise a version PyPI doesn't have: the registry must never name something a client can't install. Auth is GitHub OIDC, so there's no token to hold or rotate.

After merge, backfill 0.44.0 with:

gh workflow run publish-mcp.yml -f tag=v0.44.0

Test suite: 1335 passed. The one failure (test_installed_console_script_transfers_and_reopens_for_recall) is environmental — it needs the package installed in the running venv — and fails identically at the pre-change commit.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EZvSuic9iUQSXAFQoDR2Es

PyPI is one publication; the MCP Registry is the other, and only the
first was automated. The registry entry io.github.wandercom/kindex sat at
0.38.0 while 0.39 through 0.44 shipped to PyPI, so every MCP client
discovered a version six releases behind what users could install.

.github/workflows/publish-mcp.yml publishes on a tag and, through
workflow_dispatch, for a release that is already tagged and on PyPI but
never reached the registry — so catching up never requires inventing a
version number. It refuses a server.json that does not name the tag, and
refuses to advertise a version PyPI does not have: the registry must
never name something a client cannot install. Authentication is GitHub
OIDC, so the io.github.wandercom/* namespace is proven by the
repository's own identity and there is no token to hold or rotate.

The release checklist gains the registry verification step.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EZvSuic9iUQSXAFQoDR2Es

@adaptcom adaptcom Bot 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.

Confidence Score: 2/5

Summary

Adds MCP Registry publishing and manual backfills. Automatic releases can fail before PyPI finishes, and the documented verification can select the wrong registry entry.

Important Files Changed

File Overview
.github/workflows/publish-mcp.yml Tag-triggered and manual MCP publication with version checks
CLAUDE.md Adds registry release and verification instructions

↻ Re-run review · View in Adapt

Comment thread .github/workflows/publish-mcp.yml Outdated
"https://pypi.org/pypi/kindex/json", timeout=30
) as response:
released = json.load(response)["releases"]
if tag not in released:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Both workflows start on the same tag, so this check can fail before PyPI finishes; run MCP publication after successful PyPI publishing or add bounded retries.

Comment thread CLAUDE.md Outdated
7. Watch the workflow: `gh run watch <id> -R wandercom/kindex` -- all three jobs (test, build, publish) must pass
8. Verify on PyPI: `pip index versions kindex 2>/dev/null | head -1` or check https://pypi.org/project/kindex/
9. Verify the MCP listing metadata is current: `server.json` version/package fields match the release, and https://mcpmarket.com/server/kindex reflects the published package after indexing.
9. The tag also publishes the server entry to the MCP Registry (`.github/workflows/publish-mcp.yml`, OIDC, no token; it refuses to publish a version PyPI does not have, and can be run by hand with `gh workflow run publish-mcp.yml -f tag=vX.Y.Z` to backfill a release that was tagged before this existed). Confirm it: `curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=kindex" | grep -o '"version":"[^"]*"' | tail -1` must show the released version. The registry is how MCP clients discover the server, and it stalled at 0.38.0 through six PyPI releases because nothing automated it.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The search includes multiple servers and historical versions, so grep/tail can verify the wrong entry; query the exact Wander server’s latest-version endpoint and parse its JSON.

Two findings from review, both real:

The tag started the PyPI workflow and the registry workflow at the same
moment, so the registry's "is this on PyPI yet" check raced the upload
it was meant to depend on — the first real release would have failed
the check it was built to satisfy. The registry publish is now a job in
the release workflow with `needs: publish`, calling this one as a
reusable workflow, so it cannot start before PyPI finishes. Bounded
retries (20 x 15s) remain for PyPI's own index propagation, which lags
a successful upload; a version that never appears is a failed release
and this fails with it rather than waiting.

The documented verification piped a `search=kindex` result through
`grep | tail -1`. That search matches substrings across every server
and every historical version — `io.github.jmcentire/kindex` and every
release back to 0.19.0 come back too — so the position it picked was
arbitrary. Both the doc and a new confirmation step now match the exact
server name and the registry's own `isLatest` flag.

`workflow_dispatch` still backfills a release tagged before any of this
existed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EZvSuic9iUQSXAFQoDR2Es
@jmc-wander
jmc-wander merged commit e2aa36f into main Sep 23, 2026
1 check passed
@jmc-wander
jmc-wander deleted the ci/publish-to-mcp-registry branch September 23, 2026 19:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants