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

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

An MCP server for **Belgian legislation** via [Moniteur Belge / Belgisch Staatsblad]
(https://www.ejustice.just.fgov.be), the official gazette of the Belgian Federal Public Service
Justice. It fetches act metadata and full text by ELI coordinates, with verifiable citations.
Part of the **eu-legal-mcp** line of national legal connectors by [MateMatic](https://matematic.co).

Belgian legislation is addressed by ELI coordinates - `type` / `year` / `month` / `day` / `numac`
(the Belgian legislative numbering system) - at
`https://www.ejustice.just.fgov.be/eli/{type}/{yyyy}/{mm}/{dd}/{numac}/justel`. Every response
carries a native `eli_uri`, a `human_readable_citation` and a `source_url`.

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

> **Belgium is trilingual** (French / Dutch / German). `human_readable_citation` defaults to the
> French form by LDH convention; use `be_get_text(language=...)` for Dutch (Belgisch Staatsblad)
> or German. See CONSTITUTION.md Art. 4 for the full caveat.

## Tools

| Tool | What it does |
| --- | --- |
| `be_get_act(doc_type, year, month, day, numac)` | Metadata for an act by its ELI coordinates. `doc_type` is one of `loi`, `decret`, `ordonnance`, `arrete`, `constitution`. Returns the native `eli_uri`, title, source authority, publication date, entry-into-force date, table of contents, and the citation contract. |
| `be_get_text(doc_type, year, month, day, numac, language="fr")` | The verbatim consolidated text ("Texte"/"Tekst" section) in `fr` (default), `nl` or `de`. |
| `be_list_year(doc_type, year)` | Browse a year's listing for one `doc_type`, to discover NUMAC coordinates. Titles in this listing are best-effort (may be `None`); call `be_get_act` for the authoritative title. |
| `be_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**: ejustice.just.fgov.be exposes no keyword-search API. Discover
acts by ELI coordinates (from a citation you already hold) or by browsing `be_list_year`.

## Configuration

ejustice.just.fgov.be is keyless. Configuration is optional:

| Variable | Meaning |
| --- | --- |
| `BE_ELI_BASE_URL` | ejustice host (default `https://www.ejustice.just.fgov.be`). |
| `BE_ELI_CACHE_DIR` | Disk cache dir (default `~/.matematic/cache/be-eli`). |
| `BE_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
```


### Windows 11 with Smart App Control

Smart App Control blocks unsigned executables, which covers `uvx.exe`, `pip.exe`
and the `be-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 be-eli-mcp
python -m be_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 be_eli_mcp`.

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

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

## Tests

```bash
pytest tests/test_instructions_drift.py tests/test_parse.py   # offline
pytest tests/test_smoke.py -v                                 # live, hits ejustice.just.fgov.be
```

## Licence

Apache-2.0. Moniteur Belge / Belgisch Staatsblad content is © the Belgian federal state; this
software only retrieves and cites it. See CONSTITUTION.md Art. 1 for a note on the licence status
of the source data (widely described as CC0 by third-party catalogs; not independently
re-verified against ejustice.just.fgov.be's own terms page in this project).

TDQS

A3.6/5.0

Scored across 3 tools

Disambiguation5/5

Each tool serves a distinct purpose: fetching metadata, fetching text, and browsing year listings. No overlap in functionality.

Naming Consistency4/5

All tools follow a 'be_verb_noun' pattern (be_get_act, be_get_text, be_list_year). Consistent prefix and verb usage, though 'year' as a noun slightly diverges from the resource type pattern.

Tool Count4/5

With 3 tools, the server is minimal but covers a basic workflow for Belgian legislation. The count is appropriate for a focused domain, though a small set may limit flexibility.

Completeness3/5

The server covers metadata retrieval, text retrieval, and year browsing. However, it lacks search or filter capabilities, which are common in legal databases, leaving some discovery gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues