# Experimental Legal Grounding (remote · legal-grounding-199120533535.europe-north2.run.app)

Experimental GDPR grounding: rules, preconditions, exceptions, exact quotes, and citation checks.

- Trust score: 54/100 (low)
- Change this week: +7
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `legal-grounding-199120533535.europe-north2.run.app`: 54/100 (this document), [markdown](https://verifymcp.io/servers/tokenfix-legal-grounding/legal-grounding-199120533535.md), [page](https://verifymcp.io/servers/tokenfix-legal-grounding/legal-grounding-199120533535)

## Channel facts

- Endpoint: `https://legal-grounding-199120533535.europe-north2.run.app/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.4.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 3 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 24/100
  - AI-judged instruction clarity (poor).
  - Context-footprint check failed: tool/resource definitions use about 1583 tokens (~527/item across 3 items; 3 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http tokenfix-legal-grounding https://legal-grounding-199120533535.europe-north2.run.app/mcp
```

### Codex

```toml
[mcp_servers.tokenfix-legal-grounding]
url = "https://legal-grounding-199120533535.europe-north2.run.app/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tokenfix-legal-grounding": {
      "type": "remote",
      "url": "https://legal-grounding-199120533535.europe-north2.run.app/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add tokenfix-legal-grounding --url https://legal-grounding-199120533535.europe-north2.run.app/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  tokenfix-legal-grounding:
    url: "https://legal-grounding-199120533535.europe-north2.run.app/mcp"
```

### Other

```json
{
  "mcpServers": {
    "tokenfix-legal-grounding": {
      "type": "http",
      "url": "https://legal-grounding-199120533535.europe-north2.run.app/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 54, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 53, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [functional] Schema quality: fair → poor

### 2026-07-31 (score 53, +4)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 49, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 49, +2)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “validate_claims” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 453 → 526
- [functional] Schema quality: poor → fair
- [cosmetic] “validate_claims” added an optional parameter “strict_linkage”

### 2026-07-28 (score 47, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “retrieve_evidence” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 402 → 453

### 2026-07-27 (score 47, −5)

- [security] Tool “retrieve_evidence” rewrote its description, which is the text the model reads
- [security] Tool “validate_claims” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 320 → 402
- [functional regression] Schema quality: 320 → 369
- [functional improvement] Stability: unverified → 0.03
- [functional] Schema quality: good → poor
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 52)

First indexed and scored.

## MCP tools (3)

### `get_catalog` (~118 tokens)

Vocabulary map of the corpus: obligation clusters (with support status),
    regulation terms, everyday-phrase bridges, concept bridges (recurring
    legal phrases the corpus uses but never defines — "public interest",
    "high risk" — routed to their operative clusters), and corpus boundaries
    (topics governed by law OUTSIDE this corpus, e.g. cookie consent under
    ePrivacy). Call this first to translate a user's question into
    cluster/term selectors, and to learn where honest answers require
    referral rather than assertion.

Output parameters:

- `result` (string)

### `retrieve_evidence` (~420 tokens)

Evidence packets for legal topics. Selectors (union): cluster ids
    and/or term keys from get_catalog, and/or free_text (deterministic
    lexical+bridge matching only — no semantic search). Each packet returns
    primary rules PLUS their preconditions and exceptions with byte-exact
    quotes and stable rule ids. Every served rule includes its enumerated
    items and conditions with citable ids. Explicit term selectors return
    their definitions in packets or term_definitions. related_clusters names
    approved adjacent topics and explains each link. Mandatory packet content
    is never truncated.
    Use every part: presenting a duty without its packet's exceptions or
    preconditions will fail validate_claims. corpus_coverage tells you when
    the governing law is outside the corpus — qualify or refer, don't guess.
    If free_text matches nothing exactly, the response carries
    routing_candidates: clusters whose corpus vocabulary (section headings,
    cluster names, concept labels) overlaps your text. Inspect
    matched_vocabulary, choose semantically, and re-request that cluster
    explicitly — the service names candidates, it never guesses for you.
    Measured host loop (raises answerable coverage 25%→75%): if no packet
    returns, ask the user ONE intent question, then re-request with BOTH the
    chosen cluster AND the clarified free_text — combined selectors surface
    supplemental rules (e.g. Article 6(4) compatibility) that either selector
    alone misses. When clusters and free_text are combined, the text refines
    only within the explicit clusters and never adds another cluster. Before
    answering, check the substantive rule you need is
    actually in the response; if the packet is unavailable or incomplete,
    say so and refer — do not fill the gap from model memory.

Input parameters:

- `clusters`
- `free_text`
- `max_supplemental_rules_per_packet` (integer)
- `role`
- `terms`

Output parameters:

- `result` (string)

### `validate_claims` (~889 tokens)

Verify a drafted answer's legal citations before presenting it.
    Each claim: {claim_id, assertion, cluster_id, claim_type, claim_concept,
    citations: [{rule_id, quote}], propositions:
    [{duty_rule_ids, exception_rule_ids}]}. ALWAYS supply cluster_id for legal
    propositions — v0.3.8: WITHOUT it a claim cannot be grounded at all
    (verdict unclustered_claim), because membership, packet preconditions,
    required conditions and corpus-boundary warnings are all
    cluster-scoped. claim_type "exception_scope" is HOST-DECLARED, never
    inferred: use it only for a claim about an exception itself; it is valid
    only when every citation is exception-typed (else the claim receives
    invalid_claim), it exempts the exception-only/unanchored/precondition
    checks, and it is flagged in the result as
    host_declared_exception_scope. Any skipped ids are listed in
    exempted_by_declaration. Consumers MUST inspect that flag and
    treat a grounded declared claim as resting on the host's own declaration,
    not on ordinary grounding. claim_concept (optional) requires a
    concept-labeled cluster. concept_check lists matched, mismatched, and
    unlabelled citations; use all_citations_match as the strict signal.
    Verdicts (first match): invalid_claim (this claim violated a claim-scoped
    declaration rule; sibling claims still get results), unknown_reference
    (fabricated id), misquoted (canonical quote returned — fix and
    re-validate), wrong_provision (citation off-topic for the cluster),
    wrong_concept (you declared claim_concept and no cited labeled rule
    carries it — recheck your citations or your concept), outside_corpus
    (abstain/refer to the named external law),
    qualified_by_exception / qualified_by_precondition (add the returned
    exception/precondition citations and re-validate, or qualify your prose),
    exception_only_citations (ALL citations are carve-out rules and claim_type
    is not exception_scope; they cannot su…

Input parameters:

- `claims` (array, required)
- `strict_linkage` (boolean)

Output parameters:

- `result` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/tokenfix-legal-grounding/legal-grounding-199120533535#diagnostics

## Score history

- 2026-08-03: 54
- 2026-08-02: 53
- 2026-08-01: 53
- 2026-07-31: 53
- 2026-07-30: 49
- 2026-07-29: 49
- 2026-07-28: 47
- 2026-07-27: 47
- 2026-07-26: 52

## Links

- Remote endpoint: https://legal-grounding-199120533535.europe-north2.run.app/mcp
- Changelog RSS feed: https://verifymcp.io/servers/tokenfix-legal-grounding/legal-grounding-199120533535/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/tokenfix-legal-grounding/legal-grounding-199120533535/changelog.json
- HTML version of this page: https://verifymcp.io/servers/tokenfix-legal-grounding/legal-grounding-199120533535
