RIS MCP Server — When AI Meets Legal Research
A law firm came to us with a simple request: "We spend hours searching through legal databases. Can AI help?" The answer was yes — but not in the way you'd think. We didn't build a chatbot. We built a tool that makes their AI assistant actually understand law.
What is MCP?
The Model Context Protocol (MCP) is a standard for giving AI agents access to external tools and data. Think of it as a USB port for AI — plug in a capability, and any compatible AI assistant can use it. Claude, GPT, Gemini — any agent that speaks MCP can use the tools we built. One protocol, universal access.
The Problem
Austria's Rechtsinformationssystem (RIS) is the country's legal information database. It has a public API, and it holds essentially every Austrian law, regulation, and court decision. The API is complex, though. Legal queries aren't simple keyword searches. You need to know:
- Which body of law applies (federal, state, EU)
- Which specific sections are relevant
- How laws reference each other (§ 42 Abs. 3 references § 18 Abs. 1)
- The date context (was this law in effect at the time in question?)
Lawyers know this intuitively. AI doesn't — unless you teach it.
Our Solution
We built an MCP server with two types of tools:
Search tools that build proper API calls to RIS. They handle pagination, filter by law type, date, and jurisdiction, and return structured results. Instead of the AI trying to query a complex API directly (and getting it wrong), it calls our search tool with a natural description of what it needs.
Decomposition tools that take a complex legal question and break it into smaller, searchable sub-queries. For example:
"Is this employment contract clause valid under Austrian labor law?"
Becomes:
- Search AngG (Angestelltengesetz) for employment contract requirements
- Search ABGB for general contract validity clauses
- Search relevant OGH decisions for precedent on similar clauses
The Part Nobody Talks About: Reading the Docs
Skip past "What is MCP" and all the architecture talk. The real story of this project is me, the RIS API documentation PDF, and several months of trial and error that no blog post ever prepared me for.
The RIS API does have documentation. It's long. It's thorough. Every parameter is listed. It looks professional. It is also almost useless for figuring out how to write a call that returns something usable.
Here's a real excerpt from the parameter reference for the federal law search — one of the more complete sections:
Excerpt · RIS-OGD Dokumentation
Suchworte — Suche über den gesamten Inhalt des Dokuments. Typ: PhraseSearchExpression
Titel — Suche nach Titel oder Abkürzung der Rechtsvorschrift. Typ: PhraseSearchExpression
Index — Suche nach der Indexnummer gemäß dem „Systematischen Verzeichnis des Bundesrechts“. Typ: PhraseSearchExpression
FassungVom — Angabe jenes Datums, zu dem sich die Rechtsvorschrift in Kraft befinden soll. Wird kein Datum eingetragen, werden alle Dokumente zurückgegeben, unabhängig davon, ob sie in Kraft sind. Typ: date
Kundmachungsorgan — Suche nach dem Kundmachungsorgan (z. B. „BGBl. I Nr. “, „BGBl. II Nr. “, „BGBl. III Nr. “, „JGS Nr.“). Typ: PhraseSearchExpression
That's fine. It tells you the parameters exist. It does not tell you:
- Which combinations the server actually accepts
- Which ones silently return an empty result set
- Which ones 500 the endpoint
- What
PhraseSearchExpression syntax the server will parse — quoted strings? wildcards? boolean operators? - How pagination really works once results exceed the default page size
- What happens when you mix
FassungVom with a query for a repealed law
The Judikatur endpoint — the one my MCP server actually uses, the one that searches court decisions — doesn't even have its own section in the PDF. You get a schema file reference (RISJudikaturNutzdaten.xsd) and the implied expectation that you'll figure the rest out. Every useful query shape I landed on was arrived at by guessing, sending, reading the result, and guessing again.
What didn't help
AI tools didn't help. The RIS API is too niche to be in any training set in a useful way. Claude could read the PDF with me, but when a call returned an empty array, it couldn't tell me why. It guessed. I guessed. We guessed together. At some point I stopped asking and just edited the Python manually.
RIS support didn't help. I wrote a detailed email asking about parameter interactions. The reply came back a few days later:
"Ja, diese Parameter existieren."
That was the whole answer. They confirmed the parameters I had named in my email were, in fact, parameters. Thank you.
What actually helped
Sitting with the PDF at 2am and changing one parameter at a time until something returned plausible output. Then taking that output to the law firm and asking: is this the right case? The law firm was the ground truth. Every correct result was a lawyer saying "yes, that's the precedent we'd cite." Every wrong result sent me back to the documentation.
I used Claude Code for the TypeScript architecture of the MCP layer on top. That part was fine. The part that had no shortcut was the read-the-PDF, rewrite-the-Python, validate-with-humans loop. Weeks of that. Most of the nights run together now. But the end state is a server where every query shape the MCP tools expose has been empirically validated against real legal results — which is the only reason a lawyer can trust the output.
The Sparring Partner
The server doesn't just fetch data — it helps the AI reason about it. When a lawyer asks their AI assistant a complex question, the MCP server helps the AI build a structured research basis. It's like having a junior associate who's read every law and can pull the relevant ones instantly. The lawyer still does the analysis, the judgment, the client advice — but the research that used to take hours now takes minutes.
For the development itself, I used Claude Code for the TypeScript architecture and the complex prompt engineering that makes the decomposition tools work well. Gemini was great for researching legal edge cases and testing the output quality. Copilot handled the Microsoft/Azure-related integration work. Each AI tool has its lane — Claude for coding, Gemini for research and testing, Copilot for the Microsoft ecosystem.
Working with the Law Firm
Building AI tools for a specialized domain means listening before you build. What we learned and applied:
- What they actually needed vs. what we thought they needed. We started building a tool that summarized entire laws. They wanted one that could find the right paragraph in seconds. Precision over breadth — and we adapted fast.
- Domain language matters. Legal German has specific terms that don't map cleanly to everyday language. "Kündigungsfristen" isn't just "deadlines" — it's specifically termination notice periods under employment law. Get the terminology wrong and you get the wrong results.
- Trust is built through transparency. Lawyers verify every AI output. So we built the tools to always show their sources — every answer links back to the exact § and Abs. in the RIS. No black boxes.
The Best AI Tools Don't Replace Experts
They give experts superpowers. That's exactly what this MCP server does — it doesn't practice law. It makes lawyers dramatically faster. The firm's researchers went from spending hours on routine legal lookups to spending minutes. That time goes back to the work that actually requires human judgment — advising clients, building arguments, understanding context that no database can capture. That's the trade we were designing for from day one.
— Elias
RIS-MCP-Server — Wenn KI auf Rechtsrecherche trifft
Eine Kanzlei kam mit einer einfachen Frage auf uns zu: „Wir verbringen Stunden in Rechtsdatenbanken. Kann KI helfen?“ Die Antwort war ja — aber nicht in der Art, die man erwartet. Wir haben keinen Chatbot gebaut. Wir haben ein Tool gebaut, das den KI-Assistenten der Kanzlei Recht wirklich verstehen lässt.
Was ist MCP?
Das Model Context Protocol (MCP) ist ein Standard, der KI-Agenten Zugang zu externen Tools und Daten gibt. Man kann es sich als USB-Port für KI vorstellen — steck eine Fähigkeit rein, und jeder kompatible KI-Assistent kann sie nutzen. Claude, GPT, Gemini — jeder Agent, der MCP spricht, kann unsere Tools verwenden. Ein Protokoll, universeller Zugriff.
Das Problem
Österreichs Rechtsinformationssystem (RIS) ist die Rechtsdatenbank der Republik. Es gibt eine öffentliche API, und sie enthält im Grunde jedes österreichische Gesetz, jede Verordnung und jede Gerichtsentscheidung. Aber die API ist komplex. Rechtliche Anfragen sind keine einfachen Keyword-Suchen. Du musst wissen:
- Welches Rechtsgebiet gilt (Bund, Länder, EU)
- Welche Paragraphen relevant sind
- Wie Gesetze sich aufeinander beziehen (§ 42 Abs. 3 verweist auf § 18 Abs. 1)
- Den zeitlichen Kontext (galt dieses Gesetz zum fraglichen Zeitpunkt?)
Juristen wissen das intuitiv. KI nicht — außer du bringst es ihr bei.
Unsere Lösung
Wir haben einen MCP-Server mit zwei Arten von Tools gebaut:
Such-Tools, die saubere API-Aufrufe an das RIS zusammenbauen. Sie handhaben Paginierung, filtern nach Rechtsart, Datum und Jurisdiktion und geben strukturierte Ergebnisse zurück. Statt dass die KI die komplexe API direkt abfragt (und es falsch macht), ruft sie unser Such-Tool mit einer natürlichsprachlichen Beschreibung dessen auf, was sie braucht.
Decomposition-Tools, die eine komplexe Rechtsfrage in kleinere, suchbare Teilanfragen zerlegen. Zum Beispiel:
„Ist diese Klausel im Arbeitsvertrag nach österreichischem Arbeitsrecht gültig?“
Wird zu:
- Im AngG (Angestelltengesetz) nach Anforderungen an Arbeitsverträge suchen
- Im ABGB nach allgemeinen Regeln zur Vertrags-Gültigkeit suchen
- Relevante OGH-Entscheidungen zu ähnlichen Klauseln als Präzedenzfälle suchen
Der Teil, über den niemand redet: die Doku lesen
Überspring „Was ist MCP“ und das ganze Architekturgerede. Die wirkliche Geschichte dieses Projekts ist ich, das RIS-API-Dokumentations-PDF und mehrere Monate Trial-and-Error, auf die kein Blogpost mich vorbereitet hat.
Die RIS-API hat eine Dokumentation. Sie ist lang. Sie ist gründlich. Jeder Parameter ist aufgelistet. Sie wirkt professionell. Sie ist auch fast nutzlos, wenn es darum geht, einen Aufruf zu schreiben, der etwas Brauchbares zurückgibt.
Hier ein echter Auszug aus der Parameterreferenz für die Bundesrechts-Suche — einer der vollständigeren Abschnitte:
Auszug · RIS-OGD Dokumentation
Suchworte — Suche über den gesamten Inhalt des Dokuments. Typ: PhraseSearchExpression
Titel — Suche nach Titel oder Abkürzung der Rechtsvorschrift. Typ: PhraseSearchExpression
Index — Suche nach der Indexnummer gemäß dem „Systematischen Verzeichnis des Bundesrechts“. Typ: PhraseSearchExpression
FassungVom — Angabe jenes Datums, zu dem sich die Rechtsvorschrift in Kraft befinden soll. Wird kein Datum eingetragen, werden alle Dokumente zurückgegeben, unabhängig davon, ob sie in Kraft sind. Typ: date
Kundmachungsorgan — Suche nach dem Kundmachungsorgan (z. B. „BGBl. I Nr. “, „BGBl. II Nr. “, „BGBl. III Nr. “, „JGS Nr.“). Typ: PhraseSearchExpression
Das ist in Ordnung. Es sagt dir, dass die Parameter existieren. Es sagt dir nicht:
- Welche Kombinationen der Server tatsächlich akzeptiert
- Welche still ein leeres Ergebnis zurückgeben
- Welche den Endpoint mit 500 crashen
- Welche
PhraseSearchExpression-Syntax der Server parsen wird — Anführungszeichen? Wildcards? Boolsche Operatoren? - Wie Paginierung wirklich funktioniert, sobald die Ergebnisse die Standard-Seitengröße überschreiten
- Was passiert, wenn du
FassungVom mit einer Anfrage zu einem außer Kraft getretenen Gesetz mischst
Der Judikatur-Endpoint — der, den mein MCP-Server tatsächlich nutzt, der nach Entscheidungen sucht — hat nicht mal einen eigenen Abschnitt im PDF. Du bekommst einen Verweis auf eine Schema-Datei (RISJudikaturNutzdaten.xsd) und die implizite Annahme, dass du den Rest selbst rausbekommst. Jede brauchbare Abfrageform, auf die ich gelandet bin, entstand durch Raten, Senden, Ergebnis lesen und wieder raten.
Was nicht geholfen hat
KI-Tools haben nicht geholfen. Die RIS-API ist zu nischig, um in irgendeinem Trainingsset nützlich vorzukommen. Claude konnte das PDF mit mir lesen, aber wenn ein Aufruf ein leeres Array zurückgab, konnte er mir nicht sagen, warum. Er hat geraten. Ich habe geraten. Wir haben gemeinsam geraten. Irgendwann habe ich aufgehört zu fragen und das Python manuell editiert.
Der RIS-Support hat nicht geholfen. Ich habe eine detaillierte Mail zu Parameter-Interaktionen geschrieben. Die Antwort kam ein paar Tage später:
„Ja, diese Parameter existieren.“
Das war die ganze Antwort. Sie haben bestätigt, dass die Parameter, die ich in meiner Mail genannt hatte, tatsächlich Parameter waren. Danke.
Was wirklich geholfen hat
Um 2 Uhr mit dem PDF zu sitzen und einen Parameter nach dem anderen zu ändern, bis etwas Plausibles zurückkam. Und dann dieses Ergebnis zur Kanzlei zu tragen und zu fragen: Ist das der richtige Fall? Die Kanzlei war die Ground Truth. Jedes richtige Ergebnis war ein Anwalt, der sagte: „Ja, das ist der Präzedenzfall, den wir zitieren würden.“ Jedes falsche Ergebnis schickte mich zurück in die Doku.
Für die TypeScript-Architektur der MCP-Schicht obendrauf habe ich Claude Code benutzt. Dieser Teil war unproblematisch. Der Teil ohne Abkürzung war die PDF-lesen, Python-umschreiben, mit-Menschen-validieren-Schleife. Wochenlang. Die meisten Nächte verschwimmen heute. Aber das Endresultat ist ein Server, bei dem jede Abfrageform, die die MCP-Tools bereitstellen, empirisch gegen echte juristische Ergebnisse validiert wurde — das ist der einzige Grund, warum ein Anwalt dem Output vertrauen kann.
Der Sparringspartner
Der Server holt nicht nur Daten — er hilft der KI, mit ihnen zu argumentieren. Wenn ein Anwalt seinem KI-Assistenten eine komplexe Frage stellt, hilft der MCP-Server der KI, eine strukturierte Rechercheform aufzubauen. Es ist, als hätte man einen Junior, der jedes Gesetz gelesen hat und die relevanten sofort heraussucht. Der Anwalt macht weiterhin die Analyse, das Urteil, die Mandantenberatung — aber die Recherche, die früher Stunden gebraucht hat, dauert jetzt Minuten.
Für die Entwicklung selbst habe ich Claude Code für die TypeScript-Architektur und das komplexe Prompt-Engineering genutzt, das die Decomposition-Tools gut funktionieren lässt. Gemini war stark für die Recherche zu juristischen Edge Cases und zum Testen der Output-Qualität. Copilot hat die Microsoft/Azure-Integration übernommen. Jedes KI-Tool hat seine Spur — Claude für Code, Gemini für Recherche und Tests, Copilot für das Microsoft-Ökosystem.
Arbeiten mit der Kanzlei
KI-Tools für eine Fach-Domäne zu bauen heißt zuhören, bevor man baut. Was wir gelernt und umgesetzt haben:
- Was sie wirklich brauchten vs. was wir dachten, was sie brauchten. Wir haben angefangen, ein Tool zu bauen, das ganze Gesetze zusammenfasst. Sie wollten eines, das in Sekunden den richtigen Paragrafen findet. Präzision vor Breite — und wir haben schnell umgeschaltet.
- Domänensprache zählt. Juristisches Deutsch hat spezifische Begriffe, die sich nicht sauber auf Alltagssprache abbilden lassen. „Kündigungsfristen“ heißt nicht einfach „Deadlines“ — das sind spezifisch arbeitsrechtliche Kündigungsfristen. Terminologie falsch, Ergebnis falsch.
- Vertrauen entsteht durch Transparenz. Anwälte verifizieren jeden KI-Output. Also haben wir die Tools so gebaut, dass sie immer die Quellen zeigen — jede Antwort verlinkt zurück auf den genauen § und Abs. im RIS. Keine Black Boxes.
Die besten KI-Tools ersetzen keine Experten
Sie geben Experten Superkräfte. Genau das tut dieser MCP-Server — er praktiziert kein Recht. Er macht Anwälte dramatisch schneller. Die Rechercheure der Kanzlei sind von stundenlanger Routine-Recherche auf Minuten heruntergegangen. Diese Zeit fließt zurück in die Arbeit, die menschliches Urteil braucht — Mandanten beraten, Argumente aufbauen, Kontext verstehen, den keine Datenbank einfängt. Das ist der Tausch, auf den wir von Tag eins hin entworfen haben.
— Elias