call4me について
call4me は、AI エージェントが店舗に電話し、音声メニューや保留に対応できるリモート MCP サーバーです。予約やサブスクリプションの解約などを自動化し、通話結果と文字起こしをエージェントに返します。
主な機能
- 01エージェントに代わって店舗へ発信
- 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
(ストリーミング可能な HTTP)に接続すると、エージェントが代わりにお店へ電話をかけられます。Claude Code なら、次のコマンドで簡単にインストールできます。
claude mcp add --scope user --transport http call4me https://call4.me/mcp
call4me を使うと、AI エージェントが代わりに実際の電話をかけられます。Claude、ChatGPT、Cursor、Codex、または自作アプリに、レストランの予約、歯科の予約、サブスクリプションの解約、お店への問い合わせを頼むと、電話をかけ、保留中も待ち、音声メニューを操作して、応答した相手と話し、結果と文字起こしを報告します。また、通話に参加できるよう、あなたに電話をかけることもできます。通話料金は前払いクレジットから支払われ、料金は 10 ドルからです。
使い方
ホスト型 MCP サーバーは https://call4.me/mcp(ストリーミング可能な HTTP)です。エージェントがブラウザーを通じて Google または X でサインインします。最も簡単な設定方法は、call4.me/mcp にあるプロンプトをエージェントに貼り付けることです。手動で追加する場合:
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 パッケージを使うと、エージェントに同じツールを提供できます。
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 レジストリ:
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 では、キャリアアカウント全体で確認済み番号のリストを1つ管理するため、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 を使います。検証済みの webhook からこれらの ID を受け取るために、別のプロバイダー 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:
checkout.session.completed、checkout.session.async_payment_succeeded、invoice.paid、customer.subscription.updated、customer.subscription.deleted、charge.refunded用の webhook エンドポイントhttps://<host>/webhooks/stripeが必要です。ブログのサポーターサブスクリプションも同じエンドポイントに届き、app=callbay, kind=supporterというタグが付きます(src/server/services/supporters.tsを参照してください)。
クレジット
すべて前払いです。チャージは $10 から可能で、デフォルトでは毎月同額が自動で再チャージされます(Stripe サブスクリプションです。invoice.paid によりクレジットが追加されます)。通話が始まる前に、並行する通話で残高を使い切らないよう、1 回の条件付き挿入で最大料金分を確保し、通話終了時に実際の通話時間に基づいて精算します。
4. シークレット(wrangler secret put):src/server/env.d.ts を参照してください。
2 つの Worker
通話セッションは専用の Worker call4me-voice(wrangler.voice.jsonc、src/server/voice/worker.ts)で実行され、voice.call4.me で Telnyx のメディアストリームも受信します。Worker をデプロイすると、その Worker が定義する Durable Objects がリセットされます。そのため、セッションを分離しておけば、通話を切断することなくサイトを自由にデプロイできます。CI は scripts/deploy-voice.sh で音声 Worker をデプロイします。このスクリプトは、バンドルに変更がなければスキップし、変更がある場合は通話中の通話がなくなるまで待ってからデプロイします。また、新しいバージョンが配信され、Cloudflare が古いバージョンを終了するまでの 1 分間は、新しい通話を保留します。これ以外の方法でデプロイしたり、シークレットを変更したりしないでください。実行中の通話がすべて再起動されます。音声 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 を実行すると適用して検証できます。このコマンドには、call4.me に対する Zone Read、Zone Settings Read and Write、Bot Management Read and Write の権限を持つ CLOUDFLARE_API_TOKEN が必要です。設定が利用できない場合、または一致しない場合、コマンドは失敗します。これとは別に、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 は、アプリケーションを初期化したり D1 を読み取ったりせず、Cloudflare のキャッシュ済みアセットバインディングを通じてこれらのドキュメントを配信します。CSS、画像、スクリプトは静的アセットとして直接配信されます。ネイティブのページ遷移は通常のナビゲーションを段階的に拡張し、動きを減らす設定にも従います。音声には、シークに必要なバイト範囲ハンドラーが維持されます。
公開コンテンツは、すべての閲覧者に同じ内容が表示されます。アカウントナビゲーション、件数、エスケープ処理済みのブログコメントは、ページ描画後に、キャッシュされない非公開のライブエンドポイントから読み込まれます。検索、トップ順の並べ替え、サブスクリプションのフィードバック、認証済み MCP の設定、アカウント、支払い、OAuth、およびすべての書き込み処理には、引き続き既存のサーバーを使用します。JavaScript が無効になっている場合、またはライブコメントを読み込めない場合は、?live=1 によって動的ページが開きます。初回接触時の Cookie は訪問者ごとに維持されます。有料の Reddit ランディングページでは、訪問 Cookie を発行する前に、その流入元情報が記録されます。
ブログ
/blog は src/content/blog 内の Markdown ファイル(投稿ごとに1つ。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 はモデルをダウンロードせずに最新状態を確認します。
セルフホスト
フォークし、独自の 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 はアップロードされません。
ローカルでは .dev.vars に RAINDROP_WRITE_KEY を追加し、Cloudflare
Worker のシークレットにも同じキーを npx wrangler secret put RAINDROP_WRITE_KEY で設定してください。省略可能な
RAINDROP_PROJECT_ID はプロジェクトのスラッグを指定します。未設定の場合、書き込みキーのデフォルトのプロジェクトが使用されます。
書き込みキーがない場合、モニタリングは無効になります。.dev.vars.example にこれらの省略可能な設定が記載されています。
AI の入力と出力には Raindrop の PII 編集が適用されます。先に、call4me 既存の通話ごとのシークレットのマスキングが行われます。ツールの引数と結果は、編集済みのバックオフィス AI 出力に表示されます。ツールスパンには名前、所要時間、一般的な失敗ステータスが含まれ、機密性の高いペイロードは編集前のトレース属性に含まれません。アカウント名とメールアドレスはユーザー特性として送信されません。 SDK の PII 編集はパターンベースであり、あらゆる機密情報が必ず削除されることを保証するものではありません。
モニタリングは、リアルタイム音声やツールとは別に実行されます。終了イベントとキューに入ったツールスパンは、Worker または Durable Object のライフタイム内にフラッシュされます。通話終了時にバックオフィスの実行が完了していない場合は、中断としてマークされます。その後のツール結果によって、閉じたモニタリングクライアントが再び開くことはありません。
通話後に、Raindrop で3つのイベント名を確認してください。実際の入出力、対応するアカウント ID と通話 ID、ツール名と所要時間を確認できます。バックオフィスモデルを一度も呼び出さない通話には、バックオフィスイベントはありません。現在の通話フローには対応するフィードバック操作や診断ツールがないため、フィードバックシグナル、音声添付ファイル、エージェントの自己診断は計測されません。
調査するには、Raindrop MCP サーバー に接続し、npx skills add raindrop-ai/skills --skill raindrop-investigate で調査スキルをインストールしてください。アラートを受け取るには、Raindrop で Slack に接続してください。必要に応じて Raindrop アカウント を作成してください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。