yt-studio-mcp
An MCP (Model Context Protocol) server for managing a YouTube channel through the official Google APIs — videos, comments and moderation, playlists, live broadcasts, captions, analytics — plus an auditable giveaway suite for running comment-entry giveaways with deterministic, independently verifiable winner drawing.
- Official APIs only (YouTube Data v3 + YouTube Analytics v2). No scraping.
- Every mutating tool accepts
dry_run=trueand returns a preview instead of writing. - No secrets in this repo, in logs, or in your MCP client config.
Quick start
1. Create Google credentials (~5 minutes, one time)
- Go to console.cloud.google.com, create a project.
- APIs & Services → Library: enable YouTube Data API v3 and YouTube Analytics API.
- APIs & Services → OAuth consent screen: External, add yourself as a test user.
- APIs & Services → Credentials → Create credentials → OAuth client ID → Desktop app;
download the JSON as
client_secret.json.
2. Authorize your channel
uvx yt-studio-mcp auth --client-secret /path/to/client_secret.json
A browser opens — sign in and pick the channel (Brand Accounts appear as separate choices). The refresh token is stored locally (see Secret storage).
3. Connect your MCP client
# Claude Code
claude mcp add yt-studio -s user -- uvx yt-studio-mcp
Tools
| Area | Tools |
|---|---|
| Channel/videos | channel_info, list_videos, get_video, update_video, set_thumbnail, upload_video, delete_video |
| Playlists | list_playlists, create_playlist, delete_playlist, add_to_playlist, remove_from_playlist, list_playlist_items |
| Comments | list_comments, post_video_question, reply_to_comment, moderate_comment, mark_spam, delete_comment |
| Live | list_broadcasts, create_broadcast, list_streams, bind_broadcast, live_chat_messages, post_chat_message, delete_chat_message, ban_chat_user |
| Captions | list_captions, upload_caption, download_caption |
| Analytics | channel_report, video_report, top_videos |
| Giveaways | collect_entries, draw_winners, make_verification_code, check_verification_reply, post_winner_reply |
| Meta | quota_status, health_check |
Known API limitations (documented, not bugs): comments cannot be pinned via
the API (post_video_question reminds you to pin manually in Studio), and
Community-tab posts have no public API.
Running a giveaway
The giveaway suite implements a common official-rules pattern: comment on any video during the entry window; each distinct video counts as one entry, capped per person; winners drawn at random.
1. collect_entries(start="2026-01-01T00:00:00Z", end="2026-01-31T23:59:59Z",
max_entries_per_user=5, exclude_channel_ids=[...])
→ walks every upload's comments, derives entries, writes a snapshot
file and returns its SHA-256 entry hash. Announce the hash if you
want third-party verifiability.
2. draw_winners(snapshot_path, n=5, seed="any-public-string")
→ deterministic: a seeded shuffle over the canonically sorted entries,
first n distinct channels win. Anyone with the snapshot + seed can
re-run the draw and get identical winners. Records an audit file.
Screen-record this step for extra transparency.
3. make_verification_code(audit_path, winner_channel_id)
→ short code you send to the claimed winner over your announced contact
channel.
4. check_verification_reply(audit_path, comment_id, winner_channel_id)
→ confirms the reply was authored by the winning channel and contains
the code — proves account ownership before shipping a prize.
5. post_winner_reply(comment_id, "Congratulations! ...")
Entries and audit records live in ~/.config/yt-studio-mcp/giveaways/.
This tool automates entry collection and drawing; giveaway laws vary by jurisdiction and platform policies apply (e.g. YouTube's contest policies). You are responsible for your own official rules and compliance.
Secret storage
| Backend | Select with | Stores |
|---|---|---|
file (default) |
— | ~/.config/yt-studio-mcp/credentials.json, chmod 0600 |
env |
YT_MCP_SECRETS=env |
reads YT_MCP_REFRESH_TOKEN, YT_MCP_CLIENT_ID, YT_MCP_CLIENT_SECRET |
vaultproxy |
YT_MCP_SECRETS=vaultproxy (+ VAULTPROXY_URL) |
items in a Vaultwarden vault via a local vaultproxy HTTP API |
Quota
The Data API's default allocation is 10,000 units/day. Most reads cost 1
unit; writes cost ~50; a video upload costs 1,600. quota_status() shows a
session estimate and warns at 80%. collect_entries reports what it spent.
Development
pip install -e '.[dev]'
ruff check src tests && pytest
Tests are fully offline (mocked Google API). PRs welcome.
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yt_studio_mcp-0.3.0.tar.gz.
File metadata
- Download URL: yt_studio_mcp-0.3.0.tar.gz
- Upload date:
- Size: 30.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49d7247c6239dbba45fa087902de6476e9ac338b2baaefdbe93c7b4d218d126c
|
|
| MD5 |
0faeabe12e9fe0ee7e1fb4b7f3076314
|
|
| BLAKE2b-256 |
3cb35ddb27aadd9830308ca59aa569c14c5ace43252d0da7c9299128ba83ddf5
|
Provenance
The following attestation bundles were made for yt_studio_mcp-0.3.0.tar.gz:
Publisher:
publish.yml on aaronckj/yt-studio-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yt_studio_mcp-0.3.0.tar.gz -
Subject digest:
49d7247c6239dbba45fa087902de6476e9ac338b2baaefdbe93c7b4d218d126c - Sigstore transparency entry: 2275651025
- Sigstore integration time:
-
Permalink:
aaronckj/yt-studio-mcp@c7225bd4dab805f5ba2df2a8c8137f58caf1b7d6 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/aaronckj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c7225bd4dab805f5ba2df2a8c8137f58caf1b7d6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file yt_studio_mcp-0.3.0-py3-none-any.whl.
File metadata
- Download URL: yt_studio_mcp-0.3.0-py3-none-any.whl
- Upload date:
- Size: 36.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ac64feeb5205ea082c8ce4c880b59a7534339533704814915bfd2af192f7424
|
|
| MD5 |
ad3afbcb68bbcf03b5bc90442c534a8a
|
|
| BLAKE2b-256 |
2fd78f5d92e18514b27098128f232b7d0421e2c5ebc1f7a29fc0584d45076c16
|
Provenance
The following attestation bundles were made for yt_studio_mcp-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on aaronckj/yt-studio-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yt_studio_mcp-0.3.0-py3-none-any.whl -
Subject digest:
4ac64feeb5205ea082c8ce4c880b59a7534339533704814915bfd2af192f7424 - Sigstore transparency entry: 2275651348
- Sigstore integration time:
-
Permalink:
aaronckj/yt-studio-mcp@c7225bd4dab805f5ba2df2a8c8137f58caf1b7d6 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/aaronckj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c7225bd4dab805f5ba2df2a8c8137f58caf1b7d6 -
Trigger Event:
push
-
Statement type: