Skip to main content
Glama
README.md
# 🟱 WhatsApp MCP Server

![WhatsApp MCP Server Banner](./assets/banner.png)

Un serveur MCP (Model Context Protocol) pour contrĂŽler WhatsApp Web via **Puppeteer Stealth**, permettant Ă  ton IA (Claude/Antigravity) de lire et envoyer des messages comme un humain.

---

## 📐 Architecture

```
whatsapp-server/
├── src/
│   ├── index.ts                      ← EntrĂ©e FastMCP, enregistre les outils
│   ├── services/
│   │   └── whatsappService.ts        ← Singleton : gùre browser/page/delays
│   └── tools/
│       ├── connectWhatsappTool.ts    ← Outil : se connecter à WhatsApp Web
│       ├── listChatsTool.ts          ← Outil : lister les discussions
│       ├── sendMessageTool.ts        ← Outil : envoyer un message
│       └── readMessageTool.ts        ← Outil : lire les messages
├── assets/                           ← Screenshots README
├── .gitignore                        ← Protùge session, .env, configs perso
├── eslint.config.js
├── tsconfig.json
└── package.json
```

**Flow :**

```
AI (Claude/Antigravity)
        │ tool calls (MCP stdio)
        ▌
whatsapp-mcp-server (FastMCP)
  ├── ConnectWhatsappTool
  ├── ListChatsTool
  ├── SendMessageTool
  └── ReadMessageTool
        │ shared singleton
        ▌
  WhatsappService
        │ puppeteer-extra + stealth plugin
        ▌
  Chrome (headless ou visible)
        │
        ▌
  https://web.whatsapp.com/
```

---

## ⚙ Installation

### 1. Copier le dossier

```bash
cd "whatsapp-server"
```

### 2. Installer les dépendances

```bash
pnpm install
```

### 3. Compiler

```bash
pnpm run build
```

### 4. Ajouter dans `mcp_config.json`

```json
"whatsapp-server": {
  "command": "node",
  "args": [
    "/chemin/vers/whatsapp-server/dist/index.js"
  ],
  "disabled": false
}
```

---

## 🚀 Utilisation

### Étape 1 — Connexion (premiùre fois)

Demande Ă  l'IA :

> _"Connecte-toi Ă  WhatsApp en mode non headless"_

L'outil `connect_whatsapp` ouvre Chrome et affiche le QR code :

![QR Code WhatsApp Web](./assets/01_qr_code.png)

**Sur ton téléphone :**

1. Ouvre **WhatsApp**
2. **Menu > Appareils connectés** (Android) ou **ParamÚtres > Appareils connectés** (iPhone)
3. **Connecter un appareil**
4. **Scanne le QR code**

✅ La session est sauvegardĂ©e dans `./whatsapp_session/` — pas besoin de rescanner.

---

### Étape 2 — Lister les discussions

Demande Ă  l'IA :

> _"Liste mes conversations WhatsApp"_

![Chats liste](./assets/02_list_chats.png)

---

### Étape 3 — Envoyer un message

Demande Ă  l'IA :

> _"Envoie 'Bonjour !' Ă  [Nom du contact] sur WhatsApp"_

![Message envoyé](./assets/03_send_message.png)

---

### Étape 4 — Lire les messages

Demande Ă  l'IA :

> _"Lis les derniers messages de [Nom du contact] sur WhatsApp"_

L'outil `read_messages` extrait l'historique récent avec l'expéditeur et l'horodatage.

---

## đŸ›Ąïž Anti-Ban — Comportement Humain

| Protection              | Détail                                                        |
| ----------------------- | ------------------------------------------------------------- |
| **Puppeteer Stealth**   | Masque les empreintes Puppeteer (`navigator.webdriver`, etc.) |
| **DĂ©lais alĂ©atoires**   | 300ms–5000ms entre chaque action                              |
| **Frappe humaine**      | 100–300ms par touche pour la recherche                        |
| **Session persistante** | `whatsapp_session/` évite les reconnexions fréquentes         |
| **User Agent réaliste** | Chrome 120 / Windows 10 64-bit                                |
| **Auto-dismiss dialog** | Clique automatiquement sur "Utiliser ici" si détecté          |
| **Reconnexion propre**  | Ferme l'ancien browser avant d'en ouvrir un nouveau           |

---

## 🔧 Outils MCP disponibles

### `connect_whatsapp`

Lance le navigateur et ouvre WhatsApp Web.

| ParamÚtre  | Type    | Défaut  | Description                                             |
| ---------- | ------- | ------- | ------------------------------------------------------- |
| `headless` | boolean | `false` | Mode invisible. Mettre `false` pour scanner le QR code. |

### `list_chats`

Liste les discussions récentes.

| ParamÚtre | Type   | Défaut | Description                      |
| --------- | ------ | ------ | -------------------------------- |
| `limit`   | number | `10`   | Nombre max de chats Ă  retourner. |

### `send_message`

Envoie un message Ă  un contact ou groupe.

| ParamĂštre  | Type   | Requis | Description                     |
| ---------- | ------ | ------ | ------------------------------- |
| `chatName` | string | ✅     | Nom exact du contact ou groupe. |
| `message`  | string | ✅     | Contenu du message à envoyer.   |

### `read_messages`

Lit les messages récents d'une discussion spécifique.

| ParamĂštre  | Type   | Requis | Description                                    |
| ---------- | ------ | ------ | ---------------------------------------------- |
| `chatName` | string | ✅     | Nom exact du contact ou groupe.                |
| `limit`    | number | 10     | Nombre de messages à récupérer (max visibles). |

---

## 📋 Commandes

```bash
pnpm install      # Installer les dépendances
pnpm run build    # Compiler TypeScript → dist/
pnpm run dev      # Lancer en mode développement (tsx)
pnpm run lint     # Vérifier le code avec ESLint
pnpm run format   # Formater avec Prettier
```

---

## ⚠ Recommandations

- **Ne pas spammer** : laisser des délais naturels entre les usages.
- **Session warmup** : aprĂšs le premier QR scan, ouvre 2-3 discussions manuellement avant de fermer Chrome.
- **Headless=false** pour le premier scan. Ensuite `true` est possible pour les relances.
- **1 compte = 1 session** : ne pas utiliser le mĂȘme numĂ©ro sur plusieurs instances simultanĂ©es.

---

## 🔒 SĂ©curitĂ© — Ce qui est protĂ©gĂ© par `.gitignore`

| Dossier/Fichier     | Raison                                               |
| ------------------- | ---------------------------------------------------- |
| `whatsapp_session/` | Cookies et tokens de session WhatsApp                |
| `.env`              | Variables sensibles (clés API, numéros de téléphone) |
| `mcp_config.json`   | Chemins locaux et configs privées                    |
| `dist/`             | Build gĂ©nĂ©rĂ© — reconstruit avec `pnpm build`         |
| `node_modules/`     | DĂ©pendances — reconstruit avec `pnpm install`        |

---

_DĂ©veloppĂ© par Deamon — Architecture calquĂ©e sur le serveur SMS/VoIP.ms MCP_

TDQS

B3.4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: connect_whatsapp handles authentication, list_chats retrieves chat data, and send_message sends messages. There is no overlap in functionality, making it easy for an agent to select the right tool without confusion.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with a verb_noun structure (connect_whatsapp, list_chats, send_message). This predictability enhances readability and usability for agents.

Tool Count3/5

With only 3 tools, the server feels thin for a WhatsApp integration, lacking operations like reading messages, managing contacts, or handling media. While the tools cover basic actions, the scope is limited and may require workarounds for common use cases.

Completeness2/5

The toolset is significantly incomplete for a WhatsApp server. It misses essential CRUD operations such as reading messages, updating chats, deleting messages, and handling media files. Agents will likely fail when trying to perform common WhatsApp tasks beyond the basics provided.

Maintenance

ActivityInactive
ResponsivenessNo issues