{"id":29978037,"url":"https://github.com/eat-pray-ai/yutu","last_synced_at":"2026-05-03T15:04:06.202Z","repository":{"id":227311633,"uuid":"643163403","full_name":"eat-pray-ai/yutu","owner":"eat-pray-ai","description":"A fully functional MCP server and CLI for YouTube","archived":false,"fork":false,"pushed_at":"2025-08-03T13:06:04.000Z","size":1334,"stargazers_count":198,"open_issues_count":2,"forks_count":11,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-03T14:38:59.399Z","etag":null,"topics":["agent","automation","bot","cli","golang","mcp","shorts-automate","video","youtube"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eat-pray-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":null,"patreon":"eatprayai","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":null}},"created_at":"2023-05-20T09:46:22.000Z","updated_at":"2025-08-03T13:06:07.000Z","dependencies_parsed_at":"2024-03-27T15:59:16.998Z","dependency_job_id":"8ecc922a-9f4b-441f-b8e7-af788dbf799e","html_url":"https://github.com/eat-pray-ai/yutu","commit_stats":null,"previous_names":["eat-pray-ai/yutu"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/eat-pray-ai/yutu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eat-pray-ai%2Fyutu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eat-pray-ai%2Fyutu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eat-pray-ai%2Fyutu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eat-pray-ai%2Fyutu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eat-pray-ai","download_url":"https://codeload.github.com/eat-pray-ai/yutu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eat-pray-ai%2Fyutu/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268561063,"owners_count":24270234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-03T02:00:12.545Z","response_time":2577,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","automation","bot","cli","golang","mcp","shorts-automate","video","youtube"],"created_at":"2025-08-04T11:02:38.224Z","updated_at":"2026-05-03T15:04:06.189Z","avatar_url":"https://github.com/eat-pray-ai.png","language":"Go","funding_links":["https://patreon.com/eatprayai"],"categories":["Media Processing","Browser Automation","Media Processing Mcp Servers","📚 Projects (1974 total)","پیاده‌سازی‌های سرور","Other","CLIs"],"sub_categories":["Video","MCP Servers","📂 \u003ca name=\"browser-automation\"\u003e\u003c/a\u003eاتوماسیون مرورگر"],"readme":"![Yutu](./assets/yutu.svg)\n\n# `yutu`\n\n[![Static Badge](https://img.shields.io/badge/gitmoji-%F0%9F%98%BF%F0%9F%90%B0%F0%9F%90%A7%E2%9D%A4%EF%B8%8F%E2%80%8D%F0%9F%A9%B9-love?style=flat-square\u0026labelColor=%23EDD1CC\u0026color=%23FF919F)](https://gitmoji.dev)\n[![Go Report Card](https://goreportcard.com/badge/github.com/eat-pray-ai/yutu?style=flat-square)](https://goreportcard.com/report/github.com/eat-pray-ai/yutu)\n[![GitHub License](https://img.shields.io/github/license/eat-pray-ai/yutu?style=flat-square)](https://github.com/eat-pray-ai/yutu?tab=Apache-2.0-1-ov-file)\n[![Go Reference](https://pkg.go.dev/badge/github.com/eat-pray-ai/yutu?style=flat-square)](https://pkg.go.dev/github.com/eat-pray-ai/yutu)\n[![Go Coverage](https://github.com/eat-pray-ai/yutu/wiki/coverage.svg)](https://raw.githack.com/wiki/eat-pray-ai/yutu/coverage.html)\n\n[![GitHub Repo stars](https://img.shields.io/github/stars/eat-pray-ai/yutu?style=flat-square\u0026logo=github)](https://github.com/eat-pray-ai/yutu/stargazers)\n[![GitHub Downloads](https://img.shields.io/github/downloads/eat-pray-ai/yutu/total?style=flat-square)](https://github.com/eat-pray-ai/yutu/releases/latest)\n[![GitHub Actions build Status](https://img.shields.io/github/actions/workflow/status/eat-pray-ai/yutu/publish.yml?style=flat-square\u0026logo=githubactions)](https://github.com/eat-pray-ai/yutu/actions/workflows/publish.yml)\n[![GitHub Actions CodeQL Status](https://img.shields.io/github/actions/workflow/status/eat-pray-ai/yutu/codeql.yml?style=flat-square\u0026logo=githubactions\u0026label=CodeQL)](https://github.com/eat-pray-ai/yutu/actions/workflows/codeql.yml)\n[![GitHub Actions test Status](https://img.shields.io/github/actions/workflow/status/eat-pray-ai/yutu/test.yml?style=flat-square\u0026logo=githubactions\u0026label=test)](https://github.com/eat-pray-ai/yutu/actions/workflows/test.yml)\n[![LINUX DO](./assets/linuxdo_flat-square.svg)](https://linux.do/tag/2234-tag/2234)\n\n[![GitHub Release](https://img.shields.io/github/v/release/eat-pray-ai/yutu?sort=semver\u0026style=flat-square\u0026logo=go)](https://github.com/eat-pray-ai/yutu/releases/latest)\n[![Homebrew Formula Version](https://img.shields.io/homebrew/v/yutu?style=flat-square\u0026logo=homebrew)](https://formulae.brew.sh/formula/yutu)\n[![WinGet Package Version](https://img.shields.io/winget/v/eat-pray-ai.yutu?style=flat-square\u0026label=%F0%9F%93%A6%20winget\n)](https://winstall.app/apps/eat-pray-ai.yutu)\n[![npm Version](https://img.shields.io/npm/v/%40eat-pray-ai/yutu?style=flat-square\u0026logo=npm)](https://www.npmjs.com/package/@eat-pray-ai/yutu)\n\n[![yutu - build a fully automated YouTube Channel!](https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=988886\u0026theme=light)](https://www.producthunt.com/posts/yutu?embed=true\u0026utm_source=badge-featured\u0026utm_medium=badge\u0026utm_souce=badge-yutu)\n\n`yutu` is a CLI, MCP server, and AI agent for YouTube that automates your entire YouTube workflow — from uploading and optimizing videos to managing comments, playlists, and channel branding — so you can get more views, higher click-through rates, and stronger audience engagement with less manual effort. [中文文档](./README_zh.md)\n\n[![mcp demo](./assets/mcp-demo.gif)](https://asciinema.org/a/wXIHU4ciFBAKrHfaFNkMoIs12)\n\n## Table of Contents\n\n- [Prerequisites](#prerequisites)\n- [Installation](#installation)\n- [Agent](#agent)\n- [MCP Server](#mcp-server)\n- [Skills](#skills)\n- [Usage](#usage)\n- [Features](#features)\n- [Contributing](#contributing)\n\n## Prerequisites\n\nAn account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:\n\n1. **Create a GCP Project** and enable these APIs under `APIs \u0026 Services -\u003e Enable APIs and services`:\n   - [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)\n   - [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)\n   - [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)\n2. **Create OAuth credentials**:\n   - Go to `APIs \u0026 Services -\u003e OAuth consent screen`, create a consent screen with yourself as a test user\n   - Go to `Credentials -\u003e Create Credentials -\u003e OAuth Client ID`, select `Desktop app`\n   - Download the credential file and save it as `client_secret.json`, it should look like\n   ```json\n   {\n     \"installed\": {\n       \"client_id\": \"11181119.apps.googleusercontent.com\",\n       \"project_id\": \"yutu-11181119\",\n       \"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\n       \"token_uri\": \"https://oauth2.googleapis.com/token\",\n       \"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\n       \"client_secret\": \"XXXXXXXXXXXXXXXX\",\n       \"redirect_uris\": [\n         \"http://localhost\"\n       ]\n     }\n   }\n   ```\n3. **Authenticate**:\n   ```bash\n   yutu auth --credential client_secret.json\n   ```\n\n   A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.\n   ```json\n   {\n     \"access_token\": \"ya29.XXXXXXXXX\",\n     \"token_type\": \"Bearer\",\n     \"refresh_token\": \"1//XXXXXXXXXX\",\n     \"expiry\": \"2024-05-26T18:49:56.1911165+08:00\",\n     \"expires_in\": 3599\n   }\n   ```\n\nBy default, `yutu` will read `client_secret.json` and `youtube.token.json` from the current directory, `--credential/-c` and `--cacheToken/-t` flags are available only in `auth` subcommand. To modify the default path in all subcommands, set these environment variables.\n\n### Global Environment Variables\n\n| Variable           | Description                                  | Default                   |\n|--------------------|----------------------------------------------|---------------------------|\n| `YUTU_CREDENTIAL`  | Path, base64, or JSON of OAuth client secret | `client_secret.json`      |\n| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token  | `youtube.token.json`      |\n| `YUTU_ROOT`        | Root directory for file resolution           | Current working directory |\n| `YUTU_LOG_LEVEL`   | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR`  | `INFO`                    |\n\n## Installation\n\nYou can download `yutu` from [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) directly, or use the following methods as you prefer.\n\n- [GitHub Actions](#github-actions)\n- [Node.js](#nodejs)\n- [Docker](#docker)\n- [Gopher](#gopher)\n- [Linux](#linux)\n- [macOS](#macos)\n- [Windows](#windows)\n- [Verifying Installation](#verifying-installation)\n\n### GitHub Actions\n\nThere are two actions available for yutu, one is for general purpose and the other is for uploading video to YouTube. Refer to [youtube-action](https://github.com/eat-pray-ai/youtube-action) and [youtube-uploader](https://github.com/eat-pray-ai/youtube-uploader) for more information.\n\n### Node.js\n\n```shell\n❯ npm i -g @eat-pray-ai/yutu\n```\n\n### Docker\n\n```shell\n❯ docker pull ghcr.io/eat-pray-ai/yutu:latest\n❯ docker run --rm ghcr.io/eat-pray-ai/yutu:latest\n# make sure client_secret.json is in the current directory\n❯ docker run --rm -it -u $(id -u):$(id -g) -v $(pwd):/app -p 8216:8216 ghcr.io/eat-pray-ai/yutu:latest\n```\n\n### Gopher\n\n```shell\n❯ go install github.com/eat-pray-ai/yutu@latest\n```\n\n### Linux\n\n```shell\n❯ curl -sSfL https://raw.githubusercontent.com/eat-pray-ai/yutu/main/scripts/install.sh | bash\n```\n\n### macOS\n\nInstall `yutu` using [Homebrew🍺](https://brew.sh/)(recommended), or run the shell script.\n\n```shell\n❯ brew install yutu\n\n# or\n❯ curl -sSfL https://raw.githubusercontent.com/eat-pray-ai/yutu/main/scripts/install.sh | bash\n```\n\n### Windows\n\n```shell\n❯ winget install yutu\n```\n\n### Verifying Installation\n\nVerify the integrity and provenance of `yutu` using its associated cryptographically signed attestations.\n\n```shell\n# Docker\n❯ gh attestation verify oci://ghcr.io/eat-pray-ai/yutu:latest --repo eat-pray-ai/yutu\n\n# Linux and macOS(if installed using shell script)\n❯ gh attestation verify $(which yutu) --repo eat-pray-ai/yutu\n\n# Windows\n❯ gh attestation verify $(where.exe yutu.exe) --repo eat-pray-ai/yutu\n```\n\n## Agent\n\n`yutu` provides an agent mode to automate YouTube workflows. The system uses a multi-agent architecture where a central orchestrator delegates tasks to specialized agents:\n\n| Agent            | Role                                                                         | Capabilities                                                                                                    |\n|------------------|------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|\n| **Orchestrator** | Coordinates the entire workflow, plans strategy, and delegates to sub-agents | YouTube growth strategy, SEO optimization, task routing                                                         |\n| **Retrieval**    | Gathers data from YouTube and the web (read-only)                            | List/search videos, channels, playlists, comments, captions, subscriptions, members, and more; Google Search    |\n| **Modifier**     | Creates and updates YouTube content                                          | Upload videos, create playlists, update metadata, post comments, set thumbnails, manage captions and watermarks |\n| **Destroyer**    | Handles destructive operations with extra caution                            | Delete videos, playlists, comments, captions, subscriptions, channel sections, and watermarks                   |\n\nCurrently, the agent mode is under active development, only supports Google's Gemini models with the following environment variables set:\n\n```shell\n❯ export YUTU_ADVANCED_MODEL=google:gemini-3.1-pro-preview\n❯ export YUTU_LITE_MODEL=google:gemini-3-flash-preview\n❯ export YUTU_LLM_API_KEY=your_gemini_api_key\n// Optional settings\n❯ export GOOGLE_GEMINI_BASE_URL=https://generativelanguage.googleapis.com/\n❯ export YUTU_AGENT_INSTRUCTION=Your custom instruction here\n```\n\n`YUTU_ADVANCED_MODEL` is used by the orchestrator agent, while `YUTU_LITE_MODEL` is used by all other agents. Both use\nthe `provider:modelName` format (only `google` is supported). If only one is set, the other defaults to the same value.\n\n### Agent Environment Variables\n\n| Variable                     | Description                                                 | Required                                                   |\n|------------------------------|-------------------------------------------------------------|------------------------------------------------------------|\n| `YUTU_ADVANCED_MODEL`        | Model for orchestrator agent (format: `provider:modelName`) | At least one of `YUTU_ADVANCED_MODEL` or `YUTU_LITE_MODEL` |\n| `YUTU_LITE_MODEL`            | Model for sub-agents (format: `provider:modelName`)         | At least one of `YUTU_ADVANCED_MODEL` or `YUTU_LITE_MODEL` |\n| `YUTU_LLM_API_KEY`           | API key for the model provider                              | Yes                                                        |\n| `GOOGLE_GEMINI_BASE_URL`     | Base URL for Gemini API                                     | No                                                         |\n| `YUTU_AGENT_INSTRUCTION`     | Custom instruction for orchestrator agent                   | No                                                         |\n| `YUTU_RETRIEVAL_INSTRUCTION` | Custom instruction for retrieval agent                      | No                                                         |\n| `YUTU_MODIFIER_INSTRUCTION`  | Custom instruction for modifier agent                       | No                                                         |\n| `YUTU_DESTROYER_INSTRUCTION` | Custom instruction for destroyer agent                      | No                                                         |\n\nThen run the following command for detail usage:\n\n```\n❯ yutu agent --help\n❯ yutu agent --args \"help\"\n# console mode\n❯ yutu agent --args \"console\"\n# web mode with three sub-launchers: api, a2a and webui\n❯ yutu agent --args \"web api a2a webui\"\n```\n\n## MCP Server\n\n[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge\u0026logo=visualstudiocode\u0026logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=yutu\u0026config=%7B%22type%22%3A%20%22stdio%22%2C%22command%22%3A%20%22yutu%22%2C%22args%22%3A%20%5B%22mcp%22%5D%2C%22env%22%3A%20%7B%22YUTU_CREDENTIAL%22%3A%20%22%2Fabsolute%2Fpath%2Fto%2Fclient_secret.json%22%2C%22YUTU_CACHE_TOKEN%22%3A%20%22%2Fabsolute%2Fpath%2Fto%2Fyoutube.token.json%22%7D%7D)\n[![Install in Cursor](https://cursor.com/deeplink/mcp-install-light.svg)](https://cursor.com/install-mcp?name=yutu\u0026config=JTdCJTIyY29tbWFuZCUyMiUzQSUyMnl1dHUlMjBtY3AlMjIlMkMlMjJlbnYlMjIlM0ElN0IlMjJZVVRVX0NSRURFTlRJQUwlMjIlM0ElMjIlMkZhYnNvbHV0ZSUyRnBhdGglMkZ0byUyRmNsaWVudF9zZWNyZXQuanNvbiUyMiUyQyUyMllVVFVfQ0FDSEVfVE9LRU4lMjIlM0ElMjIlMkZhYnNvbHV0ZSUyRnBhdGglMkZ0byUyRnlvdXR1YmUudG9rZW4uanNvbiUyMiU3RCU3RA%3D%3D)\n\nAs a [MCP server](https://modelcontextprotocol.io/introduction), `yutu` can be used in MCP clients like [Claude Desktop](https://modelcontextprotocol.io/quickstart/user), [VS Code](https://code.visualstudio.com/) or [Cursor](https://docs.cursor.com/), which allows you to interact with YouTube resources in a chat-like interface.\n\nBefore using `yutu` as an MCP server, make sure `yutu` is installed(see [Installation](#installation) section), and you have a valid `client_secret.json` and `youtube.token.json` files(refer to [Prerequisites](#prerequisites) section).\n\nYou can add `yutu` as a MCP server in VS Code or Cursor by clicking corresponding badge above, or add the following configuration manually to your MCP client. Remember to replace the values of `YUTU_CREDENTIAL` and `YUTU_CACHE_TOKEN` with correct paths on your local machine.\n\n```json\n{\n  \"yutu\": {\n    \"type\": \"stdio\",\n    \"command\": \"yutu\",\n    \"args\": [\n      \"mcp\"\n    ],\n    \"env\": {\n      \"YUTU_CREDENTIAL\": \"/absolute/path/to/client_secret.json\",\n      \"YUTU_CACHE_TOKEN\": \"/absolute/path/to/youtube.token.json\"\n    }\n  }\n}\n```\n\n## Skills\n\n`yutu` provides a unified [skill](https://opencode.ai/docs/skills) that extends AI agents with YouTube domain knowledge, common workflows, and SEO best practices — covering videos, playlists, comments, channels, captions, subscriptions, and more.\n\n```shell\n❯ npx skills add https://github.com/eat-pray-ai/yutu/tree/main/skills/youtube\n```\n\nSee [skills/youtube/SKILL.md](skills/youtube/SKILL.md) for the full list of supported operations.\n\n## Usage\n\n```shell\n❯ yutu        \nyutu is a fully functional MCP server and CLI for YouTube, which can manipulate almost all YouTube resources.\n\nEnvironment variables:\n  YUTU_CREDENTIAL    Path/base64/JSON of OAuth client secret (default: client_secret.json)\n  YUTU_CACHE_TOKEN   Path/base64/JSON of cached OAuth token (default: youtube.token.json)\n  YUTU_ROOT          Root directory for file resolution (default: current working directory)\n  YUTU_LOG_LEVEL     Log level: DEBUG, INFO, WARN, ERROR (default: INFO)\n\nUsage:\n  yutu [flags]\n  yutu [command]\n\nAvailable Commands:\n  activity               Manage activities on YouTube\n  agent                  Start an agent to automate YouTube workflows\n  auth                   Authenticate with YouTube APIs\n  caption                Manage YouTube video captions\n  channel                Manage YouTube channels\n  channelBanner          Manage YouTube channel banners\n  channelSection         Manage YouTube channel sections\n  comment                Manage YouTube comments\n  commentThread          Manage YouTube comment threads\n  completion             Generate the autocompletion script for the specified shell\n  help                   Help about any command\n  i18nLanguage           Manage YouTube i18n languages\n  i18nRegion             Manage YouTube i18n regions\n  mcp                    Start MCP server\n  member                 Manage YouTube channel members\n  membershipsLevel       Manage YouTube memberships levels\n  playlist               Manage YouTube playlists\n  playlistImage          Manage YouTube playlist images\n  playlistItem           Manage YouTube playlist items\n  search                 Manage YouTube search\n  subscription           Manage YouTube subscriptions\n  superChatEvent         Manage YouTube Super Chat events\n  thumbnail              Manage YouTube video thumbnails\n  version                Show the version of yutu\n  video                  Manage YouTube videos\n  videoAbuseReportReason Manage YouTube video abuse report reasons\n  videoCategory          Manage YouTube video categories\n  watermark              Manage YouTube watermarks\n\nFlags:\n  -h, --help   help for yutu\n\nUse \"yutu [command] --help\" for more information about a command.\n```\n\n## Features\n\nPlease refer to [FEATURES.md](docs/FEATURES.md) for more information.\n\n## Contributing\n\nPlease refer to [CONTRIBUTING.md](docs/CONTRIBUTING.md) for more information.\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=eat-pray-ai/yutu\u0026type=Date)](https://star-history.com/#eat-pray-ai/yutu\u0026Date)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feat-pray-ai%2Fyutu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feat-pray-ai%2Fyutu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feat-pray-ai%2Fyutu/lists"}