Skip to main content
Glama

at-eli-mcp

Install (one command)

Published on PyPI + MCP Registry (io.github.matematicsolutions/at-eli-mcp). Run without cloning:

uvx at-eli-mcp

Configure 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_mcp

pip.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

at_search

Search federal law (GET /Bundesrecht) by free text and/or title.

at_get_text

Fetch an act's full text (html or xml) from a hit's content URL.

at_case_search

Search case law (GET /Judikatur) by free text, choosing a court (applikation). Hits carry a native ecli.

at_get_case_text

Fetch a decision's full text from a case hit's content URL.

at_list_collections

List the RIS collections and which are exposed.

at_coverage

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 - default https://data.bka.gv.at/ris/api/v2.6

  • AT_ELI_CACHE_DIR - default ~/.matematic/cache/at-eli

  • AT_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.at and (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 RIS

Licence

Apache-2.0. © Matematic Solutions / Wieslaw Mazur.

Available Tools

6 tools
at_coverageA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo
familiesNo
as_of_noteYesStates what the dates mean, and what they do not promise.
known_gapsNoNever empty. An empty list would mean 'not checked', not 'no gaps'.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_textA
Read-onlyIdempotent

Fetch the full text of a decision from a RIS content URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
ecliNothe hit's ECLI, passed through so the text stays citable.
content_urlYesan absolute ris.bka.gv.at URL from a case hit's ``content_urls`` (``.html`` or ``.xml``).
human_readable_citationNothe hit's citation, passed through.

Output Schema

ParametersJSON Schema
NameRequiredDescription
ecliNo
formatYes
contentNo
byte_sizeNo
source_urlYes
content_typeNo
dataset_noteNo
human_readable_citationNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_textB
Read-onlyIdempotent

Fetch the full text of an act from a RIS content URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
eli_uriNothe hit's ELI URL, passed through so the text stays citable.
content_urlYesan absolute ris.bka.gv.at URL from a search hit's ``content_urls`` (``.html`` or ``.xml``).
human_readable_citationNothe hit's citation, passed through.

Output Schema

ParametersJSON Schema
NameRequiredDescription
formatYes
contentNo
eli_uriNo
byte_sizeNo
source_urlYes
content_typeNo
dataset_noteNo
human_readable_citationNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_collectionsA
Read-onlyIdempotent

List the RIS collections and which are exposed by this connector.

Returns: List of Collection (code, name, note).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.4.3
    • Addedat_coverage
  2. 5 tool updatesv0.2.0
    • First observedat_case_search
    • First observedat_get_case_text
    • First observedat_get_text
    • First observedat_list_collections
    • First observedat_search

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP 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.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Searches and retrieves German federal legislation from NeuRIS, the official legal information portal, providing verifiable ELI identifiers and German citations.
    15
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides LLM-friendly access to German federal legislation via the NeuRIS API, enabling tool-based retrieval of laws, norms, and statutory text.
    14 npm
    MIT