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: lingtai-whatsapp

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.

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

Maintenance

Maintainers
Response time
Release cycle
Releases (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

  • 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.
    11
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server for interacting with the official Meta WhatsApp Business Platform/Cloud API, enabling sending messages, managing contacts, templates, and handling webhook callbacks.
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Integrates WhatsApp with AI agents, enabling message sending, chat search, media sharing, approval workflows, and activity summaries via any MCP client.
    1
    Apache 2.0

View all related MCP servers

Related MCP Connectors

  • Search, document and execute authenticated API calls across 700+ apps via one MCP server

  • Give AI agents real phone numbers, messages, and voice calls via MCP.

  • Instagram, WhatsApp and Messenger DMs through official Meta Business APIs.

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/BusinessNone/WhatsAppMCP'

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