[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "i14y-mcp" version = "0.4.0" description = "MCP server for the I14Y interoperability platform — Switzerland's national metadata catalogue" readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.10" authors = [{ name = "malkreide" }] keywords = ["mcp", "model-context-protocol", "llm", "swiss-open-data", "i14y", "dcat", "metadata"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Information Analysis", ] dependencies = [ # Upper bound added deliberately: `mcp` 2.0.0 removed `mcp.server.fastmcp` # outright (the API moved to `mcp.server.mcpserver`), so an unbounded # `>=1.28.1` breaks every fresh install — CI and `pip install` alike. # Migrating to the 2.x API is real work and a decision to take on purpose, # not one a resolver should make silently. "mcp>=2.0.0,<3", "httpx>=0.27", "pydantic>=2.7", "structlog>=24.1,<27", ] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.23", "respx>=0.21", "ruff==0.16.5", ] [project.scripts] i14y-mcp = "i14y_mcp.server:main" [project.urls] Homepage = "https://github.com/malkreide/i14y-mcp" Repository = "https://github.com/malkreide/i14y-mcp" Issues = "https://github.com/malkreide/i14y-mcp/issues" "Data source" = "https://www.i14y.admin.ch" Portfolio = "https://github.com/malkreide/swiss-public-data-mcp" [tool.hatch.build.targets.wheel] packages = ["src/i14y_mcp"] [tool.pytest.ini_options] asyncio_mode = "auto" markers = ["live: hits the real I14Y API (excluded from CI)"] testpaths = ["tests"] [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B"] # Beide Regeln modernisieren auf 3.11-Aliasse, die es unter 3.10 nicht gibt. # `requires-python` ist ">=3.10" und die CI-Matrix testet 3.10; still sind sie heute # nur, weil `target-version = "py310"` gesetzt ist. Diese Ignores entkoppeln sie # davon, damit ein `target-version`-Bump nicht per `--fix` die Fixes aus 3deea6c # zurueckdreht. Duerfen raus, sobald `requires-python` auf ">=3.11" steht. # # UP017: `timezone.utc` -> `datetime.UTC`. Der Alias existiert erst ab 3.11, unter # 3.10 ist das ein ImportError beim Sammeln der Tests. # UP041: `asyncio.TimeoutError` -> `TimeoutError`. Erst ab 3.11 dasselbe Objekt; # unter 3.10 sind es zwei Klassen, d.h. `asyncio.wait_for` liefe in ein nicht # gefangenes Timeout und das Retry-Budget in client.py griffe still nicht mehr. ignore = ["UP017", "UP041"]