🟢 WA MCP
The first WhatsApp integration built natively for AI Agents.
Full MCP server exposing WhatsApp as discoverable tools, resources, and real-time notifications.
Quick Start • Features • Tools • Architecture • Configuration • Docker • Contributing
______________________________________________________________________
🤖 什么是WA MCP?
WA-MCP 是一个使用TypeScript构建的WhatsApp MCP服务器,它使AI代理能够通过 模型上下文协议。它支持这两种功能 百利 (WhatsApp网络)和 Meta Cloud API 作为双通道后端,可与 码头工人 在一个命令中。
您的代理连接一次并自动发现 63工具, 10资源,以及 12个实时事件 --零配置,零REST包装,零粘合代码。
Your AI Agent ←→ MCP Protocol ←→ WA MCP ←→ WhatsApp您的代理只需编写HTTP客户端、解析webhook有效负载并将端点手动映射到工具即可 连接并离开.开箱即用 克劳德, 谷歌ADK, LangChain,以及任何与MCP兼容的AI代理框架。
💡 主控程序 (模型上下文协议)是将AI代理连接到工具和数据的开放标准。WA MCP通过流式HTTP和stdio传输以本地方式使用MCP。
______________________________________________________________________
🚀 快速开始
使用Docker执行一个命令
docker compose up就是这样。WA MCP+Redis,准备就绪 http://localhost:3000/mcp.
或在本地运行
# Prerequisites: Node.js >= 22, Redis running
npm install
cp .env.example .env
# Development (stdio transport)
npm run dev
# Production (HTTP transport)
npm run build && npm start连接您的代理
🐍 Google ADK (Python)
from google.adk.tools.mcp_tool import McpToolset
tools = McpToolset(url="http://localhost:3000/mcp")
# Agent auto-discovers 63 WhatsApp tools
# wa_create_instance, wa_send_text, wa_send_image, ...🦜 LangChain
from langchain_mcp import McpToolkit
toolkit = McpToolkit(server_url="http://localhost:3000/mcp")
tools = toolkit.get_tools()💻 Claude Desktop
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"whatsapp": {
"command": "node",
"args": ["path/to/wa-mcp/dist/index.js"],
"env": {
"WA_TRANSPORT": "stdio",
"WA_REDIS_URL": "redis://localhost:6379"
}
}
}
}______________________________________________________________________
✨ 特性
| 功能 | 描述 | |
|---|---|---|
| 🔌 | MCP本地 | 可流式传输HTTP+stdio。没有REST,就没有webhooks。 |
| 📱 | 双通道 | Baileys(WhatsApp Web)+Meta Cloud API-相同的界面。 |
| 🔄 | 多实例 | 从单个服务器运行1-50个WhatsApp号码。 |
| 📨 | 完整消息 | 文本、图像、视频、音频、文档、投票、反应、回复、转发、编辑、删除、查看一次。 |
| 👥 | 群组 | 创建、管理成员、提升/降级管理员、设置、邀请链接、加入请求、临时消息。 |
| 👤 | 联系人和个人资料 | 号码检查、阻止/取消阻止、业务配置文件、隐私、状态更新。 |
| 📡 | 实时事件 | 通过SSE的12种通知类型:消息、打字、组、呼叫、连接状态。 |
| ⚡ | 速率限制 | BullMQ队列阻止WhatsApp禁令(20 msg/min Baileys,80 msg/min Cloud)。 |
| 🔁 | 自动重新连接 | 具有指数回退的自动重新连接。 |
| 🗃️ | 持久 | 用于会话、消息、联系人和组的SQLite存储。 |
| 🐳 | 单个集装箱 | docker compose up --只有Redis作为外部依赖。 |
______________________________________________________________________
🛠️ 工具
WA MCP暴露 63工具 跨越9个领域。所有工具都使用 wa_ 前缀。
📋 Instance Management (8 tools)
| 工具 | 说明 |
|---|---|
wa_create_instance | 创建新的WhatsApp连接 |
wa_connect_instance | 连接(生成二维码) |
wa_disconnect_instance | 优雅地断开连接 |
wa_delete_instance | 永久删除实例 |
wa_restart_instance | 断开连接+重新连接 |
wa_get_qr_code | 获取base64格式的二维码(Baileys) |
wa_get_pairing_code | 获取配对码(Baileys) |
wa_set_cloud_credentials | 设置云API令牌 |
💬 Messaging (17 tools)
| 工具 | 说明 |
|---|---|
wa_send_text | 发送短信 |
wa_send_image | 发送带有标题的图像 |
wa_send_video | 发送带有字幕的视频 |
wa_send_audio | 发送音频/语音备忘 |
wa_send_document | 发送文件/文档 |
wa_send_location | 发送GPS位置 |
wa_send_contact | 发送vCard联系人 |
wa_send_poll | 创建投票 |
wa_send_reaction | 用表情符号做出反应 |
wa_send_link_preview | 发送带有预览的URL |
wa_forward_message | 转发消息 |
wa_edit_message | 编辑已发送的消息 |
wa_delete_message | 删除邮件 |
wa_pin_message | 固定消息 |
wa_send_view_once | 发送一次查看媒体 |
wa_send_presence | 显示打字/录音 |
wa_mark_read | 将邮件标记为已读 |
💭 Chat Management (6 tools)
| 工具 | 说明 |
|---|---|
wa_get_messages | 获取聊天消息历史记录 |
wa_archive_chat | 存档/取消存档 |
wa_pin_chat | 闲聊/不愉快聊天 |
wa_mute_chat | 静音/取消静音 |
wa_delete_chat | 删除聊天 |
wa_clear_chat | 清除聊天记录 |
👥 Groups (14 tools)
| 工具 | 说明 |
|---|---|
wa_create_group | 创建组 |
wa_group_add_participants | 添加成员 |
wa_group_remove_participants | 删除成员 |
wa_group_promote | 晋升为管理员 |
wa_group_demote | 从管理员降级 |
wa_group_update_subject | 更改组名 |
wa_group_update_description | 变更说明 |
wa_group_update_settings | 更改设置 |
wa_group_leave | 离开小组 |
wa_group_get_invite_code | 获取邀请链接 |
wa_group_revoke_invite | 撤销邀请链接 |
wa_group_join | 通过邀请码加入 |
wa_group_toggle_ephemeral | 切换消失的消息 |
wa_group_handle_request | 批准/拒绝加入请求 |
📇 Contacts (5 tools)
| 工具 | 说明 |
|---|---|
wa_search_contact | 按姓名或电话搜索联系人 |
wa_check_number_exists | 检查号码是否在WhatsApp上 |
wa_block_contact | 阻止联系 |
wa_unblock_contact | 解除阻止联系人 |
wa_get_business_profile | 获取企业简介 |
👤 Profile (5 tools)
| 工具 | 说明 |
|---|---|
wa_update_profile_picture | 设置个人资料图片 |
wa_remove_profile_picture | 删除个人资料图片 |
wa_update_profile_name | 更改显示名称 |
wa_update_profile_status | 更改状态文本 |
wa_update_privacy | 更新隐私设置 |
📢 Status / Stories (3 tools)
| 工具 | 说明 |
|---|---|
wa_send_text_status | 发布文本状态 |
wa_send_image_status | 发布图像状态 |
wa_send_video_status | 发布视频状态 |
📰 Newsletter (3 tools)
| 工具 | 说明 |
|---|---|
wa_newsletter_follow | 关注时事通讯 |
wa_newsletter_unfollow | 取消关注时事通讯 |
wa_newsletter_send | 发送至时事通讯 |
📞 Calls (1 tool)
| 工具 | 说明 |
|---|---|
wa_reject_call | 拒绝来电 |
______________________________________________________________________
📖 资源
资源通过以下方式公开WhatsApp的只读状态 whatsapp:// URI:
| URI | 描述 |
|---|---|
whatsapp://instances | 列出所有实例 |
whatsapp://instances/{id} | 实例详细信息+队列统计信息 |
whatsapp://instances/{id}/contacts | 所有联系人 |
whatsapp://instances/{id}/chats | 活跃的对话 |
whatsapp://instances/{id}/groups | 所有组 |
whatsapp://instances/{id}/groups/{gid} | 组元数据 |
whatsapp://instances/{id}/messages/{chatId} | 消息历史记录 |
whatsapp://instances/{id}/profile | 个人资料 |
whatsapp://instances/{id}/privacy | 隐私设置 |
whatsapp://instances/{id}/blocklist | 阻止联系人 |
______________________________________________________________________
📡 实时通知
事件通过SSE(服务器发送事件)推送到代理:
| 事件 | 触发器 |
|---|---|
whatsapp/message.received | 新收到的消息 |
whatsapp/message.updated | 状态更改(已发送→ 交付→ 阅读) |
whatsapp/message.deleted | 邮件已删除 |
whatsapp/message.reaction | 添加/删除表情符号反应 |
whatsapp/message.edited | 消息已编辑 |
whatsapp/presence.updated | 打字/录音/在线 |
whatsapp/chat.updated | 聊天元数据已更改 |
whatsapp/group.updated | 组信息已更改 |
whatsapp/group.participants_changed | 成员添加/删除/升级/降级 |
whatsapp/contact.updated | 联系方式已更改 |
whatsapp/connection.changed | 实例状态更改(包括base64格式的QR) |
whatsapp/call.received | 来电 |
______________________________________________________________________
🏗️ 建筑
┌─────────────────────────────────────────────┐
│ AI Agent Runtime │
│ (Google ADK, Claude, LangChain, ...) │
└──────────────────┬──────────────────────────┘
│ MCP Streamable HTTP
┌──────────────────▼──────────────────────────┐
│ WA MCP Server │
│ │
│ ┌────────────────────────────────────────┐ │
│ │ Layer 1 — MCP Transport (HTTP/stdio) │ │
│ ├────────────────────────────────────────┤ │
│ │ Layer 2 — MCP Core │ │
│ │ 63 Tools │ 10 Resources │ 12 Events │ │
│ ├────────────────────────────────────────┤ │
│ │ Layer 3 — Services │ │
│ │ Instance Manager │ Queue │ Dedup │ │
│ ├────────────────────────────────────────┤ │
│ │ Layer 4 — Channel Abstraction │ │
│ │ ┌──────────────┐ ┌────────────────┐ │ │
│ │ │ Baileys │ │ Cloud API │ │ │
│ │ │ (WebSocket) │ │ (HTTPS) │ │ │
│ │ └──────────────┘ └────────────────┘ │ │
│ └────────────────────────────────────────┘ │
│ SQLite (Drizzle) BullMQ (Redis) │
└─────────────────────────────────────────────┘
│
▼ WebSocket / HTTPS
WhatsApp Servers双通道设计
| 贝利 | 云API | |
|---|---|---|
| 协议 | WhatsApp Web(WebSocket) | 元官方(HTTPS) |
| 身份验证 | 二维码/配对码 | 访问令牌 |
| 成本 | 免费 | 每次对话定价 |
| 合规性 | 非官方 | Meta批准 |
| 最适合 | 开发、测试、小批量 | 生产、企业 |
两个后端实现相同的功能 ChannelAdapter 界面。你的代理不知道或不关心哪个是活动的——这些工具的工作原理是相同的。
______________________________________________________________________
⚙️ 配置
复制 .env.example 到 .env 并配置:
| 变量 | 默认值 | 描述 | |||
|---|---|---|---|---|---|
WA_TRANSPORT | http | http (流式HTTP)或 stdio | |||
WA_MCP_API_KEY | -- | 承载令牌身份验证。Unset=无身份验证(dev) | |||
WA_MCP_PORT | 3000 | HTTP服务器端口 | |||
WA_REDIS_URL | redis://localhost:6379 | BullMQ队列的Redis | |||
WA_LOG_LEVEL | info | debug | info | warn | error |
WA_BAILEYS_RATE_LIMIT | 20 | 每个Baileys实例的消息数/分钟 | |||
WA_CLOUD_RATE_LIMIT | 80 | 每个云API实例的消息数/分钟 | |||
WA_MESSAGE_RETENTION_DAYS | 30 | 自动删除旧邮件 | |||
WA_AUTO_RECONNECT | true | 断开连接时自动重新连接 | |||
WA_MEDIA_CACHE_MAX_MB | 500 | 媒体缓存大小限制 | |||
WA_CLOUD_WEBHOOK_SECRET | -- | 元webhook验证 | |||
WA_CLOUD_WEBHOOK_PORT | 3001 | Webhook接收器端口 | |||
WA_VERSION_CHECK | true | 每日WhatsApp网络版本检查 |
______________________________________________________________________
🐳 码头工人
生产
docker compose up -d服务:
- wa-mcp --端口上的MCP服务器
3000 - 瑞迪斯 --具有AOF持久性的BullMQ后端
健康检查
curl http://localhost:3000/health{
"status": "ok",
"uptime": 3600,
"instances": { "total": 3, "connected": 2, "disconnected": 1 },
"version": "1.0.0"
}资源需求
| 实例 | RAM | CPU | 磁盘 |
|---|---|---|---|
| 1–5 | 256 MB | 0.5 vCPU | 1 GB |
| 5–20 | 512 MB | 1 vCPU | 5 GB |
| 20–50 | 1 GB | 2 vCPU | 10 GB |
______________________________________________________________________
📁 项目结构
src/
├── index.ts # Entry point (HTTP/stdio)
├── constants.ts # Defaults and limits
├── server/mcp.ts # MCP server setup
├── tools/ # 🔧 63 MCP tools (9 files)
├── resources/ # 📖 10 MCP resources (8 files)
├── notifications/events.ts # 📡 12 event types
├── channels/
│ ├── channel.interface.ts # ChannelAdapter contract
│ ├── baileys/ # Baileys implementation
│ └── cloud-api/ # Cloud API implementation
├── services/
│ ├── instance-manager.ts # Instance lifecycle
│ ├── message-queue.ts # BullMQ rate limiting
│ ├── dedup.ts # Message deduplication
│ └── media.ts # Media handling
├── db/
│ ├── schema.ts # Drizzle table definitions
│ └── client.ts # SQLite connection
├── schemas/ # Zod validation (9 files)
└── types/ # TypeScript definitions______________________________________________________________________
🗺️ 路线图
- \[x\] 第一阶段 --基础:Baileys适配器、短信、QR认证、实例管理
- \[x\] 第2阶段 --完整消息传递:所有媒体类型、数据消除、反应、编辑、转发
- \[x\] 第三期 --群组、联系人、个人资料、状态/故事、时事通讯
- \[x\] 阶段4 -云API适配器:双通道统一接口
- \[x\] 阶段5 --强化:错误恢复、CI/CD、测试、文档、v1.0版本
- \[x\] 第6阶段 --Baileys v7升级,LID支持,联系人同步,消息持久化
______________________________________________________________________
🤝 贡献
欢迎投稿!以下是代码库的组织方式:
- 每个域一个文件 --工具、资源、模式和通道都有特定于域的文件
- Zod模式适用于一切 --所有工具输入都使用严格的Zod模式进行验证
src/schemas/ - 两个适配器 -新功能应该在Baileys中实现,并在Cloud API中进行存根
- 分层体系结构 --工具→ 服务→ 频道。无跨层导入。
- 结构化日志记录 --使用皮诺,永远不要
console.log
# Development
npm run dev # Start with stdio transport
npm run build # Type-check + compile
npx tsc --noEmit # Type-check only______________________________________________________________________
📄 许可证
麻省理工学院——随心所欲。
______________________________________________________________________
Built for the agentic era.
Stop writing REST wrappers. Let your agent discover WhatsApp.
