[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