/ Directory / Playground / jupyter-mcp-server
● Community datalayer ⚡ Instant

jupyter-mcp-server

by datalayer · datalayer/jupyter-mcp-server

Let Claude run and read your Jupyter notebooks in real time — execute cells, see plots, recover from errors, all without leaving the chat.

jupyter-mcp-server (Datalayer) connects MCP clients to a live JupyterLab/Jupyter Server instance. Supports multiple notebooks, image/plot outputs, kernel management, and error-recovery loops. Useful for data exploration, reproducible analysis, or letting agents operate a notebook like a teammate.

Why use it

Key features

Live Demo

What it looks like in practice

jupyter.replay ▶ ready
0/0

Install

Pick your client

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "jupyter": {
      "command": "uvx",
      "args": [
        "jupyter-mcp-server"
      ],
      "_inferred": true
    }
  }
}

Open Claude Desktop → Settings → Developer → Edit Config. Restart after saving.

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "jupyter": {
      "command": "uvx",
      "args": [
        "jupyter-mcp-server"
      ],
      "_inferred": true
    }
  }
}

Cursor uses the same mcpServers schema as Claude Desktop. Project config wins over global.

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "jupyter": {
      "command": "uvx",
      "args": [
        "jupyter-mcp-server"
      ],
      "_inferred": true
    }
  }
}

Click the MCP Servers icon in the Cline sidebar, then "Edit Configuration".

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "jupyter": {
      "command": "uvx",
      "args": [
        "jupyter-mcp-server"
      ],
      "_inferred": true
    }
  }
}

Same shape as Claude Desktop. Restart Windsurf to pick up changes.

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "jupyter",
      "command": "uvx",
      "args": [
        "jupyter-mcp-server"
      ]
    }
  ]
}

Continue uses an array of server objects rather than a map.

~/.config/zed/settings.json
{
  "context_servers": {
    "jupyter": {
      "command": {
        "path": "uvx",
        "args": [
          "jupyter-mcp-server"
        ]
      }
    }
  }
}

Add to context_servers. Zed hot-reloads on save.

claude mcp add jupyter -- uvx jupyter-mcp-server

One-liner. Verify with claude mcp list. Remove with claude mcp remove.

Use Cases

Real-world ways to use jupyter-mcp-server

How to run exploratory data analysis with Claude + Jupyter

👤 Data scientists, analysts ⏱ ~30 min intermediate

When to use: You've got a new dataset and want to poke at it without writing boilerplate cells yourself.

Prerequisites
  • Running JupyterLab with token auth — jupyter lab --no-browser; copy the token from the URL
  • JUPYTER_URL + JUPYTER_TOKEN env vars — Set to your lab URL and token
Flow
  1. Load the notebook and data
    Use use_notebook to open analysis.ipynb. Insert a cell that loads ./data/events.parquet into a DataFrame named df.✓ Copied
    → Cell executes; df.head() preview returned
  2. Iterate on analysis
    What does the distribution of event_type look like? Plot it, show me the image.✓ Copied
    → Histogram image rendered in chat
  3. Save a clean notebook
    Clean the notebook: delete error cells, add markdown headers, restart-run-all to verify it runs top-to-bottom.✓ Copied
    → Notebook that reproduces end-to-end

Outcome: A publishable notebook with narrative, charts, and verified reproducibility.

Pitfalls
  • Kernel state drifts from notebook cell order — Use notebook_run-all-cells after edits to catch hidden-state bugs
  • Data files aren't visible to the kernel — Kernel's CWD is the notebook's dir, not where you started Jupyter — use absolute paths
Combine with: filesystem

Self-healing notebooks with Claude and jupyter-mcp

👤 Researchers iterating on pipelines ⏱ ~45 min advanced

When to use: A long notebook fails halfway; you want the agent to fix the cell and resume rather than restart.

Flow
  1. Run with error catching
    Execute all cells in pipeline.ipynb. When a cell errors, read the traceback, fix the code, and retry before moving on.✓ Copied
    → Notebook continues past the first error with a fix applied
  2. Log the fixes for review
    Summarize every fix you made as markdown cells above the changed code✓ Copied
    → Audit trail of agent edits

Outcome: Pipeline completes with visible repair history.

Generate teaching notebooks from natural-language lesson outlines

👤 Educators, technical writers ⏱ ~30 min beginner

When to use: You want to produce a worked-example notebook for students or a blog post.

Flow
  1. Outline → scaffold
    From this lesson outline [paste], create lesson.ipynb with sections as markdown cells and code cells scaffolded.✓ Copied
    → Notebook with structure
  2. Fill code cells and verify
    Flesh out each code cell with runnable examples. Execute top-to-bottom and ensure zero errors.✓ Copied
    → Clean notebook students can run

Outcome: A teaching-ready notebook created in minutes, not hours.

Combinations

Pair with other MCPs for X10 leverage

jupyter + filesystem

Move artifacts in/out of the notebook's working directory

Copy the plots saved by the notebook to ./reports/<date>/ via the filesystem MCP.✓ Copied
jupyter + postgres

Pull data from Postgres inside the notebook

In a new cell, use pandas.read_sql with my DB connection to load last month's events; then do EDA.✓ Copied

Tools

What this MCP exposes

ToolInputsWhen to callCost
use_notebook path: str Open/attach a notebook 0
list_notebooks Find available notebooks 0
execute_cell notebook_id, cell_index Run a specific cell kernel time
insert_execute_code_cell notebook_id, code, position? Add new code and run it kernel time
read_cell notebook_id, cell_index Inspect existing cells 0
list_kernels See what's running; find zombie kernels 0
restart_notebook notebook_id Reset kernel state cleanly 0

Cost & Limits

What this costs to run

API quota
None from MCP; Jupyter is yours to run
Tokens per call
Outputs can be large — images and DataFrame heads especially
Monetary
Free (self-hosted)
Tip
Use df.head() and df.info() not print(df) — full DataFrames bloat token usage

Security

Permissions, secrets, blast radius

Credential storage: JUPYTER_TOKEN in env — treat like a password; anyone with it can run code on your kernel
Data egress: MCP talks to your Jupyter server URL only

Troubleshooting

Common errors and fixes

401 Unauthorized connecting to Jupyter

JUPYTER_TOKEN stale — copy fresh from jupyter server list

Verify: curl -H 'Authorization: token <TOKEN>' $JUPYTER_URL/api
Kernel busy / never returns

Previous cell is still running. Use restart_notebook to recover; watch for infinite loops

Verify: list_kernels shows state=busy
Plots don't appear in Claude

Ensure %matplotlib inline is set and you're returning the figure, not just calling plt.show() at end

Alternatives

jupyter-mcp-server vs others

AlternativeWhen to use it insteadTradeoff
nteract/papermillYou want scripted/parameterized notebook runs without interactive chatNo agent loop; batch-style
marimoYou want reactive notebooks with less hidden stateDifferent tool entirely; no MCP yet

More

Resources

📖 Read the official README on GitHub

🐙 Browse open issues

🔍 Browse all 400+ MCP servers and Skills

Continue exploring

Related tools and workflows

Choose another guide for your workflow, or explore a collection.

Explore more MCP guides

SerpApi MCP

Query search-engine results through SerpApi’s official remote MCP endpoint, with engine-specific parameters and structured responses.

MCP

Explore more MCP guides

Snyk Studio MCP

Bring Snyk code, dependency, container, infrastructure, and related security scans into a local MCP workflow.

MCP

Explore more MCP guides

ClickHouse MCP

Run analytical SQL queries and inspect ClickHouse through the publisher’s MCP server.

MCP

Explore more MCP guides

SumUp MCP

Connect AI payment workflows to SumUp using its MCP server and supporting AI toolkit.

MCP

Browse all topic collections → · See 29 new official additions →