MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Knowledge & memory

nu:legal Deutsches Recht

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

Checks passed
13 / 22

2 failed · 7 not measured

Median response
265 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
11

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Responded

The server completed its last measured handshake. This is an observation, not a guarantee.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
103
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
310
Publisher identityCan the publisher be traced to its source?
312

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 281 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-11-25, serverInfo.name nulegal-recht.

  • Pass
    Lists tools

    tools/list returned 11 tools.

  • Pass
    Current protocol

    Negotiated 2025-11-25. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 265 ms over 2 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 279 ms over 2 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    2 of 2 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Pass
    Stable tool list

    No tool was removed and no required parameter was added in the last 30 days.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Fail
    Parameters documented

    37 of 52 parameters have a description (71%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Fail
    Website matches publisher

    The website host does not match the reverse-domain namespace.

  • Pass
    Source repo linked

    A repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-11-01T12:07:17.597959Z, within 180 days.

  • Not measured
    Open-source licence

    The GitHub licence lookup has not returned an OSI result yet.

Start using nu:legal Deutsches Recht

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

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

Capabilities

Tools 11

get_lawyer

One lawyer's profile by `id` from search_lawyers: the official register entry with the date it was checked (chamber, admission, firm, office address, phone, fax, e-mail, website, beA id), Fachanwalt titles, contact data, languages, focus areas, opening hours and ratings per platform with the combined score. It holds what the public profile page (`profile_url`) shows, no more. Example: {"id": "8a0fa1b2c3d4e5f6"}

Discovered
getChanges

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.

Discovered
getCoverage

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: {}

Discovered
getNorm

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"}

Discovered
listCasePassages

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}

Discovered
listCitedAuthorities

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"}

Discovered
listCitingDecisions

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"}

Discovered
listNormVersions

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"}

Discovered
resolveIdentifiers

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"]}

Discovered
search

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"}

Discovered
search_lawyers

Find lawyers in Germany in the official register of the Bundesrechtsanwaltskammer. Give `city` (a German city or place; English names such as Munich or Cologne work; a 5-digit postcode is searched 10 km around, a smaller place 25 km), `name` (a lawyer or a firm), or both. Narrow with `area`, one of the 24 Fachanwalt areas in German or English ('Arbeitsrecht' or 'employment law', 'Strafrecht' or 'criminal law'), and `language` ('Türkisch' or 'Turkish'). Lawyers holding the Fachanwalt title for the area come first, then distance (postcode and place searches), then the combined rating. No paid placement; the order is no quality judgement. Next page: pass `next_offset` as `offset`. Each result has an `id` for get_lawyer and a `profile_url` to show the user. In-house lawyers (Syndikusrechtsanwälte) and lawyers who left the bar are not listed. Example: {"city": "Köln", "area": "Strafrecht", "language": "Arabic"}

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected281 ms11
Connected248 ms11