Podcast Ingestion Core MCP Server
Podcast Ingestion Core
Spec034 Task #77 current terminal is startup/plugin closed; credential_provider BLOCKED; overall BLOCKED. Its H2-frozen exact 20-file official
NousResearch/hermes-agentbundle is static/offline only: startup order and the fixedsecurity-guidanceplugin identity chain are closed, while credential/provider construction data flow, whole-program closure, dynamic/user/project/entry-point plugin paths, runtime/secret edges, and actual activation remain blocked or unobserved.runtime_status=not_run;live_actions_authorized=false. The fresh review-only bootstrap/final trust chain is reserved for Main after both reviews PASS and remains unrun.
Podcast Ingestion Core は汎用の Podcast 取り込みコアです。現在、RSS episode listing、episode lookup、音声ファイルのダウンロード、ローカル faster-whisper 文字起こし、transcript validation、deterministic extractive Markdown 要約、OpenAI 互換 LLM semantic summary パイプライン、deterministic mention 抽出、SQLite メタデータキャッシュ / 検索、および同じ FastMCP インスタンスを共有するローカル stdio と loopback Streamable HTTP sidecar が完了しています。Hermes 直接 MCP/config/Skills 連携は動作可能です。Spec 026 の C6 before/after metadata/content endpoint equality は required reviewers と唯一の live v2 run で PASS-current と検証済みであり、スナップショット間に transient mutation がないとは主張しません。C7 は依然として安全な runtime evidence が不足しています。v0.20.0 tag v2026.8.3 hooks は候補に過ぎず、全体ステータスは Blocked のままです。Web UI、スケジューリング、embedding と vector search はまだ実装されていません。
最初の podcast profile は Gooaye 股癌ですが、コアコードに股癌をハードコードしてはいけません。podcast 固有の設定はすべて config/podcasts.yaml に置きます。
AI Agent Handoff / Where to Start
この README はクイックオリエンテーション(ディレクトリ構造、CLI 例、phase history)であり、完全な governance source ではありません。新しく担当する AI エージェントや開発者はここから始めてください:
Handoff entrypoint(10分でリポジトリを理解する):
docs/agent-handoff.mdAI 開発規範(instruction hierarchy、change classification、DoR/DoD):
docs/ai-development-framework.md検証マトリクス(各変更でどのテストを実行すべきか):
docs/verification-matrix.mdアーキテクチャ決定記録(ADR index):
docs/architecture-decision-records/README.mdRepo レベルの agent ハード制約:
AGENTS.md
Related MCP server: MCP Podcast Scraper
プロジェクト目標
同じ core functions セットで複数の Podcast をサポートする。
CLI scripts はパラメータの解析と core functions の呼び出しのみを担当させる。
コア機能を将来 MCP tools として直接ラップできるようにする。
すべての出力ファイルは
data/に置き、deterministic な命名を使用してツールが検索しやすくする。
ディレクトリ構造
config/
podcasts.yaml
industry_chain_mappings.yaml
external_data_boundary.yaml
external_market_data_fixtures.yaml
gooaye_lens.yaml
llm_profiles.yaml
data/
audio/
transcripts/
summaries/
mentions/
reports/
mappings/
external/
stock-lens/
cache/
corpus/
docs/
agent-handoff.md
ai-development-framework.md
verification-matrix.md
architecture-decision-records/
architecture.md
mvp-requirements.md
roadmap.md
mcp-readiness.md
mcp-usage.md
codex-mcp-setup.md
claude-mcp-setup.md
mcp-troubleshooting.md
scripts/
list_episodes.py
download_episode.py
transcribe_episode.py
validate_transcript.py
summarize_episode.py
run_corpus_episode_intake.py
generate_corpus_index.py
generate_corpus_remediation_plan.py
run_corpus_audio_download.py
run_corpus_remediation.py
run_corpus_local_transcription.py
run_corpus_episode_workflow.py
run_corpus_semantic_remediation.py
run_corpus_episode_completion_workflow.py
run_corpus_latest_episode_deterministic_workflow.py
run_latest_episode_verified_research_report_workflow.py
run_episode_verified_research_report_workflow.py
query_verified_research_report_catalog.py
revalidate_verified_research_report_sources.py
query_verified_research_report_coverage.py
suggest_historical_verified_report_next_step.py
list_verified_report_gap_backlog.py
extract_mentions.py
rebuild_cache.py
search_transcripts.py
search_mentions.py
validate_mcp_setup.py
validate_hermes_integration.py
manage_hermes_integration.py
run_mcp_server.py
run_mcp_http_server.py
deploy/
hermes/
src/
podcast_ingest_core/
tests/Core Functions
list_episodes(podcast_id, limit)
get_episode(podcast_id, episode_ref)
download_audio(podcast_id, episode_ref)
transcribe_episode(
podcast_id,
episode_ref,
model=None,
device="cpu",
compute_type="int8",
vad_filter=False,
force=False,
audio_path=None,
progress_callback=None,
)
validate_transcript(podcast_id, episode_ref)
summarize_episode(
podcast_id,
episode_ref,
force=False,
max_quotes=10,
window_seconds=300,
allow_partial=False,
)
semantic_summarize_episode(
podcast_id,
episode_ref,
provider="openai-compatible",
model=None,
base_url=None,
api_key_env="OPENAI_API_KEY",
force=False,
chunk_seconds=600,
max_segments_per_chunk=120,
allow_partial=False,
)
extract_mentions(
podcast_id,
episode_ref,
force=False,
allow_partial=False,
max_evidence_per_mention=5,
)
generate_episode_intelligence_report(
podcast_id,
episode_ref,
force=False,
allow_partial=False,
window_seconds=300,
max_evidence_per_section=5,
)
generate_industry_chain_mapping(
podcast_id,
episode_ref,
force=False,
allow_partial=False,
max_candidates_per_node=5,
max_evidence_per_candidate=5,
)
generate_external_data_boundary(
podcast_id,
episode_ref,
force=False,
allow_partial=False,
)
verify_external_data_boundary(
podcast_id,
episode_ref,
confirm=False,
force=False,
allow_partial=False,
provider="fixture",
fixture_path=DEFAULT_EXTERNAL_MARKET_DATA_FIXTURE_PATH,
)
load_gooaye_lens_model(path=DEFAULT_GOOAYE_LENS_CONFIG_PATH)
generate_stock_lens_report(
podcast_id,
stock_query,
force=False,
allow_partial=False,
max_evidence_items=10,
)
generate_stock_lens_synthesis_report(
podcast_id,
stock_query,
confirm=False,
force=False,
allow_partial=False,
api_cost_ack="",
provider="openai-compatible",
model=None,
base_url=None,
api_key_env="OPENAI_API_KEY",
max_prompt_chars=24000,
)
run_research_workflow(
podcast_id,
episode_ref,
stock_query=None,
confirm=False,
force=False,
allow_partial=False,
include_semantic_summary=False,
include_stock_lens_synthesis=False,
include_external_data_verification=False,
api_cost_ack="",
semantic_provider="openai-compatible",
semantic_model=None,
semantic_base_url=None,
semantic_api_key_env="OPENAI_API_KEY",
semantic_chunk_seconds=600,
semantic_max_segments_per_chunk=120,
synthesis_provider="openai-compatible",
synthesis_model=None,
synthesis_base_url=None,
synthesis_api_key_env="OPENAI_API_KEY",
synthesis_max_prompt_chars=24000,
external_data_provider="fixture",
external_fixture_path=DEFAULT_EXTERNAL_MARKET_DATA_FIXTURE_PATH,
max_evidence_per_mention=5,
report_window_seconds=300,
max_evidence_per_section=5,
max_candidates_per_node=5,
max_evidence_per_candidate=5,
max_stock_evidence_items=10,
)
initialize_cache(db_path=None)
index_episode(podcast_id, episode_ref, force=False, db_path=None)
rebuild_cache(podcast_id=None, force=False, db_path=None)
search_transcripts(query, podcast_id=None, limit=20, db_path=None, search_mode="auto", context_segments=0, case_sensitive=False)
search_mentions(query, podcast_id=None, mention_type=None, limit=20, db_path=None, case_sensitive=False)
run_corpus_episode_intake(podcast_id, episode_ref="latest", confirm=False)
generate_corpus_index(podcast_id)
generate_corpus_remediation_plan(podcast_id)
run_corpus_audio_download(podcast_id, episode_ref=None, confirm=False)
run_corpus_remediation(
podcast_id,
confirm=False,
episode_ref=None,
action_family=None,
max_actions=None,
force=False,
allow_partial=False,
)
run_corpus_local_transcription(
podcast_id,
episode_ref=None,
confirm=False,
model=None,
device="cpu",
compute_type="int8",
vad_filter=False,
)
run_corpus_episode_workflow(
podcast_id,
episode_ref="latest",
stage="next",
confirm=False,
model=None,
device="cpu",
compute_type="int8",
vad_filter=False,
force=False,
allow_partial=False,
max_actions=None,
)
run_corpus_semantic_remediation(
podcast_id,
episode_ref,
action="next",
confirm=False,
api_cost_ack="",
provider="openai-compatible",
model=None,
base_url=None,
api_key_env="OPENAI_API_KEY",
chunk_seconds=600,
max_segments_per_chunk=120,
progress_callback=None,
)
run_corpus_episode_completion_workflow(
podcast_id,
episode_ref="latest",
action="next",
confirm=False,
api_cost_ack="",
transcription_model=None,
transcription_device="cpu",
transcription_compute_type="int8",
transcription_vad_filter=False,
semantic_provider="openai-compatible",
semantic_model=None,
semantic_base_url=None,
semantic_api_key_env="OPENAI_API_KEY",
semantic_chunk_seconds=600,
semantic_max_segments_per_chunk=120,
progress_callback=None,
)
run_corpus_latest_episode_deterministic_workflow(
podcast_id,
confirm=False,
transcription_model=None,
transcription_device="cpu",
transcription_compute_type="int8",
transcription_vad_filter=False,
)
run_latest_episode_verified_research_report_workflow(
podcast_id,
confirm=False,
expected_episode_ref=None,
api_cost_ack="",
stock_query=None,
include_fixture_verification=False,
)
run_episode_verified_research_report_workflow(
podcast_id,
episode_ref,
confirm=False,
stock_query=None,
include_fixture_verification=False,
)summarize_episode は deterministic / extractive template であり、外部 LLM API を呼び出さず、意味推論も生成しません。semantic_summarize_episode は OpenAI 互換 API を使用して意味要約を生成し、重要な判断には可能な限り timestamp evidence を付け、投資アドバイスを構成するものではありません。extract_mentions は deterministic rules を使用して transcript segments から mentions を抽出し、各 mention には timestamp evidence が保持されます。generate_episode_intelligence_report は deterministic rules を使用して既存の transcript と mentions artifact から単一エピソードの episode intelligence report を生成し、LLM を呼び出さず、外部市場データを照会せず、株式マッピングや投資アドバイスも生成しません。generate_industry_chain_mapping はローカルの deterministic mapping config を使用して既存の episode intelligence report から産業チェーンノードと株式候補を生成し、podcast の明示的なエビデンスと推測 / 要検証の研究シグナルを明確に区別します。generate_external_data_boundary はローカルの boundary config を使用して既存の industry mapping から外部データ検証境界 scaffold を生成し、外部プロバイダーを呼び出さず、API key を読み取らず、市場の現状事実も生成しません。verify_external_data_boundary は Phase 6M fixture provider scaffold です。dry-run が先で、confirm=True の場合のみローカル fixture を使用して既存の external boundary の更新を試みます。confirm guard があり、live market API はなく、MCP tool の変更もなく、投資アドバイスも提供しません。load_gooaye_lens_model はローカルの Gooaye Lens 分析フレームワークの読み込みと検証のみを行い、株式レポートを生成せず、LLM を呼び出さず、外部市場データも照会しません。generate_stock_lens_report は podcast 全体のローカル artifacts と Gooaye Lens を使用して株式 / 企業の調査フレームワークを生成し、LLM を呼び出さず、外部市場データを照会せず、売買推奨、目標株価、または保証リターンを提供しません。generate_stock_lens_synthesis_report は Phase 6J Stock Lens LLM Synthesis です。dry-run が先で、デフォルトの LLM input boundary は 6F stock lens JSON のみであり、confirmed execution は正確な api_cost_ack を提供する必要があります。Phase 6V ではレビュー済み semantic summary context を明示的にオプトインできますが、それでも raw transcript は読み取らず、外部市場データを照会せず、MCP tool の変更もなく、売買推奨も提供しません。run_research_workflow は dry-run が先のローカル research workflow runner であり、mentions、episode intelligence、industry mapping、external boundary、オプションの stock lens を接続します。Phase 6I は research workflow 内でのオプションの semantic summary 実行をサポートし、Phase 6K は workflow のオプトイン合成をサポートし、include_stock_lens_synthesis=True を使用して Phase 6J synthesis を stock lens report の後に接続できます。Phase 6N はオプションの workflow fixture 検証をサポートし、include_external_data_verification=True を使用して external boundary の後にローカル fixture provider で外部検証ステータスを更新できます。このステップには live market API はなく、API key もなく、MCP tool の変更もなく、自動キャッシュ再構築もなく、投資アドバイスも提供しません。generate_corpus_index はローカルの per-episode artifacts と semantic review metadata のみをスキャンし、deterministic な corpus status JSON/Markdown を書き込みます。RSS を読み取らず、SQLite cache を読み取らず、LLM を呼び出さず、.env を読み取らず、MCP tool を追加せず、raw transcript/evidence/semantic body も出力しません。generate_corpus_remediation_plan は最初に corpus index を更新してから、ローカルの status metadata から full-ladder のギャップ、blockers、warnings、manual-only のアクションテキストを導出し、deterministic な remediation JSON/Markdown を書き込みます。ダウンロード、文字起こし、要約、workflow、LLM、MCP、cache rebuild は実行せず、raw transcript/evidence/semantic body/prompt/raw LLM output も出力しません。run_corpus_audio_download は最初に remediation plan を更新し、dry-run では audio missing かつ action ready の候補メタデータのみを返し、RSS を読み取らず、network/downloader を呼び出さず、run report も書き込みません。confirmed execution では単一のエピソードを指定する必要があり、その場合のみ既存の download_audio() を呼び出し、最新の deterministic audio download run report を書き込みます。レポートには source URL、query string、secret、traceback は含まれません。run_corpus_remediation は最初に remediation plan を更新し、dry-run では選択 / スキップ / ブロック / 除外されたメタデータのみを返します。confirmed execution ではエピソードまたはアクションファミリーを指定する必要があり、transcript-ready な deterministic families(extractive summary、mentions、episode intelligence、industry mapping、external boundary)のみを実行し、最新の deterministic run report を書き込みます。run_corpus_local_transcription は最初に remediation plan を更新し、dry-run ではローカルで audio が利用可能で transcript が欠落している候補メタデータのみを返します。confirmed execution では単一のエピソードを指定する必要があり、明示的なローカル audio_path のみを使用して既存の文字起こしコアを呼び出し、音声ファイルをダウンロードせず、破損 / 部分的な transcript を修復せず、LLM/MCP/cache rebuild には触れず、最新の deterministic local transcription run report を書き込みます。run_corpus_episode_workflow は新しいエピソードのための dry-run ファーストの安全なエントリポイントです。intake、audio download、local transcription、deterministic remediation の次の安全なステージを順に判断します。dry-run では workflow report を書き込まず、ステージも実行しません。confirmed execution では stage="next" を使用して一度に 1 つのステージのみを実行し、最新の deterministic workflow run report を書き込みます。LLM ステップはすべて confirm=True で正確な api_cost_ack を提供した場合のみ外部 LLM を呼び出します。この workflow は依然として外部市場データを照会せず、stock lens synthesis 用の raw transcript もなく、MCP tool の変更もなく、キャッシュを自動再構築しません。rebuild_cache は既存の artifacts のみをインデックスし、自動的にダウンロード、文字起こし、要約、mentions 抽出、調査レポート生成、mapping 生成、external boundary 生成、stock lens report 生成は行いません。
014 stabilization の正確な契約:confirm=False は strict zero-file であり、設定済みの podcast RSS feed とローカル artifacts の読み取り以外に、ファイルを作成、変更、削除しません。seeded selection はインメモリの index/plan スナップショットを 1 つだけ作成し、012/011/010 の順にプレビューします。これは standalone の 010/011/012 dry-run で意図的に保持されている fresh 008/009 persistence の動作とは異なります。
run_corpus_semantic_remediation(...) は standalone の single-episode 015 semantic remediation Core です。有効なリクエストごとに fresh なインメモリ 008/009 スナップショットを正確に 1 つ作成し、最初に明示的な canonical episode を分離してから、semantic_summary、semantic_review、completed、または blocked/manual-only を選択します。010 や 014 は呼び出しません。Dry-run は strict zero-file であり、profile、.env、credential、provider を解決しません。confirmed semantic_summary は明示的なアクションが必要で、before profile / .env / provider 構築で正確な api_cost_ack を検証する必要があります。confirmed semantic_review は決定論的であり、LLM 設定を一切読み取りません。confirmed run ごとに最大 1 つの executor を呼び出し、confirmed-only の最新 JSON/Markdown レポート(generated_at なし)を書き込み、index、plan、SQLite cache を再構築せず、MCP tool も追加しません。当時の registry は正確に 12 tools のまま変更されません。
run_corpus_episode_completion_workflow(...) は 016 の single-episode completion Core です。dry-run は strict zero-file で intake から semantic review までの次のアクションを判断します。人間の確認後、canonical episode に対して 1 つのマッチングアクションのみを明示的に実行して停止します。stdio MCP の同名の run_corpus_episode_completion_workflow tool は、この preview → human approval → one action の境界を維持し、.env を読み取らず、キャッシュを自動再構築せず、投資アドバイスも提供しません。
run_corpus_latest_episode_deterministic_workflow(...) は 017 の one-request latest-episode Core です。dry-run は現在の latest のみを解決し、strict-zero-file の決定論的処理計画を返します。SPEC 017 is Implemented. The 2026-07-17 seeded/downloaded child-outcome mapping problem is a resolved historical blocker; recorded metadata-only confirmed EP679 evidence ends with outcome=ready_for_semantic_summary, ready_count=1, blocked_count=0, and failed_count=0. The contract locks one canonical episode at start, processes intake、ダウンロード、ローカル文字起こし、必要な deterministic remediation を処理し、失敗 / ブロックされたステージでは fail closed し、.env、provider、semantic summary/review、retry、cache rebuild なしで ready_for_semantic_summary で停止します。
run_latest_episode_verified_research_report_workflow(...) は SPEC 018 の latest-episode verified research report Core です。デフォルトの confirm=False は latest を 1 回だけ解決し、checkpoint、staging、report bundle を作成せずに strict-zero-file プレビューを返します。confirmed request は、RSS、環境 / provider、writer、子ステージの前に、プレビューで得た正確な expected_episode_ref と完全に等しい api_cost_ack を提供する必要があります。pinned 017 deterministic ladder を再利用し、semantic summary/review の正確な passed ゲートの後、固定された安全な research options で決定論的な JSON、Markdown、manifest bundle を作成します。bundle は content digest version、atomic directory publish、identical-content reuse、conflict fail-closed を採用しています。キャッシュを自動再構築せず、ライブ市場 API を照会せず、投資アドバイスを構成するものではありません。
run_episode_verified_research_report_workflow(...) は SPEC 019 の explicit-episode verified research report Core です。明示的な episode_ref(履歴エピソードも可。latest/next は拒否)を要求し、プレビューはローカルの readiness のみをチェックしてゼロ書き込みです。confirm は lineage と review が合格した場合のみ 018 と同等の digest bundle を assemble/publish し、api_cost_ack は不要で、LLM/RSS/download を呼び出さず、015–017 も接続しません。欠落がある場合は blocked を返し、missing/stale ロールをリストします。
SPEC 020 は list_verified_research_reports(...)、search_verified_research_reports(...)、inspect_verified_research_report(...) のオフライン読み取り専用 manifest ファーストカタログシームを提供します。安全な manifest 由来のメタデータをリスト、検索、または正確な bundle のローカル自己整合性を検査します。本文検索は行わず、生の manifest や絶対パスは返さず、エクスポートせず、DB/FTS/vector/cache を使用せず、network/LLM も使用せず、ソースの最新性を主張しません。Inspect は常に source_currentness_status=not_evaluated を返します。
SPEC 022 は list_verified_research_report_coverage(podcast_id, *, has_bundle=None, limit=50) を提供します。正確な podcast でローカル inventory × verified-report bundle のエピソード中心のカバレッジ結合を実行し、bundle が欠落しているエピソードまたは既に bundle があるエピソードのみをオプションでリストします。オフライン / ゼロ書き込み / レポート本文を読み取らず、ソースの再検証や最新性の主張も行いません。
validate_transcript は文字起こしが完全か、空か、部分的に完了しているか、欠落しているか、破損しているかを確認するために使用できます。
run_corpus_episode_intake は dry-run ファーストの RSS episode bootstrap runner です。dry-run は latest または単一の明示的な episode selector を解決できますが、書き込み、ダウンロード、文字起こしは行わず、LLM/MCP/cache にも触れません。confirmed execution は安全な seed metadata と最新の deterministic intake report のみを書き込み、008/009/012 が audio を発見、計画、ダウンロードできるようにします。
出力パス規則
すべての成果物は data/ にあります:
音声ファイル:
data/audio/{podcast_id}/{episode_ref}__{safe_title_slug}.{ext}文字起こし:
data/transcripts/{podcast_id}/{episode_ref}__{safe_title_slug}.txt字幕:
data/transcripts/{podcast_id}/{episode_ref}__{safe_title_slug}.srt文字起こしメタデータ:
data/transcripts/{podcast_id}/{episode_ref}__{safe_title_slug}.json要約:
data/summaries/{podcast_id}/{episode_ref}__{safe_title_slug}.mdセマンティック要約:
data/summaries/{podcast_id}/{episode_ref}__{safe_title_slug}.semantic.mdMentions JSON:
data/mentions/{podcast_id}/{episode_ref}__{safe_title_slug}.mentions.jsonMentions Markdown:
data/mentions/{podcast_id}/{episode_ref}__{safe_title_slug}.mentions.mdEpisode intelligence JSON:
data/reports/{podcast_id}/{episode_ref}__{safe_title_slug}.intelligence.jsonEpisode intelligence Markdown:
data/reports/{podcast_id}/{episode_ref}__{safe_title_slug}.intelligence.mdIndustry mapping JSON:
data/mappings/{podcast_id}/{episode_ref}__{safe_title_slug}.industry-map.jsonIndustry mapping Markdown:
data/mappings/{podcast_id}/{episode_ref}__{safe_title_slug}.industry-map.mdExternal data boundary JSON:
data/external/{podcast_id}/{episode_ref}__{safe_title_slug}.external-boundary.jsonExternal data boundary Markdown:
data/external/{podcast_id}/{episode_ref}__{safe_title_slug}.external-boundary.mdStock lens JSON:
data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens.jsonStock lens Markdown:
data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens.mdStock lens synthesis JSON:
data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens-synthesis.jsonStock lens synthesis Markdown:
data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens-synthesis.mdCorpus index JSON:
data/corpus/{podcast_id}/corpus-index.jsonCorpus index Markdown:
data/corpus/{podcast_id}/corpus-index.mdCorpus episode seed JSON:
data/corpus/{podcast_id}/episode-seeds/{episode_ref}.episode-seed.jsonCorpus episode intake run JSON:
data/corpus/{podcast_id}/corpus-episode-intake-run.jsonCorpus episode intake run Markdown:
data/corpus/{podcast_id}/corpus-episode-intake-run.mdCorpus remediation plan JSON:
data/corpus/{podcast_id}/corpus-remediation-plan.jsonCorpus remediation plan Markdown:
data/corpus/{podcast_id}/corpus-remediation-plan.mdCorpus remediation run JSON:
data/corpus/{podcast_id}/corpus-remediation-run.jsonCorpus remediation run Markdown:
data/corpus/{podcast_id}/corpus-remediation-run.mdCorpus local transcription run JSON:
data/corpus/{podcast_id}/corpus-local-transcription-run.jsonCorpus local transcription run Markdown:
data/corpus/{podcast_id}/corpus-local-transcription-run.mdCorpus audio download run JSON:
data/corpus/{podcast_id}/corpus-audio-download-run.jsonCorpus audio download run Markdown:
data/corpus/{podcast_id}/corpus-audio-download-run.mdCorpus episode workflow run JSON:
data/corpus/{podcast_id}/corpus-episode-workflow-run.jsonCorpus episode workflow run Markdown:
data/corpus/{podcast_id}/corpus-episode-workflow-run.mdCorpus semantic remediation run JSON:
data/corpus/{podcast_id}/corpus-semantic-remediation-run.jsonCorpus semantic remediation run Markdown:
data/corpus/{podcast_id}/corpus-semantic-remediation-run.mdCorpus episode completion workflow run JSON:
data/corpus/{podcast_id}/corpus-episode-completion-workflow-run.jsonCorpus episode completion workflow run Markdown:
data/corpus/{podcast_id}/corpus-episode-completion-workflow-run.mdCorpus latest deterministic workflow run JSON:
data/corpus/{podcast_id}/corpus-latest-episode-deterministic-workflow-run.jsonCorpus latest deterministic workflow run Markdown:
data/corpus/{podcast_id}/corpus-latest-episode-deterministic-workflow-run.mdVerified research checkpoint:
data/corpus/{podcast_id}/verified-research/{episode_ref}.checkpoint.jsonVerified research report bundle:
data/research-reports/{podcast_id}/{episode_ref}/v1-{source_digest}/report.json、report.md、manifest.jsonSQLite metadata cache:
data/cache/podcast_ingest.sqlite3Episode cache:
data/cache/{podcast_id}/episodes.json
podcast_id は小文字の slug でなければなりません。Episode ref は RSS title と podcast profile の default_episode_prefix から解決されます(例: EP672)。ファイル名の title slug は、Windows で無効な文字、制御文字、emoji、およびリスクの高い記号を除去します。
CLI の例
podcast-level corpus status index を生成します:
python scripts/generate_corpus_index.py --podcast gooayeこの CLI はローカルの per-episode artifacts のみを読み取り、data/corpus/{podcast_id}/corpus-index.json と .md を書き換えます。stdout は metadata-only JSON で、出力パス、episode count、warning count、artifact family counts を含みます。transcript 原文、evidence snippet、semantic summary body、prompt、raw LLM output、API key、provider secret は含みません。
podcast-level corpus remediation plan を生成します:
python scripts/generate_corpus_remediation_plan.py --podcast gooayeこの CLI は最初に corpus index を更新してから、data/corpus/{podcast_id}/corpus-remediation-plan.json と .md を書き換えます。stdout は metadata-only JSON で、出力パス、episode count、warning count、action count、blocked/optional/gated action counts を含みます。remediation action は一切実行せず、RSS/SQLite cache/.env は読み取らず、network/LLM/MCP は呼び出さず、transcript/evidence/semantic body/prompt/raw LLM output や secret も出力しません。
単一エピソードの audio download を preview または confirmed で実行します:
python scripts/run_corpus_audio_download.py --podcast gooaye
python scripts/run_corpus_audio_download.py --podcast gooaye --episode EP672 --confirmこの CLI は最初に corpus remediation plan を更新します。したがって、standalone dry-run でも fresh な corpus index と remediation plan が永続化されます。デフォルトの dry-run は stdout に metadata-only JSON のみを返し、RSS は読み取らず、network/downloader は呼び出さず、corpus-audio-download-run.json/.md は書き込まず、audio も書き込みません。--confirm は単一の --episode と組み合わせる必要があり、audio status が missing かつ audio action が ready の場合にのみ、既存の download_audio() を呼び出します。Confirmed run は最新の data/corpus/{podcast_id}/corpus-audio-download-run.json と .md を書き込みますが、timestamp、source URL/query string/secret/traceback は含まれず、投資アドバイスも提供しません。audio を書き込むか再利用した後は、転写、下流の remediation、cache rebuild は手動で実行する必要があることだけを通知します。
deterministic corpus remediation を preview または confirmed で実行します:
python scripts/run_corpus_remediation.py --podcast gooaye
python scripts/run_corpus_remediation.py --podcast gooaye --action-family mentions --confirm
python scripts/run_corpus_remediation.py --podcast gooaye --episode EP672 --confirmこの CLI は最初に corpus remediation plan を更新します。したがって、standalone dry-run でも fresh な corpus index と remediation plan が永続化されます。デフォルトの dry-run は stdout に metadata-only JSON のみを返し、corpus-remediation-run.json/.md は書き込まず、artifact generator も実行しません。--confirm は --episode または --action-family と組み合わせる必要があり、既存の deterministic core functions のみを呼び出し、scripts への shell out は行いません。v1 は download、transcribe、semantic summary/review、stock-lens、LLM、RSS/network、SQLite cache rebuild、.env、MCP を実行しません。Confirmed run は最新の data/corpus/{podcast_id}/corpus-remediation-run.json と .md を書き込みますが、timestamp、raw transcript/evidence/semantic body/prompt/raw LLM output/secret は含まれず、投資アドバイスも提供しません。
単一エピソードのローカル転写を preview または confirmed で実行します:
python scripts/run_corpus_local_transcription.py --podcast gooaye
python scripts/run_corpus_local_transcription.py --podcast gooaye --episode EP672 --confirm
python scripts/run_corpus_local_transcription.py --podcast gooaye --episode EP672 --confirm --model small --device cuda --compute-type float16この CLI は最初に corpus remediation plan を更新します。したがって、standalone dry-run でも fresh な corpus index と remediation plan が永続化されます。デフォルトの dry-run は stdout に metadata-only JSON のみを返し、corpus-local-transcription-run.json/.md は書き込まず、transcript も書き込まず、Whisper model も読み込まず、音声ファイルもダウンロードしません。--confirm は単一の --episode と組み合わせる必要があり、local audio path が存在し、かつ transcript status が missing の場合にのみ、既存の transcribe_episode() を呼び出し、audio_path と force=False を明示的に渡します。Confirmed run は最新の data/corpus/{podcast_id}/corpus-local-transcription-run.json と .md を書き込みますが、timestamp、raw transcript/prompt/raw LLM output/secret/traceback は含まれず、投資アドバイスも提供しません。transcript を書き込んだ後は、cache が stale になっている可能性があることだけを通知し、cache を自動的に rebuild しません。
fresh episode workflow の次の safe stage を preview または confirmed で実行します:
python scripts/run_corpus_episode_workflow.py --podcast gooaye --episode latest
python scripts/run_corpus_episode_workflow.py --podcast gooaye --episode latest --stage next --confirm
python scripts/run_corpus_episode_workflow.py --podcast gooaye --episode EP677 --stage next --confirm --model small --device cuda --compute-type float16この CLI の 014 dry-run は strict zero-file です。013 は設定済みの RSS 解析 selector を読み取ることができます。seed がある場合は、fresh な in-memory corpus index/plan snapshot を一度だけ作成し、同じ snapshot を使って 012/011/010 を preview します。seed、audio、transcript、index、plan、010-014 reports、downstream artifacts、.part は作成・変更・削除しません。planned reads には安全な local dependency paths を含めることができ、非 path 値は 2 つの exact labels のみ許可されます。Confirmed execution は明示的に --stage next --confirm を指定する必要があり、毎回 1 つの既存の public runner のみを dispatch します。その runner は元の契約に従って index/plan を更新し、selected-stage artifacts を書き込むことができ、014 は結果を記録した後で停止し、最新の workflow report を書き込みます。semantic/LLM/stock-lens/MCP/cache rebuild/batch の作業は manual follow-up としてリストされるだけで、自動的には実行されません。
単一エピソードの semantic remediation を preview または confirmed で実行します:
python scripts/run_corpus_semantic_remediation.py --podcast gooaye --episode EP700
python scripts/run_corpus_semantic_remediation.py --podcast gooaye --episode EP700 --action semantic_summary --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."
python scripts/run_corpus_semantic_remediation.py --podcast gooaye --episode EP700 --action semantic_review --confirm015 は latest を受け付けません。dry-run action=next は metadata のみを返し、strict zero-file です。Confirmed summary の exact api_cost_ack は、profile、.env、credential、provider construction の前に必要です。review は acknowledgement を必要とせず、profile/.env を解決したり LLM を呼び出したりしません。Validated confirmed attempt は corpus-semantic-remediation-run.json/.md を書き込みますが、generated_at は含まれず、transcript/semantic/prompt/raw response/base URL/secret/traceback も含まれません。index、plan、cache は stale になっている可能性があるため、手動で更新する必要があります。
単一エピソードの completion workflow を preview、またはユーザーの明示的な確認後に実行します:
python scripts/run_corpus_episode_completion_workflow.py --podcast gooaye
python scripts/run_corpus_episode_completion_workflow.py --podcast gooaye --episode EP677 --action audio_download --confirm
python scripts/run_corpus_episode_completion_workflow.py --podcast gooaye --episode EP677 --action semantic_summary --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."016 dry-run は strict zero-file です。seed がある場合は、メモリ内に fresh な 008/009 snapshot を 1 つだけ作成し、intake、audio download、local transcription、deterministic remediation、semantic summary、semantic review のうち次の safe action を順に選択します。confirmed は dry-run が返した canonical episode と同じ explicit action を使用する必要があります。next、latest、または stale action は拒否され、毎回最大 1 つの既存 runner を dispatch した後で停止します。semantic summary の exact ack は、profile/.env/provider の作業より前に完了している必要があります。semantic review は LLM 設定を読み取りません。有効な confirmed attempt の場合のみ、data/corpus/{podcast_id}/corpus-episode-completion-workflow-run.json と .md を原子的に書き込み、index、plan、SQLite cache は自動的には更新しません。
Agent が操作する場合は、同名の MCP tool run_corpus_episode_completion_workflow と repository の portable corpus-episode-completion Skill を使用します。最初に preview し、リスクを説明し、canonical action に対する人間の明示的な同意を待ってから、1 つの action を実行して停止します。MCP がない場合に CLI、terminal、scheduler、自動リトライに切り替えてはなりません。
latest deterministic workflow を preview または controlled confirmed で実行します:
python scripts/run_corpus_latest_episode_deterministic_workflow.py --podcast gooaye
python scripts/run_corpus_latest_episode_deterministic_workflow.py --podcast gooaye --confirmSPEC 017 は実装済みです。Agent が「Gooaye の最新エピソードを処理して」などの明示的なリクエストを受け取った場合、corpus-latest-episode-processing Skill はその explicit natural-language request を 1 回の execution authorization とみなします。acknowledge は 1 回だけ行い、confirm=true を指定して dedicated な run_corpus_latest_episode_deterministic_workflow MCP tool を 1 回だけ呼び出し、metadata-only result を 1 回だけ報告してから停止します。MCP tool 自体は依然としてデフォルトで confirm=false の dry-run です。Skill は先に preview してはならず、second call もしてはならず、CLI/terminal fallback、スケジュール、バッチ、リトライ、cache rebuild、semantic summary/review も使用してはなりません。
latest verified research report workflow を preview します:
python scripts/run_latest_episode_verified_research_report_workflow.py --podcast gooayeSPEC 018 の preview は strict zero-write で、canonical episode reference と exact required acknowledgement を 1 つ返します。ユーザーがその previewed episode に明示的に同意した場合のみ、同じ --expected-episode-ref と exact --api-cost-ack を使って --confirm を 1 回実行します。確認は RSS、environment/provider、writer、child stage の前に発生する必要があります。workflow は pinned deterministic ladder を再利用し、semantic review で exact passed を要求してから、固定された安全な options で deterministic research を完了します。完了後、source digest version の report.json、report.md、manifest.json を原子的に公開し、identical bundle reuse を行い、conflict の場合は fail-closed になります。retry、scheduler、live market API、cache rebuild は行わず、投資アドバイスを構成するものではありません。
オフラインの read-only verified research report catalog を照会します(SPEC 020):
python scripts/query_verified_research_report_catalog.py list --podcast-id gooaye --limit 50
python scripts/query_verified_research_report_catalog.py search "EP672" --podcast-id gooaye
python scripts/query_verified_research_report_catalog.py inspect gooaye EP672 <lowercase-64-hex-source-digest>これら 3 つの subcommands は、canonical なローカル data/research-reports の manifest-first bundles のみを読み取ります。list は exact filters を使用でき、search は safe metadata のみを検索し、inspect は 1 つの exact bundle のローカル自己整合性のみを検証します。report/transcript body は検索せず、raw manifest/absolute paths は返さず、export は提供せず、DB/FTS/vector/cache、RSS/HTTP/network、LLM、.env、download、transcription、remediation も使用しません。latest selector は受け付けず、source latest/currentness の主張も行いません。inspect は常に source_currentness_status=not_evaluated です。境界の省略表記: raw manifest なし; DB/FTS/vector/cache なし; RSS/HTTP/LLM/.env/download/transcription/remediation なし; latest selector なし。
エピソード中心の verified research report coverage を照会します(SPEC 022):
python scripts/query_verified_research_report_coverage.py gooaye
python scripts/query_verified_research_report_coverage.py gooaye --has-bundle false --limit 20ローカル inventory と canonical bundles を join して、report が欠けているエピソードや digest が既にあるエピソードを特定します。offline / zero-write / report body は読み取りません。021 revalidation は再実行せず、source currentness も主張しません。
最新エピソードを一覧表示します:
python scripts/list_episodes.py --podcast gooaye --limit 10
python scripts/list_episodes.py --podcast gooaye --episode latest音声ファイルをダウンロードします:
python scripts/download_episode.py --podcast gooaye --episode latestCPU での転写は、最初に tiny または base モデルでフローを検証することをお勧めします:
python scripts/transcribe_episode.py --podcast gooaye --episode latest --model tiny --device cpu --compute-type int8完全な長いエピソードは CPU では非常に時間がかかる場合があります。faster-whisper、ffmpeg/PyAV、出力フローが使えることを先に確認するだけであれば、短い音声ファイルで smoke test を行うことができます:
python scripts/transcribe_episode.py --audio-path path\to\sample.mp3 --podcast gooaye --episode smoke-test --model tiny --device cpu --compute-type int8 --forceNVIDIA GPU がある場合、環境が CUDA をサポートしていれば試すことができます:
python scripts/transcribe_episode.py --podcast gooaye --episode latest --model small --device cuda --compute-type float16長い音声ファイルの推奨フロー:
python scripts/transcribe_episode.py --podcast gooaye --episode latest --model tiny --device cpu --compute-type int8
python scripts/validate_transcript.py --podcast gooaye --episode latest
python scripts/summarize_episode.py --podcast gooaye --episode latest --forceCPU で 50 分の音声ファイルを処理するのは遅い可能性があります。tiny / base は最初にフローを検証するのに適しており、small / medium は品質を向上させるために使用できます。NVIDIA GPU がある場合は、--device cuda --compute-type float16 を試すことができます。timeout 後に高い CPU 使用率の Python process が残っているのを見かけたら、まずその process を手動で停止してから再実行してください。
deterministic Markdown 要約を生成します:
python scripts/summarize_episode.py --podcast gooaye --episode smoke-test --mode extractive --force
python scripts/summarize_episode.py --podcast gooaye --episode EP672 --mode extractive --max-quotes 5 --window-seconds 300要約は既存の transcript のみを読み取り、自動的にダウンロードや転写は行いません。指定した episode に transcript がない場合、CLI は transcript missing を報告します。
transcript が partial の場合、summary はデフォルトで拒否します。どうしても出力したい場合は --allow-partial を追加できます。
LLM semantic summary を生成するには API key と model が必要です。手動テストではローカルの .env を使用することをお勧めします。このファイルは .gitignore で無視されており、commit できません:
API_KEY=your-api-key
MODEL=your-model
BASE_URL=https://api.openai.com/v1python scripts/summarize_episode.py --podcast gooaye --episode EP672 --mode semantic --force --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."CLI で直接設定を上書きすることもできます:
python scripts/summarize_episode.py --podcast gooaye --episode EP672 --mode semantic --model your-model --base-url https://api.openai.com/v1 --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."semantic 模式會先執行 transcript validation,並把 transcript 依預設 600 秒與每 chunk 120 segments 分批送給 provider。LLM-facing CLI 預設會載入 .env,可用 --env-file path\to\.env 指定其他檔案,或用 --no-env-file 停用。若 .env 與 PowerShell session 都有同名變數,PowerShell session 優先。MODEL / BASE_URL 是目前建議命名;若未設定,仍會相容讀取舊的 OPENAI_MODEL / OPENAI_BASE_URL。若缺少 API key 或 model,CLI 會清楚回報設定錯誤;extractive mode 不需要 API key。語意摘要不構成投資建議,所有重要市場觀點、公司、人物與事件都應盡量回到 timestamp evidence。
Phase 6U 補上 semantic summary smoke validation。這條路徑在 confirmed execution 會送 transcript text outside this machine;dry-run 只列 planned reads/writes、transcript transfer risk、cost risk 與 required acknowledgement,不呼叫 LLM、不寫 artifact、不輸出逐字稿內容。Confirmed semantic summary smoke 以及 direct --mode semantic CLI 都必須提供 exact api_cost_ack。CLI stdout 維持 no raw transcript stdout、不顯示 secret value;此階段 no MCP tool changes、no live market API、no automatic cache rebuild、no investment advice。
Phase 6U.1 修正 semantic review guard false positive:semantic summary review 允許 podcast 內容中 speaker 過去買進 / 持有這類 transcript-derived 描述,但仍拒絕直接 buy/sell/hold、建議買進、目標價與保證報酬。Confirmed semantic smoke 也加入 stderr progress,stdout 仍維持 JSON,且 progress 不輸出 raw transcript、prompt、API key 或 LLM response。
Phase 6V adds optional reviewed semantic context for stock lens synthesis. Default synthesis remains phase-6f-stock-lens-json-only and does not read .semantic.md. When explicitly enabled with --include-semantic-context, synthesis may include only matched episode semantic summaries with a latest passed review report; the input boundary becomes phase-6f-stock-lens-json-plus-reviewed-semantic-summary. The context excludes ## Chunk Summaries, does not read raw transcript text, does not read .env, does not fetch live market data, and makes no MCP tool changes. Reviewed semantic summary context is an LLM intermediate artifact, not podcast raw evidence and not an external market fact. Phase 6V.1 aligns the deterministic review gate with boundary/context consistency: JSON-only synthesis must have no semantic context, and reviewed semantic synthesis must include non-empty, review-passed semantic context.
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --llm-profile pro4500 --confirm --force --include-semantic-context --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."LLM provider profile 可放在 config/llm_profiles.yaml,只保存 provider、model、base URL 與 API key 環境變數名稱,不保存 API key 值。工作中的 pro4500 profile 使用 api_key_env=API_KEY,因此可搭配 .env 的 API_KEY=... 使用。committed gb10 profile 已標成 unavailable,載入時會失敗並提示改用 pro4500。不要把 API key、token 或 secret 寫進 YAML。
擷取 deterministic mentions:
python scripts/extract_mentions.py --podcast gooaye --episode EP672 --force
python scripts/extract_mentions.py --podcast gooaye --episode EP672 --max-evidence-per-mention 3Mention extraction 不使用 LLM,不代表完整語意理解,只依 deterministic rules 從 transcript segments 掃描公司、ticker、產業、總經主題、crypto 與地點等 mention。每個 mention 都會附 timestamp evidence,且不構成投資建議。Phase 3 cache 可將 mentions 匯入 SQLite 並提供基礎跨集查詢;未來 MCP tools 可直接包裝這些 core functions。
產生 deterministic episode intelligence report:
python scripts/generate_episode_intelligence_report.py --podcast gooaye --episode EP672 --force
python scripts/generate_episode_intelligence_report.py --podcast gooaye --episode EP672 --window-seconds 600 --max-evidence-per-section 3Episode intelligence report 只讀既有 transcript 與 mentions artifact,不會自動下載、轉錄、摘要、抽 mentions、呼叫 LLM 或查外部市場資料。若 mentions artifact 缺失,報告仍可產生,但會標示 source warning 並讓 mention-derived sections 留空。Partial transcript 預設拒絕;確定要產出草稿可加 --allow-partial。
產生 deterministic industry chain / stock candidate mapping:
python scripts/generate_industry_chain_mapping.py --podcast gooaye --episode EP672 --force
python scripts/generate_industry_chain_mapping.py --podcast gooaye --episode EP672 --max-candidates-per-node 3 --max-evidence-per-candidate 2Industry mapping 只讀既有 episode intelligence report 與 config/industry_chain_mappings.yaml,不會呼叫 LLM 或查外部市場資料。podcast_explicit 表示 podcast evidence 中明確提到;inferred_from_industry 只代表本機 mapping config 推導出的未查證研究線索,預設 needs_verification,不代表股癌明確提到,也不構成投資建議。
產生 external market data boundary scaffold:
python scripts/generate_external_data_boundary.py --podcast gooaye --episode EP672 --force
python scripts/generate_external_data_boundary.py --podcast gooaye --episode EP672 --allow-partialExternal data boundary 只讀既有 industry mapping 與 config/external_data_boundary.yaml,不會呼叫外部市場資料 provider、不讀 API key、不產生價格、市值、財報、新聞或公司現況事實。每個 candidate 會標示 external_verification_status=not_requested、source_status=not_fetched 與 data_date=null,並列出後續需要查證的外部資料類型。
使用本機 fixture provider 驗證 external boundary:
python scripts/verify_external_data_boundary.py --podcast gooaye --episode EP672
python scripts/verify_external_data_boundary.py --podcast gooaye --episode EP672 --confirm --force
python scripts/verify_external_data_boundary.py --podcast gooaye --episode EP672 --confirm --fixture-path config/external_market_data_fixtures.yamlPhase 6M 只提供 fixture provider scaffold。預設 dry-run 不寫 artifacts;--confirm 是 confirm guard,確認後只讀本機 config/external_market_data_fixtures.yaml 或指定 fixture path,依 company_name / ticker 精準比對並更新既有 .external-boundary.json/.md。本階段 no live market API、不讀 API key、不新增 MCP tools、不接 research workflow,也不提供 no investment advice 以外的任何市場建議。
檢查 Gooaye Lens model:
python scripts/inspect_gooaye_lens.py
python scripts/inspect_gooaye_lens.py --path config/gooaye_lens.yamlGooaye Lens model 是 Phase 6F stock lens report 的 deterministic 分析框架來源,定義產業鏈位置、供需與庫存、景氣循環、利率與估值敏感度、資本支出與產能、地緣政治與不確定性等維度。Phase 6E 只載入與驗證本機 config,不接受股票輸入、不寫 artifacts、不呼叫 LLM、不查外部市場資料,也不產生買賣建議、目標價或保證報酬。
產生 podcast-wide deterministic stock lens report:
python scripts/generate_stock_lens_report.py --podcast gooaye --stock 台積電 --force
python scripts/generate_stock_lens_report.py --podcast gooaye --stock NVDA --max-evidence-items 5Stock lens report 會掃描該 podcast 既有 data/mappings/ 與 data/external/ artifacts,保守比對 candidate 的 company_name 與 tickers。podcast_explicit 會列為 direct podcast evidence;inferred_from_industry 只會列為 needs-verification research lead,不代表 podcast 明確提到。若沒有 direct podcast evidence,報告仍會產生並明確標示 no-direct-podcast-evidence。此階段不呼叫 LLM、不查外部市場資料、不讀 API key、不新增 MCP tools,也不提供買賣建議、目標價或保證報酬。
產生 Phase 6J Stock Lens LLM Synthesis:
python scripts/generate_stock_lens_synthesis_report.py --podcast gooaye --stock 台積電
python scripts/generate_stock_lens_synthesis_report.py --podcast gooaye --stock 台積電 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --model your-model
python scripts/generate_stock_lens_synthesis_report.py --podcast gooaye --stock 台積電 --llm-profile pro4500 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."Stock lens synthesis 預設 dry-run,只列 planned reads/writes、LLM API/cost risk 與 required acknowledgement,不讀 API key、不呼叫 LLM、不寫 artifacts。Confirmed execution 只把 6F stock lens JSON only 的 compact evidence、lens dimensions、external boundary status 與 warnings 交給 LLM;no raw transcript、no .semantic.md input、no external market data lookup、no MCP tool changes,也不接 run_research_workflow。LLM 輸出若包含 buy/sell/hold、target price 或 guaranteed return 等投資建議語句,會拒絕寫入 synthesis artifact。
執行 Phase 6O LLM research smoke:
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --model your-model
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --model your-model --force
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --llm-profile pro4500 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --force --debug-llm-output
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --confirm --include-semantic-summary --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --model your-model --forcePhase 6O 是 OpenAI-compatible smoke + Codex manual review harness。真實 LLM 呼叫仍走 OpenAI-compatible /chat/completions;目前沒有 no direct Codex-session backend,Codex 只作為 manual reviewer 檢查 artifacts、prompt 邊界與品質。Smoke 預設跑 stock lens synthesis 並啟用 fixture external verification;semantic summary 必須明確加 --include-semantic-summary,因為它會傳送 transcript text。此階段 no live market data、不新增 MCP tools、不改 investment-advice boundary,也維持 no investment advice。
Phase 6Q 加入 LLM profile config,手動測試可用 --llm-profile pro4500 讀取 config/llm_profiles.yaml。CLI 明確傳入的 --model、--base-url、--api-key-env 會覆寫 profile;YAML 不得包含 API key、token 或 secret 值。Phase 6R 加入本機 .env loader,LLM-facing CLI 預設讀取 .env 的 API_KEY、MODEL、BASE_URL,並只在 JSON metadata 顯示載入的 env var 名稱,不顯示值。
若要診斷 provider 回覆,可加 --debug-llm-output,raw LLM output 只會寫到已由 .gitignore 忽略的 evals/research-llm-smoke/raw/,不會成為正式 artifact。
Phase 6T 加入 deterministic review report / quality gate。Confirmed smoke 後可用下列命令產生 timestamped review report;它只讀既有 artifacts,no LLM call、no .env read、no external market data,也不重寫 synthesis artifacts:
python scripts/review_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電LLM smoke 文件與 review template:
python scripts/run_semantic_summary_smoke.py --podcast gooaye --episode EP672 --llm-profile pro4500
python scripts/run_semantic_summary_smoke.py --podcast gooaye --episode EP672 --llm-profile pro4500 --confirm --force --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."
python scripts/review_semantic_summary_smoke.py --podcast gooaye --episode EP672Dry-run 或執行本機 deterministic research workflow:
python scripts/run_research_workflow.py --podcast gooaye --episode EP672
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --stock 台積電
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --include-semantic-summary
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --include-semantic-summary --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --semantic-model your-model
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --include-external-data-verification
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --include-external-data-verification --external-fixture-path config/external_market_data_fixtures.yaml
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --stock 台積電 --include-stock-lens-synthesis
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --stock 台積電 --include-stock-lens-synthesis --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --synthesis-model your-modelResearch workflow 會先 dry-run,列出 planned reads/writes、step order、semantic LLM 外部 API 風險、cache stale 風險與 confirmation 狀態。預設只執行本機 deterministic steps:extract_mentions、generate_episode_intelligence_report、generate_industry_chain_mapping、generate_external_data_boundary,並在提供 --stock 時產生 stock lens report。Phase 6I 可用 --include-semantic-summary opt in;Phase 6K 可用 --include-stock-lens-synthesis opt in,把 stock lens synthesis 放在 stock lens report 之後。Phase 6N 可用 --include-external-data-verification opt in,把 fixture verification 放在 external boundary 後、stock lens report 前;此步驟只支援 --external-data-provider fixture,只讀本機 fixture,不查 live market API、不讀 API key。Dry-run 只列 semantic / synthesis / fixture plan 與 required acknowledgement,confirmed execution 中只有 LLM 步驟必須提供 exact --api-cost-ack。Stock lens synthesis 需要 --stock,預設只使用 6F stock lens JSON;Phase 6V 可用 --include-semantic-context / --include-semantic-context-in-synthesis opt in reviewed semantic context,仍不讀 raw transcript、不查外部市場資料。此 workflow 不自動 rebuild cache、不新增 MCP tools,也不提供投資建議。
重建 SQLite metadata cache 並搜尋:
python scripts/rebuild_cache.py --podcast gooaye --force
python scripts/search_transcripts.py --podcast gooaye --query 台積電 --limit 10 --search-mode auto
python scripts/search_transcripts.py --podcast gooaye --query 台積電 --limit 10 --search-mode like --context-segments 1
python scripts/search_mentions.py --podcast gooaye --query 台積電
python scripts/search_mentions.py --podcast gooaye --query 台積電 --type companySQLite cache 是衍生資料,可刪除後重建。原始 source of truth 仍是 data/transcripts/、data/summaries/ 與 data/mentions/。Phase 3B 支援 optional SQLite FTS5;若本機 SQLite 不支援 FTS5,或 query 是中文 exact substring,search_transcripts() 會使用 LIKE fallback。搜尋結果會包含 highlighted_text、實際 search_mode,並可用 --context-segments 取得命中片段前後文。這一階段仍不做 embedding、vector search 或 LLM search。
啟動本機 MCP server:
python scripts/rebuild_cache.py --podcast gooaye --force
python scripts/search_transcripts.py --podcast gooaye --query 台積電 --limit 5 --search-mode auto
python scripts/run_mcp_server.pyMCP server 使用官方 Python MCP SDK 的單一 FastMCP instance。本機 Codex / Claude client 繼續使用 stdio;經 Spec 026 核准的 Hermes sidecar 以同一 registry 提供只綁定 127.0.0.1:8767/mcp 的 Streamable HTTP,不使用 legacy SSE、不 publish port。Read/query tools 是:
list_episodesget_episodevalidate_transcriptsearch_transcriptssearch_mentionsrebuild_cachequery_verified_research_report_catalog(Tool 17;offline read-only manifest-first list/search/inspect)revalidate_verified_research_report_sources(Tool 18;exact-locator offline source revalidation)query_verified_research_report_coverage(Tool 19;episode-centric offline coverage join)suggest_historical_verified_report_next_step(Tool 20;historical next-step suggestion)list_verified_report_gap_backlog(Tool 21;inventory gap backlog)generate_stock_lens_report(Tool 22;deterministic stock lens report,side-effect、dry-run-first)ingest_x_video(Tool 23;X video ingest,preview 零寫入但會讀公開 metadata)ingest_youtube_video(Tool 24;YouTube video ingest,preview 零寫入但會讀公開 metadata)
Side-effect tools 是:
download_audiotranscribe_episodesummarize_episode_extractiveextract_mentionssemantic_summarize_episoderun_research_workflowrun_corpus_episode_completion_workflowrun_corpus_latest_episode_deterministic_workflowrun_latest_episode_verified_research_report_workflowrun_episode_verified_research_report_workflowgenerate_stock_lens_reportingest_x_videoingest_youtube_video
本機 reviewed stdio registry 共 24 個 tools。Tool 24 ingest_youtube_video append-only;Tools 1–23 contracts/order 不變。Tool 23 ingest_x_video 仍為 X ingest。Preview 是 zero-write 但會讀公開 metadata,不是 corpus runner 的零網路 dry-run。Tool 22 generate_stock_lens_report 仍為 append-only dry-run-first stock lens。它是 side-effect、dry-run-first 的 deterministic stock lens report,只讀本機 mapping/boundary artifacts,無 live market API、無網路、無 LLM,且不提供投資建議。Tool 21 list_verified_report_gap_backlog append-only;Tools 1–20 contracts/order 不變。它是 inventory gap backlog read-query。Tool 20 仍為 historical next-step suggestion。Tool 19 仍為 episode-centric coverage。Tool 18 仍為 exact-locator offline source revalidation。Tool 17 保留 catalog list/search/inspect 契約。上述 side-effect tools 預設 confirm=false,只回傳 dry-run action plan,不會下載、轉錄或寫檔;確認 action plan 後才使用 confirm=true。run_corpus_episode_completion_workflow 維持 preview → human approval → one explicit action,run_corpus_latest_episode_deterministic_workflow 只處理 latest episode 的本機 deterministic stages 並在 semantic summary 前停止。run_latest_episode_verified_research_report_workflow 必須先 preview,再由使用者給出相同 canonical expected_episode_ref 與 exact api_cost_ack 後只 confirmed 呼叫一次。run_episode_verified_research_report_workflow 以明確 episode_ref(可為歷史集)做 readiness preview,確認後僅 assemble/publish 同等 digest bundle,不需 api_cost_ack、不呼叫 LLM。所有 side-effect tools 完成後都不會自動 rebuild SQLite cache,且不提供投資建議。例如:
Call transcribe_episode with confirm=false first to review the action plan.
Call transcribe_episode again with confirm=true only if you accept the runtime and resource cost.MCP responses 使用 JSON envelope:成功為 {"ok": true, "data": ...},錯誤為 {"ok": false, "error_type": "...", "message": "..."}。Dry-run action plan 會回傳 {"ok": true, "dry_run": true, "requires_confirmation": true, ...}。Side-effect tools 完成後不會自動 rebuild cache;若要讓 search metadata 更新,請手動呼叫 rebuild_cache。MCP search、mentions 與 summaries 都不構成投資建議。
semantic_summarize_episode 是更嚴格的 API-cost tool。它會把 transcript text 傳送到外部 LLM provider,可能產生 API 費用,因此除了 confirm=true,還必須提供 exact acknowledgement:
I understand this may call an external LLM API, send transcript text outside this machine, and incur costs.第一次請以 confirm=false 呼叫,檢查 dry-run action plan、transcript validation preview、chunk 設定與風險。只有接受外部 API、資料傳送與費用風險時,才用 confirm=true 加上 exact api_cost_ack 執行。MCP response 不會回傳 API key,也不會在 dry-run 中回傳逐字稿原文。成功後不會自動 rebuild cache;若要讓 SQLite cache 知道新的 .semantic.md artifact,請手動執行 rebuild_cache。
Phase 6L は run_research_workflow MCP exposure を追加しました。この統合ワークフローツールは dry-run first です。confirm=false の場合は planned reads/writes、step order、external API / cost risk、cache stale warning、required acknowledgement のみを列挙し、artifacts を書き込まず、LLM を呼び出さず、raw transcript を返さず、API key value を読み取りません。confirm=true の場合は既存の core workflow を呼び出します。semantic summary または stock lens synthesis を含む場合は、exact ack / api_cost_ack を提供する必要があります。Workflow MCP tool は external market data を参照せず、automatic cache rebuild を行わず、買賣推奨・目標価格・報酬保証能力を追加しません。
MCP Client Integration
Codex / Claude 系のローカルクライアントは、既存の stdio transport を使用します:
python scripts/run_mcp_server.pyHermes/OpenAB は独立した sidecar と同一の exact 21-tool registry を使用します:
wsl.exe -d UbuntuProd -u root bash scripts/build_hermes_sidecar.sh podcast-ingest-core-mcp:local
docker compose -f deploy/hermes/docker-compose.sidecar.yml config --quietデプロイ、config/Skill plan→apply→rollback、direct-safe validator、移行方法については、deploy/hermes/README.md と specs/026-hermes-mcp-integration/quickstart.md を参照してください。Direct transport は検証済みです。C6 の boolean-only endpoint-equality validator は、targeted tests、POSIX synthetic checks、2 名のレビューアー、唯一の live v2 run をパスしており、ステータスは PASS-current で、再実行しないでください。C7 は依然として Blocked です。Hermes v0.20.0 tag v2026.8.3 の hooks は、未インストールで実機検証されていない候補能力にすぎません。証拠を補うための live config values / session dump の読み取り、raw response の保存、hooks のアップグレードまたは有効化は禁止されています。Spec 027 の contract layer は complete です(offline assurance only)。実際の Hermes runtime routing は BLOCKED/not_evaluated であり、runtime PASS ではありません。Spec 028 の capability gate は complete で、Hermes v0.20.0 tag v2026.8.3 に対して BLOCKED_CAPABILITY で正しく終了します。upgrade、Skill sync、hooks、collector、inference、runtime observation は一切実行されていません。C6 は PASS-current のままで、再実行されていません。実際の Hermes Skill routing は BLOCKED/not_run のままです。
Codex / Claude 系 MCP client に接続する前に、ローカルの readiness check を実行することをお勧めします:
python scripts/validate_mcp_setup.py --podcast gooaye --query 台積電Client setup ドキュメント:
Codex:
docs/codex-mcp-setup.mdClaude:
docs/claude-mcp-setup.mdTroubleshooting:
docs/mcp-troubleshooting.md
これらのドキュメントは placeholder path のみを使用します。個人の .codex/config.toml、個人の絶対パスを含む設定、.env、API key を commit しないでください。
MCP Tool-use Eval
Codex / Claude 系 MCP client に接続した後、eval prompt suite を使用してツール使用が期待どおりかを確認できます。開始する前に、まず以下を実行してください:
python scripts/validate_mcp_setup.py --podcast gooaye --query 台積電記入可能な Codex MCP session eval report を生成します:
python scripts/new_mcp_eval_report.py --name codex-session-001Eval ドキュメント:
フローと rubric:
docs/mcp-tool-use-eval.mdCodex session に貼り付けられる prompts:
docs/mcp-eval-prompts.md実測レポートテンプレート:
docs/mcp-eval-report-template.mdPhase 5C report ディレクトリ:
evals/mcp-tool-use/README.mdPhase 5C Codex session テンプレート:
evals/mcp-tool-use/phase-5c-codex-session-template.md
Phase 5B eval は、外部 LLM API の実際の呼び出しを必要とせず、ダウンロード・転写・要約・artifacts 書き込みの実際の実行も要求しません。重要なのは、tool selection、dry-run、acknowledgement guard、cache stale の説明、投資レポートが生成されないことを確認することです。Phase 5C は report capture フローを提供し、ユーザーが実際の Codex MCP session の結果を evals/ に書き戻せるようにします。
Research Safety Eval
Phase 6H は、LLM 実行前の safety gate です。研究層と将来の LLM workflow が、幻覚を起こさないこと、api_cost_ack をスキップしないこと、raw transcript / API key を漏洩しないこと、external boundary を検証済みの市場データと誤認しないこと、または投資レポートを生成しないことを検証します。
Research eval ドキュメント:
フローと rubric: 「docs/research-safety-eval.md」
Codex session に貼り付ける prompts:
docs/research-eval-prompts.mdPhase 6H report テンプレート:
evals/research-safety/phase-6h-research-session-template.mdPhase 6O LLM smoke:
docs/research-llm-smoke.mdPhase 6O smoke テンプレート:
evals/research-llm-smoke/phase-6o-llm-smoke-template.md
Phase 6H は、LLM を呼び出さず、API key を読み取らず、外部市場データを参照せず、MCP tools を追加せず、Phase 6G workflow も変更しません。Phase 6I は、research workflow 内での optional semantic summary execution を追加しました。Phase 6J は、Stock Lens LLM Synthesis を追加しました。入力境界は LLM として stock lens JSON only で、exact api_cost_ack が必要です。raw はありません transcript なし、external market data なし、MCP tool の変更なし。Phase 6K は workflow opt-in synthesis を追加しました。include_stock_lens_synthesis は workflow が confirmed され、exact ack が提供された後でのみ synthesis を実行します。Phase 6L は run_research_workflow MCP exposure を追加しました。dry-run first で、confirmed execution のときにのみ core workflow をラップします。LLM steps にはやはり exact ack が必要で、automatic rebuild はありません。cache rebuild.。「Phase 6N は optional workflow fixture 検証 include_external_data_verification」を追加しました。ローカルの fixture provider のみをサポートし、live market API、API key、MCP tool の変更、automatic cache rebuild はなく、投資推奨も提供しません。Phase 6O は research-llm-smoke を追加しました。real OpenAI-compatible smoke &experiment with Codex manual review、exact ack、direct Codex-session backend なし、live market data なし、investment advice なし。Phase 6Q は LLM profile config を追加しました。--llm-profile pro4500 で provider/model/base URL/env var 名を再利用できますが、API key value は保存しません。Phase 6R はローカルの .env secret loader を追加しました。手動 LLM smoke では API_KEY、MODEL、BASE_URL を使用でき、CLI metadata は env var 名のみを表示し、secret value は表示しません。Phase 6T は research LLM smoke review report / quality gate を追加しました。confirmed smoke 後に既往の審査 target を決定的な review artifacts を生成できます。no LLM call、no .env read、no external market data。Phase 6V は reviewed semantic context opt-in を追加しました。stock lens synthesis のデフォルトは引き続き stock lens JSON only であり、明示的に有効化した場合のみ review-passed .semantic.md context を使用します。no raw transcript、no live market data、no MCP tool changes、no investment advice。Phase 6V.1 で review gate の境界とコンテキストの整合を並べました。JSON-only artifact は semantic context を持つことはできず、reviewed semantic boundary は review-passed context を持つ必要があります。
Spec Kit / Architecture
Phase 7A は Architecture / Spec Kit Stabilization で、範囲は docs/spec-only です。現在の Phase 6T システムを spec-kit で追跡可能な構造に整理するもので、runtime を変更せず、MCP を変更せず、LLM を呼び出さず、.env を読み取らず、external market data を参照せず、no investment advice の境界も緩めません。Phase 7A の後の機能候補は、Phase 6U semantic summary smoke または小規模な LLM output quality tuning です。
Phase 7B は Official Spec Kit Bootstrap です。プロジェクトに official の specify init と同等の scaffold / が正式に追加されています。.specify は Spec Kit の memory、templates、scripts、workflow と integration metadata を保持します。.agents/skills は Codex の $speckit-* skills を保持します。AGENTS.md はレポジトのレベルの agent rules を保持します。Phase 7B は、runtime を変更せず、MCP を変更せず、LLM を呼び出さず、.env を読み取らず、live market API を参照せず、no investment advice の境界も緩めません。
Phase 7C は Spec Kit Constitution + Workflow Alignment です。このフェーズでは .specify/memory/constitution.md を公式 placeholder からプロジェクト専用にし、.specify/templates/、AGENTS.md、architecture、roadmap、spec plan を同期させます。Phase 7C は docs / spec / tests only です。no runtime behavior change、no MCP behavior change、no LLM call、no .env read、no live market API、no investment advice。Phase 7C 以降、新機能は full Spec Kit flow($speckit-constitution、$speckit-specify、$speckit-clarify、$speckit-plan、$speckit-checklist、$speckit-tasks、$speckit-analyze、$speckit-implement、$speckit-converge)を使用する必要があります。$speckit-taskstoissues は、GitHub issue handoff が必要な場合にのみ使用します。Phase 6U semantic summary smoke は、将来の機能フェーズとして残っています。
Phase 7D は Spec Kit Backfill via Full Workflow です。作成済みの機能を capabilities-group ごとに full Spec Kit flow で backfill します。specs/README.md が registry であり、001-ooaye-research-system は umbrella product spec として維持され、002-ore-cli-transcript-core から 007-spec-kit-safety までが as-built capability packages を記録します。そのうち 006-llm-safety-synthesis-smoke-review は optional LLM/smoke/review gate をカバーします。Phase 7D は docs/spec/tests only です:no runtime behavior change、no MCP behavior change、no LLM call、no .env read、no live market API、no investment advice。また $speckit-clarify、$speckit-analyze、$speckit-converge の backfill 手順も明確に記録されています。
Phase 7D.1 は Spec Kit Active Feature Guidance です。公式の Spec Kit コマンドの使い方を明確にします。feature packages は specs/<feature> に置き、.specify/ は scaffold / memory / templates / scripts の metadata です。backfill 済みパッケージが複数ある場合に単一の active feature をデフォルトで pin することはありません。パッケージに対して公式の scripts / skills を実行するには、先に SPECIFY_FEATURE_DIRECTORY を設定します。例: $env:SPECIFY_FEATURE_DIRECTORY="specs/003-ome" 。switching packages は再設定します。Phase 7D.1 は runtime を変更せず、MCP を変更せず、LLM を呼び出さず、.env を読み取らず、live market API を参照せず、investment advice を提供しません。Phase 6U semantic summary smoke は future の機能候補のままです。
Spec-kit ドキュメント:
現在のアーキテクチャ:
docs/architecture.mdAgent rules:
AGENTS.mdAgent handoff エントリポイント:
docs/agent-handoff.mdAI development framework:
docs/ai-development-framework.mdVerification matrix:
docs/verification-matrix.md
License
このリポジトリのライセンスは MIT License です。LICENSE を参照してください。
この著作権は Author のファーストパーティ作業のみを対象としています。これは 2 つの spec パッケージがサードパーティの NousResearch/hermes-agent リポジトリの byte-pinned snapshot をベンダーしており、このファイルには MIT License が適用されます。
詳細はこのサイトの Licenseは THIRD-PARTY-NOTICES.md を参照してください。
開発コマンド
python -m pytest
python -m compileall src scripts開発用依存関係をインストールする場合:
python -m pip install -e .[dev]Spec-034 task #82 v4 review — current
startup/plugin closed; credential_provider BLOCKED; overall BLOCKED。Spec034 は offline/static-only のままです。H2 は H1 SHA-256 90ba4a49fed1093ac3c5a05e9e78f3f0b10c17d4 でちょうど 20 の upstream path を持ち、21 番目の path は承認されていません。分離された子プロセスは、通常の no-link / reparse-free スナップショットを payloadcwd として受け取るだけで、fork は sentinel/Pytest/product import の前にこれを変更します。また、保持しているのは capability snapshot、次に project snapshot、次に stdlib のみです。そのため、C6 の 3 つの相対的な config 読み取りは、元のワークスペース config がスナップショット後に変更されても、スナップショット承認済みの bytes を使用します。公開の受領プロジェクションには verifier が注入されず、秘密発行は現在の canonical も事実を再計算します。AST 証明は 1 つの owner-local の package spec / module / loader / return / register / context フローに従います。バンドル rename の親 fsync は、明示的な platform best-effort fallback を伴いbundle_renamed ジャーナルの前に実行され、nonce に基づく both-missing recovery のみが retry-safe です。Runner、journal、trust のテストは最終化されていません。過去のどれも承認の証拠ではありません。新しいコードとアーキテクチャの再レビューは引き続き正の必要です。Main だけで両方の PASS 後に文書化された one-shot command を実行できますが、ここでは実行されていません。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA dual-transport MCP server that exposes your API as tools to LLM clients, supporting both stdio transport for local clients like Claude Desktop and HTTP/SSE transport for remote clients like OpenAI's Responses API.
- FlicenseAqualityDmaintenanceAn MCP server that scrapes and transcribes podcast episodes from YouTube or RSS feeds using Deepgram's Nova-2 model. It allows users to track podcasts for new episodes, manage transcripts, and generate personalized summaries through Claude.101
- AlicenseNot gradedqualityAmaintenanceExposes all CLI commands as MCP tools over stdio or HTTP transport.17Apache 2.0
- AlicenseNot gradedqualityCmaintenanceLocal podcast transcription, embedding, and semantic search with an MCP server for AI assistant integration. All processing runs on your machine.MIT
Related MCP Connectors
Podcast Index MCP — wraps the Podcast Index API (podcastindex.org)
Turn a GitHub repo or docs site into agent-ready context: pack it or search it, over MCP.
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/norton77930/corpus-ingest-core'
If you have feedback or need assistance with the MCP directory API, please join our Discord server