Skip to main content
Glama
kimhjort

aria-mcp-tvguide-dk

by kimhjort

aria-mcp-tvguide-dk

A Model Context Protocol (MCP) server that exposes the Danish TV guide (EPG) to AI assistants. Built for ARIA and shareable with the community.

Fully keyless — no API key required.

What it does

Lets your AI assistant answer questions like:

  • "Hvad går der i fjernsynet i aften?"

  • "Hvad sender DR1 kl. 20?"

  • "Hvornår sender TV 2 Klovn?"

  • "Hvor kan jeg se VM-kampen i aften?"

Related MCP server: MCP Remote Control

Data Source

EPG data is provided by Allente Denmark via their internal EPG API (https://cs-vcb.allente.dk/epg/events). The data is best-effort for personal/hobby use. Check Allente's Terms of Service before any redistribution or commercial use.

Covers all major Danish channels: DR1, DR2, DR Ramasjang, TV 2, TV 2 News, TV 2 Charlie, TV 2 Sport, TV3, TV3+, Kanal 4, Kanal 5, 6'eren, CANAL9, dk4, Eurosport, Discovery, National Geographic, BBC Nordic, and more.

Install & Run

npx aria-mcp-tvguide-dk

Or install globally:

npm install -g aria-mcp-tvguide-dk
aria-mcp-tvguide-dk

Requires Node.js 20 or later.

Tools

list_channels

List available channels with id and name. Supports an optional name filter.

Parameters:

Name

Type

Required

Description

filter

string

No

Case-insensitive substring to filter channel names (e.g. "dr", "tv 2", "sport")

Returns: { count, channels[{ id, name }] }


whats_on

Return the programme airing on a channel now (or at a specified time).

Parameters:

Name

Type

Required

Description

channel

string

Yes

Channel name (e.g. "DR1", "TV 2", "Kanal 5") or numeric id

when

string

No

ISO 8601 datetime or "HH:MM" (today Copenhagen). Omit for current time.

Returns: A single Programme object:

{
  "channelId": "452",
  "channelName": "DR1",
  "title": "Fodbold: VM",
  "start": "2026-06-12T21:00:00+02:00",
  "stop": "2026-06-12T22:05:00+02:00",
  "durationMinutes": 65,
  "description": "Der er store VM-drømme i Canada...",
  "categories": ["sport"],
  "live": false
}

tonight

Return prime-time (19:00–23:00 Copenhagen) TV listings for today, grouped by channel.

Parameters:

Name

Type

Required

Description

channels

string[]

No

Channel names or ids to include. Defaults to the default channel set.

Returns: { date, primetime, channels: { [channelName]: Programme[] } }


search_program

Find programmes by title across channels for a date.

Parameters:

Name

Type

Required

Description

title

string

Yes

Substring to search in programme titles (case-insensitive)

channels

string[]

No

Channels to search (defaults to default channel set)

date

string

No

YYYY-MM-DD date to search (defaults to today Copenhagen)

Returns: { query, date, matchCount, programmes: Programme[] }

Environment Variables

Variable

Description

DEFAULT_CHANNELS

Comma-separated channel names or ids for the default set used by tonight and search_program. Example: "DR1,TV 2,TV3,Kanal 5"

When unset, the default is: DR1, DR2, TV 2, TV 2 News, TV3, TV3+, Kanal 4, Kanal 5, TV 2 Charlie, 6'eren.

ARIA MCP Config

Add to your ARIA credentials / MCP config:

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

With a custom default channel set:

{
  "command": "npx",
  "args": ["-y", "aria-mcp-tvguide-dk"],
  "env": {
    "DEFAULT_CHANNELS": "DR1,TV 2,TV3,Kanal 5"
  }
}

Development

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

Attribution & Terms

EPG data is sourced from Allente Denmark (allente.dk). This server is a personal/hobby project. The Allente EPG API is not a documented public API — use it in good faith and at your own risk. Check Allente's terms before any redistribution or commercial use.

License

MIT — see LICENSE.

Available Tools

4 tools
list_channelsA

List available Danish TV channels from the EPG with their id and canonical name. Supports an optional case-insensitive name filter. Use this to discover channel names before calling whats_on, tonight, or search_program.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoOptional case-insensitive substring to filter channel names by (e.g. 'dr', 'tv 2', 'sport').

TDQS

A4.5/5.0
Behavior4/5

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

Describes the tool as a list operation with an optional filter, but lacks mention of any potential limitations (e.g., pagination, rate limits, or destructive effects). Since no annotations exist, the description carries the burden; it is adequate but could be more explicit.

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?

Three concise sentences: first describes the action, second the filter, third the usage context. No unnecessary words.

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 tool's simplicity and lack of output schema, the description covers return values (id and canonical name), the optional filter, and its role in relation to sibling tools completely.

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?

The schema already documents the 'filter' parameter with case-insensitive semantics. The description repeats this but adds no new parameter-level details beyond the schema, so baseline of 3 applies.

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 lists Danish TV channels with id and canonical name, and positions it as a discovery tool for other sibling tools, distinguishing it well.

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

Usage Guidelines5/5

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

Explicitly states 'Use this to discover channel names before calling whats_on, tonight, or search_program,' providing clear when-to-use and alternative guidance.

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

search_programA

Search for Danish TV programmes by title across one or more channels for a given date. The search is case-insensitive and matches any substring of the programme title. Use this to find 'Klovn', 'Nyhederne', a sports event, or any specific show.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesSubstring to search for in programme titles (case-insensitive).
channelsNoOptional list of channel names or ids to search. Defaults to the configured default channel set.
dateNoDate to search in YYYY-MM-DD format. Defaults to today (Copenhagen).

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description adds a key behavioral trait: case-insensitive substring matching. However, it does not disclose other important aspects such as rate limits, authentication needs, pagination, or what happens with no results. It provides some but not comprehensive behavioral context.

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 three sentences long, each serving a purpose: stating the function, adding behavioral detail, and giving usage examples. It is front-loaded with the core purpose and contains no fluff.

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?

Despite no output schema, the description adequately covers input parameters and defaults. However, it fails to describe the return format (e.g., programme titles, times, channels) or any pagination. For a search tool, this gap limits completeness.

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 description coverage is 100%, but the description adds meaningful context beyond the schema: it clarifies that the title search is case-insensitive and matches substrings, states defaults for channels and date, and explains the 'Optional list of channel names or ids'.

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's function: 'Search for Danish TV programmes by title across one or more channels for a given date.' It includes specific examples like 'Klovn', 'Nyhederne', and distinguishes from siblings like list_channels or tonight by focusing on substring search.

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 implies usage for finding specific shows by title, but does not explicitly differentiate from sibling tools like 'tonight' or 'whats_on' or state when not to use it. No alternative tools are mentioned.

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

tonightA

Return prime-time (19:00–23:00 Copenhagen) TV listings for today for the default channel set (DR1, DR2, TV 2, TV 2 News, TV3, TV3+, Kanal 4, Kanal 5, TV 2 Charlie, 6'eren — or as configured by DEFAULT_CHANNELS env). Accepts an optional channel list to override the default. Use this when asked 'hvad går der i fjernsynet i aften?' or 'hvad er på programmet i aften?'.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelsNoOptional list of channel names or ids to include. Defaults to the configured default channel set.

TDQS

A4.6/5.0
Behavior4/5

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

Describes key behaviors: time range, default channels, and optional override. No annotations exist, but description is adequate for a read-only operation.

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 with critical information front-loaded. No unnecessary words, and the usage guidance is efficiently appended.

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 simplicity (one optional parameter, no output schema), the description covers purpose, usage, and behavior sufficiently. Could mention that it returns data for 'today' but it's implied.

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 schema already describes the parameter. The description adds context that the channel list overrides defaults, which slightly enhances understanding 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 tool returns prime-time TV listings for today, specifying the time range and default channel set. It distinguishes itself from siblings like 'list_channels' and 'search_program' by focusing on prime-time tonight.

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

Usage Guidelines5/5

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

Explicitly provides when to use the tool with specific example queries ('hvad går der i fjernsynet i aften?'), guiding the agent appropriately.

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

whats_onA

Return the programme currently airing on a Danish TV channel (or at a specified time). Includes title, start/stop times in Europe/Copenhagen, duration, description, and categories. Use this when asked 'hvad går der på DR1 nu?' or 'hvad sender TV 2 kl. 20:30?'. Channel can be a name (e.g. 'DR1', 'TV 2', 'Kanal 5') or a numeric id.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesChannel name (e.g. 'DR1', 'TV 2', 'TV3') or numeric id.
whenNoOptional time reference. ISO 8601 datetime (e.g. '2026-06-12T20:30:00') or 'HH:MM' shorthand for today in Copenhagen (e.g. '20:30'). Omit to use the current time.

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 the description must convey behavioral traits. It discloses that times are in Europe/Copenhagen and includes fields like duration and categories, but does not mention error handling (e.g., if channel is invalid), rate limits, or side effects. The description is adequate but not exhaustive.

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, well-organized paragraph that starts with the core purpose, includes example queries, and clarifies parameter usage. Every sentence contributes meaning without redundancy.

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 two parameters with full schema coverage, no output schema, and no annotations, the description covers essential aspects: purpose, parameter format, and example usage. It could be slightly more complete by mentioning what happens if no programme is found, but overall it is sufficient for a straightforward query 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 both parameters described. The description adds value by explaining that the 'channel' parameter accepts names or numeric IDs and that the 'when' parameter supports ISO 8601 or HH:MM shorthand, which goes beyond the schema's basic description.

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 returns the programme currently airing on a Danish TV channel or at a specified time, listing included fields (title, times, duration, etc.) and providing example queries. It distinguishes from siblings like 'list_channels' and 'search_program' by focusing on current/specific-time airings.

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 usage examples (e.g., 'hvad går der på DR1 nu?'), which clearly indicate when to use the tool. However, it does not explicitly state when not to use it or compare to alternatives like 'tonight', leaving some implicit guidance.

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.

  1. 4 tool updatesv1.0.0
    • First observedlist_channels
    • First observedsearch_program
    • First observedtonight
    • First observedwhats_on

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: list_channels discovers channels, search_program searches by title, tonight returns prime-time listings, and whats_on gets current or scheduled program for a channel. No overlap.

Naming Consistency4/5

Most tools follow a verb_noun pattern (list_channels, search_program) but 'tonight' is a single word and 'whats_on' uses a contraction. Still readable and predictable.

Tool Count5/5

With 4 tools, the set covers essential TV guide operations without bloat. Each tool serves a necessary function, and the count feels well-scoped for the domain.

Completeness4/5

The set covers channel discovery, search, prime-time, and current viewing. A minor gap is the lack of a full daily schedule beyond prime-time, but common queries are addressed.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    A MCP server for The Movie Database API that enables AI assistants to search and retrieve movie, TV show, and person information.
    23
    4
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A comprehensive MCP server with 36 tools for tracking TV shows and movies, managing watchlists, and syncing ratings with Trakt.tv. It enables users to search extensive databases, check into current viewings, and receive personalized recommendations through natural language commands.
    20
    3
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    An MCP server that wraps The Movie Database (TMDB) API, enabling search for movies and TV shows, retrieval of movie details, recommendations, similar movies, trending content, streaming providers, and movie discovery.
    8
    -