A Model Context Protocol (MCP) server for generating professional podcasts using ElevenLabs v3 Text-to-Speech API with Audio Tags support.
- ποΈ Multi-speaker dialogue with natural interruptions and overlapping speech
- π·οΈ Audio Tags for emotional control
[excited], delivery[whispers], and effects[laughs] - β±οΈ Smart duration control - content-aware with 10-minute maximum
- π¨ Multiple podcast styles - interview, narrative, discussion, educational, comedy
- π Tone presets - professional, casual, excited, calm, dramatic
- π 70+ language support with consistent voice quality
- π AI script generation with Audio Tags
- π Batch processing for long-form content
- π High-quality audio output (up to 192kbps MP3)
- π Built with FastMCP for easy integration
- Clone the repository:
git clone <repository-url>
cd elevenlabs-podcast-mcp- Install dependencies:
pip install -r requirements.txt- Set up environment variables:
cp .env.example .env
# Edit .env and add your ElevenLabs API keyDevelopment mode:
fastmcp dev server.pyProduction mode:
fastmcp run server.py --transport sseGenerate a complete podcast with Audio Tags, configurable style and tone.
{
"script": "Host: [excitedly] Welcome! Guest: [thoughtfully] Great to be here!",
"style": "interview", # interview, narrative, discussion, educational, comedy
"tone": "professional", # professional, casual, excited, calm, dramatic
"duration_minutes": null, # Auto-calculates based on content (max 10 min)
"auto_duration": true,
"voice_mapping": {"Host": "voice_id_1", "Guest": "voice_id_2"},
"output_path": "output/episode.mp3"
}AI-powered script generation with Audio Tags.
{
"topic": "Artificial Intelligence",
"style": "interview",
"duration_minutes": 5,
"include_tags": true # Includes Audio Tags for emotions
}Example output:
Host: [excitedly] Welcome to Tech Talks! Today we're exploring AI.
Guest: [thoughtfully] This technology is transforming everything.
Host: [interrupting] βThat's exactly what our listeners want to know!
Handle long-form content with automatic batching (>3000 chars).
{
"script": "Very long podcast script...",
"style": "narrative",
"tone": "dramatic",
"output_path": "output/long_episode.mp3"
}Quick preview generation for testing voices and tones.
{
"text": "[whispers] Testing the preview feature",
"voice_id": "21m00Tcm4TlvDq8ikWAM",
"tone": "dramatic"
}List all available voices from your ElevenLabs account.
Create a structured project directory.
{
"project_name": "MyPodcast",
"description": "Weekly tech discussions"
}Audio Tags are wrapped in square brackets and control voice performance:
[excited],[happy],[sad],[angry],[thoughtfully],[nervously]
[whispers],[shouts],[quietly],[loudly][pause],[stammers],[rushed]
[laughs],[sighs],[gasps],[clears throat],[chuckles]
[interrupting],[overlapping],[jumping in]
[British accent],[French accent],[Australian accent]
Host: [excitedly] Welcome to our show! [pause] Today's topic is fascinating.
Guest: [thoughtfully] Indeed. [sighs] Let me explain why...
Host: [interrupting] βActually, that reminds me of something!
Guest: [laughs] You always do that! [continuing] As I was saying...
Host: [whispers] Sorry, go ahead.
Guest: [normal voice] The key point is... [dramatically] Everything changes now!
Professional Q&A format with host and guest dynamics.
Storytelling format with dramatic elements.
Multi-participant roundtable with natural interruptions.
Clear, structured learning content.
Humorous delivery with timing and sarcasm.
Each tone adjusts voice parameters:
- Professional: Balanced, clear delivery (stability: 0.7)
- Casual: Relaxed, conversational (stability: 0.4)
- Excited: High energy, enthusiastic (stability: 0.3)
- Calm: Soothing, measured pace (stability: 0.8)
- Dramatic: Theatrical, expressive (stability: 0.5)
voices://presets- Preset voice configurationsconfig://settings- Server configurationtemplates://podcast-scripts- Script templates with Audio Tags
client.call_tool("generate_podcast", {
"script": "Host: [excitedly] Breaking news everyone!",
"style": "interview",
"tone": "excited"
})script = """
Host: [starting] So the main issue isβ
Guest: [interrupting] βActually, I disagree!
Host: [surprised] Oh? Tell me more.
Guest: [explaining] Well, when you consider...
"""
client.call_tool("generate_podcast", {
"script": script,
"style": "discussion"
})# First generate the script
script = client.call_tool("generate_script", {
"topic": "Space Exploration",
"style": "narrative",
"include_tags": true
})
# Then create the podcast
client.call_tool("generate_podcast", {
"script": script,
"auto_duration": true
})ELEVENLABS_API_KEY=your_api_key_here
ELEVENLABS_MODEL=eleven_v3 # ALWAYS use v3 for Audio Tags
MAX_DURATION_MINUTES=10
DEFAULT_SPEAKING_RATE=150- Host: Rachel (21m00Tcm4TlvDq8ikWAM)
- Guest: Drew (29vD33N1CtxCmqQRPOHJ)
- Narrator: Bella (EXAVITQu4vr4xnSDxMaL)
elevenlabs-podcast-mcp/
βββ server.py # Main MCP server with all tools
βββ requirements.txt # Python dependencies
βββ .env.example # Environment template
βββ CLAUDE.md # AI context documentation
βββ README.md # This file
βββ ai-docs/ # Additional documentation
@mcp.tool
async def your_custom_tool(param: str) -> Dict:
"""Your tool description."""
# Implementation
return {"result": "success"}# Inspect available tools
fastmcp inspect server.py
# Test specific tool
fastmcp dev server.py- Python 3.11+
- ElevenLabs API key (v3 access required)
- FastMCP framework
- pydub (for audio processing)
- Always use
eleven_v3model for Audio Tags support - Character limit: 3000 per request (auto-batching for longer content)
- Professional Voice Clones (PVCs) not fully optimized for v3 yet
- Recommended: Use Instant Voice Clones (IVC) or designed voices
The server includes automatic retry with exponential backoff.
Use generate_long_podcast for content >3000 characters.
Ensure you're using eleven_v3 model, not eleven_turbo_v2_5.
MIT
For issues or questions, please open a GitHub issue.