recht-mcp
[smithery badge]
An MCP server for German law: federal statutes and regulations, the Landesrecht
of Bayern, Brandenburg, Nordrhein-Westfalen and Sachsen, and court decisions —
for AI agents that need to ground a citation, read a provision, or follow the
citation graph, and need to know when an answer is not complete.
On 23 October 2026 the corpus held 12,016 statutes and regulations (254,598
provisions, 312,122 stored versions) and 640,401 court decisions from 946
courts, with 7,797,118 citation links from decisions to provisions and to other
decisions. getCoverage returns the current figures.
This repository is the tool layer of the hosted server at
https://recht.nulegal.eu/v1/mcp. The hosted endpoint runs this code,
vendored at a pinned commit, over a private backend that reads the corpus
directly; recht-mcp runs the same code locally over the public REST API. The
corpus and the database stay on the service side — see
docs/DESIGN.md for exactly where the line runs.
The nine tools
Every tool is read-only. Each answer says what it is and what it is not:
version dates are first-observed dates, not Inkrafttreten; the norm-version
archive has a floor that every norm answer states; a zero from the citation
graph on a Land provision is labelled as "not indexed", not "never cited"; and
three kinds of miss — not_in_corpus, outside_coverage, known_missing —
are never collapsed into one. The full contract of each tool is in its
description (tools/list).
Use the hosted server (recommended)
No key, no signup. Point any MCP client that speaks Streamable HTTP at:
Claude Code:
A client configured with JSON:
Developer documentation for the service and its REST API:
https://recht.nulegal.eu/developers.
Run it locally
Requires Python 3.12+ and uv. The package has no
third-party runtime dependencies.
Or without a checkout:
A client that launches stdio servers:
Options: --http, --host (default 127.0.0.1), --port (default 8765),
--path (default /mcp), --base-url (or RECHT_MCP_BASE_URL; default
https://recht.nulegal.eu), --timeout, --log-level. The local HTTP server
binds to loopback and refuses browser requests from non-loopback origins.
The local server reads the same data the hosted one does, through the public
REST API, and gives the same answers with two documented exceptions (a
simplified citation grammar, and no other_laws hint on a provision miss) —
see docs/DESIGN.md.
Development
The live tests call every tool through the local server and compare several
answers with the hosted endpoint's.
Data
The legal corpus served by the hosted endpoint — its structure and selection,
the links between provisions and decisions, the version history — is licensed
separately from this code, under
CC BY 4.0. Attribution is
required: „Quelle: nu:legal – recht.nulegal.eu“. The terms, including what is
reserved, are at https://recht.nulegal.eu/lizenz and
https://recht.nulegal.eu/nutzungsbedingungen.
The texts are non-official reading copies. The binding text of a statute is
the one in its official gazette; each norm answer names it (fundstelle,
authoritative_source).
Contributing and security
Issues are welcome; outside pull requests are not accepted yet — see
CONTRIBUTING.md. Report vulnerabilities privately as
described in SECURITY.md.
License
The code in this repository is licensed under the GNU Affero General Public
License, version 3 only (AGPL-3.0-only) — see LICENSE.
The legal corpus served by the hosted endpoint is licensed separately, under
CC BY 4.0 with attribution required (see Data).
The nu:legal name and logo are not licensed.