mcesptool/pyproject.toml
Ryan Malloy 78dc7e1279 Refactor chip_control to subprocess pattern, remove middleware layer
- Rewrite chip_control.py to use esptool CLI subprocess exclusively
- Delete middleware/ directory (~830 lines): esptool_middleware, logger_interceptor, middleware_factory
- Remove `import esptool` library dependency (keep as CLI tool only)
- Remove mypy override for esptool module
- Add address parameter to esp_flash_firmware to prevent bootloader overwrites
2026-02-05 09:56:35 -07:00

128 lines
3.4 KiB
TOML

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "mcp-esptool-server"
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 = "ESP Development Team", email = "dev@example.com" }
]
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]
mcp-esptool-server = "mcp_esptool_server.server:main"
esptool-mcp = "mcp_esptool_server.cli:cli"
[project.urls]
Homepage = "https://github.com/yourusername/mcp-esptool-server"
Repository = "https://github.com/yourusername/mcp-esptool-server"
Issues = "https://github.com/yourusername/mcp-esptool-server/issues"
Documentation = "https://yourusername.github.io/mcp-esptool-server"
[tool.hatch.build.targets.wheel]
packages = ["src/mcp_esptool_server"]
[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/mcp_esptool_server",
"--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",
]