entra-news-podcast について
entra-news-podcastは、Merill FernandoのポッドキャストEntra.Chatの文字起こしを検索・閲覧するツールです。キーワード検索と任意のOpenAIセマンティック検索を組み合わせ、タイムスタンプ付きYouTubeリンクやエピソード、ゲスト情報を提供します。
主な機能
- 01キーワードまたは意味による文字起こし検索
- 02タイムスタンプ付き文字起こしの閲覧
- 03日付やゲストによるエピソード検索
- 04ゲストと出演履歴の検索
- 05コミュニティツールへの言及箇所の検索
活用シーン
- 01Entra ID機能に関する議論の検索
- 02YouTubeエピソード内の該当箇所への移動
- 03ゲストの出演エピソードの確認
- 04コミュニティツールが話題になった箇所の特定
MCP 対応
文字起こし検索、エピソードとゲストの照会、アーカイブ閲覧、コミュニティツールへの言及検索を行うツールを提供するMCPサーバーです。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Entra.Chat Podcast MCP Server
YouTube の Merill Fernando による Microsoft Entra ポッドキャスト、Entra.Chat の文字起こしを検索する MCP(Model Context Protocol)サーバーです。番組で取り上げられた Entra ID の機能、コミュニティツール、ID に関するトピックについて AI アシスタントに質問すると、該当する場面に直接移動できるタイムスタンプ付き YouTube リンクとともに回答が得られます。
entra-news-mcp(Entra.News の記事版ニュースレターアーカイブ)および microsoft-ai-roundup-mcp の関連プロジェクトです。
仕組み
- ユーザーごとのインフラは不要です。 NPX でインストールすると、文字起こしデータベース(SQLite)が初回実行時にこのリポジトリの GitHub Releases から自動的にダウンロードされ、ローカル(
~/.entra-news-podcast-mcp/)にキャッシュされます。更新は毎週確認されます。 - ハイブリッド検索です。 BM25 キーワード検索(Porter ステミングを使用したインメモリー逆引きインデックス。話し言葉の文字起こしから「PIM for Groups」や「Maester」のような正確な名称を探すのに最適です)と、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 は省略可能です。設定するとセマンティック検索/ハイブリッド検索が有効になります(クエリの埋め込みにかかる費用は 1 セント未満です)。設定しない場合は 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 | 番組で取り上げられたコミュニティツールと、その議論を聞くためのタイムスタンプ付きリンクを検索します。 |
プロンプトの例
- 「PIM for Groups について、Merill とゲストは何と言っていましたか?」
- 「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 日に 1 回です。フォルダーを削除すると、最新データを強制的にダウンロードできます |
| 実行時の上書き | 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 token プロバイダー(yt-dlp による字幕のダウンロード)
YouTube の字幕/timedtext エンドポイントが 429 を返す原因は、少なくとも 2 つあり、互いに無関係です。取り込みログの CAPTION_RATE_LIMITED エラーは、メッセージ本文だけではどちらが原因か判断できません。
- yt-dlp がデフォルトで使用する
web/web_safariクライアントに PO(Proof-of-Origin)トークンが指定されていません。yt-dlp の PO Token ガイドを参照してください。 - 動画に複数の音声/吹き替えトラックがあり、ネイティブな
<lang>-origの文字起こしではなく、翻訳された字幕のバケットが選択されています。scripts/lib/ytdlp.tsのpickCaptionLanguageを参照してください。2026-09-09 に確認済み:動作する PO token プロバイダーを使用していても、引き続き 429 が返されます。
送信元 IP にかかわらず — 2026-09-09 に、4 つの異なる出口 IP(2 か国の IPRoyal 住宅用 IP の ID 2 つと、プロキシをまったく使用しないクリーンな自宅の住宅用 IP)から同じ障害を再現して確認済みです。プロキシを使っても、どちらの原因も解消されません。
CI では PO token プロバイダーが自動でセットアップされます(.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 は YouTube のプレーヤーのチャレンジを解決するために、JS ランタイムとして Deno を必要とします。Deno がない場合、リクエストはボットのトラフィックと判定される可能性が大幅に高くなります。
YTDLP_PROXYリポジトリシークレット(2026-07-21 以降、http://user:pass@host:port形式の住宅用プロキシ URL を設定しています。IPRoyal のダッシュボードではhost:port:user:passと表示されますが、これを書き換える必要があります。また、_country-au_city-hurstvilleのような地域指定の修飾子はユーザー名ではなくパスワードに追加します)を使って、yt-dlp のすべてのトラフィックをそのプロキシ経由でルーティングします。同じ環境変数はローカルでの取り込み実行にも使用できます。これはBOT_BLOCKEDにのみ有効で、CAPTION_RATE_LIMITEDには効果がありません。
それでも CI がブロックされる場合は、住宅用 IP から手動で更新してください(先に上記の PO token プロバイダーをセットアップしてください)。
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(Trusted Publishing/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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。