Announcing CIMD support for MCP Client registration
Learn more

ElevenLabs MCP vs API for Voice AI Agents Integrations

ElevenLabs now ships one official MCP path, a hosted server with OAuth that centers on managing ElevenAgents, after deprecating its local server in August 2026. The REST API covers the full surface, from speech to text and dubbing to voice cloning, telephony and service accounts, behind an API key that can be scoped, capped and allowlisted. Both credentials carry spend. This guide compares what each path lets an agent do, the OAuth grant or key each one puts you on, and how to run a voice product for many customers in production.

TL;DR

  • ElevenLabs now ships one official MCP path: the hosted server at https://api.elevenlabs.io/v1/mcp. The original local elevenlabs-mcp server was deprecated on August 22, 2026 and its repository archived. The hosted server centers on ElevenAgents management (create, update, list, delete agents, tests, branches) plus speech generation; the REST API covers the full surface, including speech to text, dubbing, voice cloning, music, pronunciation dictionaries, telephony, and service accounts.
  • Hosted MCP authenticates with OAuth only, scoped to one workspace and to ElevenAgents read/write and Text to Speech permissions. The direct API authenticates with an xi-api-key header, where each key can be restricted to specific endpoint permissions, capped by credits or characters, and IP allowlisted, plus 15-minute single-use tokens for browser and WebSocket clients.
  • For multi-tenant B2B agents, neither path removes per-user credential isolation. An OAuth grant or an API key is still one credential per user per workspace, and ElevenLabs credentials carry spend: a leaked unscoped key bills your customer's credits.
  • MCP is the faster path for an interactive assistant in Claude, ChatGPT, Cursor, or Claude Code that configures and reviews voice agents. The API is the right path for headless pipelines that generate audio, place outbound calls, or batch-review conversations under your plan's concurrency limit.
  • Scalekit's ElevenLabs connector stores each user's ElevenLabs API key in the token vault and exposes 119 prebuilt tools against it, so the MCP vs API decision doesn't change your auth infrastructure.

The decision your ElevenLabs agent forces first

Your agent needs to generate speech, manage voice agents, or mine call transcripts in your customers' ElevenLabs workspaces. ElevenLabs ships a hosted Model Context Protocol (MCP) server and a broad REST API. Until August 2026 there was also a local MCP server; it is now archived. The two remaining paths differ in what your agent can touch, how it authenticates, and who pays when a credential leaks. Here's how to pick.

What ElevenLabs MCP and ElevenLabs API actually are

ElevenLabs MCP

The ElevenLabs hosted MCP server is a remote server operated by ElevenLabs at https://api.elevenlabs.io/v1/mcp, with data residency endpoints for the EU, India, and Singapore (for example https://api.eu.residency.elevenlabs.io/v1/mcp). ElevenLabs introduced it in August 2026 alongside a listing in Claude's connector directory, and setup instructions cover Claude, Claude Code, ChatGPT, Cursor, and other clients that accept a server URL and complete OAuth.

Auth is OAuth: the user signs in with their ElevenLabs account and grants scoped access to one workspace. No API key is copied into the client. Clients that support Client ID Metadata Documents (CIMD) need no manual client registration. ElevenLabs describes the tool set as intentionally scoped and curated for ElevenAgents, and does not publish a fixed list of tool identifiers; its own guidance treats the live tool list in your connected workspace as the source of truth.

The local elevenlabs-mcp server, which read ELEVENLABS_API_KEY from the client config and ran via uvx, was deprecated on August 22, 2026 in favor of the hosted server, and the repository was archived on August 20, 2026. Docs: Hosted MCP server and ElevenLabs MCP.

ElevenLabs API

The REST API at https://api.elevenlabs.io/v1/ covers Text to Speech, Text to Dialogue, Speech to Text, voice changer, audio isolation, sound effects, music, dubbing, voices and voice cloning, pronunciation dictionaries, Studio projects, history, ElevenAgents (agents, conversations, knowledge base, tools, phone numbers, batch calling), workspace management, and service accounts.

Every request carries an API key in the xi-api-key header. Keys can be restricted to specific endpoint permissions, given a credit or character limit, and IP allowlisted. Service accounts give machine workloads an identity not tied to a human, and POST /v1/single-use-token/:token_type mints 15-minute, consumed-on-first-use tokens for frontend clients. Docs: API Authentication.

What your agent can actually do

Capability
ElevenLabs MCP
ElevenLabs API
Create, update, duplicate, delete ElevenAgents
Yes: Core focus of the hosted server
Yes
Agent tests and branches
Yes: Manage tests and branches
Yes
Review and analyze conversations
Yes: Pull topics from recent conversations
Yes
Generate speech from text
Yes: Returns a short-lived download link
Yes: Text to Speech and Text to Dialogue
Speech to Text transcription
Limited: Not in the hosted server's documented OAuth scopes
Yes: Speech to Text, realtime and batch; the Scalekit connector reads results
Dubbing
No: Not documented on the hosted server
Yes
Voice design and cloning
No: Not documented on the hosted server
Yes: Voices and cloning endpoints
Knowledge base for agents
Limited: Managed through agent configuration
Yes
Outbound and batch calls
No: Not documented on the hosted server
Yes
Pronunciation dictionaries
No
Yes
Estimate agent LLM usage and cost
Yes: Documented hosted MCP capability
Limited
Service accounts and scoped keys
No
Yes

The pattern is clear. The hosted MCP server is an ElevenAgents operator's console: configure agents, test them, read their conversations, and generate a clip. The API is the production surface for everything that moves audio or money: transcription, dubbing, cloning, telephony, and workspace administration.

What the MCP server makes easier

ElevenAgents configuration is deep. An agent carries a conversation config, voice settings, tools, knowledge base references, branches, and environment variables, and the REST payloads reflect that. The hosted MCP tools let a model compare configurations across agents, duplicate one for a new market, or adjust an opening message without your team writing schemas for any of it.

Writing the schema is the hard part. Not the API call.

The hosted server also gives workspace admins tool-level control: admins can configure the connector and its tools for the whole organization, a tool an admin disables cannot be re-enabled by an individual user, and users can only apply stricter settings. One sharp edge: updates made through the MCP server publish directly to the target branch, main by default, rather than staging a draft the way changes from the in-app ElevenAgents Architect do. An agent that edits a production voice agent through MCP edits production.

The auth path each one puts you on

ElevenLabs MCP: OAuth into one workspace

The MCP client opens ElevenLabs' OAuth flow, the user signs in, and the consent screen lists the requested permissions, which cover ElevenAgents read and write operations and Text to Speech. The grant is limited to the workspace the user signed in with, and the user can revoke it from the MCP client or from ElevenLabs account settings. Data residency environments are separate workspaces with separate accounts, so an EU customer signs in against the EU endpoint with an EU account.

What the user can't do, the agent can't do. Every MCP call acts inside one user's workspace grant, with whatever tools the workspace admin has left enabled.

There is no API key fallback on the hosted server. If your agent runs headless with no human present to complete a browser sign-in, the hosted MCP path is closed to you.

ElevenLabs API: one header, many knobs

The API path is a single xi-api-key header, but the key itself is configurable in ways that matter for agents:

  • Scope restriction. A key can be limited to specific permissions such as text_to_speech, speech_to_text, voices_read, convai_read, convai_write, dubbing_read, or music_generation, or granted all.
  • Spend caps. A key can carry a custom credit limit, and service account keys accept a character_limit per month. ElevenLabs frames this as capping the financial damage of a leak.
  • IP allowlisting. Requests from outside allowed_ips get a 403.
  • Service accounts. Keys created under /v1/service-accounts/{service_account_user_id}/api-keys belong to a non-human identity, with optional per-key concurrency limits for TTS, dubbing, and music on Enterprise.
  • Single-use tokens. POST /v1/single-use-token/:token_type with realtime_scribe, batch_scribe, or tts_websocket returns a token that expires after 15 minutes and is consumed on first use, so a browser never sees the long-lived key.

This is the blast radius point. An ElevenLabs API key is not just a data credential; it is a billing credential. A key with all permissions and no credit cap, stored in an agent's environment, lets a prompt-injected or looping agent clone voices, place outbound calls, or burn a customer's monthly credits. Least privilege on ElevenLabs means a scoped, capped key per user, not one workspace-wide key.

Both paths still need per-user isolation

In a multi-tenant B2B agent, MCP's OAuth flow gives you a token per user. Direct API calls give you a credential per user. In neither case does the path itself solve storage, rotation, or revocation; those are infrastructure problems regardless of which path you choose.

ElevenLabs adds two wrinkles. Each credential is bound to one workspace and, for residency customers, one regional endpoint, so your credential store has to bind every token to its user, its workspace, and its region. And because credentials spend money, revocation is not just a security control; it is a cost control.

Recommended reading: OAuth vs API keys for AI agents

What you own in production

On the MCP path

ElevenLabs owns the tool schemas, the curated tool set, and the server. You own the OAuth client, per-user token storage, refresh, and the reconnect experience when a user revokes access. You also own the consequences of direct publishing: since MCP updates land on the target branch immediately, any agent that writes through MCP needs its own guardrails before it touches a customer's live voice agent.

Migration is also on you. Teams that wired the local elevenlabs-mcp server into their stack with an API key now have to move to OAuth on the hosted server, and the auth model changes with it.

On the API path

You own everything: schemas, pagination, retries, and the key lifecycle. The binding constraint is concurrency, not requests per minute. ElevenLabs publishes parallel request limits per plan: 2 on Free, 3 on Starter, 5 on Creator, 10 on Pro, and 15 on Scale and Business, with ElevenAgents on separate limits. Exceed it and you get HTTP 429 with too_many_concurrent_requests; the other 429 variant, system_busy, means ElevenLabs is under load and a retry usually succeeds. Your retry logic has to tell those apart: backing off on system_busy works, while retrying too_many_concurrent_requests without reducing parallelism just queues more failures.

List endpoints such as conversations paginate with cursor, next_cursor, and has_more. Paid requests fail once a key hits its character_limit. Key rotation is manual or scripted; ElevenLabs recommends overlapping keys for zero-downtime cutover and a routine 90-day rotation for backend keys.

Schema drift

On the MCP side, ElevenLabs controls the tool set and has already replaced one server with another in 2026; the hosted server's creative tools are still rolling out. Your agent's visible surface can change without a release on your side. On the API side, endpoints are versioned under /v1/, but ElevenAgents payloads gain fields frequently, and the tool schemas you write for them need to keep up.

When to use MCP, when to use the API

Use ElevenLabs MCP when

  • Your users work in Claude, ChatGPT, Cursor, or Claude Code and want to ask "which of our support agents had the most failed calls this week, and what changed in their prompts?" against their own workspace.
  • The job is ElevenAgents operations: duplicating an agent for a new market, adjusting voice and opening message, running tests, and comparing configurations across agents.
  • A human is present for every session to complete OAuth, and each customer's workspace admin is willing to approve the connector and choose which tools stay enabled.
  • You are prototyping an ElevenLabs-backed assistant and want agent management and speech generation before writing any tool definitions.

Use the ElevenLabs API when

  • The agent runs headless: a nightly job that pulls elevenlabs_list_conversations filtered by call_successful, summarizes each failure with elevenlabs_get_conversation_summary, and posts the digest to Slack.
  • The workflow places calls or produces audio at volume: outbound campaigns through elevenlabs_create_batch_call or elevenlabs_start_twilio_outbound_call, narration through elevenlabs_text_to_speech, all paced against the plan's concurrency limit.
  • You need capabilities the hosted server does not document: Speech to Text, dubbing, voice design and cloning, pronunciation dictionaries, or service accounts.
  • You need hard spend and permission boundaries per user: a key restricted to convai_read and text_to_speech with a character cap is a tighter credential than a broad OAuth grant.

The credential problem that exists on both paths

Both paths hand you a credential per user. Neither hands you a vault. In a multi-tenant agent, 50 customers with 4 ElevenLabs users each is 200 credentials, spread across separate workspaces and possibly separate residency regions. Each one must be stored encrypted, bound to its user and workspace, rotated on its own schedule, and revoked when an employee leaves or a customer churns.

The token type changes between paths: an OAuth access token on MCP, a scoped xi-api-key on the API. The infrastructure does not change. The tempting shortcut, one unscoped workspace key per customer stored in your agent's config, collapses 200 credentials into 50 and turns each of those 50 into an uncapped billing credential that can act across the whole workspace.

Scalekit's ElevenLabs connector stores each user's ElevenLabs API key in the token vault and sends it with every call, so the MCP vs API decision doesn't change your auth infrastructure. Your agent passes an identifier; the key never enters the agent runtime or the LLM context.

Recommended reading: why a token vault matters for AI agent workflows

How to connect an ElevenLabs agent with Scalekit

Scalekit's elevenlabs connector is an API-path connector with 119 tools (63 read, 40 write, 16 destructive). It authenticates with an API key: each user opens an authorization link once and enters their own ElevenLabs API key on a Scalekit-hosted page, and Scalekit stores it as that user's connected account credential. Ask users to create a key restricted to the permissions your agent needs, with a credit limit, rather than an all key.

Prerequisites and the connection name

Create an ElevenLabs connection in AgentKit > Connections in the Scalekit dashboard. The name you give it is the connection_name your code passes, and the string must match the dashboard exactly. This is the most common integration error. Copy SCALEKIT_ENVIRONMENT_URL, SCALEKIT_CLIENT_ID, and SCALEKIT_CLIENT_SECRET from Developers > API Credentials into .env.

pip install scalekit-sdk-python python-dotenv langchain-openai

Authorize each user once

get_or_create_connected_account returns the user's connected account. If it is not ACTIVE, get_authorization_link returns a link to the page where the user enters their ElevenLabs API key. The agent never sees the key.

import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions CONNECTION_NAME = "elevenlabs" # must match the connection name in AgentKit > Connections identifier = "user_123" # your app's stable ID for this user account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=identifier, ) print("Connect ElevenLabs:", link.link) input("Press Enter after entering your ElevenLabs API key...") account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if account.connected_account.status != "ACTIVE": raise RuntimeError(f"ElevenLabs is {account.connected_account.status}, not ACTIVE")

Retrieve the ElevenLabs tools this user can call

This is not a catalog load. The agent asks for the tools this user's connected account is authorized to call, and narrows them to the five a call-quality review agent needs. Loading all 119 ElevenLabs tools would put elevenlabs_delete_agent, elevenlabs_start_twilio_outbound_call, and voice deletion in front of a model that has no reason to use them.

tools = actions.langchain.get_tools( identifier=identifier, connection_names=[CONNECTION_NAME], tool_names=[ "elevenlabs_list_agents", "elevenlabs_list_conversations", "elevenlabs_get_conversation_summary", "elevenlabs_smart_search_conversation_messages", "elevenlabs_get_agent", ], page_size=100, ) tool_map = {t.name: t for t in tools} print(sorted(tool_map))

Run the agent loop

The loop runs until the model stops requesting tools. Every tool call executes with this user's ElevenLabs key, inside their workspace.

from langchain_core.messages import HumanMessage, ToolMessage from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ HumanMessage( "Find the failed conversations for our support agent in the last 7 days, " "summarize why they failed, and check whether the agent's first message " "or system prompt explains the pattern." ) ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: tool = tool_map.get(tc["name"]) if tool: result = tool.invoke(tc["args"]) else: result = f"Unknown tool: {tc['name']}" messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

Deterministic calls with execute_tool

For pipelines, skip the model. execute_tool runs one tool with a fixed input and returns data plus an execution_id you can log.

import time result = actions.execute_tool( tool_name="elevenlabs_list_conversations", tool_input={ "call_successful": "failure", "call_start_after_unix": int(time.time()) - 7 * 24 * 3600, "page_size": 20, }, connection_name=CONNECTION_NAME, identifier=identifier, ) print(result.execution_id, result.data) speech = actions.execute_tool( tool_name="elevenlabs_text_to_speech", tool_input={ "text": "Your order has shipped and will arrive on Thursday.", "voice_id": "21m00Tcm4TlvDq8ikWAM", }, connection_name=CONNECTION_NAME, identifier=identifier, ) print(speech.execution_id, list(speech.data.keys()))

elevenlabs_text_to_speech returns audio_base64 plus character-level alignment in the response body, so a pipeline can store or stream the audio without a second download step.

Scalekit does not ship a connector for ElevenLabs' hosted MCP endpoint. If you need endpoints outside the prebuilt tools, such as Speech to Text uploads or dubbing jobs, register a custom connector and make proxied calls through actions.request(), keeping the same connected account and vault model.

Multi-tool, multi-tenant ElevenLabs agents on a virtual MCP server

The elevenlabs connector has 119 tools. At roughly 200 tokens per tool definition, that is about 23,800 tokens of context before the agent does any work, and the model is choosing from a decision space that includes placing phone calls and deleting agents. The fix is not better prompting. It is surface reduction. A Scalekit virtual MCP server declares exactly which tools an agent role can see, and session tokens keep each run bound to one user's connected accounts. Docs: set up a virtual MCP server.

Create the server once per agent role

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = actions.mcp.create_config( name="elevenlabs-call-review-to-slack", description="Reviews failed ElevenAgents conversations and posts a digest to Slack", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="elevenlabs", tools=[ "elevenlabs_list_conversations", "elevenlabs_get_conversation_summary", "elevenlabs_get_agent", ], ), McpConfigConnectionToolMapping( connection_name="slack", tools=["slack_send_message"], ), ], ) print(vmcp.config.id, vmcp.config.mcp_server_url)

Mint a session token per user, per run

One server definition serves every user. Before each run, check that the user's accounts are active and mint a short-lived session token scoped to them. Any MCP client that speaks streamable HTTP can connect; this example uses langchain-mcp-adapters (pip install langchain-mcp-adapters) and passes the token as a Bearer header.

import asyncio from datetime import timedelta from langchain_mcp_adapters.client import MultiServerMCPClient config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url user_id = "user_123" accounts = actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=user_id, include_auth_link=True, ) not_ready = [ a for a in accounts.connected_accounts if str(a.connected_account_status).upper() != "ACTIVE" ] for a in not_ready: print(f"{a.connection_name} is {a.connected_account_status}: {a.authentication_link}") if not_ready: raise RuntimeError("Connect the accounts above before starting this run") session_token = actions.mcp.create_session_token( mcp_config_id=config_id, identifier=user_id, expiry=timedelta(minutes=30), ).token async def load_tools(): client = MultiServerMCPClient( { "scalekit": { "transport": "streamable_http", "url": mcp_server_url, "headers": {"Authorization": f"Bearer {session_token}"}, } } ) return await client.get_tools() mcp_tools = asyncio.run(load_tools()) print([t.name for t in mcp_tools])

The agent sees four tools. The endpoint is static; the identity is per-user.

Observability: every ElevenLabs action tied to a user

Every execute_tool call returns an execution_id, and every execution is attributed to a connected account, which maps to one of your users and one customer workspace. When a customer asks who placed a batch of outbound calls, which run regenerated a voice, or why their character count jumped overnight, the answer is a lookup, not an investigation.

Shared keys break this. If every user's agent runs on one workspace key, ElevenLabs history and usage show the key, and your side of the audit trail can only prove that the shared key did it. Shared credentials are a single-user solution. They do not survive a second user.

Recommended reading: audit trails for agent auth

Which one to build against

If your agent is an interactive assistant in Claude, ChatGPT, Cursor, or Claude Code that helps a user configure, test, and review their ElevenAgents, use the hosted ElevenLabs MCP server. OAuth, workspace scoping, and admin-controlled tools get you there with no schema work, as long as you respect that MCP edits publish straight to the live branch. If your agent runs headless, transcribes or dubs audio, places calls, works with voices, or needs per-user spend caps, use the API directly.

Either way, the credential problem is the same, and that's what needs production-grade infrastructure. ElevenLabs credentials carry both data access and spend, and ElevenLabs has already replaced its MCP auth model once this year. The teams that bind every ElevenLabs credential to one user and one workspace now will absorb the next change without rewriting their agents.

FAQs

Does ElevenLabs have an official MCP server?

Yes, one hosted server with OAuth, introduced in August 2026 with data residency endpoints for the EU, India and Singapore. The original local MCP server, which read an API key from the client config, was deprecated on August 22, 2026 and its repository archived. The hosted server centers on managing ElevenAgents, their tests and branches, plus speech generation, and ElevenLabs treats the live tool list in your workspace as the source of truth.

What can the ElevenLabs API do that the hosted MCP server cannot?

Speech to text, dubbing, voice design and cloning, pronunciation dictionaries, knowledge base management, outbound and batch calls over telephony, and service accounts with scoped keys. The MCP server's OAuth scopes cover ElevenAgents read and write operations and Text to Speech, and it has no API key fallback for headless use.

How can an ElevenLabs API key be restricted?

A key can be limited to specific endpoint permissions such as text to speech, speech to text, voice reads or agent reads and writes; given a credit or monthly character limit; and allowlisted to specific IP addresses. Service account keys belong to a non-human identity, and single-use tokens that expire after 15 minutes let a browser or WebSocket client work without ever seeing the long-lived key.

What happens when an agent edits a voice agent through MCP?

Updates publish directly to the target branch, main by default, rather than staging a draft the way changes from the in-app Architect do. An agent that edits a production voice agent through MCP edits production, so any write path through MCP needs its own guardrails. Workspace admins can disable tools for the whole organization, and users can only apply stricter settings.

When should an agent use the ElevenLabs API instead of MCP?

When it runs headless, such as a nightly job that lists failed conversations and summarizes each one; when it places calls or produces audio at volume, paced against the plan's concurrency limit; when it needs capabilities the hosted server does not document; or when it needs hard spend and permission boundaries per user, since a restricted, capped key is a tighter credential than a broad OAuth grant.

How does Scalekit connect an AI agent to ElevenLabs?

The ElevenLabs connector exposes 119 tools over the REST API. Each user enters their own ElevenLabs API key once, ideally restricted and capped, Scalekit stores it in the token vault and sends it with every call, a virtual MCP server narrows a call-review agent to read tools so it cannot delete agents or place calls, and every execution is attributed to that user and workspace.

Build your ElevenLabs agent with Scalekit

Browse the Scalekit ElevenLabs connector and the ElevenLabs connector docs with the full tool list. See Scalekit pricing, or talk to us.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Scalekit
Find us on ProductHunt

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.