# Lex — Temporal Luxembourg and EU Law (remote · law.soufien.lu)

Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.

- Trust score: 62/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-07

## Components

- remote · `law.soufien.lu`: 62/100 (this document), [markdown](https://verifymcp.io/servers/sfhajji-lex/law.md), [page](https://verifymcp.io/servers/sfhajji-lex/law)

## Channel facts

- Endpoint: `https://law.soufien.lu/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.1.0`

## 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-07.

- **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 10 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**: 71/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 1408 tokens (~140/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add --transport http sfhajji-lex https://law.soufien.lu/mcp
```

### Codex

```toml
[mcp_servers.sfhajji-lex]
url = "https://law.soufien.lu/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sfhajji-lex": {
      "type": "remote",
      "url": "https://law.soufien.lu/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sfhajji-lex --url https://law.soufien.lu/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  sfhajji-lex:
    url: "https://law.soufien.lu/mcp"
```

### Other

```json
{
  "mcpServers": {
    "sfhajji-lex": {
      "type": "http",
      "url": "https://law.soufien.lu/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-07 (score 62)

First indexed and scored.

## MCP tools (10)

### `as_of` (~187 tokens)

The state of one document as it stood on one date. Pure lookup, no ranking. mode=outline lists the provisions (articles/annexes) without text — use it first on long documents; mode=select returns only the named anchors' text; mode=full (default) returns the whole text. Every provision carries its own permalink and hash.

Input parameters:

- `anchors` (string): comma-separated provision anchors for mode=select, e.g. art_1er,art_33
- `date` (string, required): ISO date YYYY-MM-DD
- `language` (string): optional language code, e.g. fr
- `mode` (string): full | outline | select (default full)
- `work` (string, required): Work-level lex_id (publisher:workkey), version-level lex_id (version segment ignored), or verbatim publisher identifier. Unknown document -> call search first.

### `timeline` (~86 tokens)

Every state a document has been in: validity intervals and version keys, publisher-asserted.

Input parameters:

- `limit` (integer): max versions (default 100)
- `offset` (integer): pagination offset
- `work` (string, required): Work-level lex_id (publisher:workkey), version-level lex_id (version segment ignored), or verbatim publisher identifier. Unknown document -> call search first.

### `in_force_on` (~102 tokens)

The set of works in force on a date, computed from validity intervals at query time, deduplicated by work. Carries a mandatory population disclosure.

Input parameters:

- `date` (string, required): ISO date
- `document_type` (string): optional type code, e.g. CODE
- `limit` (integer): default 50
- `offset` (integer): pagination offset
- `publisher` (string): optional publisher id, e.g. lu-legilux

### `diff` (~102 tokens)

What changed between two dates for one work: which versions applied, and where both texts are held, retrieve them via as_of to compare.

Input parameters:

- `from_date` (string, required): ISO date
- `language` (string): language code
- `to_date` (string, required): ISO date
- `work` (string, required): Work-level lex_id (publisher:workkey), version-level lex_id (version segment ignored), or verbatim publisher identifier. Unknown document -> call search first.

### `search` (~255 tokens)

Filtered legal search. keyword is deterministic FTS5/BM25; hybrid adds the pinned local encoder and fixed RRF when verified vectors are mounted. No generative model participates. Returns hits WITHOUT body text; full state via as_of.

Input parameters:

- `act_form` (string): optional legal act form
- `as_of` (string): ISO date required when time_scope=as_of
- `binding_status` (string): optional binding status
- `document_type` (string): backward-compatible document type filter
- `domain` (string): optional reviewed EU domain id
- `fuzzy` (string): auto or off; visible fallback only
- `hierarchy` (string): optional normalized legal hierarchy
- `jurisdiction` (string): optional lu or eu
- `language` (string): optional language code
- `limit` (integer): default 10
- `publisher` (string): optional publisher id
- `query` (string, required): search terms
- `retrieval_mode` (string): keyword or hybrid; default keyword until activation
- `source_class` (string): optional source document class
- `time_scope` (string): all_versions or as_of
- `works` (string): optional comma-separated work ids: restrict search to these works

### `article_history` (~134 tokens)

Every distinct text ONE provision (article/annex) has had, as validity intervals — plus its lifecycle events (inserted/removed/renumbered, renumbering detected mechanically by identical text hash). The answer to "what did Article X say over its life / when did it change".

Input parameters:

- `anchor` (string, required): provision anchor, e.g. art_1er (find it via search or as_of mode=outline)
- `work` (string, required): Work-level lex_id (publisher:workkey), version-level lex_id (version segment ignored), or verbatim publisher identifier. Unknown document -> call search first.

### `provenance` (~55 tokens)

Proof chain for one lex_id: source URI, retrieval time, record/body hashes, event chain, corpus commit, index build, stamp signature.

Input parameters:

- `language` (string): optional
- `lex_id` (string, required): full lex_id

### `coverage` (~53 tokens)

What we hold and what we lack, tier by tier: counts, date ranges, history_begins, known gaps. This tool exists to say what we do NOT have.

Input parameters:

- `publisher` (string): optional publisher id

### `cited_by` (~129 tokens)

Which ARTICLES point at this law. The reverse of the cross-references the publisher writes into its own text ("modifie par la loi du 4 juin 2020"), captured at derive time. Answers "what depends on this law", "who amended it", "is anything still referring to it" — the question legal research is actually made of, and the one a search box cannot answer.

Input parameters:

- `limit` (integer): default 50
- `work` (string, required): the law being cited, e.g. lu-legilux:loi-2020-06-04-a476

### `changes_in_period` (~213 tokens)

ACROSS the corpus: which works gained new versions between two dates, how many each, and when — the aggregate counterpart of diff/timeline (which cover ONE work). Use for "what changed between 2025 and 2026", "which laws changed most during the pandemic", "what moved last month". order=by_churn ranks by number of new versions; by_date (default) lists most recently changed first.

Input parameters:

- `document_type` (string): optional type code(s), comma-separated; prefix with ! to exclude, e.g. !RECUEIL,!CODE_RECUEIL for instruments only
- `from_date` (string, required): ISO date, start of window (inclusive)
- `limit` (integer): default 20
- `offset` (integer): skip this many, for paging
- `order` (string): by_date (default) or by_churn
- `publisher` (string): optional publisher id
- `to_date` (string, required): ISO date, end of window (inclusive)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/sfhajji-lex/law#diagnostics

## Score history

- 2026-08-07: 62

## Links

- Remote endpoint: https://law.soufien.lu/mcp
- Repository: https://github.com/SFHAJJI/lex
- Changelog RSS feed: https://verifymcp.io/servers/sfhajji-lex/law.xml
- Changelog JSON feed: https://verifymcp.io/servers/sfhajji-lex/law.json
- HTML version of this page: https://verifymcp.io/servers/sfhajji-lex/law
