BulkTranscripts YouTube
Server Details
YouTube transcripts, search, channel/playlist listings and upload tracking for AI agents.
- Status
- Healthy
- Uptime
- 56.7% over 42 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 10 tools
Each tool targets a distinct resource or action: channel/playlist/latest video listing, single vs batch transcript fetching, background bulk extraction, status, results, and search scopes. The only potential overlap is get_transcripts vs start_bulk_extract, but the descriptions clearly differentiate batch size and synchronous vs asynchronous behavior.
All ten tools use consistent snake_case with an action_entity pattern (get_, list_, search_, start_). The naming is predictable and easy to parse.
Ten tools is well-scoped for a YouTube transcript bulk service: discovery, extraction, monitoring, and search each have a clear role with no obvious bloat or thinness.
The surface covers discovery, single and batch transcript retrieval, background bulk extraction, status polling, and results paging. A minor gap is the lack of a cancel/stop bulk job operation and a direct library listing, but core workflows are fully supported.
Available Tools
10 toolsget_bulk_statusCheck a bulk jobARead-onlyIdempotentInspect
Progress of a job started with start_bulk_extract: status (running, completed, stopped, failed), total, completed, failed, skipped (no captions), quota (not attempted for lack of credits), remaining, and check_again_in_seconds. Free. Wait at least check_again_in_seconds between polls; 0 means the job is finished.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run_id from start_bulk_extract. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| phase | No | |
| quota | No | Videos not attempted because credits ran out. |
| total | No | |
| cached | No | |
| failed | No | |
| run_id | Yes | |
| source | Yes | |
| status | Yes | running, completed or stopped. |
| billing | Yes | |
| skipped | No | Videos without captions; never charged. |
| stopped | No | |
| completed | No | |
| remaining | No | |
| interrupted | No | |
| videos_found | No | Null until a large channel has been listed. |
| check_again_in_seconds | Yes | Do not poll sooner than this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real behavioral value beyond them: the polling cadence constraint, the meaning of check_again_in_seconds=0, and that the call is free. It does not discuss error behavior for an unknown run_id, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the core purpose front-loaded and no filler. The middle field list is a long run-on, though it is information-bearing rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the return-field enumeration is partly redundant, but the polling rule and the quota/no-captions semantics make the definition self-sufficient for correct invocation. Nothing critical an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single run_id parameter with 100% schema description coverage, and the schema already states it comes from start_bulk_extract. The description adds no format or validation detail beyond that, 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?
The first clause names the specific resource (progress of a job from start_bulk_extract) and enumerates the status values, so an agent can immediately distinguish it from start_bulk_extract and list_bulk_results.
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 ties itself to the start_bulk_extract workflow and gives an explicit polling rule ('Wait at least check_again_in_seconds between polls; 0 means the job is finished'), which is clear usage context. It never names list_bulk_results as the follow-up for fetching results, so the alternative-route guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channel_videosList a channel's videosARead-onlyIdempotentInspect
List the videos of a YouTube channel (id, title, duration, URL) without fetching transcripts. Accepts @handle, channel URL, or UC… channel id. Costs 1 credit. Chain into get_transcripts to bulk-extract.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max videos to list, default 100. | |
| channel | Yes | Channel @handle, URL, or UC… id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| title | No | |
| billing | Yes | |
| channel | Yes | |
| results | Yes | |
| has_more | No | True when the listing stopped at `limit`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnly, idempotent, and non-destructive, and the description adds useful behavioral detail: it costs 1 credit, returns specific fields, skips transcripts, and accepts multiple identifier formats. No contradiction exists between the description and 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?
The description is three tight sentences with no filler: core function and output fields, accepted input formats and credit cost, and a downstream workflow hint. Every sentence earns its place, and the most important purpose information is front-loaded.
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 readOnly/idempotent annotations provided, the description covers everything an agent needs to call the tool correctly: what it returns, accepted inputs, cost, no-transcript behavior, and the natural next step for bulk extraction. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already have meaningful schema descriptions. The description's 'Accepts @handle, channel URL, or UC… channel id' repeats the channel schema text rather than adding new semantics, and the limit parameter's default and range live only in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List the videos of a YouTube channel' and names the returned fields (id, title, duration, URL). It also explicitly distinguishes itself from transcript-fetching tools by saying it does so 'without fetching transcripts', and it names accepted channel identifier formats. This clearly differentiates it from sibling tools like get_transcripts and get_latest_videos.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it is for listing a channel's videos and for not fetching transcripts, and it recommends a follow-up workflow via 'Chain into get_transcripts'. It does not explicitly enumerate exclusions versus get_latest_videos, search_channel, or get_playlist_videos, but the channel-scoped purpose and chain instruction are sufficient directional guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_videosTrack new uploads (free)ARead-onlyIdempotentInspect
Get a channel's newest uploads (up to 15) with publish dates, from YouTube's RSS feed (or a lightweight listing when the feed is unavailable). Always free — no credit charged — so it is ideal for monitoring channels, daily recaps, and 'did they post this week?' checks. Accepts @handle, URL, or UC… id.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel @handle, URL, or UC… id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | No | feed, or listing when the RSS feed was unavailable (then `published` may be null). |
| channel | No | |
| results | Yes | |
| channel_id | No | |
| billing_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description adds valuable behavioral context: it is free (no credit charged), uses a specific data source (RSS feed) with a fallback (lightweight listing when feed unavailable), and caps results at 15. These details inform the agent about how the tool behaves at runtime, which the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: the core action appears first, followed by the source and fallback, then pricing, then use cases, then accepted formats. Every sentence adds distinct value, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, the description covers all necessary operational aspects: what it returns (uploads with publish dates), the limit, the data source and fallback, cost, and identifier formats. An agent has everything needed to invoke it appropriately without missing details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description for 'channel' already explains 'Channel @handle, URL, or UC… id.' In the tool description, the same information is repeated ('Accepts @handle, URL, or UC… id.'). Since schema coverage is 100% and the description adds no new parameter-level detail, this stays at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('get'), a specific resource ('a channel's newest uploads'), a limit ('up to 15'), and includes 'publish dates' – fully distinguishing it from siblings like search_channel or get_channel_videos. It is concrete and unambiguous about what the tool returns.
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 explicitly lists ideal use cases ('monitoring channels, daily recaps, and 'did they post this week?' checks'), giving clear context for when to call it. However, it does not mention when not to use it or alternatives, so it stops short of explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playlist_videosList a playlist's videosARead-onlyIdempotentInspect
List every video in a YouTube playlist, in playlist order (courses and series keep their sequence). Accepts a playlist URL or bare playlist id (13, 18, 26 or 34 characters — all valid). Public and unlisted playlists only: YouTube reports a private playlist as nonexistent (error playlist_private) — ask the owner to set Visibility to Unlisted. Costs 1 credit. Chain into get_transcripts to bulk-extract.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max videos to list, default 100. | |
| playlist | Yes | Playlist URL or id (the list= value). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| title | No | |
| billing | Yes | |
| results | Yes | |
| has_more | No | True when the listing stopped at `limit`. |
| playlist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and open-world behavior; the description adds value by disclosing the playlist-ordering guarantee, private-playlist error behavior (playlist_private), and the 1-credit cost. It does not discuss pagination or the limit behavior, but the schema documents the limit and the output schema covers the response.
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?
Every sentence earns its place: purpose/order, accepted input formats, privacy constraint and remediation, credit cost, and downstream workflow. It is front-loaded with the core behavior and has no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool, the description covers input, ordering, privacy edge case, cost, and next-step chaining, and the output schema covers return structure. The only notable gap is that 'every video' is not reconciled with the schema's default/max limit, though the schema itself provides that information.
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 a 3; the description adds value beyond the schema by specifying that a bare playlist id of 13, 18, 26, or 34 characters is accepted and that a URL or the list= value works. The limit parameter is left to the schema, which is acceptable at full coverage.
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?
Opens with a specific verb and resource: 'List every video in a YouTube playlist, in playlist order,' which makes the operation and its ordering behavior immediately clear. This distinguishes it from sibling tools like get_channel_videos or get_latest_videos by focusing on the playlist resource. The phrase 'every' is a little strong given the optional limit, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical use context: it accepts playlist URLs or bare IDs, requires public/unlisted visibility, explains what to do about private playlists, and recommends chaining into get_transcripts for bulk extraction. It does not explicitly list alternative sibling tools, but the playlist-specific scope plus sibling names makes selection clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcriptGet YouTube video transcriptAInspect
Fetch the full transcript of one YouTube video as clean text with metadata (title, channel, duration, upload date, language). Accepts a watch URL, youtu.be link, Shorts URL, or bare 11-character video id. Costs 1 credit the first time it is added to this account's library; repeat reads are free. Set include_segments to true only when per-line timestamps are needed (much larger output).
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | Bypass the cache and re-extract (costs a credit). Default false. | |
| video | Yes | YouTube video URL or 11-character video id. | |
| language | No | Preferred caption language code, e.g. 'en' or 'de'. Defaults to 'en', falling back to whatever exists. | |
| include_segments | No | Include the timestamped segment list. Default false — the plain text is usually what you want. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| text | Yes | |
| title | Yes | |
| cached | No | True when served from this account's library (free). |
| source | No | manual_caption or auto_caption. |
| billing | Yes | |
| channel | Yes | |
| duration | No | |
| language | No | |
| segments | No | Only when include_segments is true. |
| video_id | Yes | |
| paragraphs | Yes | Silence-grouped paragraphs; best for reading and chunking. |
| word_count | No | |
| upload_date | No | |
| duration_text | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explains the non-obvious economics that justify readOnlyHint=false: the first fetch costs 1 credit because the video is added to the account's library, while repeat reads are free. It also discloses that include_segments produces a much larger payload and that 'fresh' bypasses the cache. This adds real context beyond the annotations rather than contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then accepted inputs, then cost and the segments caveat. Every sentence carries information the agent needs; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description still names the metadata fields returned. Input formats, credit cost, caching behavior, and the segments trade-off are all covered for a 4-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it enumerates accepted video input formats (watch URL, youtu.be, Shorts, bare 11-char id) and warns that include_segments substantially increases output size. The cost implications of a repeat fetch are also clarified.
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 ('Fetch the full transcript of one YouTube video as clean text') and scopes it to a single video, which cleanly separates it from the bulk sibling get_transcripts. The accepted input formats and the returned metadata are spelled out, so an agent knows exactly what it gets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance for include_segments ('only when per-line timestamps are needed') and implies single-video scope versus the plural get_transcripts sibling. It stops short of explicitly naming that sibling as the alternative for multi-video work, so it is context-rich but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcriptsGet many transcripts at onceAIdempotentInspect
Fetch transcripts for up to 20 videos in one call — pass an array of YouTube URLs or ids. Videos are fetched in parallel and the call returns within about 40 seconds; any video still being fetched at that point is listed in failed with code still_fetching, is not charged, and keeps fetching in the background — call this tool again with those ids in 15-30 seconds and they return instantly. Each new library addition costs 1 credit; repeats from this account's library are free. Videos without captions are reported per-item and do not fail the batch. For whole channels or playlists, first list the videos with get_channel_videos / get_playlist_videos, then batch the ids through this tool; one call counts as one request against the rate limit however many videos it holds. If the balance runs out, completed items are returned with partial=true and an out_of_credits stopped block.
| Name | Required | Description | Default |
|---|---|---|---|
| videos | Yes | Up to 20 YouTube video URLs or ids. | |
| language | No | Preferred caption language code. Default 'en'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| failed | Yes | |
| billing | Yes | |
| partial | No | Present and true when credits ran out mid-batch. |
| stopped | No | |
| requested | Yes | |
| succeeded | Yes | |
| transcripts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses latency behavior (~40s cutoff), per-item failure semantics, background continuation, credit cost model, rate-limit accounting, and out_of_credits partial results — far beyond what the annotations convey.
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?
Dense but front-loaded with the core promise and limits first, then failure/cost/retry semantics. Nearly every sentence carries operational weight, though it runs longer than strictly necessary.
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 batch tool with an output schema, the description covers everything an agent needs: scope limits, timeout behavior, retry path, cost, and partial-failure handling.
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 both parameters are already documented; the description mostly restates the array-of-ids concept and does not add format or syntax detail 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?
States a specific verb and resource ('Fetch transcripts'), quantifies scope ('up to 20 videos in one call'), and implicitly separates itself from the singular get_transcript and the bulk siblings.
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 explicit routing: use get_channel_videos / get_playlist_videos first, then batch ids through this tool. Also gives retry guidance (call again in 15-30 seconds for still_fetching ids).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bulk_resultsList a bulk job's resultsARead-onlyIdempotentInspect
One page of per-video outcomes for a bulk job: video id, title, channel, duration, word count and status (ok, cached, or error with a code). Never includes transcript text; fetch any listed video with get_transcript, which is free once the job has put it in the library. Pass next_cursor from the previous page to continue. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page, default 50. | |
| cursor | No | next_cursor from the previous page; omit for the first page. | |
| run_id | Yes | The run_id from start_bulk_extract. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| items | Yes | |
| total | No | |
| run_id | Yes | |
| status | Yes | |
| next_cursor | Yes | Pass back as `cursor` for the next page; null on the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds meaningful traits beyond them: the result set 'never includes transcript text', the enumerable status values (ok, cached, error with a code), pagination via next_cursor, and that the call is free. Return format detail is modest but the added constraints are genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, zero filler, and the most decision-relevant facts (scope, content exclusion, alternative tool, pagination) are front-loaded before the trailing cost note.
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 paginated read tool with an output schema, safety annotations, and full schema coverage, the description supplies everything an agent needs: scope, status vocabulary, pagination mechanics, cost, and the follow-up tool for transcripts.
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 limit and cursor are already documented in the schema. The description's cursor guidance ('Pass next_cursor from the previous page') restates the schema rather than adding new syntax or edge-case meaning, 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+resource ('One page of per-video outcomes for a bulk job') and enumerates the returned fields (video id, title, channel, duration, word count, status). This clearly separates it from get_bulk_status (job-level status) without the agent needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes transcript retrieval to the sibling tool: 'fetch any listed video with get_transcript, which is free once the job has put it in the library.' It also explains continuation via next_cursor. It doesn't explicitly compare against get_bulk_status, but the conditions for use are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_channelSearch inside a channelARead-onlyIdempotentInspect
Search within one channel's uploads to find its videos on a topic — great for researching what a creator has said about something without listing the whole archive. Accepts @handle, channel URL, or UC… id. Costs 1 credit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results, default 10. | |
| query | Yes | Topic to search for within the channel. | |
| channel | Yes | Channel @handle, URL, or UC… id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| query | Yes | |
| billing | Yes | |
| channel | Yes | |
| results | Yes | |
| channel_title | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds the unique cost of 1 credit and clarifies accepted channel formats, which are useful operational facts beyond the schema. No contradiction with 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?
Two concise sentences with no filler. The purpose is front-loaded, followed by use case, accepted formats, and cost – each earning its place. Efficient and scannable.
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 simple read-only search tool with an output schema, the description covers purpose, use case, input formats, and cost. Nothing an agent needs to decide whether to call it or how 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 description coverage is 100%, so the schema already documents channel, query, and limit. The description repeats the channel format but adds no new semantic detail about query or limit, keeping it at the baseline.
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 ('Search') and resource ('one channel's uploads') with the intent of finding videos on a topic. The description explicitly distinguishes it from listing the whole archive, which separates it from get_channel_videos and positions it against the broader search_youtube.
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 use case ('researching what a creator has said about something') and implies a channel-scoped alternative to global search. It does not explicitly name sibling tools or provide when-not-to-use guidance, but the 'without listing the whole archive' hint covers the main exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_youtubeSearch YouTubeARead-onlyIdempotentInspect
Search YouTube by keyword for videos, channels, or playlists (set type). Returns titles, ids, and URLs — useful for research, discovery, and finding videos to transcribe. Costs 1 credit per search.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | What to search for. Default video. | |
| limit | No | Max results, default 10. | |
| query | Yes | Search terms, e.g. 'claude code tutorial'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | |
| count | Yes | |
| query | Yes | |
| billing | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive hints. The description adds useful behavioral context beyond those: it returns titles/ids/URLs and costs 1 credit per search, which helps an agent understand side effects and pricing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences cover the action, scope, output, use cases, and cost with no filler. The most important information is front-loaded and every clause 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?
For a simple search tool with fully described parameters, safety annotations, and an output schema, this description is complete. An agent can decide when to use it, invoke it with the right parameters, and understand both behavior and cost.
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 query, type, and limit in detail. The description only lightly reinforces the type enum ('videos, channels, or playlists'), adding no substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Search YouTube by keyword') and the resource scope ('videos, channels, or playlists (set type)'), which is specific and distinguishable from the 'get_*' sibling tools. It does not explicitly name sibling alternatives like search_channel, so it falls short of full 5 differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete use cases: 'research, discovery, and finding videos to transcribe.' This is clear context for when the tool is appropriate, though it does not explicitly state when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_bulk_extractStart a bulk extraction jobAInspect
Extract every transcript of a YouTube channel, playlist or video list in the background. Returns immediately with a run_id; the server discovers the videos (free), fetches each transcript into this account's library (1 credit per new transcript, cache hits and repeats free, failures never charged) and keeps going after this call returns. Poll get_bulk_status no sooner than its check_again_in_seconds, then page outcomes with list_bulk_results and read any transcript with get_transcript (free once it is in the library). Up to 1,000 videos per job, 2 jobs per account at a time. Prefer this over repeated get_transcripts calls for anything larger than about 20 videos.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Channel (@handle or URL), playlist URL/id, or a single video URL. | |
| language | No | Preferred caption language code. Default 'en'. | |
| max_videos | No | Cap on videos to process, default 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| phase | No | |
| quota | No | Videos not attempted because credits ran out. |
| total | No | |
| cached | No | |
| failed | No | |
| run_id | Yes | |
| source | Yes | |
| status | Yes | running, completed or stopped. |
| billing | Yes | |
| skipped | No | Videos without captions; never charged. |
| stopped | No | |
| completed | No | |
| remaining | No | |
| interrupted | No | |
| videos_found | No | Null until a large channel has been listed. |
| check_again_in_seconds | Yes | Do not poll sooner than this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: returns immediately with a run_id, work continues server-side after the call, the credit model (1 credit per new transcript, cache hits free, failures never charged), and concurrency/volume limits (1,000 videos, 2 jobs per account). Annotations only cover the readOnly/openWorld/idempotent profile, so this is genuinely additive.
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?
Dense but front-loaded: purpose and async behavior come first, then the workflow, then limits and the sibling comparison. Every sentence carries information, though the single-paragraph packing of polling, pricing and quotas is on the heavy side.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description still surfaces the run_id the agent needs to proceed. For an async, credit-consuming job with concurrency limits, nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, language and max_videos including ranges and defaults. The description restates the 1,000-video cap but adds no syntax or format detail 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?
States a specific verb and resource ('Extract every transcript of a YouTube channel, playlist or video list') with clear scope (background job, up to 1,000 videos). It explicitly names the sibling it replaces ('repeated get_transcripts calls'), so an agent can distinguish it without opening schemas.
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 explicit when-to-use ('anything larger than about 20 videos') and a full follow-up workflow: poll get_bulk_status no sooner than check_again_in_seconds, page with list_bulk_results, read with get_transcript. Alternatives and their selection conditions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_transcript1 field changed- changed
Input schema / properties / video / descriptionPrevious value: -"YouTube video URL or 11-character video id (TikTok video URLs also work)."New value: +"YouTube video URL or 11-character video id."
10 tool updates
- Changed
get_bulk_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "cached": { + "type": "integer" + }, + "check_again_in_seconds": { + "description": "Do not poll sooner than this.", + "type": "integer" + }, + "completed": { + "type": "integer" + }, + "error": { + "type": [ + "string", + "null" + ] + }, + "failed": { + "type": "integer" + }, + "interrupted": { + "type": "integer" + }, + "phase": { + "type": "string" + }, + "quota": { + "description": "Videos not attempted because credits ran out.", + "type": "integer" + }, + "remaining": { + "type": "integer" + }, + "run_id": { + "type": "string" + }, + "skipped": { + "description": "Videos without captions; never charged.", + "type": "integer" + }, + "source": { + "properties": { + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "status": { + "description": "running, completed or stopped.", + "type": "string" + }, + "stopped": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "not_attempted": { + "type": "integer" + } + }, + "required": [ + "code" + ], + "type": "object" + }, + "total": { + "type": "integer" + }, + "videos_found": { + "description": "Null until a large channel has been listed.", + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "run_id", + "status", + "source", + "check_again_in_seconds", + "billing" + ], + "type": "object" +}
- Changed
get_channel_videos1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "channel": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "has_more": { + "description": "True when the listing stopped at `limit`.", + "type": "boolean" + }, + "results": { + "items": { + "properties": { + "channel": { + "type": [ + "string", + "null" + ] + }, + "channel_url": { + "type": [ + "string", + "null" + ] + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "published": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "video", + "channel", + "playlist" + ], + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "view_count": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "id", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "title": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "channel", + "results", + "count", + "billing" + ], + "type": "object" +}
- Changed
get_latest_videos1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing_note": { + "type": "string" + }, + "channel": { + "type": [ + "string", + "null" + ] + }, + "channel_id": { + "type": [ + "string", + "null" + ] + }, + "count": { + "type": "integer" + }, + "results": { + "items": { + "properties": { + "channel": { + "type": [ + "string", + "null" + ] + }, + "channel_url": { + "type": [ + "string", + "null" + ] + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "published": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "video", + "channel", + "playlist" + ], + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "view_count": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "id", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "feed, or listing when the RSS feed was unavailable (then `published` may be null).", + "type": "string" + } + }, + "required": [ + "results", + "count" + ], + "type": "object" +}
- Changed
get_playlist_videos1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "has_more": { + "description": "True when the listing stopped at `limit`.", + "type": "boolean" + }, + "playlist": { + "type": "string" + }, + "results": { + "items": { + "properties": { + "channel": { + "type": [ + "string", + "null" + ] + }, + "channel_url": { + "type": [ + "string", + "null" + ] + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "published": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "video", + "channel", + "playlist" + ], + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "view_count": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "id", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "title": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "playlist", + "results", + "count", + "billing" + ], + "type": "object" +}
- Changed
get_transcript1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "cached": { + "description": "True when served from this account's library (free).", + "type": "boolean" + }, + "channel": { + "type": "string" + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "duration_text": { + "type": [ + "string", + "null" + ] + }, + "language": { + "type": [ + "string", + "null" + ] + }, + "paragraphs": { + "description": "Silence-grouped paragraphs; best for reading and chunking.", + "items": { + "type": "string" + }, + "type": "array" + }, + "segments": { + "description": "Only when include_segments is true.", + "items": { + "properties": { + "duration": { + "type": "number" + }, + "start": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "start" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "manual_caption or auto_caption.", + "type": [ + "string", + "null" + ] + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "upload_date": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + }, + "video_id": { + "type": "string" + }, + "word_count": { + "type": "integer" + } + }, + "required": [ + "video_id", + "url", + "title", + "channel", + "text", + "paragraphs", + "billing" + ], + "type": "object" +}
- Changed
get_transcripts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "failed": { + "items": { + "properties": { + "error": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "video": { + "type": "string" + } + }, + "required": [ + "video", + "error" + ], + "type": "object" + }, + "type": "array" + }, + "partial": { + "description": "Present and true when credits ran out mid-batch.", + "type": "boolean" + }, + "requested": { + "type": "integer" + }, + "stopped": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "not_attempted": { + "type": "integer" + } + }, + "required": [ + "code" + ], + "type": "object" + }, + "succeeded": { + "type": "integer" + }, + "transcripts": { + "items": { + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "cached": { + "description": "True when served from this account's library (free).", + "type": "boolean" + }, + "channel": { + "type": "string" + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "duration_text": { + "type": [ + "string", + "null" + ] + }, + "language": { + "type": [ + "string", + "null" + ] + }, + "paragraphs": { + "description": "Silence-grouped paragraphs; best for reading and chunking.", + "items": { + "type": "string" + }, + "type": "array" + }, + "segments": { + "description": "Only when include_segments is true.", + "items": { + "properties": { + "duration": { + "type": "number" + }, + "start": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "start" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "manual_caption or auto_caption.", + "type": [ + "string", + "null" + ] + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "upload_date": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + }, + "video_id": { + "type": "string" + }, + "word_count": { + "type": "integer" + } + }, + "required": [ + "video_id", + "url", + "title", + "channel", + "text", + "paragraphs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "requested", + "succeeded", + "failed", + "transcripts", + "billing" + ], + "type": "object" +}
- Changed
list_bulk_results1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "items": { + "items": { + "properties": { + "channel": { + "type": [ + "string", + "null" + ] + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "error": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "position": { + "type": "integer" + }, + "status": { + "description": "ok, cached, error, skipped or quota.", + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "video_id": { + "type": [ + "string", + "null" + ] + }, + "word_count": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "position", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "next_cursor": { + "description": "Pass back as `cursor` for the next page; null on the last page.", + "type": [ + "integer", + "null" + ] + }, + "note": { + "type": "string" + }, + "run_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "run_id", + "status", + "items", + "next_cursor" + ], + "type": "object" +}
- Changed
search_channel1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "channel": { + "type": "string" + }, + "channel_title": { + "type": [ + "string", + "null" + ] + }, + "count": { + "type": "integer" + }, + "query": { + "type": "string" + }, + "results": { + "items": { + "properties": { + "channel": { + "type": [ + "string", + "null" + ] + }, + "channel_url": { + "type": [ + "string", + "null" + ] + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "published": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "video", + "channel", + "playlist" + ], + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "view_count": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "id", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "channel", + "query", + "results", + "count", + "billing" + ], + "type": "object" +}
- Changed
search_youtube1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "query": { + "type": "string" + }, + "results": { + "items": { + "properties": { + "channel": { + "type": [ + "string", + "null" + ] + }, + "channel_url": { + "type": [ + "string", + "null" + ] + }, + "duration": { + "type": [ + "number", + "null" + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "published": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "video", + "channel", + "playlist" + ], + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "view_count": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "id", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "type": { + "enum": [ + "video", + "channel", + "playlist" + ], + "type": "string" + } + }, + "required": [ + "query", + "type", + "results", + "count", + "billing" + ], + "type": "object" +}
- Changed
start_bulk_extract1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billing": { + "properties": { + "creditsCharged": { + "description": "Credits this call cost (0 on cache hits).", + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "freeLimit": { + "type": "integer" + }, + "granted": { + "type": "integer" + }, + "kind": { + "description": "anon (free tier), license (paid) or admin.", + "type": "string" + }, + "remaining": { + "description": "Credits left on this account.", + "type": [ + "integer", + "null" + ] + }, + "unlimited": { + "type": "boolean" + }, + "used": { + "type": "integer" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "cached": { + "type": "integer" + }, + "check_again_in_seconds": { + "description": "Do not poll sooner than this.", + "type": "integer" + }, + "completed": { + "type": "integer" + }, + "error": { + "type": [ + "string", + "null" + ] + }, + "failed": { + "type": "integer" + }, + "interrupted": { + "type": "integer" + }, + "phase": { + "type": "string" + }, + "quota": { + "description": "Videos not attempted because credits ran out.", + "type": "integer" + }, + "remaining": { + "type": "integer" + }, + "run_id": { + "type": "string" + }, + "skipped": { + "description": "Videos without captions; never charged.", + "type": "integer" + }, + "source": { + "properties": { + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "status": { + "description": "running, completed or stopped.", + "type": "string" + }, + "stopped": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "not_attempted": { + "type": "integer" + } + }, + "required": [ + "code" + ], + "type": "object" + }, + "total": { + "type": "integer" + }, + "videos_found": { + "description": "Null until a large channel has been listed.", + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "run_id", + "status", + "source", + "check_again_in_seconds", + "billing" + ], + "type": "object" +}
3 tool updates
- Added
get_bulk_status - Added
list_bulk_results - Added
start_bulk_extract
7 tool updates
- First observed
get_channel_videos - First observed
get_latest_videos - First observed
get_playlist_videos - First observed
get_transcript - First observed
get_transcripts - First observed
search_channel - First observed
search_youtube
Related MCP Connectors
YouTube data for AI agents: channels, videos, transcripts, comments, search. Video research.
YouTube transcripts, search, channel browsing, and playlists for AI agents via MCP.
YouTube transcripts, search, channels, playlists and bulk transcript jobs for AI agents. 14 tools.
💯 The fastest YouTube transcript + YouTube search MCP for AI agents. Try for free.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides AI agents with token-optimized access to YouTube data, including video details, transcripts, channel statistics, trending videos, and search.473 npmMIT
- AlicenseAqualityAmaintenanceConnect AI assistants to YouTube: search, transcripts, metadata, and more.1964 npm6MIT

fetchworks-mcpofficial
AlicenseAqualityBmaintenanceEnables AI agents to retrieve YouTube transcripts from individual videos, channels, and search results, supporting multiple output formats such as plain text, SRT, and VTT.328 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables AI clients to pull full transcripts from YouTube videos, search videos and channels, browse a channel's complete upload history, search within a single channel, and extract every video in a playlist through one hosted remote endpoint. It supports API-key or OAuth 2.1 sign-in with no local installation, returning metadata and paginated results with stable error codes.1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.