Releases: malkreide/swiss-academic-libraries-mcp
Release list
v1.1.0 — Open-Access legal literature
Open-access Swiss legal literature. Adds a second discovery path alongside the library catalogue: freely accessible legal scholarship from sui generis, ex/ante and Repositorium.ch, surfaced as metadata only (no full text).
2 new read-only tools (13 total): oa_law_search (relevance-ranked search with source/language/year/peer-review filters) and oa_law_get (by DOI or URL).
Declarative source registry (oa_legal.py): 2× OAI-PMH + 1× Supabase/PostgREST; in-memory harvest + local keyword ranking; best-effort Crossref DOI→licence enrichment.
Governance: license never empty (unknown over guessing), every hit carries a DOI or persistent URL, language carried but never silently filtered.
Resilience: http_get_with_retry (exponential backoff), egress allow-list, graceful per-source degradation.
Delta security audit (audits/2026-07-20-oa-legal-delta/): production-ready, 0 critical/high/medium, 2 low remediated.
Full details in CHANGELOG.md.
v1.0.2 — Audit complete + sweep
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
defusedxmlgeparst — 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
überwachtpipundgithub-actionswöchentlich.
Observability (high/medium)
- F-03 Strukturiertes Logging auf stderr (stdout-frei, damit
stdio-JSON-RPC nicht korrumpiert).MCP_LOG_LEVELenv-Var. - F-07 Tool-Fehler werden als
McpErrorzurückgegeben, nicht
als Daten-Strings — Host sieht jetztisError=true. - F-13 Korrelations-ID (
request_id) in jedem Log-Eintrag
zur Upstream-Call-Verfolgung.
Performance (medium)
- F-05 Shared
httpx.AsyncClientmit 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-Agentfü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_infoundlibrary://sourcesgenerieren aus
einer gemeinsamenSOURCES-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 checkdecktsrc/UNDtests/ab.- 59 Unit-Tests + 26 Live-Tests (
pytest -m live). - Mocked End-to-End-Tests via
respxfürhttp_get.
Bonus-Fix
- Transport-Bezeichner
streamable_http→streamable-http
(korrekte FastMCP-API). Der Code wäre vorher mit aktuellen
mcp-Versionen mitTypeErrorgescheitert.
Full changelog: CHANGELOG.md
v0.2.0 — Initial PyPI Release
Fix CI: install ruff in test job Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>