{
  "markdown": "# RIS MCP Server\n\n[![CI](https://github.com/Honeyfield-Org/ris-mcp-ts/actions/workflows/ci.yml/badge.svg)](https://github.com/Honeyfield-Org/ris-mcp-ts/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/ris-mcp-ts.svg)](https://www.npmjs.com/package/ris-mcp-ts)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D20.19.0-brightgreen.svg)](https://nodejs.org/)\n[![MCP](https://img.shields.io/badge/MCP-compatible-blue.svg)](https://modelcontextprotocol.io/)\n[![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.philrox%2Fris-green.svg)](https://registry.modelcontextprotocol.io)\n\nAn [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server that gives AI assistants access to Austria's official legal database — the **Rechtsinformationssystem (RIS)**.\n\nAsk your AI assistant about Austrian law, and it will search and retrieve legal documents directly from the official government API. No API key required.\n\n## What You Can Do\n\nOnce connected, you can ask your AI assistant things like:\n\n> \"What does Austrian law say about tenancy rights?\"\n\n> \"Find Constitutional Court decisions on freedom of expression.\"\n\n> \"Show me §1295 of the ABGB (Austrian Civil Code).\"\n\n> \"What laws about climate protection were published in 2024?\"\n\n> \"Look up the building code for the province of Salzburg.\"\n\n> \"Get the full text of document NOR40052761.\"\n\nThe server translates these natural language requests into structured API calls against the [RIS Open Government Data API](https://data.bka.gv.at/ris/api/v2.6/).\n\n## Features\n\n- **12 specialized tools** covering all major RIS collections\n- **Federal law** (ABGB, StGB, UGB, ...) and **state law** for all 9 provinces\n- **Court decisions** from 16 court types (Supreme Court, Constitutional Court, Administrative Court, ...)\n- **Law gazettes** — Federal (BGBl) and state (LGBl)\n- **Government bills**, ministerial decrees, cabinet protocols\n- **Full document retrieval** with smart prefix-based routing\n- **Change history tracking** across 36 application types\n- **Interactive result list** (MCP Apps) in hosts that support it — with a full text answer everywhere else\n- **Markdown and JSON** output formats\n- **Free and open** — uses Austria's Open Government Data API, no API key needed\n\n## Quick Start\n\nRun directly without installation:\n\n```bash\npnpm dlx ris-mcp-ts\n```\n\nOr install globally:\n\n```bash\npnpm add -g ris-mcp-ts\n```\n\n## Configuration\n\n### Claude Desktop\n\nAdd to your Claude Desktop config (Settings > Developer > Edit Config):\n\n- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"ris\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"ris-mcp-ts\"]\n    }\n  }\n}\n```\n\n> **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.\n>\n> **Tip:** You can also use `pnpm dlx` instead of `npx` in all configuration examples if you prefer pnpm.\n\n### Claude Code\n\nAdd to your project or user settings:\n\n```bash\nclaude mcp add ris -- npx -y ris-mcp-ts\n```\n\n### VS Code (GitHub Copilot)\n\nAdd to `.vscode/mcp.json` in your project:\n\n```json\n{\n  \"servers\": {\n    \"ris\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"ris-mcp-ts\"]\n    }\n  }\n}\n```\n\n### Cursor\n\nAdd to `.cursor/mcp.json` in your project (or `~/.cursor/mcp.json` for global access):\n\n```json\n{\n  \"mcpServers\": {\n    \"ris\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"ris-mcp-ts\"]\n    }\n  }\n}\n```\n\n### Windsurf\n\nAdd to your Windsurf MCP config at `~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"ris\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"ris-mcp-ts\"]\n    }\n  }\n}\n```\n\n### Other MCP Clients\n\nAny MCP-compatible client can connect via stdio transport:\n\n```bash\nnpx -y ris-mcp-ts\n# or: pnpm dlx ris-mcp-ts\n```\n\n## Available Tools\n\n| Tool | Description |\n|------|-------------|\n| `ris_bundesrecht` | Search federal laws (ABGB, StGB, UGB, etc.) |\n| `ris_landesrecht` | Search state/provincial laws (all 9 provinces) |\n| `ris_judikatur` | Search court decisions (16 court types) |\n| `ris_bundesgesetzblatt` | Search Federal Law Gazettes (BGBl I/II/III) |\n| `ris_landesgesetzblatt` | Search State Law Gazettes (LGBl) |\n| `ris_regierungsvorlagen` | Search government bills |\n| `ris_dokument` | Retrieve full document text by ID or URL |\n| `ris_bezirke` | Search district authority announcements |\n| `ris_gemeinden` | Search municipal law and regulations |\n| `ris_sonstige` | Search miscellaneous collections (8 sub-apps) |\n| `ris_history` | Track document change history (36 app types) |\n| `ris_verordnungen` | Search state ordinance gazettes |\n\n## Interactive Result List\n\n**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.\n\n**`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.\n\nHosts 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.\n\n<table>\n<tr>\n<td width=\"50%\"><img src=\"https://raw.githubusercontent.com/Honeyfield-Org/ris-mcp-ts/main/docs/assets/widget-in-claude.png\" alt=\"The RIS widget running inside Claude: a connector row reading 'ris-mcp / ris_bundesrecht', below it the result list for 'Verbrauchergewährleistungsgesetz' with 40 hits and its first sections, each tagged 'Bundesrecht'.\" width=\"100%\"></td>\n<td width=\"50%\"><img src=\"https://raw.githubusercontent.com/Honeyfield-Org/ris-mcp-ts/main/docs/assets/widget-in-chatgpt.png\" alt=\"The same RIS widget running inside ChatGPT: the result list for 'Verbrauchergewährleistungsgesetz' with 40 hits and its first sections, above ChatGPT's own composer with the placeholder 'ChatGPT fragen'.\" width=\"100%\"></td>\n</tr>\n<tr>\n<td align=\"center\"><em>In Claude</em></td>\n<td align=\"center\"><em>In ChatGPT</em></td>\n</tr>\n</table>\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/Honeyfield-Org/ris-mcp-ts/main/docs/assets/readme-judikatur-light.png\" alt=\"Case law search for 'Verjährung' in the light theme: 7,466 hits, with court, decision date and case number on the expanded result, the actions 'Im RIS öffnen', 'PDF' and 'Volltext in den Chat', and pagination controls at the bottom.\" width=\"820\">\n  <br>\n  <em>The expanded detail view, light theme — metadata, the three actions, and pagination</em>\n</p>\n\n### Example Prompts\n\nRIS is a German-language database, so these work best in German. Each of these lands on a different tool:\n\n> \"Zeig mir das Verbrauchergewährleistungsgesetz\" — `ris_bundesrecht`\n\n> \"Finde aktuelle OGH-Rechtsprechung zu Verjährung\" — `ris_judikatur`\n\n> \"Was steht im Tiroler Landesrecht zum Naturschutz?\" — `ris_landesrecht`\n\n> \"Zeig mir BGBl. I Nr. 175/2021\" — `ris_bundesgesetzblatt`\n\nIn a host without MCP Apps support the same prompts return the full text answer instead — see the table below.\n\n| Host | What you get |\n|------|--------------|\n| claude.ai | Result list (pagination, document links) + document viewer (outline navigation, lazy loading) |\n| ChatGPT | Result list (pagination) + document viewer (outline navigation, lazy loading) |\n| Claude Code, and any client without MCP Apps support | The regular text results, unchanged |\n\nThe chat answer is always complete. The widgets are an addition to it, never a replacement — a host that does not render them loses nothing.\n\n## Tool Reference\n\n<details>\n<summary><strong>ris_bundesrecht</strong> — Federal Laws</summary>\n\nSearch Austrian federal laws such as ABGB, StGB, UGB, and more.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `suchworte` | string | Full-text search (e.g., \"Mietrecht\", \"Schadenersatz\") |\n| `titel` | string | Search in law titles (e.g., \"ABGB\", \"Strafgesetzbuch\") |\n| `paragraph` | string | Section number (e.g., \"1295\" for §1295, \"7\" for Art 7) |\n| `abschnitt_typ` | string | Type of section `paragraph` refers to: \"Paragraph\" (default), \"Artikel\" (article-based laws like B-VG), \"Anlage\" (annex) |\n| `applikation` | string | \"BrKons\" (consolidated, default), \"Begut\" (drafts), \"BgblAuth\" (gazette), \"Erv\" (English translations) |\n| `fassung_vom` | string | Date for historical version (YYYY-MM-DD) |\n| `seite` | number | Page number (default: 1) |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" (default) or \"json\" |\n\nAll parameters are optional. At least one search parameter (`suchworte`, `titel`, or `paragraph`) should be provided.\n\n> **Note:** `applikation=\"Erv\"` (English translations) uses a different parameter vocabulary internally (`SearchTerms`/`Title`) and does not support `paragraph`/`abschnitt_typ` or `fassung_vom`.\n\n</details>\n\n<details>\n<summary><strong>ris_landesrecht</strong> — State/Provincial Laws</summary>\n\nSearch state laws of the nine Austrian provinces.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in law titles |\n| `bundesland` | string | Province: Wien, Niederoesterreich, Oberoesterreich, Salzburg, Tirol, Vorarlberg, Kaernten, Steiermark, Burgenland |\n| `paragraph` | string | Section number (e.g., \"1\" for §1, \"7\" for Art 7) |\n| `abschnitt_typ` | string | Type of section `paragraph` refers to: \"Paragraph\" (default), \"Artikel\", \"Anlage\" |\n| `fassung_vom` | string | Date for historical version (YYYY-MM-DD) |\n| `gesetzesnummer` | string | Exact law number (Gesetzesnummer) of a specific state law |\n| `applikation` | string | \"LrKons\" (consolidated, default) |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n</details>\n\n<details>\n<summary><strong>ris_judikatur</strong> — Court Decisions</summary>\n\nSearch court decisions from Austrian courts.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `suchworte` | string | Full-text search in decisions |\n| `gerichtsbarkeit` | string | Court system / data collection to search — the RIS \"Applikation\" (see below; default \"Justiz\") |\n| `dokumenttyp` | string | \"rechtssatz\" (headnotes only), \"entscheidungstext\" (full texts only), or \"beide\" (both, default) |\n| `gericht` | string | Actual court within the jurisdiction (e.g., \"OGH\", \"OLG Wien\"); applies to gerichtsbarkeit=\"Justiz\" |\n| `rechtsgebiet` | string | Broad legal area: \"Zivilrecht\" or \"Strafrecht\" (Justiz) |\n| `fachgebiet` | string | OGH subject area (e.g., \"Arbeitsrecht\"); Justiz, needs dokumenttyp \"entscheidungstext\"/\"beide\" |\n| `entscheidungsart` | string | Decision type (e.g., \"Erkenntnis\", \"Beschluss\"); allowed values differ by jurisdiction |\n| `sammlungsnummer` | string | Collection number: VfSlg (Vfgh) or VwSlg (Vwgh) |\n| `norm` | string | Legal norm (e.g., \"1319a ABGB\") |\n| `geschaeftszahl` | string | Case number (e.g., \"5Ob234/20b\") |\n| `entscheidungsdatum_von` | string | Decision date from (YYYY-MM-DD) |\n| `entscheidungsdatum_bis` | string | Decision date to (YYYY-MM-DD) |\n| `sortierung` | string | Sort by decision date: \"datum_auf\" (oldest first) or \"datum_ab\" (newest first) |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n**Available `gerichtsbarkeit` values (16):**\n\n| Value | Court system |\n|-------|-------|\n| `Justiz` | Supreme Court (OGH), Higher Regional Courts (OLG), Regional Courts (LG) — default |\n| `Vfgh` | Constitutional Court |\n| `Vwgh` | Supreme Administrative Court |\n| `Bvwg` | Federal Administrative Court |\n| `Lvwg` | Provincial Administrative Courts |\n| `Dsk` | Data Protection Authority |\n| `AsylGH` | Asylum Court (historical, until 2013) |\n| `Normenliste` | Index of legal norms |\n| `Pvak` | Personnel Representation Supervisory Commission |\n| `Gbk` | Equal Treatment Commission |\n| `Dok` | Disciplinary Commission |\n| `Verg` | Federal Procurement Office (historical, dissolved 2014) |\n| `Uvs` | Independent Administrative Senates (historical, dissolved 2014) |\n| `Ubas` | Independent Federal Asylum Senate (historical, dissolved 2014) |\n| `Umse` | Environmental Senate (historical, dissolved 2014) |\n| `Bks` | Federal Communications Board (historical, dissolved 2014) |\n\n</details>\n\n<details>\n<summary><strong>ris_bundesgesetzblatt</strong> — Federal Law Gazette</summary>\n\nSearch the Federal Law Gazette (BGBl) — official publications of federal legislation.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `bgblnummer` | string | Gazette number (e.g., \"120\") |\n| `teil` | string | \"1\" (I = Acts), \"2\" (II = Regulations), \"3\" (III = Treaties) |\n| `jahrgang` | string | Year (e.g., \"2023\") |\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in titles |\n| `applikation` | string | \"BgblAuth\" (authentic from 2004, default), \"BgblPdf\" (PDF), \"BgblAlt\" (1945–2003) |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n</details>\n\n<details>\n<summary><strong>ris_landesgesetzblatt</strong> — State Law Gazette</summary>\n\nSearch State Law Gazettes (LGBl) — official publications of state legislation.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `lgblnummer` | string | Gazette number (e.g., \"50\") |\n| `jahrgang` | string | Year (e.g., \"2023\") |\n| `bundesland` | string | Province name |\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in titles |\n| `applikation` | string | \"LgblAuth\" (authentic, default), \"Lgbl\" (general), \"LgblNO\" (Niederoesterreich) |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n</details>\n\n<details>\n<summary><strong>ris_regierungsvorlagen</strong> — Government Bills</summary>\n\nSearch government bills — draft legislation submitted to parliament.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in titles |\n| `beschlussdatum_von` | string | Approval date from (YYYY-MM-DD) |\n| `beschlussdatum_bis` | string | Approval date to (YYYY-MM-DD) |\n| `einbringende_stelle` | string | Submitting ministry (e.g., BKA, BMF, BMJ, BMK) |\n| `im_ris_seit` | string | Added recently: EinerWoche, ZweiWochen, EinemMonat, DreiMonaten, SechsMonaten, EinemJahr |\n| `sortierung_richtung` | string | Ascending or Descending |\n| `sortierung_spalte` | string | Kurztitel, EinbringendeStelle, Beschlussdatum |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n</details>\n\n<details>\n<summary><strong>ris_dokument</strong> — Full Document Retrieval</summary>\n\nRetrieve the full text of a legal document by its ID or URL. Uses a dual strategy: direct URL access first, then search API fallback.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `dokumentnummer` | string | RIS document number (e.g., \"NOR40052761\") |\n| `url` | string | Direct URL to document content |\n| `response_format` | string | \"markdown\" (default) or \"json\" |\n\nAt least one of `dokumentnummer` or `url` is required. Long documents are truncated to 25,000 characters.\n\n**Supported document prefixes:**\n\n| Prefix | Type |\n|--------|------|\n| NOR | Federal norms |\n| LBG, LKT, LNO, LOO, LSB, LST, LTI, LVB, LWI | State laws (9 provinces) |\n| JWR, JWT | Supreme Administrative Court (VwGH) |\n| JFR, JFT | Constitutional Court (VfGH) |\n| JJR, JJT | Ordinary courts (Justiz) |\n| BVWG, LVWG | Federal / State Administrative Courts |\n| DSB, PDK, GBK, PVAB, DKT, NL, ASYLGH | Data protection, equal treatment, personnel, disciplinary, norm lists, asylum |\n| VERG, JUR, JUT, UBAS, UMSE, BKS | Historical jurisdictions (dissolved 2014) |\n| BGBLA, BGBL, BGBLPDF | Federal Law Gazette (authentic / 1945–2003 / PDF) |\n| REGV | Government bills |\n| BVB | District authorities |\n| VBL | Ordinance gazettes |\n| MRP, ERL, PRUEF, AVSV, SPG, KMGER | Cabinet protocols, decrees, trade exams, social insurance, health plans, court announcements |\n\n> The full routing registry lives in `DOCUMENT_ROUTES` (`src/client.ts`); unknown prefixes fall back to a Justiz search.\n\n</details>\n\n<details>\n<summary><strong>ris_bezirke</strong> — District Authority Announcements</summary>\n\nSearch announcements from district administrative authorities.\n\n> **Note:** Only available for: Niederoesterreich, Oberoesterreich, Tirol, Vorarlberg, Burgenland, Steiermark.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in titles |\n| `bundesland` | string | Province name |\n| `bezirksverwaltungsbehoerde` | string | District authority name |\n| `kundmachungsnummer` | string | Announcement number |\n| `kundmachungsdatum_von` | string | Date from (YYYY-MM-DD) |\n| `kundmachungsdatum_bis` | string | Date to (YYYY-MM-DD) |\n| `im_ris_seit` | string | Added recently: EinerWoche, ZweiWochen, EinemMonat, DreiMonaten, SechsMonaten, EinemJahr |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n</details>\n\n<details>\n<summary><strong>ris_gemeinden</strong> — Municipal Law</summary>\n\nSearch municipal law — local ordinances and regulations.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in titles |\n| `bundesland` | string | Province name |\n| `gemeinde` | string | Municipality name (e.g., \"Graz\") |\n| `applikation` | string | \"Gr\" (municipal law, default) or \"GrA\" (official gazettes) |\n| `im_ris_seit` | string | Added recently |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\nAdditional parameters depend on the selected application. See `Gr` (municipal law) and `GrA` (official gazettes) specific parameters in the source code.\n\n</details>\n\n<details>\n<summary><strong>ris_sonstige</strong> — Miscellaneous Collections</summary>\n\nSearch miscellaneous legal collections and specialized databases.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `applikation` | string | **Required.** Collection to search (see below) |\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in titles |\n| `datum_von` | string | Date from (YYYY-MM-DD) |\n| `datum_bis` | string | Date to (YYYY-MM-DD) |\n| `im_ris_seit` | string | Added recently |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n**Available collections:**\n\n| Value | Description |\n|-------|-------------|\n| `Mrp` | Cabinet protocols (Ministerratsprotokolle) |\n| `Erlaesse` | Ministerial decrees |\n| `Upts` | Party transparency reports |\n| `KmGer` | Court announcements |\n| `Avsv` | Social insurance regulations |\n| `Avn` | Veterinary notices |\n| `Spg` | Health structure plans |\n| `PruefGewO` | Trade licensing exams |\n\nEach collection has additional specific parameters. See the tool description for details.\n\n</details>\n\n<details>\n<summary><strong>ris_history</strong> — Document Change History</summary>\n\nTrack document creation, modification, and deletion across the RIS database.\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `applikation` | string | **Required.** Application type (36 options — see below) |\n| `aenderungen_von` | string | Changes from date (YYYY-MM-DD) |\n| `aenderungen_bis` | string | Changes to date (YYYY-MM-DD) |\n| `include_deleted` | boolean | Include deleted documents (default: false) |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n**Available applications (36):**\n\nFederal law: `Bundesnormen`, `BgblAuth`, `BgblAlt`, `BgblPdf`, `RegV`\nState law: `Landesnormen`, `LgblAuth`, `Lgbl`, `LgblNO`, `Vbl`, `Gemeinderecht`, `GemeinderechtAuth`\nCase law: `Justiz`, `Vfgh`, `Vwgh`, `Bvwg`, `Lvwg`, `Dsk`, `Gbk`, `Pvak`, `AsylGH`\nOther: `Bvb`, `Mrp`, `Erlaesse`, `PruefGewO`, `Avsv`, `Spg`, `KmGer`, `Dok`, `Normenliste`\nHistorical (jurisdictions dissolved on 2014-01-01, change history still tracked): `Verg`, `Upts`, `Uvs`, `Ubas`, `Umse`, `Bks`\n\n</details>\n\n<details>\n<summary><strong>ris_verordnungen</strong> — State Ordinance Gazettes</summary>\n\nSearch state ordinance gazettes (Verordnungsblätter).\n\n> **Note:** Currently only data from **Tirol** is available (since January 2022).\n\n**Inputs:**\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `suchworte` | string | Full-text search |\n| `titel` | string | Search in titles |\n| `bundesland` | string | Province name |\n| `kundmachungsnummer` | string | Announcement number |\n| `kundmachungsdatum_von` | string | Date from (YYYY-MM-DD) |\n| `kundmachungsdatum_bis` | string | Date to (YYYY-MM-DD) |\n| `seite` | number | Page number |\n| `limit` | number | Results per page: 10, 20, 50, 100 (default: 20). Prefer 20; a page over the structured-payload budget is delivered at the next smaller size (see [Result size](#result-size)) |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n</details>\n\n### Result size\n\nThe text block of every tool is capped at 25,000 characters. The search tools'\n`structuredContent` has its own budget of 60,000 characters (serialized); a\npage that would exceed it is delivered at the next smaller RIS page size\n(100 → 50 → 20 → 10) with `page`, `page_size`, `has_more` and the `query` echo\nrewritten to that size and a German `notice` in both the text and the payload.\nPage with `query.limit` and `query.seite` as echoed. Prefer `limit: 20`; 50\nsuits a broad survey; 100 is only ever delivered when the hits are small.\nSelf-hosters whose client accepts larger results can raise the budget with the\n`RIS_STRUCTURED_CONTENT_BUDGET` environment variable (a positive integer).\n\n## Development\n\n### Prerequisites\n\n- Node.js >= 20.19.0 (required by the Vite 7 widget build)\n\n### Setup\n\n```bash\ngit clone https://github.com/Honeyfield-Org/ris-mcp-ts.git\ncd ris-mcp-ts\npnpm install\npnpm run build\n```\n\n### Scripts\n\n| Script | Description |\n|--------|-------------|\n| `pnpm run dev` | Start with hot reload (tsx) |\n| `pnpm run build` | Compile TypeScript |\n| `pnpm start` | Run compiled version |\n| `pnpm test` | Run the server tests |\n| `pnpm run test:ui` | Run the widget tests (jsdom) |\n| `pnpm run gen:ui` | Build the widget bundle into `src/generated/` (runs automatically before dev/test/typecheck) |\n| `pnpm run check` | Typecheck + lint + format check + both test suites |\n| `pnpm run inspect` | Launch MCP Inspector for manual testing |\n\n### Project Structure\n\n```\nsrc/\n├── index.ts           # Entry point (stdio transport)\n├── server.ts          # MCP server setup, delegates to tools/\n├── client.ts          # HTTP client for RIS API\n├── types.ts           # Zod schemas + TypeScript types\n├── parser.ts          # JSON parsing and response normalization\n├── formatting.ts      # Output formatting (markdown/json)\n├── helpers.ts         # Shared helper functions\n├── constants.ts       # Static mappings and configuration\n├── widgets.ts         # MCP Apps widget resource + tool metadata\n├── tools/             # One file per tool handler\n│   ├── index.ts\n│   ├── bundesrecht.ts\n│   ├── landesrecht.ts\n│   ├── judikatur.ts\n│   └── ...\n└── __tests__/         # Unit and integration tests\n\nui/                    # Widget sources (browser code, built by Vite)\n├── trefferliste/      # The result-list widget\n└── shared/            # Host bridge, shared states and theme\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\n[MIT](LICENSE)\n\n---\n\nBuilt on the [Open Government Data API](https://data.bka.gv.at/ris/api/v2.6/) provided by the Austrian Federal Chancellery (Bundeskanzleramt).\n",
  "bytes": 26553,
  "sha": "29816ad5657f88c69d7780ade1c2f33cea546da69bd74befbd413c5eac8a4905",
  "repo_slug": "philrox/ris-mcp-ts",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_philrox_ris_f2f617a1/readme"
}