dk-eli-mcp
This server provides read-only access to Danish legislation from the Retsinformation legal database via ELI URIs. No API key is required (open data), and all content is in Danish.
dk_get_act — Fetch metadata for a Danish legal document by ELI coordinate (year + number) or accession number. Returns title, document type, status, ministry, signing/publication dates, ELI URI, human-readable citation, and source URL.
dk_get_text — Retrieve the full verbatim official text in LexDania 2.1 XML format, identified by year+number or accession. Returns XML content, byte size, ELI URI, citation, and source URL.
dk_recent_changes — List all documents changed on a given date (YYYY-MM-DD) via the harvest API, returning ELI URIs, accession numbers, document types, change reasons, and a total count. Only available 03:00–23:45 Danish time.
Supported document types: Laws (LOV), consolidated laws (LBK), executive orders (BEK), circulars (CIR), and guidelines (VEJ).
Every response includes a verifiable source_url and eli_uri. All tool calls are audit-logged.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dk-eli-mcpList documents changed on 2024-03-14"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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+numberin theltacollection = 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 adataset_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 |
| Metadata for a document by year + number, or by accession. |
| Full LexDania XML of a document (verbatim official text). |
| Documents changed on a given date (harvest API). |
| 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-mcpOr 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_mcppip.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- defaulthttps://www.retsinformation.dkDK_ELI_API_URL- defaulthttps://api.retsinformation.dk(harvest API)DK_ELI_CACHE_DIR- default~/.matematic/cache/dk-eliDK_ELI_AUDIT_DIR- default~/.matematic/audit
No API key. Retsinformation open data is keyless.
The harvest API behind
dk_recent_changesis only available 03:00-23:45 Danish time. Outside that window the tool returns anupstream_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 RetsinformationLicence
Apache-2.0. © Matematic Solutions / Wieslaw Mazur.
Available Tools
4 toolsdk_coverageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| families | No | |
| as_of_note | Yes | States what the dates mean, and what they do not promise. |
| known_gaps | No | Never empty. An empty list would mean 'not checked', not 'no gaps'. |
TDQS
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.
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.
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.
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.
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.
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_actARead-onlyIdempotent
Fetch Danish act / order metadata by ELI coordinate or accession.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | e.g. ``2018`` (use together with ``number``). | |
| number | No | e.g. ``502`` (use together with ``year``). | |
| accession | No | e.g. ``"A20180050230"`` (alternative to year + number). |
Output Schema
| Name | Required | Description |
|---|---|---|
| year | No | |
| title | No | |
| number | No | |
| status | No | |
| eli_uri | No | |
| ministry | No | |
| source_url | No | |
| date_signed | No | |
| announced_in | No | |
| dataset_note | No | |
| document_type | No | |
| popular_title | No | |
| date_published | No | |
| accession_number | No | |
| human_readable_citation | No |
TDQS
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.
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.
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.
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.
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.
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_textARead-onlyIdempotent
Fetch the full LexDania XML of a Danish document (verbatim official text).
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | e.g. ``2018`` (use together with ``number``). | |
| number | No | e.g. ``502`` (use together with ``year``). | |
| accession | No | e.g. ``"A20180050230"`` (alternative to year + number). |
Output Schema
| Name | Required | Description |
|---|---|---|
| year | No | |
| format | No | |
| number | No | |
| content | No | |
| eli_uri | No | |
| byte_size | No | |
| source_url | No | |
| dataset_note | No | |
| accession_number | No | |
| human_readable_citation | No |
TDQS
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.
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.
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.
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.
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.
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_changesARead-onlyIdempotent
List Danish documents changed on a given date (harvest API).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ``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
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| items | No | |
| total | Yes | |
| dataset_note | No | |
| availability_note | No |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
Resolve, search and verify legal citations against the official sources, with provenance.
Search UK Acts, Statutory Instruments, and legislation with full text retrieval
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
Search national and EU case law, legislation and regulation, with citations you can verify.
Related MCP Servers
- AlicenseAqualityFmaintenanceProvides access to 1,709 Icelandic statutes and 19,026 provisions with full-text search, citation validation, and EU/EEA law integration, enabling legal research and compliance checks through natural language queries.11931Apache 2.0
- AlicenseAqualityFmaintenanceEnables querying and analyzing Danish legislation, including search, citation validation, currency checks, and EU law integration, directly from AI assistants.15721Apache 2.0
- AlicenseAqualityAmaintenanceEnables AI agents to search and retrieve consolidated Swedish statutes (SFS) from the Riksdagen open data API, with verifiable citations and persistent identifiers.4Apache 2.0
- AlicenseAqualityBmaintenanceEnables access to Slovak legislation from the Collection of Laws via static.slov-lex.sk. Supports listing consolidated versions, retrieving act metadata, and fetching full text with verifiable citations.4Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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