Connect Claude, Cursor, or any MCP-compatible client to WTF Voice and drive your workspace end-to-end from your assistant — build agents, attach knowledge bases and phone numbers, dispatch calls, run campaigns, and read results, all with a single scoped API key.
WTF Voice exposes a Model Context Protocol (MCP) server over Streamable HTTP. An AI assistant connected to it can call the WTF Voice tools directly. Every non-builder tool is scope-gated and organization-scoped: the key's scopes decide which tools it may call, and every operation is bound to the organization that minted the key — a reference to another organization's resource resolves to a clean not found with no data leak.
Authenticate with an API key minted at
/api-keys,
sent as Authorization: Bearer <key> (an X-API-Key header
also works). The key's scopes gate which tools you can call. The endpoint and a
copy-paste client config are also shown in the MCP tab of the in-app
Developer Portal.
claude mcp add --transport http wtfvoice https://app.voice.wtflabs.ai/api/v1/mcp/ \
--header "Authorization: Bearer YOUR_API_KEY"
Then verify it connected:
claude mcp list
Add the wtfvoice entry under mcpServers in your client config, then restart the client:
{
"mcpServers": {
"wtfvoice": {
"url": "https://app.voice.wtflabs.ai/api/v1/mcp/",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Any MCP client that supports Streamable HTTP transport connects with the same URL and header.
Every tool exposed by the MCP server, grouped by domain. Each public tool requires the scope shown — a call without that scope is rejected before any work is done. The first-party Workflow builder and Docs tools predate the public scope model and are gated by session auth rather than a mintable scope (shown as —).
| Tool | Description | Scope |
|---|---|---|
create_agent | Create a voice agent from an explicit config | agents:write |
create_agent_from_brief | Create a voice agent from a natural-language brief | agents:write |
list_agents | List the organization's agents | agents:read |
get_agent | Fetch a single agent by id | agents:read |
update_agent | Update an existing agent | agents:write |
| Tool | Description | Scope |
|---|---|---|
dispatch_call | Trigger an outbound call from an agent | calls:dispatch |
get_call | Read the status and result of a call | calls:read |
list_calls | List recent calls for the organization | calls:read |
| Tool | Description | Scope |
|---|---|---|
create_campaign | Create a campaign from a batch of contacts | campaigns:write |
campaign_action | Pause, resume, or stop a campaign | campaigns:write |
get_campaign | Read a campaign's configuration and state | campaigns:read |
get_campaign_results | Read a campaign's analytics and results | campaigns:read |
| Tool | Description | Scope |
|---|---|---|
create_knowledge_base | Create a knowledge base for RAG | kb:write |
attach_knowledge_base | Attach a knowledge base to an agent | kb:write |
list_knowledge_bases | List available knowledge bases | kb:read |
| Tool | Description | Scope |
|---|---|---|
list_phone_numbers | List provisioned phone numbers | numbers:read |
get_phone_number | Fetch a single phone number by id | numbers:read |
attach_number_to_agent | Bind a phone number to an agent | numbers:write |
| Tool | Description | Scope |
|---|---|---|
create_workflow | Create a new workflow | — |
save_workflow | Persist changes to a workflow | — |
get_workflow | Fetch a workflow definition | — |
list_workflows | List workflows | — |
list_node_types | List available workflow node types | — |
get_node_type | Fetch the schema for a node type | — |
| Tool | Description | Scope |
|---|---|---|
search_docs | Search the product documentation | — |
list_docs | List available documentation pages | — |
read_doc | Read a single documentation page | — |
catalog | Enumerate the full MCP tool catalog | — |
Once connected, drive WTF Voice from your assistant in plain English:
→ Browse the full REST endpoints in the API Reference.