video-mcp
This server provides an end-to-end local video captioning, transcription, subtitle generation, and Kdenlive project creation pipeline—no cloud APIs required.
Video Inspection:
video.inspectretrieves normalized media metadata using FFprobe (duration, resolution, codecs, frame rate, audio info, etc.).Audio Transcription:
video.transcriberuns local ASR backends (Whisper.cpp or Parakeet) on normalized audio, with configurable device (CPU/CUDA/auto), language, threading, and overwrite options; outputs timestamped transcript JSON.Transcript Cleaning:
subtitle.cleanrefines transcripts using an optional local LLM (llama.cpp/Qwen) or deterministic fallback to fix punctuation, capitalization, and ASR errors.Subtitle Export:
subtitle.export_srtandsubtitle.export_assconvert normalized transcript JSON into SRT or styled ASS subtitle files, with configurable styling and resolution.Full Captioning Pipeline:
video.captionperforms the entire workflow in one call—inspect video, extract audio, transcribe, clean, export SRT/ASS, and optionally create a preview.Preview Rendering:
video.create_preview(aliasvideo.render) burns ASS subtitles into a fast, downscaled MP4 preview via FFmpeg.Kdenlive Project Creation:
project.create_kdenlivegenerates an editable Kdenlive project from a video and SRT subtitle file.
All tools are designed to work locally, with configurable paths for executables and models, including Windows support.
Creates editable Kdenlive project files containing the source video and generated subtitle track.
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., "@video-mcptranscribe video.mp4 and export subtitles"
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.
subtitle-machine-kdenlive
An app/MCP that allows for programmatic use of Kdenlive by MCP to add subtitles to videos.
Development setup
The project targets Python 3.11+ and uses uv to manage its local virtual environment and locked dependencies. Development currently pins Python 3.12.
uv sync
uv run video-mcp --version
uv run pytestLinting and formatting use ruff:
uv run ruff check src tests scripts
uv run ruff format src tests scriptsCI runs the linter, format check, and locked test suite on both Ubuntu and
both Ubuntu and Windows for pull requests and pushes to main. The local
smoke test remains opt-in because hosted runners do not provide the native
FFmpeg, Whisper.cpp, Kdenlive, or model installation used by the full local
workflow.
Before creating a version tag, follow the release checklist to repeat the locked checks and validate the documented workflow on a clean Windows machine.
Copy video-mcp.example.yaml to the machine-local video-mcp.yaml when you
want to customize executable, model, or output paths. The local file is ignored
by Git. Environment variables such as VIDEO_MCP_FFMPEG,
VIDEO_MCP_WHISPER_CPP, VIDEO_MCP_PARAKEET, VIDEO_MCP_ASR_MODEL,
VIDEO_MCP_ASR_DEVICE, VIDEO_MCP_LLM_ENABLED, VIDEO_MCP_LLM_MODEL, and
VIDEO_MCP_WORKSPACE override YAML values.
Print the effective configuration with:
uv run video-mcp --config video-mcp.example.yaml configRun the local environment diagnostic with:
uv run video-mcp --config video-mcp.example.yaml doctor
uv run video-mcp --config video-mcp.example.yaml doctor --jsonInspect a source video and extract the normalized ASR audio with:
uv run video-mcp --config video-mcp.example.yaml inspect "C:\Videos\Test Video.mp4"
uv run video-mcp --config video-mcp.example.yaml extract-audio "C:\Videos\Test Video.mp4"The inspection output is normalized application data from FFprobe. Audio
extraction creates a mono, 16 kHz, 16-bit PCM WAV in the configured workspace;
existing output is preserved unless --overwrite is supplied.
Transcribe a normalized audio file with the configured ASR backend:
uv run video-mcp --config video-mcp.example.yaml transcribe "work\Test Video.wav" --device cpuThis writes a versioned *.transcript.raw.json file containing segment and
token timestamps. The source audio is never modified. Whisper.cpp remains the
default backend; Parakeet is an optional experimental backend selected with
asr.backend: parakeet and a configured Q8 model path.
Select Whisper execution with --device cpu, --device cuda, or
--device auto. CPU adds Whisper.cpp's --no-gpu flag; CUDA selects GPU
device 0; and auto tries the default GPU path before retrying on CPU when
the native command fails. video-mcp doctor reports NVIDIA hardware and the
Whisper CUDA backend separately, because a GPU driver alone does not mean the
installed Whisper binary includes CUDA support.
On Windows, install the official CUDA-enabled Whisper bundle with the repository script. It downloads the v1.8.5 x64 cuBLAS 12.4 archive, verifies its SHA-256, and installs it side-by-side with any CPU build:
powershell -ExecutionPolicy Bypass -File scripts\install_whisper_cuda.ps1The example configuration points to
C:/Tools/whisper-cuda/12.4/Release/whisper-cli.exe after installation.
Export normalized transcript data as SRT:
uv run video-mcp --config video-mcp.example.yaml export-srt "work\Test Video.transcript.raw.json"SRT cue numbers are generated deterministically, timestamps are validated for
ordering and overlap, and existing output is preserved unless --overwrite is
supplied.
Export the same transcript as styled ASS for FFmpeg rendering or Kdenlive:
uv run video-mcp --config video-mcp.example.yaml export-ass "work\Test Video.transcript.raw.json"The initial clean preset uses a readable white Arial style with outline and
shadow settings, and the ASS play resolution can be adjusted with --width
and --height.
Create a fast burned-in preview from the source video and ASS file:
uv run video-mcp --config video-mcp.example.yaml create-preview `
"C:\Videos\Test Video.mp4" `
"work\Test Video.ass"Preview rendering uses FFmpeg, preserves the source video, and defaults to a
1280-pixel-wide H.264/AAC output. Use --width and --overwrite as needed.
Run the complete local caption pipeline with one command:
uv run video-mcp --config video-mcp.example.yaml caption `
"C:\Videos\Test Video.mp4" `
--device cpuThis creates a job directory containing source.json, normalized audio,
transcript.raw.json, transcript.cleaned.json, subtitles.srt,
subtitles.ass, and captioned-preview.mp4. Re-running reuses existing
artifacts; use --overwrite to regenerate them.
Every caption invocation returns a unique job_id and writes structured JSON
stage logs to stderr (including the input, ASR backend/device, artifact paths,
and segment count). This keeps --json results on stdout machine-readable
while making it easy to trace a local job or diagnose a failed stage.
When an ASR backend provides word timestamps but coarse segments, deterministic formatting splits oversized speech into timestamped caption cues before SRT and ASS export. It favours sentence and phrase endings and uses the configured line capacity as its character limit.
Subtitle cleanup is deterministic by default. To enable optional local LLM
cleanup, install llama.cpp, download a compatible GGUF model, and set its
path in video-mcp.yaml. The direct llama-cli.exe adapter remains available
for compatible models. For Qwen 3.5, run the local OpenAI-compatible
llama-server.exe endpoint; it applies the chat template before constrained
JSON decoding.
Start the server on localhost:
C:\Tools\llama\llama-server.exe -m C:\Models\llama\Qwen3.5-2B-Q4_K_M.gguf `
--host 127.0.0.1 --port 8087 --no-webui --reasoning offThen configure the endpoint:
tools:
llama_cpp: "C:/Tools/llama/llama-server.exe"
llm:
enabled: true
model: "C:/Models/llama/Qwen3.5-2B-Q4_K_M.gguf"
server_url: "http://127.0.0.1:8087/v1/chat/completions"
max_segments_per_chunk: 8
max_chars_per_chunk: 2400
max_tokens: 512The LLM receives bounded transcript chunks and must return a strict segment
schema, so timing and segment IDs remain unchanged. If the executable, model,
server, or response is unavailable or invalid, the pipeline records a warning
and falls back to deterministic cleanup. The same service is available through
the MCP subtitle.clean tool.
The cleanup service is also available directly from the CLI:
uv run video-mcp --config video-mcp.example.yaml clean `
"work\Test Video.transcript.raw.json" `
--output "work\Test Video.transcript.cleaned.json"Run the local-tool smoke test to generate a tiny synthetic video and verify FFprobe, FFmpeg audio extraction, SRT/ASS export, and preview rendering. It does not invoke Whisper or download any model weights:
uv run python scripts/smoke_test.py --config video-mcp.example.yamlCreate an editable Kdenlive project from the generated SRT:
uv run video-mcp --config video-mcp.example.yaml kdenlive `
"C:\Videos\Test Video.mp4" `
--subtitles "work\Test Video\subtitles.srt"The project defaults to work\Test Video-captioned.kdenlive and writes the
required sibling Test Video-captioned.kdenlive.srt. Use --output to choose
another project path and --overwrite to replace existing project assets.
Editable Kdenlive export currently requires SRT; ASS remains the asset used
for FFmpeg burned-in previews.
Run the thin MCP server over stdio:
uv run video-mcp-serverThe MCP layer exposes the tested direct services for inspection, local transcription, captioning, preview rendering, SRT/ASS export, and Kdenlive project creation. It does not duplicate media-processing logic or require a running Kdenlive GUI.
The experimental Parakeet backend can be selected in video-mcp.yaml:
tools:
parakeet: "C:/Tools/parakeet/build-1.9.2/bin/Release/parakeet-cli.exe"
asr:
backend: parakeet
model: "C:/Models/parakeet/ggml-parakeet-tdt-0.6b-v3-q8_0.bin"On Windows, build the pinned CPU runtime and download the verified Q8 model with CMake and Visual Studio Build Tools installed:
powershell -ExecutionPolicy Bypass -File scripts\install_parakeet.ps1This installs the v1.9.2 parakeet-cli build under C:\Tools\parakeet and
the 668.8 MB model under C:\Models\parakeet. Parakeet remains experimental
and Whisper.cpp remains the default backend.
Compare it with Whisper on normalized WAV fixtures using:
uv run python scripts/benchmark_asr.py --backend parakeet `
--model "C:\Models\parakeet\ggml-parakeet-tdt-0.6b-v3-q8_0.bin" `
--reference-dir benchmarks/references work\sample\audio.wavResults belong in benchmarks/asr-results.md; model weights and generated
audio stay outside Git. Each JSON result includes wall time, real-time factor,
and best-effort peak_process_memory_mib plus peak_gpu_memory_mib for the
ASR process. GPU memory is sampled with nvidia-smi; gpu_memory_scope is
process when the driver identifies the ASR PID, or device_delta when a
Windows WDDM driver only exposes whole-device memory usage.
Codex Implementation Brief — Windows Local Video Subtitle MCP
Related MCP server: youtube-mcp
Goal
Build a local-first Windows application/MCP server that can:
Take an existing video file.
Transcribe its speech locally.
Generate well-formatted subtitles.
Produce SRT and ASS subtitle files.
Render a subtitled preview/final video using FFmpeg.
Optionally create an editable Kdenlive project containing the video and subtitles.
Expose these operations as deterministic MCP tools for Codex/Claude/other MCP clients.
The application must work without cloud APIs.
Primary target environment:
Windows 10/11 x64
Kdenlive installed locally
CPU-first execution
NVIDIA GTX 1660-class GPU with ~4 GB VRAM available as optional acceleration
Local filesystem input/output
Do not design around requiring the GPU.
Architectural Principle
Do NOT build a remote-control wrapper around the Kdenlive GUI.
Kdenlive is an optional editor/handoff target.
The core product is a deterministic local video-processing pipeline:
Video
↓
Media inspection
↓
Audio extraction
↓
Local ASR
↓
Normalized subtitle data
↓
Subtitle cleanup / formatting
↓
SRT + ASS
↓
┌───────────────┬─────────────────┐
↓ ↓
FFmpeg render Kdenlive project
↓ ↓
MP4 Editable projectMCP sits on top of this pipeline.
Every core operation must also be callable directly from Python without MCP.
Technology Stack
Use Python 3.11+.
Use the current official MCP Python SDK v2.
Initial MCP transport:
stdioDo not make HTTP transport necessary for v1.
Core external executables:
ffmpeg.exe
ffprobe.exe
whisper.cpp executable
Kdenlive / MLT tooling where appropriatePrefer subprocess invocation of stable native tools over large Python ML dependency stacks.
Use pathlib for all filesystem operations.
Windows paths containing spaces must work correctly.
Never construct shell command strings. Pass subprocess arguments as arrays.
ASR Backends
Define an abstraction:
class ASRBackend:
def transcribe(audio_path, options) -> Transcript:
...Implement at least:
WhisperCppBackendDesign for later:
ParakeetBackendWhisper.cpp
Whisper.cpp is the v1 baseline.
It must support:
CPU
CUDA if availableGPU failure must never make transcription impossible.
Desired behavior:
auto
↓
try CUDA backend if configured
↓
if unavailable/fails
↓
CPUDo not auto-download large models without an explicit command/tool.
Model locations should be configurable.
Initial useful Whisper models:
base
smallBenchmark later to determine default.
Parakeet
Treat OpenASR/Parakeet 0.6B as an experimental backend.
Do not make it a dependency of milestone 1.
Investigate whether a clean native Windows deployment exists.
If it works reliably:
Parakeet Q8 CPUmay become the preferred fast transcription backend.
The backend interface must make switching ASR engines trivial.
Internal Subtitle Data Model
Do NOT make SRT the application's internal source of truth.
Define normalized structures similar to:
@dataclass
class Word:
start_ms: int
end_ms: int
text: str
confidence: float | None = None
@dataclass
class SubtitleSegment:
id: str
start_ms: int
end_ms: int
text: str
words: list[Word]
speaker: str | None = None
@dataclass
class Transcript:
language: str | None
duration_ms: int
segments: list[SubtitleSegment]Persist normalized transcripts as JSON.
Example:
work/
video-name/
source.json
transcript.raw.json
transcript.cleaned.json
subtitles.srt
subtitles.assThis JSON representation should be stable and versioned.
Caption Formatting Engine
Build deterministic caption segmentation before involving any LLM.
Config example:
max_chars_per_line: 42
max_lines: 2
min_duration_ms: 700
max_duration_ms: 6000
min_gap_ms: 80
prefer_sentence_boundaries: true
prefer_phrase_boundaries: trueThe formatter should try to avoid:
one-word dangling lines
splitting proper names
splitting immediately before punctuation
excessively rapid captions
overlapping subtitle timestamps
Keep word timestamps whenever ASR supplies them.
The formatter should be thoroughly unit tested.
Subtitle Styling
Support named presets.
Example:
clean
shorts-bold
interview
agency-defaultRepresent styles as configuration rather than generated commands.
Example conceptual structure:
name: shorts-bold
font: Arial
font_size: 64
alignment: bottom-center
margin_bottom: 120
outline: 4
shadow: 1
max_lines: 2Generate ASS from these presets.
Do not hardcode styling into FFmpeg command construction.
Local LLM Cleanup
LLM cleanup is optional.
The pipeline must work without an LLM.
Define:
SubtitleCleanerimplementations:
DeterministicCleaner
LocalLLMCleanerEventually use a small GGUF model through llama.cpp.
Candidate:
Qwen3.5 2B Q4But do not make this required for milestone 1.
LLM responsibilities should be narrowly constrained:
punctuation correction
capitalization
obvious ASR error correction
sentence boundary recovery
The LLM must NOT:
summarize
paraphrase
invent dialogue
alter meaning
Require structured JSON output and validate it before accepting changes.
Original transcription must always be preserved.
FFmpeg Adapter
Implement:
probe_video()
extract_audio()
render_subtitles()
create_preview()Audio extraction target:
mono
16 kHz
PCM WAVFFprobe result should capture at least:
duration
width
height
frame rate
video codec
audio codec
sample rate
rotation/orientationRendering must support:
soft subtitle output
burned-in subtitle outputFor preview generation, allow reduced resolution / faster encoding.
Never overwrite the original video.
Kdenlive Adapter
Kdenlive support is deliberately downstream from the core pipeline.
Initial Kdenlive goal:
source video
+
generated subtitle track
+
correct project settings
=
editable .kdenlive projectDo not automate the Kdenlive GUI using mouse/keyboard controls unless absolutely unavoidable.
Prefer:
supported project/MLT structures
MLT tooling
existing open-source Kdenlive automation code
GUI automation only as a last resort
Current development should target Kdenlive 26.x on Windows.
Research existing open-source:
Kdenlive MCP servers
Kdenlive CLI wrappers
MLT project generators
CLI-Anything Kdenlive implementationBefore copying code:
inspect license
document provenance
identify reusable components
avoid importing an entire architecture unnecessarily
Create an adapter boundary:
class ProjectAdapter:
def create_project(...): ...
def add_video(...): ...
def add_subtitles(...): ...
def save(...): ...Implementation:
KdenliveProjectAdapterThe rest of the application must not depend directly on Kdenlive XML internals.
MCP Server
Keep MCP thin.
MCP tools should call application services.
Do not put media-processing logic inside MCP handlers.
Initial tool surface:
video.inspect
video.transcribe
video.generate_subtitles
video.create_preview
video.render
subtitle.export_srt
subtitle.export_ass
project.create_kdenlivePossible convenience tool:
video.captionwhich orchestrates:
inspect
→ transcribe
→ format
→ export
→ optionally renderEvery long-running tool should return useful structured status/output information.
Example response:
{
"success": true,
"input": "C:\\Videos\\demo.mp4",
"transcript": "C:\\Videos\\demo.work\\transcript.cleaned.json",
"srt": "C:\\Videos\\demo.work\\subtitles.srt",
"ass": "C:\\Videos\\demo.work\\subtitles.ass",
"rendered_video": null,
"warnings": []
}Proposed Repository Structure
video-subtitle-mcp/
│
├─ pyproject.toml
├─ README.md
├─ LICENSE
├─ .gitignore
│
├─ src/
│ └─ video_mcp/
│ │
│ ├─ config.py
│ ├─ models.py
│ │
│ ├─ media/
│ │ ├─ ffmpeg.py
│ │ └─ probe.py
│ │
│ ├─ asr/
│ │ ├─ base.py
│ │ ├─ whisper_cpp.py
│ │ └─ parakeet.py
│ │
│ ├─ subtitles/
│ │ ├─ formatter.py
│ │ ├─ srt.py
│ │ ├─ ass.py
│ │ ├─ styles.py
│ │ └─ cleaner.py
│ │
│ ├─ adapters/
│ │ ├─ ffmpeg.py
│ │ └─ kdenlive.py
│ │
│ ├─ services/
│ │ ├─ transcription.py
│ │ ├─ captioning.py
│ │ └─ rendering.py
│ │
│ └─ mcp/
│ └─ server.py
│
├─ presets/
│ ├─ clean.yaml
│ └─ shorts-bold.yaml
│
├─ tests/
│
└─ fixtures/Configuration
Support a project-level config file such as:
video-mcp.yamlExample:
tools:
ffmpeg: "C:/Tools/ffmpeg/bin/ffmpeg.exe"
ffprobe: "C:/Tools/ffmpeg/bin/ffprobe.exe"
whisper_cpp: "C:/Tools/whisper/whisper-cli.exe"
kdenlive: "C:/Program Files/kdenlive/bin/kdenlive.exe"
asr:
backend: whisper_cpp
device: auto
model: "C:/Models/whisper/ggml-small.bin"
subtitles:
preset: clean
max_chars_per_line: 42
max_lines: 2
output:
workspace: "./work"Also support environment-variable overrides.
Do not make users edit Python source to configure executable/model paths.
Hardware Detection
Implement a diagnostic command/service:
video-mcp doctorIt should report:
Windows version
CPU
system RAM
FFmpeg found?
FFprobe found?
whisper.cpp found?
Whisper model found?
CUDA/NVIDIA GPU detectable?
GPU name
VRAM if detectable
Kdenlive found?
Kdenlive version
MLT/melt available?
llama.cpp available?
workspace writable?Do not fail because optional components are absent.
Report capabilities.
Example:
Core caption pipeline: READY
Whisper CPU: READY
Whisper CUDA: READY
Parakeet: NOT INSTALLED
Kdenlive export: READY
Local LLM cleanup: NOT INSTALLEDMilestones
Milestone 0 — Research and Spike
Before committing architecture around existing Kdenlive projects:
Identify the strongest existing open-source Kdenlive MCP/CLI projects.
Inspect their licenses.
Determine how they manipulate Kdenlive/MLT projects.
Test creating a minimal Kdenlive project programmatically on Windows.
Document what should be reused versus rewritten.
Output:
docs/kdenlive-research.mdDo not spend excessive time making the existing MCP server work if its architecture is unsuitable.
Milestone 1 — Core Caption Pipeline
Must work completely without MCP or Kdenlive.
CLI:
video-mcp caption input.mp4produces:
transcript.raw.json
transcript.cleaned.json
subtitles.srt
subtitles.ass
captioned-preview.mp4Use:
FFmpeg
whisper.cpp
deterministic formatterNo local LLM yet.
Acceptance criteria:
Windows paths with spaces work.
Original video remains untouched.
CPU transcription works.
Generated captions contain valid timestamps.
No overlapping captions.
SRT opens correctly in common players.
ASS burns successfully through FFmpeg.
Interrupted jobs produce understandable errors.
Re-running is safe/idempotent where reasonable.
Milestone 2 — GPU Acceleration
Enable whisper.cpp CUDA.
Device selection:
cpu
cuda
autoAcceptance criteria:
GTX 1660 can be detected where supported.
autofalls back to CPU cleanly.GPU failure never corrupts job output.
Benchmark CPU versus CUDA.
Create:
benchmarks/asr-results.mdMeasure:
wall-clock transcription time
real-time factor
peak RAM
GPU VRAMMilestone 3 — Kdenlive Project Export
Command:
video-mcp kdenlive input.mp4 --subtitles subtitles.srtshould produce:
input-captioned.kdenliveOpening that project manually in Kdenlive should show:
original media
correct resolution/frame rate
synchronized captions/subtitle track
editable caption content
no missing-media errors
No GUI automation should be needed to create it.
Milestone 4 — MCP Interface
Wrap the tested service layer with MCP.
Expose:
video.inspect
video.transcribe
video.generate_subtitles
video.create_preview
video.render
project.create_kdenliveTest through an MCP client.
MCP failure must not leave orphaned FFmpeg/ASR processes.
Milestone 5 — Parakeet Evaluation
Test OpenASR Parakeet 0.6B Q8 on Windows.
Compare against Whisper on several representative videos.
Measure:
transcription speed
RAM
accuracy
word timestamp quality
punctuation
installation complexity
Windows reliabilityOnly promote Parakeet to default if the complete Windows experience is clearly better.
Milestone 6 — Local LLM Cleanup
Add llama.cpp adapter.
Evaluate a small Qwen model.
Give the model small transcript chunks rather than entire videos.
Validate every response against strict JSON schemas.
Keep deterministic cleanup as fallback.
Testing Strategy
Use pytest.
Unit-test heavily:
subtitle segmentation
timestamp conversion
line wrapping
ASS escaping
SRT generation
configuration
path handling
model serializationIntegration tests should cover:
FFprobe
FFmpeg audio extraction
Whisper invocation
FFmpeg subtitle rendering
Kdenlive project generationInclude one very small media fixture suitable for repository tests if licensing permits.
Do not require downloading gigabytes of models in CI.
Use mock ASR output for normal CI tests.
Logging
Use structured logging.
Each processing job should get a job ID.
Log:
input file
detected media metadata
backend used
model used
CPU/GPU device
processing duration
generated outputs
warnings/errorsNever silently switch transcription models.
If auto falls back from CUDA to CPU, explicitly report that.
Error Handling
Create typed application errors such as:
ExecutableNotFound
ModelNotFound
UnsupportedMedia
TranscriptionFailed
SubtitleGenerationFailed
RenderFailed
KdenliveProjectFailedMCP handlers should convert these into useful user-facing messages.
Avoid dumping giant subprocess traces unless debug mode is enabled.
Things NOT to Build Yet
Do not initially build:
Kdenlive GUI automation
live OBS captioning
speaker diarization
word-by-word TikTok animation
cloud transcription
cloud LLM integration
video cutting/editing
automatic B-roll
automatic scene detection
web frontend
database
authentication
distributed jobs
Keep v1 extremely focused.
Definition of Initial Success
The first meaningful demo should be:
video-mcp caption "C:\Videos\Test Video.mp4"and approximately one command later we have:
Test Video.work/
transcript.raw.json
transcript.cleaned.json
subtitles.srt
subtitles.ass
preview.mp4Then:
video-mcp kdenlive "C:\Videos\Test Video.mp4"produces an editable Kdenlive project using those same subtitle assets.
Finally an MCP client should be able to request:
"Caption this video using the clean preset and make me an editable Kdenlive project."
The MCP server should perform the same deterministic pipeline without duplicating implementation logic.
First Task for Codex
Begin with Milestone 0 and Milestone 1.
Before implementing:
Inspect the existing repository if one exists.
Check for existing Kdenlive MCP/MLT code worth reusing.
Verify licenses before copying code.
Create the proposed module boundaries.
Implement
video-mcp doctor.Implement FFprobe inspection.
Implement FFmpeg audio extraction.
Implement the Whisper.cpp adapter.
Define normalized transcript models.
Implement deterministic SRT generation.
Implement ASS generation with one
cleanpreset.Render a captioned preview through FFmpeg.
Add tests.
Document exact Windows setup in README.
Do not implement the MCP layer until the direct Python/CLI pipeline is working and tested.
Make reasonable implementation decisions autonomously. Keep dependencies minimal. Prefer boring, inspectable code over clever abstractions.
Available Tools
9 toolsproject.create_kdenliveB
Create an editable Kdenlive project from a video and SRT file.
| Name | Required | Description | Default |
|---|---|---|---|
| overwrite | No | ||
| input_path | Yes | ||
| config_path | No | ||
| output_path | No | ||
| subtitles_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 of behavioral disclosure. It only says 'create', but does not mention overwrite behavior, output path handling, side effects on input files, or permission requirements. Key parameters like overwrite and output_path are left unexplained.
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 a single, front-loaded sentence with no wasted words. It immediately states the action and the required inputs, earning a perfect score for conciseness and structure.
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?
While an output schema exists, the description gives no workflow context, prerequisites, or behavior around the optional parameters. For a tool with five parameters and no annotations, this minimal description is insufficient for an agent to invoke it correctly, especially without understanding overwrite and output_path semantics.
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%, and the description names none of the five parameters. Even though parameter names like input_path and subtitles_path are somewhat self-explanatory, the description adds no semantic detail about how these parameters interact or what values are expected, failing to compensate 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 uses a specific verb ('Create') and resource ('editable Kdenlive project') with clear input sources ('video and SRT file'), which makes the tool's purpose unmistakable. It also distinguishes from sibling tools like video.transcribe or video.caption, which perform different operations.
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 the tool is for creating an editable project from an existing video and SRT, but it does not explicitly state when to use this tool versus alternatives. No exclusions or alternative tool references are provided, making it minimally adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subtitle.cleanC
Clean a transcript with the optional local LLM and deterministic fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| overwrite | No | ||
| config_path | No | ||
| output_path | No | ||
| transcript_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the execution modes ('optional local LLM and deterministic fallback'), which gives some insight into behavior. However, it does not mention side effects like overwriting the input file (despite the 'overwrite' parameter), output handling, or any requirements. Without annotations, this is only partial transparency.
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 a single concise sentence with no redundant or filler content. It is appropriately brief and front-loaded, conveying the essential action quickly.
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 has 4 parameters, no parameter descriptions, and a potentially nuanced behavior (optional LLM vs fallback), the description is too minimal to be complete. It does not explain the cleaning process, parameter interactions, or the importance of the fallback, making it insufficient for reliable agent selection and invocation.
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 has 0% description coverage, and the description does not mention any parameters. It does not clarify the meaning or role of transcript_path, overwrite, config_path, or output_path, so it adds no value beyond the raw 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 uses a specific verb ('clean') and resource ('transcript'), and the action is distinct from sibling tools like subtitle.export_srt or video.transcribe. However, it does not define what 'clean' entails (e.g., removing filler words, formatting), so it is clear on surface but not deeply distinctive.
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 provides no guidance on when to use this tool instead of alternatives, nor any context such as prerequisites or typical use cases. It is a single declarative sentence without any conditional or comparative information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subtitle.export_assB
Export a normalized transcript JSON file as styled ASS.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | ||
| width | No | ||
| height | No | ||
| overwrite | No | ||
| config_path | No | ||
| output_path | No | ||
| transcript_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral transparency. It only states the core export action and does not mention overwrite behavior, config file handling, default styles, or output path defaults. Users are left unaware of side effects or operational constraints.
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 a single, concise sentence that front-loads the key information. Every word contributes to the meaning, with no filler or redundancy. It is appropriately brief for a tool with a clear primary 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?
Given the tool's complexity (7 parameters, no annotations, and no schema descriptions), the one-line description is insufficient. It does not address configuration, output handling, or operational nuances. The presence of an output schema does not compensate for the lack of guidance on inputs 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?
Schema description coverage is 0%, and the description does not compensate by explaining any of the 7 parameters. It mentions 'normalized transcript JSON' and 'styled ASS' but gives no insight into parameters like style, width, height, overwrite, config_path, or output_path. This leaves the agent with no additional semantic understanding beyond the bare 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 tool's function: exporting a normalized transcript JSON file as styled ASS. The verb 'export' specifies the action, the resource is the transcript JSON, and the output format is ASS. This distinguishes it from sibling tools like subtitle.export_srt, which exports SRT, and subtitle.clean, which cleans subtitles.
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 the tool is for converting a normalized transcript to ASS subtitles, but it does not explicitly state when to use it versus alternatives like subtitle.export_srt. The word 'normalized' hints at a prerequisite (e.g., prior cleaning), but this is not made explicit. No exclusions or alternative references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subtitle.export_srtC
Export a normalized transcript JSON file as SRT.
| Name | Required | Description | Default |
|---|---|---|---|
| overwrite | No | ||
| config_path | No | ||
| output_path | No | ||
| transcript_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must disclose behavioral traits. It only states the core function and does not mention side effects, default behaviors, or requirements. For example, it does not clarify what happens if the output file already exists or how config_path affects behavior.
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 a single, focused sentence that immediately conveys the tool's purpose. It is appropriately sized and front-loaded, with 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?
Despite having an output schema, the tool has 4 parameters and no annotations. The description is too sparse to provide complete context, lacking details about default output locations, overwrite behavior, or how config_path modifies the export. This is a minimal viable description at best.
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%, so the description must compensate for explaining parameters. It only hints at transcript_path via 'transcript JSON file' but provides no meaning for overwrite, config_path, or output_path, leaving the agent with minimal guidance on required vs optional parameters.
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 exports a normalized transcript JSON file as SRT, specifying the verb, input resource, and output format. It implicitly differentiates from the sibling tool subtitle.export_ass by naming the output format, but it does not explicitly name that alternative.
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 provides no guidance on when to use this tool versus alternatives like subtitle.export_ass. It does not mention prerequisites, such as the need for a normalized transcript, nor does it explain the role of parameters like overwrite or config_path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video.captionC
Run the complete local caption pipeline for a video.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | ||
| device | No | ||
| threads | No | ||
| language | No | auto | |
| overwrite | No | ||
| input_path | Yes | ||
| config_path | No | ||
| preview_width | No | ||
| create_preview_output | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the full burden. It mentions 'local' execution and 'complete' pipeline, hinting at on-device processing and multi-step behavior, but it omits important behavioral traits like file creation, overwriting, or required resources. The overwrite and create_preview_output parameters imply side effects that are not disclosed.
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 a single, clean sentence that is easy to read and front-loads the verb. However, it is under-specified given the tool's complexity; the brevity sacrifices essential information, so it is not effective conciseness.
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 9 parameters, no annotations, and an output schema, the one-sentence description is grossly incomplete. It does not explain the pipeline stages, expected outputs, or relationship to sibling tools, leaving the agent without enough context to invoke the tool correctly.
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 9 parameters with 0% description coverage, and the description mentions only 'a video,' providing no explanation for style, device, threads, language, overwrite, config_path, preview_width, or create_preview_output. This is far below the coverage threshold and the description does not compensate.
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 identifies the tool as running a 'complete local caption pipeline' for a video, which conveys a high-level purpose and implies a composite workflow. However, 'caption pipeline' is vague and doesn't explicitly state what steps are involved or what outputs are produced, making it hard to distinguish from sibling tools like video.transcribe or subtitle.clean on first read.
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 guidance is provided about when to use this tool versus alternatives such as video.transcribe or video.render. The description does not mention any prerequisites, exclusions, or context in which the complete pipeline should be chosen over individual steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video.create_previewA
Burn ASS subtitles into a fast, downscaled MP4 preview.
| Name | Required | Description | Default |
|---|---|---|---|
| overwrite | No | ||
| input_path | Yes | ||
| config_path | No | ||
| output_path | No | ||
| preview_width | No | ||
| subtitles_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior itself. It states the output type (MP4), the operation (burning subtitles), and the quality/speed tradeoff (fast, downscaled). However, it does not explain side effects such as file creation behavior, default output paths, overwrite semantics, or how configuration files affect the process, leaving meaningful behavioral gaps.
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 a single, well-structured sentence that front-loads the action ('Burn') and contains no filler. Every word contributes to understanding the tool's core purpose.
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 six parameters, two required, and no annotations, the description is too sparse. It does not explain the purpose of config_path, how output paths are determined, overwrite behavior, or preview sizing specifics, leaving the agent with significant missing context despite the presence of an output schema.
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 zero description coverage, so the description must compensate. It only implicitly hints at subtitles_path (ASS subtitles) and preview_width (downscaled), but leaves input_path, output_path, config_path, and overwrite unaddressed, providing minimal parameter-level guidance.
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 uses a specific verb 'Burn' and identifies the exact resource and transformation: ASS subtitles are burned into a downscaled MP4 preview. This clearly distinguishes it from sibling tools like video.render (final output) and video.caption (caption generation) by specifying the preview nature and subtitles input.
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 does not explicitly state when to use this tool versus alternatives like video.render. However, the word 'preview' and adjectives 'fast' and 'downscaled' imply it is intended for quick, low-quality preview rendering, which is an indirectly conveyed usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video.inspectB
Inspect a video with FFprobe and return normalized media metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| input_path | Yes | ||
| config_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It states 'inspect' and 'FFprobe', implying a read-only operation, but does not explicitly disclose lack of side effects, configuration behavior, dependencies, or potential errors. More behavioral context is needed.
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 a single, front-loaded sentence with no wasted words. It efficiently conveys the tool's core action and output.
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?
The tool appears simple and output schema exists, so return values are covered. However, the description omits the purpose of config_path, any usage caveats, and what 'normalized' implies, leaving the context incomplete for an agent to fully understand configuration and edge cases.
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%, and the description does not explain either parameter. 'input_path' is only vaguely implied by 'video', while 'config_path' is entirely unaddressed. The description must compensate for the schema's lack of parameter details but fails to do so.
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 uses a specific verb 'inspect', identifies the resource 'a video', specifies the method 'with FFprobe', and states the output 'normalized media metadata'. This clearly distinguishes it from sibling tools like transcribe, caption, or render.
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 use for inspecting video metadata but provides no explicit guidance on when to use this tool versus alternatives. There is no mention of exclusions or preferred scenarios, leaving usage largely inferred from the purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video.renderA
Render a burned-in ASS subtitle preview; alias for video.create_preview.
| Name | Required | Description | Default |
|---|---|---|---|
| overwrite | No | ||
| input_path | Yes | ||
| config_path | No | ||
| output_path | No | ||
| preview_width | No | ||
| subtitles_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits. 'Render' implies file generation, but the description does not mention side effects such as creating/overwriting files, required permissions, or whether the operation is reversible. The alias hint provides some context but lacks essential safety and mutation details.
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 a single, front-loaded sentence that immediately states the action and resource, followed by an alias clarification. No wasted words; structured effectively for fast parsing.
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?
Despite having an output schema, the description lacks context for a 6-parameter tool with no annotations. It does not mention prerequisites, configuration behavior, or output path defaults, and the alias to video.create_preview only partially mitigates this by pointing to a sibling tool. The description is too sparse to be fully actionable in a complex workflow.
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%, so the description must compensate. It vaguely implies input_path and subtitles_path via 'input video' and 'ASS subtitles', but it does not explain overwrite, config_path, output_path, or preview_width. The parameter names alone carry most of the meaning, but the description adds minimal semantic value.
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 uses a specific verb ('Render') with a clear resource ('burned-in ASS subtitle preview') and explicitly identifies itself as an alias for video.create_preview, which distinguishes it from sibling tools like video.caption or video.transcribe. This makes the tool's purpose unambiguous.
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 clearly indicates this is equivalent to video.create_preview, providing a direct alternative. However, it does not explicitly state when to use this over other preview-related tools or mention exclusions (e.g., 'use video.caption for caption-only output').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video.transcribeC
Transcribe normalized audio with the configured local ASR backend.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | ||
| threads | No | ||
| language | No | auto | |
| overwrite | No | ||
| audio_path | Yes | ||
| config_path | No | ||
| output_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 behavior. It only mentions the core transcription action and the local ASR backend, but does not describe output format, handling of existing files (overwrite), language detection, resource usage, or side effects. The 'normalized audio' hint is useful but insufficient.
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 a single, front-loaded sentence with no unnecessary words. It efficiently communicates the tool's essence. However, given the tool's complexity, a bit more detail could be warranted, but this dimension specifically rewards concise writing, so a 4 is appropriate.
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?
This tool has 7 parameters, no annotations, and zero schema description coverage. The description provides almost no contextual detail about when to use the tool, how to configure it, or what to expect. The presence of an output schema does not compensate for the lack of guidance on parameters 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?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It fails to explain any of the 7 parameters, including the required audio_path. No mention of device, threads, language, overwrite, config_path, or output_path, leaving the agent to guess their roles.
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 verb 'Transcribe' and the resource 'normalized audio', also specifying the local ASR backend. This distinguishes it from sibling tools like video.caption or subtitle.export_srt, which are about captions and subtitle exports, not raw transcription.
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 guidance is given about when to use this tool versus alternatives. There is no mention of prerequisites (e.g., what 'normalized audio' means or how to obtain it) or exclusions. The existence of sibling tools like video.caption suggests overlapping use cases, but the description does not address them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but video.create_preview and video.render are explicit aliases of the same operation, creating unnecessary ambiguity. The descriptions clarify the alias, which mitigates confusion, but the duplication is still a flaw.
Tool names follow a consistent pattern of domain prefix (video/subtitle/project) followed by an action verb (inspect, transcribe, clean, create_preview). The naming is uniform, though the presence of 'render' as an alias for 'create_preview' introduces slight redundancy without breaking the convention.
With 9 tools, the server is well-scoped for a video captioning workflow. Each tool (except the alias pair) serves a distinct step in the pipeline, and the count is within the ideal 3–15 range.
The tool set covers the core video-to-subtitle-to-export workflow: inspect, transcribe, caption, preview, clean, export SRT/ASS, and create an editable project. Minor gaps exist such as lack of an explicit transcript retrieval or deletion/update operations, but agents can work around these with the provided pipeline.
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
An MCP server that gives any LLM or agent clean YouTube transcripts on demand: a single video, a whole channel, or a playlist, plus AI cleanup of auto-generated captions. API-key auth, credit-based, same backend as the public v1 API. Get a free API key with 25 free credits at youtubetranscriptdownload.com/account.
MCP server for Google Veo AI video generation
MCP server for Wan AI video generation
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceAn MCP server that automatically transcribes video content and burns stylized captions directly into the video file. It leverages the Groq Whisper API for fast transcription and supports multiple visual styles tailored for social media and professional content.
- AlicenseNot gradedqualityDmaintenanceA local MCP server for extracting YouTube video transcripts, metadata, and performing visual analysis using Gemini Vision or local Whisper models. It enables users to process video content through various tools for subtitle retrieval and frame analysis.27MIT
- FlicenseNot gradedqualityDmaintenanceA local MCP server that gives Claude Desktop full video editing capabilities via FFmpeg, Whisper, and yt-dlp.
- FlicenseNot gradedqualityDmaintenanceAn all-in-one MCP server for transcription, supporting YouTube, audio, and video with translation, summarization, chapter generation, subtitle export, and batch processing via 19 tools.
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/petercr/subtitle-machine-kdenlive'
If you have feedback or need assistance with the MCP directory API, please join our Discord server