A self-hosted WhatsApp integration using the Model Context Protocol (MCP), enabling AI assistants (like Claude) to read and send WhatsApp messages directly from your desktop.
Built with:
- Bridge — Next.js + Baileys (WhatsApp Web API)
- Server — Python + FastMCP (MCP server)
- Storage — SQLite via
better-sqlite3(localdata/folder)
whatsapp-mcp/
├── bridge/ # Next.js app — WhatsApp connection & REST API
│ ├── src/
│ │ ├── lib/
│ │ │ ├── whatsapp.ts # Baileys socket, sync, message handling
│ │ │ └── database.ts # SQLite schema & helpers
│ │ └── app/api/ # REST endpoints
│ ├── data/ # Auto-created: auth + SQLite DB
│ └── package.json
│
└── server/ # Python MCP server — exposes tools to Claude
├── main.py # FastMCP tools (send, receive, chats, contacts...)
├── pyproject.toml
└── .env
- 🔐 QR Code Login — Scan once, sessions persist automatically
- 💬 Send & Receive messages via AI assistant
- 📋 Chats & Contacts — Browse all conversations and contacts
- 🔍 Search messages across all chats
- 🔄 Full History Sync — Syncs message history on first connect
- 🗄️ Local SQLite Storage — All data stays on your machine
- 🤖 MCP Compatible — Works with Claude Desktop and other MCP clients
| Tool | Version | Install |
|---|---|---|
| Node.js | ≥ 18 | nodejs.org |
| npm | ≥ 9 | Comes with Node.js |
| Python | ≥ 3.11 | python.org |
| uv | latest | pip install uv or docs.astral.sh/uv |
git clone https://github.com/your-org/whatsapp-mcp.git
cd whatsapp-mcpThe bridge connects to WhatsApp using the Baileys library and exposes a local REST API.
cd bridge
npm install
npm run devThe bridge will start on http://localhost:3000.
On first run, it will create a data/ folder containing:
data/auth/— WhatsApp session credentialsdata/whatsapp.db— SQLite database with all messages, chats, and contacts
Note: The
data/folder is gitignored. Never commit it — it contains your session keys.
- Open http://localhost:3000 in your browser
- Click Connect
- Scan the QR code with your WhatsApp mobile app:
- Open WhatsApp → Settings → Linked Devices → Link a Device
- Wait for the sync to complete (first sync may take a minute depending on your chat history)
Once connected, the status will show Connected and message history will begin syncing to the local database.
The server exposes WhatsApp functionality as MCP tools that Claude (or any MCP client) can call.
cd ../serverCreate a .env file:
WHATSAPP_BRIDGE_URL=http://localhost:3000Install dependencies and run using uv:
uv sync
uv run main.pyThe MCP server will start on http://localhost:8001.
Add the following to your Claude Desktop MCP config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"whatsapp": {
"command": "uv",
"args": [
"run",
"--project",
"/absolute/path/to/whatsapp-mcp/server",
"main.py"
],
"env": {
"WHATSAPP_BRIDGE_URL": "http://localhost:3000"
}
}
}
}Replace
/absolute/path/to/whatsapp-mcp/serverwith the actual path on your machine.
Restart Claude Desktop. You should now see WhatsApp tools available in Claude.
| Tool | Description |
|---|---|
get_whatsapp_status |
Check connection status |
connect_whatsapp |
Initialize WhatsApp connection |
get_whatsapp_chats |
List all chat conversations |
get_whatsapp_contacts |
List contacts with search support |
get_whatsapp_messages |
Get messages from a chat or search all |
get_chat_history |
Get message history for a specific chat |
search_whatsapp_messages |
Full-text search across all messages |
send_whatsapp_message |
Send a message by phone number |
send_whatsapp_message_to_jid |
Send a message by WhatsApp JID |
logout_whatsapp |
Log out and clear session |
The bridge exposes the following endpoints (used internally by the MCP server):
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/status |
Connection status |
POST |
/api/status |
Initialize connection |
GET |
/api/chats |
List chats |
GET |
/api/contacts |
List contacts |
GET |
/api/messages |
Get/search messages |
POST |
/api/send |
Send a message |
POST |
/api/logout |
Logout |
# Optional: Set to 'development' to enable verbose Baileys logs
NODE_ENV=productionWHATSAPP_BRIDGE_URL=http://localhost:3000All data is stored locally in bridge/data/whatsapp.db (SQLite). The schema is auto-created by database.ts on first run and includes:
- messages — Full message history with content, type, sender, timestamp
- chats — All conversations with unread count and last message time
- contacts — Contact JIDs, names, and phone numbers
- sync_status — Tracks the last successful history sync
- All data is stored locally on your machine — nothing is sent to any external server
- WhatsApp session credentials are stored in
bridge/data/auth/— keep this folder secure - The bridge and MCP server only communicate over
localhost - To fully remove your session, run logout or delete the
bridge/data/folder
QR code not appearing
- Make sure the bridge is running on port 3000
- Try refreshing the browser and clicking Connect again
Session expired / logged out
- Rescan the QR code — the old
data/auth/folder is cleared automatically on logout
Messages not syncing
- Wait for the initial sync to complete (check the status indicator)
- Large accounts may take 2–5 minutes on first connect
Claude can't see WhatsApp tools
- Verify the absolute path in
claude_desktop_config.json - Make sure
uvis installed and accessible in your PATH - Restart Claude Desktop after config changes
Port conflict
- Bridge default:
3000— change withPORT=3001 npm run dev - Server default:
8001— change the port inmain.pyand update your.env
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes (
git commit -m 'Add your feature') - Push to the branch (
git push origin feature/your-feature) - Open a Pull Request
- Baileys — WhatsApp Web API library
- FastMCP — Python MCP framework
- Model Context Protocol — by Anthropic
⚠️ Disclaimer: This project uses an unofficial WhatsApp API (Baileys). Use responsibly and in accordance with WhatsApp's Terms of Service. The authors are not responsible for any account bans or misuse.