xtralab
An opinionated JupyterLab meta-package for use with coding agents.
It bundles a curated set of JupyterLab extensions, a path-first file browser,
git diffs rendered by xtralab, an agent launcher, and a quieter default
workspace.

Install
pip install xtralab
Usage
As a JupyterLab package
Once installed, start JupyterLab the usual way:
jupyter lab
As a desktop app
A standalone Electron build is also available, packaged as a DMG on macOS and
an AppImage on Linux. Each tagged release ships installers on the
releases page, and builds
from main are uploaded as workflow artifacts on the
Actions tab. See
CONTRIBUTING.md for the desktop app architecture and local
build instructions.
What's included
xtralab builds on ajlab, the agent-ready
JupyterLab base. On top of it, xtralab pulls in JupyterLab 4.6+ with
jupyterlab-git, jupyterlab-lsp, jupyterlab-quickopen, jupyterlab-vim,
and a set of light and dark themes (jupyterlab-cursor-light,
jupyterlab-cursor-dark, jupyterlab-day, jupyterlab-night). See
pyproject.toml for the full list and pinned versions.
The bundled xtralab labextension then adds:
- A path-first file browser in the left sidebar.
- Git diffs rendered by xtralab in the
jupyterlab-git panel, using
@pierre/diffs for text and notebooks and a 2-up / swipe / onion-skin view
for images.
- An agent launcher with a prompt box, buttons for the agents installed on your
machine (Claude, Codex, Antigravity, Copilot, Goose, OpenCode, Kiro, Mistral
Vibe), a collapsible list of changed files, and an Open row for a terminal,
notebook, console, or your terminal editor (Neovim or Vim).
- A Terminals panel listing the running terminal sessions, each badged with the
agent or editor detected inside it. Open terminal tabs in the main area carry
the same icon.
- Sidebar toggle buttons in the top bar for the left and right areas.
Connecting agents to Jupyter (MCP)
xtralab runs a Model Context Protocol server inside JupyterLab,
provided by jupyter-server-mcp. To let a coding agent drive JupyterLab
through it, register the bundled jupyter-server-mcp-proxy console script with
the agent:
claude mcp add jupyter -- jupyter-server-mcp-proxy
codex mcp add jupyter -- jupyter-server-mcp-proxy
copilot mcp add jupyter -- jupyter-server-mcp-proxy
Run this from a terminal inside xtralab, so the proxy inherits the server
environment and discovers the running server automatically. No port is needed,
and a single registration keeps working across restarts. The launcher also
surfaces these commands with copy buttons, filtered to the agents you have
installed.
See the jupyter-server-mcp README for other MCP clients.
Agent skill
xtralab ships an Agent Skills entry at agent-skill/
that teaches any coding agent how to customize JupyterLab from plain-English
requests like "hide the status bar", "change the theme", or "add a language
server". The same SKILL.md file works with Claude Code, Codex CLI, Gemini CLI,
GitHub Copilot, and other tools that read the Agent Skills format.
For Claude Code, this repository doubles as a one-plugin marketplace. Inside a
Claude Code session:
/plugin marketplace add jtpio/xtralab
/plugin install xtralab-skills@xtralab
For agents that read from ~/.agents/skills/, such as Codex CLI or Gemini CLI,
clone and copy the skill directory:
git clone --depth=1 https://github.com/jtpio/xtralab.git /tmp/xtralab
mkdir -p ~/.agents/skills
cp -r /tmp/xtralab/agent-skill/skills/customize-jupyterlab ~/.agents/skills/
See agent-skill/README.md for additional install
paths, the list of supported agents, and what the skill knows.
Language servers
xtralab ships [jupyterlab-lsp][lsp] with two language servers pre-registered:
-
Python, using ty, which is bundled and
works out of the box.
-
TypeScript and JavaScript, using typescript-language-server, which you
install yourself:
npm install -g typescript-language-server typescript
Restart JupyterLab afterwards to pick it up.