Skip to main content
Glama

zvex MCP server

AI video dubbing as an MCP tool: hand it a video URL, get back a fully dubbed video in Russian, English or Spanish — keeping the original speakers' voices through per-speaker voice cloning.

Powered by zvex (声桥).

The server is a thin stdio client over zvex's HTTP API, so it runs anywhere Python does — no GPU, no local models.

Install

uvx zvex                # run it without installing anything
# or
uv tool install zvex    # install the `zvex` command
# or
pip install zvex

(Working from a source checkout instead? Use uv tool install ./mcp/zvex.)

Related MCP server: video-replication-mcp

Get an API key

  1. Sign in at https://tts.xalhar.top

  2. Open Account → API keys and create one

  3. Copy the zvex-… value — it is shown only once

Jobs are billed from the same credit balance as the web app, at a flat 10 credits per minute of video. A failed job is refunded in full.

Configure your MCP client

Claude Desktop (claude_desktop_config.json) or Cursor (.cursor/mcp.json):

{
  "mcpServers": {
    "zvex": {
      "command": "uvx",
      "args": ["zvex"],
      "env": {
        "ZVEX_API_KEY": "zvex-your-key-here"
      }
    }
  }
}

Variable

Required

Default

Meaning

ZVEX_API_KEY

yes

zvex-… key from the account page

ZVEX_BASE_URL

no

https://tts.xalhar.top

API base URL (self-hosted deployments)

Tools

Tool

Purpose

estimate_cost(minutes, tier)

Credit cost and current balance

submit_dubbing_job(video_url, target_language, tier)

Queue a dubbing job, returns job_id

get_job_status(job_id)

Poll once; final states carry the output URLs

wait_for_job(job_id, timeout_seconds)

Block until the job finishes

Typical flow:

submit_dubbing_job("https://example.com/episode-01.mp4", target_language="ru")
  → {"job_id": 42, "credits_cost": 240, "duration_sec": 1441.0, …}
wait_for_job(42)
  → {"status": "completed", "final_video_url": "…", "subtitle_url": "…"}

Notes

  • video_url must be a publicly reachable http(s) link, up to 500 MB.

  • target_language depends on the deployment (ru, en, es on the hosted service).

  • tier is fast, standard or professional — it selects which features are available, not the price.

  • One job per account runs at a time; a second submission returns HTTP 409.

  • Output links are served from the zvex domain and require being signed in there.

Development

uv venv --python 3.11 .venv-test
uv pip install --python .venv-test/bin/python -e .
ZVEX_API_KEY=zvex-… .venv-test/bin/python -m zvex.server

Available Tools

4 tools
estimate_costA

Estimate the credit cost of dubbing a video and check the credit balance.

Pricing is a flat 10 credits per minute for every tier (a tier only changes which features are available, not the price).

Args: minutes: Video length in minutes (0 < minutes <= 600). tier: "fast", "standard" or "professional".

Returns: JSON with credits, current balance and whether the balance is enough.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierNostandard
minutesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description discloses its read-only nature (estimate, not actual dub), the pricing model, and the return contents (credits, balance, sufficiency). It could mention that no credits are consumed, but the term 'estimate' strongly implies that, making this sufficient for a safe read operation.

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 tightly structured: purpose first, then pricing rule, then parameter explanations, then return summary. Every sentence earns its place and there is no fluff. It is long enough to be informative but not bloated.

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

Completeness5/5

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

For a simple estimation tool with two parameters and a known output (already described), the description covers all necessary aspects: what it does, how pricing works, parameter constraints, and return behavior. The presence of an output schema reduces the need for further detail, but the description already goes beyond it.

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

Parameters5/5

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

Schema coverage is 0%, but the description fully compensates: it explains minutes range (0-600) and valid tier values (fast/standard/professional), plus the flat pricing relationship that ties them together. This adds real meaning beyond the bare schema.

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 (estimate) and resource (credit cost of dubbing a video), plus a second purpose (checking credit balance). It is inherently distinct from siblings like submit_dubbing_job and get_job_status, so an agent can easily tell them apart.

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 purpose implies the use case: estimating cost and checking balance before submitting a job. While it doesn't explicitly name when not to use it or refer to alternatives, the context (sibling names) makes the intended usage clear. The flat pricing note adds useful whether-to-use information.

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

get_job_statusA

Check a dubbing job's status.

Once the status is "completed" the response also carries the dubbed video and subtitle download URLs. "failed" carries the error and means the credits were refunded.

Args: job_id: The job_id returned by submit_dubbing_job.

Returns: JSON with status ("processing" / "completed" / "failed" / "cancelled") and, for a completed job, final_video_url and subtitle_url.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

No annotations are provided, so the description fully carries the burden. It discloses the four possible statuses, the presence of download URLs on completion, the error field on failure, and the side effect of credit refund on failure. This goes well beyond the schema and covers key behavioral outcomes.

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

Conciseness4/5

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

The description is well-structured with a brief opening, followed by Args and Returns sections. It is slightly longer than strictly necessary, but every sentence adds useful detail (statuses, URLs, error handling). No redundancy or filler.

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

Completeness5/5

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

For a single-parameter status-check tool with an output schema, the description covers all essential information: possible statuses, what the response contains for each state, and the refund side effect. It is complete enough for an agent to call correctly and interpret results.

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

Parameters5/5

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

The schema only states job_id is an integer and required. The description adds the critical semantic context that job_id is the value returned by submit_dubbing_job, which fully explains how to obtain a valid input. With 0% schema description coverage, this is essential and well handled.

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 opens with a clear verb and resource: 'Check a dubbing job's status.' It explicitly ties job_id to submit_dubbing_job, which distinguishes it from the cost-estimation and submission tools. The resource and action are 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?

It clearly implies the tool is for checking status after submission, and references where job_id comes from. However, it does not explicitly contrast with the wait_for_job sibling or state when to prefer one over the other. The guidance is present but not explicit.

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

submit_dubbing_jobA

Submit a fully automatic dubbing job: a video URL in, a dubbed video out.

The server downloads the video, then runs speech recognition, speaker separation, translation, voice cloning/TTS and composition — no manual review step. Credits are charged up front based on the server-measured duration and refunded in full if the job fails.

The job runs in the background: use get_job_status to poll it, or wait_for_job to block until it finishes. Only one job per account may run at a time (a second submission returns HTTP 409).

Args: video_url: Publicly reachable http(s) video link (max 500 MB). target_language: Dubbing language, e.g. "ru", "en", "es" (depends on the deployment's supported set). tier: "fast", "standard" or "professional".

Returns: JSON with job_id, run_id, measured duration and the charged credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierNostandard
video_urlYes
target_languageNoru

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations to provide safety or read-only hints, the description carries the full burden of behavioral disclosure. It covers the background execution model, credit charging up front with refund on failure, and the concurrency limit. It does not mention rate limits or idempotency, but it gives a comprehensive picture of the tool's behavior beyond basic input/output. Since the description is very informative despite no annotations, score 4 is appropriate.

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 well-structured and detailed without being verbose. It front-loads the core purpose in the first sentence, then explains the pipeline, billing, execution model, and parameters in a logical flow. Each sentence adds value, and the Args and Returns sections are clearly segmented brief. No unnecessary repetition or fluff.

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

Completeness5/5

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

Given the tool's complexity (background job, pricing, concurrency) and the absence of annotations, the description covers all essential aspects: input requirements, parameter semantics, background execution, billing, concurrency, and how to track the job via siblings. The output schema exists and is referenced ('Returns: JSON with job_id, run_id...'), so return values are adequately conveyed. The tool is three parameters, and the description leaves no critical gap for correct invocation.

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 schema description coverage is 0%, so the description must compensate for the lack of parameter details. It does this thoroughly: it explains video_url (publicly reachable, max 500 MB), target_language (dubbing language with examples), and tier (options and default). This is significantly more than the schema provides, giving clear usage semantics for each parameter.

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 tool's function: submitting a fully automatic dubbing job with a video URL input and a dubbed video output. It enumerates the processing pipeline (speech recognition, speaker separation, translation, voice cloning/TTS, composition) and distinguishes it from siblings by noting the manual review absence. This is a specific verb-resource pair with comprehensive detail.

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

Usage Guidelines5/5

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

The description explicitly mentions sibling tools (get_job_status and wait_for_job) and explains when to use each: polling for background job status versus blocking until completion. It also notes the concurrency constraint (one job per account) and the HTTP 409 response for violations, which is critical for the agent to know. It provides clear context for when this tool should be invoked.

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

wait_for_jobA

Block until a dubbing job reaches a final state, then return its result.

Convenience wrapper around get_job_status for callers that just want the finished video. Dubbing typically takes a small multiple of the video's own length, so keep the timeout generous.

Args: job_id: The job_id returned by submit_dubbing_job. timeout_seconds: Give up after this long (default 1800, max 7200).

Returns: JSON with the final status and, when completed, the output URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
timeout_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 does a solid job: it discloses blocking behavior, the final-state condition, timeout behavior, and the return shape. It even gives a practical heuristic about dubbing duration to guide timeout configuration. Minor gaps remain around what happens exactly on timeout, but the core behavior is transparent.

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 well-structured with a clear purpose sentence followed by Args and Returns sections. Every sentence earns its place: the wrapper explanation, the duration heuristic, and the parameter semantics are all useful and there is no filler or redundancy.

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 two-parameter convenience wrapper, the description covers purpose, parameter meaning, timeout guidance, and return content. Since an output schema is present, explaining return values in depth is not required. It could be slightly more explicit about timeout failure behavior or when to fall back to get_job_status, but nothing essential is missing for a correct call.

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?

Schema description coverage is 0%, so the description must add meaning beyond the raw schema, and it does. It explains that job_id comes from submit_dubbing_job and gives timeout_seconds a default (1800) and maximum (7200) that are not present in the schema. The only weakness is that it stops short of describing the timeout result behavior in detail.

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 opens with a specific verb and resource: 'Block until a dubbing job reaches a final state, then return its result.' It also distinguishes itself from get_job_status by calling itself a 'convenience wrapper' for callers that just want the finished video, which clearly differentiates it from the sibling polling tool.

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 explicitly names get_job_status as the underlying tool and frames wait_for_job as the right choice for callers that 'just want the finished video,' giving clear context for when to use it. It does not explicitly state when to prefer get_job_status (e.g., for incremental polling), but the implied usage is strong and the alternative is named.

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. 4 tool updatesv0.1.1
    • First observedestimate_cost
    • First observedget_job_status
    • First observedsubmit_dubbing_job
    • First observedwait_for_job

TDQS

A4.6/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: cost estimation, job submission, status polling, and blocking wait. There is no overlap or ambiguity; an agent can easily select the right tool for each step of the workflow.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (estimate_cost, submit_dubbing_job, get_job_status, wait_for_job). The naming is uniform and predictable, making the API easy to learn and use.

Tool Count5/5

With 4 tools, the server is well-scoped for a dubbing service. Each tool covers a necessary step: cost estimation, job submission, status checking, and a convenience wait method. There are no redundant or missing tools that would bloat or underrepresent the functionality.

Completeness4/5

The core dubbing lifecycle is covered: estimate cost, submit job, poll status, and retrieve output. A minor gap is the lack of a cancel operation (though status mentions 'cancelled'), but it is not a critical dead end. The workflow is fully functional without it.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers