Uploading sets the video's own details; playlists, thumbnails and captions come afterwards through the second tool, which means a failed thumbnail does not cost you the upload. The scope change around captions is the one gotcha worth handling before your first attempt — an existing token will not carry it, and the failure looks like a permissions bug rather than a stale grant.
A Go binary that publishes to YouTube from any MCP client. It runs the OAuth2 flow locally, keeps the tokens on your machine, and uploads through the YouTube Data API — the credentials never reach the model.
- `upload_video` — uploads the file and sets title, description, tags, category, optional language, privacy status, made-for-kids flags and a scheduled publish time
- `update_video` — the post-upload pass: add the video to a playlist, upload a custom thumbnail, and attach subtitle tracks
- `authenticate` and `accesstoken` — generate the authorization URL, then exchange the code for credentials and channel info
- `channels` and `refreshtoken` — list the authorized channels and force a token refresh, so multiple channels work from one install
- Metadata written by the assistant, so titles, descriptions and tags come out of the conversation rather than a form
A Google Cloud OAuth 2.0 client secret file, which you point the binary at with `-client_secret_file`. One install command downloads the binary, sets permissions and writes the Claude Desktop entry for you, then prints the config for other clients. Custom thumbnails must be under 2MB. Subtitle upload needs a broader YouTube scope — if you authenticated with an older build, delete the channel cache file and run the authenticate tool again or caption calls fail with 403.
Build from source — clone the repository and build it, then point your client at the binary
