Skip to main content
Glama
jacopobonomi

venv-manager

by jacopobonomi

venv-manager

CI Go Reference License: MIT Release Website jacopobonomi/venv-manager MCP server

Eine Kontrollebene für Python-Umgebungen für Entwickler und jeden KI-Coding-Agenten.

Geschrieben in Go. Eine statische Binärdatei, keine Laufzeitabhängigkeiten außer python3 (oder uv, falls verfügbar).

demo

Das obige GIF ist echt: venv-manager watch app.py --venv X überwacht eine Datei, scannt ihre Importe mit einem winzigen AST-lite-Parser und installiert per pip, was fehlt – bei jeder Änderung der Datei. Richten Sie es auf ein Skript, an dem ein LLM arbeitet, und die venv konvergiert mit dem Code.


Warum

Claude, Codex, Cursor und andere Coding-Agenten können bereits Shell-Befehle ausführen, ein .venv erstellen und vor sensiblen Operationen um Genehmigung bitten. Was sie nicht teilen, ist ein dauerhafter Zustand der Python-Umgebung.

Sandboxing schützt die Maschine. venv-manager schützt den Workflow: Es gibt jedem Agenten dieselben Umgebungen, Metadaten, Paketverlauf und Wiederherstellungspfade, unabhängig vom gerade laufenden Client.

Zwei Fehlermodi haben dieses Tool angetrieben:

  1. Menschliche Ausbreitung. Venvs vermehren sich über ~, Cache-Verzeichnisse fressen GB, die Aktivierungssyntax variiert je nach Shell, und das Klonen von „der Umgebung, die funktioniert hat" bedeutet, pip freeze zwischen Terminals zu kopieren.

  2. Agenten-Ausbreitung. KI-Agenten können in den falschen Interpreter installieren, partielle Änderungen hinterlassen und den Umgebungskontext verlieren, wenn Sie den Client wechseln oder eine neue Sitzung starten.

venv-manager löst (1) mit einer sauberen CLI und (2) mit einem gemeinsamen Model Context Protocol Server, einem persistenten Registry, typisierten Snapshots und Diffs, umkehrbaren Paketänderungen, ephemeren Venvs mit OS-Level-Sandboxing und einem Datei-Watcher, der eine venv mit sich entwickelndem Code synchron hält.

Was die Agenten-Sandbox nicht löst

Agentenfähigkeit

Gemeinsame Umgebungskontrolle

Genehmigt oder blockiert einen Shell-Befehl

Zeichnet auf, welche Umgebung zu welchem Projekt gehört

Beschränkt Dateisystem- und Netzwerkzugriff

Bewahrt den Zustand über Claude, Codex und andere Clients

Erstellt eine venv, wenn dazu aufgefordert

Verfolgt Erstellungs- und echte letzte Nutzungs-Metadaten

Führt pip, Poetry oder uv aus

Zeigt Paketänderungen zwischen Snapshots

Stoppt eine unsichere Aktion

Rollt eine beschädigte Umgebung auf einen bekannten Zustand zurück

Die beiden Ebenen ergänzen sich: Agentenberechtigungen kontrollieren, was jetzt passieren darf; venv-manager zeichnet auf, was existiert, was sich geändert hat und wie man es wiederherstellt.


Related MCP server: Sympathy-MCP

Installation

Homebrew (macOS, Linux):

brew install jacopobonomi/tap/venv-manager

Einzeiliges Installationsskript (macOS, Linux):

curl -sSL https://raw.githubusercontent.com/jacopobonomi/venv_manager/main/install.sh | bash

Aus dem Quellcode:

git clone https://github.com/jacopobonomi/venv_manager && cd venv_manager
make install

Erfordert Go 1.24+ zum Bauen, Python 3.x zur Laufzeit.


KI-Integration

MCP-Server

Stellt venv-Operationen als native Model Context Protocol-Tools bereit. Claude, Codex, Cursor, Zed und andere MCP-Clients rufen dieselben typisierten Tools auf und arbeiten mit demselben persistenten Umgebungszustand, anstatt unabhängig Shell-Aufrufe zu erraten.

Einrichtung in Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "venv-manager": {
      "command": "venv-manager",
      "args": ["mcp", "--policy", "safe"]
    }
  }
}

Verfügbare Tools (JSON-RPC 2.0 über stdio):

Tool

Zweck

list_venvs

Namen aller verwalteten Venvs.

create_venv

{name, python_version?} → neue venv, verwendet uv, falls konfiguriert.

remove_venv

{name} → rekursives Löschen.

describe_venv

{name} → vollständiger Snapshot: Python-Version, Pakete, Größe, Freeze-Hash, Aktivierungsbefehle pro Shell.

install_packages

`{name, packages[]

requirements_file}` → pip install mit kombiniertem stdout+stderr zurückgegeben.

run_in_venv

{name, command[]} → Ausführung in der venv mit gesetztem VIRTUAL_ENV und vorangestelltem PATH. Erfasste Ausgabe.

exec_ephemeral

{packages[], python_version?, command[]} → erstellen-installieren-ausführen-zerstören in einem einzigen Aufruf.

snapshot_venv

{name, label?} → pip freeze erfassen; ermöglicht rollback_venv.

list_snapshots

{name} → neueste zuerst.

rollback_venv

{name, snapshot_id?} → Snapshot-Zustand installieren, dann Pakete entfernen, die nicht darin enthalten sind.

diff_snapshots

{name, from_snapshot_id, to_snapshot_id?} → Paket-Diff; to_snapshot_id für aktuellen Zustand weglassen.

scan_imports

{path, venv?} → gefundene Drittanbieter-Importe; wenn venv übergeben wird, wird gemeldet, welche fehlen.

list_registry

Persistente Projekt-, Tag-, Erstellungs- und letzte Nutzungs-Metadaten.

set_registry_metadata

{name, project?, tags[]?, confirm?} → Registry-Metadaten aktualisieren.

doctor

Python-Versionen auf PATH, uv-Verfügbarkeit, defekte Venvs.

Der Server verwendet standardmäßig die safe-Richtlinie. Installation, Rollback, Entfernung und beliebige Ausführung erfordern confirm: true. Verwenden Sie --policy read-only für reine Inspektions-Clients, --policy full für uneingeschränkte Kompatibilität, und wiederholen Sie --allow-tool NAME, um nur eine explizite Teilmenge freizugeben. Diese Richtlinien sind Defense in Depth: Sie bleiben konsistent, auch wenn verschiedene Clients unterschiedliche Genehmigungseinstellungen haben.

Die Implementierung verwendet keine Drittanbieter-MCP-Abhängigkeiten. Newline-getrenntes JSON-RPC 2.0 auf stdin/stdout.

Ephemere Ausführung (uvx-Stil, sandboxed)

# create → install → run → destroy, all in one call
venv-manager exec --with requests -- python -c "import requests; print(requests.__version__)"

# with an OS sandbox: no network, no writes outside /tmp + the ephemeral venv
venv-manager exec --sandbox --with pandas -- python untrusted.py

--sandbox verwendet sandbox-exec auf macOS und bwrap auf Linux. Deny-by-default-Profil mit expliziten Allow-Listen für den venv-Pfad, /tmp und Prozessverwaltung. Netzwerk ist nicht geteilt.

Datei-Watcher

venv-manager watch app.py --venv myenv

fsnotify auf dem übergeordneten Verzeichnis (überlebt atomare Rename-Schreibvorgänge des Editors), 500 ms Entprellung, dann:

  1. AST-lite-Regex-Scan von .py-Dateien (überspringt Docstrings, relative Importe, lokale Module/Pakete und vendored Verzeichnisse wie .venv, .git, __pycache__, node_modules)

  2. Filter gegen einen Stdlib-Modulsatz

  3. Auflösung von Importname → pip-Paket-Aliassen (cv2opencv-python, sklearnscikit-learn, PILPillow, bs4beautifulsoup4, yamlPyYAML, ...)

  4. Diff gegen installierte Pakete

  5. pip install des Deltas

Die venv ist immer eine Obermenge der aktuellen Dateianforderungen. Dies ist die Schleife, die das Demo-GIF oben ausführt.

Persistente Registry

Jede Umgebung wird in ~/.venvs/.venv-manager/registry.json mit Erstellungs- und letzte-Nutzung-Zeitstempeln, einem optionalen Projektpfad und Tags verfolgt. Schreibvorgänge sind atomar und die Registry gleicht sich mit Live-venv-Verzeichnissen ab.

venv-manager registry
venv-manager registry set research --project ~/work/paper --tag data,ai
venv-manager registry research

prune verwendet die Registry-last_used_at anstelle der Verzeichnisänderungszeit, wenn Metadaten verfügbar sind.

JSON-Snapshot als Einzelaufruf-Kontext-Primer

venv-manager describe myenv
{
  "name": "myenv",
  "path": "/Users/me/.venvs/myenv",
  "python_version": "3.12.6",
  "python_path": "/Users/me/.venvs/myenv/bin/python",
  "pip_path": "/Users/me/.venvs/myenv/bin/pip",
  "packages": ["requests==2.34.2", "rich==15.0.0", ...],
  "package_count": 12,
  "size_bytes": 45123456,
  "size_human": "43.03 MB",
  "modified_at": "2026-07-20T15:41:35Z",
  "freeze_hash": "sha256:2c58d830...",
  "activation": {
    "bash": "source '/Users/me/.venvs/myenv/bin/activate'",
    "zsh":  "source '/Users/me/.venvs/myenv/bin/activate'",
    "fish": "source '/Users/me/.venvs/myenv/bin/activate.fish'"
  }
}

Ein Tool-Aufruf, alles, was ein Agent braucht, um über die Umgebung zu reasoning. freeze_hash ermöglicht einem Agenten, Drift zwischen zwei describe-Aufrufen in O(1) zu erkennen, anstatt Paketlisten zu diffen.


Befehle

Command

Description

create <name> [--python VER]

Erstellt eine venv. Verwendet uv, wenn use_uv: true in der Konfiguration.

list [--json]

Listet venvs auf.

remove <name>

Löscht eine venv.

rename <old> <new>

Benennt um und generiert Aktivierungsskripte neu über python -m venv --upgrade.

clone <src> <dst>

Frische venv, befüllt mit pip freeze der Quelle.

packages <name> [--json]

Installierte Pakete.

install <name> <requirements>

pip install -r.

upgrade [name] [--global]

Aktualisiert veraltete Pakete (pro venv oder alle).

clean [name] [--global]

Leert pip-Cache und __pycache__-Verzeichnisse.

size [name] [--global] [--json]

Speicherverbrauch.

activate <name>

Gibt Shell-Befehl für eval $(...) aus.

deactivate

Gibt deactivate aus.

run <name> -- <cmd>

Führt in einer venv aus, ohne zu aktivieren; erbt stdio.

exec [--with pkgs] [-r req] [--python V] [--sandbox] [--keep] -- <cmd>

Ephemere venv-Ausführung.

describe <name>

Vollständiger JSON-Snapshot (siehe oben).

scan <path> [--venv N] [--json]

Extrahiert Drittanbieter-Imports; prüft gegen venv.

watch <path> --venv N

Installiert fehlende Imports automatisch bei Dateiänderung.

snapshot <name> [-l LABEL]

Erfasst pip-freeze-Zustand.

snapshots <name> [--json]

Listet Snapshots auf (neueste zuerst).

rollback <name> [snapshot-id]

Installiert zuerst den Snapshot-Zustand, entfernt dann Pakete, die darin fehlen.

snapshot-diff <name> <from> [to]

Vergleicht Snapshots oder einen Snapshot mit dem aktuellen Zustand.

export <name>

Gibt portables Manifest (Name + Python-Version + freeze) als JSON aus.

import <manifest.json>

Erstellt venv aus Manifest neu.

prune [--days N] [--dry-run] [--yes] [--json]

Meldet veraltete venvs; erfordert --yes vor dem Entfernen.

registry [name]

Zeigt persistente Metadaten zu Erstellung, Nutzung, Projekt und Tags.

registry set <name> [--project PATH] [--tag TAGS]

Aktualisiert Projektzuordnung und Tags.

doctor [--json]

Diagnostiziert Python-Versionen, uv, defekte venvs.

`config show

path

init`

Konfiguration anzeigen / finden / initialisieren.

mcp [--policy MODE] [--allow-tool NAME]

MCP-Server mit Read-only-, Safe- oder Full-Autorisierungsrichtlinie.

tui

Bubble-Tea-TUI-Browser.

`completion [bash

zsh

fish

powershell]`

Shell-Vervollständigungsskripte.

Die meisten Lese-Befehle akzeptieren ebenfalls --json für stabile, maschinenlesbare Ausgabe.


Konfiguration

~/.config/venv-manager/config.json (berücksichtigt $XDG_CONFIG_HOME und $VENV_MANAGER_CONFIG):

{
  "base_dir": "/custom/path/to/venvs",
  "default_python": "3.12",
  "use_uv": true,
  "prune_after_days": 90
}

Initialisierung: venv-manager config init.

uv-Backend

Wenn uv im PATH ist und use_uv: true gesetzt ist, führt create uv venv aus. Typischerweise 10–100× schneller als python -m venv bei kaltem Cache.


Entwicklung

make build            # go build -o bin/venv-manager
make test             # unit tests
make demo             # regenerate scripts/demo/demo.gif via VHS
go test -tags=integration ./internal/manager/...   # integration tests (real pip, real PyPI)

CI führt go vet, go test -race auf Ubuntu + macOS sowie Integrationstests auf Ubuntu mit Python 3.12 aus.

Architektur:

cmd/venv-manager/           cobra CLI
internal/manager/           core operations (create, install, snapshot, scan, watch, exec, describe, ...)
internal/config/            XDG-aware JSON config
internal/mcp/               JSON-RPC 2.0 MCP server (stdio)
internal/tui/               Bubble Tea browser
internal/utils/             platform helpers, size formatting

Lizenz

MIT.

Autor

Jacopo Bonomi

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jacopobonomi/venv_manager'

If you have feedback or need assistance with the MCP directory API, please join our Discord server