[build-system] requires = ["setuptools>=61.0.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "cursor-proxmox-mcp" version = "1.9.0" description = "Formal Cursor MCP server for Proxmox VE — VMs, LXC, storage, HA, firewall, access" requires-python = ">=3.9" authors = [ {name = "hackmods"} ] readme = "README.md" license = {text = "MIT"} keywords = ["proxmox", "mcp", "cursor", "virtualization", "qemu", "lxc"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Systems Administration", ] dependencies = [ "mcp>=0.2.0,<2.0.0", "proxmoxer>=2.0.1,<3.0.0", "requests>=2.31.0,<3.0.0", "pydantic>=2.0.0,<3.0.0", "paramiko>=3.0.0,<4.0.0", ] [project.optional-dependencies] # Back-compat alias — paramiko is a core dependency since 1.3.0 ssh = [] dev = [ "pytest>=7.0.0,<9.0.0", "black>=23.0.0,<25.0.0", "mypy>=1.0.0,<2.0.0", "pytest-asyncio>=0.21.0,<1.0.0", "pytest-cov>=4.0.0,<6.0.0", "ruff>=0.1.0,<1.0.0", "types-requests>=2.31.0,<3.0.0", "pip-audit>=2.0.0", "bandit>=1.7.0", ] openapi = [ "mcpo>=0.0.1", ] [project.urls] Homepage = "https://github.com/hackmods/cursor-proxmox-mcp" Documentation = "https://github.com/hackmods/cursor-proxmox-mcp/blob/main/docs/api-coverage.md" Repository = "https://github.com/hackmods/cursor-proxmox-mcp.git" Issues = "https://github.com/hackmods/cursor-proxmox-mcp/issues" [project.scripts] cursor-proxmox-mcp = "proxmox_mcp.server:main" proxmox-mcp = "proxmox_mcp.server:main" proxmox-mcp-server = "proxmox_mcp.server:main" [tool.pytest.ini_options] asyncio_mode = "strict" asyncio_default_fixture_loop_scope = "function" testpaths = ["tests"] python_files = ["test_*.py"] addopts = "-v --cov=src/proxmox_mcp --cov-report=term-missing --cov-fail-under=80" [tool.coverage.run] source = ["src/proxmox_mcp"] omit = [ "src/proxmox_mcp/tools/register.py", "src/proxmox_mcp/formatting/components.py", "src/proxmox_mcp/formatting/colors.py", "src/proxmox_mcp/formatting/theme.py", "src/proxmox_mcp/utils/*", ] [tool.coverage.report] fail_under = 80 exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", ] [tool.mypy] python_version = "3.9" ignore_missing_imports = true check_untyped_defs = false disallow_untyped_defs = false [tool.ruff] line-length = 100 target-version = "py39" [tool.ruff.lint] # Broadened for v1.0; ignore style churn that would touch every legacy file at once. select = ["E", "W", "F", "B", "UP", "SIM", "RUF", "S"] ignore = [ "E501", "S101", "S104", "S105", "S106", "S107", "S110", "S112", "S311", "S324", "S603", "S607", "B007", "B008", "B904", "B017", "UP006", "UP007", "UP035", "UP045", "SIM102", "SIM105", "SIM108", "SIM117", "SIM118", "RUF012", "RUF005", "RUF001", "RUF002", "RUF003", "W291", "W293", ] [tool.ruff.lint.per-file-ignores] # Guest/host path fixtures in unit tests are not local insecure tempfile usage. "tests/**" = ["S108"] [tool.setuptools.packages.find] where = ["src"]