内容
# yt-outlier-mcp
找出YouTube上具有异常表现的视频的MCP服务器:小型频道(≤100K订阅者)中有一个视频的观看量远远超过了频道的订阅量(≥5:1 观看量:订阅量)和频道近期其他视频的观看量。这种特征表明推荐算法偏爱视频的格式,而不是现有的观众群体——因此该格式可以被新的频道复制。
该方法是“图标方法”的合格标准,该标准在@Before-You-Start手动验证(参见`hobby-channel/IDEAS.md`);该服务器将其自动化为一个MCP工具。来源:付费MCP服务器中的创意 #2,详见 `_ideas/next-batch.html`。
## 工具:`find_outliers`
| 输入 | 默认值 | 含义 |
|---|---|---|
| `query` | (必填) | 话题短语,例如 `"beginner mistakes sourdough"` |
| `maxSubs` | 100,000 | 频道订阅者上限 |
| `minViews` | 100,000 | 视频观看量下限 |
| `minRatio` | 5 | 观看量:订阅量比率下限 |
| `publishedWithinDays` | 365 | 发布时间窗口(较旧的异常值是过时的证据) |
| `minOutlierFactor` | 3 | 视频观看量与频道其他近期视频观看量的中位数之比 |
| `minQueryRelevance` | 0(关闭) | 查询词在标题/描述/标签中出现的最小比例;`0.5` 截断无关噪音 |
| `maxResults` | 10 | 返回的异常视频数量上限 |
每次调用的流程:`search.list`(顺序=观看量,此调用较昂贵)→ 批量 `videos.list` + `channels.list` → 通过观看量/订阅量/比率进行廉价过滤 → 对于幸存者,拉取上传播放列表并与频道的近期上传视频中位数进行比较(异常值与基线的检查,区分爆款格式与大频道的正常视频)。
每个异常视频的输出:URL、观看量、订阅量、比率、频道视频中位数观看量、异常因子、`queryRelevance`(查询词在标题/描述/标签中找到的比例——始终报告,仅当 `minQueryRelevance` > 0 时过滤,此操作不额外消耗配额,因为片段已经获取)、评论启用标志(评论是手动需求信号步骤)、频道视频数量,以及消耗的总配额单位。
## 工具:`get_video_structure`
图标方法验证步骤 2 - 提取可复制的格式,而不是猜测它。接受视频 ID 或 URL;返回时长、标签、章节(从 `0:00 Intro` 样式的描述行中解析)、描述和转录。消耗 **1 配额单位**;转录本身在 Data API 之外获取,配额消耗为零(`captions.download` 需要所有者 OAuth,因此服务器请求 InnerTube player 端点作为 ANDROID 客户端 - 非官方,如果 YouTube 曾经限制它,则优雅地返回 `transcript: null`)。
| 输入 | 默认值 | 含义 |
|---|---|---|
| `video` | (必填) | 视频 ID 或 URL(watch/shorts/youtu.be 形式) |
| `includeTranscript` | true | 获取转录 |
| `maxTranscriptChars` | 15,000 | 截断上限 |
## 工具:`get_comment_signal`
图标方法验证步骤 3 - 评论证明了需求,而不仅仅是观看量。返回按相关性排序的评论(作者、文本、点赞、回复)以及快速计数:询问问题的评论和使用需求短语的评论(“请制作…”,“第 2 部分”,“你如何…”)。优雅地处理禁用评论的视频。消耗 **1 配额单位**。
| 输入 | 默认值 | 含义 |
|---|---|---|
| `video` | (必填) | 视频 ID 或 URL |
| `maxComments` | 30 | 获取的顶部评论数量(最多 100) |
## 工具:`search_niche_sweep`
对每个领域运行 `find_outliers`,通过将每个领域替换为短语模板,然后跨所有领域对每个命中结果按观看量:订阅量比率进行排名——在顶部反复出现的领域是可复制格式存在的地方。
**昂贵**:每个领域都是一个完整的搜索(~110–130 单位),每个扫描最多 8 个领域。每个领域的 API 错误都会记录,而不会导致扫描失败;配额耗尽错误会中止剩余的领域,并附上注释。
| 输入 | 默认值 | 含义 |
|---|---|---|
| `template` | (必填) | 包含 `{niche}` 的短语,例如 `"beginner mistakes {niche}"` |
| `niches` | (必填) | 1–8 个领域进行替换 |
| `maxResultsPerNiche` | 5 | 每个领域的上限 |
| 过滤器 | 与 `find_outliers` 相同 | `maxSubs`、`minViews`、`minRatio`、`publishedWithinDays`、`minOutlierFactor`、`minQueryRelevance` |
## 工具:`get_channel_baseline`
逆向入口:您已经有一个可疑的频道(来自竞争对手、评论或其他工具),而不是主题查询。计算频道的基线——其近期上传视频的中位观看量——并评估每个近期上传视频与基线的偏差,标记异常值。**廉价:~3 配额单位**(无 `search.list` 调用)。接受频道 ID、`@handle` 或频道 URL。
| 输入 | 默认值 | 含义 |
|---|---|---|
| `channel` | (必填) | 频道 ID(`UC…`)、`@handle` 或频道 URL |
| `recentUploads` | 15 | 获取用于基线的近期上传视频(3–50) |
| `minOutlierFactor` | 3 | 标记上传视频的 ≥ 此倍数于频道中位数 |
## 安装
```sh
npm install
npm run build
```
在客户端(Claude Code 示例)中配置:
```sh
claude mcp add yt-outliers -e YOUTUBE_API_KEY=<key> -- node <abs-path>/dist/index.js
```
**自带密钥:** 需要一个 YouTube Data API v3 密钥(`.env.example`)。免费配额为 10,000 单位/天;一次 `find_outliers` 调用花费 ~110–130 单位(搜索=100,其他 1/调用),因此 ~75–90 次搜索/天。自带密钥模式使得此产品可销售,无需进行 Google 配额扩展审计。
## 路线图
- [x] 针对真实领域进行工具实时测试(2026-07-10:4 个真实异常值,`"beginner mistakes sourdough"`,110 单位/调用,符合预测)
- [x] 第 2 阶段工具:`get_video_structure`(章节/转录)和 `get_comment_signal`(顶部评论 → 需求共鸣)以自动化图标方法验证步骤 2–3(2026-07-10,实时测试)
- [x] `search_niche_sweep`:在爱好集群中轮换一个短语模板(2026-07-10,实时测试:2 领域扫描 = 210 单位,跨领域排名有效)
- [x] 在 Smithery 上列出(2026-07-10):实时位于 [smithery.ai/servers/phillipmex3/yt-outlier-mcp](https://smithery.ai/servers/phillipmex3/yt-outlier-mcp)。MCPize 延期(他们的 SDK/托管需要;实际收入分成 80%,而非营销的 85%)— 如果 Smithery 显示安装信号,则重新审视。
## 发布说明
Smithery 的注册表要求 `manifest.json` 中的每个 `tools[]` 条目都带有 `inputSchema`,但 `npx @anthropic-ai/mcpb pack` 拒绝此键为无效。使用此处的解决方法:从没有模式的清单中打包捆绑包,然后在 `smithery mcp publish` 之前,用此存储库中的带有模式的 `manifest.json` 替换 `.mcpb` 中的 `manifest.json`(它是一个普通的 zip 文件)。