Skip to main content
Glama
BusinessNone

WhatsApp MCP Stream

by BusinessNone

WhatsApp MCP Stream

CI

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 /mcp

  • Engine: 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 -d

Der Server ist erreichbar unter:

  • Admin-UI: http://localhost:3003/admin

  • MCP-Endpunkt: http://localhost:3003/mcp

  • Mediendateien: 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.conf

Fügen Sie dann Folgendes zu einer lokalen docker-compose.override.yml hinzu (nicht eingecheckt):

services:
  mcp-whatsapp:
    volumes:
      - ./resolv.conf:/etc/resolv.conf:ro

docker 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-UI Admin-Konsole mit Laufzeiteinstellungen, QR-Kopplung, Chatverlauf-Viewer, Export und Status.

Unterstützte Einstellungen:

  • media_public_base_url

  • upload_max_mb

  • upload_enabled

  • max_files_per_upload

  • require_upload_token

  • upload_token

  • auto_download_media

  • auto_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-gateway

Medien-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.pdf

Bei 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:

  1. POST /mcp mit JSON-RPC initialize

  2. Verwenden Sie den zurückgegebenen mcp-session-id-Header für nachfolgende Anfragen.

  3. POST /mcp fü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:mcp

Optional benutzerdefiniertes Ziel:

MCP_BASE_URL=http://localhost:3003 npm run smoke:mcp

MCP-Tools

Authentifizierung

Tool

Beschreibung

get_qr_code

Ruft den neuesten WhatsApp-QR-Code als Bild zur Authentifizierung ab.

check_auth_status

Prüft, ob der WhatsApp-Client authentifiziert und bereit ist.

logout

Meldet bei WhatsApp ab und löscht die aktuelle Sitzung.

Kontakte

Tool

Beschreibung

search_contacts

Durchsucht Kontakte nach Name oder Telefonnummer.

resolve_contact

Löst einen Kontakt nach Name oder Telefonnummer auf (beste Übereinstimmungen).

get_contact_by_id

Ruft Kontaktdetails anhand der JID ab.

get_profile_pic

Ruft die Profilbild-URL für eine JID ab.

get_group_info

Ruft Gruppen-Metadaten und -Teilnehmer anhand der Gruppen-JID ab.

Chats

Tool

Beschreibung

list_chats

Listet Chats mit Metadaten und optionaler letzter Nachricht auf.

get_chat_by_id

Ruft Chat-Metadaten anhand der JID ab.

list_groups

Listet ausschließlich Gruppen-Chats auf.

get_direct_chat_by_contact_number

Löst eine direkte Chat-JID anhand einer Telefonnummer auf.

get_chat_by_contact

Löst einen Kontakt nach Name oder Telefonnummer auf und gibt die Chat-Metadaten zurück.

analyze_group_overlaps

Findet Mitglieder, die in mehreren Gruppen vorkommen.

find_members_without_direct_chat

Findet Gruppenmitglieder ohne direkten Chat.

find_members_not_in_contacts

Findet Gruppenmitglieder, die in den Kontakten fehlen.

run_group_audit

Führt eine kombinierte Gruppen-Audit als einen Routinevorgang aus.

Nachrichten

Tool

Beschreibung

list_messages

Ruft Nachrichten aus einem bestimmten Chat ab.

search_messages

Durchsucht Nachrichten nach Text (optional auf einen Chat eingeschränkt).

get_message_by_id

Ruft eine bestimmte Nachricht anhand der ID (jid:id) ab.

get_message_context

Ruft die letzten Nachrichten rund um eine bestimmte Nachricht ab.

get_last_interaction

Ruft die neueste Nachricht für eine JID ab.

send_message

Sendet eine Textnachricht an eine Person oder Gruppe. Unterstützt optionalen idempotency_key.

Medien

Tool

Beschreibung

send_media

Sendet Medien (Bild/Video/Dokument/Audio). Akzeptiert media_path, media_url oder media_content (base64). Unterstützt optionalen idempotency_key.

stage_media

Speichert eine Datei im Medienverzeichnis des Servers und gibt deren lokalen Pfad zurück. Verwenden Sie den zurückgegebenen saved_path in send_media (media_path) – das vermeidet base64, wenn die Quelle eine URL ist (der Server lädt direkt herunter), oder ermöglicht das Senden derselben Datei an mehrere Empfänger ohne erneutes Hochladen.

download_media

Lädt Medien aus einer Nachricht herunter.

Dienstprogramme

Tool

Beschreibung

ping

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 mutation und failed 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 Terminated plant der Dienst einen Disconnect-Watchdog und eskaliert zu einem internen Neustart, wenn der Socket nicht rechtzeitig wieder in open ü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 in open überführt werden.

  • Ein dedizierter /healthz-Endpunkt meldet 503 nur, 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

DB_PATH

<SESSION_DIR>/store.sqlite

SQLite-Datenbankpfad für die Persistenz von Chats/Nachrichten.

WA_EVENT_LOG

0

Detaillierte WhatsApp-Ereignisprotokolle aktivieren.

WA_EVENT_STREAM

0

Rohen Baileys-Ereignisstream für tiefgehendes Debugging in eine Datei schreiben.

WA_EVENT_STREAM_PATH

/app/logs/wa-events.log

Dateipfad für das Ereignisstream-Protokoll.

WA_RESYNC_RECONNECT

1

Sicherheitsnetz für Wiederverbindung nach erzwungener Resynchronisierung aktivieren.

WA_RESYNC_RECONNECT_DELAY_MS

15000

Verzögerung vor der Wiederverbindung nach erzwungener Resynchronisierung (ms).

WA_SYNC_RECOVERY_COOLDOWN_MS

300000

Mindestverzögerung zwischen automatischen App-State-Wiederherstellungen.

WA_SYNC_RECOVERY_WINDOW_MS

900000

Zeitfenster zur Zählung wiederholter App-State-Beschädigungsfehler.

WA_SYNC_SOFT_RECOVERY_LIMIT

2

Anzahl weicher Wiederherstellungen, bevor zu einem internen Neustart eskaliert wird.

WA_READINESS_GRACE_MS

180000

Gnadenfrist während Wiederherstellung/Trennung, bevor /healthz auf „unhealthy“ wechselt.

WA_DISCONNECT_RECOVERY_DELAY_MS

30000

Wie lange nach einem Socket-Schließen gewartet wird, bevor der Trennungs-Watchdog Wiederverbindung/Neustart erzwingt.

WA_DISCONNECT_RECOVERY_RESTART_CODES

428

Durch Kommas getrennte Trennung-Statuscodes, die direkt zu einem internen Neustart-Watchdog eskalieren sollen.

WA_SEND_DEDUP_WINDOW_MS

45000

Exakte doppelte send_message-Anfragen an dieselbe JID innerhalb dieses Fensters unterdrücken.

WA_IDEMPOTENCY_TTL_MS

86400000

Wie lange abgeschlossene send_message-Idempotenzdatensätze in SQLite für sichere Wiederholungsversuche aufbewahrt werden.

WA_MESSAGE_INDEX_MAX

20000

Maximale In-Memory-Einträge für den Nachrichtenindex (jid:id -> rohe Nachricht).

WA_MESSAGE_KEY_INDEX_MAX

20000

Maximale In-Memory-Einträge für den Nachrichtenschlüsselindex (id -> rohe Nachricht).

WA_INITIALIZE_TIMEOUT_MS

120000

WhatsApp-Client-Initialisierung gegen diese Frist laufen lassen; auf 0 setzen, um zu deaktivieren. Wirft bei Zeitüberschreitung, sodass die Wiederherstellung erneut versuchen kann, statt zu hängen.

WA_AUTO_DOWNLOAD_CONCURRENCY

3

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.

WA_AUTO_DOWNLOAD_QUEUE_MAX

200

Maximale in der Warteschlange befindliche Auto-Download-Aufträge. Überschuss wird FIFO (älteste zuerst) mit einer Warnung im Protokoll verworfen; aktuelle Nachrichten bleiben priorisiert.

MCP_HTTP_ENABLE_JSON_RESPONSE

1

Standardmäßig direkte JSON-Antworten für Streamable-HTTP-POST-Anfragen verwenden. Auf 0 setzen, um die ältere SSE-artige POST-Antwortverarbeitung zu erzwingen.

Zusätzliche Transportdiagnose:

  • /mcp-POST-Anfragen protokollieren jetzt Anfrage-Lebenszyklusereignisse in logs/mcp-whatsapp.log

  • dies umfasst Anfrageeingang, Transport-Dispatch, Abschluss von transport.handleRequest sowie HTTP finish / close

  • Verwenden Sie diese Protokolle, um festzustellen, ob die Latenz auftritt, bevor die Antwort whatsapp-mcp-stream verlä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.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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