Skip to main content
Glama
jupyter-notebook-mcp

jupyter-notebook-mcp

by g0g5

jupyter-notebook-mcp

A FastMCP server for loading, editing, searching, and saving Jupyter notebooks (.ipynb) through MCP tools.

The server keeps one notebook open at a time and uses live cell indices that update as cells are inserted or removed.

Features

  • Single active notebook session with in-memory state (path, notebook object, dirty flag)

  • Autosave current notebook before loading a different notebook

  • Real insert/remove semantics: indices shift immediately after edits

  • Return full notebook as plain-text blocks when loading

  • Save/import notebook content in markdown block format

  • Case-insensitive keyword search with contextual snippets

  • Actionable ToolError messages for common failure cases

Related MCP server: jupyter-editor-mcp

Tool API

The server exposes the following MCP tools:

  • load_notebook(path: str)

    • Loads and validates a notebook

    • Autosaves the currently open notebook first (if any)

    • Returns active cells as plain-text blocks: [index:N type:...] + full content

  • save_notebook(path: str | None = None)

    • Saves current notebook (optionally to a new path)

  • read_cell(index: int)

    • Returns full source for one active cell

  • add_cell(content: str, cell_type: str = "code", index: int | None = None)

    • Appends a new cell when index is omitted

    • Inserts below the referenced cell when index is provided (insert at index + 1)

    • Returns plain-text blocks for changed cell + adjacent cells

  • replace_cell(index: int, content: str)

    • Replaces entire cell source

  • remove_cell(index: int)

    • Removes a cell by index with immediate reindexing

    • Returns plain-text blocks for changed cell + adjacent cells

  • delete_cell(index: int)

    • Backward-compatible alias of remove_cell

  • save_markdown(path: str)

    • Saves the same text returned by load_notebook() to a markdown file path

  • from_markdown(path: str)

    • Reads exported markdown blocks from disk and replaces current notebook cells

  • search_cell(keywords: str)

    • Space-separated keyword search (all keywords must match)

Requirements

  • Python >=3.12

  • uv for environment and dependency management

MCP Installation

Run directly with uvx (no persistent install):

uvx jupyter-notebook-mcp --from git+https://github.com/g0g5/jupyter-notebook-mcp

Install as a uv tool:

uv tool install jupyter-notebook-mcp --from git+https://github.com/g0g5/jupyter-notebook-mcp

Quick Start

uv sync
uv run python -m jupyter_notebook_mcp

You can also run via the project script entrypoint:

uv run jupyter-notebook-mcp

MCP Client Configuration (stdio)

Use one of the following configurations.

Option 1: run with uvx from GitHub:

{
  "mcpServers": {
    "jupyter-notebook-mcp": {
      "command": "uvx",
      "args": [
        "jupyter-notebook-mcp",
        "--from",
        "git+https://github.com/g0g5/jupyter-notebook-mcp"
      ]
    }
  }
}

Option 2: after uv tool install, run installed command directly:

{
  "mcpServers": {
    "jupyter-notebook-mcp": {
      "command": "jupyter-notebook-mcp",
      "args": []
    }
  }
}

Development

Install/update dependencies:

uv sync

Typecheck (lightweight compile check):

uv run python -m py_compile jupyter_notebook_mcp/*.py tests/*.py

Run tests:

uv run pytest -v

Project Structure

jupyter-notebook-mcp/
|- jupyter_notebook_mcp/
|  |- __main__.py                  # Module entrypoint for `python -m jupyter_notebook_mcp`
|  |- server.py                    # FastMCP app and tool registration
|  |- session.py                   # Shared in-memory notebook session state
|  |- notebook_io.py               # Notebook load/save and validation
|  |- cell_ops.py                  # Cell read/edit operations
|  |- markdown_codec.py            # Markdown export/import parsing
|  |- search.py                    # Keyword search and snippet extraction
|  \- formatting.py                # Cell block and markdown preview formatting
\- tests/
   |- conftest.py                  # Shared fixtures (session reset)
   |- helpers.py                   # Shared notebook test helpers
   |- test_contract_flow.py
   |- test_session_and_io.py
   |- test_cell_editing.py
   |- test_markdown_codec.py
   \- test_search_and_formatting.py

Behavior Notes

  • If no notebook is loaded, notebook-dependent tools return:

    • No notebook is loaded. Use load_notebook(path) first.

  • Cell indices are always current active indices; insert/remove operations reindex following cells.

  • On save, the server validates notebook structure with nbformat.validate before writing.

Available Tools

10 tools
add_cellA

Insert after index, or append when index is omitted.

cell_type must be one of: code, markdown, raw.

Inputs: content (required), index, cell_type. Returns: result

delete_cellC

Backward-compatible alias of remove_cell(index).

Inputs: index (required). Returns: result

from_markdownC

Load markdown notebook blocks from disk and replace active cells.

Inputs: path (required). Returns: object

load_notebookA

Load and validate a notebook from disk, then return markdown blocks.

Autosaves the currently open notebook before switching.

Inputs: path (required). Returns: result

read_cellC

Return one active cell by index with type and full source.

Inputs: index (required). Returns: object

remove_cellC

Remove a cell and return previews of affected neighboring cells.

Inputs: index (required). Returns: result

replace_cellC

Replace the full source of the cell at the given index.

Inputs: index (required), content (required). Returns: object

save_markdownC

Export active notebook cells to markdown block format on disk.

Inputs: path (required). Returns: object

save_notebookC

Validate and save the active notebook to current or new path.

Inputs: path. Returns: object

search_cellC

Search cells by space-separated keywords and return matches with snippets.

Inputs: keywords (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 10 tools

    Disambiguation3/5

    remove_cell and delete_cell are explicit duplicates, and load_notebook/from_markdown plus save_notebook/save_markdown both involve disk I/O for different formats, causing some confusion despite descriptions clarifying differences.

    Naming Consistency4/5

    Most tools follow a clear verb_noun snake_case pattern (e.g., load_notebook, read_cell), but from_markdown breaks the verb pattern with a preposition, creating a minor inconsistency.

    Tool Count5/5

    10 tools is well-scoped for notebook cell manipulation, with each tool serving a distinct purpose except the redundant alias.

    Completeness3/5

    Covers cell CRUD, search, and markdown import/export, but lacks execution of code cells—a core Jupyter operation—and does not allow changing an existing cell's type, leaving notable gaps.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers