Claude CodeのBotifyプラグインでクロール・ログ・Search Consoleを問い合わせる
BotifyプラグインはClaude CodeからBotifyのクロール、ログファイル、Search Consoleの履歴へSQLで問い合わせます。導入コマンド、同梱の2スキル、使えない条件、SQLの落とし穴まで。
BotifyのプラグインをClaude Codeに入れると、「Googleがクロールしているのにインデックスしていないページは」「ここ30日でオーガニック流入が落ちたのはどこか」といった問いを、Botifyのクロール、ログファイル、Search Consoleの履歴に対して自然文で投げられます。データはBotifyのサーバー経由で引かれ、Claudeが書いたSQLが実行されます。
ここではClaude Codeでの導入コマンド、同梱の2つのスキルの中身、使えない条件、SQLで踏みやすい落とし穴を順に説明します。
このプラグインが入れるもの
プラグインは「Botifyへの接続」と「スキル(定型ワークフロー)」の2部品でできています。リポジトリのREADMEの表では、どちらも提供済みとされ、スキルは今後のリリースで増える予定です。追加分は再インストール不要で、エージェントが自動で拾う仕組みだと書かれています。
| 部品 | 置き場所 | 役割 |
|---|---|---|
| MCP設定 | 置き場所.mcp.json | 役割https://mcp.botify.com/へ接続する(typeはhttp) |
| スキル | 置き場所skills/botify-mcp/ | 役割ツールの呼び方とbatch_runによる一括処理の作法 |
| スキル | 置き場所skills/botify-tables-sql/ | 役割クロール、ログ、Search ConsoleへのSQLの書き方 |
| クエリ集 | 置き場所skills/botify-tables-sql/references/ | 役割SEO・GEO向けのSQLレシピ |
| 接続手順 | 置き場所SETUP.md | 役割接続できない理由の切り分け |
プラグインのバージョンは、マニフェスト(plugin.jsonとmarketplace.json)では1.2.0です。Claudeのマーケットプレイスの掲載ページには「Anthropic verified」の表示があります。
READMEが挙げる質問例は次の5つです。最後の1つだけは調べるだけで終わりません。
- Googleがクロールしているのにインデックスしていないページはどれか
- 直近30日でオーガニック流入がもっとも落ちたのはどこか
- クロールバジェットを最も無駄にしているページテンプレートはどれか
- このURLはどのキーワードで表示され、1ページ目に近いのはどれか
- これらのページのタイトルとディスクリプションの改善案を作り、Botifyに反映する
READMEは、エージェントが結果を返すだけでなく、見つけた内容に基づいて作業できる点を、このプラグインの狙いとしています。
導入前に確認すること
いちばん大きな条件はBotifyの契約です。SETUP.mdには、エージェントのアクセスを含むプランのBotifyアカウントが必要で、無料枠、トライアル、デモ用データはこの経路では使えないと書かれています。APIキーを貼る手順もありません。
READMEの要件は「Guest collaborator以外で、Botifyのプロジェクトにアクセスできること」です。
サインインは初回のツール呼び出し時に始まります。ブラウザでBotifyにログインして許可するだけで、クライアントID、シークレット、コールバックURLは用意しません。
導入手順
Claude CodeにBotifyプラグインを入れるまで
- 1
マーケットプレイスを追加する
READMEの指定どおり、
botify-hq/ai-pluginsをマーケットプレイスとして登録します。GitHubのowner/repo形式は/plugin marketplace addの対象です。 - 2
プラグインをインストールする
名前は
botify@botifyです。セッション内では、このコマンドはすぐに入れず、/pluginの詳細画面を開いてスコープを選ばせます。 - 3
質問を投げてサインインする
Botifyのデータが必要な質問をすると、初回にブラウザでサインインが始まります。
/plugin marketplace add botify-hq/ai-plugins
/plugin install botify@botifyシェルから入れるなら、次のように書きます。マーケットプレイスの登録とインストールを1コマンドにまとめる--marketplaceは、Claude Code v2.1.292以降の機能です。
claude plugin install botify --marketplace botify-hq/ai-plugins入れたあとは/pluginのInstalledタブでプラグインとスコープを確かめます。反映されないときは/reload-pluginsを実行します。MCPの接続状態は/mcpで見られます。
サインインが進まないとき
SETUP.mdの切り分けは3通りです。
Botifyのツールが何も返さないとき
- QブラウザにBotifyのサインイン画面が出ましたか?答えがいいえのとき答えがはい
クライアントのプラグイン設定かコネクタ設定からBotifyを削除し、追加し直します。認可がやり直しになります。Claude Codeでは
/mcpのRe-authenticate、またはシェルのclaude mcp login <サーバー名>でも再認証できます。 - Q`list_projects`でプロジェクトは見えますか?答えがいいえのとき答えがはい
アカウントはあっても、どのプロジェクトにもアクセス権がありません。Botifyの管理者に付与を依頼します。
プロジェクトが見えるのに拒否されるとき
アカウント単位でエージェントアクセスが無効になっています。再インストールでは直りません。help@botify.comへ連絡します。
claude mcp loginに渡すサーバー名は、/mcpの一覧に出ている名前に合わせます。
botify-tables-sqlスキルはSQLの癖を先に教える
Botifyのクロール、ログ、Search ConsoleのデータはBigQuery系のカタログに入っていて、tables_queryで標準SQLを実行して引きます。スキルの役目は、そのカタログで最初に踏む失敗を避けさせることです。
スキルが定める「必ず守る約束」から、効果の大きいものを選びます。
| 約束 | 内容 |
|---|---|
catalog.を付ける | 内容FROM catalog.crawl_pages_20260629のように全テーブルに付ける。無いとCOUNTでもエラー |
最初にtables_list | 内容存在するテーブルと日付の確認。存在しないテーブルは空結果でなく500になる |
max_resultsを指定 | 内容集計は50、内訳は200以上など、出力の大きさに合わせる |
| 組織・プロジェクトのスラッグ | 内容不明ならlist_projectsで調べ、推測しない |
| 接続タイムアウト | 内容1〜2回は同じ呼び出しを再試行する |
クエリは、シャッフルしたバイト数から計算されるクレジットで課金されます。パーティションなどでスキャンを絞るよう、スキルは求めています。
テーブルのファミリーは次のとおりです。具体的なテーブル名とクロールの日付はプロジェクトごとに違うので、tables_listの結果から最新を選びます。
crawl_pages_YYYYMMDD: クロールごとのスナップショットlogs_{family}_{crawls|visits}_YYYYMM: 月別のログ。ファミリーはgoogle、bing、openai、other_ai_botssearch_console_flat: URL × キーワード × デバイス × 国 × 日付の粒度ai_visibility_results: LLMに対するプロンプトの実行結果(引用・ブランド言及)logs_urls:url_hashからURLを引く対応表
Search Consoleは検索語の列名が違う
search_console_flatの検索語の列はqueryでなくkeywordです。clicksとimpressionsはFLOATなので、表示用にはINT64へキャストします。さらにSearch Consoleのデータは数日遅れるため、「直近1週間」は今日でなくMAX(date)を基準に切ります。
この条件を踏まえて組んだ例を示します。READMEの質問「1ページ目に近いキーワードは」に当たる問い合わせで、列名はスキルの記述に沿っています。日付は文字列リテラルで切るので、先に最新日を確かめます。
SELECT MAX(date) FROM catalog.search_console_flat返ってきた最新日から28日さかのぼった日付をYYYY-MM-DDの形で下の'2026-01-01'に入れて実行します。テーブルも環境の値に置き換えます。
-- 直近28日で11〜20位に居る検索語(1ページ目に近い候補)
SELECT keyword, url,
CAST(SUM(impressions) AS INT64) AS imp,
CAST(SUM(clicks) AS INT64) AS clk,
ROUND(SAFE_DIVIDE(SUM(avg_position * impressions),
SUM(impressions)), 1) AS pos
FROM catalog.search_console_flat
WHERE date >= '2026-01-01'
GROUP BY keyword, url
HAVING pos BETWEEN 11 AND 20
ORDER BY imp DESC
LIMIT 50日付の絞り込みは、スキルの書き方に合わせてWHERE date >= 'YYYY-MM-DD'の日付リテラルにしています。date列の型はスキルに記載がないため、DATE_SUBのような関数で計算させず、最新日を見てから文字列で切る2段にしました。
クエリ集は結果を事業の言葉に直す
同梱のクエリ集は、クロールの状況、クロールバジェット(Googlebotのログ)、Search Consoleの傾向、AIボットのクロール、AI経由の流入、AIの可視性、SpeedWorkers、PageWorkersの順に並んでいます。たとえば「正常なのに一度もGoogleにクロールされていないページ」は、クロールのスナップショットとログをLEFT JOINする形で用意されています。
レポートの書き方にも指示があります。生のテーブルでなく、無駄になったクロールバジェットの割合や、ブロックされているAIボットの割合のような、意思決定に使える形に直す。データの期間とクロール日付を必ず明記する。原因が実装側にある兆候(0・502・504の増加)は、SEOの問題とは分けて報告する。
件数が多いときはbotify-mcpスキルがbatch_runに回す
もう1つのスキルbotify-mcpは、1回の呼び出しで1アイテムしか処理できないというBotify MCPの仕様を扱います。itemsは長さ1の配列で、2件目を入れるとエラーになり、そのエラーがbatch_runを案内します。
URLが数千件あるときの回し方
避ける形
tables_queryでURL一覧を引き、1行ずつhtml_fetchやhtml_code_executorを呼びます。一覧もHTMLも会話に入り、1アイテムの上限にも当たります。
スキルが示す形
集計とLIMITで母集団を把握したあと、同じSQLをbatch_runのsqlソースに渡します。レコードは会話を通らず、結果はシンクへ書かれます。
分かれ目は件数です。
batch_runの動き方
inline実行
10件以下
結果がそのまま返る
job実行
11件以上
job_idだけが返る
batch_sample
最大20件
既定は5件
11件目からは「ジョブ」になり、手元に返るのはjob_idとestimated_credits、シンクの情報だけです。データを会話に引き戻さないための設計です。rowsソースだけは中身がモデルを経由するため、256KBを超えると拒否されます。
新しいitem_mapやJavaScript、LLMの設定を初めて使うときは、先にdry_run: trueを付けます。最初の5件だけが全文で返り、ジョブは起動せず、シンクにも書かれません。確認してからdry_run: falseにします。
数字が合わなくなる落とし穴
Botifyのデータでは、構造を知らないとSQLが通るのに答えが違います。スキルが明示している点を絞って挙げます。
落とし穴
SpeedWorkersの`urlHash`をログやクロールに結合すると、一致するものがゼロになる
クロール、ログ、logs_urls、PageWorkersのurl_hashはfnv64です。SpeedWorkersのurlHashだけがxxhashで、そのまま結合するとエラーも出ずに一致がゼロになります。結合にはurlFnv64Hashを使います。
落とし穴
ログ側と配信側でbot_idの体系が別
Googlebot Desktopは、ログ(LogAnalyzer)のbot_idでは2、SpeedWorkersとPageWorkersのbotIdでは1です。ClaudeBotは72と30です。体系をまたいで結合せず、デコードした名前で比較します。列挙値はtables_schemaから読み、ハードコードしません。
落とし穴
マイナスの`http_code`はHTTPステータスではない
クロールデータのマイナスの値は取得エラーです。-104は接続のリセット(レート制限やWAFの疑い)、-160はrobots.txtによるブロックです。ログのhttp_code = 0は接続の中断かタイムアウトです。
クロールバジェットの集計では、Google Inspection Tool(URL検査やSearch Consoleの利用)とGoogle Adsのボットも混ざります。クエリ集は、これらを除外するか別に報告するよう求めています。
Claude Code側で事故を減らす設定
スキルは必要なときだけ読み込まれます。毎回守らせたい約束は、CLAUDE.mdに短く書いておくと確実です。次はスキルの約束から要点を抜いた例です。
## Botifyの問い合わせ
- SQLのテーブルは必ず`catalog.`を付け、先に`tables_list`で存在を確認する
- Search Consoleの「直近N日」は`MAX(date)`を基準にする
- 10件を超えるURLの一括処理は`batch_run`を使い、一覧を会話に貼らない
- 新しい`item_map`や設定は、先に`dry_run: true`で5件確認する
- 結果には、使ったクロール日付とデータ期間を必ず書く書き戻しの扱いも決めておきます。READMEによると、エージェントは依頼があればオンページの変更をBotifyへ反映できます。本番に影響する操作なので、Claude Codeの権限設定で書き込み系のツールだけaskにしておくと、実行前に必ず確認が挟まります。ツール名は接続後に/mcpで確かめて指定します。permissionsの設計全般はsettings.jsonの完全ガイドが詳しい資料です。
接続先のデータと結び付けたいときは、Search Console APIで順位を定点観測する方法や、GA4とSearch Consoleの突き合わせが、Botifyを契約していない環境でも使える補完になります。
使えない環境
利用面ごとに条件が違います。
| 利用面 | 状況 |
|---|---|
| Claude Code(ターミナル、IDE) | 状況プラグインで導入できる |
| Claude Cowork | 状況「Customize → Plugins → Add marketplace」にbotify-hq/ai-pluginsを入れる |
| Claudeのチャット | 状況プラグインを使わない。コネクタのディレクトリからBotify MCPを追加する |
| Claude Codeのクラウドセッション | 状況手元で入れたプラグインは読み込まれない |
claude -pとAgent SDK | 状況/mcpの画面がなく、OAuthを開始できない |
クラウドセッションとヘッドレス実行の2行は、Claude Codeの公式ドキュメントの記述です。CIや定期実行でBotifyに問い合わせたい場合は、先に対話セッションで/mcpかclaude mcp loginを使ってサインインを済ませておく必要があります。
Cursor、GitHub Copilot、VS Codeにも入れられ、ChatGPT/Codexは掲載の公開待ちです。同じリポジトリが各クライアント向けのマニフェストを持つので、クライアント別の版を選ぶ必要はありません。
まとめ
Botifyプラグインの価値は、接続そのものより、SQLの癖を教える2つのスキルにあります。catalog.の接頭辞、keyword列、ハッシュ方式の違いを知らないClaudeに素のMCPだけ渡すと、通るが違う答えになりやすい箇所です。
導入前に確認するのは、Botifyの契約があるか、自分のロールがGuest collaboratorでないか、管理者がエージェントアクセスを止めていないか、の3点です。契約が済んでいれば、コマンドは2行で足ります。まずは読み取りの質問でtables_listの結果を確かめ、書き戻しはそのあとに権限を絞って試す進め方が安全です。