← MCP Security Catalog

SubDownload e18cab6054c12c67c65cdf72cbdf5b08164d7b19

source_git · subdownload/subdownload-mcp · latest release

Verified with no proven findings
Security result
13
Observed tools
Version rating
Change risk

Independent inventory

Observed 2026-08-25T10:16:42.986Z using mcpSecurity-inventory. Protocol 2025-06-18.

ToolCategoryRisk
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
}

Resources 0

Resource templates 0

Prompts 0

Changes from previous version

No completed comparison is available.

RiskChangeSubject
No material changes recorded.

Confirmed vulnerabilities

SeverityFindingAdvisory
No confirmed vulnerability is published for this version.

Provenance

Artifact SHA-256: 5fcde507df914d16b36c910ab2d502f7bcf11db9a67a5e9423186d43fa52bd15

Scanner: mcp-proof-engine 0.1.0.

Let’s talk about MCP security.

Share your details and our security team will contact you.