Skip to main content
Glama

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

mlx-whisper (Metal)

Measured: ~6.9 min per hour of audio

NVIDIA GPU (Linux, Windows)

faster-whisper (CTranslate2, CUDA)

Fast — see the note below

Anything else

faster-whisper (CTranslate2, CPU int8)

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.


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 punctuate
sudo 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 punctuate
winget 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 punctuate

Restart 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 doctor

That 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

mlx

Apple Silicon inference (Metal)

No transcription on a Mac — everything else runs

cuda

CTranslate2 inference + VRAM reporting

—

cpu

CTranslate2 inference, CPU only

No transcription off a Mac — everything else runs

vad

Silero speech detection

Whisper sees silence and may hallucinate

media

yt-dlp

URLs are refused with a named error; local files fine

punctuate

Sentence restoration

Transcripts are correct, just less readable

pgimport

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, gitignored

Sources, 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-mcp

User 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 monthly

HTTP 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

auth_required

Login-walled, private, members-only or age-restricted. Set TRANSCRIPTOR_COOKIES_FROM_BROWSER=chrome in .env

extractor_failed mentioning a JavaScript challenge

YouTube's anti-bot check. Cookies will not help. Install Deno (brew install deno), or set TRANSCRIPTOR_YTDLP_REMOTE_COMPONENTS=ejs:github — which lets yt-dlp download and run a solver script from GitHub, so it is opt-in

extractor_failed otherwise

Sites break yt-dlp constantly: transcriptor-mcp update-ytdlp

playlist_not_supported

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

TRANSCRIPTOR_ENGINE

auto

auto | mlx | faster-whisper | fake. Auto picks MLX on Apple Silicon, faster-whisper elsewhere

TRANSCRIPTOR_MODEL

(per engine)

mlx-community/whisper-large-v3-mlx-8bit under MLX, Systran/faster-whisper-large-v3 under faster-whisper. Neither engine can read the other's weights

TRANSCRIPTOR_DEVICE

auto

faster-whisper only. auto | cuda | cpu

TRANSCRIPTOR_COMPUTE_TYPE

(per device)

faster-whisper only. float16 on CUDA, int8 on CPU. Also int8_float16, float32

Storage

TRANSCRIPTOR_DATA_DIR

<repo>/.transcriptor

Model weights and scratch audio only

Database

TRANSCRIPTOR_DATABASE_URL

(required)

Required. Percent-encode @ : / # in the password

TRANSCRIPTOR_DB_SCHEMA

public

Set to share an existing database instead of a dedicated one

TRANSCRIPTOR_DB_POOL_MIN

1

TRANSCRIPTOR_DB_POOL_MAX

4

TRANSCRIPTOR_DB_CONNECT_RETRY_S

120

Startup wait — the client may launch before Docker is up

TRANSCRIPTOR_SEGMENT_BUFFER_MAX

500

Segments held in memory during a database outage

Download viewer

TRANSCRIPTOR_VIEWER_ENABLED

true

Serve finished transcripts as download links

TRANSCRIPTOR_VIEWER_HOST

127.0.0.1

Loopback. Change only if you understand what you are exposing

TRANSCRIPTOR_VIEWER_PORT

8766

Change if something else already has the port

Memory

TRANSCRIPTOR_MEM_SELF_CAP_GB

4.0

Max occupancy for Transcriptor. Measured peak is 3.04 GB (Apple Silicon)

TRANSCRIPTOR_MEM_SYSTEM_FLOOR_GB

2.5

Free memory left for everything else. Measured, not guessed

TRANSCRIPTOR_MEM_POLL_S

5

TRANSCRIPTOR_MEM_PAUSE_MAX_S

60

How long to wait under critical pressure before aborting

TRANSCRIPTOR_IDLE_EVICT_S

600

Unload the model after idle. Tightens under pressure

TRANSCRIPTOR_MAX_CONCURRENT

1

Do not raise on 16 GB. Two jobs means swapping

VRAM floor

0.5

Free GPU memory left for everything else. Applies only to a discrete GPU, and is estimated rather than measured — see domain/pressure.py

Pipeline

TRANSCRIPTOR_CHUNK_S

120

Chunk length; overlap is stitched away

TRANSCRIPTOR_OVERLAP_S

15

TRANSCRIPTOR_PUNCTUATE

True

Restore sentence boundaries after transcription

TRANSCRIPTOR_PUNCTUATION_MODEL

kredor/punctuate-all

TRANSCRIPTOR_KEEP_SCRATCH

False

Keep in-flight audio after a job, for debugging

TRANSCRIPTOR_SCRATCH_TTL_DAYS

30.0

Prune abandoned scratch. Active jobs are never touched

TRANSCRIPTOR_PRUNE_INTERVAL_S

3600.0

Job lifecycle

TRANSCRIPTOR_HEARTBEAT_S

10

TRANSCRIPTOR_STALE_JOB_S

90

Heartbeat age after which the reaper calls a job interrupted

TRANSCRIPTOR_REAPER_S

60

Input

TRANSCRIPTOR_CAPTIONS_DEFAULT

manual_only

manual_only

TRANSCRIPTOR_MAX_DURATION_S

14400

Refuse sources longer than this (4 hours)

TRANSCRIPTOR_MAX_DOWNLOAD_MB

2048

yt-dlp

TRANSCRIPTOR_YTDLP_REMOTE_COMPONENTS

(unset)

ejs:github to solve YouTube's JS challenge — downloads and runs remote code, so opt-in

TRANSCRIPTOR_COOKIES_FROM_BROWSER

(unset)

chrome, safari, firefox, brave — for login-walled sources

TRANSCRIPTOR_COOKIES_FILE

(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

transcript_probe

Inspect a source — duration, captions, whether you already have it. No download.

transcript_create

Start a job, return a job_id immediately

transcript_batch

Queue every media file in a folder

transcript_status

State, stage, progress, ETA, why it is queued

transcript_get

Transcript text in any format

transcript_export

Write a format to a path you choose

transcript_search

Find phrases with timestamps, fuzzy fallback

transcript_segments

Pull a time window

transcript_list

Recent jobs, filterable by status

transcript_cancel

Stop a job

transcript_delete

Remove a transcript

⚠️

transcript_find_clips

Self-contained high-density moments + ffmpeg commands

transcript_health

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. Change TRANSCRIPTOR_VIEWER_HOST only 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_export remains 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

transcript_create

< 250 ms

30–37 ms

transcript_status during a job

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

Three consequences worth knowing as a user:

  • You get a job_id in 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_get and transcript_search work mid-job and report partial: 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 .sql

make 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

BENCHMARKS.md

Contribute

CONTRIBUTING.md


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 automated

The .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. requests has 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 all the 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.md rather than filled in.

Contributing

CONTRIBUTING.md · CODE_OF_CONDUCT.md · SECURITY.md · CHANGELOG.md

The two contributions that would help most right now:

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

  2. 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 tools
transcript_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
folderYes
patternNo*
languageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
sourceYes
captionsNomanual_only
languageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description must 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
delete_mediaNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 0%, so the description must 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNosrt
job_idYes
dest_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
max_sNo
min_sNo
job_idYes
dest_dirNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNopreview
formatNotxt
job_idYes
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and discloses key behaviors: 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate 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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYes
captionsNomanual_only
languageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
end_sYes
job_idYes
start_sYes
include_wordsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 13 tool updatesv0.1.0
    • First observedtranscript_batch
    • First observedtranscript_cancel
    • First observedtranscript_create
    • First observedtranscript_delete
    • First observedtranscript_export
    • First observedtranscript_find_clips
    • First observedtranscript_get
    • First observedtranscript_health
    • First observedtranscript_list
    • First observedtranscript_probe
    • First observedtranscript_search
    • First observedtranscript_segments
    • First observedtranscript_status

TDQS

A3.9/5.0

Scored across 13 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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.
    18
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    MIT