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 整合