Skip to content

v1.0.2 — Audit complete + sweep

Choose a tag to compare

@malkreide malkreide released this 21 May 07:44
7e920e0

This release closes all 13 findings from the 2026-05-21 audit
(see audits/2026-05-21-swiss-academic-libraries-mcp/) plus the
4 follow-up findings from the re-audit (see audits/2026-05-21-re-audit/).

PyPI-Sprung von 0.2.0 → 1.0.2 enthält die Versionen 0.2.1, 0.3.0,
1.0.0 und 1.0.1, die nur als Git-Tags existieren. Details in der
CHANGELOG.md.

Highlights since 0.2.0

Security (high)

  • F-01 Upstream-XML wird mit defusedxml geparst — schützt vor
    XML-Bomben (billion-laughs, quadratic blowup).
  • F-02 Streamable-HTTP-Transport bindet jetzt auf 127.0.0.1
    per Default; neues --host-Flag, WARN-Log bei Non-Loopback,
    README-Abschnitt "Security & Deployment Notes".
  • F-04 CI scannt Dependencies mit pip-audit, Dependabot
    überwacht pip und github-actions wöchentlich.

Observability (high/medium)

  • F-03 Strukturiertes Logging auf stderr (stdout-frei, damit
    stdio-JSON-RPC nicht korrumpiert). MCP_LOG_LEVEL env-Var.
  • F-07 Tool-Fehler werden als McpError zurückgegeben, nicht
    als Daten-Strings — Host sieht jetzt isError=true.
  • F-13 Korrelations-ID (request_id) in jedem Log-Eintrag
    zur Upstream-Call-Verfolgung.

Performance (medium)

  • F-05 Shared httpx.AsyncClient mit Connection-Pool und
    asyncio.Semaphore(5) — schont SLSP-Rate-Limits, reduziert
    TLS-Handshake-Overhead. Sauberer Shutdown via FastMCP-lifespan.

UX (medium/low)

  • F-06 Identifizierender User-Agent für alle Upstream-Calls.
  • F-08 Markdown/JSON-Antworten kennzeichnen Inhalte als
    Bibliotheks-Metadaten (Prompt-Injection-Härtung).
  • F-09 README (DE/EN) hat Deployment-Hinweise für Schweizer
    Behörden (Datenresidenz, Reverse-Proxy-Pflicht).
  • F-10 library_info und library://sources generieren aus
    einer gemeinsamen SOURCES-Konstante (kein Drift mehr).
  • F-11 Version-Badge im README ist dynamisch (shields.io/pypi/v).
  • F-12 oai_identifier-Pattern strenger validiert.

CI / Quality

  • Unit-Tests laufen jetzt auf Python 3.11, 3.12 und 3.13.
  • ruff check deckt src/ UND tests/ ab.
  • 59 Unit-Tests + 26 Live-Tests (pytest -m live).
  • Mocked End-to-End-Tests via respx für http_get.

Bonus-Fix

  • Transport-Bezeichner streamable_httpstreamable-http
    (korrekte FastMCP-API). Der Code wäre vorher mit aktuellen
    mcp-Versionen mit TypeError gescheitert.

Full changelog: CHANGELOG.md