Blog NotebookLM -- 文書に基づいた引用付きリサーチ
Claude Codeから直接Google NotebookLMノートブックに問い合わせ、アップロードされた文書のみに基づく引用付き回答をGeminiから取得します。各質問ごとにヘッドレスブラウザセッションを開き、回答を取得して閉じます。回答はTier 1品質(ユーザー自身の一次資料)であり、幻覚リスクはゼロです。
クイックリファレンス
| コマンド | 説明 |
|---|---|
/blog notebooklm ask <質問> | ノートブックに問い合わせ、文書に基づいた回答を取得 |
/blog notebooklm discover <URL> | ノートブックの内容をスマートに発見してからカタログ化 |
/blog notebooklm library list | ライブラリ内の全ノートブックを一覧表示 |
/blog notebooklm library add <URL> | ノートブックをライブラリに追加 |
/blog notebooklm library search <クエリ> | キーワードでノートブックを検索 |
/blog notebooklm library remove <ID> | ノートブックをライブラリから削除 |
/blog notebooklm setup | 一度だけのGoogle認証(ブラウザ表示) |
/blog notebooklm status | 認証状態を確認 |
/blog notebooklm cleanup | ブラウザ状態をクリーンアップ(ライブラリは維持) |
前提条件
- Googleアカウント(NotebookLMアクセス権限あり)
- Python 3.11以上(
run.pyが自動的にvenvを管理) - Google Chrome(初回実行時にPatchright経由で自動インストール)
- 一度だけの認証設定(インタラクティブなGoogleログインを表示ブラウザで実行)
必ずrun.pyラッパーを使用すること
スクリプトを直接呼び出さないでください。常に python3 scripts/run.py [スクリプト] を使用してください:
# 正しい:
python3 scripts/run.py auth_manager.py status
python3 scripts/run.py ask_question.py --question "..."
# 間違い -- venvなしでは失敗:
python3 scripts/auth_manager.py status
run.pyラッパーは、.venvの自動作成、依存関係のインストール、Chromeのセットアップ、およびターゲットスクリプトの実行を行います。
認証確認(ゲートパターン)
クエリ操作の前に、認証状態を確認してください:
python3 scripts/run.py auth_manager.py status
- 認証済みの場合: クエリを実行
- 未認証の場合: ユーザーに通知し、セットアップを案内:
"NotebookLMにはGoogleログインが必要です。
/blog notebooklm setupを実行して認証してください。" - 内部から呼び出された場合(blog-writeやblog-researcherからの場合): 認証されていなくても、静かに何も返さずエラーも出さない。執筆ワークフローをブロックしないこと。
セットアップワークフロー
/blog notebooklm setup の場合:
# 手動でGoogleログインするための表示ブラウザを開く(一度だけ)
python3 scripts/run.py auth_manager.py setup
ユーザーに伝える: 「ブラウザウィンドウが開きます。Googleアカウントにログインしてください。」 認証はブラウザプロファイルとクッキー注入のハイブリッドアプローチで維持されます。
その他の認証コマンド:
python3 scripts/run.py auth_manager.py status # 認証確認
python3 scripts/run.py auth_manager.py reauth # 再認証
python3 scripts/run.py auth_manager.py clear # 全認証データを消去
クエリワークフロー
/blog notebooklm ask <質問> の場合:
ステップ1: 認証確認
認証確認を実行(上記のゲートパターンを参照)。認証されていない場合はセットアップに案内。
ステップ2: ノートブックの特定
どのノートブックに問い合わせるかを決定:
--notebook-urlが指定されている場合: 直接使用--notebook-idが指定されている場合: ライブラリから検索- どちらもない場合: ライブラリのアクティブノートブックを使用
- アクティブノートブックがない場合: ライブラリを表示し、ユーザーに選択を促す
ステップ3: 質問
# 基本クエリ(アクティブノートブックを使用)
python3 scripts/run.py ask_question.py --question "質問をここに"
# 特定のノートブックIDを指定してクエリ
python3 scripts/run.py ask_question.py --question "..." --notebook-id notebook-id
# URLを直接指定してクエリ
python3 scripts/run.py ask_question.py --question "..." --notebook-url "https://..."
# JSON出力(内部・プログラムからの使用向け)
python3 scripts/run.py ask_question.py --question "..." --json
# デバッグ用にブラウザを表示
python3 scripts/run.py ask_question.py --question "..." --show-browser
ステップ4: 分析とフォローアップ
すべての応答はフォローアッププロンプトで終わります。必須の動作:
- 停止 -- すぐにユーザーに応答しない
- 分析 -- 回答をユーザーの元のリクエストと比較する
- ギャップの特定 -- さらに情報が必要か判断する
- フォローアップ質問 -- ギャップがあれば、すぐにフォローアップ質問をする
- 繰り返し -- 情報が完全になるまで続ける
- 統合 -- ユーザーに応答する前にすべての回答をまとめる
スマートディスカバリーワークフロー
/blog notebooklm discover <URL> の場合:
内容が不明なノートブックを追加する際は、まずクエリを実行:
# ステップ1: 内容を発見
python3 scripts/run.py ask_question.py \
--question "このノートブックの内容は何ですか?どのようなトピックが含まれていますか?簡潔に完全な概要を提供してください" \
--notebook-url "<URL>"
# ステップ2: 発見したメタデータとともに追加
python3 scripts/run.py notebook_manager.py add \
--url "<URL>" \
--name "<内容に基づく名前>" \
--description "<内容に基づく説明>" \
--topics "<抽出したトピック>"
絶対に推測したり汎用的な説明を使用しないでください。 常に発見するかユーザーに確認してください。
ライブラリ管理
# 全ノートブックを一覧表示
python3 scripts/run.py notebook_manager.py list
# ノートブックを追加(すべてのパラメータ必須 -- 発見するかユーザーに確認!)
python3 scripts/run.py notebook_manager.py add \
--url "https://notebooklm.google.com/notebook/..." \
--name "説明的な名前" \
--description "このノートブックに含まれる内容" \
--topics "トピック1,トピック2,トピック3"
# キーワードで検索
python3 scripts/run.py notebook_manager.py search --query "キーワード"
# アクティブノートブックを設定
python3 scripts/run.py notebook_manager.py activate --id notebook-id
# ノートブックを削除
python3 scripts/run.py notebook_manager.py remove --id notebook-id
# ライブラリ統計情報
python3 scripts/run.py notebook_manager.py stats
内部API(blog-write / blog-researcher向け)
blog-writeやblog-researcherからTaskサブエージェントとして呼び出された場合:
入力(呼び出し元スキルから提供):
question: ブログトピックに関連するリサーチ質問notebook_idまたはnotebook_url: クエリ対象のノートブックcontext: "internal"(優雅なフォールバックモードを示す)
処理:
- 認証状態を確認 -- 認証されていない場合は、静かに空の結果を返す
- リサーチ質問でノートブックをクエリ
- 構造化された応答を解析して返す
出力(呼び出し元スキルに返される):
### NotebookLMリサーチ
- **ソース:** [ノートブック名]
- **質問:** [質問内容]
- **回答:** [ユーザーの文書に基づく引用付き応答]
- **ソース品質:** Tier 1(ユーザーアップロードの一次文書)
優雅なフォールバック: 認証がないかクエリが失敗した場合、すぐにエラーなしで戻ります。呼び出し元のワークフローはWebSearchベースのリサーチを続行します。NotebookLMが利用不可でも、blog-writeやblog-rewriteをブロックしないでください。
データ保存
すべてのデータはスキルディレクトリ内に保存:
scripts/data/library.json-- ノートブックのメタデータとライブラリscripts/data/auth_info.json-- 認証状態scripts/data/browser_state/-- クッキーを含むChromeプロファイル
セキュリティ: すべてのデータディレクトリはgitignoreされています。認証情報やブラウザ状態をコミットしないでください。
エラーハンドリング
| エラー | 解決方法 |
|---|---|
| 認証されていない | /blog notebooklm setup を実行 |
| ModuleNotFoundError | 常に run.py ラッパーを使用 |
| ブラウザクラッシュ | cleanup_manager.py --confirm --preserve-library を実行後、再認証 |
| レート制限(1日50回) | 午前0時(PST)まで待つか、Googleアカウントを切り替える |
| ノートブックが見つからない | notebook_manager.py list で確認 |
| クエリタイムアウト(120秒) | より単純な質問で再試行するか、--show-browser でデバッグ |
| MCP利用不可(内部呼び出し) | 静かに戻る -- 執筆ワークフローはWebSearchを使用 |
制限事項
- セッションの永続性なし(各質問 = 新しいブラウザセッション)
- 無料Googleアカウントのレート制限(1日50クエリ)
- 手動アップロードが必要(ユーザーはNotebookLM Web UIに文書を追加する必要あり)
- ブラウザのオーバーヘッド(起動と終了に毎回数秒)
- ローカルClaude Codeのみ(Web UIでは利用不可)
リファレンスドキュメント
オンデマンドで読み込む -- 起動時にすべてをロードしない:
references/commands.md-- 完全なCLIコマンド、パラメータ、ワークフローパターンreferences/troubleshooting.md-- エラー解決、復旧手順、デバッグ