[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "swiss-cultural-heritage-mcp" version = "0.6.0" # Diese Zeile ist nicht nur der PyPI-Einzeiler: Sie wandert ueber # `importlib.metadata` in `serverInfo.description` und steht damit in JEDER # Antwort der Aera 2026-07-28. Sie nannte bis zum 18.09.2026 drei der fuenf # Quellen — derselbe Fehlstand, den `tests/test_registry_manifest.py` fuer # `server.json` und den Modul-Docstring schon hielt, an der Stelle, an die # dieser Test nicht sah. Er sieht jetzt auch hierher. description = "MCP server for Swiss cultural heritage data — SIKART (SIK-ISEA), Nationalmuseum, Helveticat, Memobase, Dodis" readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.11" keywords = [ "mcp", "model-context-protocol", "swiss-open-data", "cultural-heritage", "sik-isea", "nationalmuseum", "nationalbibliothek", ] classifiers = [ "Development Status :: 3 - Alpha", "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 :: Artificial Intelligence", ] dependencies = [ # On the 2.x API (`mcp.server.mcpserver`). The floor is hard: 2.0.0 removed # `mcp.server.fastmcp` with no compatibility shim, so this code cannot run # on 1.x — a `>=1.x` range would let a resolver pick a version that fails # at import. The `<3` cap keeps a major bump a deliberate decision. # Existing clients see no difference: the legacy `initialize` handshake # still caps at 2025-11-25. mcp 2.x additionally serves a "modern" # per-request envelope era reaching 2026-07-28, so a 2.x-aware client # negotiates the newer revision. Not a break, but not a no-op either. "mcp[cli]>=2.0.0,<3", "httpx>=0.27.0,<1.0.0", "pydantic>=2.0.0,<3.0.0", "pydantic-settings>=2.0.0,<3.0.0", "defusedxml>=0.7.1,<1.0.0", "structlog>=24.1.0,<27.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.23.0", "pytest-cov>=5.0.0", "respx>=0.21.0", # Exakt gepinnt, nicht `>=`: ruff-Releases ändern Regelsatz und Formatter. # Eine andere Version als die der CI meldet lokal Abweichungen, die # niemand verursacht hat — oder lässt lokal grün, was die CI rot färbt. # Diese Zeile ist die einzige Quelle der Wahrheit für die ruff-Version; # `ci.yml` installiert nichts mehr separat. "ruff==0.16.5", ] # Optionales OpenTelemetry-Tracing (OBS-006). Nur nötig, wenn # OTEL_EXPORTER_OTLP_ENDPOINT gesetzt ist; sonst bleibt Tracing aus. otel = [ "opentelemetry-sdk>=1.20.0", "opentelemetry-exporter-otlp-proto-http>=1.20.0", "opentelemetry-instrumentation-httpx>=0.40b0", ] [project.scripts] swiss-cultural-heritage-mcp = "swiss_cultural_heritage_mcp.server:mcp.run" [project.urls] Homepage = "https://github.com/malkreide/swiss-cultural-heritage-mcp" Repository = "https://github.com/malkreide/swiss-cultural-heritage-mcp" Issues = "https://github.com/malkreide/swiss-cultural-heritage-mcp/issues" [tool.hatch.build.targets.wheel] packages = ["src/swiss_cultural_heritage_mcp"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] addopts = "-v --tb=short" markers = [ "live: live API tests (skipped in CI by default)", ] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "W", "I", "UP"] ignore = ["E501"]