Skip to content

Release v0.2.1 — Audit-Remediation komplett (0 critical/high/medium offen)

Choose a tag to compare

@malkreide malkreide released this 20 May 09:46
0d4adf7

Komplette Umsetzung des mcp-audit-skill-Reviews. 0 critical / 0 high / 0 medium Findings offen.

Production-ready für:

  • stdio (Claude Desktop, lokal)
  • Single-instance HTTP auf Render via render.yaml-Blueprint
  • Multi-Replica HTTP mit MCP_STATELESS_HTTP=1

⚠️ Breaking Changes

  • JSON-Output-Format: Tools mit response_format="json" liefern jetzt einen Envelope { "payload": ..., "provenance": { source, license, attribution, retrieved_at, data_source_url } } statt eines flachen Dicts. Markdown-Outputs unverändert. Konsumenten, die JSON parsen, müssen auf result["payload"] zugreifen.
  • Entry-Point: meteoswiss_mcp.server:main statt mcp.run. Der neue Wrapper liest MCP_TRANSPORT / MCP_HOST / MCP_PORT / MCP_ALLOW_ANY_HOST aus ENV. CLI-Flags --http / --port bleiben als Override.

Sicherheit

  • SSRF-Prevention (SEC-004/SEC-021): Egress-Allow-List validiert alle Requests inkl. Redirect-Targets. Blockiert RFC1918 / Loopback / Link-Local-IPs (z.B. 169.254.169.254).
  • NeighborJack-Hardening (SEC-016): MCP_HOST defaultet auf 127.0.0.1; 0.0.0.0-Binding nur mit explizitem MCP_ALLOW_ANY_HOST=1.
  • Container-Sandboxing (SEC-007): Multi-Stage-Dockerfile mit non-root user mcp:10001.
  • Optionaler API-Key-Auth via MCP_API_KEY (X-API-Key / Bearer, constant-time-Vergleich).

Neue Features (opt-in)

  • CORS-Middleware via MCP_ALLOWED_ORIGINS — claude.ai Web kann jetzt Sessions aufbauen.
  • Stateless-HTTP-Mode via MCP_STATELESS_HTTP=1 für Multi-Replica.
  • OpenTelemetry-Tracing via OTEL_EXPORTER_OTLP_ENDPOINT + pip install meteoswiss-mcp[otel].
  • Structured Logging (structlog → JSON auf stderr): tool_invoked, upstream_failed, egress_blocked, auth_rejected, ...
  • Health-Endpoint GET /health (ohne Upstream-Pings).
  • OGD-Provenance-Envelope in allen JSON-Responses (CC BY 4.0 Attribution).
  • Fuzzy-Geocoding-Fallback: nicht-deutsche Ortsnamen werden via Zweitversuch ohne language-Restriktion aufgelöst.
  • Tool-Hash-Pinning (tool-hashes.json + CI-Guard) gegen Rug-Pull.

Infrastruktur

  • Multi-Stage-Dockerfile + render.yaml-Blueprint (plan starter, healthCheckPath, numInstances=1).
  • Dependabot für pip / github-actions / docker.
  • docs/roadmap.md mit expliziter Phasen-Statustabelle.

Audit-Findings geschlossen

ARCH-002, ARCH-003, ARCH-009, ARCH-012, OPS-003, OBS-001, OBS-002, OBS-003, OBS-004, OBS-006, SDK-001, SDK-002, SDK-003, SDK-004, SCALE-001, SCALE-002, SCALE-003, SCALE-004, SCALE-006, SEC-004, SEC-005, SEC-006, SEC-007, SEC-009, SEC-013, SEC-016, SEC-021, SEC-022, CH-004.

Vollständiges CHANGELOG

Siehe CHANGELOG.md.

Upgrade-Pfad

# uvx
uvx meteoswiss-mcp@0.2.0

# pip
pip install -U meteoswiss-mcp==0.2.0

# Docker
docker pull ghcr.io/malkreide/meteoswiss-mcp:v0.2.0   # falls Image-Publish konfiguriert