Skip to content

v1.2.0

Latest

Choose a tag to compare

@malkreide malkreide released this 02 Aug 12:47
a02fe82

[1.2.0] - 2026-08-02

Dieser Abschnitt wurde am 20.07.2026 geschrieben, aber nie veröffentlicht:
auf PyPI stand weiterhin 1.1.0. Er trägt jetzt das Datum, an dem er
tatsächlich ausgeliefert wird, und die seither hinzugekommene
SDK-Migration.

Diese Auslieferung ist überfällig, weil das veröffentlichte 1.1.0 sich
nicht mehr installieren lässt.
Es deklariert mcp ohne Obergrenze, und
mcp 2.0.0 hat mcp.server.fastmcp entfernt — pip install swiss-academic-libraries-mcp löst auf 2.0.0 auf, und das Konsolen-Skript
stirbt beim Start mit ImportError: cannot import name 'McpError' from 'mcp'.
Gemessen am echten Artefakt in einem leeren Venv, in kaltem wie warmem
Interpreter.

Behoben war das im Repository seit der 2.x-Migration; veröffentlicht wurde es
nie.

Geändert (breaking)

  • Migration auf das mcp Python SDK 2.x. Die Server-API ist von
    mcp.server.fastmcp nach mcp.server.mcpserver umgezogen, ohne
    Kompatibilitätsschicht; die Abhängigkeit lautet jetzt mcp[cli]>=2.0.0,<3.
    Die Tool-Oberfläche bleibt unverändert — was bricht, ist das Einbetten der
    Python-API und die Abhängigkeitsuntergrenze. Wer auf mcp 1.x bleiben muss,
    bleibt auf 1.1.0 und setzt dort eine eigene Obergrenze, denn das
    veröffentlichte 1.1.0 hat keine.

Neue internationale Metadatenebene: DOI-Auflösung und internationale
Forschungsliteratur (Crossref) sowie Preprints (arXiv). Damit beantwortet der
Server «gibt es das in der Schweiz?» und «was ist das überhaupt und wo steht es
sonst?» in derselben Konversation. Tool-Extension, kein neuer Server — gleiches
Domänenfeld, gemeinsamer HTTP-Client, gemeinsamer Provenance-Envelope. Das
bestehende Katalog- und OA-Recht-Verhalten bleibt unverändert.

Added

  • Drei neue Tools (alle readOnlyHint=True): resolve_doi (DOI → volle
    Metadaten via Crossref), search_publications (Crossref-Suche mit
    Jahresfilter) und search_preprints (arXiv, mit automatischer
    Phrasen-Quotierung + Throttle). Damit 16 Tools.
  • Modul intl_metadata.py mit Crossref- und arXiv-Adaptern, Pydantic-v2-
    Modellen CrossrefWork und Preprint (nur Metadaten, kein Volltext, license
    nie leer) und einer Code-Layer-Egress-Allow-List (api.crossref.org,
    export.arxiv.org). Retry/Backoff über http_get_with_retry wiederverwendet.
  • Portfolio-Verkettung national ↔ international: jede aufgelöste DOI liefert
    Titel, ISSN, ISBN und Autor:innen als saubere Top-Level-Felder; die Docstrings
    führen das Modell explizit zur Weitersuche in swisscovery_search. Neuer Prompt
    doi-to-swiss-shelf und neue Resource library://intl-metadata-sources.
  • Crossref polite pool via CROSSREF_MAILTO (mailto in User-Agent + Query);
    fehlt die Variable, läuft die Abfrage funktionsfähig im anonymen Pool weiter.
  • arXiv-Throttle (ARXIV_MIN_INTERVAL_SECONDS, Default 3 s) und
    Atom-XML-Parser via defusedxml (bestehende Dependency, keine neue).
  • Attribution pro Quelle (nicht gesammelt): jede Response trägt die
    Attribution genau ihrer Quelle — Crossref (Metadaten CC0 1.0) bzw. arXiv
    (Metadaten CC0 1.0 + erbetene Danksagung).
  • 20 neue Tests (tests/test_intl_metadata.py, respx-gemockt): Happy Path
    je Tool, Retry bei 503, Timeout, Atom-XML-Parser, Phrasen-Quotierung,
    polite-pool-mailto, Egress-Allow-List, Attribution pro Quelle; plus 2
    Live-Smoke-Tests.

Fixed

  • Versions-Drift behoben: __init__.py stand auf 0.1.0, während
    pyproject.toml 1.1.0 führte. Beide sind jetzt synchron auf 1.2.0.

Known findings (Live-Probe 2026-07-20)

  • Crossref schwach bei deutschsprachiger CH-Bildungsliteratur:
    query.bibliographic=Lehrplan 21 liefert als Top-Treffer ein Buchkapitel von
    1881. Crossref ist stark bei DOI-Auflösung und internationaler Forschung,
    nicht bei CH-Bildungspublikationen → dort swisscovery_search/oa_law_search.
    Crossref kennt die Weltliteratur, aber nicht den Zürcher Lehrplan — wie ein
    Weltatlas ohne die Quartierpläne.
  • arXiv-Phrasen-Falle: all:model context protocol = ~1'296'686 Treffer
    (OR), all:"model context protocol" = 462 (Phrase). search_preprints
    quotiert automatisch, damit Nutzende keine arXiv-Syntax lernen müssen.
  • arXiv httphttps-Redirect (301): Der geteilte httpx-Client folgt
    Redirects bewusst nicht; der https://-Endpoint wird direkt angesprochen.
  • SHARE (share.osf.io) — geprüft, nicht gebaut: Endpoint antwortet (≈58,9
    Mio. Records), aber Harvesting seit 2020 heruntergefahren, DB in CurateND
    archiviert, keine Wartungszusage. Für ein auf Verlässlichkeit positioniertes
    Portfolio kein tragbarer Abhängigkeitskandidat.
  • Open Library — Entscheidungs-Gate durchgefallen: 10 reale CH-Lehrmittel-
    ISBNs (aus swisscovery geharvestet) → 0/10 = 0 % (Schwelle 60 %).
    Kontrollen (EN + Trade-DE) lösen auf → echte Abdeckungslücke, kein Netzfehler.
    swisscovery deckt CH-Lehrmittel bereits ab; für den Buchhandel wäre GVI oder
    ein Verlagsverzeichnis passender. lookup_isbn daher nicht gebaut.