Skip to main content
Glama
kimhjort

aria-mcp-trafik-dk

by kimhjort

aria-mcp-trafik-dk

A Model Context Protocol (MCP) server that exposes current Danish road traffic events and roadworks to AI assistants. Built for ARIA and shareable with the community.

Fully keyless — the data source is a public GCS-hosted JSON feed served by Vejdirektoratet as the backend for trafikkort.vejdirektoratet.dk (trafikinfo.dk).

Complements aria-mcp-drivetime-dk: that server computes drive time; this one tells you whether the road is clear.

Data Source

Source

What

Attribution

Vejdirektoratet / trafikinfo.dk

Current traffic events, roadblocks, queues, roadworks, critical announcements

Danish Road Directorate — free public traffic data

NAP reference: https://nap.vd.dk (National Access Point for road data, Denmark)

Endpoint details

The app at trafikkort.vejdirektoratet.dk is backed by two public GCS-hosted JSON feeds (discovered by reading the app's JavaScript bundle):

File

URL

What

big-screen-events.json

https://storage.googleapis.com/trafikkort-data/geojson/big-screen-events.json

All current incidents, accidents, roadblocks, queues, closures, weather-related events (~3 min cadence)

critical-announcements.json

https://storage.googleapis.com/trafikkort-data/geojson/critical-announcements.json

Major planned roadworks and critical traffic announcements

Both are plain JSON (GeoJSON-derived), no authentication required, no API key.

Data format

big-screen-events.json is an array of GeoJSON FeatureCollections, one per event (each collection has exactly one feature). Each feature carries:

{
  "type": "Feature",
  "geometry": { "type": "Point", "coordinates": [lon, lat] },
  "properties": {
    "featureId": "...",
    "layerId": "layer_id_19H1",
    "title": "Kør forsigtigt",
    "header": "Kør forsigtigt - E45 fra Randers mod Aalborg ...",
    "description": "<p>HTML description</p>",
    "TrafficMan2_Type": "org.vd.trafficmap.datexii.v32.datamodel.GeneralInstructionOrMessageToRoadUsers",
    "beginPeriod": "13-06-2026 kl. 00:12",
    "endPeriod": "13-06-2026 kl. 02:00",
    "kommune": "Vejdirektoratet",
    "suspended": "false",
    "future": "false",
    "visible": "true"
  }
}

The outer FeatureCollection also carries layerName which classifies the event:

layerName

Meaning

current-other-traffic-announcements.point

General incidents, accidents, obstructions

current-roadblocks.point

Road/lane closures

current-queue.point

Traffic queues

current-blocking-events.point

Public events with road closures

current-slippery-road.point

Slippery road / water on road

current-strong-wind-traffic-announcements.point

Strong wind warnings

current-blocking-roadwork.point / current-roadwork.point

Active roadworks (when present)

TrafficMan2_Type is a DATEX II v3.2 class path (e.g. ...Accident, ...AbnormalTraffic, ...MaintenanceWorks).

critical-announcements.json is a single FeatureCollection with properties: featureId, title, description (HTML), category, validFrom (ISO datetime).

Fragility notes

  • The GCS bucket (trafikkort-data) is public but not officially documented. It has been stable since at least 2020 (the mobile SDKs reference the same domain). URL changes are possible with app updates.

  • The subdirectory geojson/25832/ (EPSG:25832 projected coordinates) is not publicly accessible — only the geojson/ root files are open.

  • Events arrive as individual FeatureCollections (one per event), so the array length in big-screen-events.json equals the event count (typically 100–300).

  • description contains HTML; this server strips it before returning.

  • beginPeriod / endPeriod are Danish-formatted date strings (e.g. "13-06-2026 kl. 00:12"), not ISO — returned as-is.

  • suspended: "true" means the event is stored but currently inactive (e.g. cleared accident). This server includes suspended events but marks the flag.

Related MCP server: mcp-danish-weather

Install & Run

npx aria-mcp-trafik-dk

Or install globally:

npm install -g aria-mcp-trafik-dk
aria-mcp-trafik-dk

Requires Node.js 20 or later.

Tools

traffic_events

Fetch current Danish road traffic events.

Parameters:

Name

Type

Required

Description

area

string

No

Free-text region/road filter, e.g. "E45", "Horsens", "Fyn"

type

string

No

"all" (default) | "incident" | "roadwork" | "queue"

Returns: Array of traffic events:

[
  {
    "type": "Traffic message",
    "road": "E45 fra Randers mod Aalborg",
    "location": "Kør forsigtigt - E45 fra Randers mod Aalborg mellem <35> Hobro V og <34> Hobro N",
    "description": "E45 fra Randers mod Aalborg mellem <35> Hobro V og <34> Hobro N Havareret køretøj, Pas på I højre spor, vejhjælp er på vej",
    "from": "13-06-2026 kl. 00:12",
    "severity": "warning",
    "suspended": false,
    "coordinates": [9.733868, 56.66633]
  }
]

roadworks

Fetch planned and ongoing roadworks.

Parameters:

Name

Type

Required

Description

area

string

No

Free-text region/road filter

Returns: Mixed array of TrafficEvent objects (from live roadwork layers) and CriticalAnnouncement objects (from critical-announcements.json):

[
  {
    "id": "9349df74-15e8-4ffc-93e7-e3e236720da9",
    "title": "E45 Østjyske Motorvej spærres ved Horsens",
    "description": "I forbindelse med bronedrivning spærres E45 Østjyske Motorvej ...",
    "category": "Trafikal forsidemelding (trafikkort)",
    "validFrom": "2026-06-12T10:56:00.410Z"
  }
]

events_near

Find traffic events within a radius of a geographic point.

Parameters:

Name

Type

Required

Description

lat

number

Yes

Latitude (WGS84)

lon

number

Yes

Longitude (WGS84)

radiusKm

number

No

Radius in km (default 25, max 200)

Returns: Array of traffic events, each with an added distanceKm field, sorted by distance ascending.

[
  {
    "type": "Road/lane closure",
    "road": "E45 Østjyske Motorvej",
    "location": "...",
    "description": "...",
    "severity": "blocking",
    "suspended": false,
    "coordinates": [9.85, 55.86],
    "distanceKm": 2.3
  }
]

Environment Variables

Variable

Description

VD_GCS_BASE

Override the GCS base URL (for testing or caching proxies). Default: https://storage.googleapis.com/trafikkort-data/geojson

ARIA MCP Config

Add to your ARIA credentials / MCP config:

{
  "command": "npx",
  "args": ["-y", "aria-mcp-trafik-dk"],
  "env": {}
}

No environment variables are required. Pair with aria-mcp-drivetime-dk for a complete pre-drive check:

[
  { "command": "npx", "args": ["-y", "aria-mcp-drivetime-dk"] },
  { "command": "npx", "args": ["-y", "aria-mcp-trafik-dk"] }
]

Development

git clone https://github.com/kimhjort/aria-mcp-trafik-dk
cd aria-mcp-trafik-dk
npm install
npm run build
npm test

License

MIT — see LICENSE.

Traffic data is public information from Vejdirektoratet (Danish Road Directorate). Attribution to Vejdirektoratet / trafikinfo.dk is appreciated when redistributing.

Available Tools

3 tools
events_nearA

Find current traffic events (incidents, roadblocks, queues, roadworks) within a geographic radius of a given coordinate. Useful for checking conditions near a specific destination or along a route. Only events that carry Point geometry from Vejdirektoratet are returned; events without coordinates are excluded. Results are sorted by distance ascending. Example: check for issues near Horsens (55.86, 9.85) before driving there.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude of the centre point (WGS84 decimal degrees).
lonYesLongitude of the centre point (WGS84 decimal degrees).
radiusKmNoSearch radius in kilometres (default 25, max 200).

TDQS

A3.8/5.0
Behavior3/5

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

Discloses key behavioral traits: returns only Point geometry events from Vejdirektoratet, excludes events without coordinates, and sorts by distance. However, it does not cover error conditions, rate limits, or any side effects. No annotations are present, so the description carries the full burden.

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

Conciseness4/5

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

Description is three sentences plus an example, front-loaded with purpose. Every sentence adds value, with no superfluous text.

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

Completeness3/5

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

Adequately covers purpose and constraints given the simple input schema, but lacks details on output format and error handling. With no output schema, the description could be more complete.

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 clear descriptions for all three parameters. The description adds no extra meaning beyond the schema, only providing an overall example that uses the parameters.

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?

Describes specifically finding current traffic events by geographic radius, listing event types, and noting that only events with Point geometry are returned. Clearly distinguishes from sibling tools 'roadworks' and 'traffic_events' by focusing on location-based filtering.

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?

States it is useful for checking conditions near a destination or along a route, and provides a concrete example. However, it does not explicitly mention when not to use it or contrast with sibling tools beyond the implicit filtering.

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

roadworksA

Fetch planned and ongoing roadworks on Danish state roads from Vejdirektoratet. Combines two feeds: active roadwork layers from the live events feed and critical-announcements.json (major planned closures, e.g. motorway bridge work). Returns roadwork entries with title, description, road, location, and validity times. Use this when ARIA needs to warn about scheduled disruptions before a drive.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoOptional free-text region or road filter (e.g. 'E45', 'Horsens', 'København'). Matched case-insensitively against title, location, road, and description fields.

TDQS

A4/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It discloses that it fetches data from two feeds and returns specific fields, but does not mention side effects, rate limits, or authentication. It adds some actionable context but lacks depth.

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?

Two sentences, front-loaded with action, data sources, and return values. No wasted words. Efficient and clear.

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 tool with one optional parameter and no output schema, the description covers the purpose, data sources, and return fields. It lacks details on filtering behavior, pagination, or errors, but is largely complete for the tool's simplicity.

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%, so baseline is 3. The description does not add any meaning about the 'area' parameter beyond what the schema provides. No value added.

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?

Description clearly states the tool fetches planned and ongoing roadworks on Danish state roads from Vejdirektoratet, combining two specific feeds. It specifies the return fields, making the purpose unambiguous.

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?

Explicitly tells when to use: 'when ARIA needs to warn about scheduled disruptions before a drive.' No explicit when-not or comparison to siblings, but the specific use case is provided.

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

traffic_eventsA

Fetch current Danish road traffic events from Vejdirektoratet (trafikkort.vejdirektoratet.dk). Returns incidents, accidents, roadblocks, queues, and closures on Danish state roads. Each event includes type, road, location, description, from/to times, and severity. Use this to warn ARIA before Kim drives — check for incidents on the route. Data is updated approximately every 3 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoOptional free-text region or road filter (e.g. 'Horsens', 'E45', 'Vejle', 'Fyn'). Matched case-insensitively against location, road, and description fields.
typeNoFilter by event category. 'incident' = accidents, obstructions, closures, weather events. 'roadwork' = maintenance and construction works. 'queue' = traffic queues. 'all' = everything (default).

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses expected return fields (type, road, location, times, severity) and update behavior. This is sufficient for a read-only data fetch with no side effects.

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 concise: three sentences covering purpose, use case, and update frequency. No wasted words; every sentence serves a purpose.

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 tool with two optional parameters and no output schema, the description adequately covers return fields and update frequency. It provides enough context for correct invocation without overspecifying.

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?

Schema coverage is 100% and both parameters have descriptions. The description adds value by explaining that the 'area' filter is case-insensitive and matches against multiple fields, and it elaborates on the enum values in plain language.

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 it fetches Danish road traffic events from a specific source (Vejdirektoratet), lists event types (incidents, accidents, etc.), and distinguishes from siblings like 'events_near' and 'roadworks' by focusing on state roads.

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 explicitly suggests a concrete use case: warn ARIA before Kim drives. It also notes data update frequency (every 3 minutes), aiding timely decisions. No explicit when-not guidance, but the purpose is clear.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 3 tool updatesv1.0.0
    • First observedevents_near
    • First observedroadworks
    • First observedtraffic_events

TDQS

A3.9/5.0
Disambiguation4/5

Tools have overlapping purposes (events_near and traffic_events both return current events), but descriptions clarify differences: events_near is location-based, traffic_events is general. roadworks is distinct. Overall, agents likely select correctly with clear prompts.

Naming Consistency2/5

Tool names lack a consistent pattern: 'events_near' combines noun+preposition, 'roadworks' is a single noun, 'traffic_events' is noun_noun. No verb_noun or consistent convention, making predictions harder.

Tool Count4/5

Three tools is a reasonable count for querying Danish road events. It covers current incidents, planned roadworks, and proximity search without unnecessary duplication, though slightly minimalist.

Completeness4/5

Covers the main needs: current events globally and by location, and planned roadworks. Missing features like event details by ID or historical data, but sufficient for real-time trip planning.

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

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables natural language access to Denmark's Statistics API (Danmarks Statistik), allowing users to query and analyze Danish statistical data without coding knowledge through AI-powered interactions.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides access to Danish weather data from the Danish Meteorological Institute, enabling users to retrieve current conditions, hourly forecasts, and historical records. It supports location lookups via city names, postal codes, and coordinates for any Danish region.
    3
    14
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides access to Danish energy data from Energinet, including real-time electricity spot prices, CO2 emissions, and production mix. It enables users to monitor grid status and identify the most cost-effective hours for energy-intensive tasks.
    4
    15
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Query Swedish public data from AI tools. Includes company data, SCB statistics, weather, transport, public agencies, and more through the Apiverket API.
    2
    57
    2
    MIT

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/kimhjort/aria-mcp-trafik-dk'

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