MCP 服务

call4me|让 AI 代理代打电话的 MCP 服务

call4me

面向 MCP 客户端的远程电话代打服务,可让代理预订、取消、询问商家并等待人工接听后回报结果与转写。

获取与使用

可连接

按官方资料配置客户端连接服务

使用难度待核验
国内可用性待核验

2026-11-09 更新 · 本站尚未实测

项目介绍

MCP 服务 · 2026-11-09 更新 · 本站尚未实测

call4me 是一个远程 MCP 服务器,目标是把“打电话”这件事交给 AI 代理完成。按 README 描述,用户可以让 Claude、ChatGPT、Cursor、Codex 或自建应用去预订餐位、取消订阅、向商家提问(各客户端对敏感事务的限制见下文);代理会拨号、等待排队、走电话菜单、与接听者对话,并把结果和通话转写回报。它也可以在通话中把用户本人呼入一起参与。

需要区分的是:托管服务(https://call4.me/mcp)与仓库代码是两件事。仓库同时包含可自托管的实现,README 后半部分讲述的是“改 call4me 本身或自建一份”的开发说明,而不是普通用户的接入步骤。

核心能力

点击能力名称查看输入、输出和原文依据。

  • 通过 MCP 工具发起真实 PSTN 电话,支持等待排队与电话菜单导航。
  • 通话结束后返回结果与转写;README 提到可通过 MCP 工具 call4me_get_recordings 获取已存在的通话录音,或通过 HTTP 接口 GET /api/calls/{call_id}/recordings 获取,并校验账户归属。
  • 支持把用户本人号码呼入通话(own number 作为 from),README 说明该方式可呼叫任意国家,但运营商可能拒绝部分国际路由。
  • 提供 Vercel AI SDK 包,让自建代理获得同样的工具能力。
  • MCP Registry 收录名为 io.github.skeptrunedev/call4me,版本字段为 1.1.2。

实际应用场景

适用场景

README 举例包括:餐厅订位、航班改签、向商家咨询问题。ChatGPT 插件形式明确不支持医疗或牙科预约、健康保险、政府证件号码与账户密码类任务。若用户需要处理此类敏感事务,应以官方最新说明为准,本稿无法确认其他客户端是否也受限。

安装与接入

托管服务地址为 https://call4.me/mcp(streamable HTTP)。原文给出的接入方式包括:

  • Claude Code:claude mcp add --scope user --transport http call4me https://call4.me/mcp,随后执行 /mcp、call4me、authenticate。
  • Codex:codex mcp add call4me --url https://call4.me/mcp,随后 codex mcp login call4me。
  • Claude Desktop / claude.ai:在设置 → connectors → 添加自定义连接器,填入上述地址。
  • Cursor:在 ~/.cursor/mcp.json 中加入 README 示例的 mcpServers 配置,并在 Cursor 提示时登录。
  • ChatGPT:README 说明需自行打开插件链接安装并登录 call4me,且不能在对话中安装。
  • 自建代码:README 给出 npm install call4me-ai-sdk ai zod @ai-sdk/openai,并在设置 CALL4ME_API_KEY 后调用 call4meTools()。

登录方式为浏览器内通过 Google 或 X 完成;若无法登录,可在账户页创建 key,使用 https://call4.me/mcp/<key> 或 Authorization: Bearer <key> 头。自托管则需自建 D1 数据库、填入域名与密钥,README 列出 Telnyx、OpenAI、Stripe、Raindrop 等依赖,属于开发者路径。

Transport

streamable-http

Auth

浏览器登录(Google 或 X);可由账户页创建 key,使用 https://call4.me/mcp/<key> 或 Authorization: Bearer <key>

使用条件与限制

是否需要部署
服务入口见官方资料,客户端与认证要求见正文
是否需要注册
账号和认证要求见正文;未明确说明的项目仍待核验
是否需要 API Key
待核验
费用与额度
费用边界见正文,项目许可不代表模型或托管服务免费
所需权限
待核验
许可证与服务条款
待核验

权限费用与限制

费用方面,README 明确“通话从预付额度扣费,起充 10 美元”,并说明默认情况下同一金额按月自动充值(Stripe 订阅)。通话拨号前会预占最高费用,结束后按真实通话时长结算。费用细节、税费、退款与不同地区定价应以官方账户页与条款为准,本稿未核实价格是否变动。

权限方面,接入需要向 call4me 登录授权;自托管需要 Telnyx、OpenAI(GPT-Live 访问权限)、Stripe 与 Raindrop 的密钥。README 说明该应用拨号时“不请求录音”,但可查询 Telnyx 已存储的通话录音。AI 监控会上报模型名称、耗时、状态与工具跨度等信息,不上传通话音频或录音链接,并说明 PII 脱敏是模式匹配、不能保证清除全部敏感信息。

地区方面,README 只说明自有号码呼出可覆盖任意国家但运营商可能拒绝部分国际路由;是否支持中国大陆号码、国内网络可用性与合规性均待核验。

国内使用情况

网友核验 用户经验分享

与站长实测独立,不代表官方认证或本站已实测。

我要核验
0 位参与者0 份有效分项记录

最近核验:暂无有效核验。参与人数按当前项目有效身份去重;不同核验项分别统计,不合并成用户总结果。仅统计审核通过且未过期的记录。

分项统计、有效期与样本量
核验项目有效人数成功 / 部分 / 失败 / 无法判断成功率最近核验 / 有效期
官方网站访问00 / 0 / 0 / 0样本不足暂无 / 7 天
GitHub 仓库访问00 / 0 / 0 / 0样本不足暂无 / 7 天
安装与运行00 / 0 / 0 / 0样本不足暂无 / 30 天
官方服务国内连接 / MCP 连接00 / 0 / 0 / 0样本不足暂无 / 30 天
国内网络情况00 / 0 / 0 / 0样本不足暂无 / 7 天
国内模型兼容性00 / 0 / 0 / 0样本不足暂无 / 30 天
自定义 API00 / 0 / 0 / 0样本不足暂无 / 30 天
海外服务依赖
00 / 0 / 0 / 0样本不足暂无 / 30 天
海外账号要求
00 / 0 / 0 / 0样本不足暂无 / 30 天
中文界面
00 / 0 / 0 / 0样本不足暂无 / 30 天
客户端兼容性00 / 0 / 0 / 0样本不足暂无 / 30 天
账号及费用信息
00 / 0 / 0 / 0样本不足暂无 / 30 天

成功率 = 成功 ÷(成功 + 部分成功 + 失败);无法判断不计入分母。至少 5 份可判断结果才显示成功率。账号、费用、海外依赖与语言等事实项,成功表示核查结论与资料吻合,具体观察另行统计;不表示免费或没有海外依赖。不同网络、客户端和版本的结果不能直接等同。

最近有效核验

暂无审核通过且未过期的网友核验。欢迎提交真实使用记录。

查看全部有效核验 →

国内实测状态:国内可用性待核验。协议兼容和官方资料说明不等于国内网络可用。

官方网站访问
尚未实测 待核验
GitHub 仓库访问
尚未实测 待核验
官方服务国内连接
尚未实测 待核验
国内网络情况
尚未实测 待核验
国内模型兼容性
尚未实测 待核验
自定义 API
尚未实测 待核验
海外服务依赖
尚未实测 待核验
海外账号要求
尚未实测 待核验
中文界面
尚未实测 待核验
国内最后核验时间
尚未实测

许可与国内使用

仓库代码采用 MIT 许可证(LICENSE 文件为该声明)。但公开仓库不等于服务免费:托管服务按预付额度收费,Telnyx、OpenAI、Stripe 等第三方服务各自计费并受其条款约束。README 未说明服务部署地域、数据存储位置与跨境合规安排,国内用户使用前需核验网络连通性、号码可达性与个人信息处理合规性。README 未提供下载式工作流文件,本稿也不承诺任何离线使用方式。

项目资料与来源

官方网站 ↗

GitHub 仓库 ↗

官方文档 ↗

字段依据与待核验事项

access:来源确认 · claude mcp add --scope user --transport http call4me https://call4.me/mcp

project_type:来源确认 · call4me is a remote MCP server for making phone calls. Point any MCP client at `https://call4.me/mcp` (streamable HTTP) and your agent can phone a business for you.

原始 README(折叠技术参考)
# call4me: MCP server for making phone calls

call4me is a remote MCP server for making phone calls. Point any MCP client at `https://call4.me/mcp`
(streamable HTTP) and your agent can phone a business for you. One-line install for Claude Code:

```
claude mcp add --scope user --transport http call4me https://call4.me/mcp
```

[![AllMCPs Verified](https://allmcps.com/api/badge/call4me)](https://allmcps.com/mcp/call4me?verify=e7873d62-b4c4-4ca2-a61e-e8df3f1b7446)

https://call4.me

call4me lets your AI agent make real phone calls for you. Ask Claude, ChatGPT, Cursor, Codex or your
own app to book a table, schedule a dentist appointment, cancel a subscription or ask a business a question,
and it calls, waits on hold, gets through the phone menu, talks to the person who answers and reports back with the outcome
and a transcript. It can also ring you to join the call. Calls are paid from prepaid credits, starting at $10.

## Use it

In **ChatGPT**, [install the call4me plugin](https://chatgpt.com/plugins/plugin_asdk_app_6abdec89d46c81919cda058ca9f62cb8)
and sign in to call4me. ChatGPT cannot install the plugin from a conversation; open the link yourself.
The plugin supports tasks such as restaurant bookings, flight changes and business questions. It does
not handle medical or dental appointments, health insurance, government ID numbers or account passwords.

For **Claude, Codex and other MCP clients**, the hosted server is `https://call4.me/mcp` (streamable HTTP).
Your agent signs you in through the browser with Google or X. Paste the prompt from
[call4.me/mcp](https://call4.me/mcp) into your agent, or add it by hand:

```
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:  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: add it to `~/.cursor/mcp.json` and sign in when Cursor asks.

```json
{
  "mcpServers": {
    "call4me": { "url": "https://call4.me/mcp" }
  }
}
```

In your own code, the [Vercel AI SDK package](packages/ai-sdk) gives an agent the same tools:

```bash
npm install call4me-ai-sdk ai zod @ai-sdk/openai
```

```ts
import { call4meTools } from 'call4me-ai-sdk';
// with CALL4ME_API_KEY set (from https://call4.me/account):
// generateText({ model, prompt: 'Call ... and ask ...', tools: call4meTools() })
```

- [Examples](https://call4.me/examples): real calls and the prompts that placed them.
- [Blog](https://call4.me/blog): guides for [Claude Code](https://call4.me/blog/claude-code-phone-calls),
  the [AI SDK](https://call4.me/blog/vercel-ai-sdk-phone-calls) and more.
- [MCP Registry](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.skeptrunedev/call4me): `io.github.skeptrunedev/call4me`.

The rest of this README is for working on call4me itself or hosting your own copy.

## How a call works

```
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`: what the caller is told. The product lives here: no opening disclosure,
  no recording notice, no end-of-call read-back; honest if sincerely asked whether it's an AI.
- `src/server/voice/session.ts`: the audio relay and back-office functions.
- `src/server/services/dialer.ts`: placing calls, per-account numbers, answering callbacks.
- `src/server/services/numbers.ts`: the account's call4me numbers, and the user's own numbers
  verified to call from. Telnyx keeps one verified-number list for our whole carrier account, so
  `verified_numbers` ties each to the one call4me account that submitted a fresh code for it; a
  number Telnyx already lists as verified is never handed to another account. A call from an own
  number (`from`) can call any country (the carrier may refuse it on some international routes), and still rings the user from a call4me number.
- `src/server/mcp/server.ts`: the MCP tools.

The app does not request recording when dialing or answering. Existing recordings stored by Telnyx
can be played or opened from the signed in call page after a call ends, or retrieved using `call4me_get_recordings({ call_id })` over MCP, or
`GET /api/calls/{call_id}/recordings` with a call4me API key or OAuth token in the Bearer header.
Both check account ownership before contacting Telnyx and return fresh download links without
storing them. Empty results can mean processing is pending or no recording was saved. Links may
expire and should only be shared with the account owner.

Trunk recordings use call leg IDs. A separate provider ID table receives these from verified
webhooks; existing calls resolve them from an exact control ID match in Telnyx webhook history.
The app never guesses a match from phone numbers or timestamps. If provider history has expired
and no mapping was saved, only recordings directly associated with the control ID can be found.

The recording lookup never contacts the voice session or changes prompts, live tools, audio,
or Telnyx recording settings. Existing call status and transcript responses are unchanged.

The recording API's OpenAPI document is served at `/api/openapi.json`. Run
`npm run openapi:generate` to regenerate `openapi.json` from the shared MCP and HTTP schemas.
CI checks the generated artifact for drift. Run `npm test`, `npm run check`, `npm run lint`,
and `npx wrangler deploy --dry-run` before deploying through git.

Menu recovery tracks fresh phone prompts separately from transcript timestamps and remembers
accepted keypad submissions. Repeated menus, invalid input, and recorded instruction dead ends
can restart the existing back office after the recording goes quiet. It waits for pending tools
and their continuations, avoids interrupting holds or a person answering, and asks the model to
choose a supported route from the heard options rather than blindly replaying digits.

`npm test` includes provider message replay tests for recovery and its timing races. To evaluate
the configured back office model against synthetic menu scenarios, run `npm run test:menu:live`
with `OPENAI_API_KEY` (or a local `.dev.vars`). This opt-in evaluation calls OpenAI, inspects
the proposed tool calls, and never executes a tool or places a phone call.

## Setup

1. Telnyx: a Call Control application (its id is `TELNYX_CONNECTION_ID`) with webhook URL
   `https://<host>/webhooks/telnyx`, an API key, and the account's webhook public key.
   Each account's number is bought on its first call and attached to that application.
2. OpenAI: an API key with GPT-Live access.
3. Stripe: webhook endpoint `https://<host>/webhooks/stripe` for `checkout.session.completed`,
   `checkout.session.async_payment_succeeded`, `invoice.paid`, `customer.subscription.updated`,
   `customer.subscription.deleted`, `charge.refunded`. The blog's supporter subscriptions arrive on
   the same endpoint, tagged `app=callbay, kind=supporter` (see `src/server/services/supporters.ts`).

## Credits

Everything is prepaid. Loads start at $10 and, by default, the same amount reloads monthly (a Stripe
subscription; `invoice.paid` adds the credits). A call holds its maximum cost before it dials, in one
conditional insert so parallel calls can't overspend, and settles to the real talk time when it ends.
4. Secrets (`wrangler secret put`): see `src/server/env.d.ts`.

## Two Workers

Call sessions run in their own Worker, `call4me-voice` (`wrangler.voice.jsonc`, `src/server/voice/worker.ts`),
which also takes Telnyx's media streams on `voice.call4.me`. Deploying a Worker resets the durable objects it
defines, so with the sessions split out the site deploys freely without dropping a call. CI deploys the voice
Worker with `scripts/deploy-voice.sh`, which skips an unchanged bundle and otherwise waits until no call is up,
deploys, and holds new calls until the new version is serving plus a minute for Cloudflare to retire the old
one. Never deploy it or change its secrets any other way: either restarts every live call. The voice Worker's secrets are
`OPENAI_API_KEY`, `TELNYX_API_KEY`, `TELNYX_CONNECTION_ID`, `RAINDROP_WRITE_KEY` and `STREAM_SECRET` (the same
value as the site's): `npx wrangler secret put <NAME> -c wrangler.voice.jsonc`.

## Crawlers

`/robots.txt` allows every crawler on every path, including AI search, answers, and training.
The wildcard covers current and future crawlers without maintaining a named allowlist.
Cloudflare's desired crawler settings live in `cloudflare.crawlers.json`. Run `npm run crawlers`
to audit them, or `npm run crawlers -- --apply` to apply and verify them. The command requires
`CLOUDFLARE_API_TOKEN` with Zone Read, Zone Settings Read and Write, and Bot Management Read
and Write for `call4.me`. Any unavailable or mismatched setting fails the command. Separately
audit AI Crawl Control and firewall rules for crawler blocks. Cloudflare's automatic DDoS
protection remains active.

If an account token can manage tokens but lacks the permissions on this zone, use
`npm run crawlers -- --apply --authorize` to add the necessary permissions for `call4.me`.
It discovers permission IDs from Cloudflare and preserves existing permissions and restrictions.
The token editor calls Write permissions Edit. Account tokens may be unsupported by some bot
products; use a user token from My Profile if Cloudflare rejects a correctly scoped account token.
To manage another site's committed policy, pass `--policy /path/to/cloudflare.crawlers.json`.

## Public page delivery

`npm run build:site` renders public HTML and Markdown from the existing Hono views into
`dist/site`, copies the public assets, and fingerprints CSS and JavaScript. Wrangler runs
this build automatically before local development, dry runs, and deployments. CI also
builds before checking the generated route manifest and tests. No database or credentials
are used to generate public pages. Paid articles are excluded from the static manifest.

`src/server/static-entry.ts` serves these documents through Cloudflare's cached asset
binding without initializing the application or reading D1. CSS, images, and scripts go
straight to static asset delivery. Native page transitions progressively enhance ordinary
navigation and honor reduced motion. Audio keeps the byte range handler needed for seeking.

Public content is identical for every viewer. Account navigation, counts, and escaped blog
comments load after the page paints from private, uncached live endpoints. Search, top
sorting, subscription feedback, authenticated MCP setup, accounts, payments, OAuth, and
all writes still use the existing server. `?live=1` opens the dynamic page when JavaScript
is disabled or live comments cannot load. First touch cookies remain per visitor; a paid
Reddit landing records its attribution before issuing the visit cookie.

## Blog

`/blog` is markdown files in `src/content/blog` (one per post, listed in `index.ts`, headline image at
`public/static/blog/<slug>.svg`), with an Atom feed, likes, comments, an email newsletter (sent from
`/admin/blog`, for the `ADMIN_EMAILS` accounts), and paid posts for monthly supporters.

Related articles use local CPU embeddings, ranked within editorial subjects from
`scripts/related-topics.ts`. After adding an article or changing its SEO title, tags or subject,
run `npm run blog:related`, review the matches in `src/content/blog/related.generated.ts`, and
commit the index. The first run downloads the pinned EmbeddingGemma model; later runs use
`~/.cache/call4me/transformers`. Article text stays local. The site serves the generated index
without model inference. Articles can have fewer than three recommendations when matches
fall below the similarity threshold. `npm test` checks freshness without downloading a model.

## Self-hosting

Fork it, create your own D1 database (`wrangler d1 create callbay`) and put its id and your own hostname in `wrangler.jsonc`.

Local: `npm run db:migrate:local && npm run dev` with a `.dev.vars` holding the same secrets.

## AI monitoring

Raindrop monitors the live conversation (`callbay_voice_call`), back office model runs
(`callbay_back_office`), and the recap after hangup (`callbay_call_recap`). Each event uses
the account ID as its user ID and the call ID as its conversation ID. Model names, timing,
status, and back office tool spans are included. No phone audio or recording URLs are uploaded.

Add `RAINDROP_WRITE_KEY` to `.dev.vars` locally and configure the same key as a Cloudflare
Worker secret with `npx wrangler secret put RAINDROP_WRITE_KEY`. Optional
`RAINDROP_PROJECT_ID` selects a project slug; unset uses the write key's default project.
Without a write key, monitoring is disabled. `.dev.vars.example` lists these optional settings.

AI inputs and outputs use Raindrop's PII redaction, with call4me's existing masking for
per call secrets applied first. Tool arguments and results appear in redacted back office
AI output. Tool spans contain names, timing, and generic failure status, keeping sensitive
payloads out of unredacted trace attributes. Account names and emails are not sent as user traits.
SDK PII redaction is pattern based and does not guarantee removal of every sensitive detail.

Monitoring runs separately from live audio and tools. Terminal events and queued tool spans
are flushed within the Worker or Durable Object lifetime. An unfinished back office run at
hangup is marked interrupted; later tool results do not reopen the closed monitoring client.

After a call, check the three event names in [Raindrop](https://app.raindrop.ai), with actual
inputs and outputs, the matching account and call IDs, and tool names and durations. A call
that never invokes a back office model has no back office event. Feedback signals, audio
attachments, and agent self diagnostics are not instrumented because the current call flow
has no corresponding feedback controls or diagnostics tools.

For investigation, connect the [Raindrop MCP server](https://mcp.raindrop.ai/mcp) and install
the investigation skill with `npx skills add raindrop-ai/skills --skill raindrop-investigate`.
Connect Slack in Raindrop for alerts. Create a [Raindrop account](https://app.raindrop.ai) if needed.

## License

MIT
历史前置条件说明(补充参考)

需 MCP 客户端(Claude Code、Codex、Cursor、Claude Desktop/claude.ai、ChatGPT 插件或自建应用);需浏览器通过 Google 或 X 登录授权,或创建 API key;托管服务按预付额度收费,起充 10 美元且默认按月自动充值,具体价格与条款待向官方核验;自托管需 Cloudflare Workers、D1、Telnyx 账户与 API key、具备 GPT-Live 访问权限的 OpenAI API key、Stripe webhook,可选 Raindrop;境外依赖包括 Telnyx、OpenAI、Stripe、Cloudflare;国内网络与号码可达性待核验。

项目来源与清单版权许可

https://github.com/skeptrunedev/call4me

整理来源:https://github.com/slavakurilyak/awesome-ai-agents

清单版权与许可:

MIT License

Copyright (c) 2024 Slava Kurilyak

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.