resolve
Resolve a Luxembourg legal-act identifier or a hash-pinned permalink to the work and expression it names.
identifierrequired
io.github.SFHAJJIPublished by GitHub account SFHAJJIv1.2.0Updated Nov 2, 2026
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
Remote MCP server for dated Luxembourg and EU law: resolve acts, read articles as of a date, diff versions and check provenance.
Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.
Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.
Read https://sourceweft.com/mcp/io.github.SFHAJJI%2Flex/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.Add this to your client's mcpServers config.
{
"mcpServers": {
"lex-temporal-luxembourg-and-eu-law": {
"type": "http",
"url": "https://law.soufien.lu/mcp"
}
}
}Lex shows the published text of Luxembourg and European Union law as it stood on a date, article by article, with the official source, the text's hash and a permalink. It is served at https://law.soufien.lu (open since 27 October 2026), in French and English, over the pages, a REST API and an MCP server on one origin. It does not give advice, apply the law to a situation, make its own consolidation or let a model choose an act or rank results.
How it is built, in short: the publishers' files (Formex XML from the Publications Office, Akoma Ntoso from Legilux) are parsed into relational SQLite indexes (works, dated versions and their validity intervals, articles, hashes, publisher relations), built twice and compared byte for byte; questions are parsed by deterministic parsers (ELI, CELEX, citations, dates); retrieval goes by structure first (act, version on a date, article), then lexical search over the articles' text; every answer is a typed envelope and every refusal a typed code with a mandatory payload. Releases are reproducible, signed images, checked against the release serving before them. An assistant is built to a typed answer contract (the model only plans; code validates and quotes) and is switched off until its gates pass.
Where to read more: STATUS.md (what is served, what is next), docs/OPERATING.md (how it
runs), LAUNCH-CONTRACT.md (the acceptance list), and on the site itself the Developers page and
"What this site holds". Work starts from v3/integration; main is the legacy line.
Source: README.md at commit a741573
Resolve a Luxembourg legal-act identifier or a hash-pinned permalink to the work and expression it names.
identifierrequiredThe state of a Luxembourg act applicable on a date (publisher), with its articles; for an EU act, the wording dated at or before the date (an EU wording date, never an applicability date).
daterequiredlanguageidentifierrequiredEvery state of a Luxembourg act the index holds, in publisher applicability order; for an EU act, every wording its census discovered, in wording-date order.
languageidentifierrequiredThe history of one article of a Luxembourg act across its states.
anchorrequiredlanguageidentifierrequiredThe article-level difference between the states of a Luxembourg act on two dates.
date_torequiredlanguagedate_fromrequiredidentifierrequiredThe Luxembourg states that began in a period, for a work or across the index.
limitdate_torequiredlanguagedate_fromrequiredidentifierThe Luxembourg works with a state applicable on a date.
daterequiredlimitlanguageidentifierafter_work_keyWith no work named, first read the query as an exact reference (an ELI, a CELEX, an EU act's name, a Memorial citation, a historical identifier, a permalink, or a citation of an article of an act at a date) and answer the address its act opens at, the acts it may name, or a typed refusal; otherwise search the held Luxembourg article text its rights admit (text they withhold is not matched), strict or relaxed, with the quotes that answer; for one EU work named by identifier, its held wording.
datemodeafterlimitqueryrequiredlanguagerequiredidentifierWhat this mount holds and serves, named, and what it does not.
languageThe retained sources, rule profiles and digests behind a Luxembourg state.
daterequiredlanguageidentifierrequiredThe work record of a Luxembourg act as the index holds it; for an EU work named by identifier, its held expressions from the EU index.
languageidentifierrequiredThe references the publisher wrote in the text of a Luxembourg state's articles.
daterequiredafterlimitanchorlanguageidentifierrequiredThe references, in any held Luxembourg state, whose target is exactly this work.
afterlimitidentifierrequiredVerify a hash-pinned permalink against the state digest the index holds, or read the current digests to pin.
languageidentifierrequiredThe reference edges of a Luxembourg work in both directions, as one ordered, paged list.
dateafterlimitlanguagedirectionidentifierrequiredWhat a quote of a Luxembourg state needs, one bounded page at a time (at most 50 articles and 96 KiB of text; page or article chooses the page, contents adds the table of contents): each article's text with its digests, the state's permalink, digests, sources and official identities, composed under the rights rule; for an EU act, the same for the wording of the date.
daterequiredpagearticlecontentslanguageidentifierrequiredThe publisher's typed facts about a Luxembourg work, verbatim: document type, RDF types, legal value, responsible body, historical identifiers, publication and document dates.
languageidentifierrequiredThe publisher's manifestations of a Luxembourg work's expressions with their formats and items, the retained one marked with its body digest.
formatlanguageidentifierrequiredThe publisher's force assertions about a Luxembourg work (its inForceStatus, dateEntryInForce and dateNoLongerInForce facts), verbatim, beside the state applicable on a date, with one fixed reading of the dates.
daterequiredlanguageidentifierrequiredThe Luxembourg works this mount holds, one ordered and paged list with their identifiers, languages, state dates and the publisher's document types; filter by type or language.
typeafterlimitlanguageThe contained assistant (Decisions 51 and 91): every question answers the typed presentation result assistant_v3_unavailable, naming the deterministic operations that answer from held law; no model answers.
questionrequiredThe Luxembourg event log, polled by cursor, at least once: a genesis log holds one first_sighting per held state; a chained log adds each later build's comparison events; each build's time, never an observation time.
aftereventlimitThe past dated answers a publisher revision invalidated, enumerated from the log's revising events; a genesis log holds none, and the answer says why rather than asserting that nothing drifted.
afterlimitidentifierThe state of a Luxembourg act applicable on a date (publisher) as one build of the mounted log held it, named by that build's index digest, with its build time as an upper bound on observation; a time refuses, since no observation time is held.
atdaterequiredlanguagesnapshotidentifierrequired100% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
dotnet test Lex.V3.slnx --configuration Releasenpm test --prefix webnpm run build --prefix webpwsh -File eng/verify-v3-tree.ps1