parley
Attaches to an already logged-in WhatsApp Desktop instance over local Chrome DevTools Protocol to read chats and unread messages, send messages to contacts/groups/numbers, reply with quotes, react with emoji, and schedule one-shot or recurring sends. Exposes these WhatsApp capabilities through a CLI, Python SDK, local HTTP API, TUI, and MCP tools without using the WhatsApp cloud service or requiring a new QR-code login.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@parleysend Ava a WhatsApp saying I'll be there at 7"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
One line to install on any machine:
# Windows (PowerShell) — runs the installer: install + enable the port + next steps
irm https://raw.githubusercontent.com/Sachitt-AV-08/parley/main/install.ps1 | iex# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/Sachitt-AV-08/parley/main/install.sh | shThe installer detects uv → pipx → pip, installs parley-wa[mcp] (CLI and MCP extras) from the latest GitHub Release (sha256 checksums included), and prints next steps. pip install 'parley-wa[mcp]' works once the PyPI publish lands; until then use the installer or a release wheel URL. Run parley setup manually to enable the debugging port.
One line to send from a script on any machine:
# Use the installer (recommended):
irm https://raw.githubusercontent.com/Sachitt-AV-08/parley/main/install.ps1 | iex # Windows
curl -fsSL https://raw.githubusercontent.com/Sachitt-AV-08/parley/main/install.sh | sh # macOS/Linux
# Or with a release wheel URL:
pip install 'parley-wa[mcp] @ https://github.com/Sachitt-AV-08/parley/releases/download/v0.3.2/parley_wa-0.3.2-py3-none-any.whl'
parley setup # enable the local debugging port (auto-undoable)
parley send --to Ava --text "ci is green" # resolves Ava -> live chat -> sends -> confirms it landedOr in Python:
from parley import Session, parley_connect
wa = parley_connect() # auto-attaches to the running WhatsApp Desktop
wa.send("Weekend Hikers", "who's bringing the snacks?")
for chat in wa.chats(unread_only=True):
print(chat)No WhatsApp account? The entire API runs on a fully scripted simulator:
parley --demo status
parley --demo send --to Ava --text "hi from parley"
parley --demo tuiThreat model
parley works by enabling WebView2's remote debugging port. While it's enabled, any process running as your user can drive your logged-in WhatsApp session and read all chats. parley does not add auth to that port; it is a local-machine trust boundary. If that's not acceptable for your machine, don't run parley setup.
Mitigations: run parley setup --undo when not in use; the HTTP API requires a token and rejects browser origins; the MCP server is read-only unless --allow-send is set; scheduled sends honor the same human pacing budget. Not covered: malware already running as your user; untrusted content in chats (prompt injection) if you give an agent send access.
Related MCP server: waxum-mcp
Features
| attach health, login state, endpoint checks, reversible setup |
| conversations, unread counts, pins, last message, last seen |
| full history, richest first, JSON-ready |
| sends to a contact, group, number, or chat id — parley resolves the recipient first |
| quoted replies where WhatsApp supports them |
| reactions, not read receipts |
| one-shot and recurring (hourly/daily/weekly) sends, persisted to disk |
| local JSON HTTP API — for agents, webhooks, cron, you name it |
| a real terminal chat inside your WhatsApp |
| the entire surface, fully scripted, zero WhatsApp needed (also what CI tests live on) |
--to knows people and groups: pass an id (15551234567@c.us), a bare number (+1 555 123 4567), a contact name (Ava) or a group subject (Weekend Hikers) — parley finds the exact chat, opens it, verifies the header and only then types. No wrong-chat accidents.
Quick tour
# enable the debugging channel (undo later with: parley setup --undo)
parley setup # user-level env var, no admin; add --admin for HKLM
parley doctor # confirm: process running? flag present? endpoint open?
# your real install:
parley chats
parley send --to "Weekend Hikers" --text "who's bringing the snacks?"
parley send --to "+91 98765 43210" --text "sms alternative, but over WhatsApp"
parley chat Ava --json | jq '.[0]'
# scheduled + recurring sends, right from the API:
parley schedule add --to Ava --text "morning standup reminder" \
--at "2026-10-02T09:00:00" --repeat daily
parley schedule list
parley schedule run --once # fire anything due, right now
# any HTTP client can use it too — `parley server` issues a token on first
# run and prints it (see `~/.parley/server.token`); pass it as a Bearer token:
export PARLEY_TOKEN="$(cat ~/.parley/server.token)"
curl -X POST localhost:8300/send -H "content-type: application/json" \
-H "authorization: Bearer $PARLEY_TOKEN" \
-d '{"to":"Ava","text":"via http"}'Every command supports --json for piping into scripts, agents and cron. Scheduled entries live in ~/.parley/schedules.json (override with PARLEY_DATA_DIR), and parley server watches the queue in the background — a scheduled send obeys the same pacing and budget as a manual send.
Status
Area | State |
Simulator ( | stable, unit-tested, CI |
Live attach (Windows WhatsApp Desktop) | verified — real messages sent & content-confirmed in the UI |
Recipient resolution (contact, group, number, id) | stable, unit-tested |
Scheduler (one-shot + hourly/daily/weekly, JSON store) | stable, unit-tested |
CDP attach + status + login detect | implemented |
Store read path (chats/messages/contacts) | implemented, version-tolerant |
DOM fallback reads + DOM send | implemented, verified |
HTTP API (incl. | implemented, unit-tested |
TUI | functional, rides the simulator too |
Cross-platform (any Chromium + web.whatsapp.com) | supported |
Tests / CI | 40+ green on Windows + Ubuntu, Python 3.10–3.13 |
The live-store APIs are inherently version-sensitive (they call WhatsApp's own internal module surface). parley degrades gracefully — a build bump only ever softens a feature, never crashes the process.
Documentation
Architecture — CDP attach, Store vs DOM, pacing, scheduler
MCP Integration — stdio server, read-only default,
--allow-send,PARLEY_ALLOW_TOReliability — three-step verification, timing benchmarks
Comparison — vs Cloud API, scrapers, cloud platforms
Human Pacing — typing, network jitter, burst budget
Safety — local-only, paced, terms, loopback
Detailed Status — full feature matrix
Roadmap — PyPI, media, webhooks, container mode
Contributing — dev setup, CI, reporting
License — MIT, contributors
Contributors
Sachitt (@Sachitt-AV-08) — creator, maintainer
License
MIT © Sachitt. Made for people who automate their own machines — not for harvesting other people's. See LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.
Your own WhatsApp as an MCP server: read, search and send from any MCP client.
WhatsMCP connects Claude and other MCP-compatible AI agents directly to WhatsApp. Send and receive text, images, documents, and voice notes; manage groups (create, add/remove members, promote admins); look up contacts and profiles; follow channels; and read call and message history — all through a standard MCP interface. For voice use cases, WhatsMCP offers SIP-based calling plans (inbound-only, or full inbound/outbound) so AI voice agents can answer and place WhatsApp calls, plus low-latency WebSocket integrations with voice agent providers like ElevenLabs. Multiple WhatsApp accounts can be paired and managed per workspace, with webhook support for real-time inbound message delivery to your own infrastructure.
Ask questions across your WhatsApp inbox from Claude, ChatGPT, Cursor or any MCP client.
Related MCP Servers
- FlicenseBqualityDmaintenanceRead-only MCP server for WhatsApp Web allowing listing chats and reading recent messages, without sending or mutating WhatsApp state.319 npm-
- FlicenseNot gradedqualityCmaintenanceMCP server for WhatsApp that exposes send, read, and media management tools through the waxum REST API gateway, enabling any MCP client to interact with WhatsApp chats and media over stdio.2-
- AlicenseNot gradedqualityBmaintenanceMCP server that controls WhatsApp Desktop via Chrome DevTools Protocol using the user's real session, enabling tools to list chats, read messages, search contacts, and send messages with simulated typing and rate limiting.20 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to read, search, and send personal WhatsApp messages and files through a locally linked device.20 npmMIT