colab-mcp
# Headless Colab MCP Server
`colab-mcp` is a FastMCP server for controlling Google Colab notebooks through a secure, headless WebSocket architecture. Agents can create, edit, run, and inspect notebook cells without browser automation or UI scraping.
---
## Features
- **Headless Operation** — Run notebook operations through a secure WebSocket proxy
- **Zero Browser Management** — No Chromium, browser profiles, or DOM scraping
- **ML-Ready Tooling** — Workspace setup, dataset handling, and pipeline execution
- **Structured Results** — Typed stdout, stderr, file paths, and error details
- **FastMCP Integration** — Clean MCP server interface for tool composition
---
## Architecture
The server uses two cooperating layers:
### ColabSessionProxy
- Starts a localhost WebSocket server
- Generates a one-time connection URL with `mcpProxyToken` and `mcpProxyPort`
- Waits for an authenticated Colab tab to attach
### NotebookController
- Exposes the stable MCP tool surface
- Discovers proxy capabilities from the connected Colab frontend
- Maps server-owned tools to proxy-backed cell operations
- Falls back to direct runtime execution only when needed
---
## Requirements
| Requirement | Version |
|-------------|---------|
| Python | 3.13+ |
| uv | Latest |
| Google Colab | Active browser session |
---
## Installation
```bash
uv sync
uv run colab-mcp
```
---
## Configuration
Add this to your MCP configuration:
```json
{
"mcpServers": {
"colab-mcp-local": {
"command": "uv",
"args": ["run", "colab-mcp"],
"cwd": "${workspaceFolder}",
"timeout": 30000
}
}
}
```
---
## API Reference
### Core Notebook Tools
| Tool | Description |
|------|-------------|
| `connect_colab(notebook_url?)` | Initialize connection and retrieve proxy URL |
| `list_colab_cells()` | List all cells in the notebook |
| `read_colab_cell(cell_id)` | Read a specific cell |
| `write_colab_cell(code, cell_id?, mode?)` | Write code to a cell |
| `run_colab_cell(cell_id?, wait?, timeout_seconds?)` | Execute a cell |
| `run_colab_code(code, mode?, wait?, timeout_seconds?)` | Write and execute code in one step |
| `get_colab_output(cell_id?)` | Retrieve execution output |
| `save_colab_notebook()` | Save the notebook |
| `run_runtime_code(code)` | Execute code directly in the runtime |
### ML Workflow Tools
| Tool | Description |
|------|-------------|
| `setup_ml_workspace(packages)` | Install packages and create standard data directories |
| `fetch_remote_dataset(download_url, extract_to)` | Download and extract datasets |
| `execute_ml_pipeline(code_block)` | Execute Python blocks with structured results |
---
## Usage
1. Start the MCP server.
2. Call `connect_colab` to get a `connect_url`, `proxy_token`, and `proxy_port`.
3. Paste the `connect_url` into an active Colab tab.
4. Wait for the proxy connection to establish.
5. Run notebook operations through the MCP tools.
### Example
```text
uv run colab-mcp
connect_colab()
setup_ml_workspace(["pandas", "scikit-learn"])
fetch_remote_dataset(url, "/content/data")
execute_ml_pipeline(training_code)
get_colab_output()
```
---
## Development & Verification
```bash
PYTHONPATH=src python scripts/smoke_test.py
PYTHONPATH=src py -m pytest
cat RELEASE_CHECKLIST.md
```
### Test coverage
- Proxy capability discovery
- Native Colab argument mapping
- Cell ID extraction
- ML tool routing through proxy
- Execution result normalization
---
## License
This project is licensed under the [Apache License 2.0](LICENSE).
---
## Acknowledgments
This headless WebSocket proxy architecture was inspired by the open-source work provided by the Google Colab team.
TDQS
Scored across 13 tools
Several tools appear to serve similar purposes: run_colab_cell, run_colab_code, run_runtime_code, and execute_ml_pipeline all seem to execute code, while connect_colab and open_colab_browser_connection overlap in establishing/checking a connection. Without descriptions, it's hard for an agent to pick the right tool.
Most tools follow a verb_noun snake_case pattern, but there's inconsistency: some include 'colab' (e.g., list_colab_cells) while others do not (e.g., setup_ml_workspace, fetch_remote_dataset). Also, the verbs vary widely, making the naming feel less systematic than a strict verb_noun convention.
13 tools is within a reasonable range for a Colab-focused server. However, the presence of four overlapping execution tools inflates the count and suggests some consolidation could improve the set without losing functionality.
The tool surface covers core cell operations (read, write, run, output) and notebook saving, but lacks obvious lifecycle operations like deleting a cell or creating a notebook. The ML-related tools (setup workspace, fetch dataset, pipeline) add breadth but also introduce unclear boundaries and gaps, such as no explicit tool for managing datasets beyond fetching.