OpenRouter Voice MCP
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., "@OpenRouter Voice MCPCreate voiceover MP3 for the script: 'Hello, welcome to my channel'."
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.
OpenRouter Voice MCP
A small MCP server (Python + FastMCP, stdio) that turns text into local audio files using OpenRouter speech models. Default model:
fish-audio/s2.1-pro-free:freeBuilt for Vietnamese video voiceover: Codex or Claude Code writes a narration
script, calls render_voiceover(), and gets back an absolute path to an MP3 it
can hand straight to FFmpeg.
Codex / Claude Code
| MCP stdio
OpenRouter Voice MCP
| HTTPS
OpenRouter -> fish-audio/s2.1-pro-free:free
|
MP3 bytes -> local file -> FFmpeg / video pipelineNo PyTorch, CUDA, local model downloads, local LLM, or local HTTP port. Just Python, three pure-Python packages and an OpenRouter API key.
Install
Requirements: Python >= 3.10 on PATH, plus ffmpeg if you want
render_long_voiceover() to concatenate segments. Get a free API key at
https://openrouter.ai/keys.
One command does everything -- venv, dependencies, .env, acceptance tests, and
registration with both Claude Code and Codex:
git clone https://github.com/Trandu1/mcp_voice.git D:\VoiceAI\openrouter-voice-mcp
cd D:\VoiceAI\openrouter-voice-mcp
.\install.ps1 -ApiKey "sk-or-v1-..." -RegisterManual equivalent, if you would rather see each step:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
copy .env.example .env # then set OPENROUTER_API_KEY=sk-or-v1-...
.\.venv\Scripts\python.exe tests\acceptance.pyOn macOS / Linux there is no install.ps1; use the manual steps with
python3 -m venv .venv and .venv/bin/python, then register as shown below.
Register with Claude Code
claude mcp add openrouter-voice --scope user -- `
D:\VoiceAI\openrouter-voice-mcp\.venv\Scripts\python.exe `
D:\VoiceAI\openrouter-voice-mcp\server.py
claude mcp get openrouter-voice # expect: ConnectedRegister with Codex
codex mcp add openrouter-voice -- `
D:\VoiceAI\openrouter-voice-mcp\.venv\Scripts\python.exe `
D:\VoiceAI\openrouter-voice-mcp\server.py
codex mcp list # expect: openrouter-voiceThe API key is read from .env next to server.py, so it never appears on a
command line or in either CLI's config file. You can also export
OPENROUTER_API_KEY in the environment instead — an exported value wins over
.env.
Related MCP server: MCP MeloTTS Audio Generator
Tools
Tool | What it does |
| Config + key status. Free auth probe only, never renders audio. |
| The main tool. Text -> local audio file. |
| Splits a long script into segments, renders each, concatenates with FFmpeg when available. |
| Short sample, written to |
| Every OpenRouter model with |
| Live provider / tier / pricing / voice-cloning support for one model. |
render_voiceover
render_voiceover(
text: str,
output_path: str = "", # absolute or relative; parents are created
voice: str = "", # empty = model default (correct for Fish Audio)
response_format: str = "", # "mp3" (default) or "pcm"
instructions: str = "", # only sent to providers that document it
overwrite: bool = False, # False never clobbers an existing file
reference_audio_path: str = "", # optional stateless voice cloning
reference_text: str = "",
)Returns:
{
"status": "ok",
"model": "fish-audio/s2.1-pro-free:free",
"audio_path": "D:\\campaigns\\abc\\audio\\narration.mp3",
"format": "mp3",
"content_type": "audio/mpeg",
"bytes": 123456,
"elapsed_seconds": 2.31,
"duration_seconds": 12.4,
"generation_id": "gen-..."
}Audio bytes are written to disk and never returned base64-encoded through MCP — the point is a real file for FFmpeg.
Configuration
All settings are environment variables (see .env.example):
Variable | Default | Notes |
| — | Required. Never logged or returned. |
|
| |
| empty | Fish Audio documents no preset voice ids; leave empty. |
|
|
|
|
| |
| empty | Sent only when set. |
|
| Sent as |
|
| Used when the caller passes no |
| empty | Leave empty. Only set it if you accept being billed for a paid model when the free one is down. |
What the API actually supports
Verified against the live OpenRouter Speech API and Models API (2026-08-25), not inferred from the older OpenAI TTS API:
Endpoint
POST https://openrouter.ai/api/v1/audio/speechreturns a raw audio byte stream. Only non-200 responses carry JSON.Top-level fields:
model,input,voice,response_format,speed,input_references,provider.response_formatismp3orpcm. The API defaults topcm, so this server always sends the format explicitly.instructionsis not a top-level field. It is an OpenAI provider option (provider.options.openai.instructions). Fish Audio documents no provider options, soinstructionsis dropped for Fish models and reported back inwarnings— no invented fields are ever sent.speedis only honoured by some providers (OpenAI, Azure); it is dropped elsewhere rather than silently ignored server-side.Fish Audio has no preset voice ids (
alloy/nova/shimmerbelong to OpenAI). Leavevoiceempty.Voice cloning is available: the endpoints API reports
supports_voice_cloning: trueforfish-audio/s2.1-pro-free:free. It is stateless — you pass a base64 audio sample ininput_referenceson every request. There is no persistentvoice_idto create, so this server has noclone_voicetool; usereference_audio_pathonrender_voiceoverinstead.Attribution headers are
HTTP-RefererandX-OpenRouter-Title.
Free-model limits
fish-audio/s2.1-pro-free:free is a free variant:
20 requests/minute, 50 requests/day (1000/day once ≥ $10 of credit has been purchased on the account).
Availability, queueing and latency are not guaranteed.
When the free model is unavailable the server returns a clear error. It never switches to a paid model unless you explicitly set
OPENROUTER_VOICE_FALLBACK_MODEL.
Transient failures (408, 429, 5xx, network errors) are retried twice with short exponential backoff. 400/401/403 are never retried.
Tests
.\.venv\Scripts\python.exe -m pytest tests -q --asyncio-mode=auto # unit, mocked HTTP
.\.venv\Scripts\python.exe tests\smoke_test.py # live, needs a key
.\.venv\Scripts\python.exe tests\acceptance.py # full checklistsmoke_test.py and the live half of acceptance.py skip cleanly without a key.
A skip is reported as SKIP, never as PASS.
Security
The API key lives in
.env(git-ignored) or the environment. It is never logged, never written to a command line, and never returned through MCP.health()andmodel_info()return configuration, never credentials.The server speaks stdio only and binds no TCP port.
It executes no shell commands from tool input. FFmpeg/ffprobe are invoked only on files this server just wrote, and only when present.
File writes go exactly where the caller asks (Codex needs to write into arbitrary campaign directories), but directories, invalid Windows filenames and reserved device names are rejected, and
overwrite=Falsenever clobbers.
License
MIT
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 Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to generate and play high-quality text-to-speech audio using the Kokoro model, with support for multiple voices, adjustable speaking speed, and audio caching.
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to convert text to high-quality speech audio using MeloTTS. Automatically splits long texts into segments, generates WAV files, and merges them using ffmpeg with support for multiple languages and customizable speech parameters.MIT
- AlicenseNot gradedqualityDmaintenanceProvides text-to-speech generation using the Kokoro-82M model, enabling AI assistants to generate voiceovers and audio content directly within Claude Desktop and Cursor.14Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables text-to-speech generation using the Groq API, supporting multiple audio formats and optional local playback.451MIT
Related MCP Connectors
Generate images, video, music and voice from your CLI or AI agent. On-brand AI media toolkit.
15 media & data tools for AI agents: search, transcribe, subtitles, voiceover, translate & more.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
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/Trandu1/mcp_voice'
If you have feedback or need assistance with the MCP directory API, please join our Discord server