e18cab6054c12c67c65cdf72cbdf5b08164d7b19source_git · subdownload/subdownload-mcp · latest release
Observed 2026-08-25T10:16:42.986Z using mcpSecurity-inventory. Protocol 2025-06-18.
| Tool | Category | Risk |
|---|---|---|
fetch_transcriptFetch the existing official transcript (subtitles/captions) of a YouTube video, with per-segment timestamps and language detected. Errors with NO_CAPTIONS if the video has no captions — fall back to transcribe_video in that case to generate one with AI ASR. This call is free.Input schema{
"type": "object",
"properties": {
"video_id": {
"type": "string",
"description": "YouTube video ID (e.g. 'dQw4w9WgXcQ') or full YouTube URL.",
"minLength": 5
},
"lang": {
"type": "string",
"description": "ISO 639-1 language code to select among multilingual captions (e.g. 'en', 'zh', 'ja'). Omit for the video's default language."
},
"save": {
"type": "boolean",
"description": "When true, also save the video to the user's Library in the same call. Bookmarks the meta row and flips has_asr when the transcript was produced by our ASR. Does NOT upload a summary — use save_to_library with kind='summary' or kind='both' for that."
}
},
"required": [
"video_id"
]
}Annotations{
"title": "Fetch YouTube Video Transcript",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
fetch_video_infoFetch consolidated YouTube video metadata with numeric types — title, channel, duration, view count, publish date, thumbnail, description, captions availability. Does NOT include the transcript itself; call fetch_transcript or transcribe_video for that. Cheap, fast, free.Input schema{
"type": "object",
"properties": {
"video_id": {
"type": "string",
"description": "11-char YouTube video ID (e.g. 'dQw4w9WgXcQ') or full URL (watch, youtu.be, shorts, embed, live).",
"minLength": 5
}
},
"required": [
"video_id"
]
}Annotations{
"title": "Fetch YouTube Video Info",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
get_asr_taskPoll the status of an ASR task created by transcribe_video. Returns one of `queued`, `downloading`, `transcribing`, `finalizing`, `done`, or `failed`. When status is `done`, includes the full transcript with timestamps. Recommended polling interval: 3-5 seconds. Free — does not consume credits.Input schema{
"type": "object",
"properties": {
"task_id": {
"type": "string",
"description": "Task ID returned by transcribe_video.",
"minLength": 1
}
},
"required": [
"task_id"
]
}Annotations{
"title": "Get ASR Task Status",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
} | — | — |
get_channel_latest_videosGet the most recent videos from a YouTube channel — convenience wrapper over list_channel_videos with no pagination. Best for 'what did this creator publish recently?' style queries.Input schema{
"type": "object",
"properties": {
"channel": {
"type": "string",
"description": "@handle (e.g. '@mkbhd'), channel URL, or UC... channel ID.",
"minLength": 1
}
},
"required": [
"channel"
]
}Annotations{
"title": "Get Channel Latest Videos",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
get_library_itemRead a saved Library item with its transcript and AI summary inline (when available). Use after list_library to fetch the full content the user saved. Free.Input schema{
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "Library item id (returned by list_library or save_to_library)."
},
"locale": {
"type": "string",
"description": "Summary locale to fetch (e.g. 'en', 'zh'). Defaults to 'en'."
}
},
"required": [
"id"
]
}Annotations{
"title": "Get Library Item",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
} | — | — |
list_channel_videosList all videos from a YouTube channel ordered by publish date (newest first), with pagination. Returns up to 30 per page plus a `continuation` token if more results exist. For just the most recent handful, prefer get_channel_latest_videos for simplicity.Input schema{
"type": "object",
"properties": {
"channel": {
"type": "string",
"description": "@handle, channel URL, or UC... channel ID. Required for the first page; omit on subsequent pages and pass `continuation` instead."
},
"continuation": {
"type": "string",
"description": "Pagination token from a previous response's `continuation` field. Omit for the first page."
}
}
}Annotations{
"title": "List Channel Videos",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
list_libraryList videos the user has saved to their Library (transcripts + summaries). Supports substring search on title/author, favorites filter, and pagination. Returns recently saved items first. Scoped to the calling user's data only.Input schema{
"type": "object",
"properties": {
"favorite": {
"type": "boolean",
"description": "When true, return only items the user has favorited."
},
"q": {
"type": "string",
"description": "Substring match on title and author."
},
"limit": {
"type": "number",
"description": "Max items per page (1-100, default 20).",
"minimum": 1,
"maximum": 100
},
"offset": {
"type": "number",
"description": "Pagination offset (number of items to skip).",
"minimum": 0
}
}
}Annotations{
"title": "List Saved Library",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
} | — | — |
list_playlist_videosList videos in a YouTube playlist in order, with pagination. Returns video metadata and position within the playlist. Works for any public or unlisted playlist exposed by its URL/ID.Input schema{
"type": "object",
"properties": {
"playlist": {
"type": "string",
"description": "Playlist URL or ID (typically starts with 'PL', 'UU', 'LL', or 'FL'). Required for the first page."
},
"continuation": {
"type": "string",
"description": "Pagination token from a previous response's `continuation` field. Omit for the first page."
}
}
}Annotations{
"title": "List Playlist Videos",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
resolve_channelResolve a YouTube @handle, channel URL, video URL, or raw channel ID into canonical channel info (channel ID, name, handle, subscriber count, video count, avatar). Call this first when you only have a handle or URL but need a channel ID for the other channel-scoped tools.Input schema{
"type": "object",
"properties": {
"input": {
"type": "string",
"description": "@handle (e.g. '@MrBeast'), channel URL, video URL, or UC... channel ID. All common forms are accepted.",
"minLength": 1
}
},
"required": [
"input"
]
}Annotations{
"title": "Resolve YouTube Channel",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
save_to_librarySave a video to the authenticated user's Library. Three modes via `kind`: 'asr' bookmarks the video and flips has_asr (use after a successful transcribe_video → fetch_transcript flow); 'summary' uploads a summary blob; 'both' does both at once. Idempotent: saving the same video twice updates the existing entry.Input schema{
"type": "object",
"properties": {
"video_id": {
"type": "string",
"description": "YouTube video ID (11 chars).",
"minLength": 5
},
"kind": {
"type": "string",
"description": "'asr' (bookmark + flip has_asr), 'summary' (upload summary text), or 'both'.",
"enum": [
"asr",
"summary",
"both"
]
},
"title": {
"type": "string",
"description": "Video title (for display in the user's Library list)."
},
"author": {
"type": "string",
"description": "Channel / author name."
},
"thumbnail": {
"type": "string",
"description": "Thumbnail URL."
},
"video_url": {
"type": "string",
"description": "Full YouTube URL."
},
"language": {
"type": "string",
"description": "Video language code (ISO 639-1)."
},
"text": {
"type": "string",
"description": "Summary text. REQUIRED when kind='summary' or kind='both'. Plain text or markdown — use the `format` param to declare which."
},
"locale": {
"type": "string",
"description": "Summary locale (e.g. 'en', 'zh'). Used with kind='summary' or kind='both'."
},
"format": {
"type": "string",
"description": "Summary format: 'markdown' (default) or 'text'. Use 'markdown' if your text contains **bold**, bullets, headings, or code fences so the web UI renders it; use 'text' for plain prose.",
"enum": [
"markdown",
"text"
]
},
"model": {
"type": "string",
"description": "Optional model identifier, e.g. 'claude-opus-4'."
}
},
"required": [
"video_id",
"kind"
]
}Annotations{
"title": "Save to Library",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
} | — | — |
search_channel_videosSearch for specific videos within a single YouTube channel. Restricts results to the given channel. Use after resolve_channel if starting from a handle. Useful for 'find Karpathy's video about backpropagation' style queries.Input schema{
"type": "object",
"properties": {
"channel": {
"type": "string",
"description": "@handle, channel URL, or UC... channel ID.",
"minLength": 1
},
"q": {
"type": "string",
"description": "Search query (matched against video title and description within the channel).",
"minLength": 1
},
"limit": {
"type": "number",
"description": "Max results (1-50, default 30).",
"minimum": 1,
"maximum": 50
}
},
"required": [
"channel",
"q"
]
}Annotations{
"title": "Search Channel Videos",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
search_youtubeSearch YouTube globally for videos, channels, or playlists on any topic. Returns up to 50 results with metadata. Use this for topic-based discovery when the user has not specified a channel — for searching within a known channel use search_channel_videos instead.Input schema{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Search query (same syntax as YouTube's search bar, e.g. 'rust async tutorial', 'lex fridman dario amodei').",
"minLength": 1
},
"type": {
"type": "string",
"description": "Search type: 'video', 'channel', or 'playlist'. Default: 'video'.",
"enum": [
"video",
"channel",
"playlist"
]
},
"limit": {
"type": "number",
"description": "Max results (1-50, default 20).",
"minimum": 1,
"maximum": 50
}
},
"required": [
"q"
]
}Annotations{
"title": "Search YouTube",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
} | — | — |
transcribe_videoStart an asynchronous AI ASR (Whisper) transcription of a YouTube video. Returns immediately with a task_id and estimated_wait_seconds; the actual transcription runs in the background. Poll status with get_asr_task. Use this when fetch_transcript returned NO_CAPTIONS or when the video has no captions. Costs 5 credits, debited only on successful completion.Input schema{
"type": "object",
"properties": {
"video_url": {
"type": "string",
"description": "YouTube URL (watch, youtu.be, shorts, or embed form). Full URL preferred.",
"minLength": 5
},
"lang": {
"type": "string",
"description": "Optional language hint (ISO 639-1, e.g. 'en', 'zh'). Omit to auto-detect."
}
},
"required": [
"video_url"
]
}Annotations{
"title": "Transcribe YouTube Video (Async)",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
} | — | — |
No completed comparison is available.
| Risk | Change | Subject |
|---|---|---|
| No material changes recorded. | ||
| Severity | Finding | Advisory |
|---|---|---|
| No confirmed vulnerability is published for this version. | ||
Artifact SHA-256: 5fcde507df914d16b36c910ab2d502f7bcf11db9a67a5e9423186d43fa52bd15
Scanner: mcp-proof-engine 0.1.0.