
Marimo Pair
Start, discover, and invoke marimo notebook servers correctly inside uv, pixi, or sandbox projects so agents can pair with live notebooks.
Overview
marimo-pair is an agent skill most often used in Build (also Validate prototype work) that explains how to discover and invoke marimo servers with correct project runners and token handling.
Install
npx skills add https://github.com/marimo-team/marimo-pair --skill marimo-pairWhat is this skill?
- Servers with `--no-token` register for local auto-discovery; tokened servers need `MARIMO_TOKEN` env (not CLI args)
- Detects marimo in `pyproject.toml` deps, optional groups, pixi, or `.venv` before choosing `uv run` vs global install
- Supports `uv run --group <name>` when marimo lives in non-default dependency groups
- Outside-project path uses `marimo edit ... --no-token [--sandbox]` when marimo is not a declared dependency
Adoption & trust: 3.6k installs on skills.sh; 321 GitHub stars; 2/3 security scanners passed (skills.sh audits); trending (+200% hot-view momentum).
What problem does it solve?
Your agent keeps starting marimo the wrong way—wrong venv, missing dependency group, or leaking tokens—so notebook pairing fails silently.
Who is it for?
Indie builders using marimo notebooks with agents in uv- or pixi-managed Python repos.
Skip if: Pure Jupyter-only workflows with no marimo dependency, or hosts where you cannot run local Python notebook servers.
When should I use this skill?
Context involves finding or invoking marimo servers, `marimo edit`, uv/pixi runners, `--no-token` discovery, or `MARIMO_TOKEN` for secured servers.
What do I get? / Deliverables
marimo runs via the project’s uv/pixi path or a deliberate sandbox, with discoverable `--no-token` servers and safe token env configuration when required.
- Running marimo edit server with correct runner command
- Agent-discoverable local server when using `--no-token`
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Canonical shelf is Build because marimo pairing happens while implementing analysis notebooks and agent-driven execution—not before you have a codebase context. Agent-tooling fits pairing and registry discovery (`--no-token`) so coding agents can find and run marimo without guessing the project runner.
Where it fits
Start `uv run marimo edit analysis.py --no-token` so the agent discovers the registry entry and executes cells.
Use `pixi run marimo edit` when marimo is declared in `[tool.pixi.dependencies]` for a data microservice repo.
Spin a `--sandbox` marimo session when marimo is not in project deps but you need a quick reactive demo.
How it compares
Project-aware marimo launcher guide—not a generic Python environment skill or a hosted notebook SaaS.
Common Questions / FAQ
Who is marimo-pair for?
Solo builders and small teams pairing Claude Code or Cursor with marimo for reactive notebooks inside real `pyproject.toml` projects.
When should I use marimo-pair?
During Build when standing up notebook-backed features, during Validate prototypes that use marimo sandboxes, and whenever the agent must `marimo edit` with correct `uv run` or `pixi run` invocation.
Is marimo-pair safe to install?
Use the Security Audits panel on this page; `--no-token` improves discovery but weakens local auth—only use on trusted machines and set `MARIMO_TOKEN` carefully for protected servers.
SKILL.md
READMESKILL.md - Marimo Pair
# Finding and Invoking marimo Only servers started with `--no-token` register in the local server registry and are auto-discoverable — starting without a token makes discovery easier. If a server has a token, set the `MARIMO_TOKEN` environment variable before calling the execute script (avoids leaking the token in process listings). ```sh marimo edit notebook.py --no-token [--sandbox] ``` How you invoke `marimo` depends on context — find the right way to run it. ## Inside a Python project If there's a `pyproject.toml` in cwd or a parent directory, check that marimo is actually in the dependencies before using the project's runner. Look for `marimo` in: - `[project.dependencies]` - `[project.optional-dependencies]` or `[dependency-groups]` (dev deps) - `[tool.pixi.dependencies]` - The project's `.venv` (`uv pip show marimo` or check `.venv/bin/marimo`) If marimo is in a named dependency group (not the default), you need to specify it: ```sh # marimo is in [dependency-groups] → "notebooks" group uv run --group notebooks marimo edit notebook.py --no-token ``` Once you know marimo is available, use whatever CLI runner the project uses: ```sh # uv-managed project uv run marimo edit notebook.py --no-token # pixi-managed project pixi run marimo edit notebook.py --no-token ``` Skip `--sandbox` here — the project already manages dependencies. If `pyproject.toml` exists but marimo is **not** in the deps, treat this as "outside a project" (see below). ## Outside a Python project Prefer `--sandbox`. Sandbox mode creates an isolated environment for the notebook and writes dependencies into the script itself as inline PEP 723 metadata — so the notebook stays self-contained and reproducible. ```sh # With uv available (preferred) uvx marimo@latest edit notebook.py --no-token --sandbox # With marimo installed globally marimo edit notebook.py --no-token --sandbox ``` ## Global marimo install If marimo is installed globally, check the version — code mode shipped in v0.21.1. If the installed version is older, prompt the user to upgrade before proceeding. ## Nothing found If no project marimo, no `uv`/`uvx`, and no global `marimo` on PATH, tell the user to install `uv` (<https://docs.astral.sh/uv/getting-started/installation/>). # Gotchas ## Private variables are cell-scoped Variables with a `_` prefix are **private to the cell that defines them** in marimo. They cannot be referenced from other cells — you'll get a `NameError`. This matters when building notebooks programmatically. A common mistake: ```python # Cell A _df = pd.DataFrame(results) # _df is private to this cell # Cell B — FAILS mo.ui.table(_df) # NameError: name '_df' is not defined ``` **Fix:** Either merge both into one cell, or use a non-private name (`df`). ## Duplicate public imports across cells marimo enforces single-definition: a public name (like `pd`) can only be defined in one cell. If two cells both `import pandas as pd`, you get a `Multiply-defined names` error at validation. **Fix:** Use a `_` prefix on the second import (`import pandas as _pd`) or consolidate imports into a shared cell. ## `inspect.getsource()` on methods is indented `inspect.getsource()` on a class method preserves the original indentation. Passing this to `ast.parse()` fails with `IndentationError`. ```python # FAILS src = inspect.getsource(SomeClass.some_method) tree = ast.parse(src) # IndentationError: unexpected indent # FIX import textwrap src = textwrap.dedent(inspect.getsource(SomeClass.some_method)) tree = ast.parse(src) ``` ## Cached module availability Some libraries cache optional-dependency availability at import time. Installing a package mid-session via `ctx.packages.add()` won't update those caches. The user may need to restart the kernel — but try known workarounds first. ### Polars + pyarrow `df.to_pandas()` fails with `ModuleNotFoundError: pa.Table requires 'pyarrow'`. **Workaround** — if this error occurs after installing pyar