Pywa Server
БесплатноНе проверенMCP server for the WhatsApp Cloud API via pywa. Auto-discovers ~100 tools — send messages, manage templates, flows, QR codes, media, and business profile.
Описание
MCP server for the WhatsApp Cloud API via pywa. Auto-discovers ~100 tools — send messages, manage templates, flows, QR codes, media, and business profile.
README
Python MCP pywa License: MIT Tests
Unofficial Model Context Protocol (MCP) server that exposes the pywa WhatsApp Cloud API client as MCP tools.
⚠️ Disclaimer: Unofficial, third-party integration. Not affiliated with, endorsed by, or sponsored by WhatsApp, Meta, or the pywa project.
✨ Features
- 🔗 Full pywa surface — ~100 tools auto-discovered from the pywa
WhatsAppclient - 🛡️ Type coercion — auto-parses JSON strings, hydrates dataclasses, coerces enums
- 📦 Smart serialization — bytes → base64, datetime → ISO, Path → string, enum → value, dataclass → dict
- 🎛️ Allowlist control — restrict exposed tools via
PYWA_MCP_TOOLSenv - ⚙️ Var-args support — pywa methods with
*argsexposed via an_argsfield - 🧪 Unit-tested — 37 tests covering serialization, coercion, schema, discovery
- 📖 MCP compliant — works with Claude Code, Claude Desktop, Cursor, Cline, etc.
🚀 Quick Start
Prerequisites
- Python 3.13+
- uv
- A Meta-approved WhatsApp Business phone number + access token
- An MCP-compatible client
1. Get pywa credentials
From the Meta Business dashboard:
- Phone Number ID — Meta → WhatsApp → API Setup
- Access token — system-user token (permanent) or temporary
- WABA ID — required for templates / flows / QR codes
- App ID / App secret — required for update validation + callback registration
2. Register with Claude Code
Option A — claude mcp add (recommended, zero-install)
Runs the server directly from PyPI via uvx — no clone required.
Basic syntax:
claude mcp add [options] <name> -- <command> [args...]
Real example:
claude mcp add --transport stdio --scope user \
--env WHATSAPP_PHONE_ID=<phone-id> \
--env WHATSAPP_TOKEN=<token> \
--env WHATSAPP_WABA_ID=<waba-id> \
--env WHATSAPP_APP_ID=<app-id> \
--env WHATSAPP_APP_SECRET=<app-secret> \
pywa \
-- uvx --from pywa-mcp-server pywa-mcp-server
Scope (--scope / -s):
local(default) — private to this projectuser— across all your projectsproject— committed via.mcp.json
Other useful commands:
claude mcp list # list all configured servers
claude mcp get pywa # show details + health-check pywa
claude mcp remove pywa # remove from config
claude mcp add-json pywa '<json>' # add via raw JSON string
claude mcp add-from-claude-desktop # import servers from Claude Desktop (Mac/WSL)
claude mcp reset-project-choices # reset approved/rejected project-scoped servers
claude mcp serve # run Claude Code itself as an MCP server
To run from latest git (unreleased changes) instead of PyPI:
... -- uvx --from git+https://github.com/ianaleck/pywa-mcp-server pywa-mcp-server
Option B — .mcp.json in the project
cp .mcp.json.example .mcp.json
# edit credentials; .mcp.json is gitignored
Option C — Claude Desktop / Cursor / Cline / other clients
Any MCP client that supports stdio works. Add:
{
"mcpServers": {
"pywa": {
"command": "uvx",
"args": ["--from", "pywa-mcp-server", "pywa-mcp-server"],
"env": {
"WHATSAPP_PHONE_ID": "...",
"WHATSAPP_TOKEN": "...",
"WHATSAPP_WABA_ID": "...",
"WHATSAPP_APP_ID": "...",
"WHATSAPP_APP_SECRET": "..."
}
}
}
}
Local development install
If you're modifying the server, clone and run from source:
git clone https://github.com/ianaleck/pywa-mcp-server.git
cd pywa-mcp-server
uv sync
# then point claude mcp add at:
# uv --directory /absolute/path/to/pywa-mcp-server run pywa-mcp-server
🎯 What You Can Do
Once connected, you can ask Claude to:
💬 Messaging
- "Send a WhatsApp text to +27..., 'Order confirmed'"
- "Send the totp template to +27... with code 483921"
- "React to message wamid.xxx with 🎉"
📋 Templates
- "List all my approved templates"
- "Create a UTILITY template called 'order_shipped' with one body variable"
- "Show me the totp template details"
🌊 Flows
- "List all published flows"
- "Show metrics for the customer_pick flow over the last 30 days"
- "Fetch the JSON for flow 903243286082414"
🖼️ Media
- "Upload this image URL and send it to +27..."
- "Download media wamid.xxx to /tmp"
🔗 QR Codes
- "Create a QR code with the message 'Hi Orana!'"
- "Update QR code XYZ123 with a new prefilled message"
🏥 Health & Diagnostics
- "Check my WABA health status"
- "What's blocking my business-initiated sends?"
🛠️ Tool Catalog
Auto-discovered from pywa.WhatsApp. Full pywa docs at pywa.readthedocs.io.
💬 Send messages (16 tools)
send_text/send_messagesend_image/send_video/send_audio/send_voicesend_document/send_stickersend_location/send_contactsend_reaction/remove_reactionsend_templatesend_catalog/send_product/send_productsrequest_location
📋 Templates (9 tools)
get_template/get_templatescreate_template/update_template/delete_templatecompare_templates(uses_argsfor second template ID)unpause_templateupsert_authentication_templatemigrate_templates
🌊 Flows (11 tools)
get_flow/get_flows/get_flow_assets/get_flow_metricscreate_flow/update_flow_json/update_flow_metadatapublish_flow/deprecate_flow/delete_flowmigrate_flows
🖼️ Media (5 tools)
upload_media/download_mediaget_media_url/get_media_bytes(returns base64-wrapped bytes)delete_media- ⚠️
stream_mediareturns a Python generator — unusable via MCP. Useget_media_bytesordownload_mediainstead.
🔗 QR Codes (5 tools)
create_qr_codeget_qr_code/get_qr_codesupdate_qr_codedelete_qr_code
🏢 Business profile & account (5 tools)
get_business_profile/update_business_profileget_business_accountget_commerce_settings/update_commerce_settings
📞 Phone numbers (7 tools)
get_business_phone_number/get_business_phone_numbersget_business_phone_number_settings/update_business_phone_number_settingsupdate_display_nameregister_phone_number/deregister_phone_number
☎️ Calling API (6 tools)
Requires SIP configuration; may be blocked if not enabled.
initiate_call/terminate_callpre_accept_call/accept_call/reject_callget_call_permissions
🪝 Webhook configuration (6 tools)
Note: this server doesn't run a webhook receiver — registration only.
set_app_callback_urloverride_phone_callback_url/override_waba_callback_urldelete_phone_callback_url/delete_waba_callback_urlset_business_public_key
🚫 Block users (3 tools)
block_users/unblock_usersget_blocked_users
💬 Conversation utilities (3 tools)
mark_message_as_readindicate_typingupdate_conversational_automation
🔧 Misc (1 tool)
get_app_access_token
⚙️ Environment Variables
| Variable | Required | Notes |
|---|---|---|
WHATSAPP_PHONE_ID / WA_PHONE_ID |
✅ | Phone Number ID |
WHATSAPP_TOKEN / WA_TOKEN |
✅ | System-user or business access token |
WHATSAPP_WABA_ID / WA_BUSINESS_ACCOUNT_ID |
⚠️ | WABA-scoped methods (templates, flows, QR codes) |
WHATSAPP_APP_ID / WA_APP_ID |
⚠️ | Callback registration with APP scope |
WHATSAPP_APP_SECRET / WA_APP_SECRET |
⚠️ | Update validation + APP-scoped callbacks |
PYWA_MCP_TOOLS |
❌ | Comma-separated allowlist. Unset = all minus DEFAULT_SKIP. |
🎛️ Tool Filtering
Default: every public pywa method except listen (which blocks indefinitely).
Allowlist: set PYWA_MCP_TOOLS=send_text,get_templates,send_template to expose only those.
⚠️ Caveats
- No inbound webhook. This server only sends/admin.
listen,on_*,webhook_*register handlers / wait for inbound updates, but no FastAPI/Flask is run. For inbound support, run pywa's webhook in a separate process. stream_mediareturns a Python generator — unusable via MCP JSON transport. Useget_media_bytes(base64) ordownload_media(writes to disk, returns path).- 24-hour window. Free-form sends to a user require they messaged you in the last 24h. Otherwise use an approved template.
- WABA health. Check
get_business_account/get_business_phone_number— payment, calling SIP, and other issues cause silent send failures (can_send_message=BLOCKED). - Schema drops type info for unions. MCP transport may stringify complex args; this server compensates by JSON-parsing strings when target type expects list/dict/dataclass.
🔄 Response Serialization
| Input | Output |
|---|---|
bytes |
{"_bytes_b64": "...", "size": N} |
pathlib.Path |
string |
datetime / date / time |
ISO 8601 |
timedelta |
seconds (float) |
enum.Enum |
.value |
| dataclass | recursive dict |
pydantic BaseModel |
model_dump(mode="json") |
| other | JSON if serializable, else repr() |
🧪 Development
git clone https://github.com/ianaleck/pywa-mcp-server.git
cd pywa-mcp-server
uv sync
# Run tests
uv run pytest tests/
# With coverage
uv run pytest tests/ --cov=main --cov-report=term-missing
37 unit tests, ~70% coverage. Remainder is async server boot (not unit-testable).
📋 API Requirements
This server requires a WhatsApp Cloud API account. You must comply with:
🤝 Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes with tests
- Ensure all tests pass (
uv run pytest tests/) - Commit your changes
- Open a Pull Request
📄 License
MIT — see LICENSE.
🙏 Acknowledgments
- pywa by David Lev — the underlying WhatsApp Cloud API client
- Model Context Protocol — protocol spec
- Anthropic — Claude and the MCP SDK
- Meta — WhatsApp Cloud API
📞 Support
Made with ❤️ for the MCP community
⭐ Star this project if you find it useful!
Установить Pywa Server в Claude Desktop, Claude Code, Cursor
unyly install pywa-mcp-serverСтавит в Claude Desktop, Claude Code, Cursor и VS Code — сам разбирается с npx, uvx и сборкой из исходников.
Впервые? Поставь CLI: curl -fsSL https://unyly.org/install | sh
Или настроить вручную
Выполни в терминале:
claude mcp add pywa-mcp-server -- uvx pywa-mcp-serverFAQ
Pywa Server MCP бесплатный?
Да, Pywa Server MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Pywa Server?
Нет, Pywa Server работает без API-ключей и переменных окружения.
Pywa Server — hosted или self-hosted?
Доступен hosted-вариант: Unyly запускает сервер в облаке, локальная установка не обязательна.
Как установить Pywa Server в Claude Desktop, Claude Code или Cursor?
Открой Pywa Server на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
Omni Video
An MCP server that transforms LLM-enabled IDEs into professional video editors by pre-processing footage into text proxies, generating motion graphics via HTML/
автор: buildwithtazaARA
Generate images, video and audio from any AI agent — one connector.
автор: ARAYouTube
Transcripts, channel stats, search
автор: YouTubeEverArt
AI image generation using various models.
автор: modelcontextprotocolCompare Pywa Server with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории media
