[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "mcesptool" version = "2025.09.28.1" description = "FastMCP server for ESP32/ESP8266 development with esptool integration" readme = "README.md" requires-python = ">=3.10" license = { text = "MIT" } authors = [ { name = "Ryan Malloy", email = "ryan@supported.systems" } ] keywords = [ "mcp", "model-context-protocol", "esp32", "esp8266", "esptool", "esp-idf", "embedded", "iot", "fastmcp" ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Embedded Systems", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] dependencies = [ "fastmcp>=2.12.4", # FastMCP framework "pyserial>=3.5", # Serial communication "pyserial-asyncio>=0.6", # Async serial support "thefuzz[speedup]>=0.22.1", # Fuzzy string matching "pydantic>=2.0.0", # Data validation "click>=8.0.0", # CLI framework "rich>=13.0.0", # Rich console output "asyncio-mqtt>=0.16.0", # MQTT for coordination ] [project.optional-dependencies] dev = [ "pytest>=8.4.2", "pytest-asyncio>=0.21.0", "pytest-cov>=7.0.0", "pytest-mock>=3.12.0", "ruff>=0.13.2", "mypy>=1.5.0", "black>=23.0.0", "pre-commit>=3.0.0", "watchdog>=3.0.0", # Hot reload support ] idf = [ "kconfiglib>=14.1.0", # Kconfig parsing ] testing = [ "pytest-xdist>=3.0.0", # Parallel testing "pytest-benchmark>=4.0.0", # Performance testing "factory-boy>=3.3.0", # Test data factories ] production = [ "prometheus-client>=0.19.0", # Metrics "uvloop>=0.19.0", # Fast event loop "gunicorn>=21.0.0", # WSGI server ] [project.scripts] mcesptool = "mcesptool.server:main" [project.urls] Homepage = "https://git.supported.systems/MCP/mcesptool" Repository = "https://git.supported.systems/MCP/mcesptool" Issues = "https://git.supported.systems/MCP/mcesptool/issues" [tool.hatch.build.targets.wheel] packages = ["src/mcesptool"] [tool.ruff] line-length = 100 target-version = "py310" src = ["src", "tests"] [tool.ruff.lint] select = ["E", "F", "W", "B", "I", "N", "UP", "ANN", "S", "C4", "DTZ", "T20"] ignore = ["E501", "ANN101", "ANN102", "S101"] [tool.ruff.lint.per-file-ignores] "tests/*" = ["S101", "ANN"] [tool.mypy] python_version = "3.10" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true strict_optional = true [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" addopts = [ "--cov=src/mcesptool", "--cov-report=html", "--cov-report=term-missing", "--cov-fail-under=85" ] [tool.coverage.run] source = ["src"] omit = ["tests/*", "*/test_*"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", ]