jupyter-notebook-mcp
Provides tools for loading, editing, searching, and saving Jupyter notebooks (.ipynb) through an MCP interface.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jupyter-notebook-mcpload my notebook experiments.ipynb"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
ToolErrormessages for common failure cases
Related MCP server: Jupyter MCP Server
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
indexis omittedInserts below the referenced cell when
indexis provided (insert atindex + 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.12uvfor 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-mcpInstall as a uv tool:
uv tool install jupyter-notebook-mcp --from git+https://github.com/g0g5/jupyter-notebook-mcpQuick Start
uv sync
uv run python -m jupyter_notebook_mcpYou can also run via the project script entrypoint:
uv run jupyter-notebook-mcpMCP 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 syncTypecheck (lightweight compile check):
uv run python -m py_compile jupyter_notebook_mcp/*.py tests/*.pyRun tests:
uv run pytest -vProject 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.pyBehavior 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.validatebefore writing.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/g0g5/jupyter-notebook-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server