WhatsApp MCP扩展
WhatsApp的扩展模型上下文协议(MCP)服务器 41工具 -高级消息传递、组管理、webhooks、状态等。
什么是新的(vs原创)
| 功能 | 原始 | 扩展 |
|---|---|---|
| MCP工具 | 12 | 41 |
| 反应 | - | ✅ |
| 编辑/删除邮件 | - | ✅ |
| 集团管理 | - | ✅ |
| 民意调查 | - | ✅ |
| 历史同步 | - | ✅ |
| 在线状态 | - | ✅ |
| 通讯 | - | ✅ |
| Webhooks | - | ✅ |
| 自定义昵称 | - | ✅ |
建筑
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ whatsapp-bridge │ │ whatsapp-mcp │ │ webhook-ui │
│ (Go + whatsmeow) │◄────│ (Python + MCP) │ │ (HTML/JS SPA) │
│ Port: 8080 │ │ Ports: 8081,8082 │ │ Port: 8089 │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────┐
│ SQLite (store/) │
│ messages.db │ whatsapp.db │
└─────────────────────────────────────┘快速开始
Docker(推荐)
git clone https://github.com/felixisaac/whatsapp-mcp-extended
cd whatsapp-mcp-extended
docker network create n8n_n8n_traefik_network
docker-compose up -d
# Scan QR code to authenticate
docker-compose logs -f whatsapp-bridgeClaude桌面/光标集成
添加到MCP配置(claude_desktop_config.json 或光标设置):
{
"mcpServers": {
"whatsapp": {
"command": "uv",
"args": ["run", "--directory", "/path/to/whatsapp-mcp-extended/whatsapp-mcp-server", "python", "main.py"]
}
}
}MCP工具(共41个)
消息传递
| 工具 | 说明 |
|---|---|
send_message | 发送短信 |
send_file | 发送图像/视频/文档 |
send_audio_message | 发送语音信息 |
download_media | 下载收到的媒体 |
send_reaction | 使用表情符号回复消息 |
edit_message | 编辑已发送的消息 |
delete_message | 删除/撤销消息 |
mark_read | 将邮件标记为已读(蓝色标记) |
聊天和消息
| 工具 | 说明 |
|---|---|
list_chats | 列出所有聊天记录 |
get_chat | 通过JID聊天 |
list_messages | 使用筛选器搜索邮件 |
get_message_context | 获取围绕特定消息的消息 |
get_direct_chat_by_contact | 查找DM及其联系人 |
get_contact_chats | 所有涉及联系人的聊天 |
get_last_interaction | 最近与联系人的消息 |
request_history | 请求旧邮件历史记录 |
联系人
| 工具 | 说明 |
|---|---|
search_contacts | 按姓名/电话搜索 |
list_all_contacts | 列出所有联系人 |
get_contact_details | 完整联系信息 |
set_nickname | 设置自定义昵称 |
get_nickname | 获取自定义昵称 |
remove_nickname | 删除昵称 |
list_nicknames | 列出所有昵称 |
群组
| 工具 | 说明 |
|---|---|
get_group_info | 组元数据和参与者 |
create_group | 创建新组 |
add_group_members | 添加成员 |
remove_group_members | 删除成员 |
promote_to_admin | 晋升为管理员 |
demote_admin | 降级管理员 |
leave_group | 离开小组 |
update_group | 更新名称/主题 |
create_poll | 在聊天中创建投票 |
出席和简介
| 工具 | 说明 |
|---|---|
set_presence | 设置在线/离线状态 |
subscribe_presence | 订阅联系人的在线状态 |
get_profile_picture | 获取个人资料图片URL |
get_blocklist | 列出被阻止的用户 |
block_user | 阻止用户 |
unblock_user | 解除用户锁定 |
通讯(频道)
| 工具 | 说明 |
|---|---|
follow_newsletter | 关注频道 |
unfollow_newsletter | 取消关注频道 |
create_newsletter | 创建新频道 |
API设计理念
响应数据优先级 完整的上下文,解释最少。参见 元数据_哲学.md 用于:
- 为什么我们包括原始数据而不是预先计算的信号
- 我们如何减少消费LLM的代币浪费
- 响应结构示例(消息、聊天、联系人)
- 设计规则:原始事实、可计数指标、排除空值
太长,读不下去了 在一个响应中获取所有联系信息,而不是重复查询。LLM从原始数据+指标中推断语气、紧迫性和关系。
Webhook系统
用于传入消息的实时HTTP webhooks,具有:
- 触发器:all、chat\_\_id、发件人、关键字、media_type
- 匹配:exact,contains,正则表达式
- 安全:HMAC-SHA256签名
- 重试:指数级回退
访问webhook用户界面 http://localhost:8089
发展
手动设置
# Bridge (Go 1.25+)
cd whatsapp-bridge && go run main.go
# MCP Server (Python 3.11+)
cd whatsapp-mcp-server && uv sync && uv run python main.py
# Webhook UI
cd whatsapp-webhook-ui && python3 -m http.server 8089预构建检查
cd whatsapp-mcp-server
uv run python check.py # Catches errors before docker build更新whatsmow
当你看到 Client outdated (405) 错误:
cd whatsapp-bridge
go get -u go.mau.fi/whatsmeow@latest
go mod tidy
docker-compose build whatsapp-bridge
docker-compose up -d whatsapp-bridge端口
| 服务 | 端口 | 描述 |
|---|---|---|
| 桥接API | 8080(→8180) | REST API |
| MCP服务器 | 8081 | SSE传输 |
| Gradio UI | 8082 | Web测试UI |
| Webhook UI | 8089 | Webhook管理 |
故障排除
邮件未送达
如果API返回成功,但消息显示单个复选标记:
docker-compose restart whatsapp-bridge
docker-compose logs --tail=10 whatsapp-bridge
# Should see: "✓ Connected to WhatsApp!"二维码问题
docker-compose logs -f whatsapp-bridge
# Scan QR with WhatsApp mobile app学分
叉链:
- 拉里斯/whatsapp mcp -原始MCP服务器(12个工具)
- 阿达姆鲁萨克/whatsapp -添加了webhooks、容器拆分、webhook UI
- 此仓库-添加了反应、编辑/删除、分组、民意调查、在线状态、新闻通讯(41个工具)
图书馆:
社区致谢
几个分叉独立地解决了实际问题,他们的想法已被纳入这个回购中。到期信用:
| 贡献者 | 他们发现了什么 |
|---|---|
| 西蒙谢弗 | 首先追踪 direct_path 媒体下载过程中CDN回退所需的DB列;什么是土生土长的 Download() 方法在 /api/download跨Docker/本地环境的正确DB路径解析;内联 Image 内容块在 download_media |
| 白云石 | 图像/视频/文档的媒体字幕被悄悄删除——已修复 ExtractTextContent();webhook有效负载中的引用/回复上下文; @mention 自动检测; request_history 对等消息目标错误(发送到组JID而不是自己的设备JID) |
| 卡斯珀鲁伦 | 联系人姓名解析优先级链(FullName > PushName > FirstName > Business)以及电话号码缓存错误;完整的呼叫事件流程(提供/接受/终止/拒绝,并注明持续时间); LID → 电话JID分辨率通过 GetAltJID() |
| 科里亚特 | 第一次工作 /api/download 使用手动HKDF/AES-CBC解密实现 |
| 杰迪亚什瓦 | 反应无声地失败修复(错误的发件人JID查找);音频/文档类型的扩展MIME类型支持 |
| 斯拉林 | LID JID规范化——诊断出WhatsApp的新LID格式导致消息在单独的聊天线程中落地的无声对话分裂错误 |
如果你已经分叉了这个仓库并构建了一些有用的东西,打开一个PR或问题——好的想法应该向上游流动。
许可证
MIT许可证-请参阅 许可证 文件。
