at-eli-mcp
This server provides read-only access to Austria's official legal information system (RIS), enabling search and retrieval of Austrian federal legislation and case law. No API key required — RIS is Open Government Data.
at_search— Search Austrian federal legislation (Bundesrecht) by free text or title, with configurable page size (10/20/50/100) and pagination. Returns ELI URIs, human-readable citations, and content URLs.at_get_text— Fetch the full text (HTML or XML) of a federal act using a content URL from a search result.at_case_search— Search Austrian case law (Judikatur) by free text, with optional filtering by court (e.g.,Justiz,Vfgh,Vwgh,Bvwg,Lvwg,Dsk,Gbk,Pvak,Pdok). Returns native ECLI identifiers, citations, and content URLs.at_get_case_text— Fetch the full text (HTML or XML) of a court decision using a content URL from a case search result.at_list_collections— List available RIS collections/applications and their exposure status.
Every response includes an eli_uri (for legislation) or ecli (for decisions), a human_readable_citation, and a source_url. Note: only Austrian federal law (Bundesrecht) is supported; state law (Landesrecht) is not yet available.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@at-eli-mcpsearch for the current version of the Datenschutzgesetz"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
at-eli-mcp
Install (one command)
Published on PyPI + MCP Registry (io.github.matematicsolutions/at-eli-mcp). Run without cloning:
uvx at-eli-mcpConfigure your MCP client (stdio):
{ "mcpServers": { "at-eli-mcp": { "command": "uvx", "args": ["at-eli-mcp"] } } }Windows 11 with Smart App Control
Smart App Control blocks unsigned executables, which covers uvx.exe, pip.exe
and the at-eli-mcp.exe launcher that pip writes at install time. The python.exe and
py.exe from the python.org installer are signed by the Python Software
Foundation, so running the module through the interpreter works:
python -m pip install at-eli-mcp
python -m at_eli_mcppip.exe is blocked for the same reason, so install with python -m pip, not
pip install. If python is not on PATH, use the Windows launcher: py -3 -m at_eli_mcp.
{ "mcpServers": { "at-eli-mcp": { "command": "python", "args": ["-m", "at_eli_mcp"] } } }Do not turn Smart App Control off to work around this - it cannot be re-enabled without reinstalling Windows.
Building from source: see Install.
An MCP server for RIS (data.bka.gv.at), Austria's official legal information system
(Rechtsinformationssystem des Bundes, operated by the Bundeskanzleramt). It searches and
retrieves Austrian federal legislation (Bundesrecht) and case law (Judikatur) with verifiable ELI
identifiers, native ECLI for decisions, and Austrian citations.
Part of the MateMatic eu-legal-mcp production line - the Austrian member, after the Polish
sejm-eli-mcp and the German de-eli-mcp. Same architecture and citation contract, RIS source.
Scope. Covers Austrian federal law (Bundesrecht) and case law (Judikatur, with a native ECLI). State law (Landesrecht) is a later feature. Every response carries a
dataset_note.Licence. Austrian Bundesgesetzblatt content and statutes are official works in the public domain; RIS is published as Open Government Data (keyless). This connector relays that public content with attribution and a
source_url.
Related MCP server: de-eli-mcp
The tools
Tool | What it does |
| Search federal law ( |
| Fetch an act's full text ( |
| Search case law ( |
| Fetch a decision's full text from a case hit's content URL. |
| List the RIS collections and which are exposed. |
| Declare what this connector covers, when each family was captured, and - explicitly - what it does NOT cover. Every gap carries a fallback. |
Every response carries the contract: eli_uri (a full ELI URL, e.g.
https://www.ris.bka.gv.at/eli/bgbl/I/2026/6/20260218), human_readable_citation
(e.g. Datenschutzgesetz, BGBl. I Nr. 165/1999), and source_url.
Install
cd at-eli-mcp
pip install -e .Configure (Claude Code / any MCP client)
{
"mcpServers": {
"at-eli-mcp": { "command": "at-eli-mcp" }
}
}Environment:
AT_ELI_BASE_URL- defaulthttps://data.bka.gv.at/ris/api/v2.6AT_ELI_CACHE_DIR- default~/.matematic/cache/at-eliAT_ELI_AUDIT_DIR- default~/.matematic/audit
No API key. RIS is keyless Open Government Data.
Governance
Public data only - read-only against RIS; no client data leaves the machine beyond search parameters.
Audit log - every tool call appends one JSON line to
~/.matematic/audit/at-eli-mcp.jsonl.Vendor-neutral - talks only to
data.bka.gv.atand (for full text)ris.bka.gv.at; no LLM provider, no telemetry.Host-restricted text - full text is fetched only from
ris.bka.gv.at.
See CONSTITUTION.md and DISCOVERY.md.
Tests
pip install -e ".[dev]"
pytest tests/test_instructions_drift.py -v # offline
pytest tests/test_smoke.py -v # hits live RISLicence
Apache-2.0. © Matematic Solutions / Wieslaw Mazur.
Available Tools
6 toolsat_case_searchARead-onlyIdempotent
Search Austrian case law (RIS Judikatur).
Maps to GET /Judikatur. Each hit gets a native ecli, human_readable_citation,
source_url and content_urls (html/xml).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ``CaseSearchQuery`` - suchworte, applikation (Justiz/Vfgh/Vwgh/...), page_size, page_number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | |
| total | Yes | |
| query_echo | No | |
| dataset_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, establishing safety. The description adds value by specifying the HTTP mapping (GET /Judikatur) and outlining the structure of results (ecli, citation, URLs), which is not covered by annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences with no filler. The first sentence states the primary purpose, and the second adds behavioral detail about hits. Every word earns its place, and it is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and 100% schema coverage, the description sufficiently explains the core functionality. It lacks details on pagination or default parameter behavior, but these are covered by the schema and default values. The description is adequate for a search tool with rich structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so parameters are documented in the schema. The description adds no additional meaning beyond what the schema provides, but the baseline of 3 is appropriate given high coverage. No param-level details are reiterated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search Austrian case law (RIS Judikatur)', identifying the specific verb and resource. It does not explicitly distinguish from sibling tools like at_search, which may be used for broader searches, but the name and context imply a specialized scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as at_search or at_get_case_text. The description omits context scenarios, prerequisites, or exclusions, leaving the agent without criteria for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
at_coverageARead-onlyIdempotent
Declare what this connector covers, how it is sourced, and what it does NOT cover.
Call this before telling a user that the law "does not contain" something, and whenever a search comes back empty: the absence may be a gap in this connector rather than in the law. Every gap carries a fallback saying where to look instead.
Returns:
Coverage with families, an as-of note, and a non-empty list of known gaps.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| families | No | |
| as_of_note | Yes | States what the dates mean, and what they do not promise. |
| known_gaps | No | Never empty. An empty list would mean 'not checked', not 'no gaps'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond that: coverage is source-dependent, empty searches can be false negatives, and every gap has a fallback. It also summarizes the return structure without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized and front-loaded: purpose, usage trigger, consequence of misuse, then return summary. Every sentence earns its place, with no filler or repetition of schema/annotation details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument introspection tool with rich annotations and an output schema, the description is complete. It explains when to call the tool, why the call matters, what the gaps contain, and what the response will include.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty, so there are no parameter semantics for the description to clarify. The zero-parameter baseline of 4 applies, and the description does not mislead about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Declare what this connector covers, how it is sourced, and what it does NOT cover.' This clearly identifies it as a coverage-introspection tool and distinguishes it from sibling retrieval/search tools like at_search and at_get_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete call triggers: 'Call this before telling a user that the law does not contain something, and whenever a search comes back empty.' It also explains the reasoning—absence may indicate a connector gap rather than a gap in the law—so the agent knows when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
at_get_case_textARead-onlyIdempotent
Fetch the full text of a decision from a RIS content URL.
| Name | Required | Description | Default |
|---|---|---|---|
| ecli | No | the hit's ECLI, passed through so the text stays citable. | |
| content_url | Yes | an absolute ris.bka.gv.at URL from a case hit's ``content_urls`` (``.html`` or ``.xml``). | |
| human_readable_citation | No | the hit's citation, passed through. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ecli | No | |
| format | Yes | |
| content | No | |
| byte_size | No | |
| source_url | Yes | |
| content_type | No | |
| dataset_note | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds that it fetches 'full text', confirming it returns content, but does not disclose additional behaviors like rate limiting or auth needs. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with verb and noun, no unnecessary words. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only 3 parameters and an output schema, the description adequately covers the primary purpose. It could mention that the URL must be absolute and from ris.bka.gv.at, but that detail is in the parameter description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter has a description. The tool description does not add further parameter-specific details, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch'), the resource ('full text of a decision'), and the source ('from a RIS content URL'). It distinguishes itself from sibling tools like at_get_text by specifying the context of a legal decision from RIS.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as at_get_text or at_case_search. It does not mention prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
at_get_textBRead-onlyIdempotent
Fetch the full text of an act from a RIS content URL.
| Name | Required | Description | Default |
|---|---|---|---|
| eli_uri | No | the hit's ELI URL, passed through so the text stays citable. | |
| content_url | Yes | an absolute ris.bka.gv.at URL from a search hit's ``content_urls`` (``.html`` or ``.xml``). | |
| human_readable_citation | No | the hit's citation, passed through. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | Yes | |
| content | No | |
| eli_uri | No | |
| byte_size | No | |
| source_url | Yes | |
| content_type | No | |
| dataset_note | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds that it fetches text from a specific URL, which is consistent with annotations. It does not disclose additional behavioral traits beyond what annotations and schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no wasted words. It efficiently communicates the tool's primary function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description need not explain return values. The description is short but covers the essential action. However, it could mention that the content_url must originate from a search hit's content_urls, which is already in the parameter description, so it is complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter has a description. The tool description does not add meaning beyond the schema; it mentions 'RIS content URL' which is already described in the content_url parameter. No added value for parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Fetch), resource (full text of an act), and source (RIS content URL). However, it does not explicitly differentiate from sibling tools like at_get_case_text, though the distinction is implicit in the resource type (act vs case).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. Sibling tools are listed in context, but the description itself offers no such differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
at_list_collectionsARead-onlyIdempotent
List the RIS collections and which are exposed by this connector.
Returns:
List of Collection (code, name, note).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds value by explaining what the list contains (exposed collections) and the return format, providing useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The first sentence states the purpose clearly, and the second describes the return value. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters and an output schema (though not provided in context), the description covers the purpose and return type adequately. No additional information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no parameters, so schema coverage is 100%. The description adds no parameter details, which is appropriate since there are none. Baseline score of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and resource 'RIS collections', and adds the specific nuance of 'which are exposed by this connector'. This distinguishes it from sibling tools which focus on searching cases or text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. While the tool is simple and the purpose is clear, an agent would benefit from knowing that this is a setup/discovery tool before searching, but that is not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
at_searchARead-onlyIdempotent
Search Austrian federal law (RIS Bundesrecht).
Maps to GET /Bundesrecht. Each hit gets eli_uri, human_readable_citation,
source_url and content_urls (html/xml).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ``SearchQuery`` - suchworte, titel, page_size (Ten/Twenty/Fifty/OneHundred), page_number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | |
| total | Yes | |
| query_echo | No | |
| dataset_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive. Description adds response field names but no further behavioral details like pagination limits or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently convey purpose and response format with no unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Describes response fields and endpoint mapping, but lacks usage context to distinguish from sibling search tools; no mention of output schema usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% via nested object description. Tool description only restates parameter names without adding meaning beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool searches Austrian federal law (RIS Bundesrecht), distinguishing it from sibling tools like at_case_search (court cases) and at_get_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus siblings; does not mention when not to use or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.4.3- Added
at_coverage
5 tool updates
v0.2.0- First observed
at_case_search - First observed
at_get_case_text - First observed
at_get_text - First observed
at_list_collections - First observed
at_search
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: listing collections, searching legislation, fetching legislation text, searching case law, fetching case law text, and declaring coverage. There is no meaningful overlap or ambiguity between tools.
Names mostly follow a consistent at_ + verb + noun pattern, e.g. at_list_collections, at_get_text, at_get_case_text. Minor deviations exist, such as at_search being generic compared to at_case_search, but the pattern remains readable and predictable.
Six tools is a well-scoped set for a legal research connector covering both legislation and case law. Each tool earns its place, and the count is neither thin nor bloated.
The tool surface covers the full lifecycle of the domain: discover collections, search both law and cases, retrieve full texts, and understand coverage gaps. The explicit coverage tool addresses a common failure mode and makes the set feel complete for its stated purpose.
Maintenance
Related MCP Connectors
Search Austrian federal and state law, court decisions, and the authentic Bundesgesetzblatt (RIS).
Resolve, search and verify legal citations against the official sources, with provenance.
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
Search Belgian & EU legislation: verbatim article text, per-article links, legal Q&A.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that exposes Austrian federal law (Bundesrecht) to LLMs, enabling full-text search, paragraph retrieval, historical versions, statute lookup, BGBl lookups, amendment timelines, and citation searches via the public RIS OGD API.-
- AlicenseAqualityAmaintenanceSearches and retrieves German federal legislation from NeuRIS, the official legal information portal, providing verifiable ELI identifiers and German citations.152Apache 2.0
- AlicenseNot gradedqualityDmaintenanceProvides LLM-friendly access to German federal legislation via the NeuRIS API, enabling tool-based retrieval of laws, norms, and statutory text.14 npmMIT
- AlicenseAqualityBmaintenanceAustria's legal information system (RIS): federal & state law, case law, gazettes, change monitoring.101Apache 2.0