Skip to main content
Glama
kimhjort

aria-mcp-drivetime-dk

by kimhjort

aria-mcp-drivetime-dk

A Model Context Protocol (MCP) server that computes car driving time and distance between two places in Denmark, plus a "leave by" time for appointments. Built for ARIA and shareable with the community.

Fully keyless — uses public OpenStreetMap services with no API key required.

Example output ARIA might give Kim:

Horsens → Billund Lufthavn er ~48 min (67 km) — kør senest 11:02 for at nå 12:00 (inkl. 10 min buffer)

Data Sources

Source

What

Policy / Attribution

Nominatim

Geocoding — place name → lat/lon

© OpenStreetMap contributors (ODbL). Usage policy: max 1 req/s, descriptive User-Agent required

OSRM demo server

Road routing — distance + duration

© OpenStreetMap contributors. Demo server: ~1 req/s, non-commercial use only

No live traffic. Duration is typical free-flow routing time. For production or traffic-aware routing, self-host OSRM or use a paid provider (e.g. Google Maps Routes API, HERE, Mapbox).

Related MCP server: Valhalla MCP Server

Install & Run

npx aria-mcp-drivetime-dk

Or install globally:

npm install -g aria-mcp-drivetime-dk
aria-mcp-drivetime-dk

Requires Node.js 20 or later.

Tools

drive_time

Compute car driving distance and typical travel time between two Danish places.

Parameters:

Name

Type

Required

Description

from

string

Yes*

Origin — place name, address, or "lat,lon"

to

string

Yes

Destination — place name, address, or "lat,lon"

arriveBy

string

No

Arrival time — ISO datetime ("2026-06-12T12:00") or "HH:MM" for today (Copenhagen time)

bufferMin

number

No

Extra buffer minutes for leave-by (default DEFAULT_BUFFER_MIN, typically 10)

*Not required when DEFAULT_ORIGIN env var is set.

Returns:

{
  "fromResolved": "Horsens, Horsens Kommune, Region Midtjylland, Danmark",
  "toResolved": "Billund Lufthavn, ...",
  "distanceKm": 67.4,
  "durationMin": 48,
  "leaveByLocal": "2026-06-12T11:02",
  "arriveByLocal": "2026-06-12T12:00",
  "bufferMin": 10,
  "notice": "Duration is typical/free-flow driving time from OSRM routing — does NOT include live traffic. Allow extra time during rush hours or adverse weather."
}

leaveByLocal, arriveByLocal, and bufferMin are only present when arriveBy is given.


geocode

Resolve a Danish place name or address to geographic coordinates.

Parameters:

Name

Type

Required

Description

query

string

Yes

Place name or address to look up

Returns:

{
  "lat": 55.8607,
  "lon": 9.8502,
  "displayName": "Horsens, Horsens Kommune, Region Midtjylland, Danmark"
}

leave_by

Convenience wrapper — same as drive_time but requires arriveBy explicitly and is named to signal intent.

Parameters: from (optional with default), to, arriveBy (required), bufferMin (optional)

Returns: Same as drive_time with arriveBy — always includes leaveByLocal.


Environment Variables

Variable

Default

Description

DEFAULT_ORIGIN

(none)

Default origin place (e.g. "Horsens"). Makes from optional in drive_time and leave_by.

DEFAULT_BUFFER_MIN

10

Buffer minutes subtracted when computing leaveByLocal.

NOMINATIM_URL

https://nominatim.openstreetmap.org

Override Nominatim base URL (for self-hosting).

OSRM_URL

https://router.project-osrm.org

Override OSRM base URL (for self-hosting or a traffic-aware provider).

ARIA MCP Config

Add to your ARIA credentials / MCP config to use with ARIA:

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

With this config, from defaults to Horsens in all tools. Kim can ask ARIA "Hvornår skal jeg køre for at nå Billund Lufthavn til 12:00?" without specifying an origin.

Important Caveats

  • No live traffic. OSRM demo server provides free-flow routing only. Actual travel time may differ significantly during rush hours, holidays, road works, or bad weather.

  • Demo server limits. The public Nominatim and OSRM demo servers are rate-limited (~1 req/s) and intended for light, non-commercial use. For production workloads, self-host or use a commercial routing API.

  • Self-hosting. Set NOMINATIM_URL and OSRM_URL environment variables to point at your own instances.

Development

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

License

MIT — see LICENSE.

Map data © OpenStreetMap contributors, licensed under the Open Database Licence (ODbL).

Available Tools

3 tools
drive_timeA

Compute car driving distance and typical travel time between two places in Denmark using OpenStreetMap data. Both 'from' and 'to' accept a Danish place name / address (e.g. 'Horsens', 'Billund Lufthavn', 'Rådhuspladsen, København') or a coordinate string in 'lat,lon' format. Returns distanceKm, durationMin, and the resolved place names. If 'arriveBy' is given (ISO datetime such as '2026-06-12T12:00' or 'HH:MM' for today in Copenhagen time), also returns leaveByLocal — the time you must leave to arrive on time including a buffer (default 10 min from DEFAULT_BUFFER_MIN). IMPORTANT: Duration is free-flow routing time WITHOUT live traffic. Allow extra time during rush hours.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromYesOrigin place name, address, or "lat,lon". Required when DEFAULT_ORIGIN env is not set.
toYesDestination place name, address, or "lat,lon". Required.
arriveByNoDesired arrival time. ISO datetime ("2026-06-12T12:00") or "HH:MM" (today in Europe/Copenhagen). When provided, leaveByLocal is calculated: arriveBy − durationMin − bufferMin.
bufferMinNoExtra buffer minutes subtracted when computing leaveByLocal (default 10 from DEFAULT_BUFFER_MIN).

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses data source (OSM), that duration is free-flow without live traffic, the computation of leaveByLocal when arriveBy is given, and the buffer mechanism. However, it does not mention error handling (e.g., place not found) or any rate limits.

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 one paragraph of 4–5 sentences, front-loaded with the core purpose, followed by input/output details and a critical caveat. Every sentence adds value without fluff.

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?

Given no output schema, the description covers return values (distanceKm, durationMin, resolved place names, leaveByLocal) and explains the buffer and arrival parameters. It could mention potential errors (e.g., invalid place lookup) but is otherwise complete for a non-destructive routing tool.

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%, baseline 3. The description adds meaning beyond schema by providing example inputs for 'from'/'to', explaining the 'arriveBy' format (ISO datetime or HH:MM for today in Copenhagen), and detailing how 'bufferMin' is used in leaveByLocal calculation. This adds significant context.

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 tool computes car driving distance and typical travel time between two places in Denmark using OpenStreetMap data. It specifies the verb (compute), resource (distance and time), geographic scope (Denmark), data source (OSM), and output keys (distanceKm, durationMin, leaveByLocal). This is specific and distinguishes it from siblings like geocode.

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?

While the description implies the use case for driving time in Denmark and includes important caveats (no live traffic, rush hour allowance), it does not explicitly state when to use this tool versus siblings like geocode or leave_by. No verbal 'when-not' guidance or alternatives are given.

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

geocodeA

Resolve a Danish place name or address to geographic coordinates (latitude/longitude) using Nominatim (OpenStreetMap). Returns lat, lon, and a full display name. Useful for verifying that a place name is unambiguous before using it in drive_time.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesDanish place name or address to geocode (e.g. 'Billund Lufthavn', 'Nørreport, København').

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so description carries full burden. It discloses the use of Nominatim and output fields, but lacks mention of potential rate limits, error handling, or external dependency constraints.

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, no redundant words, front-loaded with the core purpose. Every sentence adds value.

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?

Given the tool's simplicity (one parameter, no output schema), the description covers purpose, use case, and return values. It could mention potential limitations of the external geocoding service, but is largely complete.

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% for the single parameter. The description adds context by specifying 'Danish place name or address' and giving examples, which improves 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 it resolves a Danish place name or address to coordinates using Nominatim. It specifies output fields and connects to drive_time, distinguishing it from sibling tools.

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?

It says 'useful for verifying that a place name is unambiguous before using it in drive_time,' providing clear context. However, it does not explicitly state when not to use it or mention alternatives.

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

leave_byA

Convenience tool: given a destination and a required arrival time, returns the time you must leave and a drive summary. Equivalent to drive_time with arriveBy but requires arriveBy explicitly. Both 'from' and 'to' accept a Danish place name / address or 'lat,lon'. Returns leaveByLocal (Europe/Copenhagen), arriveByLocal, durationMin, distanceKm, and a no-live-traffic notice. Example output: 'Horsens → Billund Lufthavn er ~48 min — kør senest 11:02 for at nå 12:00'.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromYesOrigin place name, address, or "lat,lon". Required when DEFAULT_ORIGIN env is not set.
toYesDestination place name, address, or "lat,lon". Required.
arriveByYesRequired. Desired arrival time as ISO datetime ("2026-06-12T12:00") or "HH:MM" (today in Europe/Copenhagen).
bufferMinNoExtra buffer minutes to subtract (default 10 from DEFAULT_BUFFER_MIN).

TDQS

A4.3/5.0
Behavior4/5

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

No annotations provided, but description discloses return fields (leaveByLocal, arriveByLocal, durationMin, distanceKm), no-live-traffic notice, and gives an example output. Adequately describes behavioral traits.

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?

Single paragraph with all essential info, example included. Could be slightly more structured (e.g., bullet points), but very 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?

Covers purpose, parameters, return fields, and example. No output schema, but description sufficiently details outputs. Missing edge cases like timezone handling, but adequate for a convenience tool.

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% with descriptions. Description adds extra meaning: 'from' and 'to' accept Danish place names or lat,lon, 'arriveBy' format options, bufferMin default. Adds value beyond 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?

Clearly states it's a convenience tool for calculating leave time given destination and required arrival time, distinguishing it from sibling drive_time by requiring explicit arriveBy parameter.

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?

Provides clear usage context: given destination and required arrival time. Compares to drive_time with arriveBy, but lacks explicit when-not-to-use or alternatives beyond the sibling comparison.

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 observeddrive_time
    • First observedgeocode
    • First observedleave_by

TDQS

A4/5.0
Disambiguation3/5

drive_time and leave_by overlap significantly, as leave_by is explicitly a wrapper for drive_time with arriveBy. However, the descriptions clarify their relationship and distinct use cases, so an agent can differentiate them with careful reading.

Naming Consistency2/5

Naming is inconsistent: 'drive_time' and 'leave_by' use underscores, while 'geocode' does not. The verb styles also differ (verb_noun, verb_preposition, single verb), making the pattern unpredictable.

Tool Count5/5

Three tools is appropriate for the domain: geocode for place resolution, drive_time for core computation, and leave_by as a convenience wrapper. Each tool serves a clear purpose and no tool is redundant.

Completeness4/5

The tool set covers the essential workflow: resolving addresses, computing drive time, and arriving by a deadline. Minor gaps exist, such as lack of batch or alternative routes, but these are not critical for the primary use case.

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
  • F
    license
    Not graded
    quality
    D
    maintenance
    Integrates Claude Desktop with the Valhalla routing engine to provide OpenStreetMap-based routing and isochrone capabilities. It enables users to calculate travel paths and reachability polygons for various transportation modes using natural language.
    5
    -
  • 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

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-drivetime-dk'

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