MCP server for material scraping and downloading. Supports video, music, and image search from multiple sources (Mixkit, Incompetech, YouTube, Bilibili, DuckDuckGo, Pexels) and video download from 1000+ platforms via yt-dlp.
Static source inference · medium confidence · detected: Logging
Deprecated protocol patterns detected
Summary
This MCP server has fundamental structural deficiencies that severely limit its production readiness. While it provides 7 tools with schemas, the implementation exhibits critical gaps in description quality, error handling guidance, and parameter documentation. Tool descriptions vary wildly in quality, some are verbose but lack actionable clarity (search_media), while others are minimal (browser_close). Parameter descriptions are sparse or missing entirely across most tools. No evidence of output schema documentation, error recovery guidance, or input validation messaging. The code shows basic tool registration but lacks the polish required for confident LLM delegation. Per the rubric baseline of 194 chars average for tool descriptions and 72 chars for params, this server falls well short: descriptions range from 40 - 200+ chars (search_media is verbose Chinese text with source explanations, others are bare), and many parameters are undescribed (e.g., browser_screenshot.fullPage has no description). No security hardening, no permission gates, no audit trail patterns. Composition is reasonable (separate tools for search, download, video info, browser control), but the lack of guidance on error recovery and missing output schemas make it risky for autonomous agent use.
Missing output schema documentation. 6 of 7 tools lack documented return types. Agent does not know what fields to expect (e.g., get_video_info returns title/duration/resolution/thumbnail, but agent has no schema to plan downstream extraction).
Parameter descriptions are sparse or missing. browser_screenshot.fullPage has ZERO description, violates rubric rule 'Every parameter needs a description.' browser_navigate.url and download_media.filename have minimal guidance. Agents cannot infer valid values or constraints.
No error recovery guidance. All tools return generic errors (ToolResponse with error message) but do not categorize as retryable/user-fixable/fatal, offer alternatives, or suggest next steps.
search_media
Recommendations
Document output schema for all tools. For get_video_info, define: { title: string, duration: seconds, resolution: string, thumbnail_url: string, platform: string }. For search_media, define: { results: [{url, title, source, type}...], total_count, next_cursor }. For download_* tools, define: { file_path, file_size_bytes, status }. This unblocks agent downstream reasoning.
Add descriptions to all parameters. browser_screenshot.fullPage → 'If true, capture entire scrollable page; if false, capture visible viewport only.' download_media.filename → 'Filename to save as (optional; if omitted, auto-generated from URL and type).' Every parameter must have 30+ char description explaining what it controls and when to use.
Implement error recovery guidance. Instead of generic 'Tool execution failed: <message>', return structured errors: { error_type: 'retryable|user_fixable|fatal', message: '...', suggestion: '...', next_steps: [...] }. Example: download_video fails with 'URL not supported' → suggest 'Try get_video_info first to confirm URL is valid. Supported platforms: YouTube, Bilibili, TikTok.'
Add confirmation pattern for destructive operations. download_video and download_media should support idempotent mode (check if file exists, skip) or offer dry-run: { dry_run: true } parameter that returns what would be downloaded without actually writing. browser_close should return { browsers_closed: count, remaining_handles: count } and warn if resources remain.
Clarify browser state lifecycle. Document that browser_navigate, browser_screenshot, and browser_close operate on a shared Chromium instance. Add tool description: 'Stateful tool, operates on the current browser session. Call browser_close at end of session to avoid resource leaks. Subsequent navigate/screenshot calls auto-create new session if needed.' Add parameter guidance to browser_close: { force: boolean = false }, if true, kill even hung connections.
Spec posture evidence
Inferred effective spec: <=2025-11-25.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
No confirmation pattern for destructive operations. download_video and download_media perform file I/O (WRITE risk) and browser_close closes resources, but neither offers dry-run, confirmation_request, or idempotency guarantees. Agents could inadvertently overwrite files or break sessions.
Stateful browser singleton. Global variables (browser, page) in toolHandler.js are not thread-safe and create coupling between browser_navigate, browser_screenshot, and browser_close. No explicit lifecycle documentation or error recovery for hung browser states. Agents cannot reason about session state.
No parameter validation guidance. download_video.format enum lists 'best, 1080p, 720p, 480p' but no explanation of fallback behavior (e.g., if 1080p unavailable, use next best?) or why 4K is absent. download_media.type enum is present but no guidance on supported MIME types or file size limits. Agents will hallucinate unsupported values.
Ambiguous tool overlap. download_video and download_media both download files, but distinction is unclear. download_video targets 'YouTube, Bilibili, etc.' (video platforms via yt-dlp), while download_media is generic. Agent must reason about which to call, naming should disambiguate (e.g., download_video_from_platform vs download_url). Pattern violation: conflicting names.
Description quality inconsistent and partially non-English. search_media description is 200+ chars in Chinese with detailed source explanations (good for domain users, suboptimal for LLM agents). Other descriptions are bare English minimums. Inconsistency forces LLM to parse heterogeneous metadata; optimal descriptions are 50 - 200 chars, English, actionable prose.
No input validation rules in parameter descriptions. search_media.query is unbounded (agent could pass empty or 10,000-char string). download_video.url lacks format validation hint. No min/max bounds on numeric params, no regex patterns, no character restrictions documented.
No pagination/result limiting guidance. search_media defaults maxResults to 10 per source but no documentation of total result count, next_cursor, or what happens if results are large. get_video_info returns single object (fine), but no guidance on what fields are present.
search_media
Disambiguate download_video vs download_media. Rename download_video to 'download_from_video_platform' or constrain description: 'Download from online video platforms (YouTube, Bilibili, TikTok, etc.) using yt-dlp. For generic URLs, use download_media.' Add to download_media: 'Download arbitrary media (images, audio, video) from direct URLs or file servers.'
Rewrite descriptions in English, 50 - 200 char range. search_media current: 200+ Chinese chars with source details. Proposed: 'Search for videos, music, or images across Mixkit, YouTube, Bilibili, Incompetech. Use chinaMainlandOnly=true to avoid VPN-gated sources. Returns up to maxResults per source.' download_video current: 80 chars. Proposed: 'Download video from online platforms (YouTube, Bilibili, etc.) in specified quality. audioOnly=true extracts audio as MP3. Supports format fallback if requested quality unavailable.'
Add validation bounds to parameter descriptions. search_media.query: 'Search keyword (1 - 100 chars; longer queries may time out).' search_media.maxResults: 'Per-source result limit (1 - 50; default 10).' download_video.format: 'Video quality preference. If requested format unavailable, yt-dlp automatically selects next-best match. Enum: best (auto-select), 1080p, 720p, 480p.'
Implement input validation with actionable error messages. If search_media.query is empty, return: 'Search query required and must be 1 - 100 characters. Got empty string.' If download_video.format is invalid, return: 'Invalid format: got "4k", must be one of: best, 1080p, 720p, 480p.' This allows agent self-correction without retrying.
Document pagination and result limits. search_media should return: { results: [{...}...], total_count: N, next_cursor?: 'token' }. Description: 'Returns up to maxResults per source. For large result sets, use next_cursor to fetch additional pages. Total result count returned; agent should not assume all results fit in one response.'
Add security/scope declarations. No tool currently documents what permissions are required. Add to each: { permissions: ['read:internet', 'write:filesystem'] } (e.g., search_media is read-only; download_* are write-heavy). This enables least-privilege agent configs and audit trails.
Implement timeout and rate-limit guidance. search_media description: 'Timeout: 30s per source. If exceeding rate limits (common with DuckDuckGo), set chinaMainlandOnly=true to avoid blocked sources.' download_video: 'Timeout: 10 minutes for large files. Network errors are retryable; permission errors are fatal (check URL access).' This guides agent retry logic.