Skip to main content

Universal Jupyter Notebook MCP server — full cell I/O, kernel execution, and pipeline stages, compatible with Antigravity, Cursor, Windsurf, Claude Desktop, and any MCP-compliant editor

Project description

universal-notebook-mcp

Run Jupyter notebooks from any AI editor. Gives your AI assistant full access to read, edit, and execute .ipynb files with live kernel output — without needing to open JupyterLab.

Works in Antigravity, Cursor, Windsurf, Claude Desktop, Claude Code, and any MCP-compatible tool. Works on Windows, macOS, and Linux.


Quick start

1. Install Python 3.10+

Skip this step if you already have Python 3.10 or later (python --version to check).

Windows

Download from python.org and run the installer. Make sure to check "Add Python to PATH" during setup.

Or with winget:

winget install Python.Python.3.11
macOS
brew install python@3.11

Or download from python.org.

Linux
# Debian / Ubuntu
sudo apt install python3.11 python3.11-pip

# Fedora / RHEL
sudo dnf install python3.11

# Arch
sudo pacman -S python

2. Install the package

pip install universal-notebook-mcp

On macOS/Linux, if pip maps to Python 3.9, use pip3.11 instead. On Windows, pip from the Python 3.11 installer works directly.

Verify it installed:

nb-mcp --help

3. Add to your editor

Pick your editor below and paste the config. Replace the path with the folder that contains your notebooks.

⚠️ Use the real absolute path — MCP clients pass arguments as literal strings and do not expand editor variables like ${workspaceFolder}.

Windows paths: use forward slashes or escape backslashes: C:/Users/you/notebooks or C:\\Users\\you\\notebooks

Antigravity

Create .antigravity/mcp.json in your project folder:

{
  "mcpServers": {
    "notebook": {
      "command": "nb-mcp",
      "args": ["--workspace-root", "/absolute/path/to/notebooks"]
    }
  }
}

Or go to Settings → MCP Servers and add the same block.

Cursor

~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project):

{
  "mcpServers": {
    "notebook": {
      "command": "nb-mcp",
      "args": ["--workspace-root", "/absolute/path/to/notebooks"]
    }
  }
}
Windsurf

~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "notebook": {
      "command": "nb-mcp",
      "args": ["--workspace-root", "/absolute/path/to/notebooks"]
    }
  }
}
Claude Desktop

Config file location:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "notebook": {
      "command": "nb-mcp",
      "args": ["--workspace-root", "/absolute/path/to/notebooks"]
    }
  }
}
Claude Code
claude mcp add notebook -- nb-mcp --workspace-root /absolute/path/to/notebooks

4. Reload your editor and go

Your AI can now work with notebooks. Try:

"List the cells in my notebook" "Run cell 3 and show me the output" "Fix the error in cell 5 and re-run it"


What it can do

Tool What it does
📖 notebook_list_cells See all cells (type, tags, first line)
📖 notebook_read_cell Read full source + saved outputs of a cell
📖 notebook_read_cell_output Read just the outputs (stream, result, error)
📖 notebook_read_metadata Read notebook metadata (kernel, language, etc.)
📖 notebook_list_stages List all pipeline stage tags in the notebook
✏️ notebook_edit_cell Edit a cell's source
✏️ notebook_insert_cell Insert a new cell at any position
✏️ notebook_delete_cell Delete a cell
✏️ notebook_edit_cell_metadata Add or update cell tags and metadata
✏️ notebook_edit_metadata Update notebook-level metadata
▶️ notebook_run_cell Execute one cell and get its output
▶️ notebook_run_range Execute a range of cells
▶️ notebook_run_all Execute all cells
▶️ notebook_run_pipeline Execute all cells tagged with a stage name
🔧 notebook_restart_kernel Clear kernel state (variables, imports)
🔧 notebook_list_kernels List all installed kernel environments
🔧 notebook_list_active_kernels See which notebooks have a live kernel

Kernel state persists across calls — variables and imports from one cell are available in the next, just like a normal Jupyter session.

Edits are checkpointed — every edit creates a timestamped backup (.checkpoint_<timestamp>.ipynb) before writing, so you can always roll back.


Troubleshooting

nb-mcp: command not found (or 'nb-mcp' is not recognized on Windows)

The install directory isn't on your PATH. Find where pip installed it:

# macOS / Linux
python3 -m site --user-scripts   # or: which nb-mcp after activating your venv

# Windows (PowerShell)
python -c "import sys; print(sys.prefix + r'\Scripts')"

Then either use the full path in your MCP config:

"command": "C:\\Users\\you\\AppData\\Local\\Programs\\Python\\Python311\\Scripts\\nb-mcp.exe"

Or add the Scripts/bin directory to your PATH permanently.


ModuleNotFoundError when running a cell

The kernel doesn't have your packages installed. Register your environment:

pip install ipykernel
python -m ipykernel install --user --name myenv --display-name "My Env"

Then restart the kernel via notebook_restart_kernel or ask your AI to switch kernels.

List available kernels:

jupyter kernelspec list

Windows: path format in MCP config

Both of these work:

"C:/Users/you/notebooks"        forward slashes
"C:\\Users\\you\\notebooks"     escaped backslashes

Avoid raw backslashes — they break JSON:

"C:\Users\you\notebooks"        invalid JSON

For developers — running tests, contributing
git clone https://github.com/your-org/universal-notebook-mcp.git
cd universal-notebook-mcp

# macOS / Linux
pip3.11 install -e ".[dev]"

# Windows (PowerShell)
python -m pip install -e ".[dev]"

Run the tests:

python -m pytest                          # all tests
python -m pytest -m "not integration"     # unit tests only (no kernel needed)
python -m pytest -m integration -v        # integration tests (needs ipykernel)

Or use make targets on macOS/Linux:

make test        # unit only
make test-all    # unit + integration
make coverage    # coverage report
make lint        # ruff linter

Project layout:

src/universal_notebook_mcp/
  server.py           ← MCP tool surface (17 tools, FastMCP, stdio)
  notebook_adapter.py ← nbformat cell CRUD + checkpoint backups
  kernel_session.py   ← jupyter_client async kernel lifecycle
  notebook_runner.py  ← cell execution + output capture

tests/
  conftest.py         ← shared fixtures (mocked kernel, workspace)
  fixtures/           ← simple.ipynb, pipeline.ipynb, error.ipynb
  test_*.py           ← 125 tests (116 unit + 9 integration)

Security

All notebook paths are sandboxed to --workspace-root. Paths that escape it (e.g. ../secret.ipynb) or that aren't .ipynb files are rejected with an error.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

universal_notebook_mcp-0.1.0.tar.gz (25.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

universal_notebook_mcp-0.1.0-py3-none-any.whl (15.9 kB view details)

Uploaded Python 3

File details

Details for the file universal_notebook_mcp-0.1.0.tar.gz.

File metadata

  • Download URL: universal_notebook_mcp-0.1.0.tar.gz
  • Upload date:
  • Size: 25.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for universal_notebook_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7e855df6341075f0b99a8830ebd4262ef2d87072af39e316a90c4fb80bc7a546
MD5 85081df67a89bdfd1dd3092a381ab83d
BLAKE2b-256 b36ca1f38070397dd744cbd04e520dfdb322104d0195403bfa749091bb492c5c

See more details on using hashes here.

File details

Details for the file universal_notebook_mcp-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for universal_notebook_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bf61fd6d352896f93a577918e7533d56a73747dde545cd6b97ada58e92569a58
MD5 23aaf6cabb144f81df0c342910fd36ec
BLAKE2b-256 902f284852717e36ff6068174253b4bf3742bf9f27018c34ff4417480bad67c3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page