fritzmoles-mcp
Ein MCP-Server, der KI-Assistenten (z. B. Claude) Zugriff auf die Telefonie-Funktionen einer FRITZ!Box gibt: Anruflisten (ein-/ausgehend/verpasst), Anrufbeantworter und Sprachnachrichten, Rufsperren, Rufumleitungen und Telefonbuch-Suche. Netzwerk-Administration (WLAN, Portfreigaben, Heimnetz, ...) ist bewusst nicht enthalten.
Zielgruppe: wer Claude als Assistenten fürs (Geschäfts-)Telefon nutzt — "Wer hat heute angerufen?", "Gibt es neue Nachrichten auf dem AB?", "Sperre die Nummer 0900...", "Schalte die Rufumleitung aufs Handy ein".
graph LR
Host["MCP-Host<br/>(Claude Desktop / Claude Code / ...)"] -->|stdio, JSON-RPC| MCP["fritzmoles-mcp"]
MCP -->|TR-064 / SOAP| BOX["FRITZ!Box<br/>X_AVM-DE_OnTel, X_AVM-DE_TAM, X_VoIP"]
MCP -->|HTTP, Listen-XML| BOX
style MCP fill:#2b6cb0,color:#fff
Die Kommunikation läuft über die offizielle, von AVM dokumentierte
TR-064-Schnittstelle (via
fritzconnection). Kein Scraping der Weboberfläche.
Getestet gegen eine FRITZ!Box 7490 mit FRITZ!OS 7.62.
Tools
Anruflisten & Rufnummern
| Tool | Beschreibung |
|---|---|
get_call_list |
Anrufliste, filterbar nach kind (all, incoming, missed, outgoing, rejected = durch Rufsperre abgewiesen, active), days und max_entries. Liefert je Anruf Typ, Datum (ISO), Rufnummern, Name aus dem Telefonbuch, Gerät, Dauer sowie Flags für Fax/AB-Anrufe. |
get_own_numbers |
Eigene Rufnummern (MSNs / SIP-Konten) der Box. |
search_phonebook |
Telefonbuch-Suche nach Namens- oder Nummernfragment (z. B. um Anrufer aufzulösen). |
list_phonebooks |
Vorhandene Telefonbücher (ID + Name). |
Anrufbeantworter (TAM)
| Tool | Beschreibung |
|---|---|
list_answering_machines |
Alle Anrufbeantworter mit Status (aktiv, läuft, Restkapazität in Minuten, voll/belegt). |
get_answering_machine |
Details eines AB: Modus, Klingelverzögerung, zugeordnete Rufnummern. |
list_voicemails |
Nachrichten eines AB (optional nur neue), mit Anrufer, Name, Datum, Dauer. |
mark_voicemail ✏️ |
Nachricht als gelesen/ungelesen markieren. |
delete_voicemail ✏️ |
Nachricht löschen. |
download_voicemail ✏️ |
Aufnahme einer Nachricht als Datei herunterladen (Standardordner FRITZ_DOWNLOAD_DIR). |
set_answering_machine_enabled ✏️ |
Anrufbeantworter ein-/ausschalten. |
Rufsperren
| Tool | Beschreibung |
|---|---|
list_call_barrings |
Alle gesperrten Rufnummern mit uniqueid. |
get_call_barring |
Sperreintrag zu einer Nummer nachschlagen (blocked: false, wenn die Nummer nicht gesperrt ist). |
add_call_barring ✏️ |
Eingehende Rufnummer sperren (optional mit Name). |
remove_call_barring ✏️ |
Sperre per uniqueid oder Rufnummer entfernen. |
Rufumleitungen
| Tool | Beschreibung |
|---|---|
list_call_forwardings |
Alle Rufumleitungen mit ID, Status, Typ (z. B. alle Anrufer / bestimmte Nummer / anonyme Anrufer), Modus (sofort / bei besetzt / verzögert ...) und Zielnummer. kind ist forward oder block: FRITZ!OS führt über die Weboberfläche angelegte Rufsperren intern als Umleitung mit Modus "nicht signalisieren". |
get_call_forwarding |
Details einer Rufumleitung. |
set_call_forwarding_enabled ✏️ |
Rufumleitung ein-/ausschalten. |
Wählhilfe
| Tool | Beschreibung |
|---|---|
dial_number ✏️ |
Ruf über die FRITZ!Box-Wählhilfe aufbauen (das eigene Telefon klingelt zuerst, dann wird gewählt). Wählhilfe muss in der Box aktiviert sein. |
hangup ✏️ |
Über die Wählhilfe gestarteten Ruf abbrechen. |
✏️ = verändert den Zustand der Box. Mit FRITZ_READ_ONLY=true werden diese Tools gar nicht erst registriert.
Alle Tools liefern ein Dict; im Fehlerfall {"error": "..."} statt einer Exception, damit der
Assistent die Ursache (falsche Zugangsdaten, fehlende Rechte, ungültiger Index, ...) lesen kann.
Was TR-064 nicht kann
- Rufumleitungen anlegen oder löschen. AVM stellt per TR-064 nur
GetDeflections/SetDeflectionEnablebereit. Regeln einmal in der Weboberfläche anlegen (Telefonie → Rufbehandlung → Rufumleitung), dann per Claude ein-/ausschalten. - Rufsperren für ausgehende Rufnummernbereiche (0900, Ausland, ...) — TR-064 kennt nur die Sperrliste für eingehende Rufnummern.
- Sprachnachrichten in Text umwandeln.
download_voicemaillegt die Aufnahme als Datei ab; die Transkription muss ein anderes Werkzeug übernehmen.
Voraussetzungen auf der FRITZ!Box
- TR-064 aktivieren: Heimnetz → Netzwerk → Netzwerkeinstellungen → "Zugriff für Anwendungen zulassen" (bei neueren FRITZ!OS-Versionen unter "Heimnetzfreigaben").
- Eigenen Benutzer anlegen (System → FRITZ!Box-Benutzer) mit den Rechten FRITZ!Box Einstellungen und Sprachnachrichten, Faxnachrichten, FRITZ!App Fon und Anrufliste. Kein Admin-Vollzugriff nötig, aber das Recht "Telefonie" (Phone) ist für alle Tools Pflicht.
- Für
dial_number: Telefonie → Anrufe → Wählhilfe aktivieren.
Installation
uvx fritzmoles-mcp # einmalig ausführen / testen
# oder dauerhaft:
uv tool install fritzmoles-mcp
Konfiguration (ENV oder .env)
Zugangsdaten kommen ausschließlich aus Umgebungsvariablen oder einer .env-Datei im
Arbeitsverzeichnis (siehe .env.example). Gesetzte Umgebungsvariablen haben
Vorrang vor .env.
| Variable | Pflicht | Default | Bedeutung |
|---|---|---|---|
FRITZ_HOST |
nein | fritz.box |
Hostname oder IP der Box |
FRITZ_USERNAME |
ja | – | FRITZ!Box-Benutzer |
FRITZ_PASSWORD |
ja | – | Passwort |
FRITZ_PORT |
nein | 49000 / 49443 |
TR-064-Port (TLS-Port wird automatisch gewählt) |
FRITZ_TLS |
nein | false |
HTTPS für TR-064 verwenden |
FRITZ_TIMEOUT |
nein | 10 |
Timeout je Anfrage in Sekunden |
FRITZ_READ_ONLY |
nein | false |
true → nur lesende Tools registrieren |
FRITZ_DOWNLOAD_DIR |
nein | ~/fritz-voicemails |
Zielordner für download_voicemail |
Claude Code
claude mcp add --scope user fritzmoles \
-e FRITZ_HOST=fritz.box -e FRITZ_USERNAME=... -e FRITZ_PASSWORD=... \
-- uvx fritzmoles-mcp
Wer die Zugangsdaten nicht in ~/.claude.json haben möchte, registriert stattdessen ein kleines
Wrapper-Skript, das FRITZ_* aus einem Secret-Store (z. B. OpenBao/Vault, KeePass, pass)
exportiert und dann exec uvx fritzmoles-mcp aufruft.
Claude Desktop
claude_desktop_config.json (siehe mcp.example.json):
{
"mcpServers": {
"fritzmoles": {
"command": "uvx",
"args": ["fritzmoles-mcp"],
"env": {
"FRITZ_HOST": "fritz.box",
"FRITZ_USERNAME": "fritz1234",
"FRITZ_PASSWORD": "..."
}
}
}
}
Entwicklung
git clone https://github.com/the78mole/fritzmoles-mcp.git
cd fritzmoles-mcp
uv sync --extra dev
uv run pytest # Unit-Tests mit Coverage (ohne Box, über eine Fake-Verbindung)
uv run ruff check . && uv run ruff format .
pre-commit install
Gegen eine echte Box testen:
cp .env.example .env # Zugangsdaten eintragen
uv run mcp dev src/fritzmoles_mcp/server.py # MCP Inspector
Siehe CONTRIBUTING.md für Commit-Konventionen (Conventional Commits steuern die automatische Versionierung) und den Release-Ablauf.
Lizenz
MIT — Daniel Glaser
Metadata
Release files for fritzmoles-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fritzmoles_mcp-0.1.1.tar.gz | 111.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fritzmoles_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 129.9 kB
Release files / fritzmoles_mcp-0.1.1.tar.gz
| Download URL | fritzmoles_mcp-0.1.1.tar.gz |
|---|---|
| Size | 111.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8a17da134ef35e06a8eecce7179de97389496ec45cdc9222c68c459e2eb0c6d2
|
|
BLAKE2b-256 checksum How to use checksums |
f244aa1fb3eba7805edd94af5fce975b3ff7a7e571bb87f95d2e978a4427ca9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logRelease files / fritzmoles_mcp-0.1.1-py3-none-any.whl
| Download URL | fritzmoles_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 18.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
89c9514623623734746633e7063303683646300eab932c4979bc2fa5f83e8c6c
|
|
BLAKE2b-256 checksum How to use checksums |
a9a6a04019a5571f4ab25b8ac7ad37ebaf3057ca10b0f06ad249c474f5ef1372
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency log