Trends Hub
Pulls trending lists and news feeds from Chinese and English sites, plus your own RSS feeds
YouTube channel management over the YouTube Data API: uploads, comments, playlists, live streams
By eat-pray-ai Go Local · stdio MediaCommunication
59 popularity score ★ 715 ↓ 179/wk
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs YUTU_CREDENTIAL, YUTU_CACHE_TOKEN. Replace each <NAME> with your value.
npm i -g @eat-pray-ai/yutuclaude mcp add yutu -e YUTU_CREDENTIAL=<YUTU_CREDENTIAL> -e YUTU_CACHE_TOKEN=<YUTU_CACHE_TOKEN> -- yutu mcp{
"mcpServers": {
"yutu": {
"command": "yutu",
"args": [
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}{
"mcpServers": {
"yutu": {
"command": "yutu",
"args": [
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}{
"servers": {
"yutu": {
"type": "stdio",
"command": "yutu",
"args": [
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}[mcp_servers.yutu]
command = "yutu"
args = ["mcp"]
[mcp_servers.yutu.env]
YUTU_CREDENTIAL = "<YUTU_CREDENTIAL>"
YUTU_CACHE_TOKEN = "<YUTU_CACHE_TOKEN>"gemini mcp add --scope user -e YUTU_CREDENTIAL=<YUTU_CREDENTIAL> -e YUTU_CACHE_TOKEN=<YUTU_CACHE_TOKEN> yutu yutu -- mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs YUTU_CREDENTIAL, YUTU_CACHE_TOKEN. Replace each <NAME> with your value.
claude mcp add yutu -e YUTU_CREDENTIAL=<YUTU_CREDENTIAL> -e YUTU_CACHE_TOKEN=<YUTU_CACHE_TOKEN> -- docker run -i --rm -v '<ABSOLUTE_PATH>:/app' -e YUTU_CREDENTIAL -e YUTU_CACHE_TOKEN ghcr.io/eat-pray-ai/yutu:latest mcp{
"mcpServers": {
"yutu": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"<ABSOLUTE_PATH>:/app",
"-e",
"YUTU_CREDENTIAL",
"-e",
"YUTU_CACHE_TOKEN",
"ghcr.io/eat-pray-ai/yutu:latest",
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}{
"mcpServers": {
"yutu": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"<ABSOLUTE_PATH>:/app",
"-e",
"YUTU_CREDENTIAL",
"-e",
"YUTU_CACHE_TOKEN",
"ghcr.io/eat-pray-ai/yutu:latest",
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}{
"servers": {
"yutu": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"<ABSOLUTE_PATH>:/app",
"-e",
"YUTU_CREDENTIAL",
"-e",
"YUTU_CACHE_TOKEN",
"ghcr.io/eat-pray-ai/yutu:latest",
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}[mcp_servers.yutu]
command = "docker"
args = ["run", "-i", "--rm", "-v", "<ABSOLUTE_PATH>:/app", "-e", "YUTU_CREDENTIAL", "-e", "YUTU_CACHE_TOKEN", "ghcr.io/eat-pray-ai/yutu:latest", "mcp"]
[mcp_servers.yutu.env]
YUTU_CREDENTIAL = "<YUTU_CREDENTIAL>"
YUTU_CACHE_TOKEN = "<YUTU_CACHE_TOKEN>"gemini mcp add --scope user -e YUTU_CREDENTIAL=<YUTU_CREDENTIAL> -e YUTU_CACHE_TOKEN=<YUTU_CACHE_TOKEN> yutu docker -- run -i --rm -v '<ABSOLUTE_PATH>:/app' -e YUTU_CREDENTIAL -e YUTU_CACHE_TOKEN ghcr.io/eat-pray-ai/yutu:latest mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs YUTU_CREDENTIAL, YUTU_CACHE_TOKEN. Replace each <NAME> with your value.
go install github.com/eat-pray-ai/yutu@latestclaude mcp add yutu -e YUTU_CREDENTIAL=<YUTU_CREDENTIAL> -e YUTU_CACHE_TOKEN=<YUTU_CACHE_TOKEN> -- yutu mcp{
"mcpServers": {
"yutu": {
"command": "yutu",
"args": [
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}{
"mcpServers": {
"yutu": {
"command": "yutu",
"args": [
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}{
"servers": {
"yutu": {
"type": "stdio",
"command": "yutu",
"args": [
"mcp"
],
"env": {
"YUTU_CREDENTIAL": "<YUTU_CREDENTIAL>",
"YUTU_CACHE_TOKEN": "<YUTU_CACHE_TOKEN>"
}
}
}
}[mcp_servers.yutu]
command = "yutu"
args = ["mcp"]
[mcp_servers.yutu.env]
YUTU_CREDENTIAL = "<YUTU_CREDENTIAL>"
YUTU_CACHE_TOKEN = "<YUTU_CACHE_TOKEN>"gemini mcp add --scope user -e YUTU_CREDENTIAL=<YUTU_CREDENTIAL> -e YUTU_CACHE_TOKEN=<YUTU_CACHE_TOKEN> yutu yutu -- mcpYUTU_CREDENTIAL secret |
Required: Google OAuth client secret, given as a file path under YUTU_ROOT, a Base64 string or raw JSON. |
|---|---|
YUTU_CACHE_TOKEN secret |
Required: OAuth token written by yutu auth, given as a file path under YUTU_ROOT, a Base64 string or raw JSON. |
YUTU_ROOT |
Optional: Folder that file paths are resolved against, for videos, thumbnails, captions and the auth files. |
YUTU_LOG_LEVEL |
Optional: Log level: DEBUG, INFO, WARN or ERROR. |
In a container, a setting goes in with -e NAME=value after docker run.
yutu is one Go program that works as a YouTube command-line tool, an MCP server (`yutu mcp`) and a standalone agent. As an MCP server it wraps the YouTube Data API v3 and acts on your own channel through your Google account. An assistant can upload and edit videos, set thumbnails and watermarks, manage playlists, moderate comments, run live broadcasts and their chat, manage subscriptions and search YouTube.
The v0.11.0 release has 74 tools, one per API action, named resource-action (`video-list`, `comment-setModerationStatus`). Video categories, interface languages and regions come as three MCP resource templates instead. The tables in docs/FEATURES.md list the quota cost of each action.
It speaks stdio by default. With `yutu mcp --mode http` it serves streamable HTTP at http://localhost:8216/mcp, and there each call must carry a Google OAuth token that the server checks. Request bodies are capped at 2 MiB in that mode (cmd/mcp.go).
Besides npm and `go install`, the project now ships a container image on GHCR and Docker Hub. The image holds only the binary and starts it from /app, so you mount a folder there that holds client_secret.json and youtube.token.json and pass `mcp` as the argument (Dockerfile at v0.11.0).
File paths for uploads, downloads and the two auth files are resolved against YUTU_ROOT, which falls back to the working directory (pkg/init.go, pkg/auth/service.go). The separate `agent` mode runs its own model and is not needed for the MCP server.
| Runtime | A prebuilt binary |
|---|---|
| Runs on | macOS, Windows, Linux |
| Google Cloud project with YouTube Data API v3 | Free tierOAuth client of type Desktop app plus a YouTube channel to act on; daily API quota applies |
| Also |
|
Create an OAuth client of type Desktop app in a Google Cloud project with YouTube Data API v3 turned on and save it as client_secret.json. Then run `yutu auth --credential client_secret.json` once. It opens a browser to grant access and writes youtube.token.json. The binary comes from npm, Homebrew, winget, go install, a release download or the container image.
YouTube Data API quota is 10,000 units a day per project by default; one video upload costs 1,600 units, a search 100, a caption update 450 (docs/FEATURES.md). member-list and membershipsLevel-list are marked as not working pending issue #3. Channel section create and update are not yet supported, and the deprecated guideCategories API is not covered. It acts as the signed-in account only; there are no YouTube Analytics or Reporting tools in the MCP tool set.
Suits a YouTube creator or channel manager who wants an assistant to do routine channel work: uploads, metadata edits, playlists, comment moderation, live chat. It needs a Google Cloud project and OAuth set-up before first use, so it is more work than a key-based server. Many tools write or delete on a live channel, so clients that ask before each call are a good fit. Not a fit for analytics reporting or for reading YouTube without your own Google project; it is a community project, not published by Google.
20 only read, 29 change things, 11 can delete or overwrite.
activity-listcaption-delete deletescaption-downloadcaption-insert changescaption-listcaption-update changeschannel-listchannel-update changeschannelBanner-insert changeschannelSection-listcomment-delete deletescomment-insert changescomment-listcomment-markAsSpam changescomment-setModerationStatus changescomment-update changescommentThread-insert changescommentThread-listliveBroadcast-bind changesliveBroadcast-delete deletesliveBroadcast-insert changesliveBroadcast-insertCuepoint changesliveBroadcast-listliveBroadcast-transition changesliveBroadcast-update changesliveChatBan-delete deletesliveChatBan-insert changesliveChatMessage-delete deletesliveChatMessage-insert changesliveChatMessage-listliveChatMessage-transition changesliveChatModerator-delete deletesliveChatModerator-insert changesliveChatModerator-listliveStream-delete deletesliveStream-insert changesliveStream-listliveStream-update changesmember-listmembershipsLevel-listplaylist-delete deletesplaylist-insert changesplaylist-listplaylist-update changesplaylistItem-delete deletesplaylistItem-insert changesplaylistItem-listplaylistItem-update changessearch-listsubscription-delete deletessubscription-insert changessubscription-listsuperChatEvent-listthumbnail-set changesvideo-delete deletesvideo-getRatingvideo-insert changesvideo-listvideo-rate changesvideo-update changesvideo://category/{hl}i18n://language/{hl}i18n://region/{hl}