Metadata-Version: 2.5
Name: gesetze-mcp
Version: 0.2.0rc1
Summary: MCP-Server für deutsche Gesetze & Rechtsprechung über die OpenLegalData-API (German statutes & case law for AI agents).
Project-URL: Homepage, https://github.com/localmind-gmbh/gesetze-mcp
Project-URL: Repository, https://github.com/localmind-gmbh/gesetze-mcp
Project-URL: Issues, https://github.com/localmind-gmbh/gesetze-mcp/issues
Project-URL: Data source, https://de.openlegaldata.io
Author-email: Localmind GmbH <johannes@localmind.ai>
License-Expression: MIT
License-File: LICENSE
Keywords: ai-agents,fastmcp,german-law,gesetze,legal,llm,mcp,openlegaldata,rechtsprechung
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Legal Industry
Classifier: Natural Language :: German
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.11
Requires-Dist: beautifulsoup4>=4.12
Requires-Dist: fastmcp>=3.4
Requires-Dist: httpx>=0.27
Requires-Dist: markdownify>=1.1
Requires-Dist: pydantic-settings>=2.3
Requires-Dist: pydantic>=2.7
Description-Content-Type: text/markdown

# gesetze-mcp

**MCP-Server für deutsches (und optional österreichisches) Recht** – ein
[FastMCP](https://gofastmcp.com)-Server, der KI-Agenten Zugriff auf **Gesetzestexte** (BGB, StGB,
GG …), **Gerichtsentscheidungen** und einen **kuratierten Einstieg nach Rechtsgebieten** gibt.

Quellen: [OpenLegalData](https://de.openlegaldata.io) (Kern), das amtliche
[gesetze-im-internet.de](https://www.gesetze-im-internet.de) (Fallback für Normtexte), das
[Rechtsinformationsportal des Bundes](https://testphase.rechtsinformationen.bund.de) (Zweitquelle
für Suche und Rechtsprechung) und – nur bei aktiviertem Österreich – das
[RIS](https://www.ris.bka.gv.at). Alle Quellen sind öffentlich; **kein API-Key nötig**.

Gebaut für die Anbindung an LangChain-basierte, modell-agnostische KI-Plattformen über **stdio**.

> ⚠️ **Keine Rechtsberatung.** Dieser Server liefert Informationen aus öffentlichen Rechtsquellen.
> KI-Antworten können fehlerhaft sein. Jede inhaltliche Aussage enthält eine **Quelle**
> (verifizierbare URL + Fundstelle) und einen rechtlichen Hinweis – bitte stets den Originaltext
> und dessen Fassung prüfen.

---

## Highlights

- **12 Tools (+ 5 für Österreich), 1 Resource (+ Template), 2 Prompts** – kuratiert, mit
  **deutschen** Beschreibungen.
- **Rechtsgebiets-Karte**: „Was gilt zum Mietrecht in Bayern?" → einschlägige Gesetze mit
  Normbereichen, Suchbegriffe, Landesrecht-Hinweise und konkrete nächste Tool-Aufrufe – ohne Netz.
- **Föderierte Volltextsuche**: OpenLegalData + Rechtsinformationsportal des Bundes parallel,
  dedupliziert; fällt eine Quelle aus, liefert die andere weiter.
- **Amtlicher Fallback**: kennt OpenLegalData eine Norm nicht, kommt der Text direkt von
  gesetze-im-internet.de.
- **Structured Output** (Pydantic): jede Antwort ist typisiert und enthält ein `quelle`-Objekt mit
  `land` (`DE`/`AT`), URL, Identifikatoren und Fassung.
- **Österreich als Opt-in**: `at_*`-Tools existieren nur, wenn `AT` aktiviert ist – deutsche Kunden
  können nie versehentlich österreichisches Recht bekommen.
- **Read-only**, alle Tools mit `readOnlyHint`/`idempotentHint`.

## Tools

### Deutschland (immer aktiv)

| Tool | Zweck |
|---|---|
| `rechtsgebiet_ueberblick` | **Einstieg** für Überblicksfragen: Gesetze, Normbereiche, Suchbegriffe, Landesrecht-Hinweise (Portal + Normnamen), nächste Schritte. |
| `gesetzbuecher_auflisten` | Verfügbare Gesetzbücher finden (Code/Titel, neueste Fassung). |
| `gesetzbuch_details` | Alle Fassungen/Revisionen eines Gesetzbuchs. |
| `gesetz_lesen` | Volltext einer Norm – per `law_id` **oder** `gesetzbuch_code` + `section`; Fallback gesetze-im-internet.de. |
| `normen_auflisten` | Normen eines Buches durchblättern/lokal nach Titel filtern. |
| `gesetz_volltextsuche` | Volltextsuche über Normtexte (OpenLegalData + Rechtsinformationsportal); bei wenigen Treffern Rechtsgebiets-Hinweis. |
| `gesetz_querverweise` | Verweise einer Norm (ausgehend / zitiert von Urteilen / von Normen). |
| `urteil_volltextsuche` | Volltextsuche über Gerichtsentscheidungen (OpenLegalData + Rechtsinformationsportal mit Leitsatz-Snippets). |
| `urteile_auflisten` | Urteile nach Metadaten filtern (Gericht, Az., ECLI, Datum). |
| `urteil_lesen` | Volltext einer Entscheidung – per `case_id` (OpenLegalData) oder `dokumentnummer` (Rechtsinformationsportal). |
| `urteil_querverweise` | Von einem Urteil zitierte Normen/Urteile (und umgekehrt). |
| `zitat_pruefen` | Zitat validieren/auflösen (`§ 823 BGB`, Aktenzeichen, ECLI). |

### Österreich (nur mit `GESETZE_MCP_LAENDER=DE,AT`)

| Tool | Zweck |
|---|---|
| `at_gesetz_lesen` | Geltende Fassung eines Paragraphen (Kürzel wie `EStG`, `UStG`, `BAO`, `ABGB`, `MRG`); mit `bundesland` Landesrecht. |
| `at_normen_auflisten` | Paragraphen eines Gesetzes (100 je Seite). |
| `at_gesetz_volltextsuche` | Volltextsuche im geltenden Bundes-/Landesrecht. |
| `at_urteil_volltextsuche` | Judikatur (Justiz/VwGH/VfGH/BVwG/LVwG), neueste zuerst; Steuersachen: `gericht="Vwgh"`. |
| `at_urteil_lesen` | Rechtssatz oder Entscheidungstext per RIS-Dokumentnummer. |

**Resources:** `gesetzbuch://katalog` (Katalog), `gesetz://{gesetzbuch_code}/{section}` (z. B. `gesetz://BGB/823`).
**Prompts:** `norm_recherche`, `gesetz_erklaeren` (mit eingebauten Quellen-/Disclaimer-Leitlinien).

### Was nicht abgedeckt ist

- **Deutsches Landesrecht** (Bauordnungen, Schul-, Polizei-, Nachbarrecht) liegt in keiner der
  Quellen. `rechtsgebiet_ueberblick` nennt das amtliche Landesportal und die einschlägigen
  Landesnormen; der Agent sagt das offen und verweist auf das Portal.
- **EU-Recht** (DSGVO, KI-Verordnung …) – über EUR-Lex prüfen; in der Karte als Hinweis hinterlegt.
- **Österreich:** Entscheidungen des Bundesfinanzgerichts und BMF-Richtlinien liegen in der Findok,
  nicht im RIS; Kollektivverträge sind keine Gesetze.

## Installation

Der Server läuft am einfachsten via [`uv`](https://docs.astral.sh/uv/) ohne Vorinstallation:

```bash
uvx gesetze-mcp
```

Oder klassisch:

```bash
pip install gesetze-mcp
gesetze-mcp           # startet den stdio-Server
```

## Konfiguration (Umgebungsvariablen)

Alle Variablen sind optional; ohne Konfiguration läuft der Server für Deutschland.

| Variable | Default | Zweck |
|---|---|---|
| `GESETZE_MCP_LAENDER` | `DE` | Aktive Rechtsordnungen: `DE`, `DE,AT` oder `AT`. Nur mit `AT` existieren die `at_*`-Tools. |
| `GESETZE_MCP_STANDARD_LAND` | erstes Element | Rechtsordnung für unspezifische Fragen (wird dem Modell in den `instructions` genannt). |
| `GESETZE_MCP_RI_AKTIV` | `true` | Rechtsinformationsportal des Bundes als Zweitquelle. |
| `GESETZE_MCP_GII_AKTIV` | `true` | gesetze-im-internet.de als amtlicher Fallback für `gesetz_lesen`. |
| `GESETZE_MCP_RI_BASE_URL` | `https://testphase.rechtsinformationen.bund.de` | |
| `GESETZE_MCP_RIS_BASE_URL` | `https://data.bka.gv.at/ris/api/v2.6` | |
| `GESETZE_MCP_RIS_DOKUMENT_BASE_URL` | `https://ogd.ris.bka.gv.at` | |
| `GESETZE_MCP_GII_BASE_URL` | `https://www.gesetze-im-internet.de` | |
| `OPENLEGALDATA_API_KEY` | – (optional) | API-Token. **Lesezugriffe sind öffentlich** – der Key ist nur für höhere Rate-Limits nötig. |
| `OPENLEGALDATA_BASE_URL` | `https://de.openlegaldata.io` | Basis-URL der API. |
| `OPENLEGALDATA_TIMEOUT` | `30` | HTTP-Timeout (Sekunden), gilt für alle Quellen. |
| `OPENLEGALDATA_AUTH_SCHEME` | `Token` | Präfix des `Authorization`-Headers. |

**Ausgehende Hosts** (für Firewalls/Egress-Filter): `de.openlegaldata.io`,
`www.gesetze-im-internet.de`, `testphase.rechtsinformationen.bund.de`; bei aktivem AT zusätzlich
`data.bka.gv.at` und `ogd.ris.bka.gv.at`.

## Anbindung an eine KI-Plattform (stdio)

Die Plattform startet den Server als Subprozess und reicht Konfiguration per ENV durch:

```json
{
  "mcpServers": {
    "gesetze": {
      "command": "uvx",
      "args": ["gesetze-mcp"],
      "env": { "GESETZE_MCP_LAENDER": "DE" }
    }
  }
}
```

Für einen Kunden in Österreich: `"GESETZE_MCP_LAENDER": "DE,AT"` (beide Rechtsordnungen) oder
`"AT"`. Der Server nennt dem Modell die Standard-Rechtsordnung und verbietet das Vermischen.

### LangChain / LangGraph

Mit [`langchain-mcp-adapters`](https://github.com/langchain-ai/langchain-mcp-adapters) werden die
Tools modell-agnostisch in einen Agenten geladen:

```python
from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient(
    {
        "gesetze": {
            "command": "uvx",
            "args": ["gesetze-mcp"],
            "transport": "stdio",
            "env": {"GESETZE_MCP_LAENDER": "DE"},
        }
    }
)
tools = await client.get_tools()
# tools -> an dein LangChain/LangGraph-Agenten-Setup übergeben
```

### Empfohlene System-Prompt-Leitlinien für den Agenten

Der Server liefert diese Regeln bereits maschinenlesbar über seine `instructions`, ergänze sie
aber im Agenten-System-Prompt:

1. **Überblicksfragen zuerst mit `rechtsgebiet_ueberblick`** beantworten, dann Normen lesen.
2. **Immer Quelle/Fassung zitieren** (Gesetzbuch + §/Art. bzw. Gericht + Az./ECLI, plus `quelle.url`).
3. **Keine Rechtsberatung** – bei rechtlich relevanten Fragen auf qualifizierte Beratung verweisen.
4. **Nicht halluzinieren** – wenn ein Tool nichts findet, das offen sagen und Suche/Originaltext anbieten.

## Quellen & Verifizierbarkeit

Jede inhaltliche Antwort enthält ein `quelle`-Objekt mit `land`, zwei Links und allen
Identifikatoren (Gesetzbuch-Code, §/Art., Fassung; Gericht, Aktenzeichen, ECLI, Datum):

- **`url`** — die **lesbare** Fundstelle zum Anklicken:
  - Gesetze DE → amtliche Fassung bei gesetze-im-internet.de (z. B. `…/bgb/__823.html`).
  - Urteile DE → OpenLegalData-Entscheidungsseite (`…/case/<slug>`) bzw. HTML des
    Rechtsinformationsportals (`…/v1/case-law/<nr>.html`).
  - Österreich → RIS-Dokument (`https://ogd.ris.bka.gv.at/Dokumente/…`).
- **`api_url`** — die maschinenlesbare Quelle (OpenLegalData-API, Portal-JSON oder RIS-Gesamtvorschrift).

## Rollout einer neuen Version

`uvx gesetze-mcp` ohne Versions-Pin lädt bei jedem Kaltstart die neueste stabile Version von PyPI –
eine Veröffentlichung ist damit sofort bei allen so eingebundenen Kunden live. Deshalb:

1. Pre-Release veröffentlichen (`0.x.0rc1`); uvx ignoriert Pre-Releases ohne expliziten Pin.
2. Auf einer Staging-Instanz mit `uvx gesetze-mcp==0.x.0rc1` testen (DE und DE,AT).
3. Erst dann die stabile Version veröffentlichen.

## Entwicklung

```bash
uv sync                      # Umgebung einrichten
uv run python -m pytest      # Tests (Live-Tests werden übersprungen)
RUN_LIVE=1 uv run python -m pytest -m live                            # gegen die echten APIs (DE)
GESETZE_MCP_LAENDER=DE,AT RUN_LIVE=1 uv run python -m pytest -m live  # inkl. Österreich
uv run ruff check . && uv run ruff format --check .
uv run python -m mypy src
```

Die Rechtsgebiets-Karte liegt in `src/gesetze_mcp/rechtsgebiete.json` und ist bewusst kuratiert:
Ergänzungen brauchen Slug, Land, Stichwörter, Gesetze mit Normbereich und Zweck sowie Suchbegriffe.

## Datenquellen & Lizenz

Daten von [OpenLegalData](https://de.openlegaldata.io) (Open Data), gesetze-im-internet.de
(Bundesministerium der Justiz), dem Rechtsinformationsportal des Bundes (Testphase) und dem RIS
(Bundeskanzleramt Österreich, OGD). Code unter **MIT-Lizenz** (siehe `LICENSE`). Dieses Projekt
steht in keiner offiziellen Verbindung zu einer dieser Stellen.

---

## English summary

`gesetze-mcp` is a FastMCP server giving AI agents access to **German statutes** (BGB, StGB, GG …),
**court decisions** and a **curated entry point by area of law** (“What applies to tenancy law in
Bavaria?”). Sources: OpenLegalData (core), the official gesetze-im-internet.de (fallback for statute
text), the federal legal information portal (second source for search and case law) and, only when
enabled via `GESETZE_MCP_LAENDER=DE,AT`, the Austrian RIS with five dedicated `at_*` tools. All
sources are public; no API key is required. Every result carries a verifiable `quelle` (jurisdiction,
source URL, identifiers) and a legal disclaimer (this is **not legal advice**). Run via
`uvx gesetze-mcp` over stdio and connect it to any LangChain/MCP-compatible, model-agnostic platform.
