DeepSeek Harness で「Discovered / Crawled – Currently Not Indexed」の URL を修正する方法

DeepSeek Harness で Search Console のインデックスパイプラインを実行: dsh --profile headless のワンショットバッチ、または Web UI での対話セッションと週次スケジュール。どちらも Google Indexing API(1 日 200 URL)に送信。

DeepSeek Harness(dsh)は実際の作業ができるエージェントを実行します。そして、未インデックス URL パイプラインほどこれに適した SEO 業務はほとんどありません: リストを読み、各 URL を検査し、分類し、承認を待ち、送信し、検証する。どの段階もコマンドかファイルであり、まさにハーネスエージェントが得意とするものです。

セットアップを左右するのは 2 つの質問です。スクリプト化して cron に置けるワンショットバッチが欲しいなら、ヘッドレスで実行します。動く様子を見ながら質問に答え、バッチごとにチャットで承認したいなら、Web UI を使います。このガイドでは両方のパスを示します。下にあるパイプラインはどちらも同じです。2 つのステータスの深い解説(Google がなぜ一部のページをクロールし他をクロールしないのかを含む)は Hermes Agent 版のこのワークフロー で扱いました。ここでは dsh での実行に焦点を当てます。

パスの選択

ヘッドレス・ワンショット

Web UI + スケジュール

向いている用途

スクリプト化バッチ、cron、CI 風実行、テスト

対話型トリアージ、初回セットアップ、エージェントの判断を学ぶ

起動

dsh --profile headless "タスク"

dsh web(127.0.0.1:3080 が開く)

承認

ファイル内の事前承認リスト。ルールに人間が必要な場合、エージェントは質問ツールで聞く

チャットで質問に回答し、バッチごとに承認

スケジュール

cron(またはプロファイルが Schedule プラグインを読み込めば dsh のスケジュールツール)

同じ。ただし毎回の実行が見える

出力

プロジェクトフォルダ内のレポートファイル

レポートファイルに加えてチャットのトランスクリプト

dsh のヘッドレスワンショットパスと、Web UI プラススケジュールループのパスを比較する判定図

バッチにはヘッドレス、初回実行には Web UI。下のパイプラインは同じ。

両方のパスに共通するルールが 1 つあります: 書き込みステップ(Google への送信)は人間の承認ゲートの後ろに置きます。ヘッドレスモードでは、エージェントが生成したファイルをレビューしてから submit コマンドを実行させる、という形です。Web モードではチャットで承認します。

完成時点で手に入るもの

indexing/ プロジェクトフォルダに以下が入ります: URL インベントリ、分類済みリスト(to-submit.txtskip.txtneeds-fix.txt)、承認済み送信キュー、実行ログ。実行のたびに dsh は短いレポートを生成します: 送信数、スキップ数と理由、前回からの変化。初回セットアップは 60–90 分(ほとんどは Google 側の認証情報)、週次実行は 15 分です。

始める前に

  • dsh がインストールされ設定されていること。 必要なら npx @deepseek-ai/dsh@latest web で最新版に更新します。API キーと設定は ~/.dsh/(profiles、sessions、settings.yaml)にあり、dsh web が動作するかヘッドレスタスクが成功すればインストール確認になります。
  • 所有する GSC プロパティsc-domain:example.com 形式。
  • 読み取り認証情報: Search Console API 用の OAuth クライアント(クライアント ID + シークレット)。
  • 書き込み認証情報: Indexing API を有効にした Google Cloud プロジェクト、サービスアカウントの JSON キー、そしてサービスアカウントのメールアドレスを GSC → 設定 → ユーザーと権限でオーナーとして追加。送信で 403 が返る場合はこのステップが失敗しています。
  • ワークスペースに 2 つの GSC スクリプトフォルダ: 読み取りスキル(サイトマップ、サーチアナリティクス、URL 検査)とインデックススキル(index_submit.py)。Python 3 と pip install google-auth google-api-python-client
  • プロジェクトフォルダ。例: ~/gsc-indexing-projectdata/scripts/logs/

Google 側のセットアップはどのエージェントでも同じで、gsc-indexing スキルのドキュメントが Cloud Console の手順を説明しています: Indexing API の有効化、サービスアカウントの作成、キーのダウンロード、オーナーとしての追加。

パス A: ワンショットのヘッドレス実行

ヘッドレスモードは dsh --profile headless "タスク": 1 つのタスク、1 つの答え、終了。パイプライン全体を 1 つのプロンプトにまとめるか、デバッグしながら数回の実行に分けます。

初回実行(プロジェクトフォルダから):

bash
dsh --profile headless "GSC インデックスパイプラインのステージ 1 を実行してください。gsc_query.py スクリプトで sc-domain:example.com のサイトマップを一覧し、lastmod 付きのすべての URL を取得して重複を除き、data/url-inventory.csv に書き出してください。総数を報告してください。"

良い出力の目安: 実在する CSV で、GSC のサイトマップレポートと一致する件数があり、でっち上げの列がないこと。品質チェック: ファイルを開いて 5 URL をスポットチェックします。エージェントが認証エラーを報告したら、GSC の OAuth フローをやり直して再実行します。読み取りスクリプトには新しいトークンが必要です。

ステージ 2:

bash
dsh --profile headless "data/url-inventory.csv の URL を URL Inspection API で検査し、data/to-submit.txt、data/skip.txt(1 行の理由付き)、data/needs-fix.txt に分割してください。lastmod が直近 90 日以内の URL だけを含めてください。"

エージェントは検査スクリプトをバッチで実行します(API はプロパティごとにレート制限あり。現在の割り当て量は Google Cloud Console で確認)。分割結果を確認します: スキップリストは noindex、canonical 逸脱、重複ページが大半であるべきです。数千 URL のサイトで needs-fix が空になるなら、入力ウィンドウを広げます。

ステージ 3 は承認ゲートで、無人実行は絶対にしません:

bash
dsh --profile headless "data/needs-fix.txt と data/skip.txt を読んでください。修正・送信キューを表でドラフトしてください: URL、推定原因(内部リンクなし、重複、canonical、noindex、薄い、ソフト 404)、証拠、提案アクション、リスクレベル。何も送信しないでください。"

表示されるレポートで表をレビューし、data/to-submit.txt を承認した URL だけに編集してからステージ 4 を実行します:

bash
dsh --profile headless "data/approved-urls.txt の URL をインデックススクリプトで送信してください(index_submit.py submit --urls-file data/approved-urls.txt)。最初に check-auth を実行してください。すべての結果を logs/submissions.log に記録してください。"

期待される出力: URL ごとに通知結果が 1 行、403 なし。復旧パス: 403 はサービスアカウントがプロパティのオーナーでないこと、429 は 1 日 200 または 1 分 600 の割り当てに達したことを意味します。リストを日を分けて送信します。途中で死んだ場合は dsh --profile headless --resume <session> で再開します。

パス B: Web UI と週次スケジュール

dsh web はブラウザ UI を 127.0.0.1:3080 に開きます。同じステージをチャットで、ただし対話的に行います: エージェントは分類リストの確認を求め、submit コマンドの実行前にもう一度確認します。このライブ承認フローが、初回セットアップでこのパスを選ぶ主な理由です。あなたの Google プロパティに対してエージェントが何をしようとしているか、実行前に見えるからです。

パイプラインが動くようになったら、周期を追加します。dsh の Schedule プラグインは schedule_create を登録し、ライブセッション内のタイマーでタスクを再実行します:

schedule_create: every 7 days, run "Inspect data/url-inventory.csv, classify new and changed URLs, and draft the submission queue. Do not submit."

プロファイルが Schedule プラグインを読み込まない場合も、同じ結果を cron で実現できます。ヘッドレスコマンドをラップする 1 行です:

bash
0 9 * * 1 cd ~/gsc-indexing-project && dsh --profile headless "週次の GSC インデックス検査を実行し、送信キューをドラフトしてください。" >> logs/weekly.log 2>&1
人間の承認ストップを挟む dsh インデックスパイプラインの週次スケジュールループ図

スケジュールは最初の 3 つの停止点を回し、送信は人間のゲートの内側に留まる。

送信ステップはスケジュールに含めないでください。週次の検査、分類、キュードラフトは無人で実行できますが、送信は人間を待ちます。

エージェントが適用するトリアージルール

分類とキューは小さな表に依存します。すべての実行が同じルールを使うよう、プロジェクトフォルダに置くべきです:

原因

修正

修正後に送信するか

内部リンクが 1 本もない

インデックス済みページから文脈のあるリンクを追加

はい

真新しいページ

修正不要。一度送信して 1–2 週間待つ

はい、一度だけ

robots.txt でブロック

パスをブロック解除

はい

重複または薄いコンテンツ

書き直す、統合する、または削除

実際に変更した場合のみ

canonical が他を指している

間違いなら修正。意図的なら URL を落とす

修正した場合のみ

クロール時に noindex

noindex を外す

外した後、はい

ソフト 404、アーカイブ、価値のないファセット

修正するか削除。恒久的にスキップ

いいえ

2 つのステータスの深い読み方(Google がなぜ一部のページをクロールし他をクロールしないのかを含む)は Hermes Agent ガイド にあります。原因はどのハーネスがパイプラインを実行しても同じです。

検証して、待つ

各バッチの後、status で通知を確認します。それは Google が URL のメタデータを持っていることを示すだけで、ページがインデックスされたことを示しません。3–7 日後、送信した URL を再検査して状態を比較します。健全なパターンは 1–2 週間で discovered → crawled → indexed です。GSC のデータは数日遅れ、Google は独自のスケジュールで再クロールするため、本物の修正の後 10–14 日「Crawled – currently not indexed」のままの URL は、送信の問題ではなくコンテンツ品質の判断です。ログファイルでこれが見えます: 日付、URL、通知タイプ、次回実行時の検査状態。それこそが測定です: 通知件数の増加ではなく、未インデックスリストが時間とともに縮小すること。

正直な限界

  • Indexing API は公式には JobPostingBroadcastEvent のページ向けに文書化されています。通常ページの送信は広く行われている手法ですが、Google はすべてのページタイプについて保証もサポート約束もしていません。
  • Search Console の「インデックス登録をリクエスト」ボタンには公開 API がありません。Indexing API は最も近いスクリプト化チャネルであり、ボタンの複製ではありません。
  • 自動化は優先度を作りません。修正して送信しても未インデックスのままなら、次の手はコンテンツ作業であり、もう一度のスケジュール実行ではありません。

FAQ

Web UI なしでヘッドレスモードだけで実行できますか?できます。dsh --profile headless "タスク" は 1 タスクを実行して終了します。認証情報は引き続き ~/.dsh/ にあり、読み取りスクリプトも同じように動きます。パイプラインを一度 Web UI で確認してからスクリプト化してください。

実行が途中で死んだら、作業は失われますか?いいえ。dsh --profile headless --resume <session> で再開し、送信スクリプトを再実行します。重複 URL は除外されるため、同じバッチで通知済みの URL を再送信しても害はありません。

複数の GSC プロパティを管理しています。サイトごとにすべて繰り返すのですか?スクリプトは --site sc-domain:... 引数を受け取るため、1 つのワークスペースで複数プロパティのインベントリとログを管理できます。プロパティごとに承認キュー 1 つ、送信コマンド 1 つを維持します。あるサイトの割り当てエラーが他をブロックしません。

著者: Camille Rhodes、Auspia で 300 以上の AI コンテンツワークフローを設計してきたアーキテクト。コンテンツ自動化、パブリッシングシステム、AI エージェントを信頼できる成長オペレーションに変えるワークフローについて執筆。

このトピックを読む

同じテーマの記事を続けて読む