Skip to main content
Glama
AlpayC
by AlpayC

mcp-abfall

英語 · ドイツ語

CI License: MIT Python 3.11+ Providers: 995

ドイツの都市と郡のごみ収集カレンダーを提供するMCPサーバー。指定された住所について、収集日(残余廃棄物、生ごみ、紙、包装材、粗大ごみ、有害廃棄物の収集場所)を検索します。

address ──▶ Nominatim ──▶ municipality + district ──▶ provider search (995)
                                                              │
                       collection dates ◀── portal ◀── resolve arguments

なぜこれは簡単ではないのか

ドイツの廃棄物管理は自治体単位で運営されています。全国規模のAPIは存在しません。約400の公的廃棄物当局がそれぞれ独自のポータルを運営しており、その背後には少数のソフトウェアプラットフォーム(Abfall.IO/AbfallPlus、AbfallNavi、Jumomind、AWIDO、C-Trace、Müllmax、その他多数の単純なICSエクスポート)があります。

このサーバーは、データソースとして mampfes/hacs_waste_collection_schedule (MIT) を使用しています。これは950以上のソースモジュールを備え、活発にメンテナンスされているプロジェクトです。その内部パッケージはHome Assistantから独立しており、ここではGitサブモジュールとして組み込まれています。

このプロジェクトの実際の作業は、住所を担当の廃棄物当局とその内部パラメータに変換することです。Home Assistantでは人間が一度クリックするだけで済みますが、MCPサーバーはそれを自力で行わなければなりません。

Related MCP server: vnbdigital-mcp

インストール

このサーバーは、インストールされたパッケージとしてではなくリポジトリのチェックアウトから実行されます。vendor/ ディレクトリのデータソースと data/ ディレクトリのレジストリが必要で、どちらもプロジェクトルートからの相対パスで解決されます。これがPyPIにない理由でもあります。wheelは正常にインストールされるでしょうが、それでも動作しません。

git clone --recurse-submodules https://github.com/AlpayC/mcp-abfall.git
cd mcp-abfall
uv sync
uv run pytest

data/providers.json はリポジトリにチェックインされているので、サーバーはすぐに起動します。サブモジュールを更新したら、再構築してください:

uv run python scripts/build_registry.py

接続方法

ローカルではstdio経由 — claude_desktop_config.json または .mcp.json で:

{
  "mcpServers": {
    "abfall": {
      "command": "uv",
      "args": ["--directory", "/path/to/mcp-abfall", "run", "mcp-abfall"]
    }
  }
}

HTTPサービスとして:

uv run mcp-abfall --http --host 127.0.0.1 --port 8000

すべてのHTTPリクエストが当局のポータルとNominatimに負荷をかけることに注意してください。個人利用を超える用途では、前面にキャッシュを置き、その背後に独自のNominatimインスタンスを配置してください(MCP_ABFALL_NOMINATIM_URL)。

ツール

ツール名と応答はドイツ語です。ドメインとユーザーがドイツ語だからです。

ツール

目的

abfuhrtermine

住所を入力すると収集日を返します。通常のエントリポイントです。

finde_traeger

ジオコーディングなしで、場所または事業者名で当局を検索します。

traeger_details

当局がどの引数を期待するかを示します。

abfuhrtermine_fuer_traeger

対象を絞ったクエリ。フォローアップの質問に答える場合などに使用します。

abdeckung

カバーされている当局とデータソースの数を示します。

さらに、当局の完全なリストを持つリソース abfall://traeger があります。

推測より尋ねる

値が一意に決定できない場合、サーバーは推測する代わりに、具体的な選択肢のリストとともに status: "rueckfrage" を返します。これは意図的な設計です。町を誤って推測すると、隣接する自治体のカレンダーが平然と返ってきます。それは正しい答えのように見える間違った答えです。

カバレッジ(実測値)

scripts/build_registry.py は、150のソースモジュールから995の廃棄物当局を収集します。

scripts/smoke.py は実際のポータルに対して実際の住所を照会します。ドイツ全土の21の住所での実行(2026年8月時点):

結果

割合

収集日が直接返された

48 %

不足している詳細についてのフォローアップ質問

14 %

当局が日付を返さなかった

38 %

これは推定ではなく実測値です。そして、ここでその数字を述べる理由でもあります。「すべてのドイツの都市をカバーしている」というのは、当局リストについては真実ですが、素の住所から完全に自動で解決することについては真実ではありません。

独自のIDルックアップを持つ当局

一部のポータルは、住所から導出できない内部識別子を必要とします。これらのために、ポータルの住所ダイアログが lookup.py に再実装されています:

当局

識別子

範囲

Abfall.IO / AbfallPlus

f_id_kommune, f_id_strasse, …

41の当局

Stadtreinigung Hamburg

hnId

ハンブルク

Berliner Stadtreinigungsbetriebe

schedule_id

ベルリン

アップストリーム側のハンブルク用ウィザードは、現在では古くなっています。ポータルがフォームをJavaScriptコンポーネントに移行したため、ここではその住所エンドポイントをページから読み出しています。

残りのケースが失敗する場所

  • ルックアップパスがない追加のID引数: ドレスデンの standort、ライプツィヒの idHouseNumber、シュトゥットガルトの streetnr。それぞれ、上記3つと同じパターンに従うリゾルバがもう1つ必要です。

  • 異なる綴りを使用し、候補リストを提供しないポータル(エアフルト、キール)。

  • 当局側の障害、レート制限、不正なレスポンス(ザールブリュッケンはICSの代わりにHTMLを返します)。

レイアウト

ファイル

役割

wcs.py

ベンダー提供ライブラリへのブリッジ。パッケージを sys.path に置くのではなく意図的に登録します(その親ディレクトリには stdlib を隠す calendar.py があります)。

registry.py

当局リストと、ドイツ語のステミングによる場所の検索。

geo.py

Nominatim、住所のバリエーション、妥当性チェック。

resolve.py

住所 → 当局 → 解決済み引数 → 収集日。

lookup.py

内部IDを持つ当局(Abfall.IO、ハンブルク、BSR)の住所ダイアログ。

server.py

MCPツール、stdio、HTTP。

レジストリは実行時に構築されません。data/providers.json はスクリプトによって生成され、サーバー起動時に150のモジュールをインポートしないようにしています。サブモジュールの更新後は再構築してください。

データソースと利用方法

収集日は各廃棄物当局のポータルから取得され、住所解決は Nominatim (OpenStreetMap) から取得されます。Nominatimには利用ポリシーがあり、1秒あたり最大1リクエストまでです。サーバーはこれを尊重し、結果を ~/.cache/mcp-abfall/ にキャッシュします。

粗大ごみや有害廃棄物の収集など、日程に依存する用事がある場合は、各レスポンスに含まれるポータルアドレスを確認する価値があります。

コントリビューション

最も有用なコントリビューションは、ある当局が動作しないという報告です。適切な質問がまとめられた issueテンプレート があります。当局リゾルバの追加方法は CONTRIBUTING.md にあります。セキュリティ上の問題は非公開の報告に含めるべきです。SECURITY.md を参照してください。変更履歴は CHANGELOG に記載されています。このリポジトリで作業するエージェントは AGENTS.md を読むべきです。

プロジェクト全体に通じる一つの原則は、コントリビューションにも適用されます。疑わしいときは推測せず、尋ねること。 町を誤って推測すると、隣接する自治体のカレンダーが平然と返ってきます。それは正しい答えのように見える間違った答えです。

ライセンス

MITライセンスです。LICENSE を参照してください。サブモジュール vendor/hacs_waste_collection_schedule は独自のMITライセンスの下にあります。Copyright (c) 2020 Steffen Zimmermann — このリポジトリはそれを参照するだけで、コードを同梱しません。第三者の帰属表示は NOTICE にまとめられています。

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying German distribution grid operator data from vnbdigital.de and BDEW register, including lookup by ID, postcode, coordinates, and free-text search.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Keyless remote MCP server for German public-infrastructure open data: weather, air quality, traffic, public transit, parking and roadworks across 84+ German cities (DWD, Umweltbundesamt, Mobilithek, GovData). 38 read-only tools.
    12
    13
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides programmatic access to official German Bundestag parliamentary data, enabling LLMs to answer questions about legislation, voting records, and members.
    1
    MIT

View all related MCP servers

Related MCP Connectors

  • GovData.de MCP — Germany's national open-data portal (CKAN API).

  • Real public holiday lookup for 206 countries via a rule-based calendar engine. Paid via x402.

  • Verified, citable German & EU law for any LLM. Daily updates from official sources, hosted in DE.

View all MCP Connectors

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/AlpayC/mcp-abfall'

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