[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "meteoswiss-mcp" version = "0.6.1" description = "MCP Server for Swiss weather and climate data — MeteoSwiss SwissMetNet, ICON forecasts, climate normals" readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.11" keywords = [ "mcp", "model-context-protocol", "swiss-open-data", "meteoswiss", "weather", "climate", "swissmetnet", ] 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 :: Atmospheric Science", ] dependencies = [ # Both bounds are deliberate. `mcp` 2.0.0 removed `mcp.server.fastmcp` # outright — the API moved to `mcp.server.mcpserver` with no compatibility # shim — so the server code only works on 2.x and the floor is hard. # The `<3` ceiling keeps the next major from breaking fresh installs the # same way; crossing it is a decision to take on purpose, not one a # resolver should make silently. "mcp[cli]>=2.0.0,<3", "httpx>=0.27.0", "pydantic>=2.0.0", "structlog>=24.0.0,<27", ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.23.0", "pytest-cov>=5.0.0", "respx>=0.21.0", "ruff==0.16.5", ] otel = [ "opentelemetry-api>=1.27.0", "opentelemetry-sdk>=1.27.0", "opentelemetry-exporter-otlp-proto-http>=1.27.0", "opentelemetry-instrumentation-httpx>=0.48b0", ] [project.scripts] meteoswiss-mcp = "meteoswiss_mcp.server:main" [project.urls] Homepage = "https://github.com/malkreide/meteoswiss-mcp" Repository = "https://github.com/malkreide/meteoswiss-mcp" Issues = "https://github.com/malkreide/meteoswiss-mcp/issues" [tool.hatch.build.targets.wheel] packages = ["src/meteoswiss_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"]