# MCP Python Project Manager Server A Model Context Protocol (MCP) server for managing and debugging Python projects on Windows 11. ## ๐Ÿš€ Features ### Project Management - **Project Info**: Get comprehensive information about Python projects including structure, dependencies, and environment - **File Operations**: List, read, and analyze project files with filtering options - **Directory Tree**: Visualize project structure with configurable depth ### Execution & Debugging - **Run Scripts**: Execute Python scripts with custom arguments and environment variables - **Debug Info**: Get information about running Python processes and scripts - **Environment Details**: Inspect Python interpreter, packages, and sys.path ### Package Management - **Install Packages**: Install packages via pip with requirements file support - **List Packages**: View installed packages in JSON or text format - **Dependency Analysis**: Analyze requirements files and detect potential issues ### Code Quality - **Linting**: Run flake8, pylint, and black checks on your code - **Formatting**: Auto-format code using black or autopep8 - **Testing**: Execute tests with pytest or unittest framework ### Environment Management - **Virtual Environments**: Create and manage Python virtual environments - **Environment Detection**: Auto-detect and use project venvs - **Python Version Support**: Configure specific Python versions ### File Watching - **Change Notifications**: Watch files for modifications (configurable patterns) - **Pattern Filtering**: Include/exclude files by glob patterns ## ๐Ÿ“ฆ Installation ### Prerequisites **Option A: Using uv (Recommended โšก)** - [`uv`](https://github.com/astral-sh/uv) installed on Windows 11 - Install uv: `winget install astral-sh.uv` or `pip install uv` **Option B: Traditional Python** - Python 3.10+ installed on Windows 11 - pip package manager ### Setup with uv (Recommended) ```cmd # 1. Navigate to project directory cd C:\Users\dimir\proects\mcp-python # 2. Install and run directly with uvx (no venv needed!) uvx --from C:/Users/dimir/proects/mcp-python mcp-python-manager ``` ### Setup with pip (Traditional) ```cmd # 1. Clone or create project directory: cd C:\Users\dimir\proects mkdir mcp-python cd mcp-python # 2. Create virtual environment: python -m venv .venv .venv\Scripts\activate # 3. Install dependencies: pip install -r requirements.txt # 4. Optional: Install development tools: pip install py-spy safety pip-audit ``` ## โš™๏ธ Configuration ### Environment Variables | Variable | Description | Default | |----------|-------------|---------| | `MCP_PYTHON_WORKSPACE` | Root directory for projects | `C:/Users/dimir/projects` | | `MCP_PYTHON_DEBUG` | Enable debug logging | `false` | | `MCP_PYTHON_LOG_LEVEL` | Logging level | `INFO` | | `MCP_PYTHON_MAX_EXEC_TIME` | Command timeout (seconds) | `300` | ### Config File (`config.py`) Customize server behavior by editing `config.py`: ```python from config import ServerConfig config = ServerConfig( workspace_root=Path("C:/Users/dimir/projects"), venv_name=".venv", debug_mode=True, allowed_commands=["python", "pip", "pytest", "black", "flake8", "pylint"], max_execution_time=600, ) ``` ## ๐Ÿ”Œ Usage ### Running the Server #### ๐Ÿš€ With uvx (Recommended) ```cmd # Run directly without installation uvx --from C:/Users/dimir/proects/mcp-python mcp-python-manager # With custom workspace uvx --from C:/Users/dimir/proects/mcp-python mcp-python-manager --workspace "C:\MyProjects" # With debug mode uvx --from C:/Users/dimir/proects/mcp-python mcp-python-manager --debug # SSE transport uvx --from C:/Users/dimir/proects/mcp-python mcp-python-manager --transport sse --port 8000 ``` #### ๐Ÿ With Python (Traditional) **Stdio Transport (Default for MCP clients):** ```cmd # Direct execution python server.py # Via MCP stdio module python -m mcp.server.stdio server:main ``` **SSE Transport (HTTP-based clients):** ```cmd python server.py --transport sse --host localhost --port 8000 ``` **With Options:** ```cmd python server.py --debug --workspace "C:\MyProjects" ``` ### Connecting from Claude Desktop #### โšก Using uvx (Recommended) Add to your Claude Desktop config (`%APPDATA%\Claude\claude_desktop_config.json`): ```json { "mcpServers": { "python-manager": { "command": "uvx", "args": [ "--from", "C:/Users/dimir/proects/mcp-python", "mcp-python-manager", "--transport", "stdio" ], "env": { "MCP_PYTHON_WORKSPACE": "C:/Users/dimir/projects", "UV_NO_CACHE": "0", "UV_LINK_MODE": "copy" } } } } ``` #### ๐Ÿ Using Python (Traditional) ```json { "mcpServers": { "python-manager": { "command": "python", "args": [ "C:/Users/dimir/proects/mcp-python/server.py" ], "env": { "MCP_PYTHON_WORKSPACE": "C:/Users/dimir/projects" } } } } ``` ### Connecting from Cursor/VS Code #### โšก Using uvx (Recommended) ```json { "mcp": { "servers": { "python-manager": { "type": "stdio", "command": "uvx", "args": [ "--from", "C:/Users/dimir/proects/mcp-python", "mcp-python-manager", "--transport", "stdio" ], "env": { "UV_NO_CACHE": "0", "UV_LINK_MODE": "copy" } } } } } ``` #### ๐Ÿ Using Python (Traditional) ```json { "mcp": { "servers": { "python-manager": { "type": "stdio", "command": "python", "args": ["C:/Users/dimir/proects/mcp-python/server.py"], "env": { "PYTHONUNBUFFERED": "1" } } } } } ``` ## ๐Ÿ› ๏ธ Available Tools ### `get_project_info` Get comprehensive project information. ```json { "project_path": "C:/Users/dimir/projects/my-app" } ``` ### `run_python_script` Execute a Python script. ```json { "script_path": "main.py", "args": ["--config", "prod.yaml"], "env": {"DEBUG": "false"}, "use_venv": true, "cwd": "C:/Users/dimir/projects/my-app" } ``` ### `install_package` Install Python packages. ```json { "packages": ["requests", "fastapi"], "upgrade": true, "use_venv": true } ``` Or with requirements file: ```json { "requirements_file": "requirements.txt", "use_venv": true } ``` ### `list_packages` List installed packages. ```json { "project_path": "C:/Users/dimir/projects/my-app", "format": "json" } ``` ### `run_tests` Execute tests. ```json { "test_path": "tests/", "test_framework": "pytest", "args": ["-x", "--cov"], "verbose": true } ``` ### `lint_code` Run code linters. ```json { "file_path": "src/", "linter": "all", "fix": false } ``` ### `create_venv` Create virtual environment. ```json { "project_path": "C:/Users/dimir/projects/new-project", "venv_name": ".venv", "python_version": "3.11" } ``` ### `get_debug_info` Get debugging information. ```json { "script_path": "main.py", "include_stack": true } ``` Or by PID: ```json { "pid": 12345, "include_stack": true } ``` ### `list_project_files` List project files. ```json { "directory": "C:/Users/dimir/projects/my-app", "pattern": "*.py", "recursive": true, "exclude_dirs": ["__pycache__", ".git"] } ``` ### `read_file` Read file contents. ```json { "file_path": "main.py", "start_line": 1, "end_line": 50, "encoding": "utf-8" } ``` ### `execute_command` Execute allowed shell commands. ```json { "command": "python -m pytest tests/ -v", "cwd": "C:/Users/dimir/projects/my-app", "timeout": 120 } ``` ### `get_python_env` Get Python environment info. ```json { "project_path": "C:/Users/dimir/projects/my-app" } ``` ### `format_code` Format Python code. ```json { "file_path": "src/", "formatter": "black", "check_only": false } ``` ### `analyze_dependencies` Analyze project dependencies. ```json { "project_path": "C:/Users/dimir/projects/my-app", "check_updates": false, "check_security": false } ``` ### `watch_files` Configure file watching. ```json { "directory": "C:/Users/dimir/projects/my-app/src", "patterns": ["*.py", "*.json"], "recursive": true } ``` ## ๐Ÿ”’ Security ### Allowed Commands By default, only these commands can be executed: - `python` - Run Python scripts - `pip` - Package management - `pytest` - Run tests - `black` - Code formatting - `flake8` - Linting - `pylint` - Advanced linting Modify `config.allowed_commands` to customize. ### Path Validation All file paths are validated to prevent directory traversal attacks. ### Output Truncation Command output is limited to `max_output_length` characters (default: 50,000). ## ๐Ÿ› Debugging ### Enable Debug Logging ```cmd set MCP_PYTHON_DEBUG=true set MCP_PYTHON_LOG_LEVEL=DEBUG python server.py ``` ### Log File Configure logging to file in `config.py`: ```python config.log_file = Path("C:/Users/dimir/proects/mcp-python/server.log") ``` ### Common Issues | Issue | Solution | |-------|----------| | "Command not allowed" | Add command to `config.allowed_commands` | | "Virtual environment not found" | Create venv with `create_venv` tool or manually | | "Timeout executing command" | Increase `max_execution_time` in config | | "Permission denied" | Run terminal as Administrator or check file permissions | ## ๐Ÿงช Testing the Server ### Manual Test with MCP Inspector ```cmd # Install MCP inspector npm install -g @modelcontextprotocol/inspector # Run server and inspector python server.py # In another terminal: mcp-inspector ``` ### Python Test Script ```python import asyncio from mcp.client.session import ClientSession from mcp.client.stdio import stdio_client async def test_server(): async with stdio_client(["python", "server.py"]) as (read, write): async with ClientSession(read, write) as session: await session.initialize() # List available tools tools = await session.list_tools() print(f"Available tools: {[t.name for t in tools.tools]}") # Test get_project_info result = await session.call_tool( "get_project_info", {"project_path": "C:/Users/dimir/projects"} ) print(result) asyncio.run(test_server()) ``` ## ๐Ÿ“ Project Structure ``` mcp-python/ โ”œโ”€โ”€ server.py # Main server entry point โ”œโ”€โ”€ tools.py # MCP tool implementations โ”œโ”€โ”€ config.py # Configuration settings โ”œโ”€โ”€ requirements.txt # Python dependencies โ”œโ”€โ”€ README.md # This file โ”œโ”€โ”€ .gitignore # Git ignore rules โ””โ”€โ”€ logs/ # Log files (created at runtime) ``` ## ๐Ÿ”„ Development ### Adding New Tools 1. Add tool definition in `tools.py` `_register_tools()` method 2. Implement the async method in `PythonProjectTools` class 3. Add handler case in `handle_tool_call()` method 4. Update this README with documentation ### Example Tool Addition ```python # In _register_tools(): Tool( name="my_new_tool", description="What this tool does", inputSchema={...} ) # Implementation: async def my_new_tool(self, arg1: str) -> ToolResult: # Your logic here return ToolResult(success=True, message="Done", data={...}) # Handler: elif name == "my_new_tool": result = await self.my_new_tool(**arguments) ``` ## ๐Ÿ“„ License MIT License - Feel free to use and modify for your projects. ## ๐Ÿค Contributing 1. Fork the repository 2. Create a feature branch 3. Add tests for new functionality 4. Submit a pull request ## ๐Ÿ”— Resources - [MCP Specification](https://modelcontextprotocol.io) - [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk) - [Windows Python Setup Guide](https://docs.python.org/3/using/windows.html) --- **Author**: dimir **Created**: 2026 **Platform**: Windows 11, Python 3.10+