- 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
128 lines
3.4 KiB
TOML
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",
|
|
] |