MacTopics.de

MCP für VuFind: "Literatur im Gespräch" mit Claude finden

Die Sesam2050-Literaturdatenbank ist eine VuFind-Datenbank mit über 25.000 Einträgen aus der Fachliteratur zur Kinder- und Jugendliteratur. Die Inhalte sind bereits in Google, Bing & Co. indexiert und so mancher KI-Chatbot hat auch schon fleißig abgegrast. Ein MCP-Server schien mir ein spannendes Projekt, um eine direkte Verbindung zwischen dem von mir favorisierten KI-Assistenten (Claude) und der Datenbank aufzubauen.

Die Grundidee

MCP (Model Context Protocol) ist ein offenes Protokoll, über das ein KI-Assistent externe Werkzeuge nutzen kann. Mein Server stellt Claude ein paar gut beschriebene Tools zur Verfügung, die Claude eigenständig aufruft:

  • search_records – die eigentliche Suche (Suchfeld, Filter, Sortierung, Limit, gewünschte Datensatz-Felder)
  • get_facet_values – echte Facettenwerte (Format, Sprache, Jahr …) nachschlagen, bevor gefiltert wird
  • get_record – alle Details zu einem Datensatz
  • describe_catalog – liest Suchfelder, Sortierungen und Facettenfelder aus der OpenAPI-Beschreibung der VuFind-Instanz, es ist also nichts fest verdrahtet

Dazu kommt eine kurze Anleitung zum Index: welche Suchfelder gibt es, werden Phrasensuchen und Wildcards unterstützt, in welcher Sprache sind die Mehrzahl der Ergebnisse. Da die Datenbank deutsche Inhalte vorhält, sollte Claude Suchbegriffe übersetzen oder erweitern. Das Sprachverständnis liefert Claude, der Server ist nur der Übersetzer zur VuFind-API. Er arbeitet ausschließlich lesend, begrenzt die Trefferzahl und liefert nur die nötigen Felder samt Link zum Datensatz zurück.

Technisch ist es ein Python-Dienst (FastMCP, httpx, uvicorn), der als systemd-Service auf demselben Server läuft wie VuFind. Davor sitzt Apache als Reverse Proxy mit Let’s-Encrypt-Zertifikat unter einer eigenen Subdomain.

Das Ergebnis vorab

Ein Beispiel aus der Praxis. Ich schreibe in Claude nur „finde bücher zum theme flucht und migration“, und Claude beginnt in der Datenbank zu suchen:

Claude durchsucht den Katalog

Wenige Sekunden später steht das Ergebnis da, nach Art der Titel sortiert und mit Links zu den Einträgen. Claude hat die Treffer gruppiert und ansprechend aufbereitet:

Das Ergebnis mit Links zu den Katalogeinträgen

Authentifizierung - notwendig, oder überflüssig?

Der Katalog ist öffentlich, es geht also nicht um den Schutz von Daten, sondern um Zugangskontrolle und Missbrauchsschutz. Es gibt zwei Zugriffswege, die getrennt betrachtet werden müssen.

Claude → MCP-Server. Claude erwartet für Remote-Connectoren OAuth 2.1 mit PKCE und Dynamic Client Registration. Weil es einfacher war und ich keine eigene Benutzerverwaltung aufbauen wollte, habe ich mich für Google als Identitätsanbieter entschieden. Der Ablauf:

  1. Beim Hinzufügen des Connectors in Claude leitet der Server zu Google weiter.
  2. Google liefert die Identität zurück.
  3. Der Server prüft ob die E-Mail-Adresse auf der “Allow List” steht.
  4. Wer nicht draufsteht, bekommt keinen Zugriff. Ich bin schon ein wenig gemein…

Die Liste der zugriffsberechtigten E-Mail-Adressen ist also die eigentliche Schranke. FastMCPs GoogleProvider kennt jedoch keine “Allow List”, also musste eine Sub-Class erstellt werden, die bei jeder Anfrage die Adresse prüft und im Zweifel mit HTTP 401 den Zugang ablehnt. Nicht gelistete Personen können den Google-Login abschließen, kommen aber nicht weiter. Der OAuth-State liegt verschlüsselt auf der Festplatte, was dieses System unabhängig von einem eventuellen Service-Neustart macht.

MCP-Server → VuFind. Da die VuFind-API für externe Aufrufer gesperrt ist musste ich mir keine Gedanken um API-Keys oder ähnliches machen. Der MCP-Server läuft auf demselben Rechner und ruft VuFind lokal auf; in der permissions.ini bekommt der Abschnitt [api.SearchAndRecord] per ipRange[] eine Freigabe für 127.0.0.1 - und das wars. Soll heißen, nur der lokale Server darf die API nutzen, sonst niemand.

Anubis wehrt den MCP Server ab

Diese Lösung hatte einen Haken in der Form von Anubis, dessen Aufgabe es ist, VuFind vor KI-Crawlern zu schützen. Mein erster Plan, den lokalen Aufruf einfach auf http://127.0.0.1/api/v1 zu richten, ging schief. Die Lösung war letztendlich leichter als gedacht, der Weg dahin jedoch steinig.

Bei der Installation von Anubis hatte ich VuFind auf den internen Port 8888 verschoben, ich musste also den MCP Server nur instruieren, auch direkt auf diesen Port zuzugreifen. Total einfach, oder? Ich habe eine Stunde gebraucht, bis ich mich an dieses Detail erinnerte und richtig in mein mentales Modell eingeordnet hatte. Noch viel schlimmer, im letzten Blog-Post hatte ich genau dieses Detail dokumentiert.

Somit bleibt die Bot-Abwehr für alle externen Besucher aktiv, nur der eigene, vertrauenswürdige Dienst, der direkt auf dem Server sitzt, nimmt eine Abkürzung.

Fazit

Der Bau des Servers war deutlich einfacher als befürchtet und Claude half mir dabei ausgiebig. Am spannendsten war die Infrastruktur, bei der Anubis die einzige echte Überraschung war. Das Praktische an der Lösung: Der öffentliche Katalog bleibt geschützt, die API bleibt nach außen zu, und trotzdem kann ich einfach mit der Datenbank „chatten“. Bei der Suche nach Literatur zu Flucht und Migration hat Claude die richtigen Suchbegriffe ermittelt, eine ganze Reihe an Suchen durchgeführt, Ergebnisse neu sortiert und aufbereitet und alles in einer nützlichen Antwort präsentiert. Ich mag VuFind sehr, aber so ein MCP Server hat echtes Potenzial. Auch wenn ich den Service gleich wieder deaktiviert habe, hat er Lust auf mehr gemacht.