Provider REST API

AI

Connect Claude to ElevenLabs

Speak text in any voice, and generate images and video from a prompt. Toolspoke puts 19 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.

Connection
Provider REST API
Authentication
API key
Actions exposed
19
Cost per call (typical)
1 credit
Adapter
Maintained by Toolspoke

Connected in three steps

  1. 1

    Install ElevenLabs

    Open the marketplace in your workspace, add ElevenLabs to the project your agents work in, and it appears on the gateway immediately.

  2. 2

    Connect the credential

    Authenticate with api key. Where to get one, and what it has to be able to reach, is the next section.

  3. 3

    Point your agent at the gateway

    Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.

.mcp.json
{
  "mcpServers": {
    "toolspoke": {
      "type": "http",
      "url": "https://toolspoke.com/mcp"
    }
  }
}

One block covers every tool you have installed. ElevenLabs shows up in the client as soon as your policy allows it, and so does everything else you install later.

Where the address goes, per client

Claude Code

Run it in your project, then /mcp to sign in

claude mcp add --transport http toolspoke https://toolspoke.com/mcp
Claude and Claude Desktop

Settings, then Connectors, then Add custom connector

https://toolspoke.com/mcp
Cursor

~/.cursor/mcp.json, or .cursor/mcp.json for one project

{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }
Codex

~/.codex/config.toml

[mcp_servers.toolspoke]
url = "https://toolspoke.com/mcp"
VS Code

.vscode/mcp.json, or the MCP: Add Server command

{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }

What ElevenLabs asks for

API key. You provide it once, when you install the connector. Toolspoke encrypts it at rest and decrypts it only for the length of a single call, and the gateway attaches it to the outbound request itself, so it is never part of the arguments an agent sends.

API keyRequired
elevenlabs.io → Profile → API keys. A key carries the scopes it was created with, so a key made read-only will refuse the generate and delete actions here.
sk_…

What Claude can do in ElevenLabs

19 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.

Reads
13Reads
Writes
4Writes
Destructive
2Destructive

Reads

13

Fetches data and changes nothing.

  • get_account

    Read the account this key belongs to - the user id, the name on it, and a preview of the key itself. The cheapest proof that the credential works: it takes no argument, spends no credits, and generates nothing. Use get_subscription for the character quota, which this deliberately leaves out.

  • get_subscription

    Read the plan and what is left of it: the tier, characters used against the character limit, when that limit next resets, and how many voice slots are taken. Call this before a long run of generate_speech - the character limit is what stops one part-way through.

  • list_models

    List the speech models, with what each one can do, the languages it covers, and its `token_cost_factor` - the multiplier on what a generation costs. Note that generate_speech, generate_image and generate_video take their own separate model ids, listed in their schemas; this endpoint covers the speech models only.

  • list_voices

    Search the voices this workspace can already speak with - its own clones, the shared premades, and anything added from the voice library. The `voice_id` of a result is what generate_speech takes. Page with `next_page_token` from the response; narrow with `search` rather than paging through everything.

  • get_voice

    Fetch one voice by id: its labels, description, sharing terms, verified languages, and saved settings. Use it to check what a voice is before spending credits speaking with it.

  • search_shared_voices

    Search the public voice library - voices other people share, which this workspace has not added yet. A result cannot be spoken with directly: pass its `public_owner_id` and `voice_id` to add_shared_voice first, and use the `voice_id` that call returns.

  • list_history

    List what this workspace has already generated, newest first - the text that was spoken, which voice and model spoke it, when, and how many characters it cost. Use it to find a past generation without paying to make it again.

  • get_history_item

    Fetch one history item by id - the full text that was spoken, the voice and model used, the settings, and the character cost. The audio itself is not returned here; it is only downloadable from the ElevenLabs dashboard.

  • get_speech_generation

    Check a generation started by generate_speech. `status` runs pending → generating → completed or failed; poll every few seconds while it is not terminal. A completed response carries `content_url`, a signed link that expires about an hour after it is returned - call this again for a fresh one. A failed generation is not charged and says why in `failure_reason`.

  • get_image_generation

    Check a generation started by generate_image. `status` runs pending → generating → completed or failed. A completed response carries `content_url`, a signed link that expires about an hour after it is returned - call this again for a fresh one. A failed generation is not charged.

  • list_image_generations

    List the image generations this key has made, newest first. Use it to recover the id of something already paid for rather than generating it again, or to find everything still `generating`.

  • get_video_generation

    Check a generation started by generate_video. `status` runs pending → generating → completed or failed; video takes minutes rather than seconds, so poll patiently. A completed response carries `content_url`, a signed link that expires about an hour after it is returned - call this again for a fresh one. A failed generation is not charged.

  • list_video_generations

    List the video generations this key has made, newest first. Use it to recover the id of something already paid for rather than generating it again, or to find everything still `generating`.

Writes

4

Creates or updates something on the other side.

  • generate_speech

    Queue a text-to-speech generation and get back a generation id. This is billed per character against the plan's character limit, so check get_subscription first and keep the text to what is actually needed. Nothing comes back but an id and the status `pending` - poll get_speech_generation with the id until its status is `completed`, then read `content_url`.

  • generate_image

    Queue an image generation from a prompt and get back a generation id. This spends credits. Poll get_image_generation with the id until its status is `completed`, then read `content_url`. Each model accepts a different set of options and rejects the rest, so send only what the chosen model takes: `aspect_ratio` is accepted by all of them, `resolution` only by the gemini-3.x and bytedance-seedream models.

  • generate_video

    Queue a video generation from a prompt and get back a generation id. Video is the most expensive thing here - cost rises with duration and resolution, so start short and small. Poll get_video_generation with the id until its status is `completed`, then read `content_url`. Each model accepts a different set of options and rejects the rest: `negative_prompt` and `enhance_prompt` are veo-3.1 only, and the allowed durations, ratios and resolutions differ per model.

  • add_shared_voice

    Add a voice from the public library, found with search_shared_voices, to this workspace so generate_speech can use it. It takes one of the workspace's voice slots - get_subscription says how many are left. This adds a voice; it never takes one away.

Destructive

2

Deletes or permanently alters something. Worth granting on purpose.

  • delete_voice

    Remove a voice from this workspace for good. A cloned or professional voice cannot be recovered without the original samples, and anything that referenced the voice id stops working. Frees the voice slot it held.

  • delete_history_item

    Delete one generation from the workspace's history for good, along with its audio. There is no trash and no undo, and the characters it cost are not refunded.

What it will not do

Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.

It cannot call anything else
The 19 actions above are the whole of it. A call to any other name is refused before it reaches ElevenLabs rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
It reaches no further than your credential
Toolspoke holds no access to ElevenLabs of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
It never hears from ElevenLabs
Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in ElevenLabs. An agent has to ask.
It does not smooth over provider limits
Toolspoke does not retry, queue or back off around ElevenLabs's own rate limits. A call that ElevenLabs refuses comes back to the agent as a failed call.

Before you connect it

What can Claude do in ElevenLabs?

19 named actions: 13 that only read, 4 that write and 2 that delete or permanently alter something. They include get_account, get_subscription and list_models. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.

What credentials does the ElevenLabs connector need?

API key. The connector asks for api key. Values are encrypted at rest and attached to the outbound request by the gateway, so they are never part of the arguments an agent sends and never reach the audit log.

Does the ElevenLabs connector work with Cursor and Codex, or only Claude?

Any client that speaks MCP, and every one of them gets the same 19 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.

What does the ElevenLabs connector not do?

The 19 actions above are the whole of it. A call to any other name is refused before it reaches ElevenLabs rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. Toolspoke holds no access to ElevenLabs of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in ElevenLabs. An agent has to ask. Toolspoke does not retry, queue or back off around ElevenLabs's own rate limits. A call that ElevenLabs refuses comes back to the agent as a failed call.

Can I limit which actions an agent can call?

Yes, in two places. The project switches ElevenLabs's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.

What gets recorded when an agent calls ElevenLabs?

Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.