[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "global-education-mcp" version = "0.3.5" description = "MCP Server für internationale Bildungsdaten – UNESCO UIS (4000+ Indikatoren) und OECD Education at a Glance (SDMX API)" readme = "README.md" license = "MIT" requires-python = ">=3.11" authors = [ { name = "Schulamt der Stadt Zürich" } ] keywords = [ "mcp", "education", "unesco", "oecd", "bildung", "international", "sdg4", "literacy", "open-data", "sdmx", ] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Information Analysis", ] dependencies = [ # Obere Grenzen pinnen: MCP-/Pydantic-/httpx-Major-Bumps koennten # Breaking-Changes mitbringen (FastMCP-Annotations, ConfigDict-Migration). # Bewusster Upgrade-Pfad: Bound erhoehen + tools.lock.json regenerieren. "mcp[cli]>=2.0.0,<3", "httpx>=0.27.0,<1.0.0", "pydantic>=2.0.0,<3.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.24", # Exakt gepinnt, nicht `>=`: ruff ist ein Gate, kein Hilfsmittel. Eine # neuere Version meldet Abweichungen an Code, den niemand angefasst hat. # Der Pin steht hier und nur hier — die CI installiert ihn ueber das # `dev`-Extra mit und hat keinen eigenen Pin-Schritt mehr. Beim Anheben: # Version aendern, `ruff format` einmal ueber die gelinteten Pfade laufen # lassen und das Ergebnis mit committen. "ruff==0.16.4", "build", ] [project.urls] Homepage = "https://github.com/malkreide/global-education-mcp" Repository = "https://github.com/malkreide/global-education-mcp" "UNESCO UIS" = "https://api.uis.unesco.org/api/public/documentation" "OECD Data Explorer" = "https://data-explorer.oecd.org/" [project.scripts] global-education-mcp = "global_education_mcp.server:main" [tool.hatch.build.targets.wheel] packages = ["src/global_education_mcp"] [tool.ruff] line-length = 120 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "W", "I"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] markers = [ "integration: Live-API-Tests gegen echte Endpunkte (deselect mit: -m 'not integration')", ]