MCP server for the waste collection calendars of German cities and districts - 995 waste authorities.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
claude mcp add mcp-abfall -- uvx mcp-abfall{
"mcpServers": {
"mcp-abfall": {
"command": "uvx",
"args": ["mcp-abfall"]
}
}
}MCP Servers overview
# mcp-abfall
*English · [Deutsch](README.de.md)*
[](https://github.com/AlpayC/mcp-abfall/actions/workflows/ci.yml)
[](LICENSE)
[](https://www.python.org/)
[](data/providers.json)
MCP server for the waste collection calendars of German cities and districts.
Looks up collection dates — residual waste, organic waste, paper, packaging,
bulky waste, hazardous waste collection points — for a given address.
```
address ──▶ Nominatim ──▶ municipality + district ──▶ provider search (995)
│
collection dates ◀── portal ◀── resolve arguments
```
## Why this is not trivial
Waste management in Germany is organised municipally. There is **no nationwide
API** — roughly 400 public waste authorities each run their own portal, backed
by a handful of software platforms (Abfall.IO/AbfallPlus, AbfallNavi, Jumomind,
AWIDO, C-Trace, Müllmax, plus many plain ICS exports).
This server uses
[`mampfes/hacs_waste_collection_schedule`](https://github.com/mampfes/hacs_waste_collection_schedule)
(MIT) as its data source — an actively maintained project with over 950 source
modules. Its inner package is independent of Home Assistant and is wired in
here as a Git submodule.
The actual work of this project is turning an *address* into the responsible
waste authority **and its internal parameters**. In Home Assistant a human
clicks that together once; an MCP server has to do it on its own.
## Installation
The server runs **from a repository checkout**, not as an installed package: it
needs the data source under `vendor/` and the registry under `data/`, both
resolved relative to the project root. That is also why it is not on PyPI — a
wheel would install cleanly and still not work.
```bash
git clone --recurse-submodules https://github.com/AlpayC/mcp-abfall.git
cd mcp-abfall
uv sync
uv run pytest
```
`data/providers.json` is checked in, so the server starts right away. After a
submodule update, rebuild it:
```bash
uv run python scripts/build_registry.py
```
## Wiring it up
Locally over stdio — in `claude_desktop_config.json` or `.mcp.json`:
```json
{
"mcpServers": {
"abfall": {
"command": "uv",
"args": ["--directory", "/path/to/mcp-abfall", "run", "mcp-abfall"]
}
}
}
```
As an HTTP service:
```bash
uv run mcp-abfall --http --host 127.0.0.1 --port 8000
```
Keep in mind that every HTTP request puts load on the authorities' portals and
on Nominatim. For anything beyond personal use, put a cache in front and your
own Nominatim instance behind it (`MCP_ABFALL_NOMINATIM_URL`).
## Tools
Tool names and responses are German, because the domain and the users are.
| Tool | Purpose |
|---|---|
| `abfuhrtermine` | Address in, collection dates out. The usual entry point. |
| `finde_traeger` | Search authorities by place or company name, no geocoding. |
| `traeger_details` | Which arguments does an authority expect? |
| `abfuhrtermine_fuer_traeger` | Targeted query, e.g. to answer a follow-up question. |
| `abdeckung` | How many authorities and data sources are covered. |
Plus the resource `abfall://traeger` with the full list of authorities.
### Asking beats guessing
When a value cannot be determined unambiguously, the server returns
`status: "rueckfrage"` along with the concrete list of options instead of
guessing. That is deliberate: a wrongly guessed town cheerfully returns the
neighbouring municipality's calendar — a wrong answer that looks like a right
one.
## Coverage, measured
`scripts/build_registry.py` collects **995 waste authorities** from 150 source
modules.
`scripts/smoke.py` queries real addresses against the real portals. A run over
21 addresses across Germany (as of Aug 2026):
| Outcome | Share |
|---|---|
| Collection dates returned directly | 48 % |
| Follow-up question for a missing detail | 14 % |
| No authority returned dates | 38 % |
That is the measured number, not an estimate — and the reason to state it here:
"covers every German city" is true of the *authority list*, not of fully
automatic resolution from a bare address.
### Authorities with their own ID lookup
Some portals require internal identifiers that cannot be derived from an
address. For these, the portal's address dialog is reimplemented in
`lookup.py`:
| Authority | Identifier | Scope |
|---|---|---|
| Abfall.IO / AbfallPlus | `f_id_kommune`, `f_id_strasse`, … | 41 authorities |
| Stadtreinigung Hamburg | `hnId` | Hamburg |
| Berliner Stadtreinigungsbetriebe | `schedule_id` | Berlin |
The upstream wizard for Hamburg is stale by now — the portal moved its form to
a JavaScript component, whose address endpoint is read out of the page here.
### Where the remaining cases fail
* **Further ID arguments** with no lookup path: `standort` in Dresden,
`idHouseNumber` in Leipzig, `streetnr` in Stuttgart. One more resolver each,
following the same pattern as the three above.
* **Portals using different spellings** that ship no list of suggestions
(Erfurt, Kiel).
* **Outages, rate limiting and malformed responses** on the authorities' side
(Saarbrücken returns HTML instead of ICS).
## Layout
| File | Responsibility |
|---|---|
| `wcs.py` | Bridge to the vendored library; registers the package deliberately instead of putting it on `sys.path` (its parent directory holds a `calendar.py` that shadows the stdlib). |
| `registry.py` | Authority list and location search with German stemming. |
| `geo.py` | Nominatim, address variants, plausibility checks. |
| `resolve.py` | Address → authority → resolved arguments → collection dates. |
| `lookup.py` | Address dialogs for authorities with internal IDs (Abfall.IO, Hamburg, BSR). |
| `server.py` | MCP tools, stdio and HTTP. |
The registry is not built at runtime: `data/providers.json` is produced by a
script so that starting the server does not import 150 modules. Rebuild it
after a submodule update.
## Data sources and usage
Collection dates come from the portals of the respective waste authorities,
address resolution from [Nominatim](https://nominatim.openstreetmap.org/)
(OpenStreetMap). Nominatim has a usage policy — at most one request per second;
the server honours it and caches results in `~/.cache/mcp-abfall/`.
For dates something depends on (bulky waste, hazardous waste collection), it is
worth checking the portal address that every response carries.
## Contributing
The most useful contribution is a report that some authority does not work —
there is an [issue template](.github/ISSUE_TEMPLATE/provider.yml) with the
right questions. How to add an authority resolver is in
[CONTRIBUTING.md](CONTRIBUTING.md); security issues belong in a private report,
see [SECURITY.md](SECURITY.md). Changes are listed in the
[CHANGELOG](CHANGELOG.md). Agents working on this repository should read
[AGENTS.md](AGENTS.md).
One principle runs through the whole project and applies to contributions too:
**when in doubt, ask — do not guess.** A wrongly guessed town cheerfully
returns the neighbouring municipality's calendar — a wrong answer that looks
like a right one.
## License
MIT, see [LICENSE](LICENSE). The submodule
`vendor/hacs_waste_collection_schedule` is under its own MIT license,
Copyright (c) 2020 Steffen Zimmermann — this repository only references it, it
does not ship the code. Third-party attributions are collected in
[NOTICE](NOTICE).
What people ask about mcp-abfall
What is AlpayC/mcp-abfall?
+
AlpayC/mcp-abfall is mcp servers for the Claude AI ecosystem. MCP server for the waste collection calendars of German cities and districts - 995 waste authorities. It has 1 GitHub stars and its last recorded update is dated 2026-08-26.
How do I install mcp-abfall?
+
You can install mcp-abfall by cloning the repository (https://github.com/AlpayC/mcp-abfall) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is AlpayC/mcp-abfall safe to use?
+
Our security agent has analyzed AlpayC/mcp-abfall and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains AlpayC/mcp-abfall?
+
AlpayC/mcp-abfall is maintained by AlpayC. The last recorded GitHub activity is dated 2026-08-26, with 0 open issues.
Are there alternatives to mcp-abfall?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy mcp-abfall to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/alpayc-mcp-abfall)<a href="https://claudewave.com/repo/alpayc-mcp-abfall"><img src="https://claudewave.com/api/badge/alpayc-mcp-abfall" alt="Featured on ClaudeWave: AlpayC/mcp-abfall" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!