diff --git a/Dockerfile b/Dockerfile index 87b0304..2edc0f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# ESXi MCP Server - Modern Python with uv +# mcvsphere - Modern Python with uv # Multi-stage build for optimal image size # Build stage @@ -63,5 +63,5 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8080')" || exit 1 # Run the MCP server -ENTRYPOINT ["esxi-mcp-server"] +ENTRYPOINT ["mcvsphere"] CMD ["--transport", "sse"] diff --git a/README.md b/README.md index 5cb67f7..f91113b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# ESXi MCP Server +# mcvsphere A comprehensive VMware vSphere management server implementing the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/), enabling AI assistants like Claude to manage virtual infrastructure through natural language. -## Why ESXi MCP Server? +## Why mcvsphere? -Traditional VMware management requires navigating complex UIs or writing scripts. With ESXi MCP Server, you can simply ask: +Traditional VMware management requires navigating complex UIs or writing scripts. With mcvsphere, you can simply ask: > "Create a new VM with 4 CPUs and 8GB RAM, then take a snapshot before installing the OS" @@ -26,10 +26,10 @@ And watch it happen. The server exposes **94 tools** covering every aspect of vS ```bash # Install with uv (recommended) -uvx esxi-mcp-server +uvx mcvsphere # Or install with pip -pip install esxi-mcp-server +pip install mcvsphere ``` ### Configuration @@ -47,16 +47,16 @@ VCENTER_INSECURE=true # Skip SSL verification (dev only) ```bash # Using uvx -uvx esxi-mcp-server +uvx mcvsphere # Or if installed -esxi-mcp-server +mcvsphere ``` ### Add to Claude Code ```bash -claude mcp add esxi "uvx esxi-mcp-server" +claude mcp add esxi "uvx mcvsphere" ``` ## Available Tools (94 Total) @@ -220,7 +220,7 @@ Access real-time data through MCP resources: The server uses a modular mixin architecture: ``` -esxi_mcp_server/ +mcvsphere/ ├── server.py # FastMCP server setup ├── connection.py # VMware connection management ├── config.py # Settings and configuration @@ -259,14 +259,14 @@ esxi_mcp_server/ ```bash # Build -docker build -t esxi-mcp-server . +docker build -t mcvsphere . # Run docker run -d \ -e VCENTER_HOST=vcenter.example.com \ -e VCENTER_USER=admin@vsphere.local \ -e VCENTER_PASSWORD=secret \ - esxi-mcp-server + mcvsphere ``` ## Examples @@ -320,8 +320,8 @@ telnet://10.20.0.22:4521 ```bash # Clone the repo -git clone https://github.com/yourusername/esxi-mcp-server.git -cd esxi-mcp-server +git clone https://github.com/yourusername/mcvsphere.git +cd mcvsphere # Install dependencies uv sync diff --git a/README_DOCKER.md b/README_DOCKER.md index e706d18..8208a44 100644 --- a/README_DOCKER.md +++ b/README_DOCKER.md @@ -1,6 +1,6 @@ -# ESXi MCP Server - Docker Guide +# mcvsphere - Docker Guide -This guide provides instructions for running the ESXi MCP Server using Docker and Docker Compose. +This guide provides instructions for running the mcvsphere using Docker and Docker Compose. ## Quick Start @@ -15,7 +15,7 @@ This guide provides instructions for running the ESXi MCP Server using Docker an ```bash # Clone the repository git clone -cd esxi-mcp-server +cd mcvsphere # Create necessary directories and configuration make setup diff --git a/docker-compose.yml b/docker-compose.yml index 484f863..f879844 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,11 +2,11 @@ # Supports dev (hot-reload) and prod modes via COMPOSE_PROFILES services: - esxi-mcp-server: + mcvsphere: build: context: . dockerfile: Dockerfile - container_name: esxi-mcp-server + container_name: mcvsphere restart: unless-stopped profiles: ["prod"] ports: @@ -37,11 +37,11 @@ services: cpus: '0.25' # Development mode with hot-reload - esxi-mcp-server-dev: + mcvsphere-dev: build: context: . dockerfile: Dockerfile.dev - container_name: esxi-mcp-server-dev + container_name: mcvsphere-dev profiles: ["dev"] ports: - "${MCP_PORT:-8080}:8080" diff --git a/pyproject.toml b/pyproject.toml index 367566e..24f941e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,14 @@ [project] -name = "esxi-mcp-server" +name = "mcvsphere" version = "0.2.0" -description = "VMware ESXi/vCenter MCP server for AI-driven virtual machine management" +description = "Model Control for vSphere - AI-driven VMware virtual machine management via MCP" readme = "README.md" license = "MIT" requires-python = ">=3.11" authors = [ {name = "Ryan Malloy", email = "ryan@supported.systems"}, ] -keywords = ["mcp", "vmware", "esxi", "vcenter", "fastmcp", "virtualization"] +keywords = ["mcp", "vmware", "esxi", "vcenter", "vsphere", "fastmcp", "virtualization", "model-context-protocol"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", @@ -36,18 +36,18 @@ dev = [ ] [project.scripts] -esxi-mcp-server = "esxi_mcp_server:main" +mcvsphere = "mcvsphere:main" [project.urls] -Homepage = "https://github.com/Bright8192/esxi-mcp-server" -Repository = "https://github.com/Bright8192/esxi-mcp-server" +Homepage = "https://git.supported.systems/MCP/mcvsphere" +Repository = "https://git.supported.systems/MCP/mcvsphere" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] -packages = ["src/esxi_mcp_server"] +packages = ["src/mcvsphere"] [tool.ruff] target-version = "py311" @@ -72,7 +72,7 @@ ignore = [ ] [tool.ruff.lint.isort] -known-first-party = ["esxi_mcp_server"] +known-first-party = ["mcvsphere"] [tool.pytest.ini_options] asyncio_mode = "auto" diff --git a/src/esxi_mcp_server/mixins/__init__.py b/src/esxi_mcp_server/mixins/__init__.py deleted file mode 100644 index 01daf62..0000000 --- a/src/esxi_mcp_server/mixins/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -"""MCP Mixins for ESXi operations organized by category.""" - -from esxi_mcp_server.mixins.console import ConsoleMixin -from esxi_mcp_server.mixins.disk_management import DiskManagementMixin -from esxi_mcp_server.mixins.guest_ops import GuestOpsMixin -from esxi_mcp_server.mixins.host_management import HostManagementMixin -from esxi_mcp_server.mixins.monitoring import MonitoringMixin -from esxi_mcp_server.mixins.nic_management import NICManagementMixin -from esxi_mcp_server.mixins.ovf_management import OVFManagementMixin -from esxi_mcp_server.mixins.power_ops import PowerOpsMixin -from esxi_mcp_server.mixins.resources import ResourcesMixin -from esxi_mcp_server.mixins.serial_port import SerialPortMixin -from esxi_mcp_server.mixins.snapshots import SnapshotsMixin -from esxi_mcp_server.mixins.vcenter_ops import VCenterOpsMixin -from esxi_mcp_server.mixins.vm_lifecycle import VMLifecycleMixin - -__all__ = [ - "ConsoleMixin", - "DiskManagementMixin", - "GuestOpsMixin", - "HostManagementMixin", - "MonitoringMixin", - "NICManagementMixin", - "OVFManagementMixin", - "PowerOpsMixin", - "ResourcesMixin", - "SerialPortMixin", - "SnapshotsMixin", - "VCenterOpsMixin", - "VMLifecycleMixin", -] diff --git a/src/esxi_mcp_server/__init__.py b/src/mcvsphere/__init__.py similarity index 87% rename from src/esxi_mcp_server/__init__.py rename to src/mcvsphere/__init__.py index 8c3d136..9112efa 100644 --- a/src/esxi_mcp_server/__init__.py +++ b/src/mcvsphere/__init__.py @@ -7,9 +7,9 @@ virtual machines through AI assistants like Claude. import argparse from pathlib import Path -from esxi_mcp_server.config import Settings, get_settings -from esxi_mcp_server.connection import VMwareConnection -from esxi_mcp_server.server import create_server, run_server +from mcvsphere.config import Settings, get_settings +from mcvsphere.connection import VMwareConnection +from mcvsphere.server import create_server, run_server __all__ = [ "Settings", @@ -22,7 +22,7 @@ __all__ = [ def main() -> None: - """Entry point for the esxi-mcp-server CLI.""" + """Entry point for the mcvsphere CLI.""" parser = argparse.ArgumentParser( description="ESXi MCP Server - VMware vSphere management via MCP" ) diff --git a/src/esxi_mcp_server/config.py b/src/mcvsphere/config.py similarity index 100% rename from src/esxi_mcp_server/config.py rename to src/mcvsphere/config.py diff --git a/src/esxi_mcp_server/connection.py b/src/mcvsphere/connection.py similarity index 99% rename from src/esxi_mcp_server/connection.py rename to src/mcvsphere/connection.py index 4fe4578..d94a885 100644 --- a/src/esxi_mcp_server/connection.py +++ b/src/mcvsphere/connection.py @@ -8,7 +8,7 @@ from pyVim import connect from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.config import Settings + from mcvsphere.config import Settings logger = logging.getLogger(__name__) diff --git a/src/mcvsphere/mixins/__init__.py b/src/mcvsphere/mixins/__init__.py new file mode 100644 index 0000000..20e8ccd --- /dev/null +++ b/src/mcvsphere/mixins/__init__.py @@ -0,0 +1,31 @@ +"""MCP Mixins for ESXi operations organized by category.""" + +from mcvsphere.mixins.console import ConsoleMixin +from mcvsphere.mixins.disk_management import DiskManagementMixin +from mcvsphere.mixins.guest_ops import GuestOpsMixin +from mcvsphere.mixins.host_management import HostManagementMixin +from mcvsphere.mixins.monitoring import MonitoringMixin +from mcvsphere.mixins.nic_management import NICManagementMixin +from mcvsphere.mixins.ovf_management import OVFManagementMixin +from mcvsphere.mixins.power_ops import PowerOpsMixin +from mcvsphere.mixins.resources import ResourcesMixin +from mcvsphere.mixins.serial_port import SerialPortMixin +from mcvsphere.mixins.snapshots import SnapshotsMixin +from mcvsphere.mixins.vcenter_ops import VCenterOpsMixin +from mcvsphere.mixins.vm_lifecycle import VMLifecycleMixin + +__all__ = [ + "ConsoleMixin", + "DiskManagementMixin", + "GuestOpsMixin", + "HostManagementMixin", + "MonitoringMixin", + "NICManagementMixin", + "OVFManagementMixin", + "PowerOpsMixin", + "ResourcesMixin", + "SerialPortMixin", + "SnapshotsMixin", + "VCenterOpsMixin", + "VMLifecycleMixin", +] diff --git a/src/esxi_mcp_server/mixins/console.py b/src/mcvsphere/mixins/console.py similarity index 99% rename from src/esxi_mcp_server/mixins/console.py rename to src/mcvsphere/mixins/console.py index 9b9d2f0..d81efe2 100644 --- a/src/esxi_mcp_server/mixins/console.py +++ b/src/mcvsphere/mixins/console.py @@ -11,7 +11,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class ConsoleMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/disk_management.py b/src/mcvsphere/mixins/disk_management.py similarity index 99% rename from src/esxi_mcp_server/mixins/disk_management.py rename to src/mcvsphere/mixins/disk_management.py index dd1844e..3627138 100644 --- a/src/esxi_mcp_server/mixins/disk_management.py +++ b/src/mcvsphere/mixins/disk_management.py @@ -7,7 +7,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class DiskManagementMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/guest_ops.py b/src/mcvsphere/mixins/guest_ops.py similarity index 99% rename from src/esxi_mcp_server/mixins/guest_ops.py rename to src/mcvsphere/mixins/guest_ops.py index f372607..218e23c 100644 --- a/src/esxi_mcp_server/mixins/guest_ops.py +++ b/src/mcvsphere/mixins/guest_ops.py @@ -9,7 +9,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class GuestOpsMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/host_management.py b/src/mcvsphere/mixins/host_management.py similarity index 99% rename from src/esxi_mcp_server/mixins/host_management.py rename to src/mcvsphere/mixins/host_management.py index 1ef69f1..1646719 100644 --- a/src/esxi_mcp_server/mixins/host_management.py +++ b/src/mcvsphere/mixins/host_management.py @@ -7,7 +7,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class HostManagementMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/monitoring.py b/src/mcvsphere/mixins/monitoring.py similarity index 99% rename from src/esxi_mcp_server/mixins/monitoring.py rename to src/mcvsphere/mixins/monitoring.py index 6ece0cb..0506702 100644 --- a/src/esxi_mcp_server/mixins/monitoring.py +++ b/src/mcvsphere/mixins/monitoring.py @@ -8,7 +8,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class MonitoringMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/nic_management.py b/src/mcvsphere/mixins/nic_management.py similarity index 99% rename from src/esxi_mcp_server/mixins/nic_management.py rename to src/mcvsphere/mixins/nic_management.py index 3a59b99..0ef780a 100644 --- a/src/esxi_mcp_server/mixins/nic_management.py +++ b/src/mcvsphere/mixins/nic_management.py @@ -7,7 +7,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class NICManagementMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/ovf_management.py b/src/mcvsphere/mixins/ovf_management.py similarity index 99% rename from src/esxi_mcp_server/mixins/ovf_management.py rename to src/mcvsphere/mixins/ovf_management.py index c08dae4..5242b15 100644 --- a/src/esxi_mcp_server/mixins/ovf_management.py +++ b/src/mcvsphere/mixins/ovf_management.py @@ -12,7 +12,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class OVFManagementMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/power_ops.py b/src/mcvsphere/mixins/power_ops.py similarity index 98% rename from src/esxi_mcp_server/mixins/power_ops.py rename to src/mcvsphere/mixins/power_ops.py index e69b312..fb06cdb 100644 --- a/src/esxi_mcp_server/mixins/power_ops.py +++ b/src/mcvsphere/mixins/power_ops.py @@ -7,7 +7,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class PowerOpsMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/resources.py b/src/mcvsphere/mixins/resources.py similarity index 99% rename from src/esxi_mcp_server/mixins/resources.py rename to src/mcvsphere/mixins/resources.py index eec8120..8733ae6 100644 --- a/src/esxi_mcp_server/mixins/resources.py +++ b/src/mcvsphere/mixins/resources.py @@ -7,7 +7,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class ResourcesMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/serial_port.py b/src/mcvsphere/mixins/serial_port.py similarity index 99% rename from src/esxi_mcp_server/mixins/serial_port.py rename to src/mcvsphere/mixins/serial_port.py index 1c6d746..ac3a328 100644 --- a/src/esxi_mcp_server/mixins/serial_port.py +++ b/src/mcvsphere/mixins/serial_port.py @@ -10,7 +10,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class SerialPortMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/snapshots.py b/src/mcvsphere/mixins/snapshots.py similarity index 99% rename from src/esxi_mcp_server/mixins/snapshots.py rename to src/mcvsphere/mixins/snapshots.py index 275de77..cfd9b85 100644 --- a/src/esxi_mcp_server/mixins/snapshots.py +++ b/src/mcvsphere/mixins/snapshots.py @@ -7,7 +7,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class SnapshotsMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/vcenter_ops.py b/src/mcvsphere/mixins/vcenter_ops.py similarity index 99% rename from src/esxi_mcp_server/mixins/vcenter_ops.py rename to src/mcvsphere/mixins/vcenter_ops.py index 11fb601..0ceb59b 100644 --- a/src/esxi_mcp_server/mixins/vcenter_ops.py +++ b/src/mcvsphere/mixins/vcenter_ops.py @@ -8,7 +8,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class VCenterOpsMixin(MCPMixin): diff --git a/src/esxi_mcp_server/mixins/vm_lifecycle.py b/src/mcvsphere/mixins/vm_lifecycle.py similarity index 99% rename from src/esxi_mcp_server/mixins/vm_lifecycle.py rename to src/mcvsphere/mixins/vm_lifecycle.py index a23122e..bd78155 100644 --- a/src/esxi_mcp_server/mixins/vm_lifecycle.py +++ b/src/mcvsphere/mixins/vm_lifecycle.py @@ -7,7 +7,7 @@ from mcp.types import ToolAnnotations from pyVmomi import vim if TYPE_CHECKING: - from esxi_mcp_server.connection import VMwareConnection + from mcvsphere.connection import VMwareConnection class VMLifecycleMixin(MCPMixin): diff --git a/src/esxi_mcp_server/py.typed b/src/mcvsphere/py.typed similarity index 100% rename from src/esxi_mcp_server/py.typed rename to src/mcvsphere/py.typed diff --git a/src/mcvsphere/server.py b/src/mcvsphere/server.py new file mode 100644 index 0000000..002d0fd --- /dev/null +++ b/src/mcvsphere/server.py @@ -0,0 +1,140 @@ +"""FastMCP server setup for mcvsphere.""" + +import logging +import sys +from pathlib import Path + +from fastmcp import FastMCP + +from mcvsphere.config import Settings, get_settings +from mcvsphere.connection import VMwareConnection +from mcvsphere.mixins import ( + ConsoleMixin, + DiskManagementMixin, + GuestOpsMixin, + HostManagementMixin, + MonitoringMixin, + NICManagementMixin, + OVFManagementMixin, + PowerOpsMixin, + ResourcesMixin, + SerialPortMixin, + SnapshotsMixin, + VCenterOpsMixin, + VMLifecycleMixin, +) + +logger = logging.getLogger(__name__) + + +def create_server(settings: Settings | None = None) -> FastMCP: + """Create and configure the FastMCP server. + + Args: + settings: Optional settings instance. If not provided, will load from + environment variables and/or config file. + + Returns: + Configured FastMCP server instance with VMware tools registered. + """ + if settings is None: + settings = get_settings() + + # Configure logging - MUST go to stderr for stdio transport compatibility + log_level = getattr(logging, settings.log_level.upper(), logging.INFO) + + # For stdio mode, suppress most logging to avoid interference + if settings.mcp_transport == "stdio": + log_level = logging.WARNING + + logging.basicConfig( + level=log_level, + format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", + stream=sys.stderr, # Explicitly use stderr + ) + + # Create FastMCP server + mcp = FastMCP( + name="mcvsphere", + instructions=( + "Model Control for vSphere - AI-driven VMware virtual machine management. " + "Provides tools for VM lifecycle management, power operations, " + "snapshots, guest OS operations, monitoring, and infrastructure resources." + ), + ) + + # Create shared VMware connection + logger.info("Connecting to VMware vCenter/ESXi...") + conn = VMwareConnection(settings) + + # Create and register all mixins + mixins = [ + VMLifecycleMixin(conn), + PowerOpsMixin(conn), + SnapshotsMixin(conn), + MonitoringMixin(conn), + GuestOpsMixin(conn), + ResourcesMixin(conn), + DiskManagementMixin(conn), + NICManagementMixin(conn), + OVFManagementMixin(conn), + HostManagementMixin(conn), + VCenterOpsMixin(conn), + ConsoleMixin(conn), + SerialPortMixin(conn), + ] + + tool_count = 0 + resource_count = 0 + + for mixin in mixins: + mixin.register_all(mcp) + tool_count += len(getattr(mixin, "_mcp_tools", [])) + resource_count += len(getattr(mixin, "_mcp_resources", [])) + + # Get actual counts from MCP server + actual_tools = len(mcp._tool_manager._tools) + actual_resources = len(mcp._resource_manager._resources) + + logger.info( + "mcvsphere ready - %d tools, %d resources registered", + actual_tools, + actual_resources, + ) + + return mcp + + +def run_server(config_path: Path | None = None) -> None: + """Run the mcvsphere server. + + Args: + config_path: Optional path to YAML/JSON config file. + """ + # Load settings + settings = Settings.from_yaml(config_path) if config_path else get_settings() + + # Only print banner for SSE mode (stdio must stay clean for JSON-RPC) + if settings.mcp_transport == "sse": + try: + from importlib.metadata import version + + package_version = version("mcvsphere") + except Exception: + package_version = "dev" + + print(f"mcvsphere v{package_version}", file=sys.stderr) + print("─" * 40, file=sys.stderr) + print( + f"Starting SSE transport on {settings.mcp_host}:{settings.mcp_port}", + file=sys.stderr, + ) + + # Create and run server + mcp = create_server(settings) + + if settings.mcp_transport == "sse": + mcp.run(transport="sse", host=settings.mcp_host, port=settings.mcp_port) + else: + # stdio mode - suppress banner to keep stdout clean for JSON-RPC + mcp.run(show_banner=False) diff --git a/test_client.py b/test_client.py index 30f921a..9d89f24 100644 --- a/test_client.py +++ b/test_client.py @@ -98,7 +98,7 @@ async def main(): server_params = StdioServerParameters( command="uv", - args=["run", "esxi-mcp-server"], + args=["run", "mcvsphere"], env={ **os.environ, "VCENTER_HOST": dotenv.get("VCENTER_HOST", os.environ.get("VCENTER_HOST", "")), diff --git a/test_destructive.py b/test_destructive.py index 77fc691..61a167d 100644 --- a/test_destructive.py +++ b/test_destructive.py @@ -113,7 +113,7 @@ async def main(): server_params = StdioServerParameters( command="uv", - args=["run", "esxi-mcp-server"], + args=["run", "mcvsphere"], env={ **os.environ, "VCENTER_HOST": dotenv.get("VCENTER_HOST", ""), diff --git a/test_extended.py b/test_extended.py index 7a0e834..0117db1 100644 --- a/test_extended.py +++ b/test_extended.py @@ -102,7 +102,7 @@ async def main(): server_params = StdioServerParameters( command="uv", - args=["run", "esxi-mcp-server"], + args=["run", "mcvsphere"], env={ **os.environ, "VCENTER_HOST": dotenv.get("VCENTER_HOST", ""), diff --git a/uv.lock b/uv.lock index 316c4bb..401ae5f 100644 --- a/uv.lock +++ b/uv.lock @@ -389,38 +389,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, ] -[[package]] -name = "esxi-mcp-server" -version = "0.2.0" -source = { editable = "." } -dependencies = [ - { name = "fastmcp" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, - { name = "pyvmomi" }, - { name = "pyyaml" }, -] - -[package.optional-dependencies] -dev = [ - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "ruff" }, -] - -[package.metadata] -requires-dist = [ - { name = "fastmcp", specifier = ">=2.14.1" }, - { name = "pydantic", specifier = ">=2.0" }, - { name = "pydantic-settings", specifier = ">=2.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0" }, - { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24" }, - { name = "pyvmomi", specifier = ">=8.0" }, - { name = "pyyaml", specifier = ">=6.0" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8" }, -] -provides-extras = ["dev"] - [[package]] name = "exceptiongroup" version = "1.3.1" @@ -759,6 +727,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e2/fc/6dc7659c2ae5ddf280477011f4213a74f806862856b796ef08f028e664bf/mcp-1.25.0-py3-none-any.whl", hash = "sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a", size = 233076, upload-time = "2025-12-19T10:19:55.416Z" }, ] +[[package]] +name = "mcvsphere" +version = "0.2.0" +source = { editable = "." } +dependencies = [ + { name = "fastmcp" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "pyvmomi" }, + { name = "pyyaml" }, +] + +[package.optional-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "fastmcp", specifier = ">=2.14.1" }, + { name = "pydantic", specifier = ">=2.0" }, + { name = "pydantic-settings", specifier = ">=2.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24" }, + { name = "pyvmomi", specifier = ">=8.0" }, + { name = "pyyaml", specifier = ">=6.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8" }, +] +provides-extras = ["dev"] + [[package]] name = "mdurl" version = "0.1.2"