marimo/skills/marimo-mcp/SKILL.md
marimo's built-in MCP server (10 read-only inspection tools — get_active_notebooks, get_cell_outputs, get_notebook_errors, etc.) at port 2718 path /mcp/server. Use when working with the marimo MCP tool catalog, programmatic notebook diagnostics, or the cells-don't-execute-via-MCP gap (marimo MCP is read-only; cells run via WebSocket from a browser OR `marimo export ipynb --include-outputs` for headless execution).
npx skillsauth add overthinkos/overthink-plugins marimo-mcpInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
marimo's notebook server has a built-in MCP endpoint enabled by the
--mcp flag (see /ov-marimo:marimo-layer service spec). It serves
10 inspection tools for diagnosing active notebook sessions —
read-only: cells cannot be executed via this MCP. Execution
requires a browser-attached WebSocket session OR
marimo export ipynb --include-outputs for headless runs.
http://{{.ContainerName}}:2718/mcp/server # in-pod
http://localhost:22718/mcp/server # host-side (mapped port)
Transport: Streamable HTTP. Registered in this plugin's .mcp.json
as the marimo server.
All tools are read-only. Each takes an args JSON object as
the sole parameter (often {} or {"session_id": "..."}).
| Tool | Purpose |
|---|---|
| get_marimo_rules | Returns the official marimo rules for AI assistants |
| get_active_notebooks | Lists currently-open notebooks + session IDs + active connection counts |
| get_lightweight_cell_map | Per-cell preview (cell_id, line_count, runtime_state, has_output, has_errors) for a session |
| get_cell_runtime_data | Full runtime data for one or more cells: code, errors, declared variables |
| get_cell_outputs | Cell execution outputs (visual display + console streams) |
| get_tables_and_variables | All tables and variables visible in a session |
| get_database_tables | Database table info (regex query supported) |
| get_notebook_errors | All errors in a session, organised by cell |
| lint_notebook | Lint a marimo notebook for issues |
| get_cell_dependency_graph | Cell dependency graph (variable-flow edges) |
marimo's reactive runtime executes cells based on dependency-graph analysis when variable values change in the editor. The MCP exposes a read surface against an active session — there's no "run cell N" RPC because that's not how marimo orchestrates cells.
Two paths to execute notebook content programmatically:
Browser-attached run — open the notebook in a browser; marimo reactively runs all reachable cells. The marimo MCP can then read the session state (cell outputs, errors, variables).
Headless export — marimo export ipynb --include-outputs runs
every cell server-side and writes a Jupyter notebook with embedded
outputs. Used in this repo's R10 acceptance for the
osm-monaco-viz.py notebook:
podman exec ov-marimo-ml-pod /home/user/.pixi/envs/default/bin/marimo \
export ipynb /home/user/workspace/notebooks/osm-monaco-viz.py \
--include-outputs --sort topological -o /tmp/notebook-run.ipynb -f
Requires nbformat in the pixi env (already pinned in
layers/marimo/pixi.toml).
Ping the server (proves it's alive + reachable):
ov eval mcp ping marimo-ml-pod --name marimo
List the tools (catalog enumeration):
ov eval mcp list-tools marimo-ml-pod --name marimo
Inspect a session's cell map (real diagnostic):
SID=$(ov eval mcp call marimo-ml-pod get_active_notebooks '{"args":{}}' --name marimo \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["data"]["notebooks"][0]["session_id"])')
ov eval mcp call marimo-ml-pod get_lightweight_cell_map "{\"args\":{\"session_id\":\"$SID\"}}" --name marimo
The MCP server name marimo is the service contract — declared in
layers/marimo/layer.yml mcp_provides.name: marimo. This plugin's
.mcp.json keys off the same name. Renames of the layer / Python
package / image MUST NOT change this name unless the contract is
explicitly broken in a hard cutover.
/ov-marimo:marimo-layer — layer that runs the server/ov-marimo:airflow-mcp — the OTHER MCP server in the same pod/ov-marimo:notebook-osm — example notebook diagnosed via this MCP/ov-build:mcp — MCP probe verb authoring + URL rewriter/ov-eval:eval — ov eval mcp subcommand referencetools
Use when authoring or modifying a charly PLUGIN — a candy with a `plugin:` block that contributes Providers (verbs/kinds/deploy-targets/steps/builders/commands), its own CUE schema, builtin (compiled-in) or external (out-of-tree git repo). Covers the unified Provider model, the per-plugin CUE-schema contract (single source → Go params for dev + schema-over-Describe RPC for runtime), the SDK, and the loader.
tools
The CUE data-validation / configuration CLI (cue), pinned to v0.16.1. Use when working with the cue candy, installing the cue binary into a box or onto a target:local dev host, or running the offline schema-vendoring pipeline that feeds charly's egress validation.
tools
CUE EGRESS validation — validating (and, where it adds value, generating) the config files charly WRITES to a system BEFORE the bytes hit disk. MUST be invoked before working on charly/egress.go, the vendored schemas under candy/plugin-egress/egress-schemas/vendor/, the ValidateEgress / registerVendoredEgressKind path, the offline `task cue:vendor` pipeline, or adding an egress schema for any written artifact (cloud-init, k8s manifests, traefik routes, runtime config, install ledger, systemd/quadlet units, ssh_config, libvirt XML).
tools
Kubernetes cluster-probe declarative check verb — the `kube:` check verb (nodes, pods, ingress, storage class, addon health, apply/delete, and arbitrary resource GETs) served out-of-process by the candy/plugin-kube plugin (vendored client-go; no external kubectl required).