Voxplo

Created By
allexp117 days ago
Give AI agents a phone. Voxplo places real outbound AI phone calls: the AI calls a person, conducts the conversation toward an objective, and returns a summary, transcript, and structured extracted fields. Connect the hosted server at https://mcp.voxplo.ai/mcp (Streamable HTTP + OAuth) or run locally with npx voxplo-mcp. Tools: place_call, set_appointment, get_call, list_calls. Docs: https://voxplo.ai/docs/agent-api/mcp
Overview

voxplo-mcp

Give your AI agent a phone. This MCP server lets any MCP client (Claude, Cursor, ChatGPT developer mode, and others) place real outbound AI phone calls through Voxplo: the AI calls a person, conducts the conversation toward an objective, and returns a summary, transcript, and structured extracted fields.

  • Hosted (remote) server: https://mcp.voxplo.ai/mcp (Streamable HTTP + OAuth, no install)
  • Local (stdio) server: npx voxplo-mcp (this package)
  • Docs: https://voxplo.ai/docs/agent-api/mcp
  • Tools: place_call, set_appointment, get_call, list_calls

No install. Add https://mcp.voxplo.ai/mcp as a remote MCP server in your client:

{
  "mcpServers": {
    "voxplo": { "type": "streamable-http", "url": "https://mcp.voxplo.ai/mcp" }
  }
}

In Claude: Settings, then Connectors, then "Add custom connector", paste https://mcp.voxplo.ai/mcp. Your browser opens Voxplo's consent screen; approve by pasting an Agent API key from your Developers page. The client never sees the key itself, only an OAuth token.

Option B: local server (this package)

Prerequisites: Node 18+, a Voxplo Agent API key (starts with bys_ak_, from your Developers page).

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent on your OS:

{
  "mcpServers": {
    "voxplo": {
      "command": "npx",
      "args": ["-y", "voxplo-mcp"],
      "env": { "VOXPLO_API_KEY": "bys_ak_your_key_here" }
    }
  }
}

Cursor

Add the same block to .cursor/mcp.json in your project (or the global ~/.cursor/mcp.json).

To point at a staging or self-hosted instance, add "VOXPLO_API_BASE": "https://staging.example.com" to the env block.

Tools

place_call

Places an outbound AI phone call toward an objective. Returns a callId immediately; the call runs asynchronously. Poll get_call with that callId until status is terminal.

Inputs:

FieldTypeRequiredDescription
tostringyesDestination number in E.164 (e.g. +14155550123)
objectivestringyesWhat the call should accomplish
contextstringnoBackground context for the assistant
fieldsarraynoStructured fields to extract (up to 20 items: { name, type?, description? })
webhookUrlstringnoHTTPS URL to receive the signed result when the call ends
callerIdstringnoCaller ID override; must be a number on your account

Returns: { callId, status } where status is queued on success.

set_appointment

Places an outbound AI phone call to set up a meeting. The assistant calls the person, agrees a time, and the result (poll get_call) carries an outcome (appointment_set | callback_requested | declined | no_answer | failed) and, when set, the appointment details (startISO, timezone, durationMinutes, attendee, subject). Returns a callId immediately.

Inputs:

FieldTypeRequiredDescription
tostringyesWho to call, in E.164
subjectstringyesWhat the meeting is about
durationMinutesnumbernoMeeting length in minutes (default 30)
timePreferencestringnoNatural-language window, e.g. "weekday mornings next week"
slotsarraynoSpecific start times to offer: [{ startISO }], ISO-8601 with offset
timezonestringnoIANA timezone for the appointment, e.g. Asia/Jerusalem
autoBookbooleannoAlso book the agreed time on your connected calendar
webhookUrlstringnoHTTPS URL to receive the signed result
callerIdstringnoCaller ID override; must be a number on your account

get_call

Fetches the current status and result of a call.

Inputs:

FieldTypeRequiredDescription
callIdstringyesThe callId from place_call or set_appointment

Returns: { id, status, summary, transcript, extracted, recordingUrl, to, objective, startedAt, endedAt, durationSec, error? }

list_calls

Lists recent calls placed by your account (most recent first).

Inputs:

FieldTypeRequiredDescription
limitnumbernoMax calls to return (default 20, max 100)

Returns: { calls: [ { id, to, objective, status, summary, createdAt, startedAt, endedAt, durationSec, error? } ] }

Call statuses

StatusTerminal?Meaning
queuednoCall accepted, not yet dialing
ringingnoDialing the destination
in_progressnoCall is live
completedyesCall finished normally
no_answeryesDestination did not pick up
voicemailyesReached voicemail
declinedyesCall was rejected
failedyesTechnical failure

Place your first call

  1. Configure your MCP client as above.
  2. Ask your assistant: "Place a call to +14155550123 with the objective: confirm the meeting time for tomorrow at 2pm."
  3. The assistant calls place_call and gets back a callId.
  4. Ask: "Check on call <callId> -- did it complete?"
  5. The assistant calls get_call and returns the status, summary, and any extracted fields.

Safety

Outbound destinations are screened server-side (premium-rate, satellite, and other high-risk routes are blocked), calls carry an AI disclosure when asked, and the call-placing tools are annotated openWorldHint: true so clients ask for confirmation before dialing. Details: https://voxplo.ai/security

Development

Run tests:

node --test

Smoke test (with dummy key, should print "ready on stdio" to stderr):

VOXPLO_API_KEY=bys_ak_test node src/server.js

Server Config

{
  "mcpServers": {
    "voxplo": {
      "type": "streamable-http",
      "url": "https://mcp.voxplo.ai/mcp"
    }
  }
}
Project Info
Created At
17 days ago
Updated At
4 days ago
Author Name
allexp1
Star
-
Language
-
License
-
Category

Recommend Servers

View All