aria-mcp-affald-horsens
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-affald-horsensnæste tømning på Vestergade 5"
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-affald-horsens
A Model Context Protocol (MCP) server for household waste collection schedules in Horsens Kommune. Built for ARIA and shareable with the community.
Example output ARIA might give Kim:
i aften: rest/madaffald ud (tømmes mandag den 15. juni) næste papir/pap: tirsdag den 23. juni (om 10 dage)
Data Source
Data is fetched from PerfectWaste (https://europe-west3-perfect-waste.cloudfunctions.net), the backend powering Horsens Kommune's waste portal. The API is unofficial and undocumented — it was reverse-engineered from the portal and community Home Assistant integrations. There is no guarantee of stability; Horsens might migrate providers without notice.
The legacy horsens.renoweb.dk ASMX endpoint (GetAffaldsplanMateriel_mitAffald) is MitID-gated and cannot be used headlessly. Only address search on that endpoint is unauthenticated, but it is useless without schedule access. PerfectWaste is fully headless with no auth.
Best-effort only. Always verify collection dates at horsens.dk/affald.
Related MCP server: smhi-mcp
Install & Run
npx aria-mcp-affald-horsensOr install globally:
npm install -g aria-mcp-affald-horsens
aria-mcp-affald-horsensRequires Node.js 20 or later.
Tools
find_address
Search for a Horsens address and return PerfectWaste address candidates (id + display name).
Parameters:
Name | Type | Required | Description |
| string | Yes | Address string to search (e.g. |
Returns:
{
"query": "Vestergade 5",
"candidates": [
{ "addressID": "39429", "displayName": "Vestergade 5, 8732 Hovedgård" },
{ "addressID": "47864", "displayName": "Vestergade 5, 8700 Horsens" }
]
}next_collection
Return the next upcoming collection date for each waste fraction at an address.
Parameters:
Name | Type | Required | Description |
| string | Yes | Free-text address or raw PerfectWaste addressID (digits only) |
Returns:
{
"addressID": "47864",
"addressDisplay": "Vestergade 5, 8700 Horsens",
"asOf": "2026-06-13T08:00",
"nextByFraction": [
{
"fractionName": "Rest - Mad",
"date": "2026-06-15T00:00:00.000Z",
"dateLocal": "2026-06-15",
"dateLabel": "mandag den 15. juni 2026",
"daysUntil": 2,
"putOutTonight": false
},
{
"fractionName": "Papir, pap og tekstilaffald",
"date": "2026-06-23T00:00:00.000Z",
"dateLocal": "2026-06-23",
"dateLabel": "tirsdag den 23. juni 2026",
"daysUntil": 10,
"putOutTonight": false
},
{
"fractionName": "Plast og drikkekarton - Glas og metal",
"date": "2026-06-26T00:00:00.000Z",
"dateLocal": "2026-06-26",
"dateLabel": "fredag den 26. juni 2026",
"daysUntil": 13,
"putOutTonight": false
}
],
"notice": "Data source: PerfectWaste (unofficial API, Horsens Kommune). ..."
}putOutTonight is true when the collection is tomorrow — use it for reminders like "i aften: rest/madaffald ud".
collection_calendar
Return all upcoming collection events for the next N weeks.
Parameters:
Name | Type | Required | Description |
| string | Yes | Free-text address or raw PerfectWaste addressID |
| number | No | Look-ahead in weeks (default 4, max 52) |
Returns: Same fields as next_collection events but as a flat chronological list covering the full window.
Environment Variables
Variable | Default | Description |
|
| Override the PerfectWaste base URL. Useful if another kommune uses the same backend at a different endpoint. |
|
| Municipality code. |
The RENOWEB_* names are intentional — they keep the interface familiar and forward-compatible if a true RenoWeb headless path is discovered later.
ARIA MCP Config
Add to your ARIA MCP config (mcpServers in ARIA credentials):
{
"command": "npx",
"args": ["-y", "aria-mcp-affald-horsens"],
"env": {}
}ARIA can then answer questions like:
"hvornår tømmes papir næste gang?"
"hvad skal ud i aften?"
"vis affaldskalender for de næste 4 uger på Vestergade 5"
Fragility Notes
API is undocumented. PerfectWaste has no published SLA for this endpoint. It has been stable since at least early 2026, but could break without notice.
Municipality codes. The
615code for Horsens was discovered empirically. Other kommuner using PerfectWaste will have different codes.Address coverage. Some commercial/institutional addresses (e.g. Rådhustorvet 4) return empty collection data — the portal apparently only covers residential collection routes.
Calendar depth. PerfectWaste typically returns ~3 months of data. The
weeksparameter is capped client-side.
Development
git clone https://github.com/kimhjort/aria-mcp-affald-horsens
cd aria-mcp-affald-horsens
npm install
npm run build
npm testLicense
MIT — see LICENSE.
Available Tools
3 toolscollection_calendarA
Return all upcoming waste collection events for a Horsens address over the next N weeks. Each event includes the date (ISO 8601), a human-readable Danish date label (e.g. "mandag den 15. juni 2026"), daysUntil, and the fractions to be collected. Use this when ARIA needs to plan ahead or answer "hvornår tømmes X de næste uger?". The 'address' parameter accepts a free-text address string or a raw PerfectWaste addressID. The 'weeks' parameter controls the look-ahead window (default 4, max 52).
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Horsens address string (e.g. "Vestergade 5") or a PerfectWaste addressID (digits only). | |
| weeks | No | Number of weeks to look ahead (default 4, max 52). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes return fields (date, label, daysUntil, fractions) but does not disclose error handling, required permissions, or behavior on invalid addresses. Lacks details on side effects or rate limits, though tool is read-only.
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 well-structured sentences: first states core function and return format, second gives usage guidance, third details parameters. No fluff, each sentence adds value.
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?
Covers purpose, usage, parameters, and return format (important since no output schema). Missing details on authentication, error handling, or scope limitations beyond 'Horsens address'. Adequate for a simple read 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 descriptions identical to the description. The description restates parameter meanings (address type, weeks range) without adding new semantic value beyond the schema, so baseline of 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 tool returns upcoming waste collection events for a Horsens address over N weeks, using specific verb 'return' and resource 'waste collection events'. It distinguishes from siblings find_address (address lookup) and next_collection (single next event) by emphasizing multi-week look-ahead.
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 when to use: 'Use this when ARIA needs to plan ahead or answer "hvornår tømmes X de næste uger?"' This directly guides the agent to choose this tool for planning multiple weeks rather than a single next collection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_addressA
Search for a Horsens Kommune address and return PerfectWaste address candidates (each with an addressID and a displayName). Use this to resolve a free-text address string before calling next_collection or collection_calendar, or to disambiguate when multiple addresses match (e.g. Søndergade 1 in both 8700 and 8740). Returns up to 30 candidates ordered by relevance.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Address string to search for in Horsens Kommune (e.g. "Vestergade 5", "Søndergade 1, 8700 Horsens"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description discloses return format, limit of 30 candidates, and relevance ordering. Does not mention side effects or rate limits, but acceptable for a search tool.
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 no wasted words; first sentence states purpose, second gives usage guidance and example. Very efficient.
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 single-parameter search tool with no output schema and two siblings, the description covers input, output, limits, ordering, and usage context. Completely sufficient.
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 has 100% coverage with a description for the query parameter. The tool description adds context about search scope (Horsens Kommune) and disambiguation, enhancing meaning beyond 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 it searches for a Horsens Kommune address and returns candidates with addressID and displayName. It differentiates from siblings by specifying this tool resolves addresses before using next_collection or collection_calendar.
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 says to use before next_collection or collection_calendar, and to disambiguate multiple matches. Provides an example. Could mention when not to use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_collectionA
Return the next upcoming waste collection date for each fraction at a given Horsens address. Fractions include Rest - Mad (general/food waste), Papir, pap og tekstilaffald (paper/cardboard/textiles), and Plast og drikkekarton - Glas og metal (plastic/cartons/glass/metal). The 'putOutTonight' flag is true when that fraction is collected tomorrow — use it to remind Kim "i aften: [fraktion] ud". The 'address' parameter accepts a free-text address string or a raw PerfectWaste addressID (digits only). When the address is ambiguous, prefers 8700 Horsens results.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Horsens address string (e.g. "Vestergade 5") or a PerfectWaste addressID (digits only). Ambiguous queries prefer 8700 Horsens. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It explains the 'putOutTonight' flag and its use for reminders, and clarifies address handling (free text or ID, ambiguity resolution). No destructive behavior is described, which is appropriate for a read-only tool.
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 concise, covering key information in a few sentences without unnecessary verbosity. It could be improved with bullet points, but remains clear and front-loaded.
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 simple tool (one parameter, no output schema), the description is sufficiently complete. It explains the return value (next collection date per fraction, with flag), address format, and ambiguity handling. No major gaps.
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% but the description adds value by explaining that 'address' can be a free-text string or a PerfectWaste addressID, and that ambiguous queries prefer 8700 Horsens. This goes beyond the schema's basic type 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 explicitly states 'Return the next upcoming waste collection date for each fraction at a given Horsens address.' It lists specific fractions and the 'putOutTonight' flag, clearly differentiating from sibling tools like 'collection_calendar' and 'find_address'.
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 mentions that ambiguous queries prefer 8700 Horsens, but does not explicitly state when to use this tool over siblings like 'collection_calendar' or 'find_address'. The usage context is implied but not directly compared.
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.
3 tool updates
v1.0.0- First observed
collection_calendar - First observed
find_address - First observed
next_collection
TDQS
Scored across 3 tools
Each tool has a clear, distinct purpose: address resolution, next collection, and calendar of upcoming collections. No overlap.
All tool names use consistent snake_case verb_noun pattern: find_address, next_collection, collection_calendar.
Three tools are well-scoped for the domain of waste collection lookup in a single municipality—sufficient without being excessive.
The set covers address disambiguation, immediate next collection, and future planning via calendar. No obvious gaps.
Maintenance
Related MCP Connectors
Danish address & property lookup: BBR, Matriklen, DAR, CVR. A DAWA/Datafordeler-compatible source.
Energi Data Service (Energinet) MCP — Denmark's official open energy data.
MCP server for Statistics Sweden (SCB) - 1200+ tables with population, economy, environment data
Danish grocery catalog as MCP tools: live offers across all major chains, stores, EAN lookup, stock.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server for the Danish Address Web API (DAWA), enabling free-text address search, house number search, and detailed address lookup by ID.-
- FlicenseNot gradedqualityCmaintenanceMCP server that provides real-time weather data, forecasts, and historical weather information from SMHI (Swedish Meteorological and Hydrological Institute) for any location in Sweden.2-
- AlicenseAqualityDmaintenanceMCP server for Danish electricity prices, providing current spot price, cheapest hours, and 7-day forecast for DK1 and DK2 areas.56 npmMIT
- AlicenseAqualityDmaintenanceMCP server that provides tools to search Norwegian addresses, reverse geocode, find place names, and get elevation data from Kartverket's open geographic datasets.47 npm1MIT