MCP · Streamable HTTP · Bearer auth

Give your AI agent a phone

The Callout MCP server lets Claude Code, OpenAI Codex and any MCP client place real outbound phone calls. Your agent passes a number and an objective; Callout's voice agent makes the call in Japanese or English and returns the outcome and full transcript.

zsh
$ claude mcp add --transport http callout https://mcp.callout.jp/mcp \
    --header "Authorization: Bearer $CALLOUT_API_KEY"

first call free · pay per connected call · ja / en voice agent

Quickstart

From zero to your agent's first phone call in about a minute.

1

Create an API key

Sign in at app.callout.jp/developer and create a key. Keys look like co_sk_…, are shown once, and can be revoked anytime. Calls are charged to the key's owner.

~/.zshrc
export CALLOUT_API_KEY="co_sk_..."
2

Add the MCP server

One command for your client. The endpoint speaks Streamable HTTP and authenticates with Authorization: Bearer.

claude
$ claude mcp add --transport http callout https://mcp.callout.jp/mcp \
    --header "Authorization: Bearer $CALLOUT_API_KEY"

$ claude mcp list
callout: https://mcp.callout.jp/mcp (HTTP) - ✓ Connected
3

Ask your agent to make a call

Plain language works. The agent picks the tools, waits for the call to finish and reads you the result.

prompt
> Call Sushi Sakura at +81 3-1234-5678 and book a table for 2 this
  Saturday at 7pm under the name Sato. Counter seats if possible.
  Wait for the call to finish and tell me what they said.

What your agent sees

Tool calls and JSON results for a typical reservation (illustrative, abridged).

mcp session
// 1. place the call (returns immediately)
callout_create_call({
  "to": "+81312345678",
  "objective": "Book a table for 2 this Saturday at 7pm under the name Sato. Ask for counter seats.",
  "language": "ja"
})
→ { "call_id": "9f2c…e41a", "status": "queued", "message": "Call queued." }

// 2. block until the call ends (1–3 min is typical)
callout_wait_for_call_completion({ "call_id": "9f2c…e41a", "timeout_seconds": 180 })
→ { "status": "completed", "terminal": true, "timed_out": false, "duration_seconds": 74 }

// 3. structured outcome
callout_get_call_result({ "call_id": "9f2c…e41a" })
→ { "outcome": "ok", "summary": "Call completed successfully (duration: 74s).",
    "next_recommended_action": "none" }

// 4. what was actually said
callout_get_transcript({ "call_id": "9f2c…e41a" })
→ { "transcript": [
    { "speaker": "callee", "text": "お電話ありがとうございます。鮨さくらでございます。" },
    { "speaker": "agent",  "text": "お忙しいところ失礼いたします。土曜日の夜7時に2名で予約をお願いしたいのですが。" },
    { "speaker": "callee", "text": "はい、カウンター席でご用意できます。お名前をお願いします。" },
    { "speaker": "agent",  "text": "佐藤です。よろしくお願いします。" }
  ] }

Tools

Five tools. Every result is JSON; errors come back as {"error": {"code", "message", "retryable"}}.

callout_create_call(to, objective, language="ja", context?)
Place an outbound call. to is E.164 (+81…), objective is the goal in plain language, language is "ja" or "en", context is optional structured data for the voice agent. Returns a call_id immediately; the call runs asynchronously.
callout_wait_for_call_completion(call_id, timeout_seconds=180)
Block until the call reaches a terminal status (completed, no-answer, busy, failed, canceled) or the timeout passes. Saves your agent from writing a polling loop.
callout_get_call_status(call_id)
Current status, timestamps, duration and whether the call is terminal.
callout_get_call_result(call_id)
Structured outcome for decision-making: outcome (ok · no_answer · busy · failed), a summary, and next_recommended_action such as retry_call.
callout_get_transcript(call_id)
The full conversation as [{speaker: "agent" | "callee", text, timestamp_ms}], so your agent can extract details (times, prices, reference numbers) itself.

Specs

Endpoint
https://mcp.callout.jp/mcp
Transport
MCP Streamable HTTP (stateless)
Auth
Authorization: Bearer co_sk_…. Keys are stored hashed and revocable from the Developer page.
Voice agent
Speaks Japanese or English, keeps replies short and phone-natural, handles interruptions.
Billing
1 credit per call that reaches a conversation. No-answer, busy and failed calls are free. Same plans as the web app.
Concurrency
Each running call holds a credit, so parallel calls are capped by your balance. Over the limit, callout_create_call returns an error instead of dialing.
Isolation
A key only sees calls placed by its owner.
Scope
Non-emergency calls only. In Japan, emergencies go to 119 / 110.

Prefer plain HTTP?

The same API key works on the REST endpoint. POST /dialout starts a call and returns its call_id.

curl
$ curl -X POST https://call-for-me-prod-3055119120.us-central1.run.app/dialout \
    -H "Authorization: Bearer $CALLOUT_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "to_number": "+81312345678",
      "language": "ja",
      "prompt": "Book a table for 2 this Saturday at 7pm under the name Sato."
    }'
{"call_sid":"CA…","status":"call_initiated","to_number":"+81312345678","call_id":"9f2c…e41a"}

FAQ

What is the Callout MCP server?

A remote MCP server that gives AI agents a phone. Your agent calls callout_create_call with a number and an objective; Callout's voice agent places the call, holds the conversation, and returns the outcome and transcript through MCP tools.

Which clients does it work with?

Claude Code, OpenAI Codex CLI, and any MCP client that supports remote Streamable HTTP servers with an Authorization header.

Does it work in the ChatGPT app?

Not yet. ChatGPT custom connectors don't support API-key (Bearer) authentication. Use Codex or another MCP client in the meantime.

How is it billed?

From the same credits as the web app: one credit per call that reaches a conversation. Unanswered, busy and failed calls are free, and your first call is free.

Can my agent run calls in parallel?

Yes, up to your credit balance. Each running call holds a credit, so an agent can't overspend by starting many calls at once.

Which languages and numbers?

The voice agent speaks Japanese ("ja") or English ("en"). Pass numbers in E.164, e.g. +81312345678. Non-emergency calls only.

Is my API key safe?

Keys are shown once and stored only as a hash. Revoke a key from the Developer page and it stops working within a minute.

Ship an agent that can pick up the phone

Create a key, add the server, and your first call is free.

Get an API key