Skip to main content
Glama

venv-manager

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

開発者とすべてのAIコーディングエージェントのための、単一のPython環境制御レイヤー。

Goで書かれています。単一の静的バイナリで、python3(または利用可能な場合はuv)以外のランタイム依存関係はありません。

demo

上のGIFは実際の動作です: venv-manager watch app.py --venv X はファイルを監視し、小さなASTライトパーサーでインポートをスキャンし、不足しているものをpipインストールします — ファイルが変更されるたびに。LLMが反復処理しているスクリプトにこれを向けると、venvはコードの進化に合わせて収束します。


なぜ

Claude、Codex、Cursor、その他のコーディングエージェントは、すでにシェルコマンドを実行したり、.venvを作成したり、機密操作の前に承認を求めることができます。しかし、彼らが共有しないのは、永続的なPython環境の状態です。

サンドボックスはマシンを保護します。venv-managerはワークフローを保護します: 実行中のクライアントに関係なく、すべてのエージェントに同じ環境、メタデータ、パッケージ履歴、復旧パスを提供します。

このツールを生んだ2つの障害モード:

  1. 人間の乱雑さ。 venvが~全体に増殖し、キャッシュディレクトリがGBを消費し、アクティベーション構文がシェルごとに異なり、「動作した環境」を複製するには、ターミナル間でpip freezeをコピー&ペーストする必要があります。

  2. エージェントの乱雑さ。 AIエージェントは誤ったインタープリタにインストールしたり、部分的な変更を残したり、クライアントを切り替えたり新しいセッションを開始すると環境コンテキストを失ったりする可能性があります。

venv-managerは、(1)をクリーンなCLIで解決し、(2)を共有のModel Context Protocolサーバー、永続的なレジストリ、型付きのスナップショットと差分、元に戻せるパッケージ変更、OSレベルのサンドボックスを備えた一時的なvenv、そして進化するコードとvenvを同期させるファイルウォッチャーで解決します。

エージェントサンドボックスが解決しないこと

エージェントの機能

共有環境制御

シェルコマンドを承認またはブロックする

どの環境がどのプロジェクトに属するかを記録する

ファイルシステムとネットワークアクセスを制限する

Claude、Codex、その他のクライアント間で状態を保持する

プロンプトでvenvを作成する

作成日時と実際の最終使用メタデータを追跡する

pip、Poetry、uvを実行する

スナップショット間のパッケージレベルの変更を表示する

安全でないアクションを停止する

破損した環境を既知の状態にロールバックする

2つのレイヤーは相互に補完します: エージェントの権限は今何が起こるかを制御し、venv-managerは何が存在し、何が変更され、どう回復するかを記録します。


Related MCP server: Sympathy-MCP

インストール

Homebrew (macOS、Linux):

brew install jacopobonomi/tap/venv-manager

ワンライナーインストールスクリプト (macOS、Linux):

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

ソースから:

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

ビルドにはGo 1.24以上、実行時にはPython 3.xが必要です。


AI統合

MCPサーバー

venv操作をネイティブのModel Context Protocolツールとして公開します。Claude、Codex、Cursor、Zed、その他のMCPクライアントは、同じ型付きツールを呼び出し、独立してシェル呼び出しを推測する代わりに、同じ永続的な環境状態を操作します。

Claude Desktopで設定します (~/Library/Application Support/Claude/claude_desktop_config.json):

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

公開されるツール (stdio上のJSON-RPC 2.0):

ツール

目的

list_venvs

管理されているすべてのvenvの名前。

create_venv

{name, python_version?} → 新しいvenvを作成。設定されていればuvを使用。

remove_venv

{name} → 再帰的に削除。

describe_venv

{name} → 完全なスナップショット: Pythonバージョン、パッケージ、サイズ、freezeハッシュ、シェルごとのアクティベーションコマンド。

install_packages

{name, packages[] | requirements_file} → pip installを実行し、stdout+stderrを結合して返します。

run_in_venv

{name, command[]} → VIRTUAL_ENVを設定しPATHを先頭に追加してvenv内で実行。出力をキャプチャ。

exec_ephemeral

{packages[], python_version?, command[]} → 作成・インストール・実行・破棄を1回の呼び出しで行います。

snapshot_venv

{name, label?} → pip freezeを取得し、rollback_venvを有効にします。

list_snapshots

{name} → 新しい順に一覧表示。

rollback_venv

{name, snapshot_id?} → スナップショットの状態をインストールし、そこに存在しないパッケージを削除します。

diff_snapshots

{name, from_snapshot_id, to_snapshot_id?} → パッケージレベルの差分。現在の状態にはto_snapshot_idを省略。

scan_imports

{path, venv?} → 見つかったサードパーティのインポート。venvが渡されると、不足しているものを報告します。

list_registry

永続的なプロジェクト、タグ、作成日時、最終使用メタデータ。

set_registry_metadata

{name, project?, tags[]?, confirm?} → レジストリのメタデータを更新。

doctor

PATH上のPythonバージョン、uvの利用可能性、壊れたvenv。

サーバーはデフォルトでsafeポリシーです。インストール、ロールバック、削除、任意の実行にはconfirm: trueが必要です。検査専用クライアントには--policy read-only、無制限の互換性には--policy fullを使用し、--allow-tool NAMEを繰り返して明示的なサブセットのみを公開します。これらのポリシーは多層防御です: 異なるクライアントが異なる承認設定を持っていても一貫性を保ちます。

実装はサードパーティのMCP依存関係を一切使用しません。stdin/stdout上で改行区切りのJSON-RPC 2.0を使用します。

一時的な実行 (uvxスタイル、サンドボックス化)

# 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はmacOSではsandbox-exec、Linuxではbwrapを使用します。デフォルト拒否のプロファイルで、venvパス、/tmp、プロセス管理に対して明示的な許可リストを持ちます。ネットワークは共有されません。

ファイルウォッチャー

venv-manager watch app.py --venv myenv

親ディレクトリに対するfsnotify(エディタのアトミックリネーム書き込みにも耐えます)、500msのデバウンス、その後:

  1. .pyファイルのASTライト正規表現スキャン(docstring、相対インポート、ローカルモジュール/パッケージ、.venv、.git、__pycache__、node_modulesなどのベンダーディレクトリをスキップ)

  2. 標準ライブラリモジュールセットでフィルタリング

  3. インポート名 → pipパッケージのエイリアスを解決(cv2 → opencv-python、sklearn → scikit-learn、PIL → Pillow、bs4 → beautifulsoup4、yaml → PyYAML、...)

  4. インストール済みパッケージとの差分を取る

  5. 差分をpip installする

venvは常に現在のファイルの要件のスーパーセットになります。これが上のデモGIFが実行しているループです。

永続レジストリ

すべての環境は~/.venvs/.venv-manager/registry.jsonで追跡され、作成日時と最終使用タイムスタンプ、オプションのプロジェクトパス、タグが記録されます。書き込みはアトミックで、レジストリはライブのvenvディレクトリと自動的に整合します。

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

pruneは、メタデータが利用可能な場合、ディレクトリの変更時刻ではなくレジストリのlast_used_atを使用します。

単一呼び出しのコンテキストプライマーとしてのJSONスナップショット

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'"
  }
}

1回のツール呼び出しで、エージェントが環境を推論するために必要なすべてを取得できます。freeze_hashにより、エージェントはパッケージリストの差分を取る代わりに、2つのdescribe呼び出し間のドリフトをO(1)で検出できます。


コマンド

Command

Description

create <name> [--python VER]

venv を作成します。設定で use_uv: true の場合、uv を使用します。

list [--json]

venv を一覧表示します。

remove <name>

venv を削除します。

rename <old> <new>

python -m venv --upgrade で名前を変更し、アクティベーションスクリプトを再生成します。

clone <src> <dst>

ソースの pip freeze で初期化された新しい venv を作成します。

packages <name> [--json]

インストール済みパッケージを表示します。

install <name> <requirements>

pip install -r を実行します。

upgrade [name] [--global]

古いパッケージをアップグレードします(venv ごと、またはすべて)。

clean [name] [--global]

pip キャッシュと __pycache__ ディレクトリを削除します。

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

ディスク使用量を表示します。

activate <name>

eval $(...) 用のシェルコマンドを出力します。

deactivate

deactivate を出力します。

run <name> -- <cmd>

アクティベートせずに venv 内で実行します。stdio を継承します。

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

一時的な venv で実行します。

describe <name>

完全な JSON スナップショットを表示します(上記参照)。

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

サードパーティのインポートを抽出し、venv と照合します。

watch <path> --venv N

ファイル変更時に不足しているインポートを自動インストールします。

snapshot <name> [-l LABEL]

pip freeze の状態を取得します。

snapshots <name> [--json]

スナップショットを一覧表示します(新しい順)。

rollback <name> [snapshot-id]

まずスナップショットの状態をインストールし、次にスナップショットにないパッケージを削除します。

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

スナップショット間の差分を表示するか、スナップショットと現在の状態を比較します。

export <name>

移植可能なマニフェスト(名前 + Python バージョン + freeze)を JSON として出力します。

import <manifest.json>

マニフェストから venv を再作成します。

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

古い venv を報告します。削除には --yes が必要です。

registry [name]

永続的な作成、使用、プロジェクト、タグのメタデータを表示します。

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

プロジェクトの関連付けとタグを更新します。

doctor [--json]

Python バージョン、uv、壊れた venv を診断します。

`config show

path

init`

設定の表示 / 場所の特定 / 初期化を行います。

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

読み取り専用、安全、または完全な認可ポリシーを持つ MCP サーバー。

tui

Bubble Tea TUI ブラウザ。

`completion [bash

zsh

fish

powershell]`

シェル補完スクリプト。

ほとんどの読み取りコマンドは、安定した機械解析可能な出力のために --json も受け付けます。


設定

~/.config/venv-manager/config.json($XDG_CONFIG_HOME と $VENV_MANAGER_CONFIG を尊重します):

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

初期化:venv-manager config init。

uv バックエンド

PATH に uv があり、use_uv: true の場合、create は uv venv を実行します。通常、コールドキャッシュでは python -m venv より 10〜100 倍高速です。


開発

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 は Ubuntu + macOS で go vet、go test -race を実行し、Ubuntu で Python 3.12 を使用した統合テストを実行します。

アーキテクチャ:

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

ライセンス

MIT。

作者

Jacopo Bonomi

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    An 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
    -
  • A
    license
    B
    quality
    D
    maintenance
    Production-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.
    15
    65 npm
    4
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    An MCP server that manages Python virtual environments using uv, allowing LLMs to reliably resolve dependencies and update virtual environments.
    6
    7
    -