Skip to main content
Glama
Tova501

dev-env-mcp

by Tova501

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 pip operations in that venv

  • freezing 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.json

Features

Workspace management

  • workspace_use(path)

    • Selects the active workspace root (typically where pyproject.toml / .git lives)

    • 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 | check

    • Runs python -m pip ... using the active venv python

    • Pip 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/venv hangs 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=true for uninstall)

  • ✅ outputs are truncated to prevent log flooding

  • ✅ audit log per workspace

Audit log:

<workspace>/.dev-env-mcp/audit.log

Requirements

  • Python 3.10+ (tested on Windows)

  • uv recommended (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.py

If you run it manually, it will wait for MCP client messages on stdin.


Example client workflow (tool-call sequence)

Typical agent flow:

  1. Select the project workspace

  2. Create a venv

  3. Install dependencies

  4. 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.md

Notes / 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 tools
env_createA

Create a venv inside the active workspace (default: .venv) and set it active.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo.venv

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo.venv

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNorequirements.txt

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
packagesNo
optionsNo
confirmNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedenv_create
    • First observedenv_use
    • First observedfreeze
    • First observedpip
    • First observedworkspace_use

TDQS

A3.5/5.0
Disambiguation5/5

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 Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

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/Tova501/Dev-Env-MCP'

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