venv-manager
venv-manager
A Python virtual-environment runtime for humans and AI agents.
Written in Go. One static binary, no runtime deps beyond python3 (or uv, if available).

The GIF above is real: venv-manager watch app.py --venv X monitors a file, scans its imports with a tiny AST-lite parser, and pip-installs whatever is missing — every time the file changes. Point it at a script an LLM is iterating on and the venv converges as the code does.
Why
Two failure modes drove this tool:
Human sprawl. Venvs multiply across
~, cache directories eat GB, activation syntax varies by shell, and cloning "the env that worked" means copy-pastingpip freezebetween terminals.Agent sprawl. LLMs generating Python routinely
pip installinto the wrong interpreter, forget to setVIRTUAL_ENV, leave half-installed packages behind after a crash, and have no typed API to reason about environment state — only shells.
venv-manager solves (1) with a clean CLI and (2) with a Model Context Protocol server, typed JSON snapshots, ephemeral venvs with OS-level sandboxing, and a file watcher that keeps a venv in sync with an evolving script.
Related MCP server: Sympathy-MCP
Install
Homebrew (macOS, Linux):
brew install jacopobonomi/tap/venv-managerOne-line install script (macOS, Linux):
curl -sSL https://raw.githubusercontent.com/jacopobonomi/venv_manager/main/install.sh | bashFrom source:
git clone https://github.com/jacopobonomi/venv_manager && cd venv_manager
make installRequires Go 1.24+ to build, Python 3.x at runtime.
AI integration
MCP server
Exposes venv operations as native Model Context Protocol tools. Agentic clients (Claude Desktop, Cursor, Zed) call typed tools with JSON Schemas instead of guessing shell invocations.
Wire it up in Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"venv-manager": {
"command": "venv-manager",
"args": ["mcp"]
}
}
}Tools exposed (JSON-RPC 2.0 over stdio):
Tool | Purpose |
| Names of all managed venvs. |
|
|
|
|
|
|
| `{name, packages[] |
|
|
|
|
|
|
|
|
|
|
|
|
| Python versions on |
Implementation: ~350 LOC, zero third-party MCP deps. Newline-delimited JSON-RPC 2.0 on stdin/stdout.
Ephemeral execution (uvx-style, 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 uses sandbox-exec on macOS and bwrap on Linux. Deny-by-default profile with explicit allow-lists for the venv path, /tmp, and process management. Network is unshared.
File watcher
venv-manager watch app.py --venv myenvfsnotify on the parent directory (survives editor atomic-rename writes), 500 ms debounce, then:
AST-lite regex scan of
.pyfiles (skips docstrings, relative imports, and vendored dirs like.venv,.git,__pycache__,node_modules)Filter against a stdlib module set
Resolve import-name → pip-package aliases (
cv2→opencv-python,sklearn→scikit-learn,PIL→Pillow,bs4→beautifulsoup4,yaml→PyYAML, ...)Diff against installed packages
pip installthe delta
The venv is always a superset of the current file's requirements. This is the loop the demo GIF above exercises.
JSON snapshot as a single-call context 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",
"pwsh": "/Users/me/.venvs/myenv/bin\\Activate.ps1",
"cmd": "/Users/me/.venvs/myenv/bin\\activate.bat"
}
}One tool call, everything an agent needs to reason about the environment. freeze_hash lets an agent detect drift between two describe calls in O(1) instead of diffing package lists.
Commands
Command | Description |
| Create a venv. Uses |
| List venvs. |
| Delete a venv. |
| Rename and re-generate activation scripts via |
| Fresh venv seeded with |
| Installed packages. |
|
|
| Upgrade outdated packages (per venv or all). |
| Purge pip cache + |
| Disk usage. |
| Print shell command for |
| Print |
| Execute in a venv without activating; inherited stdio. |
| Ephemeral venv run. |
| Full JSON snapshot (see above). |
| Extract third-party imports; check against venv. |
| Auto-install missing imports on file change. |
| Capture pip-freeze state. |
| List snapshots (newest first). |
| Uninstall all, reinstall from snapshot. |
| Print portable manifest (name + python version + freeze) as JSON. |
| Recreate venv from manifest. |
| Remove venvs unused for N days. |
| Diagnose python versions, uv, broken venvs. |
`config show | path |
| Model Context Protocol server on stdio. |
| Bubble Tea TUI browser. |
`completion [bash | zsh |
Most read commands also accept --json for stable, machine-parseable output.
Configuration
~/.config/venv-manager/config.json (respects $XDG_CONFIG_HOME and $VENV_MANAGER_CONFIG):
{
"base_dir": "/custom/path/to/venvs",
"default_python": "3.12",
"use_uv": true,
"prune_after_days": 90
}Bootstrap: venv-manager config init.
uv backend
If uv is on PATH and use_uv: true, create runs uv venv. Typically 10–100× faster than python -m venv on cold cache.
Development
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 runs go vet, go test -race on Ubuntu + macOS, and integration tests on Ubuntu with Python 3.12.
Architecture:
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 formattingLicense
MIT.
Author
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityCmaintenanceProduction-ready MCP server for secure Python code execution with artifact capture, virtual environment support, and LM Studio integration.10Apache 2.0
- FlicenseAqualityDmaintenanceAn MCP server for managing Incus virtual machines through structured tools for command execution, file management, and snapshot operations. It enables AI agents to puppeteer VMs on a masternode by wrapping the Incus CLI.9
- AlicenseBqualityDmaintenanceProduction-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.15323MIT
- FlicenseBqualityFmaintenanceAn MCP server that manages Python virtual environments using uv, allowing LLMs to reliably resolve dependencies and update virtual environments.67
Related MCP Connectors
Provision and manage a VPS for AI agents over MCP: register, order, get root, control the server.
Artifact store for AI agents. Hosted OAuth at mcp.artifacta.io/mcp; local stdio via npm/PyPI.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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