YouTube MCP
MCP server for YouTube creator-ops with a ComfyUI bridge for AI thumbnail generation.
Connector by miller-joe · GitHub account verified by the MCP Registry
Install
Pick your client. Read the repository before you give any tool access to your data.
No install instructions from the source yet. Check the repository for setup steps.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 7 read · 7 write · 2 delete
- Secrets
- None asked for
- Install scripts
- Not scanned yet
- Runs as
- Node.js package
Tools by what they do 16
Read from the source code; the running server may list different tools.
Read 7 · Look things up without changing anything.
get_shorts_analyticsget_videolist_captionslist_commentslist_my_shortslist_my_videosquery_channel_analytics
Write 7 · Create, change, send or run things.
add_to_playlistcreate_playlistgenerate_and_set_thumbnailmoderate_commentreply_to_commentupdate_video_metadataupload_caption
Delete 2 · Delete, drop, revoke or wipe things.
delete_captiondelete_video
Tools (16)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_to_playlistAppends a video to an existing playlist via the YouTube Data API. Write operation: it inserts a playlistItem (not idempotent — calling it twice adds the same video twice). Requires OAuth with the youtube.force-ssl scope and consumes write quota (~50 Data API units). Returns a confirmation line with the video and playlist IDs. Use create_playlist first (or an existing playlist ID) to get playlist_id, and list_my_videos/get_video to get video_id; both arguments are YouTube IDs, not URLs.
create_playlistCreates a new (empty) playlist on the authenticated channel via the YouTube Data API. Write operation: it inserts a new playlist resource owned by the authenticated channel (not idempotent — each call creates a separate playlist, even with identical titles; there is no delete-playlist tool here, so cleanup must be done manually in YouTube Studio). Defaults to 'private' visibility. Requires OAuth with the youtube.force-ssl scope and consumes write quota (~50 Data API units). Returns a confirmation line with the new playlist's title and ID — capture that ID to pass to add_to_playlist. Use this t…
delete_captionDESTRUCTIVE and IRREVERSIBLE: permanently deletes a caption track by ID via the YouTube Data API (captions.delete). The track is removed from the video for viewers with no undo; re-adding requires uploading it again. Requires OAuth with the youtube.force-ssl scope and consumes write quota (~50 Data API units). Returns a confirmation line with the deleted track ID. Use list_captions first to find the correct caption_id; note caption_id is a caption track ID, not a video ID.
delete_videoDESTRUCTIVE and IRREVERSIBLE: permanently deletes a video from the channel via the YouTube Data API. Side effects: as a safety guard it first fetches the video and aborts unless confirm_video_title matches the current title exactly; on match it issues videos.delete and the video (and its comments, analytics history, and URL) are gone for good with no undo. Requires OAuth with the youtube.force-ssl scope and consumes write quota (~50 Data API units). Returns a confirmation line with the deleted ID and title. Use only on explicit user request; never as cleanup. To change visibility without delet…
generate_and_set_thumbnailGenerates a thumbnail image from a text prompt on the configured ComfyUI server, then uploads it as the video's custom thumbnail via the YouTube Data API. Two side effects: (1) it runs a text-to-image generation job on ComfyUI (this tool is only registered when a ComfyUI URL is configured; the call can take many seconds to minutes and may time out after ~10 minutes), and (2) it overwrites the video's current custom thumbnail — a write operation that replaces any existing thumbnail immediately and publicly (the prior thumbnail is not preserved). Requires OAuth with the youtube.upload scope and …
get_shorts_analyticsQueries the YouTube Analytics API for the authenticated channel restricted to Shorts, by forcing filters=creatorContentType==SHORTS on top of the supplied start_date/end_date/metrics/dimensions. Read-only; no mutations. Requires OAuth with the yt-analytics.readonly scope and uses YouTube Analytics API quota (separate from the Data API). Returns the raw Analytics response as pretty-printed JSON (column headers plus rows). Use this for Shorts-only performance reporting; use query_channel_analytics for whole-channel or custom-filtered reports, and list_my_shorts to enumerate the Shorts themselves…
get_videoFetches full details for a single video by ID — snippet (title, description, tags, category), status (privacy), statistics (views/likes/comments), and contentDetails (duration). Read-only; no mutations. Requires OAuth and costs ~1 YouTube Data API read unit. Returns the raw video resource as pretty-printed JSON, or a 'Video not found' message if the ID doesn't resolve. Use this when you already know the video ID and need its current metadata (e.g. before update_video_metadata); use list_my_videos to discover IDs across the channel.
list_captionsLists the caption tracks on a video with their language, name, track kind, status, and draft flag. Read-only; no mutations. Requires OAuth and costs ~50 YouTube Data API units (captions.list). Returns a text list, one line per track: caption track ID, language, name, kind, status, and a [draft] marker, or a message that the video has no caption tracks. Use this to get a caption track ID before delete_caption, or to check existing tracks before upload_caption.
list_commentsLists top-level comment threads on a video, newest first. Read-only; no mutations. Requires OAuth and costs ~1 YouTube Data API read unit. Returns a text list, one line per thread: comment ID, author display name, like count, reply count, and a truncated (~160 char) preview of the comment text. Use the returned comment IDs as parent_id for reply_to_comment or comment_id for moderate_comment. Note: this returns only the top-level comment of each thread, not nested replies, and does not paginate beyond max_results.
list_my_shortsLists the authenticated channel's recent Shorts by scanning the most recent uploads (up to max_candidates) and keeping videos with a duration ≤ 60s. Read-only; no mutations. Requires OAuth and costs YouTube Data API read units proportional to how many uploads are scanned (it pages through uploads in batches of 50). Returns a text list, one line per Short: video ID, title, duration in seconds, and view count, or a message that no Shorts were found. This is a heuristic (the Data API exposes no direct Shorts filter), so very recent or edge-case Shorts may be missed; use list_my_videos for all vid…
list_my_videosLists videos on the authenticated channel, newest first (read from the channel's uploads playlist). Read-only; no mutations. Requires OAuth (uses the stored channel-owner token) and costs a few YouTube Data API read units per call (channels.list + playlistItems.list + videos.list). Returns a text list of one line per video: video ID, title, view count, and privacy status, plus a next page_token line for pagination. Use this to discover your own video IDs to feed into get_video, update_video_metadata, delete_video, or playlist/comment tools; use get_video for full details on a single known vide…
moderate_commentSets the moderation status of a comment on the authenticated channel's videos via the Data API. Write/moderation operation that changes the comment's public visibility: 'heldForReview' hides it pending approval, 'published' approves/restores it, 'rejected' removes it from public view (effectively a soft delete — reversibility via the API is not guaranteed). Requires OAuth with the youtube.force-ssl scope and consumes write quota (~50 Data API units). Returns a confirmation line with the comment ID and new status. Use list_comments to find comment IDs; use this to approve/hide/reject viewer com…
query_channel_analyticsQueries the YouTube Analytics API (reports endpoint, ids=channel==MINE) for the authenticated channel over a date range. Read-only; no mutations. Requires OAuth with the yt-analytics.readonly scope; uses YouTube Analytics API quota (separate from the Data API). Returns a plain-text table: a header row of column names followed by one row per result, '|'-separated, scoped by the supplied metrics/dimensions/filters. Use this for views/watch-time/retention/subscriber/traffic-source reporting across the channel; pass filters='video==VIDEO_ID' to scope to one video, or use get_shorts_analytics to re…
reply_to_commentPosts a public reply to an existing top-level YouTube comment via the Data API. Side effects: creates a publicly visible comment under the authenticated channel's identity (not idempotent — calling twice posts two replies and there is no built-in undo). Requires OAuth with the youtube.force-ssl scope and consumes write quota (~50 Data API units). Returns a confirmation line referencing the parent comment ID. Use list_comments first to get a valid parent_id; this tool replies within an existing thread only (it cannot start a new top-level comment, and parent_id must be a top-level comment, not …
update_video_metadataUpdates a video's metadata — title, description, tags, category, and/or privacy — via the YouTube Data API. Write operation (not read-only): it overwrites the supplied fields on the live video (tags are replaced wholesale, not merged); changes are visible publicly and take effect immediately, though they can be edited again. Only pass the fields you want changed; omitted fields are left as-is. Because the API requires title+category on any snippet update, it transparently fetches and reuses the current title/category when you omit them. Requires OAuth with the youtube.force-ssl scope and consu…
Show 1 more tools
upload_captionUploads a new caption/subtitle track (SubRip SRT or WebVTT) to a video via the YouTube Data API. Write operation: it always inserts a new track (not idempotent — it does not replace an existing same-language track, so repeated calls create duplicates; use a distinct name per track or is_draft=true while iterating, and delete_caption to remove extras). Newly uploaded non-draft tracks become visible to viewers. Requires OAuth with the youtube.force-ssl scope and consumes heavy write quota (~400 YouTube Data API units). Returns confirmation lines with the new caption track ID, video ID, language,…
Signals
- Stars
- 2
- Forks
- 1
- Open issues
- 0
- Weekly downloads
- 35
- Last commit
- Jun 8, 2026 (4 months ago)
- Last release
- Apr 25, 2026 (6 months ago)
- Last package publish
- Apr 25, 2026 (6 months ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.miller-joe/youtube-mcp- Version
- 0.1.2
- Auth
- API key
- Packages
- npm @miller-joe/youtube-mcp
- License
- MIT
- Repository
- github.com/miller-joe/youtube-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from miller-joe
- 0.499score
Comfyui MCP
miller-joe
MCP server for ComfyUI: text-to-image, variations, img2img refine, upscale, image proxy.
ConnectorCFreshness: CRemote★ 3↓ 43/wk - 0.475score
Shopify MCP
miller-joe
MCP server for Shopify Admin API with a ComfyUI bridge for AI product image generation.
ConnectorCFreshness: CRemote★ 2↓ 16/wk
Cite this page
YouTube MCP. Agent Mart. https://agentmart.dev/connectors/miller-joe-youtube-mcp (last updated 2026-10-24)