YouTube Transcript API
Server Details
YouTube transcripts in bulk: 12/12 in our test, zero failures charged; human vs auto flagged.
- Status
- Healthy
- Uptime
- 59.7% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- catalyst-labs-dev/catalyst-labs-mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 5 tools
Each tool targets a distinct operation: starting the transcript actor, aborting a run, checking run status, fetching dataset rows, or fetching a key-value record. There is slight overlap because the actor tool can return results directly while get-dataset-items also retrieves output, but the descriptions clarify when each should be used.
Four of the five tools follow a readable kebab-case verb_noun pattern (abort-actor-run, get-actor-run, get-dataset-items, get-key-value-store-record). The core actor tool is named after the vendor actor (catalyst-labs--youtube-transcript-api) rather than an action, creating a noticeable break in convention.
Five tools is tightly scoped for a run-and-retrieve workflow: start the actor, abort a run, poll status, fetch dataset output, and fetch a KV record. No tool feels superfluous, and the set is small enough to avoid overload.
The surface covers the full practical lifecycle for this purpose: start a transcript run, poll or abort it, then retrieve results from either datasets or key-value storage. There are no obvious dead ends in the core YouTube transcript workflow.
Available Tools
5 toolsabort-actor-runAbort Actor runADestructiveIdempotentInspect
Abort an Actor run that is currently starting or running. For runs with status SUCCEEDED, FAILED, ABORTING, ABORTED, or TIMED-OUT, this call has no effect. The results will include the updated run details after the abort request.
USAGE:
Use when you need to stop a run that is taking too long or misconfigured.
USAGE EXAMPLES:
user_input: Abort run y2h7sK3Wc
user_input: Gracefully abort run y2h7sK3Wc
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run to abort. | |
| gracefully | No | If true, the Actor run will abort gracefully with a 30-second timeout. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the no-effect-on-terminal-states rule, which is exactly what makes the idempotent hint meaningful, plus the fact that updated run details come back. It omits auth/permission requirements and any rate-limit 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-loaded with the core action and the state constraint, and every prose sentence earns its place. The 'USAGE EXAMPLES' block of raw user_input lines is mostly decorative and pads the definition slightly.
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?
With an output schema present, return values need not be spelled out, and the description still notes that updated run details are returned. For a two-parameter mutation with full annotation coverage, only auth requirements are unaddressed, which is a minor 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 100%, so both parameters and the 30-second graceful-abort timeout are already documented in the schema. The description only gestures at 'gracefully' via an example, adding no syntax or semantic meaning beyond the schema. Baseline 3 applies.
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?
Specific verb (Abort) plus resource (Actor run) and a state qualifier ('currently starting or running'), which immediately distinguishes it from siblings like call-actor and get-actor-run. An agent can select it without opening the 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?
Explicit when-to-use ('stop a run that is taking too long or misconfigured') and an explicit no-op condition (terminal statuses such as SUCCEEDED, FAILED, ABORTED, TIMED-OUT). It does not name an alternative tool or describe prerequisites, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalyst-labs--youtube-transcript-apicatalyst-labs/youtube-transcript-apiADestructiveInspect
This tool calls the Actor "catalyst-labs/youtube-transcript-api" and retrieves its output results. Actor description: Starts a YouTube transcript run (videos, playlists, channels, search) and waits up to waitSecs (max 45s). Returns results, or a runId to poll with get-actor-run, then fetch rows with get-dataset-items. Use those for runs already started. $0.008/transcript, less on paid plans; no-caption videos free.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "transcripts" downloads transcripts. "listCaptionTracks" is free: it returns each video's caption languages and track types (creator or auto-generated) and which track a transcript run would return, without downloading or charging a transcript. Up to 1,000 videos per run. Example: "listCaptionTracks" Example values: "transcripts" | transcripts |
| videos | No | One per line: video, Shorts or youtu.be links, 11-character video IDs, playlist URLs, or channel URLs/@handles (add /shorts or /streams for those tabs). Channels return newest videos first. Example values: ["https://www.youtube.com/watch?v=jNQXAC9IVRw","https://www.youtube.com/@TED"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| languages | No | Caption languages in order of preference (ISO codes, e.g. en, es, pt-BR). The first one available is returned. Regional variants count: "en" also matches en-GB and en-US, and a human-made track in any variant is used before an auto-generated one. Example values: ["en"] | |
| maxVideos | No | Overall cap across all sources. 0 = no cap. | |
| monitorId | No | Optional name for the incremental-monitoring memory, e.g. "competitors-tech". Defaults to the list of sources. | |
| punctuate | No | Some YouTube auto-generated captions come as one long lowercase stream with no punctuation. When enabled, those tracks get sentence punctuation (. , ?) and capitalization restored by a built-in model, returned as punctuatedText (and punctuatedSegments). The raw text and segments are never changed. Human-made captions and auto-captions YouTube already punctuated are left as they are. No extra charge. Supported: English and 44 other space-separated languages (not Japanese/Chinese). | |
| maxRetries | No | Retries with backoff (and a fresh proxy session) after rate limits or network errors. Example values: 3 | |
| searchSort | No | How search results are ordered. Example values: "relevance" | relevance |
| captionType | No | Which caption tracks may be used. Every result says whether it is auto-generated. Example values: "any" | any |
| referrer_id | No | Referral code from another user's receipt (ref_...). They earn 10% of this run's price as credit. | |
| translateTo | No | Optional ISO code, best effort. If none of the preferred languages exists, ask YouTube for its machine translation. YouTube often refuses these requests from servers; then the original captions are returned with a warning (or TRANSLATION_UNAVAILABLE if fallback is off). Never charged when it fails. | |
| preferManual | No | When both exist in a language (including regional variants such as en-GB / en-US), use the human-made track. Example values: true | |
| onlyNewVideos | No | Skip videos this monitor already delivered in earlier runs (not charged). Schedule the run daily to track competitor channels. | |
| outputFormats | No | One or more formats per transcript. All formats cost the same. "LLM-ready text" adds llmText: the same words with sound cues ([Music], [Applause], (laughs)), music notes and >> speaker markers removed; the raw text field is unchanged. "Markdown" adds a markdown field per video and one combined TRANSCRIPTS.md file in the key-value store. Example values: ["text","segments"] | |
| searchQueries | No | Optional. Each term is searched on YouTube and its top videos are transcribed (up to "Max videos per source"). | |
| buyerPublicKey | No | Base64 Ed25519 public key (SPKI). Lets you sign a useful/not useful verdict on this run's receipt. Verdicts are recorded but never earn credit or discounts. | |
| includeDetails | No | Adds publishDate, likeCount, commentCount and the channel's subscriberCount (one extra request per video, no extra charge). YouTube rounds comment counts above 1,000 and subscriber counts (e.g. 2.4M), so those are approximate. Turned on automatically when you use a date filter. Example values: true | |
| maxConcurrency | No | Videos fetched in parallel. Example values: 5 | |
| publishedAfter | No | Only videos published on/after this date: YYYY-MM-DD or relative like "30 days". Uses exact upload dates. | |
| includeMetadata | No | Title, channel, duration, views, tags, thumbnail. Example values: true | |
| publishedBefore | No | Only videos published on/before this date: YYYY-MM-DD or relative like "7 days". | |
| disableAutoProxy | No | Only for debugging: never switch to a proxy automatically. | |
| includeDescription | No | Adds the full video description. | |
| maxVideosPerSource | No | Cap per playlist, channel tab or search term (newest first for channels). 0 = all. Single video links are always included. Example values: 5 | |
| proxyConfiguration | No | Leave empty for automatic mode: the Actor starts without a proxy and, if YouTube blocks it, switches to Apify datacenter and then residential proxy at no extra cost to you. Set your own proxy here to override. | |
| fallbackToAnyLanguage | No | If no preferred language (or translation) exists, return the video's original spoken language (human-made track if there is one), or the best available track, instead of failing. The result then has requestedLanguageFound=false, languageFallback ("originalLanguage" or "anyLanguage") and a warning. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=true and openWorld=true; the description adds genuinely useful behavior beyond them — the 45s wait cap, the async runId fallback path, and per-transcript pricing with free no-caption videos. It does not explain why a transcript fetch is flagged destructive (cost rather than data loss), which would help an agent reconcile the annotation. No contradiction with the annotations.
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 sentences, front-loaded with the run lifecycle, then the polling alternative, then pricing. The first sentence is boilerplate that restates the tool name, but the rest is dense and 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?
With an output schema present, return-value detail is not required, and the description covers the start-run/wait/poll lifecycle and cost model that an agent needs. For a 27-parameter tool it omits the free listCaptionTracks mode and language fallback behavior, but those are documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% across 27 parameters, so the schema already carries the detail and a baseline of 3 applies. The description adds only marginal meaning, notably that sources can be videos, playlists, channels or search, and that waitSecs caps the wait. It does not surface high-impact parameters such as mode=listCaptionTracks (free, no charge) or languages, which would materially change how an agent calls it.
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 concrete verb and resource: it starts a YouTube transcript run over videos, playlists, channels or search and returns the results. It also names the sibling tools (get-actor-run, get-dataset-items) used for runs already started. The only softness is the opening boilerplate line claiming it 'retrieves its output results', which is then qualified as 'returns results, or a runId to poll'.
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 an explicit routing rule: use get-actor-run and get-dataset-items for runs that were already started, implying this tool is for starting new runs. It also notes the wait cap behavior, so an agent knows when it will get a runId instead of data. It does not cover when to prefer this over a plain search/scrape alternative, but among the given siblings the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-actor-runGet Actor runARead-onlyIdempotentInspect
Get detailed information about a specific Actor run.
Returns run result: status, storages (datasets/keyValueStores alias map), stats, summary, nextStep.
summary describes the past (e.g. "SUCCEEDED in 22s. 47 items; 3 fields available.").
nextStep prescribes one primary follow-up action with identifiers interpolated (e.g. "Use get-dataset-items with datasetId=...").
waitSecs (0–45, default 30) waits up to that many seconds for terminal status before returning.
USAGE:
Use to check the status of a run started by any Actor-running tool.
Pass waitSecs > 0 to block until terminal (or until the cap elapses).
USAGE EXAMPLES:
user_input: Show details of run y2h7sK3Wc
user_input: Wait for run y2h7sK3Wc to finish
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run. | |
| waitSecs | No | Maximum seconds to wait for the run to reach a terminal state (SUCCEEDED, FAILED, ABORTED, TIMED-OUT). 0 returns immediately with the current status. Cap: 45. Default: 30. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, but the description adds real behavioral context beyond them: the summary vs. nextStep semantics, and that waitSecs blocks for up to 45s (default 30) before returning the current state. This is substantive added value, though it doesn't cover error/failure modes.
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 segmented into Returns/USAGE/EXAMPLES blocks. Every line carries information, though the two usage examples are somewhat redundant with the USAGE prose, adding minor 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?
With an output schema present and 100% parameter coverage, the description need only orient the agent, which it does fully: purpose, when to use, wait semantics, and concrete invocation examples. Nothing needed to call it correctly 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 coverage is 100%, so the baseline is 3, but the description goes further by framing waitSecs as a blocking/wait mechanism with its cap and default, and by describing what runId's run produces. Slight above-baseline value over the schema text.
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 ('Get detailed information about a specific Actor run') and enumerates the returned result fields (status, storages, stats, summary, nextStep). It does not explicitly distinguish itself from siblings like call-actor or abort-actor-run, so it falls just short of the 5 benchmark.
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 USAGE block names the condition ('check the status of a run started by any Actor-running tool') and explains when to pass waitSecs > 0 to block until terminal. It gives clear context but stops short of explicit exclusions or naming the sibling to use for other run operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-dataset-itemsGet dataset itemsARead-onlyIdempotentInspect
Get items (rows) from a dataset — the output/results produced by an Actor run. Returns the rows themselves, not dataset metadata, counts, or a schema. When the user provides a datasetId and asks to retrieve results, output, data, or rows, call this tool directly. Default limit is 20. Use clean=true to skip empty items and hidden fields.
USAGE:
Use when you need to read data from a dataset (all items or only selected fields).
USAGE EXAMPLES:
user_input: Retrieve results from dataset abc123
user_input: Get only metadata.url and title from dataset username~my-dataset
| Name | Required | Description | Default |
|---|---|---|---|
| desc | No | If true, results are returned in reverse order (newest to oldest). | |
| omit | No | Comma-separated list of fields to exclude from results. | |
| clean | No | If true, returns only non-empty items and skips hidden fields (starting with #). Shortcut for skipHidden=true and skipEmpty=true. | |
| limit | No | Maximum number of items to return. Default is 20. | |
| fields | No | Comma-separated list of fields to include in results. Fields in output are sorted as specified. Use dot notation for nested objects (e.g. "metadata.url"); the server auto-flattens parent prefixes. | |
| offset | No | Number of items to skip at the start. Default is 0. | |
| flatten | No | Comma-separated list of fields to flatten (e.g. flatten="metadata" turns {"metadata":{"url":"x"}} into {"metadata.url":"x"}). Normally derived automatically from dot-notation in `fields`; specify only as a diagnostic override. | |
| datasetId | Yes | Dataset ID, name (resolved against your own datasets), or full name as username~name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Dataset items |
| limit | Yes | Limit used for pagination |
| offset | Yes | Offset used for pagination |
| summary | Yes | Summary of the result |
| nextStep | Yes | One follow-up action with tool name |
| datasetId | Yes | Dataset ID |
| itemCount | Yes | Number of items returned |
| totalItemCount | Yes | Total items in dataset |
| apifyConsoleUrl | No | Personalized Apify Console link to the dataset; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description adds value by disclosing the default limit of 20, what clean=true does, and that results are the raw rows. Return-shape details are largely deferred to the existing output schema, which is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the anti-scope sentence, followed by short usage notes and examples. Slightly redundant in repeating the limit default and the clean flag across sections, but nothing wasteful enough to hurt.
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 tool with full schema coverage and an output schema, the description supplies the purpose, trigger, and key defaults an agent needs. Pagination interaction (offset/limit) and flatten behavior are left to the schema, which is reasonable given the output schema exists.
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 100%, so the schema already documents all eight parameters in depth. The description only restates the default limit and clean=true semantics, adding little beyond the structured fields; baseline 3 applies.
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 ('Get items (rows) from a dataset') and immediately delimits scope by saying it returns rows themselves, not metadata, counts, or schema. An agent can distinguish the intent without opening the 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 a clear trigger ('When the user provides a datasetId and asks to retrieve results, output, data, or rows, call this tool directly') plus a usage section and two concrete examples. It lacks explicit when-not guidance relative to any alternative, but the sibling list contains no competing dataset-read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-key-value-store-recordGet key-value store recordARead-onlyIdempotentInspect
Get the value stored under a specific key in a key-value store — a single record, not a listing of all keys. Requires the exact key name. The response preserves the original Content-Encoding; most clients handle decompression automatically.
USAGE:
Use when you need to retrieve a specific record (JSON, text, or binary) from a store.
USAGE EXAMPLES:
user_input: Get record INPUT from store abc123
user_input: Get record data.json from store username~my-store
| Name | Required | Description | Default |
|---|---|---|---|
| recordKey | Yes | Key of the record to retrieve. | |
| keyValueStoreId | Yes | Key-value store ID, name (resolved against your own key-value stores), or full name as username~name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | Record key |
| value | Yes | The stored value (JSON, text, or binary) |
| summary | Yes | Summary of the result |
| contentType | No | MIME type of the stored value |
| keyValueStoreId | Yes | Key-value store ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered elsewhere. The description earns credit for adding behavioral context beyond that: the 'requires the exact key name' precondition and the note that the response preserves the original Content-Encoding, which most clients decompress automatically — a real return-value trait callers would otherwise trip over.
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 key facts — scope, exact-key requirement, encoding caveat — are front-loaded in three tight sentences. The subsequent USAGE and USAGE EXAMPLES blocks are somewhat redundant with the first paragraph, costing a little efficiency.
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?
A two-parameter read tool whose annotations, 100% schema coverage, and output schema already cover safety, inputs, and return shape. The description closes the remaining gap with the Content-Encoding behavior, which is exactly the non-obvious detail an agent needs.
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 100%, including the keyValueStoreId resolution rules (name vs. username~name) and minLength constraints in the schema itself. The description only reinforces that the key must be exact, adding little semantics beyond what the schema already documents, so the baseline 3 applies.
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 ('Get the value stored under a specific key in a key-value store') and preemptively scopes it against a listing tool: 'a single record, not a listing of all keys.' An agent can immediately tell this is a point lookup, not an enumeration.
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 says when to use it ('when you need to retrieve a specific record (JSON, text, or binary)') and includes two concrete usage examples showing the store identifier formats. However, it never states when NOT to use it or names an alternative/sibling for enumeration, so the guidance is implied rather than comparative.
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 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api11 fields changed- removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTrackCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTracksRemoved value: -{ - "items": { - "properties": { - "isAutoGenerated": { - "type": "boolean" - }, - "isDefault": { - "type": "boolean" - }, - "isTranslatable": { - "type": "boolean" - }, - "languageCode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" -} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorAdded value: +{ + "type": "string" +} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorCode / typePrevious value: -"null"New value: +[ + "null", + "string" +] - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorTypeAdded value: +{ + "type": "string" +} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasAutoCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasCreatorCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isLiveRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / modeRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / translationLanguageCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / wouldReturnRemoved value: -{ - "properties": { - "languageCode": { - "type": "string" - }, - "languageFallback": { - "type": "null" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" -}
1 tool update
- Changed
catalyst-labs--youtube-transcript-api11 fields changed- added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTrackCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTracksAdded value: +{ + "items": { + "properties": { + "isAutoGenerated": { + "type": "boolean" + }, + "isDefault": { + "type": "boolean" + }, + "isTranslatable": { + "type": "boolean" + }, + "languageCode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorCode / typePrevious value: -[ - "null", - "string" -]New value: +"null" - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorTypeRemoved value: -{ - "type": "string" -} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasAutoCaptionsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasCreatorCaptionsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isLiveAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / modeAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / translationLanguageCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / wouldReturnAdded value: +{ + "properties": { + "languageCode": { + "type": "string" + }, + "languageFallback": { + "type": "null" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" +}
1 tool update
- Changed
catalyst-labs--youtube-transcript-api11 fields changed- removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTrackCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTracksRemoved value: -{ - "items": { - "properties": { - "isAutoGenerated": { - "type": "boolean" - }, - "isDefault": { - "type": "boolean" - }, - "isTranslatable": { - "type": "boolean" - }, - "languageCode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" -} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorAdded value: +{ + "type": "string" +} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorCode / typePrevious value: -"null"New value: +[ + "null", + "string" +] - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorTypeAdded value: +{ + "type": "string" +} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasAutoCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasCreatorCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isLiveRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / modeRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / translationLanguageCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / wouldReturnRemoved value: -{ - "properties": { - "languageCode": { - "type": "string" - }, - "languageFallback": { - "type": "null" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" -}
1 tool update
- Changed
catalyst-labs--youtube-transcript-api12 fields changed- added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTrackCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTracksAdded value: +{ + "items": { + "properties": { + "isAutoGenerated": { + "type": "boolean" + }, + "isDefault": { + "type": "boolean" + }, + "isTranslatable": { + "type": "boolean" + }, + "languageCode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorCode / typePrevious value: -[ - "null", - "string" -]New value: +"null" - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorTypeRemoved value: -{ - "type": "string" -} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasAutoCaptionsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasCreatorCaptionsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isLiveAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / modeAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / translationLanguageCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / wouldReturnAdded value: +{ + "properties": { + "languageCode": { + "type": "string" + }, + "languageFallback": { + "type": "null" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" +}
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api12 fields changed- removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTrackCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTracksRemoved value: -{ - "items": { - "properties": { - "isAutoGenerated": { - "type": "boolean" - }, - "isDefault": { - "type": "boolean" - }, - "isTranslatable": { - "type": "boolean" - }, - "languageCode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" -} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorAdded value: +{ + "type": "string" +} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorCode / typePrevious value: -"null"New value: +[ + "null", + "string" +] - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorTypeAdded value: +{ + "type": "string" +} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasAutoCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasCreatorCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isLiveRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / modeRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / translationLanguageCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / wouldReturnRemoved value: -{ - "properties": { - "languageCode": { - "type": "string" - }, - "languageFallback": { - "type": "null" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" -}
1 tool update
- Changed
catalyst-labs--youtube-transcript-api11 fields changed- added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTrackCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTracksAdded value: +{ + "items": { + "properties": { + "isAutoGenerated": { + "type": "boolean" + }, + "isDefault": { + "type": "boolean" + }, + "isTranslatable": { + "type": "boolean" + }, + "languageCode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorCode / typePrevious value: -[ - "null", - "string" -]New value: +"null" - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorTypeRemoved value: -{ - "type": "string" -} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasAutoCaptionsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasCreatorCaptionsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isLiveAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / modeAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / translationLanguageCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / wouldReturnAdded value: +{ + "properties": { + "languageCode": { + "type": "string" + }, + "languageFallback": { + "type": "null" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" +}
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api9 fields changed- removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTrackCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / captionTracksRemoved value: -{ - "items": { - "properties": { - "isAutoGenerated": { - "type": "boolean" - }, - "isDefault": { - "type": "boolean" - }, - "isTranslatable": { - "type": "boolean" - }, - "languageCode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" -} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasAutoCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / hasCreatorCaptionsRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isLiveRemoved value: -{ - "type": "boolean" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / modeRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / translationLanguageCountRemoved value: -{ - "type": "number" -} - removed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / wouldReturnRemoved value: -{ - "properties": { - "languageCode": { - "type": "string" - }, - "languageFallback": { - "type": "null" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" -}
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
catalyst-labs--youtube-transcript-api1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / commentCount / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
Related MCP Connectors
YouTube transcripts with timestamps, SRT/VTT and translation. No YouTube login. From $4/1k
YouTube transcript API: batch video captions, timestamps, metadata and SRT/VTT subtitles.
YouTube transcripts with timestamps from video links or channels. Charged only per transcript.
Free YouTube transcripts, no API key: videos, channel lists, latest uploads, bulk download links.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenancePay-per-success YouTube transcript extractor for AI agents and RAG pipelines. Timestamps, SRT, plain text. Failed videos are never charged. $0.005/video.-
- AlicenseNot gradedqualityCmaintenanceYouTube Skills (TranscriptAPI) is the production API for extracting, searching, and analyzing YouTube content at scale. While other tools break when YouTube changes or cap you at 100 requests/day, TranscriptAPI serves 15 million transcripts monthly at 49ms median response time.1,176MIT
- AlicenseAqualityBmaintenance14 tools for AI agents: transcript extraction in five formats with adjustable segment size, video metadata, video and channel search, channel browsing, in-channel search, playlists, and an asynchronous batch job for up to 4,000 transcripts. Free tier: 100 credits on signup, no card.141MIT
- AlicenseAqualityCmaintenance100% Free AI audio and video transcription with speaker diarization and YouTube support.512 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.