Transcriptor
Click on "Deploy 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., "@Transcriptortranscribe this meeting recording: ~/Desktop/team-standup.m4a"
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.
Transcriptor
Local transcription MCP server. macOS, Linux and Windows.
Point it at a file or a URL and it returns a job id; the transcript, its segments and full-text search over them become available as the job completes. Whisper large-v3, one SQLite file as the only durable store, stdio transport, one native process.
Nothing to set up but the code. No database server, no Docker, no connection string, no API key. Install it and transcribe something.
Nothing leaves the machine. No API keys, no per-minute billing, no upload of client footage or unreleased video.
Status | Phases 1–5 implemented. 465 tests, 9 architectural contracts. |
Platforms | macOS (Apple Silicon), Linux, Windows. Python 3.12. |
Model | Whisper large-v3 — 99 languages, MIT |
Database | SQLite, inside the project. Created on first run |
Licence | MIT, matching Whisper's |
Which engine runs on your machine
The engine is chosen for you. Nothing above the adapter layer knows which one it is talking to, so the tools, the pipeline and the database behave identically either way.
Your machine | Engine | Speed |
Apple Silicon |
| Measured: ~6.9 min per hour of audio |
NVIDIA GPU (Linux, Windows) |
| Fast — see the note below |
Anything else |
| Roughly real-time |
What has actually been run. Every performance figure in this repository was measured on Apple Silicon. The CUDA and Windows paths are unit-tested with the platform and GPU layers stubbed, and CI runs the full suite on Ubuntu, macOS and Windows — but transcription itself has not been run on Windows or on an NVIDIA GPU by the author, and this README will not pretend otherwise. If you run it there, an issue saying what happened is genuinely useful, working or not.
Measured performance:
BENCHMARKS.md
Install
You need ffmpeg and uv. That is all — the database comes with the project. The only step that differs by platform is the first one and the engine extra.
brew install ffmpeg uv
git clone https://github.com/ajaysharmadeveloper/transcriptor-mcp-public
cd transcriptor-mcp-public
uv sync --all-groups --extra mlx --extra vad --extra media --extra punctuatesudo apt install ffmpeg # or dnf / pacman / zypper
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone https://github.com/ajaysharmadeveloper/transcriptor-mcp-public
cd transcriptor-mcp-public
# --extra cuda on a machine with an NVIDIA GPU, --extra cpu otherwise
uv sync --all-groups --extra cuda --extra vad --extra media --extra punctuatewinget install Gyan.FFmpeg
winget install astral-sh.uv
git clone https://github.com/ajaysharmadeveloper/transcriptor-mcp-public
cd transcriptor-mcp-public
# --extra cuda on a machine with an NVIDIA GPU, --extra cpu otherwise
uv sync --all-groups --extra cuda --extra vad --extra media --extra punctuateRestart your terminal after installing ffmpeg so it lands on PATH.
Then, on every platform:
transcriptor-mcp setup # ~1.6GB Whisper + ~2.1GB punctuation
transcriptor-mcp migrate # creates the database file
make doctorThat is the whole installation. There is no .env to write and no database to
create — migrate makes <repo>/.transcriptor/transcriptor.db and the schema
inside it. .env.example exists only for the settings you might want to
change later.
make doctor should print six green checks — it names your OS, architecture,
selected engine and device, and turns every "why isn't it working" into one
line of output.
The extras are separable on purpose
Extra | Brings | Without it |
| Apple Silicon inference (Metal) | No transcription on a Mac — everything else runs |
| CTranslate2 inference + VRAM reporting | — |
| CTranslate2 inference, CPU only | No transcription off a Mac — everything else runs |
| Silero speech detection | Whisper sees silence and may hallucinate |
| yt-dlp | URLs are refused with a named error; local files fine |
| Sentence restoration | Transcripts are correct, just less readable |
| One-off import from an old Postgres install | Only needed once, by people upgrading |
Installing mlx on Linux or Windows is harmless — it carries an environment
marker and resolves to nothing there, so a copied command does not break.
The core install needs none of them. That is what lets the whole test suite run with no model, no GPU and no network — and it means a missing extra degrades rather than fails.
Where things live
<repo>/.transcriptor/transcriptor.db everything durable — the whole product
<repo>/.transcriptor/models/ model weights, ~3.7GB (HF_HOME points here)
<repo>/.transcriptor/tmp/ in-flight audio, wiped when a job ends
<repo>/.env optional settings, gitignoredSources, requests, jobs, chunks, segments and renders all live in that one file. Model weights are binaries that have to be files, and ffmpeg needs a real path to read audio from; nothing else touches the disk.
Upgrading from a Postgres install
Transcriptor used to need a Postgres server. If you have transcripts in one, bring them across — it reads Postgres and never writes to it, so a failed run costs nothing and can simply be repeated:
uv sync --extra pgimport
transcriptor-mcp migrate # create the schema
transcriptor-mcp import-postgres --from "$OLD_DSN" --dry-run # see what would move
transcriptor-mcp import-postgres --from "$OLD_DSN"Your old database is left exactly as it was. Drop it once you have checked the transcripts read back.
Back up transcriptor.db. It is the whole product, and now that is a file
you can copy. Copy the -wal file alongside it, or run
sqlite3 transcriptor.db ".backup out.db" to get a consistent snapshot while
the server is running.
Related MCP server: video-transcriber-mcp
Running it
It is a stdio server: the client launches it on demand and shuts it down after. No port, no token, no daemon, no attack surface.
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"transcriptor": {
"command": "/Users/ajaykumarsharma/Projects/transcriptor/.venv/bin/transcriptor-mcp"
}
}
}Quit Claude Desktop completely (⌘Q) and reopen it.
Claude Code
claude mcp add --scope user transcriptor \
/Users/ajaykumarsharma/Projects/transcriptor/.venv/bin/transcriptor-mcpUser scope makes it available in every project, which is what you want — you
will usually transcribe something while working somewhere else. Verify with
claude mcp get transcriptor.
There is no password to keep out of either config. The database is a file
inside the project, reachable only by whoever can already read the directory.
Any settings you do set live in .env, which the server resolves from its own
install path rather than from a config that syncs and gets backed up.
Both at once
They share one database and one model. TRANSCRIPTOR_MAX_CONCURRENT is 1
deliberately — two simultaneous transcriptions on 16GB means swapping — so if
both start a job the second waits, and transcript_status reports
queued_reason: max_concurrent. That is the design working.
Other transports and commands
transcriptor-mcp serve # stdio, the default
transcriptor-mcp serve --http --port 8765 # for an agent on another machine
transcriptor-mcp doctor # six-point preflight
transcriptor-mcp migrate # apply pending migrations
transcriptor-mcp setup # (re)download the models
transcriptor-mcp update-ytdlp # sites break it; bump roughly monthlyHTTP binds to loopback unless told otherwise: Transcriptor has no authentication of its own, so put it behind something that does before exposing it.
Logs go to stderr — Claude Desktop captures them at
~/Library/Logs/Claude/mcp-server-transcriptor.log.
After changing anything in the repo, restart the client. Claude Desktop and Claude Code each hold a running copy of the server, including its tool descriptions — a stale one will refuse work it can actually do.
You do not need to configure PATH. A GUI-launched app cannot see Homebrew or
the venv, so the server puts both on PATH itself at startup.
If a URL fails
Error | What it means |
| Login-walled, private, members-only or age-restricted. Set |
| YouTube's anti-bot check. Cookies will not help. Install Deno ( |
| Sites break yt-dlp constantly: |
| Pass one video URL, not a channel or playlist |
Downloading the audio yourself and passing the local path always works, whatever the platform is doing.
Configuration
Everything is a TRANSCRIPTOR_* environment variable, read from <repo>/.env
(mode 0600, gitignored) or the client config. .env.example has the same list
with comments.
Variable | Default | Purpose |
Engine | ||
|
|
|
| (per engine) |
|
|
| faster-whisper only. |
| (per device) | faster-whisper only. |
Storage | ||
|
| Model weights and scratch audio only |
Database | ||
| (required) | Required. Percent-encode |
|
| Set to share an existing database instead of a dedicated one |
|
| |
|
| |
|
| Startup wait — the client may launch before Docker is up |
|
| Segments held in memory during a database outage |
Download viewer | ||
|
| Serve finished transcripts as download links |
|
| Loopback. Change only if you understand what you are exposing |
|
| Change if something else already has the port |
Memory | ||
|
| Max occupancy for Transcriptor. Measured peak is 3.04 GB (Apple Silicon) |
|
| Free memory left for everything else. Measured, not guessed |
|
| |
|
| How long to wait under critical pressure before aborting |
|
| Unload the model after idle. Tightens under pressure |
|
| Do not raise on 16 GB. Two jobs means swapping |
VRAM floor |
| Free GPU memory left for everything else. Applies only to a discrete GPU, and is estimated rather than measured — see |
Pipeline | ||
|
| Chunk length; overlap is stitched away |
|
| |
|
| Restore sentence boundaries after transcription |
|
| |
|
| Keep in-flight audio after a job, for debugging |
|
| Prune abandoned scratch. Active jobs are never touched |
|
| |
Job lifecycle | ||
|
| |
|
| Heartbeat age after which the reaper calls a job interrupted |
|
| |
Input | ||
|
|
|
|
| Refuse sources longer than this (4 hours) |
|
| |
yt-dlp | ||
| (unset) |
|
| (unset) |
|
| (unset) |
Defaults are chosen from measurement, not taste — see BENCHMARKS.md
for how the memory and chunking numbers were arrived at. The one exception is
flagged where it appears: the VRAM figures are derived from model weight
sizes, because no NVIDIA hardware was available to measure them on. They are
deliberately generous, and replacing them with real numbers is a welcome first
contribution.
Tools
Tool | What it does | Destructive |
| Inspect a source — duration, captions, whether you already have it. No download. | |
| Start a job, return a | |
| Queue every media file in a folder | |
| State, stage, progress, ETA, why it is queued | |
| Transcript text in any format | |
| Write a format to a path you choose | |
| Find phrases with timestamps, fuzzy fallback | |
| Pull a time window | |
| Recent jobs, filterable by status | |
| Stop a job | |
| Remove a transcript | ⚠️ |
| Self-contained high-density moments + ffmpeg commands | |
| Model state, real memory pressure, queue depth |
Talking to it
"Transcribe ~/Downloads/interview.mov and give me the SRT" "Probe https://youtu.be/… — how long is it, does it have captions?" "Search that transcript for where they talk about the algorithm" "Find me 5 clips from it, 20 to 45 seconds"
transcript_get defaults to mode="preview" for a reason: a 2-hour transcript
is 40,000+ tokens and returning it whole makes the tool actively harmful to the
calling agent. The intended path into a long transcript is transcript_search
and transcript_segments — and, for the whole thing, the download link below.
Getting the transcript out
A chat window is a poor place to receive 10,000 words. So a finished job also reports links, served by the process that already holds the transcript:
"download_urls": {
"txt": "http://127.0.0.1:8766/t/<job_id>.txt?k=<token>",
"srt": "…/t/<job_id>.srt?k=<token>",
"vtt": "…/t/<job_id>.vtt?k=<token>",
"json": "…/t/<job_id>.json?k=<token>"
},
"view_url": "http://127.0.0.1:8766/v/<job_id>?k=<token>"Click a download link and the file lands in your Downloads folder, named after
the video rather than the job id. view_url opens a readable page: the
transcript, a Copy all button, and a download button for each of the four
formats — usually the only link worth handing over, since it leads to all the
others. Both
appear on transcript_status and transcript_get as soon as the job has
produced anything — including while it is still running.
Three things worth knowing:
Loopback only.
127.0.0.1, this machine, your browser. Nothing is uploaded and the links are not shareable. ChangeTRANSCRIPTOR_VIEWER_HOSTonly if you have thought about what you are exposing — the server has no authentication of its own beyond the link token.The token is regenerated at every start, so links do not outlive the process that made them. An old link returns 403; ask for a fresh one.
Nothing new is written to disk. The file is rendered from the database when you click.
transcript_exportremains the only thing that writes a file, and only when you ask it to.
Turn it off with TRANSCRIPTOR_VIEWER_ENABLED=false if you would rather not
have a listening socket. If the port is taken the viewer disables itself, says
why in transcript_health, and the server carries on — a download link is a
convenience and losing it should never cost you a transcription.
Claude Desktop starts two copies of the server, and only one can hold the port. The other checks who won: if it is another Transcriptor — same database, same link token — it advertises the winner's links, so this is invisible in normal use. You will see one line in the log saying so.
Only one number matters if you run two different Transcriptors against two
different databases: give the second one its own
TRANSCRIPTOR_VIEWER_PORT, or its links will point at the first one's
transcripts.
Performance
Measured through the MCP wire — the same path a client uses — on a busy
machine (PyCharm, Docker and an agent session running). Full method and the
things that did not work are in BENCHMARKS.md.
Every figure below is Apple Silicon (M4, 16GB, mlx-whisper, large-v3
8-bit). None of it has been reproduced on CUDA or on CPU inference, so do not
read it as a cross-platform claim. The tool latencies are engine-independent
and should hold anywhere; the throughput and memory numbers are not.
Target | Measured | |
| < 250 ms | 30–37 ms |
| < 300 ms | 21–99 ms |
Cache hit | < 50 ms | 14 ms |
Throughput, transcribe stage | < 8 min/hour | 6.7–7.4 |
Throughput, end to end with punctuation | — | 9.3 min/hour |
Peak occupancy | < 3 GB, never above the cap | 3.04 GB of a 4 GB cap |
Swap growth | < 200 MB | 0 |
Not yet measured: accuracy. WER needs a labelled fixture set, and inventing reference text would produce a number that means nothing. Recorded as a gap rather than filled in.
Memory, in practice
State | Occupancy |
Idle, model evicted | 0.12 GB |
Transcribing | ~3.0 GB peak |
Transcribing + punctuation restoration | 2.9 GB peak (ASR is evicted first) |
To start a job you need about 5 GB free — 2.5 GB for the model plus a 2.5 GB
floor left for everything else. Transcriptor is a guest on this machine, not its
owner: if the floor would be breached the job waits, and
transcript_status says queued_reason: insufficient_memory. Closing a browser
is usually enough.
On a discrete GPU there are two pools, and both are checked. Unified memory
lets one number govern everything, because the GPU spends the same memory
psutil reports. A separate card does not: its VRAM is invisible to the system
floor, which would happily read "healthy" while the GPU ran out. So a CUDA build
is admitted only if system memory and free VRAM both have room, and the
pressure ladder watches both. Those VRAM thresholds are estimates — see the note
under Configuration.
What happens to your file
probe metadata only — is it long, does it already have captions
fetch yt-dlp pulls audio only; a 40-minute 4K video is ~30MB, not 2GB
extract ffmpeg → 16kHz mono
detect Silero finds the speech and drops the rest
transcribe 2-minute chunks, each committed as it finishes
punctuate sentence boundaries restoredThree consequences worth knowing as a user:
You get a
job_idin about 30ms and can poll or walk away. Nothing waits.A running job is already readable. Because each chunk is committed as it completes,
transcript_getandtranscript_searchwork mid-job and reportpartial: true. If the machine dies, everything transcribed so far survives and the job resumes from its last committed chunk rather than starting over.The same thing is never transcribed twice. A shared YouTube link and a clean one are the same source; so is the same audio arriving from a different URL, or a file you already did. Asking again returns the existing result in milliseconds. Changing the model, the forced language or the caption policy correctly produces a fresh transcript, because that is a different artefact.
Nothing leaves your machine except the request to the site you asked it to fetch.
Layout
src/transcriptor/
server.py composition root — lifespan, supervision, CLI. Only importer of adapters.
tools.py MCP surface. Services only.
services/ orchestration, transactions, policy.
domain/ pure data + rules. stdlib and pydantic only.
ports/ the contracts.
adapters/ implementations — MLX or CTranslate2, Silero, yt-dlp, ffmpeg,
SQLite, punctuation.
migrations/ numbered .sqlmake lint enforces the dependency rule with nine import-linter contracts, and
runs before the tests — a violated dependency rule is architectural, not a
bug. Verified to bite: injecting a services → adapters import breaks two
contracts.
Documentation
If you want to… | Read |
Install, configure and use it | this file |
Know how fast it is and how that was measured | |
Contribute |
Development
make test # import contracts + 465 tests, no engine or network needed
make lint # the dependency rule alone
make doctor # six-point preflight
make bench # rerun the benchmarks (Apple Silicon)
make build # wheel + sdist into dist/The default suite runs with no inference engine, no model weights, no GPU and
no database service — that is what the ASREngine port and a file-backed
database buy between them. Tests needing real inference are marked slow.
Database tests get their own SQLite file in a temporary directory, so they
never touch your real one.
That last part is a recent and large improvement: 187 database tests — most of the store, dedupe, resume and reaper coverage — used to skip for anyone without a running Postgres. They now run everywhere.
CI runs the contracts and the whole suite on Ubuntu, macOS and Windows on every push, plus a check that the migrations really are inside the built wheel. Tests describing one platform's behaviour are marked to run on that platform, so each runs somewhere on every push rather than being skipped everywhere.
Contributions are welcome — CONTRIBUTING.md covers the five
rules that will actually fail a PR, and what carries over if you add an engine.
Releasing
make build
twine upload dist/* # needs a PyPI token; deliberately not automatedThe .sql migrations ship inside the wheel — the server refuses to start
without them, so they are not incidental data.
Deliberately not built
Speaker diarization. Evaluated and rejected: FluidAudio is a Swift package needing a helper binary and an IPC protocol; pyannote's models are gated on Hugging Face, which breaks both "no API keys" and offline install. Each fails a stated constraint. The port is written so this can be revisited without reshaping the pipeline.
Multi-user.
requestshas no principal column. Single-machine, single-user is a constraint the design accepts in exchange for having no distributed-systems problems at all.Real-time / microphone streaming, translation, and a GUI.
A container image. On macOS, Docker Desktop has no Metal and no MLX passthrough, so it would mean CPU inference at a tenth of the speed. On Linux with
--gpus allthe CTranslate2 engine would work, and a Dockerfile is now a reasonable contribution rather than a dead end — it simply has not been written or tested.Accuracy numbers. WER needs a labelled fixture set, and inventing reference text would produce a number that means nothing. Recorded as a gap in
BENCHMARKS.mdrather than filled in.
Contributing
CONTRIBUTING.md · CODE_OF_CONDUCT.md · SECURITY.md · CHANGELOG.md
The two contributions that would help most right now:
Run it on Windows or on an NVIDIA GPU and say what happened. Those paths are written and unit-tested but have never been executed by the author.
Measure the VRAM figures. They are currently derived from weight sizes and marked as estimates everywhere they appear.
Licence
MIT, matching Whisper's. Whisper itself is MIT; mlx-whisper, faster-whisper
and Silero VAD are MIT; yt-dlp is Unlicense.
Available Tools
13 toolstranscript_batchA
Queue every media file in a folder, one job each.
folder must be absolute. Not recursive — recursing would silently pull
in a backup directory nobody meant to transcribe. Files already
transcribed under these settings come back as reused rather than being
queued again. Poll the returned job_ids with transcript_status, or watch
the whole set with transcript_list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| folder | Yes | ||
| pattern | No | * | |
| language | 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 the full burden, and it does disclose real traits: the operation is a queueing/mutation, it is deliberately non-recursive (with the rationale about backup directories), and already-transcribed files are reused rather than re-queued. It does not mention permissions, cost/rate limits, or failure handling for partially bad folders.
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?
Front-loaded with the core action, and the rationale sentences (non-recursion, reuse) each earn their place by changing agent behavior. The prose is slightly padded with em-dash asides, but nothing is redundant.
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?
An output schema exists, so not describing the returned job_ids is acceptable, and the description does tell the agent how to consume them. However, for a 4-parameter batch mutation with 0% schema coverage, the undocumented limit/pattern/language parameters and the unaddressed interaction between 'every media file' and pattern filtering leave real gaps.
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 explains only one of four parameters ('folder must be absolute'). The semantics of limit, pattern, and language — notably that pattern defaults to '*' and can narrow what 'every media file' actually means — are left entirely undocumented in both schema and prose.
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?
States a specific verb and resource ('Queue every media file in a folder, one job each') along with the batch granularity — one job per file — so the agent immediately distinguishes this from transcript_create (single file) and transcript_list. The scope constraint (''folder' must be absolute') further pins the operation down.
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?
Explicitly routes the agent to follow-up tools: poll job_ids with transcript_status or watch the set with transcript_list. What's missing is a 'when not' clause — nothing tells the agent to prefer transcript_create for a single file, which is the most likely sibling confusion given the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_cancelB
Stop a job.
A queued job stops at once; a running one stops at the next chunk boundary, so allow up to about two minutes. Everything already transcribed survives and the job can be resumed later.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | 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 carries the full behavioral burden and does so well: it distinguishes queued (immediate) from running (chunk-boundary, up to ~2 minutes) jobs and guarantees that already-transcribed content survives and is resumable. It omits auth/permission requirements, which keeps it short of a 5.
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?
Three short, front-loaded sentences with no filler; the primary action leads and timing/data-safety details follow. Size is well matched to the operation's complexity.
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?
An output schema exists, so return values need not be described, and the behavioral narrative is solid. The remaining gaps are the undocumented job_id parameter and the absence of any auth or prerequisite context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter job_id has 0% schema description coverage, and the description never mentions it or its expected format/source. Unlike the zero-parameter baseline case, here the description leaves the one parameter entirely undocumented.
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 opens with a specific verb+resource pair ('Stop a job'), which is better than a tautology. However, 'job' is never identified as a transcription job, and there is no differentiation from the sibling transcript_delete, which an agent could reasonably confuse with cancellation.
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?
Usage is implied rather than stated: the note that 'the job can be resumed later' implicitly contrasts cancellation with the destructive transcript_delete, but no alternative is named and no explicit when-to-use or when-not-to-use condition is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_createA
Start a transcription job and return its id immediately.
source is either an absolute local path (~ is expanded) or a URL —
YouTube, Instagram, TikTok, X, Vimeo, Reddit and anything else yt-dlp
supports, plus direct media URLs. Relative paths are refused, and a
playlist or channel URL is refused as ambiguous: pass one video.
The call never waits for work. Poll transcript_status, and read
partial output with transcript_get while it runs.
captions decides whether to use a platform's existing subtitles
instead of transcribing: manual_only (default) takes human-written
captions when present, which are usually better than Whisper;
prefer also accepts auto-generated ones, which are usually worse;
never always transcribes. The result reports origin so you know
which you got.
language is an ISO code to force; omit it for automatic detection.
force bypasses the cache and re-transcribes.
Sources longer than four hours are refused. Login-walled, private,
members-only or age-restricted URLs fail with auth_required — set
TRANSCRIPTOR_COOKIES_FROM_BROWSER (chrome, safari, firefox, brave) or
TRANSCRIPTOR_COOKIES_FILE in the server's .env and retry.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| source | Yes | ||
| captions | No | manual_only | |
| language | 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 are provided, so the description carries the full burden and does so well: it discloses the async/non-blocking behavior, the cache-bypass semantics of force, the 4-hour source limit, the auth_required failure mode and the exact env vars (TRANSCRIPTOR_COOKIES_FROM_BROWSER/FILE) needed to work around it. This is far more than the schema conveys.
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?
Though multi-paragraph, it is front-loaded with the core behavior first and then parameter semantics, and every sentence adds operational value that the 0%-covered schema and absent annotations leave unstated. No filler or restatement of the name.
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?
An output schema exists, so the description needn't detail return shape, yet it still notes that the result reports origin. Combined with the failure modes, limits, follow-up calls, and per-parameter semantics, an agent has everything needed to invoke this 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?
Schema description coverage is 0%, so the description must fully compensate, and it does: source (absolute path/expanded ~ vs URL, yt-dlp coverage, direct media URLs), captions (manual_only/prefer/never tradeoffs and the reported origin), language (ISO code, omit for auto-detect), and force (bypasses cache) are all explained with meaning beyond the bare types.
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?
States a precise verb+resource and its synchronous contract: 'Start a transcription job and return its id immediately.' It also implicitly distinguishes itself from the polling/read siblings it names (transcript_status, transcript_get), so an agent knows this is the initiation call, not the retrieval call.
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?
Explicitly tells the agent how to proceed after calling ('Poll transcript_status, and read partial output with transcript_get while it runs'), names the alternatives for the follow-up work, and states refusal conditions (relative paths, playlists/channels, >4h sources) with the retry path for auth-walled URLs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_deleteA
Delete a transcript. Destructive and not reversible.
Removes the job and its segments, chunks, events and cached renders.
delete_media=True also removes any scratch audio still on disk.
Refuses while the job is running — cancel it first.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| delete_media | 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 the full burden and does it well: it declares destructiveness, irreversibility, the exact cascade of deleted objects, the extra on-disk effect of delete_media=True, and the runtime precondition failure mode. This is far beyond what a bare 'delete' implies.
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?
Four short sentences, front-loaded with the destructive/non-reversible warning, then consequences, then the parameter caveat, then the precondition. No sentence is filler.
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?
An output schema exists, so return values need no explanation. For a destructive mutation tool with zero annotation coverage, the description covers impact scope, side effects, and the precondition that would otherwise cause a failed call — nothing an agent needs is missing.
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 fully explains the non-obvious parameter (`delete_media=True` also removes scratch audio on disk) and its default sense of being opt-in; job_id is self-evident, so nothing material is left ambiguous.
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?
States a specific verb+resource ('Delete a transcript') and immediately scopes it by enumerating exactly what is removed: the job, its segments, chunks, events and cached renders. This clearly separates it from sibling read tools (transcript_get, transcript_list) and from transcript_cancel, which it explicitly defers to.
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?
Gives an explicit when-not condition and the alternative action: 'Refuses while the job is running — cancel it first.' An agent knows to route to the cancel path first rather than attempting the delete and failing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_exportA
Write a transcript to a file at a path you choose.
The only thing Transcriptor writes to disk, and only on request.
dest_path must be absolute. Nothing partial is left behind if the
write fails.
The response also carries download_urls and view_url. If the
user asked for a link rather than a path, give them those — they are
served by this process and need no file at all. Write them as markdown
links in a sentence; a URL fenced in a code block has to be copied by
hand.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | srt | |
| job_id | Yes | ||
| dest_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 carries the full burden and does well: it discloses that this is the only disk-writing operation, that it happens only on request, that dest_path must be absolute, and that the write is atomic ('nothing partial is left behind'). It omits whether an existing file at dest_path is overwritten and what permissions/auth are required, which are material gaps for a mutation tool.
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?
Three tight paragraphs, front-loaded with the action, then the write semantics, then the response-handling guidance. The markdown-vs-code-block styling advice is somewhat peripheral but earns its place by instructing the agent on output formatting.
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?
An output schema exists, so return values needn't be re-explained, yet the description usefully flags download_urls and view_url. Combined with the atomicity note and absolute-path constraint, this is nearly complete; only overwrite behavior and any permission requirements are missing for a disk-writing tool.
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 coverage is 0%, so the description must compensate for all three parameters. It adds real meaning for dest_path (absolute requirement) but says nothing about the `format` parameter or its srt default, and nothing about job_id. Partial compensation only.
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?
States a specific verb and resource ('Write a transcript to a file at a path you choose') and immediately distinguishes itself from the read-style siblings ('The only thing Transcriptor writes to disk'). An agent can tell this apart from transcript_get or transcript_list without opening any schema.
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?
Explicitly routes the agent: use this when a file path is wanted, and if the user asked for a link, hand them the download_urls/view_url instead of writing a file. It names the condition that selects each path, which is exactly the when/when-not guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_find_clipsA
Find self-contained, high-density moments worth cutting into clips.
Scored on words per second, but only runs that begin at the start of a sentence and end at the end of one are considered — a moment that opens mid-clause is worthless however dense it is. Selected clips never overlap.
Returns, per clip: the ffmpeg command to cut it, the command to crop it to 9:16, and an SRT rebased to the clip's own clock for burning in. The commands are returned, not run — nothing is written to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| max_s | No | ||
| min_s | No | ||
| job_id | Yes | ||
| dest_dir | 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 the full burden and does well: it discloses the scoring heuristic, the sentence-boundary constraint, non-overlap, and critically that returned ffmpeg/crop commands are returned rather than executed and that nothing is written to disk. It omits auth requirements, rate limits, and failure modes, which keeps it short of a 5.
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?
Front-loaded with the core purpose, then constraints, then return contents, then the critical 'commands are returned, not run' caveat. Four sentences with little waste; the parenthetical clarification about mid-clause moments is the only slightly verbose passage.
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?
An output schema exists, so the description need not enumerate return fields, yet the parameter side is entirely uncovered and the dest_dir/'nothing written to disk' tension is left unresolved. For a 5-parameter tool with no annotations and no schema descriptions, this leaves real gaps for an agent to guess at.
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% for all five parameters. The description never explains count, min_s, max_s, or dest_dir; the dest_dir parameter is especially ambiguous given the claim that 'nothing is written to disk', yet the description does not reconcile this. Only job_id's role is inferable from context.
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?
States a specific verb and resource ('Find self-contained, high-density moments worth cutting into clips') and immediately defines the selection criteria (words per second, sentence-boundary alignment, non-overlap). This is clearly distinct from sibling operations like transcript_search or transcript_segments, which do not produce clip candidates.
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 criteria for what counts as a clip (sentence-bounded, dense, non-overlapping) is spelled out, which implies when the tool is appropriate. However, there is no explicit when-to-use versus alternatives such as transcript_search, and no mention of prerequisites (e.g. that job_id must reference a completed transcription job).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_getA
Transcript text, rendered from segments on demand.
format is txt, srt, vtt or json. mode="preview" is the default
deliberately: a long transcript returned whole floods the calling
agent's context. Use mode="full" when the user has actually asked for
the whole transcript — the default exists to stop unprompted flooding,
not to refuse a direct request.
The response also carries download_urls and view_url, which are
usually the better answer for a long transcript: the user gets a file
they can keep, and your context stays free for the work. Offer them as
markdown links in a sentence — a URL in a code block cannot be clicked.
Works on a running job — you get what is committed so far, with
partial: true.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| format | No | txt | |
| job_id | Yes | ||
| max_chars | 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 the full burden and does well: it discloses the preview/full default rationale, the flooding risk, the presence of download_urls/view_url, and that running jobs return committed text with partial:true. It omits auth/permission requirements and any rate-limit or error 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?
Front-loads purpose, then format/mode, then the download_urls recommendation, then the running-job caveat. Mostly efficient, though the mode paragraph re-states its rationale ('the default exists to stop unprompted flooding, not to refuse a direct request') at slight length.
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?
An output schema exists so return values need not be spelled out, yet the description usefully flags download_urls, view_url and partial:true. The only real gap for a 4-parameter tool is the undocumented max_chars, which matters given 0% schema coverage.
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 coverage is 0%, so the description must compensate. It documents format (txt/srt/vtt/json) and mode (preview/full), but leaves max_chars and job_id unexplained, so half the parameters remain undocumented in both schema and prose.
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?
States a specific verb+resource ('Transcript text, rendered from segments on demand'), which implicitly separates it from transcript_segments (raw segments) and transcript_export. However, it never names a sibling tool to route the agent, so differentiation from the 12 sibling tools rests on inference.
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?
Gives clear when/when-not guidance for mode: preview is the deliberate default to avoid context flooding, full is for a direct whole-transcript request, and download_urls are recommended for long transcripts. It stops short of naming the alternative siblings (e.g., transcript_export) that would make the routing fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_healthA
Engine state, real memory pressure, queue depth, degraded tasks.
engine and device say what is actually running here — mlx on
Metal, or faster-whisper on cuda or cpu. Worth reading before
promising a user how long something will take: the same model differs
by an order of magnitude between them. On a machine with a discrete
GPU the report also carries vram_*; on unified memory those keys
are absent, because there the GPU spends the memory
system_available_gb already accounts for.
Also reports whether the transcript download viewer is serving. If
viewer.available is false, viewer.error says why — usually the
port is already taken by another Transcriptor.
Memory numbers come from the monitor task's most recent sample rather than being measured inline, so this stays a database-and-memory read.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 the full burden and discloses key behaviors: it is a database-and-memory read (implying read-only), memory numbers come from the monitor task's most recent sample rather than being measured inline, and vram keys appear only on discrete GPUs. It could go further by explicitly stating no side effects or permission requirements, but it is substantially transparent.
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 front-loaded with a compact list of what it reports, followed by focused explanations of engine/device differences, vram behavior, viewer errors, and memory sampling. Some return-value detail may be redundant with the existing output schema, but the interpretive context largely earns its place.
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 output schema exists and there are no input parameters, the description is complete enough for correct invocation. It explains the health report's contents, usage context, and hardware-dependent variations. It could mention sibling alternatives, but no critical information is missing.
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 tool takes zero parameters, so the baseline is 4. The description does not need to add parameter semantics, and it correctly focuses on output and behavior instead.
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 enumerates the specific health aspects it reports—engine state, memory pressure, queue depth, degraded tasks, viewer status—and clarifies what engine/device mean. It clearly distinguishes the tool's diagnostic scope, but does not explicitly contrast it with sibling tools like transcript_status, so it falls short of a 5.
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?
It gives a clear when-to-use scenario: 'Worth reading before promising a user how long something will take.' This is explicit context rather than implied usage. However, it names no alternatives and no exclusions, so it does not reach 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_listB
Recent jobs, newest first.
Filter by status (queued, running, paused, done, failed, cancelled,
interrupted) for a board-level view of what is in flight, what is stuck
and what is finished.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses ordering ('newest first'), which the schema does not express, and clarifies the semantic intent of the status filter. However it omits pagination/result-cap behavior, authentication or workspace scoping, and whether all jobs are returned by default.
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?
Two short sentences, front-loaded with the core behavior and with no filler. The long status enumeration is verbose but is the highest-value information in the description, so it earns its space.
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?
An output schema exists, so return values need not be explained. Still, for a three-parameter list tool with zero schema coverage and no annotations, the description leaves the `query` filter and the `limit` behavior unexplained, which is a meaningful gap for an agent deciding how to call it.
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 all three parameters. It does enumerate the allowed `status` values (queued, running, paused, done, failed, cancelled, interrupted), which the schema lacks entirely, but it says nothing about `limit` or `query`, leaving two of three parameters undocumented anywhere.
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 states a specific resource (recent jobs) and a scope (newest first), plus a filtering mode, so an agent can tell it is a list/board view rather than a single-record fetch. It does not name any sibling (transcript_get, transcript_search, transcript_status) to sharpen the distinction, so it stops short of a 5.
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?
Usage is implied by 'for a board-level view of what is in flight, what is stuck and what is finished,' which suggests the monitoring/list use case. There is no explicit when-to-use versus transcript_search or transcript_status, and no statement of when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_probeA
Inspect a source without transcribing it, and without downloading it.
Says how long it is, whether captions already exist (which would make it
near-instant), whether it needs cookies, and whether you have already
transcribed it under these exact settings. Pass the same language and
captions you would pass to transcript_create, so existing reports
what would happen rather than what might.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| captions | No | manual_only | |
| language | 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 the full burden and does well: it discloses the non-destructive, no-download behavior, that caption existence 'would make it near-instant' (a latency hint), and that it reports whether cookies are needed. It omits auth/permission requirements and rate-limit behavior, which keeps it from a 5.
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?
Front-loaded with the defining constraint, and every sentence adds information. The final clause ('what would happen rather than what might') is slightly ornamental, and the line-broken formatting is a bit loose, but nothing is wasted.
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?
An output schema exists so return values need not be explained, and the description still previews the key signals an agent needs (duration, captions, cookies, existing). For a 3-param probe tool this is nearly complete; only auth/permission context and the captions default are unaddressed.
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 coverage is 0%, so the description must compensate, and it does for the two meaningful params: it explains that captions/language drive the 'existing' check and must match create's values. The 'source' param is only implicitly described ('inspect a source'), and the default caption mode 'manual_only' is never explained, leaving a small gap.
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?
States a specific verb and resource ('inspect a source') and immediately bounds the behavior ('without transcribing it, and without downloading it'), which separates it cleanly from transcript_create. The enumeration of what it reports (duration, caption presence, cookie need, existing transcript) makes the tool's effect 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?
Strong contextual guidance: 'Pass the same language and captions you would pass to transcript_create' tells the agent this is a pre-flight check that mirrors create's settings. It does not explicitly state when not to use it or name sibling alternatives, so it falls just short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_searchA
Find a phrase in a transcript, with timestamps.
The intended way into a long transcript, together with transcript_segments — pulling the whole thing would flood your context. Works on a running job: it searches what has been committed so far. Falls back to fuzzy matching when nothing matches whole words, which is what helps when you half-remember a phrase.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| job_id | Yes | ||
| max_results | No | ||
| context_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclosing meaningful traits: it works on a running job and only searches previously committed content, and it falls back to fuzzy matching when exact words fail. It does not state read-only/safety posture or rate/limit behavior, but the read nature is strongly implied by 'find'.
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?
Front-loaded with the core action in the first sentence, then behavior and rationale in short paragraphs. Every sentence adds information; nothing is filler.
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?
Output schema exists, so return values need not be described. The description covers purpose, use context, and runtime behavior (running jobs, fuzzy fallback), leaving only the underdocumented optional parameters as a gap.
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% for all four parameters, so the description must compensate and largely does not. It hints at query semantics ('phrase') and timestamps (mapping loosely to context_seconds), but says nothing about max_results or how context_seconds bounds the returned window.
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?
States a specific verb+resource ('find a phrase in a transcript') plus a key output trait (timestamps). It names transcript_segments as a companion but does not distinguish itself from other search-adjacent siblings such as transcript_find_clips or transcript_get.
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?
Gives clear context for use: it is 'the intended way into a long transcript' alongside transcript_segments, with the rationale that pulling the whole transcript would flood context. It names an alternative but offers no explicit when-not-to-use or exclusions (e.g., versus transcript_find_clips).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_segmentsA
Pull a time window of the transcript.
Segments overlapping the window are returned, not only those contained
by it, so a segment straddling the boundary still appears.
include_words roughly triples the response size, so it is off by
default.
| Name | Required | Description | Default |
|---|---|---|---|
| end_s | Yes | ||
| job_id | Yes | ||
| start_s | Yes | ||
| include_words | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose two non-obvious behaviors: overlapping (not just contained) segments are returned, and include_words roughly triples the response size so it defaults off. It omits prerequisites (e.g., whether the job must be finished), auth needs, and error 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?
Three short sentences, front-loaded with the core purpose, and each adds information. The straddling-boundary clause is slightly redundant with the preceding overlap sentence but usefully makes the rule concrete.
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?
An output schema exists, so return structure need not be described. The description covers the window semantics and the one costly parameter; only job prerequisites and time-unit details are missing, which is a modest gap for this complexity level.
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 coverage is 0% across 4 parameters, so the description must compensate. It explains include_words' cost and default, and the overlap rule clarifies start_s/end_s window semantics, but job_id and the units/format of the time bounds are left entirely to 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?
States a specific verb and resource with scope: 'Pull a time window of the transcript.' The boundary/overlap semantics further pin down exactly what is returned, which implicitly distinguishes it from transcript_get and transcript_search, though no sibling is named.
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?
Usage is implied by the boundary discussion (use this when you want a slice rather than the whole transcript), but there is no explicit when-to-use or when-to-prefer-an-alternative guidance relative to transcript_get, transcript_search, or transcript_export.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcript_statusA
Where a job stands: status, stage, progress, elapsed and ETA.
status is one of queued, running, paused, done, failed, cancelled,
interrupted. resumable says whether retrying helps — do not parse
the error message to decide.
Once the job has produced anything, the response also carries
download_urls (txt, srt, vtt, json) and view_url — loopback
links served by this process. Give them to the user when a job
finishes: clicking one downloads the transcript, which is a better
answer than pushing thousands of words through the chat.
Present a link as a markdown link inside a sentence, not inside a
code block — fenced blocks are not clickable, so the user has to
copy and paste. Prefer offering view_url alone: that page already
links to all four formats, so one link beats five.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | 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 carries the full burden and does so well: it enumerates the status lifecycle, explains that ``resumable`` is the authoritative retry signal, notes that ``download_urls``/``view_url`` only appear after output exists, and discloses that the links are loopback URLs served by this process. It even prescribes output presentation (markdown link in a sentence, not a code block), which is behavior an agent could not infer elsewhere.
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?
Front-loaded with the core answer and organized into short, scannable paragraphs. The closing presentation advice is useful but runs long and repeats the same idea twice ("one link beats five" plus "Prefer offering view_url alone"), which is minor padding.
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 read-only status endpoint with an output schema present, the description supplies everything an agent needs beyond the schema: the status vocabulary, the retry signal, and the conditional presence and handling of result links. The only omission, job_id provenance, is minor for a polling tool.
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 single required parameter ``job_id`` has 0% schema description coverage and is never mentioned in the description — no format, no indication of where to obtain it (presumably from transcript_create). With one undocumented required parameter, the description leaves a real gap rather than compensating.
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?
"Where a job stands: status, stage, progress, elapsed and ETA" gives a specific resource (an async job) and the exact facets returned, which is plainly distinct from siblings like transcript_get (content) or transcript_list (enumeration). An agent can tell this is the polling/status tool without opening any schema.
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?
Gives actionable use-time guidance: use ``resumable`` rather than parsing error text, and surface download/view links once the job has produced output. It does not explicitly name an alternative tool or state when *not* to call it (e.g. how often to poll, or to use transcript_get instead once done), so it stops short of full routing guidance.
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.
13 tool updates
v0.1.0- First observed
transcript_batch - First observed
transcript_cancel - First observed
transcript_create - First observed
transcript_delete - First observed
transcript_export - First observed
transcript_find_clips - First observed
transcript_get - First observed
transcript_health - First observed
transcript_list - First observed
transcript_probe - First observed
transcript_search - First observed
transcript_segments - First observed
transcript_status
TDQS
Scored across 13 tools
Each tool targets a distinct action, and descriptions explicitly clarify relationships (e.g. transcript_list for board view vs transcript_status for one job). The reading tools (transcript_get, transcript_segments, transcript_search) overlap in that they all return transcript content, though their modes differ enough to separate them.
Every tool uses the same transcript_ prefix followed by a clear snake_case verb/noun (list, create, cancel, delete, export, probe, search, segments, find_clips). No style mixing or vague names.
13 tools is well-scoped for a transcription service, covering the full job lifecycle plus read, search, clip-finding and health operations. Each tool earns its place without redundancy.
Core coverage is strong: create, list, status, get, search, segments, export, cancel, delete, batch, probe and health are all present. Minor gap: 'paused' and 'resumable' appear as statuses but no explicit pause/resume tool exists to trigger those states.
Maintenance
Related MCP Connectors
Transcribe audio & video: diarization, timed SRT/VTT, podcasts, paste-a-link, whole-feed batch.
Transcribe any audio or video URL to text, SRT and VTT, with chunking and only-new episodes
Whisper speech to text for podcast, audio and video URLs, 90+ languages, timestamped output.
Verbatim transcription of public video/audio URLs to clean text, SRT, and timestamped records.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables high-quality transcription and subtitle generation from local media files or URLs using Faster Whisper on local hardware. It supports automatic language detection and integration with MCP clients for seamless speech-to-text workflows.3-
- AlicenseNot gradedqualityAmaintenanceEnables high-performance, offline transcription of videos from 1000+ platforms and local files using whisper.cpp, with support for multiple model sizes, languages, and output formats over stdio or HTTP.18Apache 2.0
- AlicenseAqualityCmaintenanceEnables local video inspection and offline transcription with timestamped JSON and Markdown output, enforced filesystem boundaries, and reproducible content-addressed caching.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables an assistant to turn any video ffmpeg can read into a text transcript by extracting the audio, splitting it on silence, and transcribing each piece on-device through utt. Exposes tools to start a transcription job with optional hints and timestamps, and to poll for a transcript that is still being worked on.5 npmMIT