{"name":"eu.nulegal/recht","slug":"nulegal-recht","title":"nu:legal Deutsches Recht","description":"German federal and Land statutes plus court decisions for agents. Keyless, read-only.","url":"https://mcp.market/server/nulegal-recht","rating":null,"grade":"A","score":91,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":26,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-11-01T10:43:26.000Z","license":"AGPL-3.0"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T02:30:27.253Z","last_ok_at":"2026-11-04T02:30:27.253Z","latency_ms":82},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/nulegal-startup/recht-mcp","website":"https://recht.nulegal.eu/developers","version":"1.0.4","remotes":[{"type":"streamable-http","url":"https://recht.nulegal.eu/v1/mcp"}],"packages":[],"tools":[{"name":"getChanges","description":"What changed here, as JSON. Two ways to read it.\n\nThe 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.\n\nWithout those arguments: the provisions that got a new text recently, newest first. Poll it with `since` set to the newest `observed` you have processed.\n\n`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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"since":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Only changes observed on or after this date (cursor feed: at most 120 days back, default 7)."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"Default 50 (date list) or 100 (cursor feed)."},"cursor":{"type":"string","maxLength":1000,"description":"Cursor feed: `next_cursor` of the previous call, unchanged."},"kinds":{"type":"array","items":{"enum":["decision","law","citation"]},"description":"Cursor feed: which kinds (decision, law, citation)."},"court":{"type":"string","maxLength":200,"description":"Cursor feed: a court, as the court segment of a decision URL (bgh)."},"land":{"type":"string","maxLength":8,"description":"Cursor feed: a Land code (BY, NW, SN, BB, ...) or BUND."},"law":{"type":"string","maxLength":200,"description":"Cursor feed: a law abbreviation (BGB). Leaves out links between decisions."}}}},{"name":"getCoverage","description":"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: {}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string","enum":["courts"]},"description":"`[\"courts\"]` adds `courts`: the court registry (slug, names, branch, level, Land, ECLI court code, decision count), at most 25 rows, busiest first."},"court":{"type":"string","description":"Adds `courts` with only the courts whose name, slug or ECLI code contains this ('köln', 'BVerwG')."}}}},{"name":"getNorm","description":"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; for EU acts, the EMRK and some Landesrecht from the day their held text applies). The answer says how many versions are held (`versions_held`) and how many decisions cite the provision (`cited_by`). A version date is not always its Inkrafttreten: `date_basis` says what it is. For most federal law it is the day the text was first seen here; for an EU act it is the day its text applies (`applies_from`). 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\"}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"law":{"type":"string","description":"Law abbreviation, or a `law_key` (`slug` in search results) when an abbreviation is ambiguous.","examples":["BGB","DSGVO","RVG","BDSG 2018","SächsDSDG"]},"ref":{"type":"string","description":"Provision number without § or Art. A sub-unit ('Abs. 1', 'lit. f') is dropped: the whole provision is returned.","examples":["622","823","3a","83","28"]},"as_of":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Return the version stored for this date.","examples":["2021-01-01"]},"format":{"type":"string","enum":["markdown","json"],"default":"markdown","description":"'markdown' (default, compact, quotable) or 'json' for the structured payload."},"compare_to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Compare with the version stored for this date: the answer adds `diff`, the word diff between the two versions (the older one is `from`), each side with its `date_basis`."}},"required":["law","ref"]}},{"name":"listCasePassages","description":"Read a decision: its paragraphs, each with the court's Randnummer (`rn`) and a link. `case` takes 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\": \"bgh/2017-03-29/viii-zr-45-16\", \"around\": 15, \"limit\": 5}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"case":{"type":"string","description":"A stored decision id, an ECLI, or this site's decision URL as `search` returns it. The canonical decision key `{court}/{date}/{slug}` (e.g. `bgh/2024-07-10/viii-zr-276-23`) is accepted wherever a decision is named; a key that names two decisions answers `ambiguous` with `candidates`.","examples":["bgh/2017-03-29/viii-zr-45-16","ECLI:DE:BGH:2017:290317UVIIIZR45.16.0"]},"offset":{"type":"integer","minimum":0,"default":0},"limit":{"type":"integer","minimum":1,"maximum":400,"default":30},"around":{"type":["integer","string"],"description":"A Randnummer as the court printed it. Returns a window of `limit` passages centred on it. Not combinable with `offset`.","examples":[51,"12"]},"lang":{"type":"string","enum":["de","en"],"description":"Language of the decision text: 'de' or 'en'. Default: German when it exists, else English."},"include":{"type":"array","items":{"type":"string","enum":["proceeding"]},"description":"`[\"proceeding\"]` adds `proceeding`: the Verfahrensgang (earlier and later decisions of the same proceeding) as the courts' records state it. No outcome is stated."}},"required":["case"]}},{"name":"listCitedAuthorities","description":"What one decision cites: the provisions (with how often) and the decisions it relies on. Example: {\"case\": \"bgh/2017-03-29/viii-zr-45-16\"}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"case":{"type":"string","description":"A stored decision id, an ECLI, or this site's decision URL as `search` returns it. The canonical decision key `{court}/{date}/{slug}` (e.g. `bgh/2024-07-10/viii-zr-276-23`) is accepted wherever a decision is named; a key that names two decisions answers `ambiguous` with `candidates`.","examples":["bgh/2017-03-29/viii-zr-45-16"]},"lang":{"type":"string","enum":["de","en"],"description":"Language of the decision text: 'de' or 'en'. Default: German when it exists, else English."},"offset":{"type":"integer","minimum":0,"maximum":100000,"description":"Skip this many cited decisions (pages of 50). Follow `pagination.next_offset`."}},"required":["case"]}},{"name":"listCitingDecisions","description":"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\": \"bgh/2017-03-29/viii-zr-45-16\"}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"law":{"type":"string","examples":["DSGVO","RVG","BGB"]},"ref":{"type":"string","examples":["83","3a","288"]},"case":{"type":"string","description":"A stored decision id, an ECLI, or this site's decision URL as `search` returns it. The canonical decision key `{court}/{date}/{slug}` (e.g. `bgh/2024-07-10/viii-zr-276-23`) is accepted wherever a decision is named; a key that names two decisions answers `ambiguous` with `candidates`.","examples":["ECLI:DE:BAG:2018:250918.U.8AZR26.18.0"]},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20},"offset":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip, for reading past the first page."},"sort":{"type":"string","enum":["weight","recent"],"default":"weight","description":"'weight' (default) is citation weight, then court tier, then recency. 'recent' is newest decision first; where it cannot be computed the answer falls back to 'weight' and says so in `sort_applied`."}}}},{"name":"listNormVersions","description":"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\"}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"law":{"type":"string","examples":["BGB","DSGVO"]},"ref":{"type":"string","examples":["288","622"]}},"required":["law","ref"]}},{"name":"resolveIdentifiers","description":"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\"]}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"citations":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"string","maxLength":400},"description":"The citations, verbatim as you hold them.","examples":[["§ 622 Abs. 2 BGB","BVerwG, Urteil vom 24.10.2023 - 2 C 9.22","BVerfGE 65, 1","Art. 83 DSGVO"]]},"include":{"type":"array","items":{"type":"string","enum":["text","leitsatz"]},"description":"Opt-in extra payload. 'text' returns a norm's FULL text instead of the 300-character stub — the stub is the same 300 characters whichever Absatz you cited, so never verify a quotation against it. 'leitsatz' returns a decision's whole Leitsatz instead of its preview. An unknown value is refused, not ignored."}},"required":["citations"]}},{"name":"search","description":"Find statutes and decisions on a topic or a question, in one call. Use it when you hold no citation yet. German keywords or a full question both work; decisions are matched by meaning. A decision hit carries `url` (pass it as `case` to the decision tools), `ecli` and `cited_by`; a statute hit carries `slug` and `ref_norm` (pass them as `law` and `ref` to getNorm). Full text is held for Bayern, Brandenburg, Hessen, Nordrhein-Westfalen and Sachsen (see `getCoverage`). Hessen rows (`jurisdiction` 'HE'): pass `law_key` as `law` and `ref_norm` as `ref` to getNorm. Decisions can be filtered by `court`, `court_level`, `state`, `panel`, `from`/`to` and `decision_type`, and sorted with `sort` (relevance, weight: most cited first, newest); the answer counts them in `cases_total`. Example: {\"q\": \"Eigenbedarf Kündigung Härtefall\"}","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","minLength":2,"maxLength":2000,"description":"German query. Keywords, a citation, or a full question.","examples":["Kündigungsfrist Arbeitsverhältnis 10 Jahre","Videoüberwachung öffentlich zugänglicher Räume","Welche Rechte hat ein Arbeitnehmer bei verspäteter Lohnzahlung"]},"scope":{"type":"string","enum":["all","norms","cases"],"default":"all","description":"'all' (default) searches both. Narrow only when you know which corpus answers."},"limit":{"type":"integer","minimum":1,"maximum":50,"default":10},"include_repealed":{"type":"boolean","default":false,"description":"Include repealed (aufgehobene) provisions. Off by default; turn it on when researching an older state of the law."},"court":{"type":"string","description":"One court, by its slug: bgh, bverwg, olg-koeln, ovg-sachsen."},"court_level":{"type":"string","enum":["federal","higher","regional","lower","state_constitutional","european","other"]},"state":{"type":"string","description":"A Land code (BY) or name slug (bayern), or bund / eu."},"panel":{"type":"string","description":"A Senat of `court`: 'VIII. Zivilsenat', '2. Strafsenat' (BGH), '7. Senat' (BAG, BFH, BSG, BVerwG, BVerfG)."},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"decision_type":{"type":"string","enum":["urteil","beschluss","gerichtsbescheid","schlussantraege"]},"sort":{"type":"string","enum":["relevance","weight","newest"],"default":"relevance"}},"required":["q"]}}],"scan":{"score":91,"grade":"A","scanned_at":"2026-11-03T23:29:40.141Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-03T23:29:40.039Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1131ms"]},"poisoning":{"score":15,"max":15,"notes":["9 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 3 days ago"]},"identity":{"score":8,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"findings":[],"inputs":{"probes":[{"url":"https://recht.nulegal.eu/v1/mcp","reachable":true,"authRequired":false,"latencyMs":1131,"serverInfo":{"name":"nulegal-recht","version":"1.0.4"}}],"packages":[],"repo":{"found":true,"owner":"nulegal-startup","repo":"recht-mcp","archived":false,"pushedAt":"2026-11-01T10:43:26Z","stars":1,"forks":0,"openIssues":1,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/181578053?v=4","ownerCreatedAt":"2024-09-14T14:06:09Z","license":"AGPL-3.0"},"icon":{"url":"https://recht.nulegal.eu/static/nulegal-icon.svg","source":"registry"},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":"AGPL-3.0","lastPushAt":"2026-11-01T10:43:26.000Z","score":26}}}},"grade_history":[{"kind":"restore","fromGrade":"C","toGrade":"A","reason":"score 91","createdAt":"2026-11-03T23:29:41.952Z"}],"reviews":[]}