WhatsApp MCP Stream
WhatsApp MCP Stream
Ein WhatsApp-MCP-Server, der auf Streamable HTTP-Transport basiert, Baileys für die WhatsApp-Anbindung verwendet und über eine Web-Admin-Oberfläche sowie bidirektionalen Medienfluss (Upload + Download) verfügt.
Kernpunkte:
Transport: Streamable HTTP unter
/mcpEngine: Baileys
Admin-UI: QR, Status, Logout, Laufzeiteinstellungen, Chatverlauf-Viewer
Medien: Upload-Endpunkte +
/media-Hosting + MCP-Download-Tool
Schnellstart (Docker)
# build and run
docker compose build
docker compose up -dDer Server ist erreichbar unter:
Admin-UI:
http://localhost:3003/adminMCP-Endpunkt:
http://localhost:3003/mcpMediendateien:
http://localhost:3003/media/<filename>
Related MCP server: WhatsApp Business API MCP Server
DNS auf Hosts mit --iptables=false
Auf einigen NAS-/gehärteten Hosts (z. B. Synology mit dockerd --iptables=false) besitzt der eingebettete DNS-Proxy von Docker (127.0.0.11) keine iptables-DNAT-Regeln und verweigert Verbindungen innerhalb von Containern.
Lösung: Kopieren Sie resolv.conf.example nach resolv.conf und fügen Sie einen Volume-Override hinzu:
cp resolv.conf.example resolv.confFügen Sie dann Folgendes zu einer lokalen docker-compose.override.yml hinzu (nicht eingecheckt):
services:
mcp-whatsapp:
volumes:
- ./resolv.conf:/etc/resolv.conf:rodocker compose up übernimmt den Override automatisch.
Laufzeiteinstellungen
Einstellungen können in der Admin-UI bearbeitet und unter SETTINGS_PATH gespeichert werden (Standard: MEDIA_DIR/settings.json).
Admin-UI
Admin-Konsole mit Laufzeiteinstellungen, QR-Kopplung, Chatverlauf-Viewer, Export und Status.
Unterstützte Einstellungen:
media_public_base_urlupload_max_mbupload_enabledmax_files_per_uploadrequire_upload_tokenupload_tokenauto_download_mediaauto_download_max_mb
Authentifizierung
Eine eingebaute Authentifizierung ist noch nicht implementiert. Verwenden Sie in der Produktion ein Gateway, das die Authentifizierung durchsetzt. Dieses Projekt funktioniert gut hinter authmcp-gateway:
https://github.com/loglux/authmcp-gatewayMedien-Upload-API
Base64-JSON:
curl -X POST http://localhost:3003/api/upload \
-H "Content-Type: application/json" \
-d {filename:photo.jpg,mime_type:image/jpeg,data:<base64>}Multipart (empfohlen für große Dateien):
curl -X POST http://localhost:3003/api/upload-multipart \
-F "file=@/path/to/file.jpg"Beide geben url und (falls konfiguriert) publicUrl zurück.
Senden lokaler Dateien über send_media
Das Verzeichnis ./files/ im Projektstamm wird per Bind-Mount in den Container unter /app/files eingebunden. Legen Sie dort eine Datei ab und referenzieren Sie sie sofort – kein Container-Neustart erforderlich:
# On host:
cp report.pdf /path/to/whatsapp-mcp-stream/files/
# In send_media:
media_path: /app/files/report.pdfBei einer URL-Quelle übergeben Sie media_url direkt an send_media oder stage_media – der Server lädt die Datei selbst herunter, ohne base64.
Upload-Authentifizierung (optional)
Wenn require_upload_token=true gesetzt ist, übergeben Sie ein Token über eines der folgenden:
x-upload-token: <token>Authorization: Bearer <token>
MCP-Transport
Der Server stellt Streamable HTTP unter /mcp bereit.
Typischer Ablauf:
POST /mcpmit JSON-RPCinitializeVerwenden Sie den zurückgegebenen
mcp-session-id-Header für nachfolgende Anfragen.POST /mcpfür Tool-Aufrufe
Hinweis: Clients müssen bei initialize Accept: application/json, text/event-stream senden.
Smoke-Test
Kurzer Regressions-Smoke-Test für MCP-Tools:
npm run smoke:mcpOptional benutzerdefiniertes Ziel:
MCP_BASE_URL=http://localhost:3003 npm run smoke:mcpMCP-Tools
Authentifizierung
Tool | Beschreibung |
| Ruft den neuesten WhatsApp-QR-Code als Bild zur Authentifizierung ab. |
| Prüft, ob der WhatsApp-Client authentifiziert und bereit ist. |
| Meldet bei WhatsApp ab und löscht die aktuelle Sitzung. |
Kontakte
Tool | Beschreibung |
| Durchsucht Kontakte nach Name oder Telefonnummer. |
| Löst einen Kontakt nach Name oder Telefonnummer auf (beste Übereinstimmungen). |
| Ruft Kontaktdetails anhand der JID ab. |
| Ruft die Profilbild-URL für eine JID ab. |
| Ruft Gruppen-Metadaten und -Teilnehmer anhand der Gruppen-JID ab. |
Chats
Tool | Beschreibung |
| Listet Chats mit Metadaten und optionaler letzter Nachricht auf. |
| Ruft Chat-Metadaten anhand der JID ab. |
| Listet ausschließlich Gruppen-Chats auf. |
| Löst eine direkte Chat-JID anhand einer Telefonnummer auf. |
| Löst einen Kontakt nach Name oder Telefonnummer auf und gibt die Chat-Metadaten zurück. |
| Findet Mitglieder, die in mehreren Gruppen vorkommen. |
| Findet Gruppenmitglieder ohne direkten Chat. |
| Findet Gruppenmitglieder, die in den Kontakten fehlen. |
| Führt eine kombinierte Gruppen-Audit als einen Routinevorgang aus. |
Nachrichten
Tool | Beschreibung |
| Ruft Nachrichten aus einem bestimmten Chat ab. |
| Durchsucht Nachrichten nach Text (optional auf einen Chat eingeschränkt). |
| Ruft eine bestimmte Nachricht anhand der ID ( |
| Ruft die letzten Nachrichten rund um eine bestimmte Nachricht ab. |
| Ruft die neueste Nachricht für eine JID ab. |
| Sendet eine Textnachricht an eine Person oder Gruppe. Unterstützt optionalen |
Medien
Tool | Beschreibung |
| Sendet Medien (Bild/Video/Dokument/Audio). Akzeptiert |
| Speichert eine Datei im Medienverzeichnis des Servers und gibt deren lokalen Pfad zurück. Verwenden Sie den zurückgegebenen |
| Lädt Medien aus einer Nachricht herunter. |
Dienstprogramme
Tool | Beschreibung |
| Health-Check-Tool. |
Wiederherstellungshinweise
Dieser Dienst enthält einen bewusst eingebauten Wiederherstellungs-Workaround für die Korruption des Baileys/WhatsApp-Session-State.
Warum es das gibt:
In Produktion haben wir Fälle beobachtet, in denen der Container am Leben blieb und MCP noch antwortete, die WhatsApp-Sitzung aber funktional gestört war.
Die häufigsten Indikatoren waren Baileys-Fehler wie
failed to find key ... to decode mutationundfailed to sync state from version.In diesem Zustand stellte ein manueller Container-Neustart den Dienst oft wieder her.
Aktuelles Verhalten:
Bei Signalen für App-State-Korruption versucht der Dienst zuerst eine sanfte Wiederherstellung mit
forceResync().Wiederholt sich dieselbe Fehlerklasse innerhalb eines Zeitfensters, eskaliert er zu einem internen Neustart des WhatsApp-Clients.
Bei Trennungen wie
Connection Terminatedplant der Dienst einen Disconnect-Watchdog und eskaliert zu einem internen Neustart, wenn der Socket nicht rechtzeitig wieder inopenübergeht.Der Reconnect-Lebenszyklus ist gegen verschachtelte Lock-Deadlocks abgesichert, sodass die Wiederherstellung nach einer Trennung ohne manuellen Container-Neustart abgeschlossen werden kann.
Aktuelle Produktionsbeobachtungen zeigen wiederholte Socket-Trennungen (
428 Connection Terminated,503 Stream Errored), die automatisch wieder inopenüberführt werden.Ein dedizierter
/healthz-Endpunkt meldet503nur, wenn der Dienst tatsächlich außerhalb des zulässigen Wiederherstellungsfensters festhängt.Docker-Healthchecks verwenden
/healthz, sodass der Container erst dann neu gestartet wird, wenn die In-Process-Wiederherstellung Gelegenheit hatte.
Diese Wiederherstellungsmechanismen reduzieren den Bedarf an manuellen Eingriffen und verbessern die Robustheit gegenüber häufigen WhatsApp/Baileys-Sitzungsfehlern.
Lizenz
MIT
Persistenz
Chats und Nachrichten werden in einer lokalen SQLite-Datenbank im Session-Volume gespeichert.
Umgebungsvariablen:
Variable | Standard | Beschreibung |
|
| SQLite-Datenbankpfad für die Persistenz von Chats/Nachrichten. |
|
| Detaillierte WhatsApp-Ereignisprotokolle aktivieren. |
|
| Rohen Baileys-Ereignisstream für tiefgehendes Debugging in eine Datei schreiben. |
|
| Dateipfad für das Ereignisstream-Protokoll. |
|
| Sicherheitsnetz für Wiederverbindung nach erzwungener Resynchronisierung aktivieren. |
|
| Verzögerung vor der Wiederverbindung nach erzwungener Resynchronisierung (ms). |
|
| Mindestverzögerung zwischen automatischen App-State-Wiederherstellungen. |
|
| Zeitfenster zur Zählung wiederholter App-State-Beschädigungsfehler. |
|
| Anzahl weicher Wiederherstellungen, bevor zu einem internen Neustart eskaliert wird. |
|
| Gnadenfrist während Wiederherstellung/Trennung, bevor |
|
| Wie lange nach einem Socket-Schließen gewartet wird, bevor der Trennungs-Watchdog Wiederverbindung/Neustart erzwingt. |
|
| Durch Kommas getrennte Trennung-Statuscodes, die direkt zu einem internen Neustart-Watchdog eskalieren sollen. |
|
| Exakte doppelte |
|
| Wie lange abgeschlossene |
|
| Maximale In-Memory-Einträge für den Nachrichtenindex ( |
|
| Maximale In-Memory-Einträge für den Nachrichtenschlüsselindex ( |
|
| WhatsApp-Client-Initialisierung gegen diese Frist laufen lassen; auf |
|
| Maximale parallele Auto-Downloads. Auto-Download läuft über eine prozessinterne begrenzte Warteschlange, sodass ein Schub eingehender Medien das I/O nicht sättigen kann. |
|
| Maximale in der Warteschlange befindliche Auto-Download-Aufträge. Überschuss wird FIFO (älteste zuerst) mit einer Warnung im Protokoll verworfen; aktuelle Nachrichten bleiben priorisiert. |
|
| Standardmäßig direkte JSON-Antworten für Streamable-HTTP-POST-Anfragen verwenden. Auf |
Zusätzliche Transportdiagnose:
/mcp-POST-Anfragen protokollieren jetzt Anfrage-Lebenszyklusereignisse inlogs/mcp-whatsapp.logdies umfasst Anfrageeingang, Transport-Dispatch, Abschluss von
transport.handleRequestsowie HTTPfinish/closeVerwenden Sie diese Protokolle, um festzustellen, ob die Latenz auftritt, bevor die Antwort
whatsapp-mcp-streamverlässt, oder danach auf der Gateway-/Client-Seite
Chatverlauf-API
Durchsuchen Sie gespeicherte Chats und Nachrichten über:
GET /api/chats?limit=50&offset=0&q=<search> — paginierte Chatliste, optional nach Name gefiltert.
GET /api/chats/:jid/messages?limit=50&offset=0 — paginierte Nachrichten für einen Chat (neueste zuerst).
Beide Endpunkte werden von der Registerkarte Chats in der Admin-Oberfläche verwendet.
Export
Exportieren Sie einen Chat (JSON + optional heruntergeladene Medien) über:
GET /api/export/chat/:jid?include_media=true
Wenn include_media=true, enthält das ZIP Dateien, die bereits über download_media heruntergeladen wurden. Es ruft fehlende Medien nicht von WhatsApp ab.
This server cannot be deployed
Maintenance
Related MCP Connectors
WhatsApp (Web + Business API), SMS, contacts, and call records via 2Chat's MCP server.
Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.
Send and read WhatsApp messages, templates, chats and campaigns through the official Business API.
WhatsMCP connects Claude and other MCP-compatible AI agents directly to WhatsApp. Send and receive text, images, documents, and voice notes; manage groups (create, add/remove members, promote admins); look up contacts and profiles; follow channels; and read call and message history — all through a standard MCP interface. For voice use cases, WhatsMCP offers SIP-based calling plans (inbound-only, or full inbound/outbound) so AI voice agents can answer and place WhatsApp calls, plus low-latency WebSocket integrations with voice agent providers like ElevenLabs. Multiple WhatsApp accounts can be paired and managed per workspace, with webhook support for real-time inbound message delivery to your own infrastructure.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables WhatsApp automation through MCP protocol, allowing users to manage sessions, send messages, handle groups/communities, and access contacts through natural language interactions with AI agents.7 npm-
- AlicenseNot gradedqualityDmaintenanceEnables sending messages, managing templates, uploading media, and configuring webhooks for WhatsApp Business via the MCP protocol.8 npm5MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to send and receive WhatsApp messages, search chats, share media, manage approvals, and get activity summaries through MCP.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables connecting a personal or business WhatsApp account via QR pairing and then sending/reading messages, managing chats, contacts, groups, and searching message history through MCP tools.MIT