Skip to main content
Glama
OpenRouter Voice MCP
by Trandu1

OpenRouter Voice MCP

텍스트를 OpenRouter 음성 모델을 사용해 로컬 오디오 파일로 변환하는 소형 MCP 서버(Python + FastMCP, stdio)입니다. 기본 모델:

fish-audio/s2.1-pro-free:free

베트남어 영상 더빙을 위해 제작되었습니다: Codex 또는 Claude Code가 내레이션 스크립트를 작성하고, render_voiceover()를 호출하면 FFmpeg에 바로 전달할 수 있는 MP3의 절대 경로를 반환받습니다.

Codex / Claude Code
        |  MCP stdio
OpenRouter Voice MCP
        |  HTTPS
OpenRouter  ->  fish-audio/s2.1-pro-free:free
        |
    MP3 bytes  ->  local file  ->  FFmpeg / video pipeline

PyTorch, CUDA, 로컬 모델 다운로드, 로컬 LLM, 로컬 HTTP 포트는 없습니다. Python과 순수 Python 패키지 3개, 그리고 OpenRouter API 키만 있으면 됩니다.


설치

요구 사항: PATH에 Python >= 3.10, 그리고 render_long_voiceover()로 세그먼트를 연결하려면 ffmpeg가 필요합니다. 무료 API 키는 https://openrouter.ai/keys에서 받으세요.

한 줄이면 모든 것이 완료됩니다 — venv, 의존성, .env, 승인 테스트, Claude Code와 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-..." -Register

각 단계를 직접 확인하고 싶다면 수동으로 동일하게 진행하는 방법:

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.py

macOS/Linux에는 install.ps1이 없습니다. python3 -m venv .venv와 .venv/bin/python으로 수동 단계를 수행한 후 아래와 같이 등록하세요.

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: Connected

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-voice

API 키는 server.py 옆의 .env에서 읽어오므로 명령줄이나 두 CLI의 설정 파일에 절대 노출되지 않습니다. 대신 환경 변수로 OPENROUTER_API_KEY를 내보낼 수도 있습니다 — 내보낸 값이 .env보다 우선합니다.


Related MCP server: MCP MeloTTS Audio Generator

도구

도구

기능

health()

설정 + 키 상태. 무료 인증 프로브 전용이며 오디오를 렌더링하지 않습니다.

render_voiceover(...)

핵심 도구. 텍스트 -> 로컬 오디오 파일.

render_long_voiceover(...)

긴 스크립트를 세그먼트로 분할하고 각각을 렌더링한 후, FFmpeg가 있으면 연결합니다.

preview_voice(text, voice)

짧은 샘플을 <output_dir>/previews에 작성하고 기본 플레이어로 엽니다.

list_speech_models()

output_modalities: speech가 있는 모든 OpenRouter 모델(id, 이름, 가격).

model_info(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 = "",
)

반환 값:

{
  "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-..."
}

오디오 바이트는 디스크에 기록되며 MCP를 통해 base64로 인코딩되어 반환되는 일은 절대 없습니다 — 핵심은 FFmpeg용 실제 파일입니다.


설정

모든 설정은 환경 변수입니다(.env.example 참조):

변수

기본값

참고

OPENROUTER_API_KEY

—

필수. 로그에 남지 않으며 반환되지 않습니다.

OPENROUTER_VOICE_MODEL

fish-audio/s2.1-pro-free:free

OPENROUTER_VOICE

비어 있음

Fish Audio는 사전 설정 음성 ID를 문서화하지 않습니다. 비워 두세요.

OPENROUTER_AUDIO_FORMAT

mp3

mp3 또는 pcm.

OPENROUTER_TIMEOUT_SECONDS

120

OPENROUTER_HTTP_REFERER

비어 있음

설정된 경우에만 전송됩니다.

OPENROUTER_APP_TITLE

OpenRouter Voice MCP

X-OpenRouter-Title로 전송됩니다.

VOICE_OUTPUT_DIR

%USERPROFILE%\OpenRouterVoice\output

호출자가 output_path를 전달하지 않을 때 사용됩니다.

OPENROUTER_VOICE_FALLBACK_MODEL

비어 있음

비워 두세요. 무료 모델이 다운되었을 때 유료 모델에 대한 청구를 수락하는 경우에만 설정하세요.


API가 실제로 지원하는 것

오래된 OpenAI TTS API에서 추론한 것이 아니라, 라이브 OpenRouter Speech API 및 Models API(2026-08-25)에서 검증된 내용입니다:

  • 엔드포인트 POST https://openrouter.ai/api/v1/audio/speech는 원시 오디오 바이트 스트림을 반환합니다. JSON을 담은 응답은 200이 아닌 경우뿐입니다.

  • 최상위 필드: model, input, voice, response_format, speed, input_references, provider.

  • response_format은 mp3 또는 pcm입니다. API 기본값은 pcm 이므로 이 서버는 항상 형식을 명시적으로 전송합니다.

  • instructions는 최상위 필드가 아닙니다. OpenAI 제공자 옵션(provider.options.openai.instructions)입니다. Fish Audio는 제공자 옵션을 문서화하지 않으므로 instructions는 Fish 모델에서 제외되며 warnings에 보고됩니다 — 발명된 필드는 절대 전송되지 않습니다.

  • speed는 일부 제공자(OpenAI, Azure)에서만 지원됩니다. 다른 곳에서는 서버 측에서 조용히 무시하는 대신 제외됩니다.

  • Fish Audio에는 사전 설정 음성 ID가 없습니다(alloy / nova / shimmer는 OpenAI의 것입니다). voice는 비워 두세요.

  • 음성 복제는 가능합니다: endpoints API는 fish-audio/s2.1-pro-free:free에 대해 supports_voice_cloning: true를 보고합니다. 이는 상태 비저장 방식입니다 — 요청마다 input_references에 base64 오디오 샘플을 전달합니다. 생성할 영구적인 voice_id가 없으므로 이 서버에는 clone_voice 도구가 없습니다. 대신 render_voiceover의 reference_audio_path를 사용하세요.

  • 속성 헤더는 HTTP-Referer와 X-OpenRouter-Title입니다.

무료 모델 한도

fish-audio/s2.1-pro-free:free는 무료 변형입니다:

  • 분당 20회 요청, 하루 50회 요청(계정에서 $10 이상의 크레딧을 구매한 경우 하루 1000회).

  • 가용성, 대기열, 지연 시간은 보장되지 않습니다.

  • 무료 모델을 사용할 수 없으면 서버는 명확한 오류를 반환합니다. OPENROUTER_VOICE_FALLBACK_MODEL을 명시적으로 설정하지 않는 한 절대 유료 모델로 전환하지 않습니다.

일시적 오류(408, 429, 5xx, 네트워크 오류)는 짧은 지수 백오프로 두 번 재시도됩니다. 400/401/403은 재시도되지 않습니다.


테스트

.\.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 checklist

smoke_test.py와 acceptance.py의 라이브 절반은 키 없이도 깔끔하게 건너뜁니다. 건너뜀은 SKIP으로 보고되며 PASS로 보고되지 않습니다.


보안

  • API 키는 .env(git 무시 대상) 또는 환경 변수에 있습니다. 로그에 남지 않고, 명령줄에 기록되지 않으며, MCP를 통해 반환되지 않습니다.

  • health()와 model_info()는 설정을 반환할 뿐 자격 증명은 반환하지 않습니다.

  • 이 서버는 stdio만 사용하며 TCP 포트를 바인딩하지 않습니다.

  • 도구 입력에서 셸 명령을 실행하지 않습니다. FFmpeg/ffprobe는 이 서버가 방금 작성한 파일에 대해서만, 그리고 존재할 때만 호출됩니다.

  • 파일 쓰기는 호출자가 요청한 위치에 정확히 수행되지만(Codex는 임의의 캠페인 디렉터리에 써야 함), 디렉터리, 잘못된 Windows 파일 이름, 예약된 장치 이름은 거부되며 overwrite=False는 절대 덮어쓰지 않습니다.

라이선스

MIT

Available Tools

6 tools
healthA

Report MCP configuration status without spending a TTS request.

Checks that the API key is configured, echoes the active model, endpoint and output directory, and does one free auth probe against OpenRouter. The API key itself is never returned.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it acquits itself well: it discloses that it checks API key configuration, echoes the model/endpoint/output directory, performs one free auth probe against OpenRouter, and explicitly guarantees the API key is never returned. The one slightly under-specified item is what the 'auth probe' entails, but overall this is thorough disclosure for an annotation-free tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences with the key differentiator (no TTS cost) front-loaded. Every sentence earns its place: the first states the core purpose, the second details what is checked, and the third covers the privacy guarantee. No filler or redundant restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless diagnostic tool with an output schema (which exempts the description from explaining return values), this is close to complete: it covers what it checks, the free nature of the call, and the safety guarantee. The only minor gap is that it could explicitly frame the 'verify config before rendering' pattern, though the no-TTS-cost phrasing largely implies it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and the schema is empty, so the description correctly focuses on behavior rather than arguments — nothing to explain for parameters. Per the baseline for parameterless tools, a 4 is appropriate; the description adds no param details because none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — "Report MCP configuration status" — and immediately distinguishes it from the speech-generation siblings (preview_voice, render_voiceover, render_long_voiceover) by framing it as a diagnostic operation rather than a generation operation. An agent can tell this is the config/health check at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The lead phrase "without spending a TTS request" provides clear context for when to pick this tool — it's the free, non-billable diagnostic — which implicitly contrasts with the rendering siblings that consume TTS. However, it stops short of explicit exclusions or direct routing to an alternative (e.g., it never says 'use render_voiceover when you actually need audio'). The context is clear but the when-not guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_speech_modelsA

List the OpenRouter models whose output modality is speech.

Returns id, name and pricing only. Use this to point OPENROUTER_VOICE_MODEL at a different provider without touching the code.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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 discloses the exact output scope ('Returns id, name and pricing only') and implies a read-only list operation, but it does not explicitly state whether it is read-only, whether authentication is required, or any rate limits. The note about pointing the environment variable is useful context, but key behavioral traits are left implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose and immediately followed by return details and a practical use case. No wasted words; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an existing output schema, the description is complete for a simple list tool. It covers the purpose, return scope, and a usage scenario. It does not mention prerequisites like authentication, but that is minor and not critical for this zero-parameter, read-oriented tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema already covers everything. The description need not explain parameters; the baseline for no params is 4. It does not add parameter-specific meaning, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and a precise resource filter ('OpenRouter models whose output modality is speech'). It clearly distinguishes from siblings like render_voiceover or model_info by focusing on listing speech-enabled models with a specific output scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a concrete use case: 'Use this to point OPENROUTER_VOICE_MODEL at a different provider without touching the code.' This tells the agent when to invoke it. It does not explicitly contrast with alternatives or mention when not to use it, but the clear purpose and sibling names make the context unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

model_infoA

Live details for the configured speech model (or the one you name).

Pricing, tier and voice-cloning support come from the OpenRouter endpoints API; anything OpenRouter does not report is returned as "unknown".

NameRequiredDescriptionDefault
modelNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must disclose behavioral traits on its own. It does state that data comes from the OpenRouter endpoints API and that missing fields are returned as 'unknown'. It implies a read-only fetch operation, but it does not explicitly state that it makes no modifications, nor does it cover potential errors or rate limits. The disclosure of the external dependency and the 'unknown' fallback adds value, but the description does not fully characterize the tool's side-effect profile. Without annotations, this is a partial disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and gets straight to the point. The first sentence states the core purpose, the second explains the data source and handling of missing information. There is no fluff or redundant detail. Every sentence earns its place, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only tool with no annotations, the description covers the essential aspects: what it does, the source of data, and the fallback for missing values. An output schema exists, so return format is implicitly covered. It doesn't address potential error cases or explicitly state that it is a read-only operation, but given its simplicity, the description is nearly complete. The main gap is the lack of explicit guidance on when to choose this over list_speech_models, but that is more of a usage guideline than completeness for calling the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema declares a single optional string parameter 'model' with a default of an empty string, but provides no further explanation. The description directly explains the parameter semantics: if a model is named, details for that model are returned; otherwise, the configured default is used. This adds essential meaning beyond the schema and clarifies the behavior for both empty and non-empty values. It could go further by specifying the expected format (e.g., model ID or name), but it is largely sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides live details for a speech model, either the configured default or a specific one named by the user. It specifies the data points (pricing, tier, voice-cloning support) and the data source, distinguishing it from sibling list_speech_models which would list models rather than give details. The verb is implied ('get') but the resource is specific and the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: you call it to get details about a specific model or the configured default. However, it does not explicitly mention when to use this tool versus list_speech_models or other siblings, nor does it provide any exclusions or conditions (e.g., 'use this when you need details, list_speech_models for a list'). The context is clear enough, but there is no explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_voiceA

Render a short sample so you can hear a voice before a full render.

Writes into <output_dir>/previews and, on Windows, opens it with the default player. Playback is best-effort: if it fails, audio_path is still returned.

NameRequiredDescriptionDefault
playNo
textYes
voiceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and discloses key behaviors: writes to <output_dir>/previews, auto-opens with the default player on Windows, playback is best-effort, and audio_path is still returned on failure. This is rich behavioral disclosure covering side effects, platform dependence, and error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no filler. The primary purpose is front-loaded in the first sentence, and the second sentence packs essential behavioral details efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the description covers the core purpose, side effects, and failure behavior. The output schema exists, so return values are documented elsewhere. However, the lack of explicit parameter explanations is a gap that prevents this from being a fully self-contained description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero parameter descriptions, so the description must compensate. It only loosely implies that 'text' is the content to render and 'voice' refers to a voice, but it never explicitly explains these or the 'play' parameter. This is a significant gap since an agent cannot reliably infer parameter meanings from the description alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Render a short sample') and a clear purpose ('so you can hear a voice before a full render'), which distinguishes it from the full rendering sibling tools. The resource and scope are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly indicates the tool is meant for pre-render previews via 'before a full render', giving context on when to use it. However, it does not explicitly mention alternative tools like render_voiceover or render_long_voiceover, so it misses a direct comparison that would strengthen the guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_long_voiceoverA

Render a long script by splitting it into segments and rendering each.

Splits on paragraph, then sentence, then word boundaries -- never mid-word. Short scripts fall through to a single request. When FFmpeg is available and the format is mp3, the segments are stream-copy concatenated into output_path; otherwise the segment paths are returned for the caller to join.

NameRequiredDescriptionDefault
textYes
voiceNo
max_charsNo
overwriteNo
output_pathNo
response_formatNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure and does so admirably. It explains the splitting algorithm (paragraph → sentence → word, never mid-word), the fallback for short scripts, and the output behavior (stream-copy concatenation to output_path when FFmpeg and mp3 are available, otherwise returning segment paths). This openly conveys the tool's decision logic and expected results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the purpose in the first sentence and then provides two specific, high-value behavioral details in the second. Every sentence contributes meaning without repetition or filler, 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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (splitting, conditional concatenation) and the presence of an output schema, the description covers the core behavior thoroughly. It explains the main edge case (FFmpeg absent) and the segmentation rule. It does not address overwrite semantics or what happens when output_path is empty, but these are secondary and the output schema may provide return details. Overall, it is nearly complete for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does mention output_path and response_format indirectly (through the FFmpeg/mp3 condition) and implies max_chars via segmentation, but it does not explicitly define any parameter. Voice and overwrite are left entirely to the schema, which carries no descriptions. The description adds some meaning but is incomplete for a tool with six parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'render' and the resource 'a long script', and immediately explains the core mechanism (splitting into segments and rendering each). It differentiates from the sibling render_voiceover by targeting long scripts and explicitly describing the segmentation boundaries, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong context: it mentions that short scripts fall through to a single request, which implies this tool is for long scripts and handles both cases. However, it does not explicitly name the sibling render_voiceover as the alternative for short scripts, nor does it state when not to use this tool. The guidance is clear but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_voiceoverB

Render narration text to a local audio file via OpenRouter.

NameRequiredDescriptionDefault
textYesThe narration script. Vietnamese diacritics are preserved verbatim.
voiceNoProvider voice id. Leave empty to use the model's default -- Fish Audio documents no preset voice ids, so empty is correct there.
overwriteNoFalse (default) never clobbers an existing file -- a numbered sibling is written instead and returned as audio_path.
output_pathNoAbsolute or relative destination file (e.g. "D:/campaigns/abc/audio/narration.mp3"). Parent directories are created. Leave empty to write into the configured output directory.
instructionsNoTone direction. Only forwarded to providers that document it (currently OpenAI); otherwise reported back in "warnings".
reference_textNoOptional transcript of the reference sample.
response_formatNo"mp3" (default) or "pcm".
reference_audio_pathNoOptional local audio sample for stateless voice cloning on models that support it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing side effects and behavioral traits. The one-sentence description only states the basic action—rendering text to a file—but does not disclose overwrite behavior, provider-specific quirks, file creation details, or failure modes. The rich behavioral details are buried in parameter descriptions, but the main description fails to summarize them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that states the core purpose without unnecessary words. It is front-loaded and immediately communicates what the tool does. There is no bloat, and the sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, full schema coverage, and an output schema, the description is not required to explain every parameter. However, it lacks contextual guidance on when to use this tool versus alternatives, and does not hint at the short/long distinction that the sibling names imply. The description is adequate for the basic function but incomplete for selection decisions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description itself adds no parameter-specific meaning beyond what the schema already provides. However, the schema descriptions are detailed (e.g., overwrite behavior, forward-only for instructions, numbering of siblings), which makes the overall parameter handling strong. Since the description text does not augment the schema, it stays at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('render') and resource ('narration text to a local audio file') and mentions the transport ('via OpenRouter'). However, it does not explicitly differentiate from the sibling 'render_long_voiceover' other than by name, which leaves some ambiguity about when each is appropriate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus its siblings (e.g., render_long_voiceover, preview_voice). It does not mention prerequisites, typical scenarios, or alternatives. The agent must infer usage from the name and parameter descriptions, which is insufficient.

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.

  1. 6 tool updatesv1.0.0
    • First observedhealth
    • First observedlist_speech_models
    • First observedmodel_info
    • First observedpreview_voice
    • First observedrender_long_voiceover
    • First observedrender_voiceover

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: health for configuration status, preview_voice for a sample, render_voiceover for standard text-to-speech, render_long_voiceover for long scripts with splitting, list_speech_models for enumerating models, and model_info for details on a specific model. No overlaps in functionality.

Naming Consistency4/5

Most tools follow a verb_noun pattern (preview_voice, render_voiceover, list_speech_models), but 'health' and 'model_info' are arguably nouns instead of commands. Minor inconsistency in verb usage, but overall naming is clear and predictable.

Tool Count5/5

With 6 tools, the server is well-scoped for a text-to-speech utility. Each tool addresses a distinct need—status, preview, rendering, long rendering, model discovery, and model details—without unnecessary extras.

Completeness5/5

The tool surface covers the full lifecycle of using OpenRouter's TTS: checking configuration, previewing voices, rendering short and long audio, listing available models, and querying model attributes. No obvious dead ends or critical missing operations.

Related MCP Connectors

Related MCP Servers