关于 better-call-claude
better-call-claude 是用于通过语音通话、短信和 WhatsApp 与 Claude Code 双向沟通的 MCP 服务。它支持用手机发起任务、接收进度或决策请求,并在不同渠道间延续对话上下文。
主要功能
- 01呼入与呼出语音通话
- 02双向短信沟通
- 03WhatsApp 消息沟通
- 04跨渠道共享上下文
- 05持续监听 WhatsApp 消息
适用场景
- 01通过电话启动 Claude Code 任务
- 02任务需要输入时接收回电
- 03通过短信查询部署状态
- 04将语音任务延续到 WhatsApp
MCP 相关
该 MCP 服务将 Claude Code 与语音、短信和 WhatsApp 沟通渠道连接起来,使 Claude Code 能在执行任务时与用户交流。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y better-call-claudeBETTERCALLCLAUDE_PHONE_PROVIDERPhone provider: 'twilio' or 'telnyx'BETTERCALLCLAUDE_PHONE_NUMBERYour phone number in E.164 formatBETTERCALLCLAUDE_PHONE_ACCOUNT_SID密钥Twilio Account SID or Telnyx API KeyBETTERCALLCLAUDE_PHONE_AUTH_TOKEN密钥Twilio Auth Token or Telnyx API SecretBETTERCALLCLAUDE_USER_PHONE_NUMBERYour personal phone number in E.164 format (for outbound calls/SMS)BETTERCALLCLAUDE_OPENAI_API_KEY密钥OpenAI API key for speech-to-text (Whisper) and text-to-speechBETTERCALLCLAUDE_WHATSAPP_NUMBERWhatsApp number if different from phone number (e.g., Twilio Sandbox)BETTERCALLCLAUDE_PORTLocal HTTP server portTAILSCALE_HOSTNAMEOverride Tailscale hostname for webhook URLBETTERCALLCLAUDE_WHATSAPP_PROVIDERWhatsApp provider: set to 'baileys' for free WhatsApp via WebSocket (no Twilio needed)BETTERCALLCLAUDE_BAILEYS_AUTH_DIR密钥Path to Baileys auth state directory (default: data/baileys-auth)BETTERCALLCLAUDE_WHATSAPP_CHAT_HISTORY_SIZEMax WhatsApp chat history messages to retain (default: 50)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Better Call Claude
通过语音通话、SMS 和 WhatsApp 与 Claude Code 双向通信。
用手机呼叫 Claude 以启动任务,并在 Claude 需要输入或想要分享状态时接收回拨。
📞 “嘿,Claude,重构身份验证模块,完成后或需要我做决定时给我打电话。”
[20 分钟后,手机响起]
🤖 “我已完成重构,但发现了一个安全问题。要我现在修复,还是创建一个工单?”
💬 也可以通过 SMS/WhatsApp:
你:“Claude,部署进展如何?”
Claude:“部署完成。已更新 3 项服务,所有健康检查均已通过。”
功能
- 📱 呼入电话 - 用手机呼叫 Claude Code 以启动任务
- 📲 呼出电话 - Claude 会在完成、遇到阻碍或需要做决定时给你打电话
- 💬 SMS 消息 - 与 Claude 收发短信
- 📱 WhatsApp - 完整的 WhatsApp Business 集成
- 🔄 跨渠道上下文 - 从语音开始,并在 WhatsApp 上无缝继续
- 🔗 持久会话 - Claude 会保持运行,等待 WhatsApp 消息
- 🔒 安全传输 - 使用 Tailscale Funnel,并提供引导式自动设置
- 🗣️ 自然对话 - 在所有渠道中进行多轮交互
- 🔧 工具组合 - Claude 在通信时也可以使用其他工具
- ⚡ 自动更新 Webhook - URL 变更时自动更新 Twilio Webhook
- 🆓 通过 Baileys 免费使用 WhatsApp - 使用个人 WhatsApp,零 API 费用,无需商业验证
- ⌚ 随处可用 - 手机、智能手表或任何设备
⚠️ 测试状态
渠道 提供商 状态 语音 Twilio ✅ 已测试,可用 Twilio Sandbox ✅ 已测试,可用 SMS Twilio ⏳ 等待 A2P 10DLC 验证 语音 Telnyx 🔬 尚未测试 SMS Telnyx 🔬 尚未测试 Telnyx 🔬 尚未测试 Baileys(免费) 🔬 新功能,欢迎测试 欢迎贡献,测试其他提供商与渠道的组合!
快速开始
1. 选择你的设置方式
| 设置 | 可用功能 | 费用 | 所需账户 |
|---|---|---|---|
| 仅 Baileys | WhatsApp 消息 | 免费 | 无 |
| Twilio/Telnyx | 语音 + SMS + WhatsApp | 约 1 美元/月 + 使用费 | Twilio/Telnyx + OpenAI |
| 混合模式 | 语音 + SMS(Twilio)+ WhatsApp(Baileys) | 约 1 美元/月 + 语音使用费 | Twilio/Telnyx + OpenAI |
只想使用 WhatsApp? 跳转至 选项 C:Baileys——无需账户、无需 API 密钥,完全免费。
2. 设置电话服务提供商
选项 A:Telnyx(推荐,便宜 50%)
- 在 portal.telnyx.com 创建账户并完成身份验证
- 购买电话号码(约 $1/月)
- 创建 Voice API 应用:
- 将 Webhook URL 设置为隧道 URL +
/webhook/telnyx/inbound - 将 API 版本设置为 v2
- 将 Webhook URL 设置为隧道 URL +
- 为电话号码启用短信:
- 前往 Messaging 并创建 Messaging Profile
- 将电话号码分配给该配置
- 将短信 Webhook URL 设置为隧道 URL +
/webhook/telnyx/sms
- 启用 WhatsApp(可选):
- 在门户中前往 WhatsApp
- 完成 WhatsApp Business 验证
- 将 Webhook URL 设置为隧道 URL +
/webhook/telnyx/whatsapp
- 验证电话号码,以便拨打外呼电话
- 获取你的 Connection ID(或 Messaging Profile ID)和 API Key
选项 B:Twilio
- 在 twilio.com/console 创建账户
- 购买电话号码
- 为你的号码配置 Webhook:
- 语音 Webhook:隧道 URL +
/webhook/twilio/inbound - 短信 Webhook:隧道 URL +
/webhook/twilio/sms
- 语音 Webhook:隧道 URL +
- 启用 WhatsApp(可选):
- 前往 WhatsApp Senders
- 完成 WhatsApp Business 设置
- 将 Webhook URL 设置为隧道 URL +
/webhook/twilio/whatsapp
- 获取你的 Account SID 和 Auth Token
选项 C:Baileys(免费 WhatsApp — 无需 API 服务提供商)
Baileys 通过 WebSocket 直接连接到 WhatsApp 的 Web 协议。它使用你的个人 WhatsApp 账户,无需商业验证、无需 API 费用,也无需 Twilio/Telnyx。
**工作原理:**与 WhatsApp Web 相同,通过扫描二维码关联设备。
步骤 1:克隆并安装
git clone https://github.com/sns45/better-call-claude
cd better-call-claude
bun install
步骤 2:关联你的 WhatsApp
bun run baileys:pair
- 终端中会显示一个二维码
- 在手机上打开 WhatsApp > 设置 > 已关联的设备 > 关联设备
- 扫描二维码
- 等待出现“配对成功!”消息
你的会话会保存在 data/baileys-auth/ 中,无需再次扫描。
步骤 3:添加到 Claude Code(~/.claude.json 或 ~/.claude/settings.json):
{
"mcpServers": {
"better-call-claude": {
"command": "bun",
"args": ["run", "/path/to/better-call-claude/src/index.ts"],
"env": {
"BETTERCALLCLAUDE_WHATSAPP_PROVIDER": "baileys",
"BETTERCALLCLAUDE_USER_PHONE_NUMBER": "+1234567890"
}
}
}
}
完成!无需 Tailscale、Twilio 或 OpenAI 密钥。
步骤 4:重启 Claude Code 并测试
给自己发送一条 WhatsApp 消息(或请他人给你发消息)——Baileys 会接收消息并启动一个 Claude 任务。或者让 Claude 给你发送 WhatsApp 消息:
“给我发一条 WhatsApp 消息,问候我”
选项 D:混合方案(Twilio/Telnyx 语音 + Baileys WhatsApp)
两全其美:Twilio/Telnyx 处理语音通话和短信,Baileys 免费处理 WhatsApp。
- 设置 Twilio 或 Telnyx(上方选项 A/B)
- 运行
bun run baileys:pair关联你的 WhatsApp - 添加到你的 MCP 配置:
{
"env": {
"BETTERCALLCLAUDE_PHONE_PROVIDER": "twilio",
"BETTERCALLCLAUDE_WHATSAPP_PROVIDER": "baileys",
"BETTERCALLCLAUDE_PHONE_ACCOUNT_SID": "your-account-sid",
"BETTERCALLCLAUDE_PHONE_AUTH_TOKEN": "your-auth-token",
"BETTERCALLCLAUDE_PHONE_NUMBER": "+15551234567",
"BETTERCALLCLAUDE_USER_PHONE_NUMBER": "+15559876543",
"BETTERCALLCLAUDE_OPENAI_API_KEY": "sk-..."
}
}
语音通话和短信通过 Twilio 发送。WhatsApp 通过 Baileys 发送(免费)。
如果使用仅 Baileys 模式(选项 C),请跳过此步骤。Baileys 不需要 Webhook。
Tailscale Funnel 可提供免费、稳定的公开 URL,用于接收电话服务提供商发送的 Webhook。
为什么选择 Tailscale? 免费且不限量的隧道、稳定的 URL(没有随机子域名)、企业级安全性。
路径: Better Call Claude 使用
/bcc路径(例如:https://your-hostname.ts.net/bcc),以避免与其他服务冲突。
首次设置(自动化):
首次启动 MCP 服务时,它会引导你完成设置:
-
安装 Tailscale(如果尚未安装):
# macOS brew install tailscale # Linux curl -fsSL https://tailscale.com/install.sh | sh -
进行身份验证 - 服务将自动运行
tailscale up并打开浏览器 -
启用 Funnel - 访问终端中显示的 URL,在你的 tailnet 上启用 Funnel(管理员仅需设置一次)
就这么简单!服务会自动处理其余设置。
4. 安装 Better Call Claude
# Quick start with bunx (recommended)
bunx better-call-claude
# Or install globally
bun install -g better-call-claude
better-call-claude
5. 添加到 Claude Code
添加到 ~/.claude/settings.json:
{
"mcpServers": {
"better-call-claude": {
"command": "bunx",
"args": ["better-call-claude"],
"env": {
"BETTERCALLCLAUDE_PHONE_PROVIDER": "telnyx",
"BETTERCALLCLAUDE_PHONE_ACCOUNT_SID": "your-connection-id",
"BETTERCALLCLAUDE_PHONE_AUTH_TOKEN": "your-api-key",
"BETTERCALLCLAUDE_PHONE_NUMBER": "+15551234567",
"BETTERCALLCLAUDE_USER_PHONE_NUMBER": "+15559876543",
"BETTERCALLCLAUDE_OPENAI_API_KEY": "sk-..."
}
}
}
}
注意: 首次运行时会自动设置 Tailscale。如有需要,服务会引导你完成安装和身份验证。
重启 Claude Code。完成!
环境变量
必需变量
| 变量 | 说明 |
|---|---|
BETTERCALLCLAUDE_PHONE_PROVIDER | telnyx 或 twilio |
BETTERCALLCLAUDE_PHONE_ACCOUNT_SID | 服务提供商账户/连接 ID |
BETTERCALLCLAUDE_PHONE_AUTH_TOKEN | 服务提供商 API 密钥/身份验证令牌 |
BETTERCALLCLAUDE_PHONE_NUMBER | 你的 Telnyx/Twilio 电话号码(E.164) |
BETTERCALLCLAUDE_WHATSAPP_NUMBER | WhatsApp 号码(如不同,例如 Twilio Sandbox) |
BETTERCALLCLAUDE_USER_PHONE_NUMBER | 你的个人电话号码 |
BETTERCALLCLAUDE_OPENAI_API_KEY | 用于 TTS/STT 的 OpenAI API 密钥 |
Baileys(免费 WhatsApp)
| 变量 | 默认值 | 说明 |
|---|---|---|
BETTERCALLCLAUDE_WHATSAPP_PROVIDER | (未设置) | 设置为 baileys 以启用免费 WhatsApp |
BETTERCALLCLAUDE_BAILEYS_AUTH_DIR | data/baileys-auth | 会话凭据目录 |
仅 Baileys 模式: 当
WHATSAPP_PROVIDER=baileys且未设置 Twilio/Telnyx 凭据时,只需设置USER_PHONE_NUMBER。不需要 Tailscale,也不需要 OpenAI 密钥。
Tailscale(可选)
| 变量 | 默认值 | 说明 |
|---|---|---|
TAILSCALE_HOSTNAME | 自动检测 | 覆盖 Tailscale 主机名 |
可选变量
| 变量 | 默认值 | 说明 |
|---|---|---|
BETTERCALLCLAUDE_TTS_VOICE | onyx | OpenAI 语音(alloy、echo、fable、onyx、nova、shimmer) |
BETTERCALLCLAUDE_PORT | 3333 | 本地 HTTP 服务端口 |
BETTERCALLCLAUDE_TRANSCRIPT_TIMEOUT_MS | 180000 | 语音超时时间(3 分钟) |
BETTERCALLCLAUDE_STT_SILENCE_DURATION_MS | 800 | 语音结束检测 |
使用方法
语音通话
你 → Claude(呼入电话)
用个人手机拨打你的 Telnyx/Twilio 电话号码:
📱“嘿,Claude,我需要你为支付模块编写单元测试。完成后给我打电话。”
Claude 会确认收到并开始处理。完成后,它会回拨给你。
Claude → 你(呼出电话)
Claude 需要你提供意见时,可以主动发起通话:
🤖“我为缓存层找到了 3 种不同方案。要我给你讲讲,方便你做选择吗?”
通话中的语音指令
- “挂断”或“再见” - 结束通话
- “等一下” - Claude 会等待你继续
- “继续” - Claude 继续执行任务
- “取消” - 中止当前操作
SMS 消息
你 → Claude(呼入 SMS)
向你的 Telnyx/Twilio 号码发送短信:
💬“嘿,Claude,部署进展如何?”
Claude 会通过 SMS 回复:
🤖“部署已完成 80%。正在运行集成测试。预计还需 5 分钟。”
Claude → 你(外发短信)
Claude 可以向你发送文本更新:
🤖 “auth.ts 第 42 行构建失败。回复‘fix’以自动修复,或回复‘skip’以继续。”
你 → Claude(接收 WhatsApp 消息)
向你的企业号码发送 WhatsApp 消息:
💬 “显示过去一小时的错误日志”
Claude 会在 WhatsApp 中回复:
🤖 “发现 3 个错误:\n1. 14:32 连接超时\n2. 14:45 身份验证失败\n3. 15:01 触发速率限制\n\n需要我调查其中任何一个吗?”
Claude → 你(外发 WhatsApp 消息)
Claude 可以发送内容丰富的 WhatsApp 消息:
🤖 “代码审查已完成!发现 2 个问题:\n• 第 23 行:未使用的变量\n• 第 67 行:缺少错误处理\n\n回复‘fix’以自动修复,或回复‘details’查看更多信息。”
跨渠道上下文
通过语音开始一项任务,然后无缝切换到 WhatsApp 继续——Claude 会记住所有内容。
示例流程
-
致电 Claude:
📞 “嘿 Claude,以开发模式运行待办事项应用,然后我们切换到 WhatsApp 继续”
-
Claude 启动应用并进入 WhatsApp 监听模式:
🤖 “待办事项应用正在端口 5173 上运行。通过 WhatsApp 给我发消息,提供更多指示。”
-
发送 WhatsApp 消息:
💬 “通过 localtunnel 暴露它,并将 URL 添加到允许的主机列表”
-
Claude 通过 WhatsApp 回复:
🤖 “完成!Localtunnel URL:https://xyz.loca.lt - 我已将它添加到 vite.config.ts 的 allowedHosts 中”
-
继续对话:
💬 “公共 IP 是什么?这样我就能远程访问了”
🤖 “你的公共 IP 是 203.0.113.42。请通过 https://xyz.loca.lt 访问应用”
用于触发 WhatsApp 监听的关键短语:
- “在 WhatsApp 上继续”
- “我们在 WhatsApp 上聊”
- “监听我的 WhatsApp 消息”
WhatsApp Sandbox(Twilio)
测试时,你可以使用 Twilio 的 WhatsApp Sandbox,无需完整的 WhatsApp Business 账号。
- 前往 Twilio Console > Messaging > WhatsApp Sandbox
- 向 Sandbox 号码(+1 415 523 8886)发送加入代码
- 将 webhook URL 设置为
{your-tailscale-url}/bcc/webhook/twilio/whatsapp - 在配置中添加:
"BETTERCALLCLAUDE_WHATSAPP_NUMBER": "+14155238886"
注意: Sandbox 每隔 72 小时需要重新加入。
工作原理
┌─────────────────┐ ┌──────────────────────────────────┐
│ Your Phone │────────>│ Phone Provider │
│ 📞 Voice │<────────│ (Telnyx/Twilio) │
│ 💬 SMS │ │ │
│ 📱 WhatsApp │ │ • Voice API │
└─────────────────┘ │ • Messaging API │
│ • WhatsApp Business API │
└──────────────┬───────────────────┘
│ webhooks
▼
┌──────────────────────────────────┐
│ Transport Layer │
│ (Tailscale Funnel) │
└──────────────┬───────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────────────────────┐
│ Claude Code │◄──────► │ Better Call Claude MCP Server │
│ (your IDE) │ stdio │ (local, port 3333) │
└─────────────────┘ │ │
│ • Voice handling │
│ • SMS handling │
│ • WhatsApp handling │
│ • Conversation management │
└──────────────┬───────────────────┘
│
▼
┌──────────────────────────────────┐
│ OpenAI API │
│ (Whisper STT + TTS) │
│ (Voice calls only) │
└──────────────────────────────────┘
通信流程
语音:
- 接收: 你拨打电话 → 提供商 → Webhook → MCP 服务 → Claude Code
- 外发: Claude Code → MCP 服务 → 提供商 → 你的手机响铃
- 语音: 你的声音 → Whisper STT → 文本 → Claude → TTS → 音频播放
短信:
- 接收: 你发送短信 → 提供商 → Webhook → MCP 服务 → Claude Code
- 外发: Claude Code → MCP 服务 → 提供商 API → 短信已送达
WhatsApp:
- 接收: 你发送消息 → 提供商 → Webhook → MCP 服务 → Claude Code
- 外发: Claude Code → MCP 服务 → 提供商 API → WhatsApp 消息已送达
MCP 工具
语音工具
receive_inbound_call
接听并处理用户的来电。
initiate_call
向用户发起电话呼叫。
const { callId, response } = await initiate_call({
message: "Hey! I finished the refactor. What should I work on next?"
});
continue_call
通过后续消息继续进行中的通话。
const response = await continue_call({
call_id: callId,
message: "Got it. Should I also add the caching layer?"
});
speak_to_user
直接向用户讲话,无需等待回复(用于确认)。
await speak_to_user({
call_id: callId,
message: "Let me search for that. One moment..."
});
end_call
结束正在进行的通话。
await end_call({
call_id: callId,
message: "Perfect, I'll get started. Talk soon!"
});
get_call_status
查看当前通话或最近通话的状态。
const status = await get_call_status({ call_id: callId });
// { state: "active", duration: 45, transcript: [...] }
消息工具
receive_inbound_message
检查收到的短信或 WhatsApp 消息。
const result = await receive_inbound_message({
channel: "any", // "sms", "whatsapp", or "any"
timeout_ms: 5000 // How long to wait
});
// { success: true, channel: "sms", conversation_id: "...", message: "Deploy now" }
send_sms
向用户发送短信。
const result = await send_sms({
message: "Build complete! 42 tests passed.",
wait_for_reply: true,
timeout_ms: 180000
});
// { success: true, conversation_id: "...", reply: "Great, deploy it" }
send_whatsapp
向用户发送 WhatsApp 消息。
const result = await send_whatsapp({
message: "Found 3 issues in code review:\n• Issue 1\n• Issue 2\n• Issue 3",
wait_for_reply: true
});
// { success: true, conversation_id: "...", reply: "Fix issue 1 first" }
reply_to_conversation
回复现有对话(适用于语音、短信或 WhatsApp)。
const result = await reply_to_conversation({
conversation_id: "abc-123",
message: "Got it, fixing issue 1 now.",
wait_for_reply: false
});
get_conversation_history
获取任意对话的完整消息历史记录。
const history = await get_conversation_history({
conversation_id: "abc-123"
});
// { success: true, channel: "whatsapp", messages: [...], state: "active" }
费用
语音通话
| 服务 | 费用 |
|---|---|
| Telnyx 外呼 | ~$0.007/分钟 |
| Twilio 外呼 | ~$0.014/分钟 |
| OpenAI Whisper(STT) | ~$0.006/分钟 |
| OpenAI TTS | ~$0.015/1K 个字符 |
典型语音对话: ~$0.03-0.05/分钟
SMS
| 服务 | 费用 |
|---|---|
| Telnyx SMS(美国) | ~$0.004/条消息 |
| Twilio SMS(美国) | ~$0.0079/条消息 |
典型 SMS 往来: ~$0.01-0.02/次
| 服务 | 费用 |
|---|---|
| Baileys(个人 WhatsApp) | 免费 |
| Telnyx WhatsApp | ~$0.005/条消息 |
| Twilio WhatsApp | ~$0.005/条消息 + 对话费用 |
典型 WhatsApp 往来: 免费(Baileys)或 ~$0.01-0.02(Twilio/Telnyx)
基础设施
| 服务 | 费用 |
|---|---|
| 电话号码 | ~$1/月 |
| Tailscale Funnel | 免费 |
安全注意事项
Tailscale Funnel 安全性
- Funnel 会创建一个公共端点,但流量通过 Tailscale 的安全网络路由
- 支持面向企业使用的 SSO/SCIM 集成
- 可在 Tailscale 管理控制台查看审计日志
- 默认验证 webhook 签名
通用
- 从不记录电话号码
- 通话转录内容是临时的(重启时清除)
- 使用环境变量,切勿将凭据硬编码
能力证明
此代码库在根目录提供了一个 smithmark 能力清单 smithmark.yaml。这是一个“信任即代码”的声明,列出了此服务进程之外涉及的所有内容:它向其发送请求的网络主机(Twilio、Telnyx、OpenAI、WhatsApp/Baileys 基础设施,以及由启动的 claude 子进程间接访问的 api.anthropic.com)、它读写的文件系统路径(Baileys 身份验证状态、启动调试日志)、它执行的二进制文件(claude、tailscale、which、open、sudo)、它读取的环境变量,以及它处理的密钥类型(Twilio、Telnyx 和 OpenAI API 密钥)。
每次发布 GitHub 版本时,.github/workflows/smithmark-attest.yml 都会对已发布的 npm 压缩包生成 无密钥 Sigstore 证明:GitHub 的 OIDC 令牌会交换为短期 Fulcio 签名证书,证明由该证书签名,签名记录在公开的 Rekor 透明度日志中。整个过程不涉及签名密钥或机密。生成的 smithmark-attestation.sigstore.json 会附加到 GitHub 发布版本中。
使用以下命令验证已发布的版本:
smithmark verify [email protected] \
--certificate-identity "https://github.com/sns45/better-call-claude/.github/workflows/smithmark-attest.yml@refs/tags/v3.1.1" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
(将 v3.1.1 替换为实际的发布标签)
smithmark.yaml 是此服务能力范围的权威声明。smithmark lint(以及严格模式下的 verify)有意不感知主机:它会将每个网络/执行/文件系统调用点都标记为通用的“未声明”发现项,无论清单在主机级别声明了什么,因此任何访问网络的真实 MCP 服务都会报告提示性发现项。这些发现项是预期的噪声,并不意味着清单已过时;应以以上清单为准。
故障排除
语音问题
Claude 不接听来电
- 检查 MCP 服务是否正在运行:
claude --debug - 确认已在服务提供商控制面板中配置 webhook URL
- 确保 Tailscale Funnel 已启用
无法拨打外呼
- 确认
BETTERCALLCLAUDE_USER_PHONE_NUMBER正确 - 检查电话号码是否已通过服务提供商验证
- 确保服务提供商账户余额充足
音频质量问题
- 检查网络连接
- 尝试更换 TTS 语音:
BETTERCALLCLAUDE_TTS_VOICE=nova - 调整静音检测:
BETTERCALLCLAUDE_STT_SILENCE_DURATION_MS=1000
SMS 问题
无法收到 SMS
- 确认已在服务提供商控制面板中为你的电话号码启用 SMS
- 检查是否已设置 SMS webhook URL:
/webhook/telnyx/sms或/webhook/twilio/sms - 确认已将 Messaging Profile 分配给电话号码(Telnyx)
无法发送外发短信
- 检查电话号码是否支持短信
- 验证目标号码格式(E.164:+15551234567)
- 检查服务商账户余额
WhatsApp 问题
未收到 WhatsApp 消息
- 确认已在服务商门户中设置 WhatsApp Business
- 检查 webhook URL:
/webhook/telnyx/whatsapp或/webhook/twilio/whatsapp - 确保已完成 WhatsApp Business 验证
无法发送 WhatsApp 消息
- 用户必须先给你发消息(WhatsApp 24 小时规则)
- 检查 WhatsApp Business 审批状态
- 验证消息模板是否合规(适用于主动发送的消息)
Baileys 问题
未显示二维码
二维码无法显示在 MCP 服务中(stdout 保留给 MCP 协议使用)。请单独运行配对脚本:
cd /path/to/better-call-claude
bun run baileys:pair
配对完成后,会保存会话,MCP 服务将自动连接。
“已配置 Baileys,但未找到会话”
运行 bun run baileys:pair,先配对 WhatsApp,然后重启 Claude Code。
WhatsApp 已退出登录
删除身份验证目录并重新配对:
rm -rf data/baileys-auth
bun run baileys:pair
未收到消息
- 检查 Baileys 是否已连接(查看 stderr 中是否有
[Baileys] Connected) - 确保消息来自个人聊天(群组消息会被过滤)
- 确认发送者不是关联账户本身(自己发送的消息会被过滤)
Tailscale 问题
“Tailscale 未运行”
- macOS:从“应用程序”中打开 Tailscale 应用
- Linux:
sudo systemctl start tailscaled && tailscale up
“未启用 Funnel”
- 访问终端中显示的 URL 以启用 Funnel
- 或前往 https://login.tailscale.com/admin/acls 并添加 Funnel 功能
Funnel 已启动,但 webhook 无法正常工作
- 检查
tailscale funnel status是否显示/bcc指向你的端口 - 验证电话服务商的 webhook URL 是否与 Tailscale URL 一致(包含
/bcc路径) - 使用
curl https://your-hostname.ts.net/bcc/health进行测试
开发
# Clone the repo
git clone https://github.com/sns45/better-call-claude
cd better-call-claude
# Install dependencies
bun install
# Run in development mode
bun run dev
本地测试
# Start the MCP server
bun run dev
# In another terminal, test with MCP inspector
npx @anthropics/mcp-inspector
技术栈
- 运行时:Bun - 快速的 JavaScript 运行时
- Web 框架:Hono - 轻量、快速的 Web 框架
- 电话:Telnyx / Twilio - 电话 API
- WhatsApp:Baileys - 免费的 WhatsApp Web 协议
- 语音:OpenAI Whisper - STT/TTS
- 传输:Tailscale Funnel - 公共 URL 隧道
- 协议:MCP - Model Context Protocol
贡献
欢迎提交 PR!请参阅 CONTRIBUTING.md 了解指南。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。