Skip to main content
Glama

Search Austrian Legislation

ris_search_legislation
Read-onlyIdempotent

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 Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo1-based result page. Default 1.
indexNoSystematik classification filter (e.g. "10/10 Datenschutz"). Federal/state consolidated law only. Omit to leave unfiltered; a blank value is rejected.
queryNoFull-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 topic search_syntax. Omit to leave unfiltered; a blank value is rejected.
scopeNoJurisdiction: federal (default) searches consolidated federal law; a Bundesland searches that state’s consolidated law (or, with municipality set, its municipal law).federal
titleNoTitle search (Titel) — matches title, short title, and official abbreviation ("ABGB", "DSG"). Phrase field: * allowed leading or trailing with ≥2 characters beside it. Omit to leave unfiltered; a blank value is rejected.
law_idNoLaw-level grouping key (Gesetzesnummer, e.g. 10001597 = DSG) — exact match; returns every section of that law. Federal/state consolidated law only. Omit to leave unfiltered; a blank value is rejected.
sort_byNoSort column: section (§/Artikel/Anlage label) or in_force_date. Default: upstream order. Federal/state consolidated law only.
languageNogerman (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 title).german
page_sizeNoDocuments per page: 10 or 20 (default 20). For more results, keep the size and raise page.
section_toNoEnd of the section range. Equal to section_from for a single section. Omit to leave unfiltered; a blank value is rejected.
municipalityNoMunicipality 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 Bundesländer (no Burgenland/Tirol/Vorarlberg). Omit to search consolidated law; a blank value is rejected.
section_fromNoStart of a § / Artikel / Anlage number range, digits with optional letter ("6", "1a"). Federal/state consolidated law only. Omit to leave unfiltered; a blank value is rejected.
section_typeNoWhich section kind the range addresses. Defaults to Paragraph when a section range is set. Values: ris_list_reference topic section_types.
changed_sinceNoCoarse recency filter — documents changed in RIS within the interval. For exact windows and deletions use ris_track_changes.
left_force_toNoProvisions that left force on/before this date (YYYY-MM-DD).
in_force_as_ofNoReturn 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.
sort_directionNoSort direction; applies with sort_by.
left_force_fromNoProvisions that left force on/after this date (YYYY-MM-DD) — repeal tracking. Same exclusivity as entered_force_from.
entered_force_toNoProvisions that entered force on/before this date (YYYY-MM-DD).
entered_force_fromNoProvisions 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.
include_all_versionsNotrue searches every historical version (no in-force date filter) — version-history research. Overrides in_force_as_of; mutually exclusive with the force-window filters.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number RIS served.
errorNoPresent when the call failed. Absent on success.
noticeNoZero-hit guidance — names the likely cause and the concrete next call.
resultsNoMatching documents for the requested page. Totals and paging in enrichment.
pageSizeNoPage size RIS applied.
truncatedNoPresent and true when more pages exist beyond this one — raise page to continue.
totalCountNoTotal matching documents across all pages.
appliedInForceAsOfNoThe 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed18 schema fields changed
    • changedInput schema / properties / index / description
      Previous value: -"Systematik classification filter (e.g. \"10/10 Datenschutz\"). Federal/state consolidated law only."New value: +"Systematik classification filter (e.g. \"10/10 Datenschutz\"). Federal/state consolidated law only. Omit to leave unfiltered; a blank value is rejected."
    • addedInput schema / properties / index / pattern
      Added value: +"\\S"
    • changedInput schema / properties / law_id / description
      Previous value: -"Law-level grouping key (Gesetzesnummer, e.g. 10001597 = DSG) — exact match; returns every section of that law. Federal/state consolidated law only."New value: +"Law-level grouping key (Gesetzesnummer, e.g. 10001597 = DSG) — exact match; returns every section of that law. Federal/state consolidated law only. Omit to leave unfiltered; a blank value is rejected."
    • addedInput schema / properties / law_id / pattern
      Added value: +"\\S"
    • changedInput schema / properties / municipality / description
      Previous value: -"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 Bundesländer (no Burgenland/Tirol/Vorarlberg)."New value: +"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 Bundesländer (no Burgenland/Tirol/Vorarlberg). Omit to search consolidated law; a blank value is rejected."
    • addedInput schema / properties / municipality / pattern
      Added value: +"\\S"
    • removedInput schema / properties / page_size / anyOf
      Removed value: -[
      -  {
      -    "const": 10,
      -    "type": "number"
      -  },
      -  {
      -    "const": 20,
      -    "type": "number"
      -  },
      -  {
      -    "const": 50,
      -    "type": "number"
      -  },
      -  {
      -    "const": 100,
      -    "type": "number"
      -  }
      -]
    • changedInput schema / properties / page_size / description
      Previous value: -"Documents per page — RIS accepts 10, 20, 50, or 100. Default 20."New value: +"Documents per page: 10 or 20 (default 20). For more results, keep the size and raise page."
    • addedInput schema / properties / page_size / enum
      Added value: +[
      +  10,
      +  20
      +]
    • addedInput schema / properties / page_size / type
      Added value: +"number"
    • changedInput schema / properties / query / description
      Previous value: -"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 topic search_syntax."New value: +"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 topic search_syntax. Omit to leave unfiltered; a blank value is rejected."
    • addedInput schema / properties / query / pattern
      Added value: +"\\S"
    • changedInput schema / properties / section_from / description
      Previous value: -"Start of a § / Artikel / Anlage number range, digits with optional letter (\"6\", \"1a\"). Federal/state consolidated law only."New value: +"Start of a § / Artikel / Anlage number range, digits with optional letter (\"6\", \"1a\"). Federal/state consolidated law only. Omit to leave unfiltered; a blank value is rejected."
    • addedInput schema / properties / section_from / pattern
      Added value: +"\\S"
    • changedInput schema / properties / section_to / description
      Previous value: -"End of the section range. Equal to section_from for a single section."New value: +"End of the section range. Equal to section_from for a single section. Omit to leave unfiltered; a blank value is rejected."
    • addedInput schema / properties / section_to / pattern
      Added value: +"\\S"
    • changedInput schema / properties / title / description
      Previous value: -"Title search (Titel) — matches title, short title, and official abbreviation (\"ABGB\", \"DSG\"). Phrase field: * allowed leading or trailing with ≥2 characters beside it."New value: +"Title search (Titel) — matches title, short title, and official abbreviation (\"ABGB\", \"DSG\"). Phrase field: * allowed leading or trailing with ≥2 characters beside it. Omit to leave unfiltered; a blank value is rejected."
    • addedInput schema / properties / title / pattern
      Added value: +"\\S"
  2. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "results",
      +      "totalCount",
      +      "page",
      +      "pageSize"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `scope_filter_mismatch`: A filter was combined with a scope, municipality, or language that does not support it, or mutually exclusive version filters were combined — rejected locally before any upstream call; the message names the offending pair. `invalid_query`: A page past the last page of results, or RIS rejecting a parameter value in-band — the Client error message is passed through verbatim, in German. It names the invalid element and its valid values, except for a page past the end, which names no parameter at all. Unsupported filter combinations are caught earlier as scope_filter_mismatch. `upstream_error`: RIS is unreachable, returned a server error, or served an HTML error page. `upstream_timeout`: RIS did not answer the search within the request deadline. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "scope_filter_mismatch",
      +            "invalid_query",
      +            "upstream_error",
      +            "upstream_timeout"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "results",
      -  "totalCount",
      -  "page",
      -  "pageSize"
      -]
  3. Changed5 schema fields changed
    • changedInput schema / properties / entered_force_from / pattern
      Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
    • changedInput schema / properties / entered_force_to / pattern
      Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
    • changedInput schema / properties / in_force_as_of / pattern
      Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
    • changedInput schema / properties / left_force_from / pattern
      Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
    • changedInput schema / properties / left_force_to / pattern
      Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
  4. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / translation
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Provenance of an unofficial English translation. Present only on Erv records (language: english), which carry no in_force_from, promulgation, or eli of their own — this is the only statement of which German version the text corresponds to, and how old it is.",
      +  "properties": {
      +    "author": {
      +      "description": "Body that produced the translation, e.g. \"Federal Chancellery\".",
      +      "type": "string"
      +    },
      +    "source": {
      +      "description": "Which German version this translation renders, as RIS states it — the originating gazette, the last amendment applied, and the date of the version, one per line.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  5. First observed

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, but the description adds substantial behavioral context beyond them: it notes the applied date is echoed back in results, explains that consolidated text is informational and not legally binding (pointing to the gazette for authoritative text), clarifies that in_force_as_of defaults to today, and details how include_all_versions overrides it. This goes well beyond the annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense; every sentence contributes value. It is front-loaded with the core purpose, then systematically covers scopes, version filters, query syntax, and alternatives. For a tool with 21 parameters, the length is justified and well-organized, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete. It covers all major scopes, version filtering modes, query syntax, parameter combinations, and points to sibling tools for alternative needs. The output schema exists, so return-value details are not required. An agent can correctly select and invoke this tool with the information provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds significant meaning beyond the schema: it explains mutual exclusivity between in_force_as_of, include_all_versions, and force-window filters, clarifies combination constraints (e.g., language english only with query/title and scope federal), describes how law_id groups sections, and notes that section_type defaults to Paragraph. These semantics are not in the schema and are critical for correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: searching Austrian consolidated law across federal, state, and municipal levels, plus English translations. It distinguishes itself from siblings by explicitly naming alternatives like ris_lookup_citation for citations, ris_search_gazette for authentic gazette artifacts, and ris_track_changes for change tracking, making its unique role obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: for specific citations use ris_lookup_citation, for authentic gazette use ris_search_gazette, for change tracking use ris_track_changes. It also details filter combination rules, mutual exclusivity of version filters, and scope constraints (e.g., municipality requires a state scope, English requires federal). This is comprehensive and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.