Skip to main content
Glama

dk-eli-mcp

An MCP server for the Danish Retsinformation legal database (retsinformation.dk). It fetches Danish legislation as LexDania 2.1 XML behind native ELI URIs, with verifiable citations.

Part of the MateMatic eu-legal-mcp production line - after PL, DE, AT, ES, FI, IE, NL, SE, FR and LU. Same citation contract, Retsinformation source. Denmark is ELI-native: every document has a stable data.europa.eu/eli-typed identifier exposed as a retsinformation.dk/eli/... URL.

Scope. This MVP grounds Danish documents by ELI coordinate (year + number in the lta collection = Lovtidende A) or by accession number, and lists documents changed on a date. The API is path-based, not keyword search. It covers laws (LOV), consolidated laws (LBK), executive orders (BEK), circulars (CIR) and guidelines (VEJ). Language: Danish. Every response carries a dataset_note.

Licence of the data. Danish legislation in Retsinformation is official public information published as Open Data (keyless). This connector relays it with attribution and a source_url.

The tools

Tool

What it does

dk_get_act

Metadata for a document by year + number, or by accession.

dk_get_text

Full LexDania XML of a document (verbatim official text).

dk_recent_changes

Documents changed on a given date (harvest API).

dk_coverage

Declare what this connector covers, when each family was captured, and - explicitly - what it does NOT cover. Every gap carries a fallback.

Every response carries the contract: eli_uri (a full ELI URL, e.g. https://www.retsinformation.dk/eli/lta/2018/502), human_readable_citation (e.g. Databeskyttelsesloven (LOV nr. 502 af 23/05/2018)), and source_url.

Related MCP server: Danish Law MCP Server

Install

Run it with no install step (once published to PyPI):

uvx dk-eli-mcp

Or from source:

cd dk-eli-mcp
pip install -e .

Configure (Claude Code / any MCP client)

{
  "mcpServers": {
    "dk-eli-mcp": { "command": "dk-eli-mcp" }
  }
}

Windows 11 with Smart App Control

Smart App Control blocks unsigned executables, which covers uvx.exe, pip.exe and the dk-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:

python -m pip install dk-eli-mcp
python -m dk_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 dk_eli_mcp.

{ "mcpServers": { "dk-eli-mcp": { "command": "python", "args": ["-m", "dk_eli_mcp"] } } }

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

Environment:

  • DK_ELI_BASE_URL - default https://www.retsinformation.dk

  • DK_ELI_API_URL - default https://api.retsinformation.dk (harvest API)

  • DK_ELI_CACHE_DIR - default ~/.matematic/cache/dk-eli

  • DK_ELI_AUDIT_DIR - default ~/.matematic/audit

No API key. Retsinformation open data is keyless.

The harvest API behind dk_recent_changes is only available 03:00-23:45 Danish time. Outside that window the tool returns an upstream_error; an empty list during the window means nothing changed on that date.

Governance

  • Public data only - read-only against Retsinformation; no client data leaves the machine.

  • Audit log - every tool call appends one JSON line to ~/.matematic/audit/dk-eli-mcp.jsonl.

  • Vendor-neutral - talks only to retsinformation.dk; no LLM provider, no telemetry.

  • Verifiable citations - every response is independently checkable via source_url.

See CONSTITUTION.md and DISCOVERY.md.

Tests

pip install -e ".[dev]"
pytest tests/test_instructions_drift.py tests/test_parse.py -v   # offline
pytest tests/test_smoke.py -v                                    # hits live Retsinformation

Licence

Apache-2.0. © Matematic Solutions / Wieslaw Mazur.

Available Tools

4 tools
dk_coverageA
Read-onlyIdempotent

Declare what this connector covers, how it is sourced, and what it does NOT cover.

Call this before telling a user that the law "does not contain" something, and whenever a search comes back empty: the absence may be a gap in this connector rather than in the law. Every gap carries a fallback saying where to look instead.

Returns: Coverage with families, an as-of note, and a non-empty list of known gaps.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo
familiesNo
as_of_noteYesStates what the dates mean, and what they do not promise.
known_gapsNoNever empty. An empty list would mean 'not checked', not 'no gaps'.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint), the description adds important behavioral context: absence might be a connector gap rather than a gap in the law, and every known gap includes a fallback for where to look instead. This meaningfully informs the agent's interpretation of empty results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: it states the core purpose first, follows with concrete invocation conditions, and closes with the return type. Every sentence earns its place without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter metadata tool, the description fully covers what the tool does, when to use it, and what it returns. The output schema handles the detailed return structure, and the annotations cover safety and idempotence, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is an empty object with 100% coverage, so there is nothing for the description to add about parameters. The baseline of 4 applies because parameter semantics are not applicable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it declares what the connector covers, how it is sourced, and what it does NOT cover. This clearly distinguishes it from sibling tools like dk_get_act and dk_get_text, which retrieve specific content rather than coverage metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: call it before telling a user the law 'does not contain' something, and whenever a search returns empty. It does not explicitly name excluded scenarios or alternatives, but the conditions are clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dk_get_actA
Read-onlyIdempotent

Fetch Danish act / order metadata by ELI coordinate or accession.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoe.g. ``2018`` (use together with ``number``).
numberNoe.g. ``502`` (use together with ``year``).
accessionNoe.g. ``"A20180050230"`` (alternative to year + number).

Output Schema

ParametersJSON Schema
NameRequiredDescription
yearNo
titleNo
numberNo
statusNo
eli_uriNo
ministryNo
source_urlNo
date_signedNo
announced_inNo
dataset_noteNo
document_typeNo
popular_titleNo
date_publishedNo
accession_numberNo
human_readable_citationNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds that it fetches 'metadata', implying no side effects. However, it does not disclose potential missing data behavior or authentication requirements. Given annotation coverage, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no extraneous information. It efficiently communicates the core purpose and method.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a complete schema (100% coverage), annotations, output schema presence, and only three siblings, the description covers the tool's purpose and usage adequately. The output schema will explain return values, so no further description is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with each parameter having a description. The description adds overall context (by ELI coordinate or accession) but does not provide additional parameter-specific details beyond the schema. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Fetch'), the resource ('Danish act / order metadata'), and the query method ('by ELI coordinate or accession'). It distinguishes from siblings: dk_get_text fetches full text, dk_recent_changes fetches changes, so this tool is specifically for metadata lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to get metadata given an ELI coordinate or accession) but does not explicitly mention when not to use it or suggest alternatives (e.g., when full text is needed, use dk_get_text). The guidance is clear but incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dk_get_textA
Read-onlyIdempotent

Fetch the full LexDania XML of a Danish document (verbatim official text).

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoe.g. ``2018`` (use together with ``number``).
numberNoe.g. ``502`` (use together with ``year``).
accessionNoe.g. ``"A20180050230"`` (alternative to year + number).

Output Schema

ParametersJSON Schema
NameRequiredDescription
yearNo
formatNo
numberNo
contentNo
eli_uriNo
byte_sizeNo
source_urlNo
dataset_noteNo
accession_numberNo
human_readable_citationNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds format detail (LexDania XML) but no additional behavioral traits like permissions or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence of 12 words, highly concise with no wasted words. Perfectly front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple fetch tool with optional parameters and an output schema, the description covers the essential aspects (what it returns, origin). Could mention that it returns XML or document retrieval, but sufficient given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the input schema already provides sufficient descriptions for all three parameters (year, number, accession). The description adds no new semantic meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Fetch'), resource ('full LexDania XML of a Danish document'), and quality ('verbatim official text'), making it highly specific and distinguishable from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus the siblings (dk_get_act, dk_recent_changes). No explicit conditions or alternatives mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dk_recent_changesA
Read-onlyIdempotent

List Danish documents changed on a given date (harvest API).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes``YYYY-MM-DD`` (e.g. ``"2026-06-26"``). The harvest API is available 03:00-23:45 Danish time; an empty list is a valid "nothing changed" result.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
itemsNo
totalYes
dataset_noteNo
availability_noteNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint true, and destructiveHint false. The description adds that the harvest API is available 03:00-23:45 Danish time and that an empty list is a valid response, which is useful beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently communicates the tool's purpose and source. No unnecessary words, front-loaded with the key action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, high schema coverage, and detailed annotations, the description is complete enough. The purpose, parameter constraints, and behavioral traits are all covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the date parameter already having a detailed description including format, example, and availability caveats. The tool description adds minimal extra value ('harvest API' is already in the schema). Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List'), resource ('Danish documents'), condition ('changed on a given date'), and source ('harvest API'). This distinguishes it from sibling tools like dk_get_act and dk_get_text, which likely retrieve specific documents rather than lists of changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for listing changes on a specific date, but does not explicitly state when to use it or when to prefer siblings. The context is clear given sibling names, but no exclusion criteria are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: metadata retrieval, full-text retrieval, coverage declaration, and change listing. No two tools overlap in what they return, making misselection unlikely.

Naming Consistency4/5

All tools share the dk_ prefix, and most follow a verb_noun pattern (dk_get_act, dk_get_text). dk_coverage and dk_recent_changes deviate slightly by using nouns rather than verbs, but the pattern remains readable and predictable.

Tool Count4/5

With four tools, the set is compact but sufficient for its narrow scope. It could benefit from a search tool, but the count is reasonable and each tool earns its place.

Completeness4/5

The core needs are covered: fetch metadata, fetch full text, list recent changes, and explicitly declare coverage gaps. Minor gaps exist—such as no search-by-keyword or version-history tool—but the dk_coverage tool mitigates uncertainty and provides fallbacks.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/matematicsolutions/dk-eli-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server