Skip to main content
Glama
jacopobonomi

venv-manager

by jacopobonomi

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-lite 파서로 import를 스캔하여 누락된 패키지를 pip-install합니다 — 파일이 변경될 때마다. LLM이 반복 작업 중인 스크립트에 이 명령을 지정하면 코드가 발전함에 따라 venv도 수렴합니다.


왜 필요한가

Claude, Codex, Cursor 및 기타 코딩 에이전트는 이미 셸 명령을 실행하고, .venv를 생성하고, 민감한 작업 전에 승인을 요청할 수 있습니다. 그러나 이들이 공유하지 않는 것은 지속적인 Python 환경 상태입니다.

샌드박싱은 머신을 보호합니다. venv-manager워크플로우를 보호합니다: 실행 중인 클라이언트와 무관하게 모든 에이전트에게 동일한 환경, 메타데이터, 패키지 기록 및 복구 경로를 제공합니다.

이 도구를 만든 두 가지 실패 모드:

  1. 인간의 무질서. venv가 ~ 전반에 걸쳐 증식하고, 캐시 디렉터리가 GB를 차지하며, 활성화 구문이 셸마다 다르고, "작동했던 환경"을 복제하려면 터미널 간에 pip freeze를 복사-붙여넣기해야 합니다.

  2. 에이전트의 무질서. AI 에이전트는 잘못된 인터프리터에 설치하거나, 부분적인 변경을 남기거나, 클라이언트를 전환하거나 새 세션을 시작할 때 환경 컨텍스트를 잃을 수 있습니다.

venv-manager는 (1)을 깔끔한 CLI로 해결하고, (2)를 공유 Model Context Protocol 서버, 영구 레지스트리, 타입화된 스냅샷 및 diff, 되돌릴 수 있는 패키지 변경, OS 수준 샌드박싱을 갖춘 임시 venv, 그리고 진화하는 코드와 venv를 동기화 상태로 유지하는 파일 감시자로 해결합니다.

에이전트 샌드박스가 해결하지 못하는 것

에이전트 기능

공유 환경 제어

셸 명령을 승인하거나 차단함

어떤 환경이 어떤 프로젝트에 속하는지 기록함

파일시스템 및 네트워크 접근 제한

Claude, Codex 및 기타 클라이언트 간 상태 보존

요청 시 venv 생성

생성 및 실제 마지막 사용 메타데이터 추적

pip, Poetry 또는 uv 실행

스냅샷 간 패키지 수준 변경 표시

안전하지 않은 작업 중지

손상된 환경을 알려진 상태로 롤백

두 계층은 서로 보완합니다: 에이전트 권한은 지금 무엇이 허용되는지 제어하고, 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}` → 결합된 stdout+stderr를 반환하는 pip install.

run_in_venv

{name, command[]}VIRTUAL_ENV 설정 및 PATH 앞에 추가된 상태로 venv에서 실행. 캡처된 출력.

exec_ephemeral

{packages[], python_version?, command[]} → 단일 호출로 생성-설치-실행-파괴.

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?} → 패키지 수준 diff; to_snapshot_id 생략 시 현재 상태 기준.

scan_imports

{path, venv?} → 발견된 서드파티 import; 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-lite 정규식 스캔 (docstring, 상대 import, 로컬 모듈/패키지, .venv, .git, __pycache__, node_modules 같은 벤더 디렉터리 건너뜀)

  2. 표준 라이브러리 모듈 집합으로 필터링

  3. import 이름 → pip 패키지 별칭 해석 (cv2opencv-python, sklearnscikit-learn, PILPillow, bs4beautifulsoup4, yamlPyYAML, ...)

  4. 설치된 패키지와 diff

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

한 번의 도구 호출로 에이전트가 환경을 추론하는 데 필요한 모든 것을 제공합니다. freeze_hash는 에이전트가 두 describe 호출 간의 드리프트를 패키지 목록을 diff하는 대신 O(1)로 감지할 수 있게 합니다.


명령어

Command

Description

create <name> [--python VER]

venv를 생성합니다. config에서 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]

타사 import를 추출하고 venv와 대조합니다.

watch <path> --venv N

파일 변경 시 누락된 import를 자동 설치합니다.

snapshot <name> [-l LABEL]

pip-freeze 상태를 캡처합니다.

snapshots <name> [--json]

스냅샷 목록을 표시합니다(최신순).

rollback <name> [snapshot-id]

먼저 스냅샷 상태를 설치한 다음, 스냅샷에 없는 패키지를 제거합니다.

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

스냅샷을 비교하거나, 하나의 스냅샷을 현재 상태와 비교합니다.

export <name>

이식 가능한 매니페스트(이름 + 파이썬 버전 + 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]

파이썬 버전, uv, 손상된 venv를 진단합니다.

`config show

path

init`

config를 표시/찾기/부트스트랩합니다.

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 백엔드

PATHuv가 있고 use_uv: true이면 createuv 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

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