youtube-mcp
by Zavier0305
README.md
# youtube-mcp
`@ザビエル-zav` のYouTubeチャンネル分析を、Claudeから直接できるようにするMCPサーバー。
「先週の動画、どれが一番CTR良かった?」のような質問に、実データを取ってきて答えられる状態を目指す。
Node.js製(Python不使用)。YouTube Analytics API / Reporting API / Data API v3 を
公式のNode用ライブラリ(`googleapis`, `google-auth-library`)でラップし、
MCP公式のTypeScript SDK(`@modelcontextprotocol/sdk`)でツールとして公開している。
## 使うAPIと使い分け
| 欲しいデータ | API | 取得方式 |
|---|---|---|
| 再生数、視聴時間、平均視聴維持率、登録者増減、流入元、視聴者層 | YouTube Analytics API | リクエストするとその場でJSONが返る |
| サムネ表示回数、インプレッションCTR | YouTube Reporting API (Bulk Reports) | 事前にジョブ登録 → 毎日CSVが生成 → DLして読む |
| 動画タイトル、説明、コメント | YouTube Data API v3 | リクエストするとその場でJSONが返る |
CTRだけ取得方式が根本的に違う(バルクレポート)ため、`register-reach-job.js` で
ジョブ登録 → `download-reports.js` で定期的にローカルへCSVを蓄積、という別経路になっている。
## セットアップ
### 1. Google Cloud Console
1. プロジェクトを作成
2. 以下3つのAPIを有効化
- YouTube Analytics API
- YouTube Reporting API
- YouTube Data API v3
3. OAuth同意画面を設定(ユーザーの種類=外部、テストユーザーに自分のGoogleアカウントを追加)
4. 認証情報 > OAuthクライアントID > アプリの種類=デスクトップアプリ を作成し、JSONをダウンロード
5. ダウンロードしたJSONを `client_secret.json` という名前でこのリポジトリ直下に置く
**`client_secret.json` と、初回認証後に作られる `token.json` は絶対にコミットしないこと。**
`.gitignore` 済みだが、誤って `git add -f` しないよう注意。
### 2. Node.jsと依存パッケージ
Node.js 18以上が必要(未インストールなら [nodejs.org](https://nodejs.org/) からLTS版を入れる。
インストーラーに `npm` も含まれるので、Pythonのような別途PATH設定は基本不要)。
```bash
npm install
```
### 3. リーチレポート(CTR)のジョブ登録 — 最優先で実行
Reporting API は「ジョブを登録した日」からデータ生成が始まり、過去分も登録時点から
30日前までしか遡れない。**登録が遅れるほど過去のCTRデータが失われる**ので、
他の作業より先にこれだけ実行しておく。
```bash
npm run register-reach-job
```
初回はブラウザが開いて認証を求められる(以降は `token.json` で自動更新)。
### 4. MCPサーバー起動
```bash
npm start
```
Claude Desktop から使う場合は `claude_desktop_config.json` に以下のように登録する。
```json
{
"mcpServers": {
"youtube-analytics": {
"command": "node",
"args": ["/absolute/path/to/youtube-mcp/server.js"]
}
}
}
```
### 5. リーチレポートのダウンロード(登録から数時間〜2日後)
```bash
npm run download-reports
```
`data/reach/<report_type>/` 配下にCSVが蓄積される。レポートはYouTube側で60日
(過去データ分は30日)で消えるため、**定期的に(できれば1日1回)実行し続ける**こと。
Windowsならタスクスケジューラ、Mac/Linuxならcronに登録しておくとよい。
`get_reach` ツールはこのローカルCSVを読む。
## 公開ツール一覧
| ツール名 | 引数 | 返すもの |
|---|---|---|
| `get_channel_summary` | `start_date`, `end_date` | 期間全体の再生数・視聴時間・登録者増減 |
| `list_top_videos` | `start_date`, `end_date`, `limit` | 再生数上位の動画とその基本数値 |
| `get_video_stats` | `video_id`, `start_date`, `end_date` | 指定動画の詳細数値 |
| `get_retention_curve` | `video_id`, `start_date`(省略可), `end_date`(省略可) | 視聴維持率カーブ(10%刻み)+最大離脱ポイント |
| `get_traffic_sources` | `video_id` または `start_date`+`end_date` | 流入元の内訳 |
| `get_reach` | `start_date`, `end_date` | サムネ表示回数とCTR(ローカル蓄積CSVから集計) |
| `get_comments` | `video_id`, `limit` | コメント一覧(関連度順) |
出力は生JSONではなく、丸めた数値・上限20件程度のテキスト表で返す
(Claude側のコンテキスト消費を抑えるため)。
## 既知の制約
- Analytics APIのデータは YouTube Studio 表示より最大2日程度のラグがある。「昨日の数字」は取れないことがある。
- `get_reach` はローカルにダウンロード済みのCSVしか見ない。`download-reports.js` を実行していない期間のデータは出てこない。
- `channel_reach_basic_a1` / `channel_reach_combined_a1` の正確な列構成は未確認。`get_reach` は列名をキーワードで推測して読むフォールバックにしてあるが、実際にダウンロードしたCSVのヘッダーで一度確認すること。
- 書き込み系スコープは付けていない(読み取り専用)。動画を誤って変更・削除する経路は存在しない。
## デプロイ先の分岐
| 使いたい場所 | 必要なもの |
|---|---|
| Claude Desktop アプリ | ローカルで `npm start`(stdio)を起動するだけでOK |
| claude.ai (Web/スマホ) | HTTPSでアクセスできるリモートMCPサーバーとして公開が必要 |
スマホからも使いたい場合は、`StdioServerTransport` を `StreamableHTTPServerTransport`
(`@modelcontextprotocol/sdk/server/streamableHttp.js`)に切り替えて、
既存のホスティング環境に相乗りするのが早い。
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues