gemini-tts-mcp
This is a local Gemini-based Text-to-Speech (TTS) MCP server with automatic API key rotation, model fallback, and 30 multilingual voices. Here's what you can do:
Generate speech audio (
generate_speech): Convert text into audio files (WAV, MP3, OGG, M4A, FLAC) with control over voice, speaking style, pitch factor, output path, and optional model override. Models automatically fall back betweengemini-3.1-flash-tts-previewandgemini-2.5-flash-preview-tts.Browse voices (
list_voices): List all 30 multilingual voices with gender, tone, and description; optionally filter by gender and/or tone (e.g., "Soft", "Bright", "Firm", "Warm", "Upbeat").Quick gender filter (
list_voices_by_gender): Shortcut to list only male or female voices.Manage API keys (
reload_keys): Reload keys from~/.gemini-tts-mcp/keys.jsonor environment variables without restarting.Check key status (
pool_status): See how many API keys are currently active in the rotation pool.
The server runs locally (keys never leave your machine) and offers automatic resilience with key rotation on quota/errors.
Provides text-to-speech generation using Gemini TTS models, with features like key rotation, model fallback, 30 multilingual voices, pitch control, and configurable speaking styles.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gemini-tts-mcpsay 'Hello, world!' in a friendly tone"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Gemini TTS MCP
Multi-key Gemini TTS server (MCP) with automatic API key rotation and model fallback.
No baked-in voice, accent, or persona — all parameters are explicit.
Features
🔄 Key rotation — pool of Gemini API keys; auto-rotates on quota/error
📉 Model fallback — tries
gemini-3.1-flash-tts-preview→gemini-2.5-flash-preview-tts🗣️ 30 voices — full catalog with gender, tone, and description
🔍 Filter by gender/tone —
list_voices(male/female)or by tone name🎚️ Pitch control —
pitch_factorparameter (ffmpeg-based)🌐 Multilingual — any voice speaks the language of your input text
🧩 MCP-native — register in any MCP host (Claude Desktop, Hermes Agent, etc.)
Related MCP server: gemini-webapi-mcp
Quick Start
1. Install
⚠️ Not available on PyPI — install from source (see below).
pip install mcp google-genaiinstalls dependencies only, not this project.
Option A — Clone the repo (recommended):
git clone https://github.com/alarconcesar/gemini-tts-mcp.git
cd gemini-tts-mcp
pip install mcp google-genaiOption B — From anywhere (source must be in PYTHONPATH):
pip install mcp google-genai
# then clone & run from the repo directory2. Set up API keys
Create ~/.gemini-tts-mcp/keys.json:
["AIzaSy...key1", "AIzaSy...key2"]Or set an env var: export GEMINI_API_KEY="AIzaSy...your_key"
3. Run (from the repo directory)
cd gemini-tts-mcp
python -m gemini_tts_mcp.server4. Register in any MCP host
Hermes Agent (~/.hermes/config.yaml):
mcp_servers:
gemini-tts:
command: "python"
args: ["-m", "gemini_tts_mcp.server"]Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"gemini-tts": {
"command": "python",
"args": ["-m", "gemini_tts_mcp.server"]
}
}
}Tools
Tool | Description |
| Text → audio file (WAV, MP3, OGG, M4A, FLAC) |
| Browse all 30 voices (filter by gender/tone) |
| Shortcut: |
| Refresh API key pool from disk/env |
| Check how many keys are configured |
generate_speech parameters
Param | Default | Description |
| (required) | Text to vocalize |
|
| Any of the 30 voices |
|
| Speaking style e.g. "softly", "cheerfully", "in a calm tone" |
|
| >1 = higher pitch, <1 = lower |
|
| Output format: |
|
| Override model (auto fallback if omitted) |
|
| Custom WAV path |
Voice Catalog
All 30 voices are multilingual — any voice speaks the language of your input text.
Female voices (16):
Voice | Tone | Description |
Achernar | Soft | Gentle, mellow tone |
Aoede | Breezy | Casual, relaxed delivery |
Autonoe | Bright | Clear, vibrant expression |
Callirrhoe | Easy-going | Laid-back, comfortable style |
Despina | Smooth | Refined, elegant tone |
Erinome | Clear | Crisp, distinct articulation |
Gacrux | Mature | Experienced, seasoned quality |
Kore | Firm | Assertive, confident delivery |
Laomedeia | Upbeat | Positive, energetic style |
Leda | Youthful | Young-sounding, fresh voice |
Pulcherrima | Forward | Direct, straightforward style |
Sterope | Forward | Bold, direct presentation |
Sulafat | Warm | Comforting, affectionate quality |
Vindemiatrix | Gentle | Soft, kind delivery |
Zephyr | Bright | High energy, clear articulation |
Male voices (15):
Voice | Tone | Description |
Achird | Friendly | Warm, approachable tone |
Algieba | Smooth | Polished, fluid delivery |
Algenib | Gravelly | Rough, textured quality |
Alnilam | Firm | Steady, resolute delivery |
Charon | Informative | Educational, explanatory style |
Enceladus | Breathy | Soft, airy quality |
Fenrir | Excitable | Energetic, animated expression |
Iapetus | Clear | Precise, well-articulated |
Orus | Firm | Strong, authoritative tone |
Puck | Upbeat | Cheerful, enthusiastic tone |
Rasalgethi | Informative | Educational, instructive |
Sadachbia | Lively | Energetic, spirited expression |
Sadaltager | Knowledgeable | Expert, well-informed tone |
Schedar | Even | Balanced, consistent tone |
Umbriel | Easy-going | Relaxed, conversational |
Zubenelgenubi | Casual | Informal, conversational |
Key management
Keys are loaded from ~/.gemini-tts-mcp/keys.json (a JSON array of strings), with env var fallback. The server rotates through the pool on each request, skipping failed keys per model. If all keys fail on one model, it falls back to the next model.
Use reload_keys() to refresh without restarting.
Security
API keys never leave your machine — the MCP server runs locally
.gitignoreexcludeskeys.jsonkeys.json.exampleprovided as a template
License
MIT
Available Tools
5 toolsgenerate_speechA
Generate speech audio from text using Gemini TTS.
Rotates across all configured API keys and falls back between models. Gemini TTS voices are multilingual — any voice speaks the language of the input text automatically.
Args: text: The text content to vocalize. voice_name: Gemini voice (use list_voices to browse). Default: Puck. style_instruction: Optional speaking-style hint prepended to text, e.g. "speak softly", "cheerfully", "in a calm tone". pitch_factor: Pitch adjustment. 1.0 = no change, >1 = higher, <1 = lower. model: Model override. Default: gemini-3.1-flash-tts-preview, falls back to gemini-2.5-flash-preview-tts. output_path: Optional custom output path for the WAV file.
Returns: Absolute path to the generated WAV file, or error description.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| model | No | ||
| voice_name | No | Puck | |
| output_path | No | ||
| pitch_factor | No | ||
| style_instruction | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses key behaviors: multilingual support, API key rotation, model fallback, style instruction prepending, pitch adjustment, and error return. It does not mention destructive nature or auth requirements, but for a TTS tool, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a brief intro, then a bullet-style Args list, then a Returns line. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (6 params, 1 required) and the presence of an output schema, the description covers all necessary information: functionality, parameter details, and return type. It is fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description's Args section explains every parameter (text, voice_name, style_instruction, pitch_factor, model, output_path) with defaults and usage details, fully compensating for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates speech audio from text using Gemini TTS. It mentions the key parameters and distinguishes itself from siblings (list_voices, etc.) by focusing on generation, not listing or management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the tool's behavior (rotates API keys, falls back between models) and implicitly tells when to use it (for generating speech). It cross-references list_voices for browsing voices, but does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voicesA
List all Gemini TTS voices with gender, tone, and description.
Optionally filter by gender and/or tone. Gemini TTS voices are multilingual — any voice speaks the language of the input text.
Args: filter_gender: Filter by "male", "female" (case-insensitive). filter_tone: Filter by tone name, e.g. "Soft", "Bright", "Firm", "Warm", "Upbeat", "Clear", "Smooth", "Informative", "Easy-going", etc. (case-insensitive).
Returns: A formatted table of matching voices.
| Name | Required | Description | Default |
|---|---|---|---|
| filter_tone | No | ||
| filter_gender | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains that voices are multilingual and can be filtered, but it does not disclose any potential behavioral traits such as pagination, rate limits, or data freshness. For a simple listing tool, this is adequate but not outstanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus clearly labeled Args and Returns sections. Every sentence adds value, and the structure is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two optional parameters and an existing output schema, the description is mostly complete. It notes the return is a 'formatted table', but could be slightly more specific about the exact fields in the output. Nonetheless, it covers the essential context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description adds significant value by explaining both parameters with examples and case-insensitivity. For filter_tone, it lists acceptable tone names, which is more informative than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and resource ('all Gemini TTS voices') and specifies that it includes gender, tone, and description. It distinguishes from sibling 'list_voices_by_gender' which likely only filters by gender, whereas this tool also supports tone filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates that filtering is optional and provides examples of filter values. However, it does not explicitly state when to use this tool versus the sibling 'list_voices_by_gender', nor does it provide guidance on when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voices_by_genderA
List Gemini TTS voices filtered by gender.
Args: gender: "male" or "female" (case-insensitive).
Returns: A formatted table of matching voices.
| Name | Required | Description | Default |
|---|---|---|---|
| gender | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions returning a formatted table, which is helpful, but it does not disclose whether the operation is read-only, any authentication needs, or potential side effects. Given the tool's simplicity, this is acceptable but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise (two sentences plus structured Args/Returns) with no superfluous content. The purpose is front-loaded, and each line serves a clear function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, no annotations, but an output schema assumed to exist, the description adequately covers purpose, parameter semantics, and return format. It omits error handling or empty result behavior, but for a simple filter tool, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, but the description's Args section explains the gender parameter accepts 'male' or 'female' (case-insensitive), adding meaningful semantics beyond the raw schema. This compensates well for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists Gemini TTS voices filtered by gender, with a specific verb and resource. It distinguishes from the sibling list_voices (which likely lists all voices) by adding the gender filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need voices of a specific gender) but does not explicitly state when to use this vs. list_voices or provide exclusions. Sibling context helps but is not leveraged in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pool_statusA
Check how many API keys are currently configured.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, but the description accurately conveys a read-only operation checking configured keys, which is sufficient for a simple tool with no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence that is front-loaded and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with an output schema, the description completely captures the tool's purpose and behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the description adds value by specifying what is checked (API key count), going beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Check') and the resource ('API keys'), and distinguishes it from sibling tools focused on speech generation and key reloading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit usage guidelines are provided, but the purpose is simple and obvious, making it adequate for a straightforward status check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reload_keysA
Reload API keys from ~/.gemini-tts-mcp/keys.json or env vars.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must fully convey behavior. It states it reloads keys but does not disclose side effects (e.g., overwriting, errors), success/failure indications, or whether it affects running requests. This is insufficient for a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one sentence, front-loaded with the verb 'Reload', and contains no filler. Every word is necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema present, the description adequately covers the key details (sources). However, it could mention that it returns a success status or errors, but given simplicity, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema provides complete coverage. The description adds value by naming the exact sources (~/.gemini-tts-mcp/keys.json and env vars), which is more specific than the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (reload API keys) and the specific sources (file or env vars). It differentiates from sibling tools (generate speech, list voices) which serve completely different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (after updating keys), but does not explicitly state when not to use or provide alternatives. The context is simple, so no exclusion is needed, but guidance is minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
generate_speech - First observed
list_voices - First observed
list_voices_by_gender - First observed
pool_status - First observed
reload_keys
TDQS
list_voices and list_voices_by_gender are redundant; list_voices already supports gender filtering via an argument, making the latter unnecessary and causing confusion.
Most tools follow verb_noun pattern (generate_speech, list_voices, reload_keys), but pool_status is a noun phrase and list_voices_by_gender includes a preposition, breaking the pattern slightly.
5 tools is reasonable for a TTS server, though list_voices_by_gender is redundant and could be removed without loss.
Covers core TTS functionality (generation, voice listing, key management), but lacks tools for voice details or configuration persistence.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Text-to-Speech
AI voice generation: text-to-speech and voice cloning from any MCP client.
MCP server for Google Veo AI video generation
MCP server exposing the AceDataCloud Fish Audio API (text-to-speech with voice conditioning)
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that leverages the Microsoft Edge TTS service to provide high-quality text-to-speech capabilities across over 80 languages. It enables users to generate audio files, query available voices, and create subtitle files using natural language commands.-
- AlicenseAqualityBmaintenanceMCP server for Google Gemini that enables image generation, editing, file analysis, and chat using browser cookies, no API key needed.652AGPL 3.0
- AlicenseBqualityCmaintenanceMCP server for generating images and audio using Google's Gemini AI models.22MIT
- AlicenseNot gradedqualityDmaintenanceA text-to-speech MCP server with 48 voices across 9 languages, supporting emotion spans, SFX tags, and multi-speaker dialogue. Deployable via a single npx command with built-in guardrails and swappable backends.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alarconcesar/gemini-tts-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server