RIS MCP Server
An MCP (Model Context Protocol) server that gives AI assistants access to Austria's official legal database — the Rechtsinformationssystem (RIS).
Ask your AI assistant about Austrian law, and it will search and retrieve legal documents directly from the official government API. No API key required.
What You Can Do
Once connected, you can ask your AI assistant things like:
"What does Austrian law say about tenancy rights?"
"Find Constitutional Court decisions on freedom of expression."
"Show me §1295 of the ABGB (Austrian Civil Code)."
"What laws about climate protection were published in 2024?"
"Look up the building code for the province of Salzburg."
"Get the full text of document NOR40052761."
The server translates these natural language requests into structured API calls against the RIS Open Government Data API.
Features
- 13 specialized tools covering all major RIS collections
- Federal law (ABGB, StGB, UGB, ...) and state law for all 9 provinces
- Court decisions from 16 court types (Supreme Court, Constitutional Court, Administrative Court, ...)
- Law gazettes — Federal (BGBl) and state (LGBl)
- Government bills, ministerial decrees, cabinet protocols
- Full document retrieval with smart prefix-based routing
- Change history tracking across 36 application types
- Interactive result list (MCP Apps) in hosts that support it — with a full text answer everywhere else
- Markdown and JSON output formats
- Free and open — uses Austria's Open Government Data API, no API key needed
Quick Start
Run directly without installation:
pnpm dlx ris-mcp-ts
Or install globally:
pnpm add -g ris-mcp-ts
Configuration
Claude Desktop
Add to your Claude Desktop config (Settings > Developer > Edit Config):
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"ris": {
"command": "npx",
"args": ["-y", "ris-mcp-ts"]
}
}
}
Note: The "Add custom connector" UI in Claude Desktop only supports remote MCP servers (HTTP/SSE). Local stdio servers like this one must be configured via the JSON file.
Tip: You can also use
pnpm dlxinstead ofnpxin all configuration examples if you prefer pnpm.
Claude Code
Add to your project or user settings:
claude mcp add ris -- npx -y ris-mcp-ts
VS Code (GitHub Copilot)
Add to .vscode/mcp.json in your project:
{
"servers": {
"ris": {
"type": "stdio",
"command": "npx",
"args": ["-y", "ris-mcp-ts"]
}
}
}
Cursor
Add to .cursor/mcp.json in your project (or ~/.cursor/mcp.json for global access):
{
"mcpServers": {
"ris": {
"command": "npx",
"args": ["-y", "ris-mcp-ts"]
}
}
}
Windsurf
Add to your Windsurf MCP config at ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"ris": {
"command": "npx",
"args": ["-y", "ris-mcp-ts"]
}
}
}
Other MCP Clients
Any MCP-compatible client can connect via stdio transport:
npx -y ris-mcp-ts
# or: pnpm dlx ris-mcp-ts
Available Tools
Interactive Result List
One widget, all eleven search tools. There is a single interactive result list, and every search tool renders into it: federal law, state law, case law, the federal and state law gazettes, government bills, district authority announcements, municipal law, the miscellaneous collections, change history and the ordinance gazettes. The screenshots below are the same widget in two different hosts, not two different features.
ris_dokument opens a reader instead. A single document can run to a quarter of a million characters, far past what one answer may carry, so the viewer loads it section by section as you scroll, offers an outline to jump by where the document has one, and links back into RIS. The full text still reaches the chat either way — the widget is never the only copy.
Hosts that support the MCP Apps extension render the hits as an interactive list — page through results without retyping the search, open a document in the browser, or request its full text with one click. The widget follows the host's light or dark theme; the shots below show both.
RIS is a German-language database, so these work best in German. Each of these lands on a different tool:
"Zeig mir das Verbrauchergewährleistungsgesetz" —
ris_bundesrecht
"Finde aktuelle OGH-Rechtsprechung zu Verjährung" —
ris_judikatur
"Was steht im Tiroler Landesrecht zum Naturschutz?" —
ris_landesrecht
"Zeig mir BGBl. I Nr. 175/2021" —
ris_bundesgesetzblatt
In a host without MCP Apps support the same prompts return the full text answer instead — see the table below.
The chat answer is always complete. The widgets are an addition to it, never a replacement — a host that does not render them loses nothing.
Tool Reference
Search Austrian federal laws such as ABGB, StGB, UGB, and more.
Inputs:
All parameters are optional. At least one search parameter (suchworte, titel, or paragraph) should be provided.
Note:
applikation="Erv"(English translations) uses a different parameter vocabulary internally (SearchTerms/Title) and does not supportparagraph/abschnitt_typorfassung_vom.
Search state laws of the nine Austrian provinces.
Inputs:
Search court decisions from Austrian courts.
Inputs:
Available gerichtsbarkeit values (16):
Search the Federal Law Gazette (BGBl) — official publications of federal legislation.
Inputs:
Search State Law Gazettes (LGBl) — official publications of state legislation.
Inputs:
Search government bills — draft legislation submitted to parliament.
Inputs:
Retrieve the full text of a legal document by its ID or URL. Uses a dual strategy: direct URL access first, then search API fallback.
Inputs:
At least one of dokumentnummer or url is required. Long documents are truncated to 25,000 characters.
Supported document prefixes:
The full routing registry lives in
DOCUMENT_ROUTES(src/client.ts); unknown prefixes fall back to a Justiz search.
Return one section of a document already open in the RIS document viewer. Intended for the viewer widget, not for direct use — for the full text of a document use ris_dokument.
The tool is declared app-only (_meta.ui.visibility: ["app"]): hosts that honour the flag hide it from the model and let only the viewer widget call it. It serves the same text ris_dokument produced, from the document cache where possible, so the offsets the viewer holds address the same document.
Inputs:
At least one of dokumentnummer or url is required. Each section is 25,000 characters long.
Output (structuredContent):
Search announcements from district administrative authorities.
Note: Only available for: Niederoesterreich, Oberoesterreich, Tirol, Vorarlberg, Burgenland, Steiermark.
Inputs:
Search municipal law — local ordinances and regulations.
Inputs:
Additional parameters depend on the selected application. See Gr (municipal law) and GrA (official gazettes) specific parameters in the source code.
Search miscellaneous legal collections and specialized databases.
Inputs:
Available collections:
Each collection has additional specific parameters. See the tool description for details.
Track document creation, modification, and deletion across the RIS database.
Inputs:
Available applications (36):
Federal law: Bundesnormen, BgblAuth, BgblAlt, BgblPdf, RegV
State law: Landesnormen, LgblAuth, Lgbl, LgblNO, Vbl, Gemeinderecht, GemeinderechtAuth
Case law: Justiz, Vfgh, Vwgh, Bvwg, Lvwg, Dsk, Gbk, Pvak, AsylGH
Other: Bvb, Mrp, Erlaesse, PruefGewO, Avsv, Spg, KmGer, Dok, Normenliste
Historical (jurisdictions dissolved on 2014-01-01, change history still tracked): Verg, Upts, Uvs, Ubas, Umse, Bks
Search state ordinance gazettes (Verordnungsblätter).
Note: Currently only data from Tirol is available (since January 2022).
Inputs:
Result size
The text block of every tool is capped at 25,000 characters. The search tools'
structuredContent has its own budget of 45,000 characters (serialized); a
page that would exceed it is delivered at the next smaller RIS page size
(100 → 50 → 20 → 10) with page, page_size, has_more and the query echo
rewritten to that size and a German notice in both the text and the payload.
Page with query.limit and query.seite as echoed. Prefer limit: 20; 50
suits a broad survey; 100 is only ever delivered when the hits are small.
The default is calibrated to Claude Code, which rejects a result whose
structured payload exceeds 25,000 tokens (measured: rejected at 58,659
characters, accepted at 46,311; the margin below that covers content that
tokenizes worse); claude.ai renders far larger payloads and needs no budget.
Self-hosters whose client accepts larger results can raise the budget with the
RIS_STRUCTURED_CONTENT_BUDGET environment variable (a positive integer).
Development
Prerequisites
- Node.js >= 20.19.0 (required by the Vite 7 widget build)
Setup
git clone https://github.com/Honeyfield-Org/ris-mcp-ts.git
cd ris-mcp-ts
pnpm install
pnpm run build
Scripts
Project Structure
src/
├── index.ts # Entry point (stdio transport)
├── server.ts # MCP server setup, delegates to tools/
├── client.ts # HTTP client for RIS API
├── types.ts # Zod schemas + TypeScript types
├── parser.ts # JSON parsing and response normalization
├── formatting.ts # Output formatting (markdown/json)
├── helpers.ts # Shared helper functions
├── constants.ts # Static mappings and configuration
├── widgets.ts # MCP Apps widget resource + tool metadata
├── tools/ # One file per tool handler
│ ├── index.ts
│ ├── bundesrecht.ts
│ ├── landesrecht.ts
│ ├── judikatur.ts
│ └── ...
└── __tests__/ # Unit and integration tests
ui/ # Widget sources (browser code, built by Vite)
├── trefferliste/ # The result-list widget
└── shared/ # Host bridge, shared states and theme
Contributing
See CONTRIBUTING.md for guidelines.
License
Built on the Open Government Data API provided by the Austrian Federal Chancellery (Bundeskanzleramt).