vdl-mcp: Videos laden und transkribieren lassen, vom KI-Assistenten aus
Ein KI-Assistent kann einen YouTube-Link nicht anschauen, aber er kann das Transkript lesen. vdl-mcp schließt diese Lücke: ein MCP-Server, der einen Assistenten wie Claude mit einer selbst gehosteten vdl-Instanz verbindet. Der Assistent löst einen Link auf, lädt die Datei, lässt sie mit Whisper transkribieren und kann danach fassen, was drinsteht. Beispiele sind „Lade dieses YouTube-Video und fass es zusammen“, „Zieh das Kochvideo und schreib mir das Rezept als Liste“ oder „Lade den Ton dieses Vortrags und gib mir die Kernpunkte“.
Was vdl ist
vdl ist ein Video- und Audio-Downloader zum Selbsthosten: Link einfügen, Qualität oder MP3 wählen, die Datei landet auf dem eigenen Server. Er läuft als Docker-Container, setzt auf yt-dlp, kennt eigene Extraktoren für Instagram, TikTok, YouTube, Facebook und Snapchat und fällt für alles andere auf yt-dlp zurück. Dazu kommen eine Dateiverwaltung mit Suche und Labels, ein Ausschnittsmodus, lokale Transkription mit Whisper, Benachrichtigungen und eine MQTT-Anbindung für Home Assistant. vdl ist noch nicht veröffentlicht; das Repository ist privat.
Gedacht ist es für Inhalte, die einem gehören oder für die man die Rechte oder eine ausdrückliche Erlaubnis hat. Dasselbe gilt für vdl-mcp.
Wie vdl-mcp arbeitet
vdl-mcp ist ein kleiner stdio-Server, den der MCP-Client lokal startet. Er ruft die REST-API von vdl auf und meldet sich mit einem Token an; in vdl läuft nichts Zusätzliches. Er öffnet keinen Netzwerk-Port und hat deshalb weder eine Login-Seite noch fail2ban – es gibt nichts Eingehendes zu schützen. Anmeldung und Brute-Force-Schutz übernimmt vdl selbst.
Die Werkzeuge:
resolve(url)analysiert einen Link und zeigt Items und Qualitäten, ohne etwas zu laden.download(url, audio, section, wait)lädt in bester Qualität oder als MP3. Mitsectionwird zugeschnitten (0:30-1:00), und mitwaitkommt der Name der fertigen Datei zurück.transcribe(name, language)ruft die Whisper-Transkription auf, was ein Whisper-Modell in vdl voraussetzt;get_transcript(name)liefert den Text eines vorhandenen Transkripts.list_files(query, service, label, limit)durchsucht die Downloads,job_status(job_id)prüft einen Job.
Was aus bleibt
Die Werkzeuge sind in Gruppen schaltbar, mit sicherer Vorbelegung. Lesen, Download und Transkribieren sind an. Aus sind delete_file, bulk (Massenaktionen) und get_settings. Eine deaktivierte Gruppe ist für den Assistenten unsichtbar, er sieht das Werkzeug also gar nicht. Zusätzlich gibt es einen Nur-Lesen-Notschalter, Pro-Tool-Overrides wie VDL_MCP_TOOL_download=off und eine Domain-Allowlist. Die Reihenfolge, nach der entschieden wird, ob ein Werkzeug sichtbar ist: Nur-Lesen (Umgebung oder Oberfläche), Pro-Tool-Override, Weboberfläche, Gruppenschalter.
Die Allowlist hat einen Grund. Eine beliebige URL auf Zuruf eines Assistenten zu laden, bietet Angriffsfläche für Prompt Injection: Ein Text auf einer Webseite kann dem Assistenten sagen, er solle etwas laden. VDL_MCP_DOMAIN_ALLOWLIST=youtube.com,instagram.com beschränkt, von welchen Host-Endungen er laden darf. Außerdem handelt der Assistent über das Token als der Nutzer selbst. In vdl gibt es dafür einen eigenen Reiter „MCP“ mit einem eigenen Token, das nur die dort aktivierten MCP-Aktionen darf; schreibende und löschende Werkzeuge respektieren die Schalter und den Nur-Lesen-Modus, alles andere lehnt vdl serverseitig ab. In den Einstellungen von vdl lässt sich jedes Werkzeug auch einzeln ein- und ausschalten, mit Risiko-Markierungen. vdl-mcp holt diese Konfiguration beim Start, nach Änderungen muss es also neu gestartet werden.
Einrichtung
Voraussetzung sind eine laufende vdl-Instanz, Python ab 3.10 und das Token aus dem MCP-Reiter. Installiert wird mit pipx (oder uv tool install):
pipx install git+https://github.com/sphings79/vdl-mcpFür Claude Desktop kommt in die claude_desktop_config.json:
{
"mcpServers": {
"vdl": {
"command": "vdl-mcp",
"env": {
"VDL_URL": "http://localhost:8000",
"VDL_TOKEN": "dein-api-token"
}
}
}
}Danach Claude Desktop neu starten, und die vdl-Werkzeuge erscheinen. Jeder andere MCP-fähige Client funktioniert gleich, wenn er das Kommando vdl-mcp über stdio startet. Wer lieber einen Container nutzt, trägt docker als Befehl ein, mit den Argumenten run -i --rm -e VDL_URL -e VDL_TOKEN ghcr.io/sphings79/vdl-mcp:latest. Wichtig ist -i, damit stdin für stdio offen bleibt, und host.docker.internal als Adresse, wenn vdl auf demselben Host läuft. Konfiguriert wird sonst über Umgebungsvariablen, unter anderem VDL_URL (voreingestellt http://localhost:8000), VDL_MCP_READ_ONLY und VDL_MCP_TIMEOUT (voreingestellt 30 Sekunden).
Zu den Projekten
-
vdl-mcp
MCP-Server für vdl: KI-Assistenten wie Claude lösen Links auf, laden Videos über die eigene vdl-Instanz herunter und lassen sie mit Whisper transkribieren. Schaltbare Tool-Gruppen, destruktive Funktionen standardmäßig aus.
-
vdl
Selbst gehosteter Video- und Audio-Downloader als Weboberfläche für Docker, auf Basis von yt-dlp: Link einfügen, Qualität wählen, die Datei landet auf dem eigenen Server. Noch nicht veröffentlicht, das Repository ist privat.
Unterstützen
Diese Tools entstehen in meiner Freizeit und bleiben kostenlos, offen und cloud-frei. Wenn dir eins davon einen Nachmittag gespart hat, freue ich mich über einen Kaffee oder ein Stück Pizza.
Kaffee oder PizzaWeitere Beiträge
- Rollladen-Steuerung pro Raum: Taster, Fenster, Kälte und Regen Eine Automation pro Raum, die Taster, Fensterkontakt, Kälte, Regen und die Zeit vor Sonnenaufgang zusammenführt. Zwei Merker-Helfer verhindern, dass sich die Auslöser gegenseitig überfahren.
- Stromausfall erkennen und Geräte wiederherstellen in Home Assistant Nach einem Stromausfall booten Lampen und Steckdosen in zufälligen Zuständen. Drei Erkennungswege, ein gemeinsames Script und ein Wiederherstellungsfenster bringen alles wieder in den gewünschten Zustand.
- Rauchmelder löst aus: Alle Rollläden fahren hoch (Home Assistant) Bei Rauchalarm sollen die Rollläden im ganzen Haus hochfahren, damit Fenster als Fluchtweg frei sind. Die Automation ist kurz – aber ein fehlendes „from“ im Trigger entscheidet darüber, ob sie im Ernstfall überhaupt feuert.