Major refactoring from monolithic server.py to modular MCPMixin pattern: Architecture: - src/esxi_mcp_server/ package with proper src-layout - FastMCP MCPMixin pattern for tool organization - Separate mixins for each functional area - Shared VMwareConnection class with lazy datastore/network lookup New Mixins Added: - DiskManagementMixin: add_disk, remove_disk, extend_disk, list_disks, attach_iso, detach_iso - NICManagementMixin: add_nic, remove_nic, change_nic_network, connect_nic, set_nic_mac, list_nics - HostManagementMixin: get_host_info, enter/exit_maintenance_mode, list_services, start/stop_service, set_service_policy, get/configure_ntp, reboot_host, shutdown_host, get_host_hardware, get_host_networking - OVFManagementMixin: deploy_ovf, export_vm_ovf, list_ovf_networks - ResourcesMixin: Added move_datastore_file, copy_datastore_file Streaming Support: - Generator-based streaming for datastore downloads - Memory-efficient large file handling with save_to parameter - Chunked uploads from disk Testing: - test_client.py: MCP SDK-based test client - Validates all 74 tools against real ESXi host Build System: - pyproject.toml with uv, ruff configuration - Docker dev/prod modes with hot-reload - Updated Makefile for uv-based workflow
34 lines
771 B
Docker
34 lines
771 B
Docker
# ESXi MCP Server - Development with hot-reload
|
|
FROM ghcr.io/astral-sh/uv:python3.11-bookworm-slim
|
|
|
|
WORKDIR /app
|
|
|
|
# Install watchfiles for hot-reload
|
|
ENV UV_COMPILE_BYTECODE=0
|
|
ENV UV_LINK_MODE=copy
|
|
|
|
# Install dependencies
|
|
COPY pyproject.toml uv.lock ./
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv sync --frozen --no-install-project
|
|
|
|
# Copy source
|
|
COPY src ./src
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv sync --frozen
|
|
|
|
# Install watchfiles for development
|
|
RUN uv pip install watchfiles
|
|
|
|
# Create directories
|
|
RUN mkdir -p /app/logs /app/config
|
|
|
|
# Environment
|
|
ENV PATH="/app/.venv/bin:$PATH"
|
|
ENV PYTHONUNBUFFERED=1
|
|
|
|
EXPOSE 8080
|
|
|
|
# Run with watchfiles for hot-reload
|
|
CMD ["watchfiles", "--filter", "python", "esxi-mcp-server --transport sse", "src"]
|