# io.github.cyanheads/ris-austria-mcp-server (remote · ris-austria.caseyjhand.com)

Search Austrian federal and state law, court decisions, and the authentic Bundesgesetzblatt (RIS).

- Trust score: 65/100 (medium)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `ris-austria.caseyjhand.com`: 65/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/ris-austria.md), [page](https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/ris-austria)
- npm · `@cyanheads/ris-austria-mcp-server`: 35/100, [markdown](https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/cyanheads-ris-austria-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/cyanheads-ris-austria-mcp-server)

## Channel facts

- Endpoint: `https://ris-austria.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.4.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 9 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 47/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 7674 tokens (~852/item across 9 items; 9 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http cyanheads-ris-austria-mcp-server https://ris-austria.caseyjhand.com/mcp
```

### Codex

```toml
[mcp_servers.cyanheads-ris-austria-mcp-server]
url = "https://ris-austria.caseyjhand.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-ris-austria-mcp-server": {
      "type": "remote",
      "url": "https://ris-austria.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-ris-austria-mcp-server --url https://ris-austria.caseyjhand.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-ris-austria-mcp-server:
    url: "https://ris-austria.caseyjhand.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "cyanheads-ris-austria-mcp-server": {
      "type": "http",
      "url": "https://ris-austria.caseyjhand.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 64, +9)

- [functional improvement] Schema quality: unverified → good

### 2026-07-31 (score 55, −7)

- [security] Tool “ris_get_document” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: excellent → unverified
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server
- [functional] Server version: 0.4.0 → 0.4.1
- [cosmetic] “ris_get_document” reworded the description of “sections”

### 2026-07-30 (score 62, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 62, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 61, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 60, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 60)

First indexed and scored.

## MCP tools (9)

### `ris_search_legislation` (~992 tokens)

Search Austrian Legislation

Search Austrian consolidated law and English translations: federal law (scope: federal, the default), one Bundesland (scope: burgenland … wien), municipal law (municipality plus a state scope — selected norms in 6 Bundesländer), or English translations of selected federal laws (language: english, federal only, ~138 documents). One document is one § / Artikel / Anlage; fetch a whole law by filtering law_id. Searches apply the version in force today in Austria by default — set in_force_as_of for another date, include_all_versions: true for full version history, or an entered_force / left_force window for new-law and repeal tracking; the three version filters are mutually exclusive, and the applied date is echoed back in the result. query is full text (boolean UND/ODER/NICHT or AND/OR/NOT, trailing-only * wildcard); title matches title, short title, and abbreviation ("DSG"). For a specific citation like "§ 6 DSG", ris_lookup_citation resolves it deterministically instead. Consolidated text is informational, not legally binding — the authentic gazette artifact lives in ris_search_gazette.

Input parameters:

- `changed_since` (string): Coarse recency filter — documents changed in RIS within the interval. For exact windows and deletions use ris_track_changes.
- `entered_force_from` (string): Provisions that entered force on/after this date (YYYY-MM-DD) — new-law tracking. Federal/state consolidated law only; mutually exclusive with in_force_as_of and include_all_versions.
- `entered_force_to` (string): Provisions that entered force on/before this date (YYYY-MM-DD).
- `in_force_as_of` (string): Return only the version in force on this date (YYYY-MM-DD). DEFAULTS TO TODAY in Austria — omitting it never searches all historical versions; opt into that with include_all_versions.
- `include_all_versions` (boolean): true searches every historical version (no in-force date filter) — version-history research. Overrides in_force_as_of; mutually exclusive with the force-window filters.
- `index` (string): Systematik classification filter (e.g. "10/10 Datenschutz"). Federal/state consolidated law only.
- `language` (string): german (default) searches the authoritative German corpus; english searches the ~138 unofficial English translations of selected federal laws (requires scope: federal; combines only with query and ti…
- `law_id` (string): Law-level grouping key (Gesetzesnummer, e.g. 10001597 = DSG) — exact match; returns every section of that law. Federal/state consolidated law only.
- `left_force_from` (string): Provisions that left force on/after this date (YYYY-MM-DD) — repeal tracking. Same exclusivity as entered_force_from.
- `left_force_to` (string): Provisions that left force on/before this date (YYYY-MM-DD).
- `municipality` (string): Municipality name for municipal law (e.g. "Graz" — RIS’s spelling, not "Stadt Graz"). Requires a state scope; combines only with query, title, and in_force_as_of. Coverage is selected norms in 6 Bund…
- `page` (integer): 1-based result page. Default 1.
- `page_size`: Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.
- `query` (string): Full-text search (Suchworte). Boolean operators UND/ODER/NICHT or AND/OR/NOT, parentheses, quoted phrases; wildcard * is trailing-only ("Datenschutz*", never "*schutz"). Syntax: ris_list_reference to…
- `scope` (string): Jurisdiction: federal (default) searches consolidated federal law; a Bundesland searches that state’s consolidated law (or, with municipality set, its municipal law).
- `section_from` (string): Start of a § / Artikel / Anlage number range, digits with optional letter ("6", "1a"). Federal/state consolidated law only.
- `section_to` (string): End of the section range. Equal to section_from for a single section.
- `section_type` (string): Which section kind the range addresses. Defaults to Paragraph when a section range is set. Values: ris_list_reference topic section_types.
- `sort_by` (string): Sort column: section (§/Artikel/Anlage label) or in_force_date. Default: upstream order. Federal/state consolidated law only.
- `sort_direction` (string): Sort direction; applies with sort_by.
- `title` (string): Title search (Titel) — matches title, short title, and official abbreviation ("ABGB", "DSG"). Phrase field: * allowed leading or trailing with ≥2 characters beside it.

Output parameters:

- `appliedInForceAsOf` (string): The in-force date the server actually applied (defaulted to today in Austria when omitted). Absent when include_all_versions, a force-window, or language: english searched without a date filter.
- `notice` (string): Zero-hit guidance — names the likely cause and the concrete next call.
- `page` (number): 1-based page number RIS served.
- `pageSize` (number): Page size RIS applied.
- `results` (array): Matching documents for the requested page. Totals and paging in enrichment.
- `totalCount` (number): Total matching documents across all pages.
- `truncated` (boolean): Present and true when more pages exist beyond this one — raise page to continue.

### `ris_search_case_law` (~1367 tokens)

Search Austrian Case Law

Search Austrian case law (Judikatur) in ONE court or tribunal per call — court is required: vfgh (Constitutional Court), vwgh (Supreme Administrative Court), justiz (ordinary courts incl. OGH, selected decisions), bvwg (federal administrative), lvwg (state administrative), dsk (data protection authority), normenliste (VwGH norm index), dok, pvak, gbk, verg, upts (party transparency), and the historical uvs, asylgh, ubas, umse, bks. Cross-court research is one call per court (calls are cheap); historical bodies are closed windows with successors — codes, windows, and Geschäftszahl examples: ris_list_reference topic courts. Filter by full-text query, cited norm ("DSG §1", "DSGVO Art32" — the highest-value filter), exact case_number (Geschäftszahl), decision date range, decision_type (headnote vs full text), decision_kind, or the court-conditional filters: issuing_body (dsk/dok/pvak/verg), court_name/legal_area/subject_area (justiz), state (lvwg/uvs), party (upts), commission/senate/discrimination_ground (gbk), subject_law (bks), collection_number (vfgh/vwgh/uvs). For a known Geschäftszahl or VfSlg/VwSlg cite, ris_lookup_citation resolves it directly.

Input parameters:

- `case_number` (string): Exact Geschäftszahl — returns that decision’s documents. Formats differ per court (examples: ris_list_reference topic courts). Not available for normenliste.
- `changed_since` (string): Coarse recency filter — decisions changed in RIS within the interval. For exact windows use ris_track_changes.
- `collection_number` (string): Official collection number (Sammlungsnummer). vfgh, vwgh, and uvs only, and the accepted form differs: vfgh and uvs store the bare number and match it dotted or undotted ("19632", "19.632"), while vw…
- `commission` (string): Equal-treatment commission (gbk only): federal (Bundes-Gleichbehandlungskommission) or general (Gleichbehandlungskommission).
- `court` (string, required): Which court/tribunal application to search — one per call. Codes, coverage windows, and successor mapping: ris_list_reference topic courts.
- `court_name` (string): Filter within the ordinary courts (justiz only) — "OGH", "OLG Wien", "LG Linz".
- `decided_from` (string): Earliest decision date (YYYY-MM-DD). Not available for normenliste.
- `decided_to` (string): Latest decision date (YYYY-MM-DD).
- `decision_kind` (string): Decision kind (Entscheidungsart) — per-court value sets, validated locally: ris_list_reference topic decision_kinds. No such parameter exists for normenliste, dok, pvak, umse, bks, or upts. For justi…
- `decision_type` (string): Search headnotes (Rechtssätze), full decision texts (Entscheidungstexte), or both (all, the default). Not available for gbk, upts, or normenliste.
- `discrimination_ground` (string): Discrimination ground (gbk only): Alter (age), EthnischeZugehoerigkeit (ethnic origin), Geschlecht (gender/sex), Mehrfachdiskriminierung (multiple grounds), Religion (religion), SexuelleOrientierung…
- `issuing_body` (string): Deciding body (EntscheidendeBehoerde) — dsk, dok, pvak, and verg only. dsk: Datenschutzbehoerde (2014+) or Datenschutzkommission (up to 2013). Full value lists: ris_list_reference topic issuing_bodie…
- `legal_area` (string): Legal area (Rechtsgebiet, justiz only): civil (Zivilrecht) or criminal (Strafrecht).
- `norm` (string): Cited-provision filter (Norm) — "DSG §1", "DSGVO Art32", "GewO 1994 §129", matching the format returned in norms_cited. The highest-value case-law filter.
- `page` (integer): 1-based result page. Default 1.
- `page_size`: Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.
- `party` (string): Political party the decision concerns (upts only). Documented values: ÖVP, SPÖ, FPÖ, KPÖ, BZÖ, Team Stronach — the filter is full-text, and further party names appear in live data (e.g. "Wandel").
- `query` (string): Full-text search over decisions (Suchworte). Boolean UND/ODER/NICHT or AND/OR/NOT, quoted phrases, trailing-only * wildcard.
- `senate` (string): Commission senate (gbk only).
- `sort_by` (string): Sort column. Default: upstream order. Not available for court: normenliste, which indexes laws rather than decisions.
- `sort_direction` (string): Sort direction; applies with sort_by.
- `state` (string): Which of the nine state administrative courts/senates to search (lvwg and uvs only).
- `subject_area` (string): Subject-area taxonomy filter (Fachgebiet, justiz only) — 39 exact German values like "Datenschutzrecht", validated locally: ris_list_reference topic justiz_subject_areas. The corpus carries no tagged…
- `subject_law` (string): Media statute the case concerns (Bereich, bks only) — e.g. "ORF-Gesetz", "Privatradiogesetz".

Output parameters:

- `notice` (string): Zero-hit guidance — names the likely cause and the concrete next call.
- `page` (number): 1-based page number RIS served.
- `pageSize` (number): Page size RIS applied.
- `results` (array): Matching documents for the requested page — decisions, or indexed laws under court normenliste. Totals and paging in enrichment.
- `totalCount` (number): Total matching documents across all pages.
- `truncated` (boolean): Present and true when more pages exist beyond this one — raise page to continue.

### `ris_search_gazette` (~1222 tokens)

Search Austrian Gazettes

Browse Austria’s promulgation record — the authentic, legally binding gazettes — at every level of government. scope picks the jurisdiction: federal (default; the Bundesgesetzblatt across three era tiers auto-routed by year — BgblAuth 2004+ authentic, BgblPdf 1945–2003, BgblAlt 1848–1940 metadata-only ÖNB scans; one call serves one tier, so a published_from/published_to interval crossing 2004-01-01 or 1945-01-01 is rejected with the boundaries to split at, and RIS carries no federal gazette for 1941–1944), one Bundesland (its Landesgesetzblatt), district (Bezirke promulgations), or municipal (Gemeinde promulgations). For a state scope, series selects law gazettes (law_gazette, the default → LGBl) vs ordinance gazettes (ordinance_gazette → Verordnungsblätter, currently Tirol only), and state_era picks which era of that series to search: current (the default → the authentic LGBl) or legacy (the state’s earlier non-authentic series — Niederösterreich’s systematic LgblNO, or the older Lgbl elsewhere; Wien carries neither, and ordinance gazettes have no legacy series). Filter by query (full text), title, number ("171/2026" — a pre-2004 number auto-routes to the right era tier), part (federal I/II/III or pre_1997), type (laws/regulations/announcements/other), published_from/to, issuer (federal or ordinance gazettes only), district_authority (district only), or municipality (municipal only). Every result carries a binding label (authentic vs historical_record vs consolidated_informational) and the amtssigniert authentic PDF wherever it exists — the binding artifact, never a paraphrase. For one known gazette number, ris_lookup_citation resolves it directly. Coverage windows, era tiers, and part semantics: ris_list_reference topic applications or gazette_parts.

Input parameters:

- `district_authority` (string): District only. Bezirksverwaltungsbehörde name, e.g. "Bezirkshauptmannschaft Liezen" — full list: ris_list_reference topic district_authorities.
- `issuer` (string): Issuing body — federal (EinbringendeStelle, e.g. "BMF") or ordinance gazettes (Vbl Einbringer: Landeshauptmann/frau, Landesregierung, Amt der Landesregierung, Sonstige Landesbehörden) only. Phrase fi…
- `municipality` (string): Municipal only. Exact municipality name (Gemeinde), RIS’s spelling.
- `number` (string): Gazette number, e.g. "171/2026" or "BGBl. II Nr. 171/2026" (federal), "61/2026" (state), a Kundmachungsnummer (district/municipal). A trailing year routes a federal query to the right era tier; a bar…
- `page` (integer): 1-based result page. Default 1.
- `page_size`: Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.
- `part` (string): Federal only. part1 (Gesetze) | part2 (Verordnungen) | part3 (Staatsverträge) — parts exist from 1997; pre_1997 searches the older partless BGBl (routes to the 1945–2003 tier). Semantics: ris_list_re…
- `published_from` (string): Earliest promulgation date (YYYY-MM-DD). A pre-2004 range routes a federal query to an earlier era tier. Federal: the interval must stay inside one tier — set published_to as well, since a one-sided…
- `published_to` (string): Latest promulgation date (YYYY-MM-DD). Federal: the interval must stay inside one era tier, so pair it with published_from — an interval crossing 2004-01-01 or 1945-01-01 is rejected with the boundar…
- `query` (string): Full-text search (Suchworte). Boolean operators UND/ODER/NICHT or AND/OR/NOT, parentheses, quoted phrases; wildcard * is trailing-only. Syntax: ris_list_reference topic search_syntax.
- `scope` (string): Jurisdiction level: federal (default — the Bundesgesetzblatt, era tier auto-routed), a Bundesland (burgenland … wien, its Landesgesetzblatt), district (Bezirke promulgations), or municipal (Gemeinde…
- `series` (string): State scopes only. law_gazette (default when omitted) searches the authentic Landesgesetzblatt; ordinance_gazette searches the Verordnungsblätter (Vbl — currently Tirol only, 2022+).
- `sort_by` (string): Sort column: published (Kundmachungsdatum) or number. Availability varies by tier; default: upstream order.
- `sort_direction` (string): Sort direction; applies with sort_by.
- `state_era` (string): State scopes only. current (default when omitted) searches the authentic Landesgesetzblatt; legacy searches the state’s earlier non-authentic series — Niederösterreich’s systematic LgblNO collection,…
- `title` (string): Title search (Titel) — phrase field: * allowed leading or trailing with ≥2 characters beside it.
- `type` (string): Document-type filter (Typ) for federal and state law gazettes: laws (Gesetze) | regulations (Verordnungen) | announcements (Kundmachungen) | other (Sonstiges).

Output parameters:

- `notice` (string): Zero-hit guidance — names the likely cause and the concrete next call.
- `page` (number): 1-based page number RIS served.
- `pageSize` (number): Page size RIS applied.
- `results` (array): Matching gazette entries for the requested page. Totals, paging, and the served application in enrichment.
- `servedApplication` (string): The RIS application that served the query — for federal, the single era tier auto-routed from the number’s year or the publication-date interval (BgblAuth 2004+, BgblPdf 1945–2003, BgblAlt 1848–1940)…
- `totalCount` (number): Total matching entries across all pages.
- `truncated` (boolean): Present and true when more pages exist beyond this one — raise page to continue.

### `ris_search_drafts` (~645 tokens)

Search Draft Legislation

Search Austria’s federal lawmaking pipeline BEFORE promulgation — the monitoring counterpart to ris_search_gazette (what will become law). stage selects the phase: review_drafts (Begutachtungsentwürfe — draft laws a ministry has put into public review, before any government bill exists) or government_bills (Regierungsvorlagen — bills the council of ministers adopted and submitted to parliament, 2004+). Filter by query (full text), title, ministry (accepts an abbreviation like "BMF" — expanded to RIS’s exact designation; the historical name at submission time counts), in_review_on (review_drafts only — drafts whose review window covers the date; today = "what is in Begutachtung right now"), or decided_from/to (government_bills only — council adoption date). changed_since gives coarse recency. Each record carries materials — the companion documents filed with the draft (Erläuterungen, Textgegenüberstellung, Vorblatt/WFA, covering letter, annexes); the Erläuterungen carry the drafting reasoning the bill text omits, and passing a materials[].url to ris_get_document as document_url is the only way to read one (format there picks the rendition returned). Documents are preparatory, not binding law. Ministry codes: ris_list_reference topic ministries.

Input parameters:

- `changed_since` (string): Coarse recency filter — documents changed in RIS within the interval. For exact windows use ris_track_changes.
- `decided_from` (string): government_bills only. Earliest council-of-ministers adoption date (YYYY-MM-DD).
- `decided_to` (string): government_bills only. Latest adoption date (YYYY-MM-DD).
- `in_review_on` (string): review_drafts only. Drafts whose public-review window covers this date (YYYY-MM-DD). Today = drafts currently in Begutachtung.
- `ministry` (string): Submitting ministry (EinbringendeStelle). Accepts an abbreviation ("BMF") — expanded to RIS’s exact-match designation; use the ministry’s name at the time of submission. Table: ris_list_reference top…
- `page` (integer): 1-based result page. Default 1.
- `page_size`: Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.
- `query` (string): Full-text search (Suchworte). Boolean operators UND/ODER/NICHT or AND/OR/NOT, parentheses, quoted phrases; wildcard * is trailing-only.
- `sort_by` (string): Sort column: date (review deadline or adoption date per stage), ministry, or title. Default: upstream order.
- `sort_direction` (string): Sort direction; applies with sort_by.
- `stage` (string, required): Which pipeline stage to search — one per call. review_drafts (Begut, ministerial review) or government_bills (RegV, council-adopted bills). Details: ris_list_reference topic stages.
- `title` (string): Title search (Titel) — phrase field: * allowed leading or trailing with ≥2 characters beside it.

Output parameters:

- `notice` (string): Zero-hit guidance — names the likely cause and the concrete next call.
- `page` (number): 1-based page number RIS served.
- `pageSize` (number): Page size RIS applied.
- `results` (array): Matching pipeline documents for the requested page. Totals and paging in enrichment.
- `totalCount` (number): Total matching documents across all pages.
- `truncated` (boolean): Present and true when more pages exist beyond this one — raise page to continue.

### `ris_search_announcements` (~1131 tokens)

Search Official Announcements

Search Austria’s sectoral official gazettes and executive documents — seven collections behind one collection enum: social_insurance (Amtliche Verlautbarungen der Sozialversicherung, authentic), veterinary (Amtliche Veterinärnachrichten, authentic), court_rules (Kundmachungen der Gerichte — rules of procedure and case-allocation plans, authentic; currently LVwG Tirol and Vorarlberg only), trade_exam_rules (Prüfungsordnungen gemäß Gewerbeordnung, authentic), health_structure_plans (Strukturpläne Gesundheit — federal ÖSG and per-state RSG, authentic), ministerial_decrees (Erlässe der Bundesministerien — decrees interpreting law; bind the administration, not citizens), and council_minutes (Ministerratsprotokolle — council-of-ministers session records). Each collection accepts a different filter set: query and title are broadly available; number, published_from/to, in_force_as_of, issuer (ministry abbreviations expanded), norm ("decrees citing the DSG"), case_number, type, department, plan_type/plan_state (health plans), and session_number/legislature (council minutes) apply where the collection supports them — a filter outside its set is rejected locally. Every result carries a binding label, the authentic PDF where it exists, and the RIS web view (document_url) — the only browsable surface for the PDF-only council minutes and for ministerial decrees. Per-collection parameter matrix and issuers: ris_list_reference topic collections or issuing_bodies.

Input parameters:

- `case_number` (string): Business reference number (Geschäftszahl) — veterinary and ministerial_decrees only.
- `changed_since` (string): Coarse recency filter — documents changed in RIS within the interval. For exact windows use ris_track_changes.
- `collection` (string, required): Which collection to search — one per call. social_insurance | veterinary | court_rules | trade_exam_rules | health_structure_plans | ministerial_decrees | council_minutes. Per-collection filter matri…
- `department` (string): Ministry department (Abteilung) — ministerial_decrees only.
- `entered_force_from` (string): Provisions that entered force on/after this date (YYYY-MM-DD) — ministerial_decrees only.
- `entered_force_to` (string): Provisions that entered force on/before this date (YYYY-MM-DD) — ministerial_decrees only.
- `in_force_as_of` (string): Version in force on this date (YYYY-MM-DD) — veterinary, court_rules, trade_exam_rules, health_structure_plans, ministerial_decrees (the consolidated-ish collections).
- `issuer` (string): Issuing body — social_insurance (Urheber, e.g. ÖGK/SVS/BVAEB/AUVA/PVA), ministerial_decrees (Bundesministerium — abbreviation expanded), council_minutes (Einbringer ministry). Values: ris_list_refere…
- `legislature` (string): Legislative period (Gesetzgebungsperiode, e.g. "XXVII") — council_minutes only.
- `norm` (string): Cited-provision filter (Norm) — "DSG §1", "DSGVO Art32" style. veterinary and ministerial_decrees only ("decrees citing the DSG").
- `number` (string): Serial number (Avsvnummer / Avnnummer / Spgnummer) — social_insurance, veterinary, health_structure_plans.
- `page` (integer): 1-based result page. Default 1.
- `page_size`: Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.
- `plan_state` (string): health_structure_plans only. Restrict to one Bundesland’s regional health-structure plan (RSG) — setting it switches the search from the federal ÖSG to that state’s RSG.
- `plan_type` (string): health_structure_plans only. Plan kind — all (default), expert_opinion (Gutachten), or regulation (Verordnungen). Searches the federal ÖSG unless plan_state is set.
- `published_from` (string): Earliest publication/session date (YYYY-MM-DD). All collections except ministerial_decrees (decrees date by force — use in_force_as_of / entered_force_from/to).
- `published_to` (string): Latest publication/session date (YYYY-MM-DD).
- `query` (string): Full-text search (Suchworte). Boolean operators UND/ODER/NICHT or AND/OR/NOT, parentheses, quoted phrases; wildcard * is trailing-only. Valid for all collections.
- `session_number` (string): Council session number (Sitzungsnummer) — council_minutes only.
- `sort_by` (string): Sort column: published or number, where the collection has the column. Default: upstream order.
- `sort_direction` (string): Sort direction; applies with sort_by.
- `title` (string): Title search (Titel) — phrase field. Valid for all collections except council_minutes.
- `type` (string): Document type (Typ) — trade_exam_rules (Befaehigungspruefungsordnung | Meisterpruefungsordnung), court_rules (Geschaeftsordnung | Geschaeftsverteilung), veterinary (Kundmachungen | Veroeffentlichunge…

Output parameters:

- `notice` (string): Zero-hit guidance — names the likely cause and the concrete next call.
- `page` (number): 1-based page number RIS served.
- `pageSize` (number): Page size RIS applied.
- `results` (array): Matching documents for the requested page. Totals and paging in enrichment.
- `totalCount` (number): Total matching documents across all pages.
- `truncated` (boolean): Present and true when more pages exist beyond this one — raise page to continue.

### `ris_lookup_citation` (~700 tokens)

Resolve Austrian Legal Citation

Resolve a single Austrian legal citation to its canonical RIS document deterministically — no keyword search. Four routes are auto-detected from the citation shape (or forced with kind): a norm citation — section-first ("§ 6 DSG", "Art 10 B-VG"), abbreviation-first ("DSG §1", "DSGVO Art32", the shape ris_search_case_law returns in norms_cited), or a bare abbreviation like "ABGB" — resolves through consolidated federal law, or a Bundesland with a state hint, as in force today or on in_force_as_of; a gazette citation ("BGBl. I Nr. 165/1999", pre-2004 "BGBl. Nr. 194/1961", imperial "RGBl. Nr. 189/1902", or "LGBl. Nr. 61/2026" with a state hint) routes to the right federal era tier by year, or to a state Landesgesetzblatt — falling back to that Bundesland’s pre-e-Recht series when the citation predates its switch; a case number ("Ro 2026/03/0016", "G 287/2022", "14Os49/26a", "2025-0.934.677", "W256 …") is matched to its court — pass court to skip detection, and ambiguous formats probe up to two courts; a collection number ("VfSlg 19.632/2012", "VwSlg 18.000 A/2010") resolves through the VfGH/VwGH collection — a VwSlg cite given without its part letter can name one decision in each of the two VwGH series, and comes back as ambiguous with both cites named rather than resolved to one of them. Returns the single best-matching document in the same shape as the corresponding search tool, with alternatives_count when more than one matched. A citation that cannot be classified or resolved returns found: false with next-step guidance — it never throws for a miss; only an upstream RIS outage is an error. For keyword rather than citation lookup, use ris_search_legislation or ris_search_case_law.

Input parameters:

- `citation` (string, required): The legal citation to resolve, e.g. "§ 6 DSG" or "DSG §1", "Art 10 B-VG", "BGBl. I Nr. 165/1999", "Ro 2026/03/0016", or "VfSlg 19.632/2012".
- `court` (string): Court hint for a case number — short-circuits court detection to this court. Codes: ris_list_reference topic courts, minus normenliste (a norm index, which carries no case numbers).
- `in_force_as_of` (string): For a norm, resolve the version in force on this date (YYYY-MM-DD). Defaults to today in Austria.
- `kind` (string): Force a route, or auto (default) to classify by shape. Set explicitly when the citation shape is ambiguous.
- `state` (string): Bundesland hint — routes a norm to that state’s consolidated law (LrKons) and an LGBl. gazette to that state’s Landesgesetzblatt (LgblAuth, then the legacy Lgbl series for a citation predating the st…

Output parameters:

- `alternatives_count` (number): Documents that also matched beyond the one returned — present only when more than one matched. List them all with the search tool named in resolution_note.
- `found` (boolean): True when the citation resolved to a single best-matching document.
- `guidance` (string): Next-step guidance naming a concrete tool. Present when found is false.
- `kind` (string): What the citation parsed as — "unknown" when it did not classify into any route.
- `record` (object): The resolved document, in the same normalized shape the corresponding search tool returns — ris_search_legislation for a norm, ris_search_case_law for a case or collection number, ris_search_gazette…
- `resolution_note` (string): Which application and filter resolved the citation. Present when found is true.

### `ris_get_document` (~1000 tokens)

Get RIS Document

Fetch one RIS document’s full text or its rendition URLs, with explicit binding status and the amtssigniert authentic PDF surfaced wherever it exists. Address the document exactly one of two ways: document_number plus application (both copied verbatim from a ris_search_* or ris_lookup_citation result), or a document_url from a result’s content_urls — or, for a draft’s companion documents (Erläuterungen, Textgegenüberstellung, WFA, cover letter, annexes), a ris_search_drafts record’s materials[].url, which is the only route to them. format: markdown (default — the HTML rendition converted to markdown), html (raw HTML rendition), xml (the RIS Nutzdaten XML), or urls_only (no fetch — every rendition URL, including the Authentisch PDF). Format availability varies by application and the tool degrades explicitly, never silently: consolidated law, gazettes, case law, drafts, and most sectoral collections carry full text; district and municipal promulgations and court rules (Bvb, GrA, KmGer) publish only the signed authentic PDF; party-transparency decisions and council minutes (Upts, Mrp) are PDF-only; the 1848–1940 imperial gazettes (BgblAlt) are metadata-only — for these a text-format request returns a format_unavailable notice with the usable URL, not an error. Every result carries binding_status; only authentic (amtssigniert) publications are legally binding. This tool returns content, not fresh metadata — the metadata rides the search/lookup step that produced the document number. When the markdown text overflows the 40,000-byte budget the tool returns an outline (kind: outline) instead of truncating: the document’s §/Artikel/Anlage sections where it carries at least two such headings, otherwise contiguous byte windows named Part 1 of N … Part N of N covering the whole text and listed in document order. Re-call with sections:[…] naming outline entries to retrieve just those; a name matching no entry returns the outline again with a notice rather than the whole docume…

Input parameters:

- `application` (string): RIS application the document belongs to (e.g. BrKons, Dsk, BgblAuth) — copy verbatim from the same result. Required with document_number. Codes and coverage: ris_list_reference topic applications.
- `document_number` (string): Technical RIS document number (Technisch.ID), e.g. NOR40262691, JJT_…, BGBLA_2026_II_171 — copy verbatim from a ris_search_* or ris_lookup_citation result. Requires application; mutually exclusive wi…
- `document_url` (string): A https://www.ris.bka.gv.at/Dokumente/… rendition URL as returned in a result’s content_urls — the alternative to document_number + application. Also the only way to read a draft’s companion document…
- `format` (string): markdown (default — the HTML rendition converted to markdown), html (raw HTML rendition), xml (RIS Nutzdaten schema), or urls_only (no fetch — all rendition URLs incl. the authentic PDF).
- `sections` (array): Entry names to retrieve, each copied verbatim from a prior outline response (kind: outline) — §/Artikel/Anlage section names, or window names of the form "Part 2 of 6". Omit for the full document, wh…

Output parameters:

- `application` (string): RIS application the document belongs to (echoed).
- `authentic_pdf_url` (string): The amtssigniert authentic PDF (.pdfsig, Authentisch DataType) — the legally binding artifact — where the application publishes one.
- `binding_status` (string): Legal binding status: authentic (amtssigniert, legally binding), consolidated_informational (consolidated view — not binding), historical_record (superseded/pre-e-Recht promulgation), decision (court…
- `byte_size` (number): Full UTF-8 byte size of the document text. Present when text was fetched — for an overflowed document (kind: outline) this reports the full text’s size, not the outline payload’s.
- `content_urls` (object): Constructed rendition URLs. Empty for authentic-PDF-only (Bvb/GrA/KmGer) and metadata-only (BgblAlt) applications — see authentic_pdf_url and the notice. For a companion document (a draft’s Erläuteru…
- `document_number` (string): Technical RIS document number (echoed).
- `format` (string): The format served — echoes the requested format.
- `kind` (string): full — the complete response (document text, selected entries, or rendition URLs). outline — sections lists the retrievable entries instead of the text, either because the document overflowed the byt…
- `notice` (string): Present when the requested text format is unavailable for this application (names why and the usable URL), when the document overflowed to a section outline (names how to retrieve sections), or when…
- `sections` (array): Present when kind = outline: the document’s addressable entries, each with its UTF-8 byte size — §/Artikel/Anlage sections listed largest first, or, when the markdown carries no such headings, Part n…
- `text` (string): The document text in the requested format. Absent for urls_only and when the application carries no text rendition (see the notice).
- `truncated` (boolean): Present and true when the full text isn’t inline because an outline was returned instead (kind: outline) — either the document overflowed the byte budget, or a sections:[…] selector matched nothing.…

### `ris_track_changes` (~374 tokens)

Track RIS Changes

Track every document added or changed in one RIS application within an exact date window (changed_from/changed_to), optionally including deletions (include_deleted) — the delta-sync and monitoring primitive for mirrors and watchers, and the only surface that reports removals. Unlike the search tools’ coarse, additive-only changed_since intervals, this is exact-dated and deletion-aware. application takes any RIS application code (e.g. BrKons, Dsk, BgblAuth); the four applications with a different History-feed name are mapped automatically. Each changed document comes back in a compact cross-class record — document_number (for ris_get_document), title, dates, binding_status, and rendition URLs — plus its last-changed date; removed documents come back as deleted records with a deletion timestamp. One application per call; page explicitly for large windows. Application codes and coverage: ris_list_reference topic applications.

Input parameters:

- `application` (string, required): RIS application whose change feed to read (standard code, e.g. BrKons, LrKons, Dsk, BgblAuth). History’s four aliased names are mapped internally. Codes: ris_list_reference topic applications.
- `changed_from` (string): Include documents changed on/after this date (YYYY-MM-DD, AenderungenVon). Exact date, not a coarse interval.
- `changed_to` (string): Include documents changed on/before this date (YYYY-MM-DD, AenderungenBis).
- `include_deleted` (boolean): true also returns documents removed from RIS in the window, as deleted records — the only way to observe deletions.
- `page` (integer): 1-based result page. Default 1.
- `page_size`: Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.

Output parameters:

- `application` (string): The application whose change feed was read.
- `changedFrom` (string): The changed_from bound the server applied (echo), when set.
- `changedTo` (string): The changed_to bound the server applied (echo), when set.
- `notice` (string): Zero-hit guidance — names the likely cause and the concrete next call.
- `page` (number): 1-based page number RIS served.
- `pageSize` (number): Page size RIS applied.
- `results` (array): Change-feed entries for the requested page. Totals, paging, and the applied window in enrichment.
- `totalCount` (number): Total change-feed entries across all pages.
- `truncated` (boolean): Present and true when more pages exist beyond this one — raise page to continue.

### `ris_list_reference` (~243 tokens)

RIS Reference Lists

Ground the opaque German codes across the RIS surface — static and offline, no upstream call. Topics: applications (all 39, with coverage windows, binding status, and content formats), courts (17 codes with Geschäftszahl examples and successor mapping), states (the three Bundesland request spellings), decision_types, decision_kinds (per-court Entscheidungsart values), issuing_bodies (dsk/dok/pvak/verg bodies and social-insurance issuers), ministries (abbreviations and full designations, historical included), collections (the 7 announcement collections and their parameter matrix), stages (lawmaking pipeline), changed_since_intervals, section_types, gazette_parts (BGBl parts and era tiers), law_types, district_authorities (all Bezirksverwaltungsbehörden), justiz_subject_areas (Fachgebiet taxonomy), search_syntax (operators and wildcard rules), and citation_formats (the shapes ris_lookup_citation parses). Recovery hints from the other ris_* tools route here.

Input parameters:

- `topic` (string, required): Which reference table to return. Pick the topic named in the error recovery hint or zero-hit notice that sent you here.

Output parameters:

- `entries` (array): Reference entries for the topic.
- `notes` (array): Topic-level caveats and usage guidance. Empty when none apply.
- `summary` (string): What this topic covers and which tool parameters consume its values.
- `topic` (string): The requested topic, echoed back.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/ris-austria#diagnostics

## Score history

- 2026-08-03: 65
- 2026-08-02: 64
- 2026-08-01: 64
- 2026-07-31: 55
- 2026-07-30: 62
- 2026-07-29: 62
- 2026-07-28: 61
- 2026-07-27: 60
- 2026-07-26: 60

## Links

- Remote endpoint: https://ris-austria.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/ris-austria-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/ris-austria/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/ris-austria/changelog.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-ris-austria-mcp-server/ris-austria
