nu:legal Deutsches Recht

eu.nulegal由 nulegal.eu 发布官方发布者v1.0.4更新于 Nov 1, 2026

German federal and Land statutes plus court decisions for agents. Keyless, read-only.

已验证Streamable HTTP可网页运行网页搜索与抓取知识与记忆

概览

AI 生成的概览

免密钥、只读的 MCP 服务器,提供德国联邦、各州及欧盟法律:核对引注、读取法条与判决、追踪引证关系。

可以做什么
  • 批量解析法条、条款、案号、ECLI 与判例出处等引注,并在引用前核对
  • 按主题或完整问题检索法条(词法)与判例(语义)
  • 以 Markdown 读取单条法条,可指定历史日期,并列出其所有存档版本
  • 以带编号的段落读取判决,并查看该判决引用了哪些法条与判例
  • 查看哪些判决引用了某法条或某判决,可按权重或时间排序
  • 查看近期变更与语料库覆盖范围,包括缺口
适用场景
适合需要核实或引用德国法律依据、摘录法条原文、阅读判决、追溯引证关系的情形。也适合在断言某内容不存在之前先确认覆盖范围。
运行要求
远程 Streamable HTTP 端点 recht.nulegal.eu,无需密钥或注册。也可用 Python 3.12+ 与 uv 在本地运行,通过公开 REST API 取数;本地 HTTP 模式默认仅绑定回环地址。
安装前请注意
只读且免费,但文本为非官方阅读副本,以官方公报版本为准。版本日期为首次收录日期而非生效日期,存档自 2019-06-10 起。黑森州法条未纳入引证图谱,因此零结果表示未索引。依 CC BY 4.0 须署名,且保留用于 AI 训练的权利。

安装

在 SourceWeft 中

  1. 打开 控制台中的 nu:legal Deutsches Recht,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/eu.nulegal%2Frecht/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "nu-legal-deutsches-recht": {
      "type": "http",
      "url": "https://recht.nulegal.eu/v1/mcp"
    }
  }
}

README

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

ToolWhat it does
resolveIdentifiersGrounds up to 100 citations at once — § 823 Abs. 1 BGB, BVerwG, Urteil vom 24.10.2023 - 2 C 9.22, ECLIs, BVerfGE 65, 1. Keeps the court and the date as disambiguators, flags a wrong date or a different court, and never returns a near match.
searchOne query over statutes (lexical) and case law (semantic), with a per-jurisdiction roll-up for cross-Land comparison.
getNormThe text of one provision as Markdown (or JSON), optionally as of a date, with its gazette citation (fundstelle).
listNormVersionsEvery stored version of a provision, with the archive floor marked.
listCitingDecisionsDecisions citing a provision or a decision, by citation weight or newest first, with the citing court's own Randnummer.
listCitedAuthoritiesWhat one decision cites: provisions (the weighted Normenkette) and decisions.
listCasePassagesA decision as numbered passages; page through it or jump to a Randnummer.
getChangesProvisions whose text changed recently — the freshness feed as JSON.
getCoverageWhat the corpus holds, and the limits every answer should be read against.

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:

https://recht.nulegal.eu/v1/mcp

Claude Code:

claude mcp add --transport http nulegal-recht https://recht.nulegal.eu/v1/mcp

A client configured with JSON:

json
{  "mcpServers": {    "nulegal-recht": { "type": "http", "url": "https://recht.nulegal.eu/v1/mcp" }  }}

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.

git clone https://github.com/nulegal-startup/recht-mcpcd recht-mcpuv run recht-mcp            # stdiouv run recht-mcp --http     # Streamable HTTP on http://127.0.0.1:8765/mcp

Or without a checkout:

uvx --from git+https://github.com/nulegal-startup/recht-mcp recht-mcp

A client that launches stdio servers:

json
{  "mcpServers": {    "nulegal-recht": {      "command": "uvx",      "args": ["--from", "git+https://github.com/nulegal-startup/recht-mcp", "recht-mcp"]    }  }}

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

uv syncuv run pytest -q                                   # unit tests, offlineRECHT_MCP_LIVE=1 uv run pytest -q tests/test_live.py   # against recht.nulegal.eu

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.

来源:README.md,提交 8fa93eb

工具

9

resolveIdentifiers

Resolve legal citations

Look up German legal citations, up to 100 at once: a § or Article, an Aktenzeichen, an ECLI or a Fundstelle. Use it to find a decision by its docket and to check a citation before you state it. Pass each citation as you hold it, with court and date: they pick the right decision where a docket repeats. It never guesses. A miss is `not_in_corpus`; `attested` / `known_missing` means the decision exists but its text is not held; `date_mismatch` / `court_mismatch` mean your citation is wrong there. A found decision carries `cited_by`: how many decisions cite it, and the top citers with a link to the Randnummer where they do. Example: {"citations": ["BGH, Urteil vom 29.03.2017 - VIII ZR 45/16", "§ 573 Abs. 2 BGB"]}

输入参数includecitations必填

getNorm

Get statute text

The text of one provision (§ or Article) as Markdown. `law` is the abbreviation ('BGB', 'StGB', 'DSGVO'; Hessen: 'HBO'), `ref` the number ('573', '3a'). For the text on a past date add `as_of` (YYYY-MM-DD; versions are held from 2019-06-10). The answer says how many versions are held (`versions_held`) and how many decisions cite the provision (`cited_by`). A version date is the day the text was first seen here, not its Inkrafttreten. With `compare_to` (YYYY-MM-DD) the answer adds `diff`, the word diff to the version stored for that date. DATES: each version carries `date_basis`, `in_force_from` (a date the source states) and `observed_from` (first seen here), each with its `*_basis`; the one we do not hold is null. Example: {"law": "BGB", "ref": "573"}

输入参数law必填ref必填as_offormatcompare_to

listNormVersions

List statute versions

Every stored version of one provision with its dates, newest first. Use it to see when a provision changed, then read a version with getNorm `as_of`. `at_archive_floor` marks a text that was already in force when the archive began. To compare two versions, call `getNorm(compare_to=…)`: the answer's `diff` is the word diff, and each side says what its date is (`date_basis`: `in_force`, `eurlex_consolidation`, `source_stated`, `observed` or `archive_floor`), so a floor date stays visible. DATES: each version carries `date_basis`, `in_force_from` (a date the source states) and `observed_from` (first seen here), each with its `*_basis`; the one we do not hold is null. Example: {"law": "BGB", "ref": "288"}

输入参数law必填ref必填

listCitingDecisions

List citing decisions

Who cites this: the decisions citing a provision (`law` + `ref`) or a decision (`case`). Ranked by weight; `sort: "recent"` gives the newest first. Each citer links to the Randnummer where it cites. The graph is built over every decision held, federal, Land and EU courts alike, and links federal, EU and Land provisions; it does not link Hessen provisions, which answer `total: 0` with `coverage.complete_for_this_norm: false`: then fall back to `search` on the provision's wording. `coverage` carries the counts for the provision's jurisdiction. Example: {"law": "BGB", "ref": "573", "sort": "recent", "limit": 5} or {"case": "KORE313182017"}

输入参数lawrefcasesortlimitoffset

listCitedAuthorities

List cited authorities

What one decision cites: the provisions (with how often) and the decisions it relies on. Example: {"case": "KORE313182017"}

输入参数case必填langoffset

listCasePassages

List case passages

Read a decision: its paragraphs, each with the court's Randnummer (`rn`) and a link. `case` takes a doknr, an ECLI, our decision URL or an Aktenzeichen. Jump to a Randnummer with `around`, page with `offset` and `limit`. The first page also says how often the decision is cited and by whom. The answer carries `card`: typed `headnotes` (Leitsatz apart from Orientierungssatz), the `tenor` where the source marks it, `cited_norms`, `fundstellen`, `cite_as`; never generated text. Example: {"case": "KORE313182017", "around": 15, "limit": 5}

输入参数case必填langlimitaroundoffsetinclude

getChanges

Change Feed

What changed here, as JSON. Two ways to read it. The cursor feed (send `kinds`, or `cursor`): everything that changed, oldest first, readable to the end without gaps: decisions added or changed, provisions with a new text (new Fassung, new provision, new law), and new citation links (decision X now cites Y, or decision Y gained a citer). Start with `kinds` (and `since`, default 7 days ago), then pass `next_cursor` back unchanged, with the same filters, until `has_more` is false; keep the cursor and poll with it later. Without those arguments: the provisions that got a new text recently, newest first. Poll it with `since` set to the newest `observed` you have processed. `observed` / `observed_at` is when the change reached this service, not when a court decided or a law came into force. Say so if you report a date. The window is the last 120 days; a provision's own history is listNormVersions.

输入参数lawlandcourtkindslimitsincecursor

getCoverage

Corpus coverage

What the corpus holds and what it does not: laws, decisions, courts, the version archive and the Länder covered. Call it before you report that something does not exist. The answer's `coverage` block is /v1/coverage: statutes per Land (`statutes`: full_text, partial or none), decisions per court level, the citation graph and what every version date is, all from one daily table. Example: {}

输入参数courtinclude

版本历史

5
  1. v1.0.4最新Nov 1, 2026
  2. v1.0.3Oct 23, 2026
  3. v1.0.2Sep 30, 2026
  4. v1.0.1Sep 24, 2026
  5. v1.0.0Sep 23, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Nulegal 集成