ov-layers/skills/jupyter-mcp/SKILL.md
JupyterLab CRDT MCP server extension with 13 tools for programmatic notebook access. MUST be invoked when working with: the MCP server implementation, CRDT collaboration, or the Tier 1 pip-only installation pattern for jupyter extensions.
npx skillsauth add overthinkos/overthink-plugins jupyter-mcpInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Property | Value |
|----------|-------|
| Dependencies | (none) |
| Packages | (none -- pip-only Tier 1 layer) |
| Services | (none) |
| Volumes | (none) |
| Install files | layer.yml, tasks:, jupyter_mcp/ (Python package) |
This is a Tier 1 "post-install" layer — it has no pixi.toml and installs into whatever pixi environment exists from the parent Tier 2 layer. It follows the same pattern as llama-cpp and unsloth.
Single source of truth: The jupyter_mcp Python package lives only in this layer. Both jupyter (lightweight) and jupyter-ml (GPU ML) compose it via their layers: field. This prevents code duplication and ensures bug fixes propagate to all images.
The tasks: performs three operations:
pip install "fastmcp>=3.2.0" (not via pixi because pixi's cross-platform resolver conflicts with opentelemetry-api on aarch64)pip install --no-deps /ctx/jupyter_mcp (from the layer's build context)jupyter_mcp.json to the Jupyter server config directoryThe extension registers a Streamable HTTP MCP server at http://localhost:8888/mcp (MCP spec 2025-11-25). It provides 13 tools for programmatic notebook access:
| Tool | Description |
|------|-------------|
| list_notebooks | List all notebooks in the workspace |
| get_notebook | Get full notebook content (cells, metadata) |
| create_notebook | Create a new notebook |
| open_notebook_session | Open a CRDT collaboration room |
| close_notebook_session | Close a CRDT room and save to disk |
| get_cell | Get a specific cell's content |
| update_cell | Replace a cell's source |
| insert_cell | Insert a new cell at a position |
| delete_cell | Delete a cell |
| execute_cell | Execute a cell and return outputs |
| get_active_sessions | List active collaboration rooms |
| get_active_users | List connected users |
| watch_notebook | Watch for real-time changes |
Cell operations mutate the live CRDT document — changes appear instantly in all connected JupyterLab clients. Multiple MCP clients and browser users can edit the same notebook simultaneously. The server uses jupyter-server-ydoc for CRDT document management.
Key implementation detail: The _create_room() method calls await room.initialize() after server.start_room(room) to load notebook content from disk into the CRDT document. Without this, the YNotebook is empty (0 cells). This mirrors the YDocWebSocketHandler.open() behavior in jupyter-server-ydoc.
Claude Code / MCP Client
↓ Streamable HTTP (POST /mcp)
FastMCP Server (mcp_server.py)
↓
JupyterLab RTC Adapter (rtc_adapter.py)
↓ CRDT operations
jupyter-server-ydoc DocumentRoom
↓ Y.js document sync
JupyterLab Kernel Manager (execute_cell)
layers/jupyter-mcp/
layer.yml # Description only (Tier 1, no deps)
# tasks: block in layer.yml — fastmcp + pip install + extension enable
jupyter_mcp/ # Python package
pyproject.toml
jupyter_mcp/
__init__.py
app.py # Jupyter server extension entry point
mcp_server.py # FastMCP tool definitions (13 tools)
rtc_adapter.py # CRDT room management, kernel execution
tornado_asgi.py # Tornado-to-ASGI bridge for FastMCP
The parent jupyter layer declares mcp_provides to make this MCP server discoverable to other services at deploy time. The hermes service auto-discovers this server via the OV_MCP_SERVERS env var and registers all 13 tools as mcp_jupyter_<tool_name>.
The jupyter MCP server name is deliberately decoupled from the layer name, the Python package name, and the image name. Three places anchor it:
| File | Field | Value | Purpose |
|---|---|---|---|
| layers/jupyter/layer.yml | env.MCP_SERVER_NAME | "jupyter" | Runtime advertisement |
| layers/jupyter/layer.yml | mcp_provides[0].name | jupyter | Cross-container discovery (hermes, openwebui) |
| plugins/ov-jupyter/.mcp.json | mcpServers.jupyter | — | Claude Code static registration |
When the layer/package/image were renamed (jupyter-colab-ml → jupyter-ml, jupyter_colab_mcp → jupyter_mcp), these three values stayed jupyter — and every consumer (hermes mcp_accepts: jupyter, openwebui mcp_accepts: jupyter, the Claude Code plugin) continued working without any edits. Package/layer/image names describe the artifact; the MCP name describes the service contract. Rename the artifact freely; the contract is stable.
/ov-layers:jupyter — lightweight multi-arch JupyterLab (layers: [jupyter-mcp])/ov-layers:jupyter-ml — GPU ML JupyterLab (layers: [llama-cpp, unsloth, jupyter-mcp])/ov-images:jupyter/ov-images:jupyter-ml/ov-images:jupyter-ml-notebook/ov-layers:jupyter — lightweight Tier 2 parent layer/ov-layers:jupyter-ml — GPU ML Tier 2 parent layer/ov:layer — layer authoring rules (Tier 1 pattern)/ov:mcp — client-side verb for probing this server's tool catalog (ping, list-tools, call); use ov test mcp list-tools jupyter to see all 13 tools this layer registers/ov-layers:chrome-devtools-mcp — sibling MCP-server-provider layer for Chrome DevTools (different domain, same mcp_provides pattern)Use when the user asks about:
/ov:test — declarative testing (tests: block, ov image test, ov test)development
Claude Code multi-agent support in Overthink — sub-agents, dynamic workflows, and agent teams, and how each drives the existing `ov eval` disposable beds to test and verify. MUST be invoked before authoring or invoking an ov sub-agent / dynamic workflow / agent team, wiring agent-lifecycle hooks, or asking "which primitive should drive the R10 beds?".
tools
Mounts a virtiofs share tagged `workspace` at /workspace inside a VM guest via a systemd .mount unit. Use when a kind:vm entity shares a host directory into the guest and you need it auto-mounted (and re-mounted at every boot).
development
MUST be invoked before any work involving: the `kind: android` schema kind, a `target: android` deploy, the `apk:` layer package format (installing Android apps declaratively), AndroidDeployTarget, an in-pod emulator OR a remote/physical adb-endpoint device, or nested `pod → android` deployment. The first-class Android device + app surface that sits above `ov eval adb`/`appium`.
tools
Use when committing, branching, pushing, merging, tagging, creating PRs, or approving/merging PRs with gh — the feat/-branch, R10-gated, never-force-push landing workflow across the main repo + the plugins submodule + image/<distro> submodules. Covers sync-to-upstream, branch/worktree pruning, the fork+PR path for contributors without write access, and cross-repo @github landing order.