MCP server & Python client for Austria's legal information system (RIS): federal & state law, case law, gazettes, change monitoring. Clean Markdown, ELI/ECLI, CC-BY.
claude mcp add at-ris-mcp -- python -m at-ris-mcp{
"mcpServers": {
"at-ris-mcp": {
"command": "python",
"args": ["-m", "ris_mcp"]
}
}
}Resumen de MCP Servers
# at-ris-mcp
<!-- mcp-name: io.github.paragraflabs/at-ris-mcp -->
[](https://github.com/paragraflabs/at-ris-mcp/actions/workflows/ci.yml)
[](https://pypi.org/project/at-ris-mcp/)
[](https://pypi.org/project/at-ris-mcp/)
[](LICENSE)
A generic **MCP server** and standalone **Python client library** for the
Austrian **RIS** (Rechtsinformationssystem des Bundes), the official legal
information system of the Republic of Austria, operated by the Bundeskanzleramt.
It covers **federal law** (Bundesrecht — including *consolidated* law `BrKons`,
the official gazettes, drafts and government bills), **state law** (Landesrecht
of the nine Bundesländer), **case law** (Judikatur — OGH, VfGH, VwGH, BVwG,
LVwG and more), ministerial decrees, district and municipal law, plus a
change-monitoring feed — via the keyless OGD API at
`https://data.bka.gv.at/ris/api/v2.6/`.
## Why this exists
Compared with existing RIS tooling, `at-ris-mcp` adds:
- **Consolidated law** (`BrKons`) — the currently applicable text, not just the
gazette novellas.
- **Section-precise access** — retrieve a single `§`/Artikel/Anlage
(`Abschnitt.*`).
- **Historical version** — the law as it stood on a given date
(`Fassung.FassungVom`).
- **Clean Markdown** — RIS HTML (≈40 KB of CSS boilerplate per document) is
stripped to the legal text, with a `raw` switch for the untouched original.
## Two packages, one repo
- **`ris_client`** — a standalone, MCP-independent library. Import it directly.
- **`ris_mcp`** — a thin FastMCP/stdio wrapper exposing 10 tools. Contains no
logic of its own.
## Install
```bash
pip install at-ris-mcp # library only
pip install "at-ris-mcp[mcp]" # + the MCP server (FastMCP)
```
## Run the MCP server (stdio)
```bash
at-ris-mcp
# or
python -m ris_mcp
```
### Remote transport (HTTP / SSE)
For hosted or remote deployments the server can also speak streamable HTTP or
SSE instead of stdio:
```bash
at-ris-mcp --transport http --host 0.0.0.0 --port 8000 # streamable HTTP
at-ris-mcp --transport sse --port 9000 # SSE
# or via environment:
RIS_MCP_TRANSPORT=http RIS_MCP_PORT=8000 at-ris-mcp
```
The HTTP endpoint is served at `/mcp` by default (override with `--path` /
`RIS_MCP_PATH`). stdio remains the default when no transport is given.
### Tools
| Tool | Purpose |
|---|---|
| `ris_search_law` | Search Bundesrecht (default `BrKons`; also `BgblAuth`, `Begut`, `RegV`, …). Section + Fassung filters. |
| `ris_get_law_text` | Full text of a statute/section (markdown \| html \| xml \| raw). |
| `ris_search_case` | Search Judikatur (default `Justiz`; all courts). Filter by applied `norm`. |
| `ris_get_case_text` | Full text of a decision. |
| `ris_search_state_law` | Search Landesrecht (9 Bundesländer; default `LrKons`). Select states via `bundeslaender`. |
| `ris_search_misc` | Search `Sonstige` (ministerial decrees `Erlaesse`, `Avsv`, …). |
| `ris_search_district` | Search district authority notices (`Bezirke` / `Bvb`). |
| `ris_search_municipality` | Search municipal law (`Gemeinden` / Gemeinderecht `Gr`/`GrA`). |
| `ris_list_collections` | Which endpoints/applications are covered. |
| `ris_list_changes` | Change/early-warning feed (RIS History) via the OGD SOAP endpoint, incl. deleted documents. |
## Library usage
```python
import asyncio
from ris_client import RisClient, LawSearchRequest, TextFormat
async def main():
async with RisClient() as c:
res = await c.search_law(LawSearchRequest(suchworte="Datenschutzgesetz",
page_size="Ten"))
hit = res.items[0]
print(hit.human_readable_citation, hit.eli_uri)
text = await c.get_text(hit.content_urls["html"], TextFormat.markdown)
print(text.content[:500])
asyncio.run(main())
```
## Configuration (environment variables)
| Variable | Default | Meaning |
|---|---|---|
| `RIS_BASE_URL` | `https://data.bka.gv.at/ris/api/v2.6` | API base (version isolation). |
| `RIS_SOAP_URL` | `https://data.bka.gv.at/ris/ogd/v2.6/` | OGD SOAP endpoint (used by `ris_list_changes`). |
| `RIS_USER_AGENT` | `at-ris-mcp/<version> (+…)` | Descriptive UA (netiquette). |
| `RIS_RATE_MS` | `1200` | Minimum delay between requests (ms). |
| `RIS_TIMEOUT_S` | `30` | HTTP timeout. |
| `RIS_MAX_RETRIES` | `3` | Retries on 429/5xx (incl. 503). |
| `RIS_CACHE_DIR` | `~/.cache/at-ris-mcp` | SQLite cache location. |
| `RIS_CACHE_ENABLED` | `true` | Toggle the cache. |
| `RIS_AUDIT_DIR` | *(unset)* | If set, append a JSONL audit line per call (no full text, no client data). |
| `RIS_MCP_TRANSPORT` | `stdio` | Server transport: `stdio` \| `http` \| `sse` \| `streamable-http`. |
| `RIS_MCP_HOST` | `127.0.0.1` | Bind host for http/sse. |
| `RIS_MCP_PORT` | `8000` | Bind port for http/sse. |
| `RIS_MCP_PATH` | *(transport default)* | URL path for the HTTP endpoint. |
## Netiquette & rate limiting
Per the RIS OGD FAQ: a 1–2 s pause per page is enforced by the client; bulk
access should occur outside office hours (18:00–06:00) or on weekends and be
announced to `ris.it@bka.gv.at`. A descriptive User-Agent is sent by default.
## Licensing
- **Code:** Apache-2.0 (see `LICENSE`).
- **Data:** the retrieved documents are provided by the Republic of Austria
under **CC BY 4.0**. Every tool response carries an `attribution` field:
> Quelle: RIS – Rechtsinformationssystem des Bundes (data.bka.gv.at), CC BY 4.0
- **No legal advice.** Only the authentic promulgation text
(Bundesgesetzblatt/Landesgesetzblatt authentisch) is legally binding.
Consolidated law and all other documents are for information only. Every
response carries a `legal_notice` to that effect.
## Scope (v1.0)
Covered: `Bundesrecht` (`BrKons`, `BgblAuth`, `BgblPdf`, `BgblAlt`, `Begut`,
`RegV`, `Erv` — English translations), `Judikatur` (all courts), the **History
change-feed** (`ris_list_changes`, incl. deleted documents), **Landesrecht**
(9 Bundesländer: `LrKons`, `LgblAuth`, `Lgbl`, `LgblNO`, `Vbl`), **Sonstige**
(`Erlaesse`, `Avsv`, `Avn`, `Spg`, `KmGer`, `Upts`, `Mrp`, `PruefGewO` — with
app-specific fine filters), **Bezirke** (`Bvb`) and **Gemeinden** (`Gr`, `GrA`).
> **English translations (`Erv`):** search via `ris_search_law` with
> `applikation="Erv"`. `suchworte`/`titel` map to the RIS `SearchTerms`/`Title`
> parameters automatically.
> **State-law note:** for consolidated state law (`LrKons`), select the states
> via `bundeslaender` (e.g. `["Kaernten","Tirol"]`); this maps to the dotted
> `Bundesland.SucheIn<Land>=true` flags the API requires (the flat form is
> silently ignored for `LrKons`).
> **History note:** consolidated federal law is monitored under the application
> name `Bundesnormen` (not `BrKons`), consolidated state law under
> `Landesnormen`. The History query uses the OGD **SOAP** endpoint, since it is
> not exposed via the REST GET API.
## Development
```bash
pip install -e ".[dev,mcp]"
pytest # offline tests
RIS_SMOKE=1 pytest -m smoke # live smoke tests against the real API
```
## Release
Releases are automated. Pushing a version tag (`vX.Y.Z`) triggers GitHub
Actions to build the distributions, publish to **PyPI** (via Trusted
Publishing / OIDC — no API token), create a **GitHub Release**, and register
the new version in the **MCP Registry**.
```bash
# bump the version in pyproject.toml, src/ris_client/config.py and server.json,
# update CHANGELOG.md, then:
git tag -a vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.Z
```
To build locally without publishing:
```bash
python -m build # sdist + wheel into dist/
python -m twine check dist/*
```
The MCP-registry entry is described by `server.json`
(name `io.github.paragraflabs/at-ris-mcp`); the matching `mcp-name:` marker is
embedded near the top of this README.
## Contributing & support
Issues and pull requests are welcome at
<https://github.com/paragraflabs/at-ris-mcp>. See [`CHANGELOG.md`](CHANGELOG.md)
for the release history. This project is not affiliated with or endorsed by the
Republic of Austria or the Bundeskanzleramt; it is an independent client for the
public RIS OGD interface.
Lo que la gente pregunta sobre at-ris-mcp
¿Qué es paragraflabs/at-ris-mcp?
+
paragraflabs/at-ris-mcp es mcp servers para el ecosistema de Claude AI. MCP server & Python client for Austria's legal information system (RIS): federal & state law, case law, gazettes, change monitoring. Clean Markdown, ELI/ECLI, CC-BY. Tiene 0 estrellas en GitHub y se actualizó por última vez today.
¿Cómo se instala at-ris-mcp?
+
Puedes instalar at-ris-mcp clonando el repositorio (https://github.com/paragraflabs/at-ris-mcp) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar paragraflabs/at-ris-mcp?
+
paragraflabs/at-ris-mcp aún no ha sido auditado por nuestro agente de seguridad. Revisa el repositorio original en GitHub antes de usarlo en producción.
¿Quién mantiene paragraflabs/at-ris-mcp?
+
paragraflabs/at-ris-mcp es mantenido por paragraflabs. La última actividad registrada en GitHub es de today, con 0 issues abiertos.
¿Hay alternativas a at-ris-mcp?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega at-ris-mcp en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/paragraflabs-at-ris-mcp)<a href="https://claudewave.com/repo/paragraflabs-at-ris-mcp"><img src="https://claudewave.com/api/badge/paragraflabs-at-ris-mcp" alt="Featured on ClaudeWave: paragraflabs/at-ris-mcp" width="320" height="64" /></a>Más MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
The fastest path to AI-powered full stack observability, even for lean teams.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!