MCP server that drives a classic Notebook through the nbclassic-mcp-bridge relay
Server has 21 well-named tools with consistent verb_noun patterns (list_, use_, read_, create_, execute_, etc.). All tools have descriptions (10 - 200 chars, within baseline 34 - 392 range). Input schemas are present and typed for all tools. However, parameter descriptions are sparse or missing for many inputs, and output schemas are not documented. Error handling guidance is absent. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications. Descriptions are functional but brief; many lack WHEN/WHY context. This is solid foundational work but falls short of production-grade LLM optimization.
Create a checkpoint of the notebook's saved state.
Create a new notebook file on the Jupyter server.
Delete a cell from the notebook.
Execute a cell and wait for its output.
Insert a new cell into the notebook.
Interrupt the kernel's current execution.
List the checkpoints available for the notebook.
Output schemas not documented. LLMs cannot plan downstream tool calls or extract required fields (e.g., what does read_notebook return? What fields does list_notebooks expose?). Baseline: 100% of A+ tools document return types.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications (READ_ONLY, WRITE, DESTRUCTIVE, REVERSIBLE). LLMs cannot infer safety properties and may misuse tools. Current spec (2026-07-28) expects tool annotations.
Parameter descriptions sparse or missing. Many inputs lack explanation of format, constraints, or dependencies. E.g., 'notebook' param appears in 15+ tools but descriptions vary or are absent. Baseline: 100% of A+ tool params have descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
List the notebooks open on every Jupyter server this session has touched.
Move a cell to a new position in the notebook.
Fetch retained events from a notebook since a given sequence number.
Read one cell's source and outputs.
Fetch a raster image from a cell's outputs as base64.
Read the current notebook's cells and metadata.
Restart the kernel, clearing all variables.
Restore the notebook to a saved checkpoint.
Save the notebook to disk.
Replace a cell's source code.
Undo the last agent mutation to the notebook.
Attach a notebook by name, making it the current one for subsequent operations.
Derive a Jupyter server URL and token from a project directory path, and attach the notebook at that path.
Attach a notebook on a Jupyter server by URL and token.
No error handling guidance. Tools lack recovery hints (e.g., 'If kernel is unresponsive, try restart_kernel'). Baseline: error responses must tell LLM what to do next.
Descriptions lack WHEN/WHY context. E.g., 'Attach a notebook by name' does not explain when to use use_notebook vs use_project vs use_server. LLMs waste reasoning cycles disambiguating similar tools.