kicad-mcp/pyproject.toml
Ryan Malloy 4ae38fed59 Rebuild on FastMCP 3 with src-layout and kicad-sch-api integration
Migrate from FastMCP 2.14.5 to 3.1.0 with complete architectural
overhaul. Adopt src-layout packaging, lazy config functions to
eliminate .env race condition, and decorator-based tool registration.

Consolidate 14 tool modules into 8 focused modules (33 tools total).
Add 9 new schematic tools via kicad-sch-api for creating and
manipulating .kicad_sch files. Drop pandas dependency (BOM uses
stdlib csv). Remove ~17k lines of stubs, over-engineering, and
dead code.

All checks pass: ruff clean, mypy 0 errors, 17/17 tests green.
2026-03-03 18:26:54 -07:00

117 lines
2.7 KiB
TOML

[build-system]
requires = ["hatchling>=1.28.0"]
build-backend = "hatchling.build"
[project]
name = "mckicad"
version = "2026.03.03"
description = "MCP server for KiCad electronic design automation"
readme = "README.md"
license = { text = "MIT" }
authors = [{ name = "Ryan Malloy", email = "ryan@supported.systems" }]
keywords = ["kicad", "eda", "electronics", "pcb", "mcp", "model-context-protocol"]
classifiers = [
"Development Status :: 4 - Beta",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
"Typing :: Typed",
]
requires-python = ">=3.12"
dependencies = [
"fastmcp>=3.1.0",
"pyyaml>=6.0.3",
"defusedxml>=0.7.1",
"kicad-python>=0.5.0",
"kicad-sch-api>=0.5.6",
"requests>=2.32.5",
]
[project.urls]
Homepage = "https://git.supported.systems/warehack.ing/mckicad"
[project.scripts]
mckicad = "mckicad.server:main"
[tool.hatch.build.targets.wheel]
packages = ["src/mckicad"]
[dependency-groups]
dev = [
"pytest>=8.4.2",
"pytest-asyncio>=1.3.0",
"pytest-mock>=3.15.1",
"pytest-cov>=7.0.0",
"ruff>=0.15.1",
"mypy>=1.19.1",
]
[tool.ruff]
target-version = "py312"
line-length = 100
src = ["src", "tests"]
[tool.ruff.lint]
select = ["E", "W", "F", "I", "B", "C4", "UP", "SIM"]
ignore = ["E501", "B008", "C901", "B905"]
unfixable = ["B"]
[tool.ruff.lint.per-file-ignores]
"tests/**/*.py" = ["S101", "D103", "SLF001"]
[tool.ruff.lint.isort]
known-first-party = ["mckicad"]
force-sort-within-sections = true
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
[tool.mypy]
python_version = "3.12"
warn_return_any = true
warn_unused_configs = true
check_untyped_defs = true
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
show_error_codes = true
[[tool.mypy.overrides]]
module = ["kipy.*", "kicad_sch_api.*", "requests.*"]
ignore_missing_imports = true
[tool.pytest.ini_options]
minversion = "7.0"
addopts = [
"--strict-markers",
"--strict-config",
"-ra",
"--tb=short",
]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_functions = ["test_*"]
markers = [
"unit: Unit tests",
"integration: Integration tests",
"slow: Tests that take more than a few seconds",
"requires_kicad: Tests that require KiCad CLI to be installed",
]
asyncio_mode = "auto"
filterwarnings = [
"ignore::DeprecationWarning",
"ignore::PendingDeprecationWarning",
]
[tool.coverage.run]
source = ["mckicad"]
branch = true
omit = ["tests/*"]
[tool.coverage.report]
precision = 2
show_missing = true