By jmagar
Download audio/video with yt-dlp (Rust binary), embed metadata + cover art, organize by artist, and transfer to an SSH remote with rsync or scp.
This plugin requires configuration values that are prompted when the plugin is enabled. Sensitive values are stored in your system keychain.
remoteSSH alias (~/.ssh/config) or user@host to transfer downloads to. Passwordless key auth required.
${user_config.remote}plex_urlOptional Plex server base URL, e.g. http://plex.local:32400, used to add downloaded audio tracks to a Plex playlist.
${user_config.plex_url}Admin access level
Server config contains admin-level keywords
Requires secrets
Needs API keys or credentials to function
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
ssh_optsAdditional ssh options parsed with shell-word syntax, e.g. -i "~/.ssh/ytdl key" -o ProxyJump=media-bastion. Appended after -o BatchMode=yes. Malformed quoting is rejected. Optional.
${user_config.ssh_opts}plex_tokenOptional Plex auth token for playlist/search API calls.
${user_config.plex_token}update_preUpdate from yt-dlp's nightly pre-release channel instead of stable.
${user_config.update_pre}ytdlp_pathUse a specific yt-dlp executable instead of auto-resolution/auto-download. Optional.
${user_config.ytdlp_path}archive_dirWhere the use_archive download history lives. Defaults to the per-user state dir, usually ~/.local/state/ytdl-mcp.
${user_config.archive_dir}auto_updateUpdate yt-dlp at server startup when stale. Recommended on — each session relaunch self-heals against extractor breakage.
${user_config.auto_update}ffmpeg_pathUse a specific ffmpeg executable instead of auto-resolution/auto-download. Optional.
${user_config.ffmpeg_path}fpcalc_pathOptional path to the Chromaprint fpcalc executable. If blank, youtube_identify searches PATH.
${user_config.fpcalc_path}staging_dirLocal directory to stage downloads before transfer. Defaults to system temp.
${user_config.staging_dir}audio_formatDefault codec when downloading audio: mp3, m4a, opus, flac, wav, or best.
${user_config.audio_format}history_pathJSONL file where completed download calls are logged for youtube_stats. Defaults to downloads.jsonl in the per-user state dir.
${user_config.history_path}max_age_daysUpdate yt-dlp when the installed version is older than this many days.
${user_config.max_age_days}ytdlp_sha256Optional SHA-256 digest required for the resolved yt-dlp executable.
${user_config.ytdlp_sha256}ffmpeg_sha256Optional SHA-256 digest required for the resolved ffmpeg executable.
${user_config.ffmpeg_sha256}plex_playlistDefault Plex playlist title or ID to add downloaded audio tracks to. Can be overridden per youtube_download call.
${user_config.plex_playlist}clean_metadataStrip common YouTube title noise such as '(Official Video)', '[Official Audio]', trailing channel handles, and extra whitespace before embedding metadata.
${user_config.clean_metadata}extractor_argsPassed to yt-dlp's --extractor-args, e.g. 'youtube:player_client=android' for videos the default clients can't reach. Optional.
${user_config.extractor_args}audio_dest_pathAbsolute remote directory for audio downloads, e.g. /mnt/user/data/media/music/yt-dlp
${user_config.audio_dest_path}video_dest_pathAbsolute remote directory for video downloads, e.g. /mnt/user/data/media/movies/yt-dlp. Falls back to the audio destination if blank.
${user_config.video_dest_path}ytdlp_timeout_secsMaximum runtime for each yt-dlp probe/download command.
${user_config.ytdlp_timeout_secs}acoustid_client_keyApplication API key for AcoustID lookups used by youtube_identify. Optional unless using identify.
${user_config.acoustid_client_key}musicbrainz_contactContact URL or email included in the User-Agent for metadata lookup requests.
${user_config.musicbrainz_contact}transfer_timeout_secsMaximum runtime budget for each transfer phase.
${user_config.transfer_timeout_secs}A cross-platform, single-binary MCP server that downloads media from any
yt-dlp-supported site (YouTube, Vimeo, …),
embeds metadata and cover art, organizes files by artist, and transfers the
result to a directory on an SSH remote — over rsync (with an scp fallback for
hosts that lack it, e.g. Windows).
Written in Rust on the rmcp crate. yt-dlp
and ffmpeg are auto-downloaded into a per-user cache on first run, so the host
needs neither pre-installed — the one binary is the whole install.
Artist/Title [id].ext so media servers (Plex, etc.)
index it cleanly. A non-greedy Artist - Title parse recovers the artist from
free-form video titles. Source .info.json, thumbnail, and description
sidecars are preserved next to the media for future retagging/indexing.
Common YouTube title noise like (Official Video), [Official Audio], and
trailing channel handles is stripped from embedded title metadata by default.ytdl-mcp setup registers the server into Claude Code,
Codex, and/or Gemini CLI via each tool's own mcp add.rsync --protect-args when present, scp otherwise;
non-interactive SSH (BatchMode=yes, StrictHostKeyChecking=accept-new) so a
TTY-less server never hangs on a prompt. On transfer failure the local staging
copy is kept for retry.use_archive records downloaded IDs (per mode) and skips
them on later runs; YouTube mix/radio URLs are auto-cleaned to the seed video.yt-dlp Downloads by default.| Tool | Purpose |
|---|---|
youtube_search | Search YouTube with yt-dlp and return result URLs without downloading. |
youtube_search_ui | Open an interactive YouTube search UI in MCP App-capable hosts. |
youtube_download | Download one or more URLs (audio/video/both) and rsync/scp them to a remote dir. |
youtube_probe | Read-only: resolve title/duration/uploader/format counts without downloading. |
youtube_identify | Fingerprint local audio with fpcalc, return AcoustID/MusicBrainz candidates, preview canonical tags, and optionally write high-confidence tags. |
youtube_stats | Summarize the download ledger: totals, file kinds, uploaders, and recent entries. |
youtube_download parameters| Param | Default | Meaning |
|---|---|---|
urls | — (required) | One URL string or an array of URLs. |
mode | audio | audio, video, or both. |
audio_format | env YTDLP_AUDIO_FORMAT → mp3 | mp3/m4a/opus/flac/wav/best. |
audio_quality | 0 | yt-dlp quality for lossy codecs: 0–9 or a bitrate like 192K. |
max_height | best | Cap video resolution (e.g. 1080). |
container | mp4 | mp4 or mkv for video. |
remote | env YTDLP_REMOTE | SSH alias or user@host. |
dest_path | env YTDLP_REMOTE_PATH | Absolute remote dir for audio. |
video_dest_path | env YTDLP_VIDEO_REMOTE_PATH → dest_path | Absolute remote dir for video. |
keep_local | false | Keep the local staging copy after transfer. |
use_archive | false | Record + skip already-downloaded IDs (per mode). |
plex_playlist | env YTDLP_PLEX_PLAYLIST → yt-dlp Downloads when Plex is configured | Plex playlist title or ID to add downloaded audio tracks to. Requires YTDLP_PLEX_URL and YTDLP_PLEX_TOKEN. |
response_format | markdown | markdown or json. |
When Plex credentials are configured, successful downloads that produced audio
files search Plex for each downloaded track, create the target playlist if
needed, and add missing tracks while skipping entries already present. The
default playlist is yt-dlp Downloads; set YTDLP_PLEX_PLAYLIST or pass
plex_playlist to override it. Plex errors are reported as
plex_playlist_error and do not make the completed download fail. JSON
responses include a plex_playlist summary with matched, added,
already_present, and missing counts.
Query, monitor, and manage Unraid servers via GraphQL API through MCP tools. Supports system info, Docker, VMs, array/parity, notifications, plugins, rclone, and live telemetry.
Core homelab agents, commands, and setup/health skills for self-hosted service management. Includes interactive credential setup wizard and unified service health dashboard.
UniFi network management via MCP tools. Monitor devices, clients, network health, firewall rules, and perform management operations.
Gotify push notifications and management via MCP tools with HTTP fallback. Sends alerts for long-running tasks, plan completions, and blocked states.
Agents, commands, skills, and scripts for scaffolding, reviewing, aligning, and deploying homelab MCP server plugins. Includes canonical Python, TypeScript, and Rust server templates.
npx claudepluginhub jmagar/dendrite --plugin ytdl-mcpMCP server that saves 98% of your context window with session continuity. Sandboxed code execution in 11 languages, FTS5 knowledge base with BM25 ranking, and automatic state restore across compactions.
Open-source, local-first Claude Code plugin for token reduction, context compression, and cost optimization using hybrid RAG retrieval (BM25 + vector search), reranking, AST-aware chunking, and compact context packets.
Give your AI a memory — mine projects and conversations into a searchable palace. 33 MCP tools, auto-save hooks, and guided setup.
Write SQL, explore datasets, and generate insights faster. Build visualizations and dashboards, and turn raw data into clear stories for stakeholders.
Complete AI coding workflow system. Self-correcting memory + persistent FTS5-indexed research wikis + auto-research loop + multi-LLM council on a single SQLite store. 33 skills, 8 agents, 22 commands, 37 hook scripts across 24 events. Cross-agent via SkillKit.
Agent Skills for AI/ML tasks including dataset creation, model training, evaluation, and research paper publishing on Hugging Face Hub