ThunderPhone 2.0 is live.Self-serve, from 2¢/min.Read the announcement

Connect tools & data

Use ThunderPhone as an MCP server

Build, test, validate, and operate ThunderPhone voice agents from Claude, ChatGPT, Claude Code, Codex, Cursor, VS Code, or another Streamable HTTP MCP client.

ThunderPhone exposes a Streamable HTTP Model Context Protocol server at:

https://api.thunderphone.com/v1/mcp

This is the opposite direction from connecting a remote MCP server to a voice agent:

DirectionResult
Remote MCP server → ThunderPhone agentA voice agent can call the remote server's tools.
ThunderPhone → your MCP clientYour coding agent can build, test, and operate ThunderPhone.

Authenticate

Use OAuth by default for directory clients: sign in, choose an organization, and approve the requested permissions. Revoke access under Organization → API keys → Authorized apps.

For clients configured with an API key, create an sk_live_ key under Organization → Keys and expose it to your MCP client as THUNDERPHONE_API_KEY. The key is bound to one organization; an id owned by another organization behaves as not found.

CLI and stdio alternatives

The ThunderPhone CLI can write client configuration while preserving unrelated servers:

npx -y @thunderphone/mcp setup --client cursor --api-key-env THUNDERPHONE_API_KEY
npx thunderphone mcp setup --client claude-desktop --scope user

After a global install of @thunderphone/mcp, use thunderphone-mcp setup with the same options. Setup supports Claude Code, Codex, Cursor, VS Code, Gemini, Claude Desktop and Windsurf. Direct HTTP is preferred; Desktop uses stdio.

For any stdio-capable client, configure command: "npx" with args: ["-y", "@thunderphone/mcp"]. The wrapper uses THUNDERPHONE_API_KEY first, then credentials from thunderphone login, refreshing expired tokens, then OAuth through mcp-remote. Device login and OAuth require the corresponding API OAuth rollout. The API-key path does not. Direct HTTP configurations do not read the CLI credential store; use the stdio wrapper to reuse device login.

These are alternatives to the manual client configurations below.

Client configuration

Claude and ChatGPT sign in with OAuth; no API key is involved. If you do not have a ThunderPhone account yet, choose Create account on the sign-in page and you return to the approval screen after verifying your email.

Claude (web, desktop, and mobile)

  1. Open Customize → Connectors (Settings → Connectors in older versions). If ThunderPhone appears in the connector directory, select it. Otherwise choose Add custom connector, name it ThunderPhone, and enter https://api.thunderphone.com/v1/mcp.
  2. Select Connect, sign in to ThunderPhone, pick the organization, and approve the permissions.
  3. In a chat, enable ThunderPhone from the tools menu and ask for what you need, for example "List my agents".

Claude asks before it uses each tool for the first time. To skip most of those prompts, open Customize → Connectors → ThunderPhone and set Read-only tools to always allow. Those tools only look things up: agents, calls, transcripts, balances, docs. Leave Write/delete tools on approval if you want to see each change before it happens.

Custom connectors need a paid Claude plan. On Team and Enterprise plans an owner adds the connector under the organization's connector settings first, then each member connects their own ThunderPhone account.

ChatGPT

  1. If ThunderPhone appears in the ChatGPT app directory, select it and connect.
  2. Otherwise open Settings → Apps & Connectors → Advanced settings, turn on Developer mode, and create a connector with the URL https://api.thunderphone.com/v1/mcp and OAuth authentication.
  3. Sign in to ThunderPhone, pick the organization, and approve the permissions. Add ThunderPhone to a chat from the tools menu.

Deleting an agent or phone number, discarding a draft, launching a campaign, and sending a test request that can write to an external system ask for a second confirmation in either app; see Confirming destructive actions.

Claude Code

claude mcp add --transport http thunderphone https://api.thunderphone.com/v1/mcp \
  --header "Authorization: Bearer $THUNDERPHONE_API_KEY"

Codex

Add this to ~/.codex/config.toml:

[mcp_servers.thunderphone]
url = "https://api.thunderphone.com/v1/mcp"
bearer_token_env_var = "THUNDERPHONE_API_KEY"

Cursor

Create .cursor/mcp.json:

{
  "mcpServers": {
    "thunderphone": {
      "url": "https://api.thunderphone.com/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${env:THUNDERPHONE_API_KEY}"
      }
    }
  }
}

Claude Desktop

Add an mcp-remote bridge to the Claude Desktop configuration:

{
  "mcpServers": {
    "thunderphone": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.thunderphone.com/v1/mcp",
        "--header",
        "Authorization: Bearer ${THUNDERPHONE_API_KEY}"
      ],
      "env": {
        "THUNDERPHONE_API_KEY": "sk_live_YOUR_API_KEY"
      }
    }
  }
}

VS Code

Create .vscode/mcp.json and enter the key through VS Code's input prompt:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "thunderphone-api-key",
      "description": "ThunderPhone organization API key",
      "password": true
    }
  ],
  "servers": {
    "thunderphone": {
      "type": "http",
      "url": "https://api.thunderphone.com/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${input:thunderphone-api-key}"
      }
    }
  }
}

Tools

Every tool carries MCP annotations. In the tables, R means read-only, D destructive, I idempotent, and O open-world/network interaction. A dash means no hint is set.

Connection

ToolMain argumentsAnnotationsWhat it does
get_connection_identity—R, IValidates the credential and returns its organization and safe credential metadata.

Agents

ToolMain argumentsAnnotationsWhat it does
list_agents—R, ILists agents.
get_agentagent_idR, IGets one agent.
create_agentagent configuration—Creates an agent.
update_agentagent_id, changed fieldsDStages fields in the agent draft, replacing what the draft had. Runs without a confirmation step: the deployed agent is unchanged until deploy_agent, and discard_agent_draft reverts the draft.
deploy_agentagent_id, optional if_updated_atD, IPromotes the draft to production.
discard_agent_draftagent_id, optional if_updated_at, confirmation_token on the second requestD, IDiscards staged changes. Two-step, see Confirming destructive actions.
duplicate_agentagent_id, optional name—Copies an agent inside the organization.
delete_agentagent_id, confirmation_token on the second requestD, IPermanently deletes an agent. Two-step.
list_agent_versionsagent_idR, ILists deployed configuration versions.

Phone numbers and carriers

ToolMain argumentsAnnotationsWhat it does
list_phone_numbers—R, ILists organization numbers and routing.
get_phone_number_limits—R, IGets managed-number usage and limits.
provision_phone_numberoptional area_code, city, state, idempotency_keyD, OBuys a ThunderPhone-managed inbound number.
list_voip_connections—R, ILists connected customer carriers.
search_voip_numbersconnection_id, country, type, optional area_codeR, I, OSearches carrier inventory.
import_voip_numbersconnection_id, numbersD, OImports numbers already owned at the carrier.
update_phone_numberphone_number_id, routing/label/webhook fieldsDUpdates number routing, including agent assignment.
delete_phone_numberphone_number_id, confirm, optional release_at_provider, confirmation_token on the second requestD, I, OReleases a number. Two-step.

SMS

ToolMain argumentsAnnotationsWhat it does
send_smsfrom_number, to, body, idempotency_keyD, I, OSends one plain-text SMS through a connected Twilio or Telnyx number.

Calls

ToolMain argumentsAnnotationsWhat it does
list_callsoptional filters, limit, offsetR, ILists calls with the REST call-history filters.
get_callcall_idR, IGets call status and metadata.
get_call_transcriptcall_id, optional liveR, IGets the call transcript.
get_call_audio_urlcall_id, optional downloadR, I, OReturns a signed audio URL; it never streams audio through MCP.
get_call_gradecall_idR, IGets the latest call grade.
place_callagent_id, from_number, to_numberD, OPlaces one non-idempotent outbound call.
export_callscall filters, export_formatR, IExports up to the REST endpoint's cap as JSON or CSV.

Testing and validation

ToolMain argumentsAnnotationsWhat it does
list_test_scenariosagent_idR, ILists test scenarios.
create_test_scenarioagent_id, title, scenario_prompt, optional conditions—Creates a scenario.
generate_test_scenariosagent_id, optional count, include_edge_cases, localeOGenerates scenarios from the agent prompt.
run_agent_testsagent_id, channel, consent_to_charge, optional selection/matrixD, OExecutes scenarios through web or telephony.
get_test_runagent_id, batch_idR, IGets batch status and per-scenario results.
list_validation_runsagent_idR, ILists recent draft validation runs.
get_validation_statusagent_idR, IGets the latest validation state and draft match.

Knowledge

ToolMain argumentsAnnotationsWhat it does
list_knowledge_bases—R, ILists knowledge bases.
create_knowledge_basename, optional description—Creates a knowledge base.
add_knowledge_documentknowledge_base_id, name, content—Adds text or Markdown.
import_knowledge_urlurl, optional nameOQueues a public page for safe ingestion.
search_knowledgeknowledge_base_id, queryR, ISearches through production retrieval.

Integrations, webhooks, and remote MCP servers

ToolMain argumentsAnnotationsWhat it does
list_integrations—R, ILists HTTP function integrations.
create_integrationdisplay_name, function spec, optional endpoint fields—Creates an HTTP tool. Add authentication headers in the dashboard.
test_integrationurl, optional method/body/timeout, integration_id with header_names, confirmation_token on the second requestD, OSends a bounded, SSRF-protected test request. Saved header values are filled in from the integration and only sent to its own host. POST (the default), PUT, PATCH and DELETE are two-step; GET runs immediately.
list_webhook_endpoints—R, ILists signed webhook endpoints.
list_webhook_deliveriesoptional agent_id, optional endpoint_idR, ILists recent payload-free webhook delivery outcomes.
create_webhook_endpointlabel, url, optional events/statusOCreates a signed webhook endpoint.
test_webhook_endpointendpoint_idOSends a synthetic event through normal delivery.
list_mcp_servers—R, ILists remote servers callable by voice agents.
create_mcp_serverdisplay_name, urlORegisters and syncs a remote server. Servers that need authentication headers are added in the dashboard.
sync_mcp_server_toolsserver_idD, ORefreshes a remote server's tool catalog.

Campaigns

ToolMain argumentsAnnotationsWhat it does
list_campaigns—R, ILists outbound campaigns.
create_campaigncampaign fields—Creates a draft campaign.
add_campaign_contactscampaign_id, contacts—Adds up to 5,000 JSON contacts.
campaign_actioncampaign_id, action, optional consent_to_charge, confirmation_token on the second requestD, ORuns start, pause, resume, or stop. start and resume are two-step; pause and stop run immediately.
get_campaign_statscampaign_idR, IGets counters and recent outcomes.

Voices, billing, and docs

ToolMain argumentsAnnotationsWhat it does
list_voices—R, ILists voices and supported languages.
preview_voicevoice, language, textOGenerates a sample and returns a signed URL.
list_voice_clones—R, ILists custom voice clones.
get_billing_summary—R, IGets balance and authoritative tier prices; no payment mutations are exposed.
search_docsquery, optional limitR, I, OSearches the public docs index.
get_doc_pagepathR, I, OFetches one public Markdown docs page.

All product tools use the same REST code paths as the public API. REST validation, organization scoping, roles, billing admission, quotas, TCPA confirmation, provider safety, and audit behavior therefore apply unchanged.

Confirming destructive actions

Tools marked D change or remove something, or begin dialing real people. Those that cannot be undone take two requests. The first request changes nothing and returns:

{
  "status": "confirmation_required",
  "action": "Delete agent",
  "target": { "id": 195, "name": "Front Desk Receptionist" },
  "confirmation_token": "…",
  "expires_in_seconds": 600,
  "next_step": "…"
}

The assistant shows the user what is affected and asks for a yes. It then repeats the request with the same arguments plus confirmation_token. A token is valid for 10 minutes and covers one organization, one tool and one exact set of arguments, so deleting three agents takes three confirmations. campaign_action with pause or stop skips this step so a running campaign can always be halted at once, and so does test_integration with GET. Some D tools run in one request because the D marks their effect, not a server-side confirmation: update_agent replaces what the draft had (discard_agent_draft reverts it), deploy_agent replaces the live configuration, update_phone_number reroutes live calls, sync_mcp_server_tools replaces a remote server's tool catalog, import_voip_numbers re-points numbers at your carrier, run_agent_tests can spend credit, send_sms and place_call reach a real person (place_call keeps its own consent confirmation), and provision_phone_number buys a number. Your MCP client may still ask you to approve them.

Starter prompts

prompts/list advertises five reusable workflows:

  • create_inbound_receptionist
  • run_agent_tests
  • buy_and_attach_number
  • review_low_grade_calls
  • add_url_to_agent_knowledge

Use prompts/get with the listed prompt name and its declared arguments to receive a ready-to-run user message.

Resources

resources/list exposes public, cached references:

URIContent
thunderphone://docs/llms.txtPublic documentation index.
thunderphone://docs/quickstartQuickstart Markdown.
thunderphone://pricingCurrent public pricing Markdown.

Read one with resources/read. Public fetches use a short timeout, a 2 MiB limit, and a ten-minute in-process cache.

Protocol and errors

The server supports protocol versions 2025-06-18 and 2025-03-26; it echoes a supported client version and otherwise selects 2025-06-18. It implements initialize, ping, tools, prompts, resources, and notifications. Notifications return 202 Accepted. This stateless server does not expose an SSE listener or session deletion, so GET and DELETE return 405 Method Not Allowed with Allow: POST.

Tool failures remain successful JSON-RPC responses with isError: true. Their text contains a short sentence followed by a JSON block:

{
  "code": "insufficient_balance",
  "detail": "There is not enough prepaid balance.",
  "next_step": "Call get_billing_summary, add funds in Organization > Billing, then retry."
}

The distinct outbound_tcpa_confirmation_required: prefix is retained for place_call. Unknown JSON-RPC methods return -32601 in an HTTP 200 response. JSON-RPC batches are not supported by MCP 2025-06-18 and return a clean -32600 invalid-request error.