wazap-mcp
██╗ ██╗ █████╗ ███████╗ █████╗ ██████╗
██║ ██║██╔══██╗╚══███╔╝██╔══██╗██╔══██╗
██║ █╗ ██║███████║ ███╔╝ ███████║██████╔╝
██║███╗██║██╔══██║ ███╔╝ ██╔══██║██╔═══╝
╚███╔███╔╝██║ ██║███████╗██║ ██║██║
╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝WhatsApp für deinen KI-Agenten. Ein MCP-Server, der dein WhatsApp-Konto – Chats, Nachrichten, Medien, Kontakte, Gruppen – hinter 22 Tools stellt, die jeder MCP-Client aufrufen kann. Anmeldung per Pairing-Code, kein Browser, kein Telefonnummern-Wiederverkäufer, ~20 MB RAM.
Basiert auf Baileys, das das WhatsApp-Multi-Device-Protokoll über eine WebSocket-Verbindung spricht.
Erste Schritte
Das npm-Paket ist wazap-mcp; der Befehl, den es installiert, ist wazap.
npx wazap-mcp setupDas ist die gesamte Installation. Es verknüpft dein Konto, findet die auf diesem Rechner installierten MCP-Clients, schreibt deren Konfiguration und sagt dir, was du neu starten musst.
Oder lass deinen Agenten das erledigen. Füge dies ein:
Richte WhatsApp für mich ein: Führe npx wazap-mcp setup --agent aus und folge dem, was es ausgibt.
Dann frag deinen Agenten: „Was habe ich heute auf WhatsApp verpasst?"
Im Folgenden sind die Schritte, die setup für dich ausführt. Jeder ist weiterhin ein eigener Befehl, wenn du ihn von Hand ausführen möchtest.
npx wazap-mcp login zeigt einen QR-Code; scanne ihn unter Einstellungen → Verknüpfte Geräte → Gerät verknüpfen. Keine Kamera zur Hand oder Verknüpfung über SSH? npx wazap-mcp login --phone +15550100 gibt einen 8-stelligen Code aus, den du unter Stattdessen mit Telefonnummer verknüpfen eingibst. Am Ende fragt es, ob der Agent Nachrichten senden darf; die Antwort ist nein, es sei denn, du sagst ja, und npx wazap-mcp config writes on ändert das später.
npx wazap-mcp connect claude-code schreibt den MCP-Eintrag für einen Client. Die Tabelle unter Client verbinden enthält den Rest.
npx wazap-mcp allein ist sicher auszuführen: Es zeigt, wo du stehst und was als Nächstes zu tun ist, und startet keinen Server. Wenn etwas nicht stimmt, ist npx wazap-mcp status das Erste, was du ausführen solltest – es prüft Node, das Datenverzeichnis, die Sperre, die Anmeldedaten und ob eine neuere Version verfügbar ist, und zeigt neben jedem Problem die Lösung an.
Client verbinden
wazap connect <client> schreibt den Eintrag für dich, behält alles andere in der Datei und sichert sie einmal vor der ersten Änderung. --dry-run zeigt, was es schreiben würde.
Client | Was |
| führt |
|
|
|
|
|
|
|
|
|
|
alles Remote | MCP-URL-Feld des Clients: |
Jeder MCP-Client funktioniert auf die gleiche Weise: Der Befehl ist npx -y wazap-mcp, der Transport ist stdio. Sag dem Agenten, er soll zuerst learn aufrufen – es gibt die ID-Formate, die Arbeitsabläufe und jeden Fehlercode mit Hinweisen zur Behebung zurück.
{
"mcpServers": {
"whatsapp": {
"command": "npx",
"args": ["-y", "wazap-mcp"]
}
}
}Claude Desktop, Cursor und Gemini CLI übernehmen genau das. VS Code verschachtelt es unter servers und möchte ein "type": "stdio" neben command. Codex CLI ist TOML:
[mcp_servers.whatsapp]
command = "npx"
args = ["-y", "wazap-mcp"]Der Ordner skills/ folgt dem Agent Skills-Format, sodass Codex, Cursor und andere skill-bewusste Agenten dieselben fünf Skills laden können.
Related MCP server: wa-bridge
Tools
Tool | Kind | Was es tut |
| read | Der Leitfaden zu jedem Tool, ID-Format und Fehlercode. Rufe es zuerst auf. |
| read | Verbindungsstatus, Synchronisierungszustand, verknüpftes Konto, Versionen, Datenverzeichnis. |
| read | Unterhaltungen neueste zuerst; filtere |
| read | Nachrichten in einem Chat; |
| read | Alles aus den letzten N Stunden, gruppiert nach Chat. Das Aufhol-Tool. |
| read | Textsuche über die lokal gespeicherten Nachrichten. |
| read | Eine Nachricht vollständig, mit der zitierten Nachricht und Reaktionen. |
| read | Kontakte nach Name oder Nummer finden. |
| read | Name, Nummer, Info-Text, Profilbild. |
| read | Teilnehmer, Administratoren, Ankündigungsmodus, Einladungslink (wenn du Admin bist). |
| read | Speichert einen Anhang auf der Festplatte; kleine Bilder werden auch inline zurückgegeben. |
| write | Text senden, optional als Antwort, mit @-Erwähnungen. |
| write | Ein Bild, Video, Audio, Sprachnachricht oder Dokument von einem Pfad oder einer URL senden. |
| write | Eine Umfrage mit 2–12 Optionen senden. |
| write | Einen Karten-Pin senden. |
| write | Bearbeite deine eigene Nachricht innerhalb des 15-Minuten-Fensters von WhatsApp. |
| write | Eine Emoji-Reaktion hinzufügen oder entfernen. |
| write | Eine Nachricht an einen anderen Chat weiterleiten. |
| write | Ziehe deine eigene Nachricht innerhalb des 2-Tage-Fensters von WhatsApp zurück. |
| write | Archivieren, anheften, stummschalten (standardmäßig 8h), als gelesen/ungelesen markieren. |
| write | Eine Gruppe erstellen und Teilnehmer hinzufügen. |
| write | Hinzufügen, entfernen, befördern, degradieren, verlassen, umbenennen, Einladungslinks. |
Jede Nachricht wird mit einem nicht-leeren text zurückgegeben: Medien- und Systemnachrichten enthalten einen Platzhalter wie [image] caption, [voice message], [deleted] oder [poll] Pizza or pasta?. Zeitstempel sind ISO 8601 mit dem UTC-Offset der Maschine, zusammen mit einem menschlichen age wie 2h ago.
Skills
wazap enthält fünf Agent Skills, die einem Agenten die Arbeitsabläufe hinter den Tools beibringen, nicht nur die Tools:
Skill | Was der Agent tut |
| Diagnose mit |
| „Was habe ich verpasst?" Triage in braucht dich / zur Info / Rauschen, sortiert, plus vergessene Antworten. Nur lesen |
| „Finde die Rechnung, die Dan geschickt hat." Suche mit Suchvarianten, blättere in der Zeit zurück, lade die Datei herunter und lies sie. Nur lesen |
| Hole in einer 300-Nachrichten-Gruppe auf: Entscheidungen, Termine, was von dir verlangt wird. Nur lesen |
| Entwurf im eigenen Register des Chats, Empfänger und Text anzeigen, nur senden, nachdem der Benutzer ja gesagt hat |
Installiere alles (Server und Skills) als Claude-Code-Plugin:
/plugin marketplace add razvangirgiz/wazap
/plugin install wazap@wazapOder kopiere skills/<name>/ in ein beliebiges Skills-Verzeichnis, das dein Agent liest.
Fehler
Jeder Fehler ist ein strukturiertes { error, message, fix } anstelle eines Stack-Trace, sodass ein Agent entscheiden kann, ob er es erneut versuchen, den Benutzer fragen oder aufhören soll.
Code | Bedeutung |
| Kein Konto verknüpft. Führe |
| Vom Telefon entkoppelt. Führe |
| Anmeldedaten nicht lesbar. Führe |
| Verbindet sich noch oder verbindet sich erneut. |
| Die Verlaufssynchronisierung ist noch nicht abgeschlossen; Ergebnisse können unvollständig sein. |
| Die Nummer ist nicht im internationalen Format. |
| Keine WhatsApp-Chat-, Kontakt- oder Gruppen-ID. |
| Diese Nummer hat kein WhatsApp-Konto. |
| Unbekannte ID. |
| Gruppenberechtigungen. |
| WhatsApp hat die Datei ablaufen lassen, oder sie wurde hier nie synchronisiert. |
| Probleme mit ausgehenden Medien. |
| Über WhatsApps Nachrichtenlimit. |
| WhatsApps eigene Grenzen beim Bearbeiten und Löschen. |
| wazap läuft im Nur-Lesen-Modus. |
| Zu viele Schreibvorgänge; |
| WhatsApp hat nicht geantwortet oder die Operation abgelehnt. |
Datenverzeichnis
Alles befindet sich in ~/.wazap (überschreibbar mit --data-dir oder WAZAP_DATA_DIR), erstellt mit 0700 und Anmeldedaten mit 0600 geschrieben:
~/.wazap/
auth/ WhatsApp credentials — treat this like a password
media/ downloads from download_media
history/ per-chat message history, so a restart is not amnesia
store.json chat-list snapshot
server.lock pid of the running server
daemon.json loopback endpoint a second wazap bridges to
.env optional settings, see .env.exampleAnmeldedaten werden in eine temporäre Datei geschrieben und dann an Ort und Stelle umbenannt, sodass ein Abbrechen des Prozesses während des Schreibens nicht dazu führen kann, dass du dein Telefon erneut verknüpfen musst.
Mehrere Clients gleichzeitig
{"type": "text"}
Claude Desktop, Claude Code und Cursor starten jeweils ihr eigenes wazap. WhatsApp erlaubt einen Socket pro verknüpftem Gerät, daher teilen sie sich eine Sitzung, statt darum zu kämpfen. Das erste wazap in einem Datenverzeichnis besitzt die Sitzung und öffnet einen MCP-Endpunkt auf 127.0.0.1; jedes weitere stellt über diesen Endpunkt eine Brücke zu ihm her. Es gibt nichts zu konfigurieren, und kein Client kann den Unterschied erkennen. Der Besitzer veröffentlicht <data-dir>/daemon.json (0600) mit seiner PID, seinem Port und dem Token, mit dem sich eine Brücke authentifiziert.
Eine Brücke bedient das, was der Besitzer bereitstellt, sodass ein mit --read-only gestarteter Besitzer jeden Client schreibgeschützt macht, unabhängig davon, mit welchen Flags dieser Client gestartet wurde.
Wenn der Besitzer beendet wird, beenden sich auch die Brücken mit ihm, und das nächste wazap, das ein Client startet, wird der neue Besitzer.
WAZAP_NO_SHARE=1 verzichtet darauf: Ein zweites wazap im selben Verzeichnis beendet sich mit Code 2 und nennt die PID des bereits laufenden. Ein explizites --http ist ein eigener Server statt einer Brücke und wird auf dieselbe Weise abgelehnt.
Schreibgeschützter Modus
Schreibvorgänge sind Opt-in. login fragt einmal nach und speichert die Antwort in <data-dir>/.env; wazap config writes on|off ändert sie, und wazap config allein gibt jede wirksame Einstellung samt ihrer Herkunft aus.
WAZAP_READ_ONLY=1 oder wazap serve --read-only registriert die Schreib-Tools gar nicht erst. Der Agent sieht sie nie und kann daher niemanden von Ihrer Nummer aus anschreiben, nicht einmal versehentlich – nützlich, wenn das verknüpfte Konto Ihr persönliches ist.
Schreibvorgänge sind außerdem auf WAZAP_RATE_LIMIT pro Minute begrenzt (Standard 20, 0 deaktiviert). Schneller zu senden, als ein Mensch es täte, ist ein Weg, wie Konten gesperrt werden.
HTTP-Modus
WAZAP_READ_TOKEN=$(openssl rand -hex 32) \
WAZAP_WRITE_TOKEN=$(openssl rand -hex 32) \
npx wazap-mcp serve --http --host 0.0.0.0 --port 8766Streamable HTTP unter /mcp, mit einem Health-Check unter /healthz. Zwei Bearer-Tokens: Das Lese-Token erhält die Lese-Tools, das Schreib-Token schaltet zusätzlich die Schreib-Tools frei, sodass ein durchgesickertes Lese-Token niemals jemanden anschreiben kann. wazap weigert sich, eine Nicht-Loopback-Adresse ohne Lese-Token zu binden.
Selbst gehostet
Betreiben Sie wazap auf einem eigenen Server, wenn der Agent nicht auf Ihrem Laptop läuft: einem anderen Rechner, einem VPS, der Infrastruktur eines Kunden. Die Sitzung bleibt auf diesem Server; nichts läuft über einen Dritten.
Mit systemd
npm install -g wazap-mcp
sudo useradd --system --home /var/lib/wazap --create-home wazap
sudo -u wazap WAZAP_DATA_DIR=/var/lib/wazap wazap login --phone +15550100 # pairing code works over SSH
sudo -u wazap tee /var/lib/wazap/.env >/dev/null <<END
WAZAP_READ_TOKEN=$(openssl rand -hex 32)
WAZAP_WRITE_TOKEN=$(openssl rand -hex 32)
END
sudo curl -fsSL https://raw.githubusercontent.com/razvangirgiz/wazap/main/deploy/wazap.service -o /etc/systemd/system/wazap.service
sudo systemctl enable --now wazap
curl -s http://127.0.0.1:8766/healthzDie Unit bindet nur Loopback. Setzen Sie TLS davor mit der zweizeiligen deploy/Caddyfile (caddy run --config deploy/Caddyfile nach dem Bearbeiten des Hostnamens) oder einem beliebigen Reverse-Proxy, und richten Sie den Client dann auf https://your-host/mcp mit Authorization: Bearer <Lese- oder Schreib-Token> aus.
Mit Docker
git clone https://github.com/razvangirgiz/wazap && cd wazap
printf 'WAZAP_READ_TOKEN=%s\nWAZAP_WRITE_TOKEN=%s\n' $(openssl rand -hex 32) $(openssl rand -hex 32) > .env
docker compose run --rm wazap login --phone +15550100 # once; the session lands in the wazap-data volume
docker compose up -d
curl -s http://127.0.0.1:8766/healthzDer Container veröffentlicht 8766 nur auf Loopback; fügen Sie denselben TLS-Proxy davor hinzu. Ein Upgrade ist git pull && docker compose up -d --build; das Volume behält die Sitzung.
Welche Clients darauf zugreifen können
Claude Code, Claude Desktop, Cursor, Codex, VS Code und jeder Client mit einem Feld „MCP-URL + Header" verbinden sich mit dem Bearer-Token. claude.ai-Connectors erfordern OAuth statt eines statischen Tokens und können daher noch kein selbst gehostetes wazap verwenden. Behalten Sie das Lese-Token in Clients, die nur lesen müssen; geben Sie das Schreib-Token bewusst heraus.
Einstellungen
Variable | Standard | Bedeutung |
|
| Wo alles gespeichert wird. |
|
| Die Schreib-Tools nicht registrieren. |
|
| WhatsApp um eine vollständigere Verlaufssynchronisierung bitten. |
|
| Chats und Nachrichten über Neustarts hinweg behalten. |
|
| Schreib-Tool-Aufrufe pro Minute; |
|
|
|
|
| HTTP-Bind-Adresse. |
| nicht gesetzt | HTTP-Bearer-Tokens. |
|
|
|
Flags schlagen Umgebungsvariablen, die wiederum <data-dir>/.env schlagen.
Bekannte Einschränkungen
Inoffiziell. Baileys hat das WhatsApp-Multi-Geräte-Protokoll per Reverse Engineering erschlossen. Dies ist nicht die WhatsApp Business API, und Meta unterstützt es nicht.
Sperrrisiko ist real. Automatisiertes Senden, Massen-Nachrichten oder alles, was ein Mensch nicht plausibel tippen würde, kann zur Sperrung der Nummer führen, und das ist von hier aus nicht rückgängig zu machen. Die Ratenbegrenzung hilft; sie ist keine Garantie.
Medienschlüssel laufen ab. WhatsApp entfernt alte Anhänge von seinen Servern, daher gibt
download_mediabei einer alten NachrichtMEDIA_UNAVAILABLEzurück.Der Verlauf ist das, was das Telefon synchronisiert. wazap sieht den Verlauf, den WhatsApp dem verknüpften Gerät übergibt, nicht Ihr vollständiges Telefonarchiv.
read_messagesmitbeforefragt nach mehr, innerhalb dessen, was WhatsApp noch aufbewahrt.@lid-IDs. Neuere Konten werden über eine Datenschutz-ID statt einer Telefonnummer adressiert. wazap übersetzt sie zurück in Telefonnummern, wenn es die Zuordnung gelernt hat, und reicht die@liddurch, wenn nicht.Ihr Telefon muss erreichbar bleiben. Ein verknüpftes Gerät empfängt nicht mehr, sobald das Telefon lange genug offline war;
get_statussagt das inhint.
Entwicklung
npm install
npm run typecheck
npm test # builds, then runs node --test
node test/smoke-stdio.mjs # drives the built binary over MCP stdio
npm run dev -- status # run from source with tsxnpm test benötigt keine WhatsApp-Sitzung. Der Stdio-Smoke-Test startet die gebaute Binärdatei mit einem Wegwerf-Datenverzeichnis und prüft, ob eine nicht verknüpfte Installation weiterhin initialize, tools/list und get_status beantwortet.
MIT-lizenziert.
Maintenance
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
- FlicenseNot gradedqualityCmaintenanceWhatsApp MCP server that exposes messaging, groups, contacts, and profile management as tools and resources for AI agents, supporting Baileys and Meta Cloud API.19
- AlicenseNot gradedqualityAmaintenanceA self-hosted WhatsApp bridge that exposes a stdio MCP server with ~20 tools for reading conversations, sending messages, managing groups, contacts, and aliases, enabling AI agents to operate WhatsApp directly.2MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that connects AI agents to WhatsApp using the multi-device API, enabling messaging, group management, and more as a regular user.15MIT
- AlicenseNot gradedqualityAmaintenanceA native MCP server for SocialMate that gives your AI a WhatsApp, enabling it to send and read messages, manage contacts and groups, and more through 44 tools.831MIT
Related MCP Connectors
Free public MCP for AI agents — 193 tools, 44 workflows. No API key.
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/razvangirgiz/wazap'
If you have feedback or need assistance with the MCP directory API, please join our Discord server