关于 entra-news-podcast
entra-news-podcast 用于搜索和浏览 Merill Fernando 的 Entra.Chat 播客文字稿,结合关键词检索与可选的 OpenAI 语义搜索,并提供带时间戳的 YouTube 链接、单集和嘉宾信息。
主要功能
- 01按关键词或语义搜索文字稿
- 02查看单集及带时间戳的文字稿
- 03按日期或嘉宾浏览单集
- 04查找嘉宾及其出场记录
- 05定位社区工具提及内容
适用场景
- 01查找 Entra ID 功能相关讨论
- 02跳转到 YouTube 单集的相关时刻
- 03查看某位嘉宾参与过的单集
- 04定位社区工具被讨论的位置
MCP 相关
该 MCP 服务提供文字稿搜索、单集和嘉宾查询、档案浏览及社区工具提及检索工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Entra.Chat 播客 MCP 服务
一个用于搜索 Entra.Chat 文字稿的 MCP(Model Context Protocol)服务。Entra.Chat 是 Merill Fernando 在 YouTube 上主持的 Microsoft Entra 播客。向 AI 助手询问节目中讨论的 Entra ID 功能、社区工具和身份主题,即可获得附带时间戳 YouTube 链接的答案,直接跳转到相关内容。
与 entra-news-mcp(书面版 Entra.News 新闻通讯档案)和 microsoft-ai-roundup-mcp 配套使用。
工作原理
- 无需为每位用户配置基础设施。 通过 NPX 安装;首次运行时,会自动从此仓库的 GitHub Releases 下载文字稿数据库(SQLite),并缓存在本地(
~/.entra-news-podcast-mcp/)。每周检查更新。 - 混合检索。 将 BM25 关键词搜索(内存倒排索引,使用 Porter 词干提取——非常适合在杂乱的口语文字稿中查找“PIM for Groups”或“Maester”这类精确名称)与通过 Reciprocal Rank Fusion 融合的 OpenAI 语义向量搜索相结合。没有 API 密钥?关键词搜索开箱即用。
- 带时间戳的深层链接。 每条搜索结果都附有指向
youtube.com/watch?v=...&t=...的链接,方便你在上下文中收听讨论。 - 嘉宾信息。 按集提取嘉宾信息及其个人资料链接(LinkedIn、Twitter/X、GitHub、Bluesky)——可以询问“X 参加过哪些节目?”或“谁上过这个节目?”。
- 每周更新。 GitHub Action 每周重新导入播放列表,并发布更新后的数据库版本。
安装
需要 Node.js 22+(使用内置的 node:sqlite——无需原生依赖)。
Claude Desktop
添加到 claude_desktop_config.json:
{
"mcpServers": {
"entra-podcasts": {
"command": "npx",
"args": ["-y", "entra-news-podcast-mcp"],
"env": {
"OPENAI_API_KEY": "sk-..."
}
}
}
}
OPENAI_API_KEY 可选——配置后即可启用语义/混合搜索(嵌入查询的费用不到一美分)。不配置时,将使用 BM25 关键词搜索。
Claude Code
claude mcp add entra-podcasts -- npx -y entra-news-podcast-mcp
VS Code(GitHub Copilot)
{
"servers": {
"entra-podcasts": {
"command": "npx",
"args": ["-y", "entra-news-podcast-mcp"]
}
}
}
Cursor
{
"mcpServers": {
"entra-podcasts": {
"command": "npx",
"args": ["-y", "entra-news-podcast-mcp"]
}
}
}
工具
| 工具 | 描述 |
|---|---|
search_entra_podcasts | 搜索所有单集文字稿。模式:hybrid(默认,BM25 + 通过 RRF 实现的语义搜索)、semantic、keyword。结果包含单集、嘉宾和带时间戳的 YouTube 链接。 |
get_episode | 按 video_id 或 date 获取完整单集信息——元数据、附带个人资料链接的嘉宾、附带时间戳链接的章节,以及带有 [mm:ss] 标记的完整文字稿。 |
list_episodes | 浏览档案;可按 year、month 和/或嘉宾姓名筛选。 |
list_guests | 所有播客嘉宾的名录,包括个人资料链接、出场次数和最近一次出场时间。 |
get_guest | 按姓名查询一位嘉宾:个人资料链接以及该嘉宾参加过的所有单集。 |
find_tool_mentions | 查找节目中讨论过的社区工具,并附上可收听相关讨论的时间戳链接。 |
示例提示词
- “Merill 和他的嘉宾对 PIM for Groups 有什么看法?”
- “Jane Doe 上过哪些节目?她的 LinkedIn 是什么?”
- “找出讨论 Maester 的部分,并给我 YouTube 时间戳。”
- “列出 2026 年 3 月的 Entra.Chat 单集。”
数据与更新时效
| 来源 | YouTube 上的 Entra.Chat 播放列表(@merillx) |
| 字幕稿 | YouTube 字幕(优先使用上传的字幕,否则使用自动生成的字幕) |
| 刷新 | 每周 GitHub Action → 新的 db-* 版本 |
| 本地缓存 | ~/.entra-news-podcast-mcp/(Windows 上为 %USERPROFILE%\.entra-news-podcast-mcp\)— 最多每 7 天检查一次更新;删除该文件夹可强制重新下载 |
| 运行时覆盖 | 设置 ENTRA_PODCAST_DB_PATH 以改用本地数据库文件 |
开发
npm install
npm run build
# Ingest (requires yt-dlp on PATH: pipx install yt-dlp / winget install yt-dlp)
node dist/scripts/ingest.js --limit 2 # test with 2 videos
node dist/scripts/ingest.js # full playlist backfill
node dist/scripts/ingest.js --incremental # only new videos
node dist/scripts/ingest.js --video <id> # one video (re-ingests)
node dist/scripts/ingest.js --reextract # rebuild guests + tool mentions from stored
# data (no network) — after editing
# guest-overrides.json or known-tools.ts
node dist/scripts/ingest.js --embed-missing # embed chunks that have no embedding yet
# (needs OPENAI_API_KEY; no YouTube access)
# Run the server against a local DB
ENTRA_PODCAST_DB_PATH=./entra-news-podcasts.db npx @modelcontextprotocol/inspector node dist/src/index.js
在摄取期间设置 OPENAI_API_KEY 以生成嵌入向量(语义搜索);若未设置,摄取仍会完成,BM25 关键词搜索也可正常使用。
来宾提取覆盖项
系统根据视频标题和说明启发式提取来宾。启发式方法遗漏的单集会列在每次摄取运行的末尾 — 在 scripts/lib/guest-overrides.json 中修正(以 video_id 为键,每个条目会完全替代对应视频的提取结果),然后运行 node dist/scripts/ingest.js --reextract 应用(无需重新下载)。
PO 令牌提供程序(yt-dlp 字幕下载)
YouTube 的字幕/timedtext 端点返回 429,至少有两种不同且互不相关的原因 — 仅凭消息文本,摄取日志中的 CAPTION_RATE_LIMITED 错误无法判断是哪一种:
- yt-dlp 默认使用的
web/web_safari客户端未提供 PO(来源证明)令牌 — 请参阅 yt-dlp PO Token 指南。 - 视频有多个音轨/配音轨道,解析结果指向了翻译字幕分组,而非原生
<lang>-orig字幕稿 — 请参阅scripts/lib/ytdlp.ts中的pickCaptionLanguage。已于 2026-09-09 确认:即使 PO 令牌提供程序正常工作,仍会出现 429。
无论源 IP 如何 — 已于 2026-09-09 确认:在四个不同的出口 IP 上复现了完全相同的故障(两个国家的两个 IPRoyal 住宅代理身份,以及一个完全不使用代理的干净家庭住宅 IP)。代理无法解决这两种原因。
CI 会自动设置 PO 令牌提供程序(.github/workflows/weekly-update.yml 中的 "Set up PO token provider" 步骤,版本固定 — 请参阅该步骤的注释)。对于本地摄取运行,请设置一次:
# 1. Provider (script mode — spawns per request, no persistent server needed).
# The server (git tag) and plugin (PyPI package, step 2) are separately
# versioned and must match — check the pinned version in
# .github/workflows/weekly-update.yml ($BGUTIL_VERSION) rather than
# grabbing "latest" for one and not the other.
git clone --single-branch --branch 2.0.0 \
https://github.com/Brainicism/bgutil-ytdlp-pot-provider.git \
~/bgutil-ytdlp-pot-provider # %USERPROFILE%\bgutil-ytdlp-pot-provider on Windows — this exact path, yt-dlp looks here by default
cd ~/bgutil-ytdlp-pot-provider/server
npm ci
npx tsc
# 2. Plugin — install into the SAME Python env yt-dlp itself runs under
# (check with `python -c "import sys; print(sys.executable)"` vs `yt-dlp` on
# PATH — a mismatch here is a common trap and yt-dlp will silently not see
# the plugin). If yt-dlp was installed via pipx: `pipx inject yt-dlp bgutil-ytdlp-pot-provider==2.0.0`
python3 -m pip install -U bgutil-ytdlp-pot-provider==2.0.0
# Verify a WORKING provider — not just a listed one. yt-dlp lists an entry
# even when it's unusable, suffixed "(external, unavailable)"; a real one
# reads "(external)" with nothing else in the parens.
yt-dlp -v --skip-download --simulate "https://www.youtube.com/watch?v=jNQXAC9IVRw" 2>&1 \
| grep -E "bgutil:script-(node|deno)-[0-9.]+ \(external\)"
手动刷新数据库(如果 YouTube 屏蔽 CI)
YouTube 有时会屏蔽来自数据中心 IP 的常规页面/API 请求(工作流日志中显示 BOT_BLOCKED — 与上文的 CAPTION_RATE_LIMITED 不同,后者仅针对字幕,与 IP 无关)。无论哪种情况,都不会影响使用者 — 最新的可用版本仍会保持为 latest。
在改用手动刷新之前,已内置以下缓解措施:
- CI 会安装 Deno,yt-dlp 需要它作为 JS 运行时来应对 YouTube 的播放器挑战 — 如果没有它,请求更容易被标记为机器人流量。
YTDLP_PROXY仓库密钥(自 2026-07-21 起设置为住宅代理 URL,格式为http://user:pass@host:port— 请注意,IPRoyal 的控制面板显示的是host:port:user:pass,必须重新排列;而_country-au_city-hurstville之类的地理定位修饰符应附加到密码,而非用户名)会将所有 yt-dlp 流量通过该代理转发。同一环境变量也可用于本地摄取运行。这只能缓解BOT_BLOCKED,不能缓解CAPTION_RATE_LIMITED。
如果 CI 仍被屏蔽,请从住宅 IP 手动刷新(先按上文设置 PO 令牌提供程序):
node dist/scripts/ingest.js --incremental
gh release create "db-$(date -u +%Y.%m.%d)-9999" \
--repo darrenjrobinson/EntraNewsPodcastMCPServer \
--title "Database Update (manual)" --latest \
./entra-news-podcasts.db
发布流程(维护者)
代码版本发布(v* 标签)通过 .github/workflows/publish-mcp.yml 发布到 npm(可信发布 / OIDC,无需令牌)和 MCP Registry(io.github.darrenjrobinson/entra-news-podcast):
- 更新
package.json中的version,以及server.json中的两个版本字段(CI 会强制要求版本保持一致)。 - 提交,然后运行
git tag v0.x.y && git push origin main v0.x.y。
数据库版本发布(db-* 标签)由每周工作流生成,绝不会触发 npm 发布。
许可证
MIT © Darren Robinson
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。