SubDownload MCP Server
Public MCP wrapper for SubDownload.Fetch YouTube transcripts, search videos, browse channels and playlists — instant YouTube data for your AI workflow
Install and connect
Installation and connection instructions are shown only when supported by retained package, repository, or endpoint evidence.
No verified installation or connection method is available in the retained evidence yet.
Identity
| Canonical slug | subdownload-0bf08ea3 | Deployment | Local Only |
|---|---|---|---|
| Canonical package | — | Repository | SubDownload/subdownload-mcp |
| First published | — | Latest release | — |
| Last security verification | Aug 25, 2026 | Classification confidence | 90% |
| Publication | Published | Official distribution | Yes |
Distributions
| Channel | Identifier | Current version | Versions | Source |
|---|---|---|---|---|
| source_git | subdownload/subdownload-mcp | e18cab6054c12c67c65cdf72cbdf5b08164d7b19 | 1 | Repository |
Current release
| Package | Version | Published / observed | Inventory | Security scan |
|---|---|---|---|---|
| source_gitsubdownload/subdownload-mcp | e18cab6054c12c67c65cdf72cbdf5b08164d7b19Current | Aug 25, 2026 | 13 toolsSucceeded · 0 resources · 0 prompts | Verified clean |
Continuously monitor this MCP for security risk
Independently scan the exact version your agents use, receive alerts when its risk changes, and investigate every finding with retained version evidence.
- Independent exact-version security scans
- Continuous release and vulnerability monitoring
- Risk-change alerts with capability context
- Historical evidence and API exports
Current version evidence
| Provenance | immutable_git_commit | Signature | — |
|---|---|---|---|
| MCP SDK | — | Artifact SHA-256 | 5fcde507df914d16b36c910ab2d502f7bcf11db9a67a5e9423186d43fa52bd15 |
| Scanner | mcp-proof-engine 0.1.0 | Scan completed | Aug 25, 2026 |
| Security rating | — | Methodology | — |
Current protocol inventory
Tools 13
| Tool | Category | Annotations | 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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentClosed world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentClosed world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentClosed world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | WritesNon-destructiveIdempotentClosed world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | Read onlyNon-destructiveNon-idempotentOpen world | — |
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
} | — | WritesNon-destructiveIdempotentOpen world | — |
Resources 0
- None observed.
Resource templates 0
- None observed.
Prompts 0
- None observed.
Remote endpoints
| Endpoint | Transport | Authentication | Health | Observed |
|---|---|---|---|---|
| No verified remote endpoint is linked. | ||||
SubDownload MCP Server questions
How do I install SubDownload MCP Server?
No verified package installation command is available in the retained catalog evidence.
What tools does SubDownload MCP Server provide?
SubDownload MCP Server exposed 13 tools during independent protocol observation, including fetch_transcript, fetch_video_info, get_asr_task, get_channel_latest_videos, get_library_item, list_channel_videos, list_library, list_playlist_videos, and others.
Is SubDownload MCP Server secure?
Our scanner tested version e18cab6054c12c67c65cdf72cbdf5b08164d7b19 without proving a finding in the methods exercised. This is not a guarantee that every deployment is secure.
Explore related MCP server guides
Curated product and capability guides containing this catalog record.