replyLABSCO SUMMARY
Access approval lives in a terminal on purpose, and that is the best decision in the design.
Anyone can create a pending pairing request just by messaging your number, so "approve the pending one" is exactly what a prompt-injected request would look like — approving always requires the specific code, typed by you, outside the message channel. Two practical constraints: only one client can hold the WhatsApp link at a time, and replies arrive from your personal number, so use a dedicated number if you want a distinct identity.
What it is
An MCP server that connects to WhatsApp as a linked device through Baileys — the same protocol WhatsApp Web uses — and exposes the conversation to Claude Code as a channel. Incoming messages reach your session, and Claude replies from your own number, so recipients see a normal chat. Messages travel directly between WhatsApp and your machine; there is no third-party server in between. Once paired it keeps working with your phone off.
What you get
- Two-way messaging with long replies chunked to WhatsApp's limits, or sent as a document attachment past a threshold you configure —
reply,react,edit_message,status - Media in both directions: photos, voice notes, video, documents and stickers, with attachments downloadable into the session —
download_attachment - Access control that gates every inbound message: pairing codes, allowlists and per-group policies, so strangers never reach your session — managed from a terminal, deliberately not as an MCP tool, because anyone can create a pending pairing just by messaging you
- Context recovery after a restart: recent two-way conversation per chat, unreplied counts and open tasks replayed so a fresh session resumes mid-flight work —
catch_up,unreplied,list_groups - A poll-based path for non-Claude-Code clients —
wait_for_messagesparks for up to 40 seconds waiting for the next message, and every tool result carries an unreplied count - Per-group personalities, each group carrying its own config file with a personality and conversation memory, and a cron section for recurring server-side tasks
- Permission relay: approve or deny Claude's tool requests from WhatsApp with a 👍 or 👎 reaction
- Local voice transcription of incoming voice notes through mlx-whisper; without the script they arrive as plain attachments
- A single-connection guard — a second server stays up and serves one
whatsapp_unavailabletool naming the process that holds the link, rather than fighting for it
Requirements
A regular WhatsApp account — no Business API, no Meta developer account, no API key. Install through the Claude Code plugin marketplace, then pair with a code entered under WhatsApp > Settings > Linked Devices > Link with phone number instead. The --dangerously-load-development-channels flag is what registers it as a channel so an inbound message wakes the session; without it the tools load but nothing wakes anything. Other clients run the same stdio server with Bun — bun run --cwd /absolute/path/to/whatsapp-channel start — and need generous timeouts, since wait_for_messages parks for up to 40 seconds; the README suggests a 30-second startup timeout and a 120-second tool timeout for Codex CLI. Runtime state — auth, allowlists, group configs, inbox — lives under ~/.whatsapp-channel/. Only one client at a time can hold the connection, because WhatsApp allows one linked-device session per account. Voice transcription is optional and needs ffmpeg plus mlx-whisper on Apple Silicon. The package is claude-channel-whatsapp 0.1.0.
Setup effort
Follow the published steps — claude plugin marketplace add Rich627/whatsapp-claude-plugin
USE CASES
Checking on a running job from your phone
Message the session and get the reply in the same chat, without opening a laptop.
Approving a tool request while away from the desk
React with 👍 or 👎 to approve or deny what Claude wants to run, from WhatsApp.
Picking up where a crashed session left off
Replay recent conversation per chat with unreplied counts and open tasks, so a fresh session resumes mid-flight work.
Running it from a client that is not Claude Code
Poll with the waiting call — it parks for up to 40 seconds — instead of relying on the channel notification Claude Code alone understands.
9 tools
Listed in project docs. Your client may show a different list.
reactedit_messagedownload_attachmentstatusunrepliedcatch_uplist_groupswait_for_messagesBEFORE YOU INSTALL
What to know first
Tools you get
9 tools named in the project's documentation.
INSTALLATION
Connect your client
Server setup
Claude Code
claude plugin marketplace add Rich627/whatsapp-claude-plugin
claude plugin install whatsapp-channel@whatsapp-claude-plugin
claude --dangerously-load-development-channels plugin:whatsapp-channel@whatsapp-claude-pluginInside the Claude Code session, run /whatsapp-channel:configure followed by your number (country code + number, no +), then enter the pairing code under WhatsApp → Settings → Linked Devices → Link a Device → Link with phone number instead.
MCP Clients
Codex
git clone https://github.com/Rich627/whatsapp-claude-plugin[mcp_servers.whatsapp]
command = "bun"
args = ["run", "--cwd", "<YOUR_PATH_TO_WHATSAPP_CHANNEL>", "start"]
startup_timeout_sec = 30 # default 10 is tight for a first Baileys connect
tool_timeout_sec = 120 # default 60; wait_for_messages parks for up to 40s<YOUR_PATH_TO_WHATSAPP_CHANNEL> is the absolute path of your clone. Bun must be on PATH (the start script runs bun install, then bun server.ts). Outside Claude Code, pairing and access control are done from a terminal with bun scripts/access.ts.
Gemini CLI
git clone https://github.com/Rich627/whatsapp-claude-plugin{
"mcpServers": {
"whatsapp": {
"command": "bun",
"args": [
"run",
"--cwd",
"<YOUR_PATH_TO_WHATSAPP_CHANNEL>",
"start"
],
"timeout": 600000
}
}
}<YOUR_PATH_TO_WHATSAPP_CHANNEL> is the absolute path of your clone. Bun must be on PATH (the start script runs bun install, then bun server.ts). Outside Claude Code, pairing and access control are done from a terminal with bun scripts/access.ts.
Cursor
git clone https://github.com/Rich627/whatsapp-claude-plugin{
"mcpServers": {
"whatsapp": {
"type": "stdio",
"command": "bun",
"args": [
"run",
"--cwd",
"<YOUR_PATH_TO_WHATSAPP_CHANNEL>",
"start"
]
}
}
}<YOUR_PATH_TO_WHATSAPP_CHANNEL> is the absolute path of your clone. Bun must be on PATH (the start script runs bun install, then bun server.ts). Outside Claude Code, pairing and access control are done from a terminal with bun scripts/access.ts.