[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "swiss-efv-mcp" version = "0.4.0" description = "MCP server for Swiss federal finances (EFV): budget, debt, forecasts and spending data" readme = "README.md" requires-python = ">=3.11" license = { file = "LICENSE" } authors = [{ name = "Hayal Oezkan" }] keywords = ["mcp", "model-context-protocol", "llm", "swiss-open-data", "public-finance", "efv"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Natural Language :: German", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] dependencies = [ # >=4 ist der Boden, nicht Kosmetik: erst fastmcp 4 zieht `mcp` 2.x herein, # und erst dort existiert die Spec-Revision 2026-07-28 ueberhaupt. Unter # fastmcp 3.x (`mcp` 1.x) spricht dieser Server hoechstens 2025-11-25 — # `tests/test_protocol_version.py` haelt den Pin gegen die SDK-Konstanten. "fastmcp>=4.0", "httpx>=0.27", "pydantic>=2.7", "pydantic-settings>=2.2", "structlog>=24.1,<27", "uvicorn>=0.30", ] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.24", # loop_scope= on pytest_asyncio.fixture (tests/test_live.py) "respx>=0.21", "ruff==0.16.4", # exakt die Version, die ci.yml faehrt — sonst meldet der lokale Lauf Abweichungen, die niemand verursacht hat ] otel = [ "opentelemetry-sdk>=1.20", "opentelemetry-exporter-otlp-proto-http>=1.20", "opentelemetry-instrumentation-httpx>=0.40b0", ] [project.scripts] swiss-efv-mcp = "swiss_efv_mcp.__main__:main" [project.urls] Homepage = "https://github.com/malkreide/swiss-efv-mcp" Repository = "https://github.com/malkreide/swiss-efv-mcp" Issues = "https://github.com/malkreide/swiss-efv-mcp/issues" Changelog = "https://github.com/malkreide/swiss-efv-mcp/blob/main/CHANGELOG.md" Portfolio = "https://github.com/malkreide/swiss-public-data-mcp" [tool.hatch.build.targets.wheel] packages = ["src/swiss_efv_mcp"] [tool.pytest.ini_options] asyncio_mode = "auto" markers = [ "live: tests that hit the real EFV endpoints (excluded from CI via -m 'not live')", ] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B"]