mcesptool/pyproject.toml
Ryan Malloy b2ba0cd67a Upgrade to FastMCP 3.x, add Starlight docs site
Dependency changes:
- fastmcp >=2.12.4 → >=3.0.2,<4
- Drop asyncio-mqtt (dead dependency, never imported)
- Align pydantic, click, rich with FastMCP 3.x
- Bump version to 2026.02.23

Docs site (docs-site/):
- Astro Starlight with Tailwind v4 teal theme
- 28 pages following Diataxis: 3 tutorials, 7 how-to guides,
  13 reference pages, 4 explanation pages
- Docker infrastructure (Caddy prod, Node HMR dev)
- Configured for mcesptool.warehack.ing
2026-02-23 18:57:16 -07:00

126 lines
3.2 KiB
TOML

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "mcesptool"
version = "2026.02.23"
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>=3.0.2,<4", # FastMCP framework (v3)
"pyserial>=3.5", # Serial communication
"pyserial-asyncio>=0.6", # Async serial support
"thefuzz[speedup]>=0.22.1", # Fuzzy string matching
"pydantic>=2.11.7", # Data validation
"click>=8.1.0", # CLI framework
"rich>=13.9.4", # Rich console output
]
[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",
]