mcpField
E
entra-news-podcast

entra-news-podcast

本地服务
github.com/darrenjrobinson搜索与检索23 天前更新

关于 entra-news-podcast

entra-news-podcast 用于搜索和浏览 Merill Fernando 的 Entra.Chat 播客文字稿,结合关键词检索与可选的 OpenAI 语义搜索,并提供带时间戳的 YouTube 链接、单集和嘉宾信息。

主要功能

  1. 01按关键词或语义搜索文字稿
  2. 02查看单集及带时间戳的文字稿
  3. 03按日期或嘉宾浏览单集
  4. 04查找嘉宾及其出场记录
  5. 05定位社区工具提及内容

适用场景

  1. 01查找 Entra ID 功能相关讨论
  2. 02跳转到 YouTube 单集的相关时刻
  3. 03查看某位嘉宾参与过的单集
  4. 04定位社区工具被讨论的位置

MCP 相关

该 MCP 服务提供文字稿搜索、单集和嘉宾查询、档案浏览及社区工具提及检索工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"darrenjrobinson-entra-news-podcast": {
"command": "npx",
"args": [
"-y",
"entra-news-podcast-mcp"
]
}
}
}
启动命令npx -y entra-news-podcast-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmentra-news-podcast-mcp0.3.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Entra.Chat 播客 MCP 服务

npm version npm downloads MIT License

一个用于搜索 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 错误无法判断是哪一种:

  1. yt-dlp 默认使用的 web/web_safari 客户端未提供 PO(来源证明)令牌 — 请参阅 yt-dlp PO Token 指南。
  2. 视频有多个音轨/配音轨道,解析结果指向了翻译字幕分组,而非原生 <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):

  1. 更新 package.json 中的 version,以及 server.json 中的两个版本字段(CI 会强制要求版本保持一致)。
  2. 提交,然后运行 git tag v0.x.y && git push origin main v0.x.y。

数据库版本发布(db-* 标签)由每周工作流生成,绝不会触发 npm 发布。

许可证

MIT © Darren Robinson

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。