A unified web interface for browsing WhatsApp chats, messages, contacts, and transcribing audio files. Integrates the WhatsApp Bridge, MCP server, and VoiceScript transcription service.
It also includes a Gemini-powered autonomous "brain" that can review recent incoming messages every 5 minutes, apply labels through MCP, create Google Tasks through MCP, and save draft replies into Supabase for approval.
┌─────────────────────────────────────────────────────┐
│ WhatsApp Intelligence Dashboard │
│ (Express.js server + HTML/JS frontend) │
├─────────────────────────────────────────────────────┤
│ REST API Endpoints: │
│ ├─ /api/health (status check) │
│ ├─ /api/contacts/* (search & manage) │
│ ├─ /api/chats/* (browse & view) │
│ ├─ /api/messages/* (list, context, send) │
│ └─ /api/transcribe (proxy to VoiceScript) │
├─────────────────────────────────────────────────────┤
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ WhatsApp MCP Server (Python stdio) │ │
│ │ └─ 11+ tools: search_contacts, send_message,│ │
│ │ download_media, etc. │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ WhatsApp Bridge (Go) + SQLite DB │ │
│ │ └─ Syncs chats, messages, contacts │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ VoiceScript Express (Port 3000) │ │
│ │ └─ POST /transcribe (audio → text) │ │
│ │ └─ GET /health │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
-
WhatsApp Bridge running and authenticated
cd whatsapp-bridge go run main.go # Scan QR code to authenticate
-
Python 3.10+ and uv (installed for MCP server)
python --version which uv # or where uv on Windows -
VoiceScript Express running with Azure Whisper credentials
cd WA_VoiceScript npm install cp .env.example .env # Fill in AZURE_OPENAI_ENDPOINT and AZURE_OPENAI_KEY npm start
-
Node.js 18+ for the dashboard
node --version npm --version
cd dashboard
npm installcp .env.example .envEdit .env if your paths differ:
PORT- Dashboard port (default 4000)MCP_SERVER_PATH- Path touv.exeMCP_CWD- Path towhatsapp-mcp-serverdirectoryVOICESCRIPT_URL- VoiceScript server URL (default http://localhost:3000)GEMINI_API_KEY- Google Gemini API key for the autonomous brainSUPABASE_URL- Supabase project URLSUPABASE_ANON_KEY- Supabase anon key used to store processed messages and reply drafts
npm start
# or for development with auto-reload:
npm run devThe dashboard will be available at http://localhost:4000
Browse all WhatsApp chats and view details:
- Search: Find chats by name
- Select: Click a chat to view details
- Load Messages: View messages in selected chat
Search and view messages with context:
- Search: Find messages by content
- Select: Click a message to see surrounding conversation
- Context: View 3 messages before/after selected message
Search and message contacts:
- Search: Find contacts by name or phone
- View Details: Contact JID and message interface
- Send Message: Type and send WhatsApp message
Convert audio files to text:
- Upload File: Select .opus, .ogg, .wav, .mp3, .m4a, etc. (up to 25 MB)
- Speaker Label (optional): Identify speaker for context
- Transcribe: Send to Azure Whisper for processing
- Actions:
- Copy transcript to clipboard
- Download as .txt file
- Send as WhatsApp message (requires contact selected)
GET /api/health- Server status and connectivity
GET /api/chats?query=...&limit=20&sort_by=last_active- List chatsGET /api/chats/:jid- Get specific chat metadata
GET /api/contacts/search?query=...- Search contacts
GET /api/messages?chat_jid=...&query=...&limit=20- List messagesGET /api/messages/:id/context?before=5&after=5- Get context around messagePOST /api/messages/send- Send message- Body:
{ "recipient": "...", "message": "..." }
- Body:
POST /api/media/download- Download media from message- Body:
{ "message_id": "...", "chat_jid": "..." }
- Body:
POST /api/transcribe- Transcribe audio file- Form data:
audio(multipart file) - Response:
{ "transcript": "..." }
- Form data:
- Verify Python is installed and in PATH:
python --version - Verify
uvis installed:uv --version - Check
MCP_CWDpath in.envis correct - Try running MCP manually:
cd <MCP_CWD> uv run python main.py
- Ensure WhatsApp Bridge is running
- Check if it's still authenticated or needs QR code re-scan
- Check SQLite database exists at
whatsapp-bridge/store/whatsapp.db
- Ensure VoiceScript is running on port 3000
- Check
VOICESCRIPT_URLin.env - Verify Azure credentials are set in VoiceScript
.env
- Sync WhatsApp by navigating in WhatsApp Web for 30 seconds
- Check Bridge sync logs for errors
- Verify SQLite database permissions
npm run devThis uses nodemon to auto-reload the server on file changes.
- Tabs: Chats, Messages, Contacts, Transcribe Audio
- Two-Column Layout:
- Left sidebar: Lists (chats, messages, contacts)
- Right area: Details and actions
- Responsive: Mobile-friendly collapsible layout
- Real-time: No polling — instant API requests on user action
-
New MCP Tool:
- Add REST endpoint in
server.js - Add UI component in
public/index.html - Call
callMcpTool(toolName, args)to invoke
- Add REST endpoint in
-
New API Endpoint:
- Add Express route in
server.js - Optionally wrap MCP tool calls
- Test with
curlor frontend
- Add Express route in
- Runs every 5 minutes using
node-cron - Pulls the latest WhatsApp messages through
list_messages - Uses Gemini structured JSON output to decide whether to:
- create a draft reply
- create Google Tasks through MCP
- apply a chat label through MCP
- ignore personal/family chats
- Stores processed message IDs in Supabase table
processed_messages - Stores pending AI drafts in Supabase table
message_drafts
- Transcripts are stored in browser localStorage under key
voicescript_transcripts - All media downloads go to the system temp directory (auto-cleaned)
- MCP server process runs as child process — restarts if crashes
- Requires WhatsApp Bridge to be authenticated first
See parent project LICENSE