{"id":44206914,"url":"https://github.com/philrox/ris-mcp-ts","last_synced_at":"2026-03-07T00:04:40.381Z","repository":{"id":337507049,"uuid":"1149189472","full_name":"philrox/ris-mcp-ts","owner":"philrox","description":"MCP Server for the Austrian Legal Information System (RIS) - Access Austrian federal laws, state laws, court decisions and more","archived":false,"fork":false,"pushed_at":"2026-03-04T16:40:22.000Z","size":840,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-04T21:16:03.436Z","etag":null,"topics":["austria","claude","law","legal","mcp","model-context-protocol","ris","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/philrox.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-03T20:31:04.000Z","updated_at":"2026-03-04T16:44:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/philrox/ris-mcp-ts","commit_stats":null,"previous_names":["philrox/ris-mcp-ts"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/philrox/ris-mcp-ts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philrox%2Fris-mcp-ts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philrox%2Fris-mcp-ts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philrox%2Fris-mcp-ts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philrox%2Fris-mcp-ts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/philrox","download_url":"https://codeload.github.com/philrox/ris-mcp-ts/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philrox%2Fris-mcp-ts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30204114,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["austria","claude","law","legal","mcp","model-context-protocol","ris","typescript"],"created_at":"2026-02-09T23:10:44.887Z","updated_at":"2026-03-07T00:04:40.369Z","avatar_url":"https://github.com/philrox.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RIS MCP Server\n\n[![CI](https://github.com/philrox/ris-mcp-ts/actions/workflows/ci.yml/badge.svg)](https://github.com/philrox/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.0.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\u003e \"What does Austrian law say about tenancy rights?\"\n\n\u003e \"Find Constitutional Court decisions on freedom of expression.\"\n\n\u003e \"Show me §1295 of the ABGB (Austrian Civil Code).\"\n\n\u003e \"What laws about climate protection were published in 2024?\"\n\n\u003e \"Look up the building code for the province of Salzburg.\"\n\n\u003e \"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 11 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 30 application types\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 \u003e Developer \u003e 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\u003e **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\u003e\n\u003e **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 (11 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 (30 app types) |\n| `ris_verordnungen` | Search state ordinance gazettes |\n\n## Tool Reference\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_bundesrecht\u003c/strong\u003e — Federal Laws\u003c/summary\u003e\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) |\n| `applikation` | string | \"BrKons\" (consolidated, default), \"Begut\" (draft reviews), \"Erv\" (English version) |\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) |\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\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_landesrecht\u003c/strong\u003e — State/Provincial Laws\u003c/summary\u003e\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| `applikation` | string | \"LrKons\" (consolidated, default) |\n| `seite` | number | Page number |\n| `limit` | number | Results per page |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_judikatur\u003c/strong\u003e — Court Decisions\u003c/summary\u003e\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| `gericht` | string | Court type (see below) |\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| `seite` | number | Page number |\n| `limit` | number | Results per page |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n**Available courts:**\n\n| Value | Court |\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) |\n| `Normenliste` | Index of legal norms |\n| `Pvak` | Personnel Representation Supervisory Commission |\n| `Gbk` | Equal Treatment Commission |\n| `Dok` | Disciplinary Commission |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_bundesgesetzblatt\u003c/strong\u003e — Federal Law Gazette\u003c/summary\u003e\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 |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_landesgesetzblatt\u003c/strong\u003e — State Law Gazette\u003c/summary\u003e\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 |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_regierungsvorlagen\u003c/strong\u003e — Government Bills\u003c/summary\u003e\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 |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_dokument\u003c/strong\u003e — Full Document Retrieval\u003c/summary\u003e\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, JFR, JWT, BVWG, LVWG, DSB, GBK, PVAK, ASYLGH | Court decisions |\n| BGBLA, BGBL | Federal Law Gazette |\n| REGV | Government bills |\n| BVB | District authorities |\n| VBL | Ordinance gazettes |\n| MRP, ERL | Cabinet protocols, ministerial decrees |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_bezirke\u003c/strong\u003e — District Authority Announcements\u003c/summary\u003e\n\nSearch announcements from district administrative authorities.\n\n\u003e **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 |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_gemeinden\u003c/strong\u003e — Municipal Law\u003c/summary\u003e\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 |\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\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_sonstige\u003c/strong\u003e — Miscellaneous Collections\u003c/summary\u003e\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 |\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\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_history\u003c/strong\u003e — Document Change History\u003c/summary\u003e\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 (30 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 |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n**Available applications (30):**\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`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eris_verordnungen\u003c/strong\u003e — State Ordinance Gazettes\u003c/summary\u003e\n\nSearch state ordinance gazettes (Verordnungsblätter).\n\n\u003e **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 |\n| `response_format` | string | \"markdown\" or \"json\" |\n\n\u003c/details\u003e\n\n## Development\n\n### Prerequisites\n\n- Node.js \u003e= 20.0.0\n\n### Setup\n\n```bash\ngit clone https://github.com/philrox/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 all tests |\n| `pnpm run check` | Typecheck + lint + format check + tests |\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├── 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```\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","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilrox%2Fris-mcp-ts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphilrox%2Fris-mcp-ts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilrox%2Fris-mcp-ts/lists"}