Skip to content

Releases: malkreide/swiss-academic-libraries-mcp

v1.1.0 — Open-Access legal literature

Choose a tag to compare

@malkreide malkreide released this 20 Jul 14:13
a6f4367

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

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

v0.2.0 — Initial PyPI Release

Choose a tag to compare

@malkreide malkreide released this 01 Apr 12:17
Fix CI: install ruff in test job

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

v0.1.0 — Initial release

Choose a tag to compare

@malkreide malkreide released this 23 Mar 04:46
80f79dc
Update pyproject.toml