ElevenLabs MCP

Offizieller MCP-Server von ElevenLabs — gibt Claude Code/Desktop Zugriff auf die komplette ElevenLabs-Plattform (TTS, Voice Cloning, Conversational AI Agents, Audio-Verarbeitung).

Zweck

Mit diesem MCP koennen wir aus Claude Code heraus:

  • TTS — Text als MP3 generieren mit jeder Voice (Multilingual v2 / Flash etc.)
  • Voice-Auswahl + Vorhoeren — Stimmen-Bibliothek durchsuchen, Sample anhoeren
  • Voice Cloning — von Audio-Sample oder Text-Beschreibung
  • Conversational AI Agents — anlegen, konfigurieren, Tools/Functions definieren
  • Audio-Transcription — STT auf Audio-Files
  • Sound Effects — generieren

Das macht ElevenLabs steuerbar wie Papierkram oder M365 — ohne ins Web-Dashboard wechseln zu muessen.

Setup

Voraussetzungen

  • uv / uvx installiert (/Users/marvinkuehlmann/.local/bin/uvx)
  • ElevenLabs-API-Key in .env.local (Vault-Root)

Registrierung in Claude Code (user-scoped)

claude mcp add-json -s user elevenlabs '{
  "command": "/Users/marvinkuehlmann/.local/bin/uvx",
  "args": ["elevenlabs-mcp"],
  "env": {"ELEVENLABS_API_KEY": "<KEY aus .env.local>"}
}'

Verifikation: claude mcp list | grep elevenlabs✓ Connected

Aktivierung

Nach add-json muss Claude Code neu gestartet werden damit die Tools in der Session verfuegbar werden — neuer MCP wird nur beim Session-Start angemeldet.

Wichtige Tools (nach Restart sichtbar)

ToolZweck
text_to_speechText → MP3 (Voice-ID waehlbar)
list_voicesalle verfuegbaren Stimmen
voice_designneue Stimme aus Text-Beschreibung
clone_voiceaus Audio-Sample neue Voice ID
transcribe_audioSTT
create_agentConversational-AI-Agent anlegen
list_agentsbestehende Agents
update_agentPrompt/Voice/Tools eines Agents aendern
agent_call / phone toolsOutbound-Test-Calls und Twilio-Setup

(Liste nicht vollstaendig — nach Restart mcp__elevenlabs__* greppen.)

Use-Cases die uns vermutlich am haeufigsten begegnen

  1. Voice-Auswahl fuer Kundenprojektsearch_voice_library mit “german conversational” / “german customer care”, Preview-MP3 vorhoeren, eine ID festlegen.
  2. DE-Voice-Bot fuer Kunden-Demo (Restaurant/Praxis/Service) — fertiges Pattern: elevenlabs-convai-de-voice-agent. Erste Anwendung 2026-05-09 bei Aylem (telefon-assistent-aws) — Convai-Widget komplett client-side, Tools per Webhook.
  3. Demo-Audio fuer Pitches — TTS generieren, in Praesentationen einbauen.
  4. YouTube/Vlog-Voiceovertext_to_speech mit Voice nach Wahl, MP3 nach assets/.

Quirks / Stolperer

MCP-Setup:

  • claude mcp add mit -e KEY=VAL Flag wurde im positional-Parsing falsch interpretiert (das Argument nach -e wurde fortgesetzt verzehrt). Workaround: add-json nutzen mit JSON-Config — eindeutig und stabil.
  • uvx-Pfad muss absolut sein (/Users/marvinkuehlmann/.local/bin/uvx), sonst “spawn ENOENT” wenn Claude Code aus Kontext ohne PATH gestartet wird.
  • ElevenLabs-Keys haben kein Verfallsdatum — rotieren wenn sie in Chats/Logs sichtbar waren.

Tool-Aufrufe (gelernt 2026-05-09 beim Aylem-POC):

  • mcp__elevenlabs__text_to_speech: voice_id UND voice_name duerfen nicht beide gleichzeitig gesetzt sein — eines reicht, sonst Fehler.
  • mcp__elevenlabs__create_agent hat kein Tools-Argument im Schema — Tools werden separat via REST-API als eigene Resourcen erstellt (POST /v1/convai/tools) und am Agent ueber tool_ids referenziert (PATCH /v1/convai/agents/{id}). Pattern dafuer: elevenlabs-convai-de-voice-agent.
  • Convai-Tools-Schema verlangt description auf JEDEM property im request_body_schema — auch in array.items. Sonst 422 mit „Must set one of: description, dynamic_variable, is_system_provided, or constant_value”.

Free-Tier-Limits:

  • Shared-library-voices kann der Free-Tier-Account NICHT via text_to_speech-API generieren (paid_plan_required) — auch wenn die Voice per voices/add in die eigene Library kopiert wurde.
  • Conversational-AI rendert die Voice trotzdem ohne Subscription, weil sie im Render-Loop direkt benutzt wird, nicht ueber die TTS-API.
  • Workaround fuer Voice-Sample-Vorhoeren ohne Subscription: Preview-MP3 direkt aus dem Public-Bucket downloaden — die URL steht in search_voice_library-Output unter Preview URL.

REST-API:

  • Auth-Header heisst xi-api-key (nicht Authorization: Bearer ...).
  • ?voice_id= Filter im /v1/shared-voices Endpoint wird ignoriert. Workaround: per ?search=<name>&language=de filtern und lokal nach voice_id suchen.
  • voices/add gibt die SELBE voice_id zurueck wie sie in der shared library war — nicht eine neue ID erwarten.

Regeln

  • API-Key nie in Code, nie in Repo. Liegt in .env.local und in der Claude-Code-User-Config (~/.claude.json, vom System verwaltet)
  • Free-Tier Limit (10k Credits/Monat) im Auge behalten — wenn wir produktiv hosten, Subscription
  • Bei Conversational-AI-Agents: Tool-Webhook-URL muss oeffentlich erreichbar sein — fuer lokales Dev ngrok oder Cloudflare Tunnel, fuer Produktion eigene Domain (z.B. via web-properties / AWS)