v0.2.4
[0.2.4] - 2026-07-30
Fixed
-
The User-Agent reports the actual package version again. The published
0.2.3sentswiss-electricity-mcp/0.2.0to every upstream — the version string was
hardcoded and had been left behind by earlier bumps. The version now comes
from the package metadata, so it can no longer drift from the package. -
HTTP-Modus wies unter jedem echten Hostnamen mit 421 ab (SEC-005).
build_http_app()riefmcp.streamable_http_app()ohnehostauf. Unter
mcp 2.x ist das kein neutraler Default: das SDK leitet daraus seine
Host-Allow-List ab und aktiviert bei loopback-artigem Wert automatisch
127.0.0.1:*. Da das Argument selbst auf127.0.0.1defaultet, galt das auch
für denSWISS_ELECTRICITY_HOST=0.0.0.0-Bind, den dieses Modul für Container
dokumentiert. Vor der Migration ginghostan denFastMCP-Konstruktor, wo
dieselbe Logik den echten Bind sah und den Schutz korrekt ausliess.Der Bind reist jetzt in die App, und eine echte Allow-List wird aus dem neuen
SWISS_ELECTRICITY_ALLOWED_HOSTSgebaut. Ohne diese Variable bleibt der
Schutz auf einem Nicht-Loopback-Bind bewusst aus und der Aufrufer warnt — eine
geratene Liste wäre genau der 421-Fall. -
SWISS_ELECTRICITY_CORS_ORIGINSfunktionierte nie in der dokumentierten
Form. Vorbestehender Fehler, den das zweite Listen-Feld sichtbar gemacht
hat: pydantic-settings JSON-dekodiert komplex typisierte Felder aus der
Umgebung, bevor einmode="before"-Validator läuft. Eine kommagetrennte
Liste löste damitSettingsErroraus, und_split_csvwar für Env-Eingaben
unerreichbar — toter Code. Beide Felder tragen jetztNoDecode.14 neue Tests, darunter der tragende Fall „richtiger Hostname, falscher Port":
nur er unterscheidet eine portgenaue Allow-List von einer, die alles
durchlässt. Mutationsgetestet in beide Richtungen —NoDecodeentfernen bricht
die CSV-Tests, denhost-Kwarg entfernen reproduziert das 421.Geprüft mit dem wörtlichen CI-Kommando (
pytest -m "not live" -q):
58 passed, 3 deselected;ruff check src/ tests/clean.