An MCP server that enables downloading YouTube videos asynchronously to the user's Downloads folder
This server has significant definition quality gaps. Both tools have basic descriptions but lack critical detail for LLM selection and proper usage. Parameter descriptions are present but minimal. The server accepts user-provided URLs without validation or sanitization, and responses are unstructured strings rather than typed objects. Error handling is implicit rather than explicit, and no output schemas are documented. The tool `download_youtube_video` is particularly problematic: it performs a destructive write operation (downloads files to the user's system) but the description does not warn of this or explain the side effects. The tool also lacks idempotency guarantees or dry-run capability. Parameter validation is entirely absent from the visible code.
Check the status of a YouTube video download by download_id.
Download a YouTube video to the user's Downloads folder asynchronously. Args: url: The YouTube video URL. Returns: A download_id to check status.
CRITICAL: Destructive operation (download_youtube_video) lacks explicit warning in description. No mention that files are written to disk, no mention of potential side effects (storage consumption, network usage), no confirmation step, and no dry-run option. LLMs cannot determine safety implications.
CRITICAL: No input validation visible in code. Tool accepts raw URL string without verifying it is a valid YouTube URL. LLMs may pass arbitrary strings; tool will fail at runtime with unhelpful error messages (caught in try/except as generic 'error: {str(e)}').
HIGH: Return values are unstructured plain text strings instead of typed JSON objects. 'Download started. Use download_id ...' and 'Status for {download_id}: {status}' are human-readable but not machine-parseable. LLMs cannot reliably extract the download_id from the response string. No output schema documented.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
HIGH: Parameter descriptions are minimal (under 20 chars in some cases). 'The YouTube video URL' and 'The download ID to check status for' provide no guidance on format, validation rules, or examples. LLMs cannot infer constraints.
HIGH: Error handling is implicit and non-actionable. Generic exception catch returns 'error: {str(e)}'. An LLM receives 'error: ERROR: Unable to extract video information ycQXRKrsPxA. Please report this issue on https://github.com/yt-dlp/yt-dlp/issues/new...' (full yt-dlp error) with no guidance on recovery. No error classification (retryable vs fatal).
HIGH: Tool `check_download_status` returns 'Download ID not found' for unknown IDs, but LLM cannot distinguish between (a) download_id never existed, (b) download_id was lost due to server restart (no persistence), or (c) typo in the ID. No retry guidance or disambiguation.
MEDIUM: No output schema documented for either tool. Code shows tools return strings, but descriptions do not specify the structure. LLMs must infer the response format, leading to parsing errors.
MEDIUM: Input schema uses basic JSON Schema but lacks format constraints. `url` parameter has no pattern validation, no enum, no format='uri' declaration. LLM could pass 'not-a-url' and tool fails at runtime.
MEDIUM: Tool descriptions lack WHEN guidance. They state WHAT the tool does but not WHEN to use it or how it fits into a workflow. For example, `download_youtube_video` does not explain that you should check status with `check_download_status` afterward.
LOW: No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. `download_youtube_video` should be marked as destructive; `check_download_status` as readOnly. These hints help agents reason about safety and retry logic.