[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "swiss-housing-mcp" version = "0.2.0" description = "MCP server for the Swiss Federal Register of Buildings and Dwellings (GWR/RegBL) — buildings, dwellings, construction pipeline" readme = "README.md" license = "MIT" requires-python = ">=3.11" authors = [{ name = "malkreide" }] keywords = ["mcp", "model-context-protocol", "llm", "swiss-open-data", "gwr", "regbl", "housing", "buildings"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: GIS", ] dependencies = [ "mcp[cli]>=2.0.0,<3", "httpx>=0.27", "pydantic>=2.7", ] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.23", "respx>=0.21", # Nur fuer scripts/pruefe_dependabot_labels.py und seine Tests: Der Check # liest die `dependabot.yml` der Portfolio-Repos und haelt die dort # deklarierten Labels gegen die tatsaechlich vorhandenen. Der Server # selbst braucht pyyaml nicht. "pyyaml>=6.0", # Exakter Pin, und die einzige Stelle, an der die ruff-Version steht. Als # hier eine Spanne stand, loeste ein dev-Install auf die jeweils neueste # Version auf, waehrend ci.yml `ruff==0.16.5` darueber installierte — # lokaler Lauf und Gate waren sich also ueber die Version uneinig. # `test_werkzeug_versionen.py` faellt, wenn hier wieder eine Spanne steht # oder ein Workflow eine zweite Version setzt. "ruff==0.16.5", ] [project.scripts] swiss-housing-mcp = "swiss_housing_mcp.__main__:main" [project.urls] Homepage = "https://github.com/malkreide/swiss-housing-mcp" Repository = "https://github.com/malkreide/swiss-housing-mcp" Changelog = "https://github.com/malkreide/swiss-housing-mcp/blob/main/CHANGELOG.md" Issues = "https://github.com/malkreide/swiss-housing-mcp/issues" [tool.hatch.build.targets.wheel] packages = ["src/swiss_housing_mcp"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] markers = [ "live: tests against real upstream services (excluded from CI)", ] [tool.ruff] line-length = 100 target-version = "py311" # Expliziter Regelsatz, statt sich auf ruffs Vorgaben zu verlassen. # # Ohne `select` gilt ruffs Default (E4, E7, E9, F) — und der ist Sache der # jeweiligen ruff-Version, nicht dieses Repos. Genau daran hing der Bump auf # 0.16.1: SIM113 schlug an, weil sich der Vorgabesatz verschoben hatte, an # unberuehrtem Code. Ein `select` in der Konfiguration ersetzt die Vorgaben # vollstaendig; damit ist der erzwungene Satz exakt diese Liste, unabhaengig # davon, was eine spaetere Version als Default fuehrt. (Regel B1 des # github-repo-skill.) # # Die Liste ist der modale Satz des Portfolios — 18 der Server fahren genau # diesen, mehr als jeden anderen: # # E — pycodestyle-Fehler # F — Pyflakes (ungenutzte Importe und Variablen, f-String-Fehler, ...) # W — pycodestyle-Warnungen # I — Import-Sortierung (isort) # UP — pyupgrade (moderne Syntax, z.B. `X | None` statt `Optional[X]`) # # Gemessen vor dem Einbau: gegen diesen Satz meldet der Baum genau EINEN # Befund, und das ist das E501 unten. Die Umstellung ist also folgenlos, sie # haelt nur fest, was ohnehin gilt. # # Gegenprobe, damit der Satz nicht bloss Dekoration ist: eine Sonde mit # unsortierten Importen und veralteten typing-Formen passiert den Vorgabesatz # mit «All checks passed!» und faellt hier mit I001, UP006, UP035 und UP045. [tool.ruff.lint] select = ["E", "F", "W", "I", "UP"] # E501 (Zeilenlaenge) bleibt bewusst aussen vor — 24 der 25 Portfolio-Repos mit # `E` im Satz halten es genauso. Die Zeilenlaenge entscheidet `ruff format`, # und was der Formatter nicht brechen kann, meldet E501 folgenlos: der einzige # Befund hier ist eine 102 Zeichen lange SQL-Zeile in einem Triple-Quote # (server.py:330). Sie zu «beheben» hiesse, lesbares SQL umzubrechen, damit # eine Regel schweigt, die der Formatter ohnehin ueberstimmt. ignore = ["E501"]