Vscode Runtime Notebook Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Vscode Runtime Notebook Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Jupyter Notebook MCP Server
A VS Code / Cursor extension that exposes Jupyter notebook manipulation via MCP (Model Context Protocol): read/edit/run cells and capture outputs. Works with Claude Code, Cursor Agent, Windsurf, and any MCP-compatible AI assistant.
Install: VS Code Marketplace · Open VSX · GitHub
[!IMPORTANT] This project is still pre-alpha so it's very rough on the edge. Working in multiple windows is unstable.
There are currently two main architectures to give AI agents access to Jupyter notebooks. This project was heavily inspired by both - kudos to these teams for pioneering the space:
These servers read/write .ipynb files directly using libraries like nbformat.
Pros: No server dependencies, works out-of-the-box
Cons:
.ipynb JSON format is verbose (~3x more tokens than raw code)These servers connect to Jupyter's REST API and can execute code through the kernel.
Pros: Can execute code, best choice for standalone remote JupyterLab/JupyterHub deployments
Cons:
jupyter lab --port 8888)We're introducing a third architecture - hooking directly into Cursor/VS Code's Notebook API, the same API the editor uses internally.
Pros:
Cons:
| Use case | Recommended |
|---|---|
| VS Code / Cursor + AI coding | This extension |
| Remote VS Code / Cursor (tunnels, containers, SSH) | This extension |
| Standalone JupyterLab/JupyterHub server | Datalayer |
| Just edit cells, no execution needed | File-based |
| Tool | Description |
|---|---|
notebook_list_open | List all open notebooks with URIs and cell counts |
notebook_list_cells | List cells with type, language, preview, execution state |
notebook_get_cell_content | Get full source code of a cell |
notebook_get_cell_output | Get cell outputs (text, errors, images as base64) |
notebook_get_outline | Get notebook structure (headings, functions, classes) |
notebook_search | Search all cells for a keyword with context |
notebook_get_kernel_info | Get kernel name, language, and state |
| Tool | Description |
|---|---|
notebook_insert_cell | Insert a code or markdown cell at any position |
notebook_edit_cell | Replace the content of an existing cell |
notebook_delete_cell | Delete a cell by index |
notebook_move_cell | Move a cell to a different position |
notebook_bulk_add_cells | Add multiple cells in a single operation |
To execute ad-hoc code, use notebook_insert_cell with execute: true. To execute an existing cell, use notebook_run_cell.
| Tool | Description |
|---|---|
notebook_run_cell | Execute an existing code cell by index and return outputs |
notebook_clear_outputs | Clear outputs of a specific cell |
notebook_clear_all_outputs | Clear outputs from all cells |
<details> <summary><b>Tool Parameters</b></summary>
All tools support response_format parameter ("markdown" or "json").
#### notebook_insert_cell
{
"content": "print('hello')",
"type": "code",
"index": 0,
"language": "python",
"execute": false
}#### notebook_edit_cell
{
"index": 0,
"content": "# New content"
}#### notebook_search
{
"query": "import pandas",
"case_sensitive": false,
"context_lines": 1
}#### notebook_move_cell
{
"from_index": 5,
"to_index": 0
}#### notebook_bulk_add_cells
{
"cells": [
{"content": "# Header", "type": "markdown"},
{"content": "x = 1", "type": "code", "language": "python"}
],
"index": 0
}#### notebook_run_cell
{
"index": 0
}</details>
{
"mcpServers": {
"notebook": {
"url": "http://127.0.0.1:49777/mcp"
}
}
}[!ATTENTION] The server starts automatically when VS Code / Cursor opens. Look for the 🪐 :49777 indicator in the status bar.| Setting | Default | Description |
|---|---|---|
notebook-mcp.port | 49777 | Port number for the MCP server |
Tested with a 471-cell notebook (~2.8MB, 1MB outputs):
| Operation | Time |
|---|---|
| List/read cells | <1ms |
| Search all cells | <1ms |
| Generate outline | ~1ms |
| Insert/edit cell | ~7ms |
[!NOTE] Read operations are sub-millisecond because they access in-memory data structures directly. Write operations (~7ms) go through VS Code's edit pipeline for undo/redo support.
┌─────────────────────────────────────────────────────────────────────────┐
│ VS Code / Cursor │
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ Jupyter Extension │ │
│ │ │ │
│ │ Notebook Document ◄───► Kernel (Python) ───► Outputs │ │
│ │ ▲ │ │
│ └────────────────────────────────────┼──────────────────────────────┘ │
│ │ │
│ ┌────────────────────────────────────┼──────────────────────────────┐ │
│ │ Notebook MCP Server Extension │ │
│ │ │ │ │
│ │ ┌────────────────────────────────┴───────────────────────────┐ │ │
│ │ │ HTTP Server (:49777) │ │ │
│ │ │ │ │ │
│ │ │ execute_code insert_cell list_cells get_output ... │ │ │
│ │ └────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
│ HTTP (MCP Protocol)
▼
┌───────────────────────────────┐
│ AI Agent │
│ (Claude Code, Cursor, etc) │
└───────────────────────────────┘This enables true interactive notebook sessions with AI agents in VS Code and Cursor.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.