关于 call4me
call4me 是远程 MCP 服务,可让 AI Agent 致电商家并处理电话菜单和等待流程。它适用于自动办理预约或取消订阅等任务,并向 Agent 返回通话结果和文字记录。
主要功能
- 01代表 Agent 致电商家
- 02处理电话菜单和等待队列
- 03返回通话结果和文字记录
- 04可呼叫用户加入通话
- 05使用预付通话额度
适用场景
- 01通过电话预订餐厅
- 02预约牙医
- 03取消订阅或向商家咨询
MCP 相关
托管服务位于 `https://call4.me/mcp`,通过 Streamable HTTP 向 MCP 客户端提供拨打电话的工具。用户可通过浏览器或 API 密钥进行身份验证。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://call4.me/mcpclaude mcp add --transport http skeptrunedev-call4me https://call4.me/mcp{"mcpServers":{"skeptrunedev-call4me":{"type":"http","url":"https://call4.me/mcp"}}}在 Cursor 中打开{"servers":{"skeptrunedev-call4me":{"type":"http","url":"https://call4.me/mcp"}}}在 VS Code 中打开{"mcpServers":{"skeptrunedev-call4me":{"type":"http","url":"https://call4.me/mcp"}}}{"mcpServers":{"skeptrunedev-call4me":{"serverUrl":"https://call4.me/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
call4me:用于拨打电话的 MCP 服务
call4me 是一个用于拨打电话的远程 MCP 服务。将任意 MCP 客户端指向 https://call4.me/mcp
(streamable HTTP),你的 Agent 就能替你给商家打电话。Claude Code 一行安装:
claude mcp add --scope user --transport http call4me https://call4.me/mcp
call4me 能让你的 AI Agent 替你拨打真实电话。你可以让 Claude、ChatGPT、Cursor、Codex 或自己的应用预订餐桌、预约牙医、取消订阅或向商家咨询问题。它会拨打电话、等待接通、通过电话菜单、与接听电话的人交谈,然后向你反馈结果和通话记录。它也可以给你打电话,让你加入通话。通话费用从预付余额中扣除,起价为 10 美元。
使用方法
托管的 MCP 服务地址为 https://call4.me/mcp(streamable HTTP)。你的 Agent 会通过浏览器使用 Google 或 X 登录。最简单的设置方法是将 call4.me/mcp
中的提示词粘贴到你的 Agent 中。手动添加方法:
claude code: claude mcp add --scope user --transport http call4me https://call4.me/mcp then /mcp, call4me, authenticate
codex: codex mcp add call4me --url https://call4.me/mcp then codex mcp login call4me
claude desktop / claude.ai / chatgpt: settings, connectors, add custom connector: https://call4.me/mcp
can't sign in? create a key at https://call4.me/account and use https://call4.me/mcp/<key>, or send "Authorization: Bearer <key>" to /mcp
Cursor:将其添加到 ~/.cursor/mcp.json,并在 Cursor 提示时登录。
{
"mcpServers": {
"call4me": { "url": "https://call4.me/mcp" }
}
}
在你自己的代码中,Vercel AI SDK package 可为 Agent 提供相同的工具:
npm install call4me-ai-sdk ai zod @ai-sdk/openai
import { call4meTools } from 'call4me-ai-sdk';
// with CALL4ME_API_KEY set (from https://call4.me/account):
// generateText({ model, prompt: 'Call ... and ask ...', tools: call4meTools() })
- 示例:真实通话以及发起通话时使用的提示词。
- 博客:关于 Claude Code、 AI SDK 等内容的指南。
- MCP Registry:
io.github.skeptrunedev/call4me。
本 README 的其余部分介绍如何开发 call4me 本身或托管自己的副本。
调用的工作原理
agent ──MCP──▶ worker ──POST /v2/calls──▶ Telnyx ──PSTN──▶ business
▲ │ media stream (PCMU, bidirectional RTP)
│ webhooks ▼
└──────────────── VoiceSession (Durable Object) ◀──WS──▶ GPT-Live (gpt-live-1, audio/pcmu 8k)
└─ back office (Responses model):
end_call · ask_user · press_digits
src/server/voice/prompt.ts:告知来电者的内容。产品体验由此定义:不会在开场时主动说明身份,不会告知正在录音,也不会在通话结束时复述通话内容;如果有人真诚地询问是否为 AI,则如实回答。src/server/voice/session.ts:音频中继和后台功能。src/server/services/dialer.ts:拨打电话、分配各账户的号码、接听回拨。src/server/services/numbers.ts:账户的 call4me 号码,以及经验证可用于拨出的用户自有号码。Telnyx 为我们的整个运营商账户维护一份已验证号码列表,因此verified_numbers会将每个号码关联到提交了最新验证码的唯一 call4me 账户;Telnyx 已列为已验证的号码绝不会分配给其他账户。使用自有号码(from)拨打时,只会接通该号码所在国家/地区的商家,用户仍会通过 call4me 号码接听。src/server/mcp/server.ts:MCP 工具。
拨打或接听电话时,应用不会请求录音。通话结束后,可在登录状态下的通话页面播放或打开 Telnyx 存储的现有录音,也可通过 MCP 调用 call4me_get_recordings({ call_id }) 获取,或使用 Bearer 标头中的 call4me API 密钥或 OAuth 令牌请求 GET /api/calls/{call_id}/recordings。
这两种方式都会先检查账户所有权,再联系 Telnyx,并返回新的下载链接,但不会存储这些链接。结果为空可能表示录音仍在处理中,也可能表示没有保存录音。链接可能会过期,且只能分享给账户所有者。
中继录音使用通话分段 ID。单独的服务商 ID 表会通过经过验证的 Webhook 接收这些 ID;现有通话则通过与 Telnyx Webhook 历史记录中的控制 ID 完全匹配来解析。应用绝不会根据电话号码或时间戳猜测匹配项。如果服务商历史记录已过期,且未保存映射,则只能找到与控制 ID 直接关联的录音。
录音查询绝不会联系语音会话,也不会更改提示词、实时工具、音频或 Telnyx 录音设置。现有的通话状态和转录文本响应保持不变。
录音 API 的 OpenAPI 文档位于 /api/openapi.json。运行
npm run openapi:generate,可根据共享的 MCP 和 HTTP 架构重新生成 openapi.json。
CI 会检查生成的文件是否存在差异。通过 git 部署前,请运行 npm test、npm run check、npm run lint
和 npx wrangler deploy --dry-run。
菜单恢复机制会将新收到的电话提示与转录时间戳分开跟踪,并记住已接受的按键输入。重复菜单、无效输入和录音说明造成的死路,都可以在录音停止后重新启动现有后台流程。该机制会等待待处理工具及其后续操作完成,不会打断等待过程或正在接听的人员,并会让模型根据听到的选项选择受支持的路线,而不是盲目重放按键。
npm test 包含用于恢复机制及其时序竞争条件的服务商消息重放测试。要根据合成菜单场景评估配置的后台模型,请在设置 OPENAI_API_KEY(或使用本地 .dev.vars)后运行 npm run test:menu:live。此可选评估会调用 OpenAI 并检查建议的工具调用,但绝不会执行工具或拨打电话。
设置
- Telnyx:创建 Call Control 应用(其 ID 为
TELNYX_CONNECTION_ID),设置 Webhook URLhttps://<host>/webhooks/telnyx、API 密钥和账户的 Webhook 公钥。 每个账户的号码会在首次通话时购买,并关联到该应用。 - OpenAI:具有 GPT-Live 访问权限的 API 密钥。
- Stripe:为以下事件设置 Webhook 端点
https://<host>/webhooks/stripe:checkout.session.completed、checkout.session.async_payment_succeeded、invoice.paid、customer.subscription.updated、customer.subscription.deleted、charge.refunded。博客的支持者订阅也会发送到同一端点,并标记为app=callbay, kind=supporter(参见src/server/services/supporters.ts)。
额度
所有费用均预付。充值金额从 $10 起,默认情况下每月按相同金额自动充值(Stripe 订阅;invoice.paid 会增加额度)。拨号前,系统会通过一次条件插入预留通话的最高费用,确保并行通话不会超额消费;通话结束后,再按实际通话时长结算。
4. 密钥(wrangler secret put):参见 src/server/env.d.ts。
两个 Worker
通话会话在独立的 Worker call4me-voice(wrangler.voice.jsonc、src/server/voice/worker.ts)中运行,该 Worker 还会在 voice.call4.me 接收 Telnyx 的媒体流。部署 Worker 会重置其定义的 Durable Objects,因此将会话拆分出去后,网站可以自由部署而不会中断通话。CI 通过 scripts/deploy-voice.sh 部署语音 Worker:如果构建包没有变化,就跳过部署;否则会等待当前没有通话后再部署,并暂停接入新通话,直到新版本开始提供服务,同时再等待一分钟,让 Cloudflare 停用旧版本。切勿通过其他方式部署它或更改其密钥:这样都会重启所有正在进行的通话。语音 Worker 的密钥为 OPENAI_API_KEY、TELNYX_API_KEY、TELNYX_CONNECTION_ID、RAINDROP_WRITE_KEY 和 STREAM_SECRET(与网站的值相同):npx wrangler secret put <NAME> -c wrangler.voice.jsonc。
爬虫
/robots.txt 允许所有爬虫访问所有路径,包括 AI 搜索、问答和训练爬虫。
通配符涵盖当前和未来的爬虫,无需维护具名允许列表。
Cloudflare 的预期爬虫设置保存在 cloudflare.crawlers.json 中。运行 npm run crawlers
可进行审计,运行 npm run crawlers -- --apply 可应用并验证设置。该命令需要
CLOUDFLARE_API_TOKEN,并且该令牌对 call4.me 具有 Zone Read、Zone Settings Read and Write 以及 Bot Management Read
and Write 权限。任何不可用或不匹配的设置都会导致命令失败。另请单独
审计 AI Crawl Control 和防火墙规则,检查是否拦截爬虫。Cloudflare 的自动 DDoS
防护仍保持启用。
如果账户令牌可以管理令牌,但缺少此区域所需的权限,请使用
npm run crawlers -- --apply --authorize 为 call4.me 添加必要权限。
该命令会从 Cloudflare 获取权限 ID,并保留现有权限和限制。
令牌编辑器将 Write 权限称为 Edit。某些机器人产品可能不支持账户令牌;如果 Cloudflare 拒绝了权限范围正确的账户令牌,请使用 My Profile 中的用户令牌。
要管理其他网站已提交的策略,请传入 --policy /path/to/cloudflare.crawlers.json。
公共页面交付
npm run build:site 会将现有 Hono 视图渲染为公共 HTML 和 Markdown,输出到
dist/site,复制公共资源,并为 CSS 和 JavaScript 生成指纹。Wrangler 会在本地开发、试运行和部署前自动运行此构建。CI 也会
在检查生成的路由清单和运行测试前进行构建。生成公共页面时不会使用数据库或凭据。付费文章不会纳入静态清单。
src/server/static-entry.ts 通过 Cloudflare 的缓存资源绑定提供这些文档,不会初始化应用或读取 D1。CSS、图片和脚本
会直接通过静态资源交付。原生页面过渡会渐进增强普通导航,并遵循减少动态效果的偏好设置。音频会保留用于定位播放的字节范围处理程序。
所有访客看到的公共内容都相同。账户导航、计数和转义后的博客评论会在页面绘制后,从私有、未缓存的实时端点加载。搜索、热门排序、
订阅反馈、经过身份验证的 MCP 设置、账户、付款、OAuth 和
所有写入操作仍使用现有服务器。禁用 JavaScript 或无法加载实时评论时,?live=1 会打开动态页面。首次触达 Cookie 仍按访客区分;付费 Reddit 落地页会在发放访问 Cookie 前记录其归因。
博客
/blog 下的内容是 src/content/blog 中的 Markdown 文件(每篇文章一个文件,在 index.ts 中列出,标题图片位于
public/static/blog/<slug>.svg),并提供 Atom 订阅源、点赞、评论、电子邮件简报(从
/admin/blog 发送给 ADMIN_EMAILS 账户)以及面向月度支持者的付费文章。
相关文章使用本地 CPU 嵌入向量,并根据编辑主题进行排序,相关逻辑位于
scripts/related-topics.ts。添加文章或修改文章的 SEO 标题、标签或主题后,
运行 npm run blog:related,检查 src/content/blog/related.generated.ts 中的匹配结果,并
提交索引。首次运行会下载固定版本的 EmbeddingGemma 模型;之后的运行会使用
~/.cache/call4me/transformers。文章文本会保留在本地。网站提供生成的索引,不会执行模型推理。如果匹配结果
低于相似度阈值,文章的推荐数量可能少于 3 篇。npm test 会检查索引是否为最新状态,但不会下载模型。
自托管
Fork 此项目,创建自己的 D1 数据库(wrangler d1 create callbay),然后将其 ID 和你自己的主机名填入 wrangler.jsonc。
本地运行:使用包含相同密钥的 .dev.vars,然后执行 npm run db:migrate:local && npm run dev。
AI 监控
Raindrop 会监控实时对话(callbay_voice_call)、后台模型运行(callbay_back_office)以及挂断后的通话摘要(callbay_call_recap)。每个事件都使用账户 ID 作为用户 ID,使用通话 ID 作为对话 ID。事件中包含模型名称、耗时、状态和后台工具调用跨度。不会上传电话音频或录音 URL。
在本地将 RAINDROP_WRITE_KEY 添加到 .dev.vars,并通过 npx wrangler secret put RAINDROP_WRITE_KEY 将相同的密钥配置为 Cloudflare Worker 密钥。可选的 RAINDROP_PROJECT_ID 用于选择项目 slug;未设置时会使用写入密钥对应的默认项目。未提供写入密钥时,监控会被禁用。.dev.vars.example 列出了这些可选设置。
AI 输入和输出会使用 Raindrop 的 PII 脱敏功能,并先应用 call4me 现有的逐通话密钥屏蔽。工具参数和结果会显示在经过脱敏的后台 AI 输出中。工具调用跨度包含名称、耗时和通用失败状态,敏感负载不会进入未脱敏的跟踪属性。不会将账户名称和电子邮件地址作为用户特征发送。SDK 的 PII 脱敏基于模式,无法保证移除所有敏感信息。
监控独立于实时音频和工具运行。终止事件和排队的工具调用跨度会在 Worker 或 Durable Object 的生命周期内刷新。挂断时尚未完成的后台运行会标记为已中断;之后的工具结果不会重新打开已关闭的监控客户端。
通话结束后,在 Raindrop 中检查这三个事件名称,确认其中包含实际输入和输出、匹配的账户 ID 和通话 ID,以及工具名称和耗时。如果通话期间未调用后台模型,则不会有后台事件。当前通话流程没有对应的反馈控件或诊断工具,因此不会对反馈信号、音频附件和 Agent 自诊断进行埋点。
如需调查问题,请连接 Raindrop MCP 服务,并使用 npx skills add raindrop-ai/skills --skill raindrop-investigate 安装调查技能。在 Raindrop 中连接 Slack 以接收提醒。如有需要,请创建一个 Raindrop 账户。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。