aria-mcp-tvguide-dk
Click on "Deploy 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., "@aria-mcp-tvguide-dkHvad sender DR1 i aften?"
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.
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-dkOr install globally:
npm install -g aria-mcp-tvguide-dk
aria-mcp-tvguide-dkRequires 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 |
| 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 |
| string | Yes | Channel name (e.g. "DR1", "TV 2", "Kanal 5") or numeric id |
| 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 |
| 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 |
| string | Yes | Substring to search in programme titles (case-insensitive) |
| string[] | No | Channels to search (defaults to default channel set) |
| string | No | YYYY-MM-DD date to search (defaults to today Copenhagen) |
Returns: { query, date, matchCount, programmes: Programme[] }
Environment Variables
Variable | Description |
| Comma-separated channel names or ids for the default set used by |
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 testAttribution & 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 toolslist_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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Optional case-insensitive substring to filter channel names by (e.g. 'dr', 'tv 2', 'sport'). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Substring to search for in programme titles (case-insensitive). | |
| channels | No | Optional list of channel names or ids to search. Defaults to the configured default channel set. | |
| date | No | Date to search in YYYY-MM-DD format. Defaults to today (Copenhagen). |
TDQS
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.
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.
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.
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.
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.
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?'.
| Name | Required | Description | Default |
|---|---|---|---|
| channels | No | Optional list of channel names or ids to include. Defaults to the configured default channel set. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel name (e.g. 'DR1', 'TV 2', 'TV3') or numeric id. | |
| when | No | Optional 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
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.
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.
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.
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.
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.
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.
4 tool updates
v1.0.0- First observed
list_channels - First observed
search_program - First observed
tonight - First observed
whats_on
TDQS
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
Unlock a world of television with the TV Maze MCP server. Effortlessly search for shows by name or
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
TVMaze MCP — TV show metadata, episodes, schedules (no auth)
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityFmaintenanceA MCP server for The Movie Database API that enables AI assistants to search and retrieve movie, TV show, and person information.2344MIT
- FlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to control TVs on a local network through natural language commands. It currently supports Roku devices, allowing users to launch apps, manage playback, and navigate menus.5-
- AlicenseNot gradedqualityBmaintenanceA 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.203MIT
- FlicenseAqualityDmaintenanceAn 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-