Server data from the Official MCP Registry
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
About
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
Remote endpoints: streamable-http: https://law.soufien.lu/mcp
Security Report
Valid MCP server (1 strong, 1 medium validity signals). No known CVEs in dependencies. Imported from the Official MCP Registry.
10 tools verified · Open access · No issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Permissions Required
This plugin requests these system permissions. Most are normal for its category.
How to Connect
Remote Plugin
No local installation needed. Your AI client connects to the remote endpoint directly.
Add this to your MCP configuration to connect:
{
"mcpServers": {
"io-github-sfhajji-lex": {
"url": "https://law.soufien.lu/mcp"
}
}
}Documentation
View on GitHubFrom the project's GitHub README.
Lex
Point-in-time retrieval of regulatory text. Regulators publish the current rule; every audit, investigation and dispute is about a past date. Lex keeps every version it has seen and answers "what did this say on 15 March 2022?" with the exact validity interval, the timeline, the instrument that changed it, and a hashed provenance record, and an honest, machine-readable refusal when it cannot know.
Live demo · Ask the AI · MCP endpoint · Dataset (CC-BY) · Examples · Architecture · Next architecture · Benchmarks · Verify it yourself · Program · Spec (D1-D64)
Try it in 30 seconds
Give any MCP-capable AI the full toolset, no key, no install:
claude mcp add --transport http lex https://law.soufien.lu/mcp
Modern clients such as VS Code and Cursor connect to the hosted endpoint directly:
{ "servers": { "lex": { "type": "http", "url": "https://law.soufien.lu/mcp" } } }
For a client that only accepts local stdio servers, bridge to the same hosted
endpoint with a pinned version of the third-party mcp-remote adapter (Node.js 18+):
npx -y mcp-remote@0.1.38 https://law.soufien.lu/mcp
The hosted endpoint is canonical: no legal corpus, vector files or Azure credentials are downloaded to the client. Lex also publishes its remote-server metadata to the official MCP Registry from GitHub Actions using OIDC. There is no Lex npm package yet; the command above is a compatibility bridge, not a second implementation.
Or ask the live site. A real answer, verbatim:
Q: What did CRR Article 92 require as capital ratios on 1 March 2020, and has that text changed since?
Quoted verbatim (Article 92(1)) from the CRR version in force on that date: "Subject to Articles 93 and 94, institutions shall at all times satisfy the following own funds requirements: (a) a Common Equity Tier 1 capital ratio of 4,5 %; (b) a Tier 1 capital ratio of 6 %; (c) a total capital ratio of 8 %." ,
eu-eurlex:32013r0575:2019-12-25(valid 2019-12-25 → 2020-06-26), permalink.Article 92 has had four distinct texts since 2013-2013-06-28 → 2021-06-28, 2021-06-29 → 2022-12-31, 2023-01-01 → 2024-12-31, 2025-01-01 onward, each with its own permalink and sha256.
Every claim in that answer came from a deterministic tool call (the trace is shown under each reply); the model never answers from its own memory. Do not take this file's word for it, the numbers above are checkable in one call, and if they ever drift from the live system, that is a bug worth reporting:
curl -s -X POST https://law.soufien.lu/mcp -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"article_history",
"arguments":{"work":"eu-eurlex:32013r0575","anchor":"art_92"}}}'
Who uses this
- A compliance officer checking which text of an obligation was in force on the date of the facts, with a permalink and a hash for the file.
- A legal-tech developer building RAG over law that must not hallucinate
versions: per-article chunks with
valid_from/valid_toto filter before similarity (dataset). - An AI agent using the MCP tools directly, the same tools the site's own AI uses, at the same endpoint.
- A researcher tracking how one article's text evolved across amendments
(
article_history: every distinct text state, dated).
What it never does
Lex answers what the rule was. It does not decide "were we compliant?", "does this apply to me?", or "what does this mean?", those are professional opinions. The evidence, index and MCP layers never generate or interpret legal text (fitness rule F10). The optional assistant may explain retrieved evidence, but it is visibly separate, carries the tool trace and is not part of the record.
Architecture (one screen)
APPS Lex.Ingest (CLI) Lex.Mcp (MCP server) Lex.Web (demo) Lex.Ask (AI loop)
DERIVED Lex.Derive, evidence -> per-article Markdown+JSON (immutable profiles: akn-lu/1, fmx4-eu/1, xhtml-eu/1)
ADAPTERS Lex.Sources.Legilux (Tier A, SPARQL) Lex.Sources.EurLex (Tier A, Cellar + Formex)
MODEL Lex.Law, Publisher, Work, Version, Expression, Observation. No publisher names.
FOUNDATION Lex.Temporal (interval algebra) Lex.Index (SQLite: filter-first, verified artifacts)
- One corpus repo per publisher; the corpus is human-readable JSON + git. The tree carries the legislative history,
git logcarries the ingest history, and the two are deliberately not the same (why). - Bitemporal: valid time is the publisher's; transaction time is ours, as append-only observation chains inside hashed content. Nothing is ever overwritten; publisher corrections become visible events.
- Two layers: verbatim publisher bytes (evidence) → deterministic
per-article extraction (consumption). Every derived article hash-chains to
the exact bytes the state published;
lex verify derivere-derives and byte-compares. - Filters before ranking, always, enforced by construction (a non-optional
FilterSeton the only query entry point). - Signed whole-artifact manifests (ECDSA P-256): a trust root pinned in the application verifies indexes, vectors, embedding assets, scope, benchmark and source commits before any file is mounted. The embedded index stamp remains public provenance, not its own trust root.
- Honest refusals:
no_version_for_date,anchor_not_in_version,outside_observed_window,text_withheld, a flagged wrong answer is still a wrong answer, so Lex refuses instead.
Current coverage
Luxembourg (Legilux, Tier A): every work and current version in the
publisher's Consolidation catalogue. Nothing in that collection is filtered
out by legal form. On 2026-08-06 the publisher returned 1,399 works and 4,638
current consolidation records, and the corpus contained all of them. Mounted
counts, dates, corpus commit and extraction-profile mix are read from the index
on the live coverage page, rather than copied
into product prose that becomes stale after the next publisher run.
The consolidation catalogue is not all Luxembourg law. The same official
endpoint exposes 150,187 resources classified as Act, including laws,
grand-ducal regulations, ministerial regulations and orders that may never have
received a consolidation record. That broad number also contains notices and
other material that should not all enter lawyer-facing search. The measured
boundary and the proposed normative-act increment are documented in
Luxembourg scope.
Where official XML exists, text is retained as verbatim Akoma Ntoso. The
deterministic pdf-lu/1 fallback handles eligible born-digital consolidated
PDFs and records that article boundaries came from typography rather than
publisher markup. The pipeline refuses thematic folder PDFs, whole-gazette
scans and fileless records as authoritative article text; those versions keep
their dates, source and hashes without pretending wording was extracted. Exact
text availability by legal form is reported from the mounted artifact on the
coverage page.
EU (EUR-Lex/Cellar, Tier A): a reviewed compliance shelf spanning data, digital, cyber, finance and energy law. The mounted index and live coverage page are the source of truth for work and version counts. Full text comes from the Publications Office's Formex 4 structural XML where served, including large consolidations the XHTML channel cannot carry. The present EU limit is scope, not format.
The derived dataset publishes its current counts and source commits in its release catalog. The broader Luxembourg original-act catalogue and approved EU scope are tracked by the temporal expansion program. Communal regulations are deliberately out of scope: 17,232 exist as published acts, none is ever consolidated, so there is no point-in-time history to hold. The fallback ladder for XML-less versions is spec D49.
Run it
# ingest (paced, sequential; official open-data channels only)
dotnet run --project src/Lex.Ingest -- ingest --publisher lu-legilux --corpus ../lex-corpus-lu-legilux
# derive the per-article layer, build the signed index
dotnet run --project src/Lex.Ingest -- derive --publisher lu-legilux --corpus ../lex-corpus-lu-legilux --out ../lex-articles
dotnet run --project src/Lex.Ingest -- index --corpus ../lex-corpus-lu-legilux --articles ../lex-articles \
--out indexes/index-lu-legilux.db --keyfile signing-key.pem
# web demo + MCP (stdio) locally
LEX_INDEX_DIR=indexes dotnet run --project src/Lex.Web
LEX_INDEX_DIR=indexes dotnet run --project src/Lex.Mcp
The generated key above is for local development only. Production publication uses GitHub OIDC to ask the non-exportable Azure Key Vault key to sign the whole-artifact manifest, then deploys a zero-traffic candidate revision.
MCP tools
as_of (full / outline / per-article select) · timeline · in_force_on ·
diff · search · article_history · provenance · coverage ·
cited_by · changes_in_period.
The same read-only tools cover Luxembourg and EU material. Search spans every
mounted publisher by default and can filter jurisdiction, date, hierarchy,
legal form, binding status, domain and language. Keyword retrieval is
deterministic FTS5/BM25. Hybrid adds the pinned local encoder and fixed rank
fusion when verified vectors are mounted; no generative model participates in
retrieval. coverage exists to say what Lex does not have, because a system
that cannot state its own gaps cannot be trusted with a completeness question.
Contributing
Issues and PRs welcome, the highest-leverage areas:
- A new publisher adapter (
ISourceAdapter, ~200 lines): any jurisdiction with an official machine-readable channel. The seam is publisher-pure by fitness test; adapters never touch files or git. - Eval cases (evals/cases.json): questions where the AI should construct better tool calls, or refuse better.
- Extraction improvements: profiles are immutable; improvements ship as a
new profile beside the old (see
fmx4-eu/1besidexhtml-eu/1).
Contributions are accepted under the Developer Certificate of Origin
(git commit -s).
Licence
Code: Apache-2.0 (LICENSE). The code licence does not extend
to corpus data or index artefacts, see each corpus repository's NOTICE
(three layers: official acts outside copyright / Lex's compilation rights /
code licence inapplicable). Derived dataset: CC-BY-4.0 (LU) and EU
reuse-with-attribution, licence inline in every file.
Support
This is free and open, and it stays that way whatever you decide. It is also not free to run: the live site, the nightly jobs and the storage sit on Azure infrastructure I pay for out of pocket, and I maintain it on my own time.
If it saved you an afternoon, you can buy me a coffee ☕ and put it towards the hosting bill. Starring the repo helps just as much, and costs nothing.
Reviews
No reviews yet
Be the first to review this server!
More Developer Tools MCP Servers
Git
Freeby Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
Toleno
Freeby Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
mcp-creator-python
Freeby mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.
MarkItDown
Freeby Microsoft · Content & Media
Convert files (PDF, Word, Excel, images, audio) to Markdown for LLM consumption
MCP Marketplace
Freeby mcp-marketplace · Developer Tools
Search and install MCP servers from inside your AI client.
FinAgent
Freeby mcp-marketplace · Finance
Free stock data and market news for any MCP-compatible AI assistant.
