fix: pin jupyter-mcp-server==0.23.0 in the .mcp.json jupyter entry#21
Merged
Conversation
`_jupyter_mcp_entries()` emitted an unpinned `jupyter-mcp-server`, which `uvx` resolves to "latest". Since v1.0.0 (2026-04-03) that line makes server-startup auth mandatory: `jupyter-mcp-server` reads `JUPYTER_URL` / `JUPYTER_TOKEN` / `MCP_TOKEN` from the environment when the process starts. Claude Code spawns the server over stdio with no such env block, so on v1.0.x the process comes up but never completes the MCP handshake — the `jupyter` server hangs at "connecting" and exposes no tools. An unpinned entry therefore shipped broken-by-default. 0.23.0 is the last pre-auth release and supports the runtime `connect_to_jupyter(jupyter_url, jupyter_token)` call this integration is built on — the cluster JupyterLab URL/token rotate per compute-node session, so a static startup-env model is the wrong fit. It is the version verified against the electricrag deployment (2026-05-15). This became acute after #20: `jupyter` is now the only Jupyter MCP server, so the broken-by-default resolution has no fallback. - install.py: pin `jupyter-mcp-server==0.23.0`; full rationale in the `_jupyter_mcp_entries()` docstring plus an inline comment at the args. - docs/setup/jupyter-mcp.md: `.mcp.json` example, the `uvx` verify line, and the "Environment reference" updated to the pin; new troubleshooting row for the "hangs at connecting" symptom. - test_install.py: assert the exact pinned args. Existing consumer `.mcp.json` files keep whatever `jupyter` entry they already have (the merge is additive) — a pre-fix entry needs `==0.23.0` added by hand. Co-Authored-By: Claude Opus 4.7 (1M context) <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.
Summary
Follow-up to #20.
_jupyter_mcp_entries()emitted an unpinnedjupyter-mcp-server, whichuvxresolves to "latest" — currently the v1.0.x line. Since v1.0.0 (2026-04-03),jupyter-mcp-servermakes server-startup auth mandatory: it readsJUPYTER_URL/JUPYTER_TOKEN/MCP_TOKENfrom the environment when the process starts.Claude Code spawns this server over stdio with no such env block, so on v1.0.x the process comes up but never completes the MCP handshake — the
jupyterserver hangs at "connecting" and exposes no tools. An unpinned entry therefore shipped broken-by-default for any freshaexp install --with-jupyter.This pins the entry to
jupyter-mcp-server==0.23.0— the last pre-auth release, which supports the runtimeconnect_to_jupyter(jupyter_url, jupyter_token)call this integration is built on. Pinning forward to v1.0.x is the wrong fix: the cluster JupyterLab URL/token rotate per compute-node session, so a static startup-env model does not fit. 0.23.0 is the version verified against the electricrag deployment (2026-05-15).Changes
install.py—_jupyter_mcp_entries()pinsjupyter-mcp-server==0.23.0. The full rationale lives in the function docstring (the obvious place a future reader will look) plus a short inline comment at theargsline, so the pin is not a mystery.docs/setup/jupyter-mcp.md— the.mcp.jsonexample, theuvxverification line, and the "Environment reference" table updated to the pin; a new troubleshooting row for the "jupyterserver hangs at connecting" symptom.tests/test_install.py— asserts the exact pinnedargs.CHANGELOG.md—### Fixedentry under[Unreleased].Not in scope
[jupyter]pip extra still constrainsjupyter-mcp-server (>=1.0.2,<2.0.0). That extra is the cluster-side install (pip install agentic-experiments[jupyter]), a separate concern from the laptop-side.mcp.jsonentry fixed here, and reconciling it belongs with the deferred cluster-side migration._jupyter_mcp_entries()docstring.Consumer impact
Existing consumer
.mcp.jsonfiles keep whateverjupyterentry they already have — the install merge is additive and never overwrites an existingjupyterblock. A consumer whose entry predates this fix should add==0.23.0to that entry'sargsby hand. (The electricrag deployment already hand-pinned to==0.23.0, so it is unaffected.)Testing
tests/test_install.py— 59/59 passruff check src/aexp/install.py— clean🤖 Generated with Claude Code