dev-env-mcp
Provides safe, structured management of Python virtual environments and pip operations within a project workspace.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dev-env-mcpcreate a .venv and install requests"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dev-env-mcp
A local MCP (Model Context Protocol) server that gives coding agents a safe, structured way to manage Python environments inside a project workspace.
Instead of letting an agent run arbitrary shell commands, dev-env-mcp exposes a small, well-defined API for:
selecting a project workspace
creating/using a virtual environment inside that workspace
running restricted
pipoperations in that venvfreezing pinned dependencies to
requirements.txt
Why this exists
Agents often struggle to reliably manage Python envs because:
environment details are implicit (which interpreter? which venv?)
shell command execution is powerful but risky
installs can be slow/hang on Windows and cause inconsistent state
dev-env-mcp makes env management explicit and verifiable:
all actions are scoped to a chosen workspace root
the active venv is persisted per workspace
Related MCP server: venv-mcp-server
Key concepts
Workspace
A workspace is the project directory that the server is allowed to modify.
All file paths are sandboxed to the active workspace root.
Select it with:
workspace_use(path)
The active workspace is persisted globally so the server can remember it across restarts.
Active venv
Inside each workspace, the server tracks which venv is currently active.
The active venv is persisted in:
<workspace>/.dev-env-mcp/state.jsonFeatures
Workspace management
workspace_use(path)Selects the active workspace root (typically where
pyproject.toml/.gitlives)All subsequent operations are restricted to this workspace
Virtual environment management
env_create(path=".venv")Creates a venv inside the active workspace and marks it as active
env_use(path=".venv")Selects an existing venv inside the active workspace and marks it as active
Restricted pip operations
pip(action, packages=None, options=None, confirm=False)Actions:
install | uninstall | list | show | checkRuns
python -m pip ...using the active venv pythonPip options are allowlisted
Uninstall requires
confirm=true
Freezing dependencies
freeze(path="requirements.txt")Writes pinned requirements from the active venv to a file in the workspace
Reliability and stability
Bounded execution: per-action timeouts + capped stdout/stderr.
Post-condition verification: if
pip/venvhangs after the desired state is reached, the server verifies the state, stops the process, and returns success with an audit trail.Process-tree termination: stops the full subprocess tree to avoid orphaned children.
Security model
This MCP is intentionally restrictive:
✅ No arbitrary command execution (no
shell=True)✅ Workspace sandboxing: all file paths must resolve inside the active workspace
✅ pip runs only via the active venv python (
<venv>/python -m pip)✅ pip options are allowlisted (unknown flags are rejected)
✅ destructive actions require explicit confirmation (
confirm=truefor uninstall)✅ outputs are truncated to prevent log flooding
✅ audit log per workspace
Audit log:
<workspace>/.dev-env-mcp/audit.logRequirements
Python 3.10+ (tested on Windows)
uvrecommended (fast runner + reproducible installs)Runtime dependencies (from
pyproject.toml):mcp[cli]psutil
Run the server (stdio transport)
This server is intended to be started by an MCP client (Codex / Cursor / Inspector) using stdio.
From the repo root:
uv run server.pyIf you run it manually, it will wait for MCP client messages on stdin.
Example client workflow (tool-call sequence)
Typical agent flow:
Select the project workspace
Create a venv
Install dependencies
Freeze requirements
Example calls:
workspace_use("C:\\path\\to\\project")env_create(".venv")pip(action="install", packages=["requests", "python-dotenv"])freeze("requirements.txt")
Project structure
dev-env-mcp/
dev_env_mcp/
server.py # MCP tool definitions and orchestration
workspace.py # workspace root detection + sandbox path resolver
state.py # per-workspace + global persistent state
audit.py # JSONL audit logging
runner.py # safe subprocess runner (timeouts, caps, process-tree kill)
venv_ops.py # venv create/use helpers (+ optional soft verify)
pip_ops.py # allowlisted pip actions + verification-based early exit
freeze.py # requirements.txt generation
config.py # timeouts, caps, allowlists
server.py # entrypoint
pyproject.toml
README.mdNotes / limitations
This server intentionally supports a narrow set of operations.
It does not modify global Python installations.
It does not support conda/poetry by design.
For very large packages, installs may still take time — the goal is to be safe, predictable, and verifiable.
License
MIT
Available Tools
5 toolsenv_createA
Create a venv inside the active workspace (default: .venv) and set it active.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | .venv |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It states that the venv is created and set active, but omits details like whether an existing .venv is overwritten, required permissions, or side effects on the environment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the purpose, default, and activation behavior with no redundant or extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and an output schema, the description covers the core functionality. However, it does not mention potential prerequisites (e.g., workspace existence) or failure modes, leaving some gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter 'path' with a default but no description. The description explains the parameter's purpose and default, adding meaning beyond the schema. It indicates the venv is created at the specified path, defaulting to '.venv'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('create'), the resource ('venv'), and the context ('inside the active workspace'). It specifies the default path and notes that it sets the env active, distinguishing it from sibling tools like env_use and pip.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (when a new venv is needed in the workspace) but does not explicitly state when not to use or provide alternatives. Sibling env_use suggests an alternative, but no guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
env_useC
Use an existing venv inside the active workspace and set it active.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | .venv |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It mentions activating a venv but does not disclose side effects (e.g., deactivation of current venv), failure conditions (e.g., missing path), or state changes. Basic activation behavior is implied but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clearly worded sentence with no redundancy. It is front-loaded with the action. However, the extreme brevity sacrifices necessary detail, making it less effective than a slightly longer but more informative description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return value documentation is handled. However, the description lacks information about the parameter, prerequisites (existing venv), and behavioral context relative to sibling tools. For a simple tool, it is minimally adequate but leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description does not mention the single parameter 'path'. While the schema provides a default value and title, the description adds no semantic context about the path's role (e.g., location of the venv). This is a critical gap for tool usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool uses an existing venv and sets it active, distinguishing it from env_create (creates a venv) and workspace_use (uses a workspace). However, the verb 'use' is somewhat vague, and 'set it active' could be more precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus siblings like env_create or pip. The description implies it's for an existing venv, but fails to mention prerequisites (e.g., venv must already exist) or scenarios where alternatives are better.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freezeC
Write pinned requirements from the active venv to a file in the workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | requirements.txt |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It only states the action, omitting details on side effects (e.g., file overwrite), error handling, or permissions required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no redundancy. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks context about preconditions (active venv required), output (though output schema exists), and behavior on existing files. Incomplete for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the tool description does not explain the 'path' parameter, its purpose, or constraints. The default value is only in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Write pinned requirements') and the resource ('from the active venv to a file'). However, it does not differentiate from sibling tools like pip, which could also manage requirements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., pip list, env_create). The description does not mention prerequisites or use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipA
Run a restricted pip action inside the active venv.
Parameters:
action: install | uninstall | list | show | check
packages: list of packages/specs (e.g. ["requests", "numpy==2.1.0"])
options: allowlisted pip options only (see server policy)
confirm: required for uninstall (safety)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| packages | No | ||
| options | No | ||
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explicitly states the actions are restricted, options are allowlisted, and uninstall requires confirmation. This provides good behavioral context, though it could detail side effects or error handling more.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the main action, and uses a clear bulleted list for parameters. Every sentence is necessary and no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema, the description covers the essential usage context: actions, packages, options, and confirmation. Minor gaps like potential return formats for list/show/check are acceptable since the output schema likely handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so by explaining each parameter: action enum values, packages with example, options as allowlisted, and confirm as a safety flag for uninstall. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it runs restricted pip actions inside the active venv, using specific verb and resource. It distinguishes well from sibling tools like env_create or freeze, which manage virtual environments rather than pip commands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus sibling tools. It does not mention alternatives or situations where other tools are preferable, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_useA
Select the project/workspace to manage.
'path' can be a repo root or any subdirectory inside a repo.
The server will auto-find the workspace root by walking up to pyproject.toml or .git.
All future operations (env_create/pip/freeze) are sandboxed to this workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description effectively discloses behaviors: path can be any subdirectory, server auto-finds root, and sandboxes future operations. This adds value beyond basic read/write hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with bullet points, each sentence adding value. It is front-loaded with the main purpose and structured for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, existing output schema, and sibling tools, the description provides sufficient context for workspace selection. It could mention return values but is still adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The 'path' parameter has no schema description (0% coverage), but the tool description compensates by explaining acceptable values (repo root or subdirectory) and auto-resolution behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool selects the project/workspace to manage. It distinguishes from siblings like env_create, env_use, freeze, and pip by focusing on workspace selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that future operations are sandboxed to this workspace, implying it should be used before other tools. It provides context but lacks explicit when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
env_create - First observed
env_use - First observed
freeze - First observed
pip - First observed
workspace_use
TDQS
Each tool has a clearly distinct purpose: env_create creates a new venv, env_use selects an existing one, freeze writes requirements, pip runs pip commands, and workspace_use selects the workspace. No overlap or ambiguity.
Naming is inconsistent: env_create, env_use, and workspace_use follow a verb_noun pattern with a prefix, but freeze and pip are standalone verbs/nouns without a prefix. Mixing conventions reduces predictability.
With 5 tools, the server covers the essential operations for managing a Python virtual environment in a workspace. The count is well within the ideal range (3-15) and each tool serves a necessary function.
The tool set covers the core workflow of creating/using venvs, running pip, and freezing dependencies. Minor gaps exist: no tool to list existing venvs or delete them, but agents can work around these limitations.
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 Connectors
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for generating rough-draft project plans from natural-language prompts.
An MCP server for deep research or task groups
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProduction-ready MCP server for secure Python code execution with artifact capture, virtual environment support, and LM Studio integration.11Apache 2.0
- FlicenseBqualityFmaintenanceAn MCP server that manages Python virtual environments using uv, allowing LLMs to reliably resolve dependencies and update virtual environments.67-
- FlicenseNot gradedqualityBmaintenanceA sandboxed MCP server for agents that provides file read/edit, code intelligence, search, allowlisted command execution, package lookups, persistent memory, and VPS channel clients, all confined to C:\Work.-
- AlicenseAqualityDmaintenanceAn MCP server that manages an IPython kernel, allowing LLMs to execute Python code in a project's virtual environment.81MIT
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/Tova501/Dev-Env-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server