Skip to main content
Glama
README.md
# lu-eli-mcp

<!-- mcp-name: io.github.matematicsolutions/lu-eli-mcp -->


## Install (one command)

Published on PyPI + MCP Registry (`io.github.matematicsolutions/lu-eli-mcp`). Run without cloning:

```bash
uvx lu-eli-mcp
```

Configure your MCP client (stdio):

```json
{ "mcpServers": { "lu-eli-mcp": { "command": "uvx", "args": ["lu-eli-mcp"] } } }
```

### Windows 11 with Smart App Control

Smart App Control blocks unsigned executables, which covers `uvx.exe`, `pip.exe`
and the `lu-eli-mcp.exe` launcher that pip writes at install time. The `python.exe` and
`py.exe` from the python.org installer are signed by the Python Software
Foundation, so running the module through the interpreter works:

```bash
python -m pip install lu-eli-mcp
python -m lu_eli_mcp
```

`pip.exe` is blocked for the same reason, so install with `python -m pip`, not
`pip install`. If `python` is not on PATH, use the Windows launcher: `py -3 -m lu_eli_mcp`.

```json
{ "mcpServers": { "lu-eli-mcp": { "command": "python", "args": ["-m", "lu_eli_mcp"] } } }
```

Do not turn Smart App Control off to work around this - it cannot be re-enabled
without reinstalling Windows.

Building from source: see [Install](#install).

An MCP server for **Luxembourg legislation** via [Legilux](https://legilux.public.lu) open data
(`data.legilux.public.lu`). It fetches act metadata and full Akoma Ntoso text with verifiable
citations. Part of the **eu-legal-mcp** line of national legal connectors by
[MateMatic](https://matematic.co).

Legilux is genuinely **ELI-native**: every act is addressed by its ELI and described as jolux RDF
over a FRBR model (Work / Expression / Manifestation), with full text as Akoma Ntoso XML. Every
response carries a native `eli_uri`, a `human_readable_citation` and a resolvable `source_url`.

> **Read-only.** The server only queries Legilux and writes a local audit log. It never modifies
> official text.

## Tools

| Tool | What it does |
| --- | --- |
| `lu_get_act(eli)` | Metadata for an act by its ELI (full URI or bare `eli/...` path). Returns the native `eli_uri`, title, dates, in-force status, available languages / manifestations, and the act's `cites` / `modifies` / `repeals` links. |
| `lu_get_text(eli, language, file_format)` | Verbatim text in one `language` (default `fr`) and `file_format` (default `xml`, Akoma Ntoso). |
| `lu_coverage()` | Declare what this connector covers, when each family was captured, and - explicitly - what it does NOT cover. Every gap carries a fallback. |

There is **no free-text search**: Legilux exposes no HTTP search endpoint. Discover acts by ELI
coordinates (from legilux.public.lu) or by following the `cites` / `modifies` / `repeals` ELIs that
`lu_get_act` returns. Luxembourg is multilingual, so titles and text may be French or German; the
`languages` field shows what exists for a given act.

## Configuration

Legilux is keyless. Configuration is optional:

| Variable | Meaning |
| --- | --- |
| `LU_ELI_BASE_URL` | Legilux data host (default `https://data.legilux.public.lu`). |
| `LU_ELI_CACHE_DIR` | Disk cache dir (default `~/.matematic/cache/lu-eli`). |
| `LU_ELI_AUDIT_DIR` | Audit log dir (default `~/.matematic/audit`). |

Copy `.mcp.json.example` to your MCP client config.

## Install

```bash
py -3.13 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"   # Windows
# or: python -m pip install -e ".[dev]"                  # POSIX
```

## Tests

```bash
pytest tests/test_instructions_drift.py tests/test_parse.py   # offline
pytest tests/test_smoke.py -v                                 # live, hits Legilux
```

## Licence

Apache-2.0. Legilux content is © the Grand Duchy of Luxembourg; this software only retrieves and
cites it.

TDQS

A3.9/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: fetching metadata, fetching verbatim text, and declaring coverage/gaps. There is no overlap or ambiguity between them, so an agent can easily select the right tool for the task.

Naming Consistency4/5

All tools share the 'lu_' prefix, and two use the verb_noun pattern (get_act, get_text). However, 'lu_coverage' uses a noun directly rather than a verb, creating a minor deviation. The pattern is still readable and predictable overall.

Tool Count4/5

At 3 tools, the set is small but well-scoped for a read-only Luxembourg legislation connector. Each tool fills a necessary role, though a search/browse tool could be expected; the coverage tool partially compensates by documenting gaps.

Completeness4/5

The connector covers core operations: fetching metadata and full text, plus an explicit gaps/coverage tool to prevent false negatives. Missing a search or listing capability is a minor gap, but the coverage tool's fallbacks mitigate this.

Maintenance

ActivityMaintained
ResponsivenessNo issues