mcpField
S
search-console

search-console

github.com/openclaudiaマーケティング・グロース722524 回インストール1 週間前に更新
リポジトリ

search-console について

Google Search Console APIで検索実績、インデックス状況、サイトマップを調べるClaudeスキルです。SEO担当者向けに監査手順もまとめています。

主な機能

  1. 01クエリ、ページ、検索指標の取得
  2. 02日別トレンドの確認
  3. 03URLのインデックス状況確認
  4. 04サイトマップの一覧と送信
  5. 05SEO機会とカニバリゼーションの検出

活用シーン

  1. 01クリック数、表示回数、CTR、順位の確認
  2. 02クエリやページの推移追跡
  3. 03インデックスとサイトマップの状態確認
  4. 04低CTRのクエリや競合ページの発見

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/openclaudia/openclaudia-skills --skill search-console

インストール後、Claude Code で/search-consoleを入力して読み込まれたか確認します。

詳細

Google Search Console

Google Search Console API から検索パフォーマンスデータ、インデックス登録状況、Core Web Vitals を取得します。

前提条件

Google OAuth 認証情報が必要です。

  • GOOGLE_CLIENT_ID
  • GOOGLE_CLIENT_SECRET
  • https://www.googleapis.com/auth/webmasters.readonly スコープを持つ有効な OAuth アクセストークン

認証情報は .env、.env.local、または ~/.claude/.env.global に設定してください。

アクセストークンの取得
# Step 1: Authorization URL (user visits in browser)
echo "https://accounts.google.com/o/oauth2/v2/auth?client_id=${GOOGLE_CLIENT_ID}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/webmasters.readonly&response_type=code&access_type=offline"

# Step 2: Exchange code for tokens
curl -s -X POST "https://oauth2.googleapis.com/token" \
  -d "code={AUTH_CODE}" \
  -d "client_id=${GOOGLE_CLIENT_ID}" \
  -d "client_secret=${GOOGLE_CLIENT_SECRET}" \
  -d "redirect_uri=urn:ietf:wg:oauth:2.0:oob" \
  -d "grant_type=authorization_code"

# Step 3: Refresh expired token
curl -s -X POST "https://oauth2.googleapis.com/token" \
  -d "refresh_token={REFRESH_TOKEN}" \
  -d "client_id=${GOOGLE_CLIENT_ID}" \
  -d "client_secret=${GOOGLE_CLIENT_SECRET}" \
  -d "grant_type=refresh_token"
利用可能なサイトの一覧表示
curl -s -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  "https://www.googleapis.com/webmasters/v3/sites" \
  | python3 -c "
import json, sys
data = json.load(sys.stdin)
for site in data.get('siteEntry', []):
    print(f\"{site['siteUrl']}  |  Permission: {site['permissionLevel']}\")
"

サイト URL の形式は https://example.com/(URL プレフィックス)または sc-domain:example.com(ドメイン プロパティ)のいずれかです。


1. 検索パフォーマンス レポート

主要なレポートです。クエリ、ページ、クリック数、表示回数、CTR、平均掲載順位を確認できます。

API エンドポイント
POST https://www.googleapis.com/webmasters/v3/sites/{siteUrl}/searchAnalytics/query

注:{siteUrl} は URL エンコードする必要があります(例:https%3A%2F%2Fexample.com%2F または sc-domain%3Aexample.com)。

上位のクエリ
curl -s -X POST \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/searchAnalytics/query" \
  -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2024-01-01",
    "endDate": "2024-03-31",
    "dimensions": ["query"],
    "rowLimit": 50,
    "startRow": 0
  }'
上位のページ
curl -s -X POST \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/searchAnalytics/query" \
  -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2024-01-01",
    "endDate": "2024-03-31",
    "dimensions": ["page"],
    "rowLimit": 50
  }'
クエリとページの組み合わせ
curl -s -X POST \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/searchAnalytics/query" \
  -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2024-01-01",
    "endDate": "2024-03-31",
    "dimensions": ["query", "page"],
    "rowLimit": 100,
    "dimensionFilterGroups": [{
      "filters": [{
        "dimension": "page",
        "operator": "contains",
        "expression": "/blog/"
      }]
    }]
  }'
利用可能なディメンション
ディメンション説明
query検索クエリ
pageURL
country国コード(ISO 3166-1 alpha-3)
deviceDESKTOP、MOBILE、TABLET
date個別の日付
searchAppearanceリッチリザルトの種類
レスポンスの解析
curl -s -X POST "..." | python3 -c "
import json, sys
data = json.load(sys.stdin)
print(f\"{'Query':<50} {'Clicks':>8} {'Impr':>8} {'CTR':>8} {'Pos':>6}\")
print('-' * 82)
for row in data.get('rows', []):
    keys = ' + '.join(row.get('keys', []))
    print(f\"{keys:<50} {row['clicks']:>8} {row['impressions']:>8} {row['ctr']*100:>7.1f}% {row['position']:>6.1f}\")
"

2. 日付別の検索パフォーマンス

クエリとページの日ごとの傾向を追跡します。

curl -s -X POST \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/searchAnalytics/query" \
  -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2024-01-01",
    "endDate": "2024-03-31",
    "dimensions": ["date"],
    "rowLimit": 1000
  }'

特定のクエリを時系列で追跡するには、次のようにします。

curl -s -X POST \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/searchAnalytics/query" \
  -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2024-01-01",
    "endDate": "2024-03-31",
    "dimensions": ["date"],
    "dimensionFilterGroups": [{
      "filters": [{
        "dimension": "query",
        "operator": "equals",
        "expression": "your target keyword"
      }]
    }]
  }'

3. インデックス登録状況(URL Inspection API)

特定の URL がインデックスに登録されているか確認します。

エンドポイント
POST https://searchconsole.googleapis.com/v1/urlInspection/index:inspect
curl の例
curl -s -X POST \
  "https://searchconsole.googleapis.com/v1/urlInspection/index:inspect" \
  -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "inspectionUrl": "https://example.com/page-to-check",
    "siteUrl": "sc-domain:example.com"
  }'
レスポンスのフィールド
フィールド説明
inspectionResult.indexStatusResult.coverageStateSubmitted and indexed、Crawled - currently not indexed など
inspectionResult.indexStatusResult.robotsTxtStateALLOWED または DISALLOWED
inspectionResult.indexStatusResult.indexingStateINDEXING_ALLOWED または INDEXING_NOT_ALLOWED
inspectionResult.indexStatusResult.lastCrawlTimeGooglebot が最後にクロールした日時
inspectionResult.indexStatusResult.crawledAsDESKTOP または MOBILE
inspectionResult.mobileUsabilityResult.verdictPASS、FAIL、または VERDICT_UNSPECIFIED

4. サイトマップ

サイトマップを一覧表示し、ステータスを確認します。

サイトマップの一覧表示
curl -s -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/sitemaps" \
  | python3 -c "
import json, sys
data = json.load(sys.stdin)
for sm in data.get('sitemap', []):
    print(f\"URL: {sm['path']}\")
    print(f\"  Type: {sm.get('type','')}  |  Submitted: {sm.get('lastSubmitted','')}\")
    print(f\"  URLs discovered: {sm.get('contents',[{}])[0].get('submitted','?')}  |  Indexed: {sm.get('contents',[{}])[0].get('indexed','?')}\")
    print()
"
サイトマップの送信
curl -s -X PUT -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/sitemaps/https%3A%2F%2Fexample.com%2Fsitemap.xml"

5. 改善機会の特定

Search Console のデータを使って SEO の改善機会を見つけます。

取り組みやすい機会:表示回数が多く、CTR が低い

表示回数は多いものの CTR が低いクエリは、タイトルや説明文の最適化が必要であることを示唆します。

# Pull queries, then filter for: impressions > 100 AND ctr < 0.03 AND position < 20
curl -s -X POST \
  "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.com/searchAnalytics/query" \
  -H "Authorization: Bearer ${GSC_ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2024-01-01",
    "endDate": "2024-03-31",
    "dimensions": ["query", "page"],
    "rowLimit": 1000
  }' | python3 -c "
import json, sys
data = json.load(sys.stdin)
print('== Low CTR Opportunities (High impressions, low CTR, good position) ==')
print(f\"{'Query':<40} {'Page':<40} {'Impr':>6} {'CTR':>7} {'Pos':>5}\")
for row in data.get('rows', []):
    if row['impressions'] > 100 and row['ctr'] < 0.03 and row['position'] < 20:
        print(f\"{row['keys'][0]:<40} {row['keys'][1][-40:]:<40} {row['impressions']:>6} {row['ctr']*100:>6.1f}% {row['position']:>5.1f}\")
"
上位進出の可能性:掲載順位 5~20 位

コンテンツを最適化することで上位 5 位以内に押し上げられる可能性のある、1~2 ページ目にランクインしているクエリです。

# Filter for position between 5 and 20 with decent impressions
curl -s -X POST "..." | python3 -c "
import json, sys
data = json.load(sys.stdin)
print('== Striking Distance Keywords (Position 5-20) ==')
opps = [r for r in data.get('rows',[]) if 5 <= r['position'] <= 20 and r['impressions'] > 50]
opps.sort(key=lambda x: x['impressions'], reverse=True)
for row in opps[:30]:
    print(f\"{row['keys'][0]:<50} Pos: {row['position']:>5.1f}  Impr: {row['impressions']:>6}  Clicks: {row['clicks']:>4}\")
"
カニバリゼーションの検出

複数のページが同じキーワードを競い合っているクエリを見つけます。

# Pull query+page data, then group by query to find duplicates
curl -s -X POST "..." | python3 -c "
import json, sys
from collections import defaultdict
data = json.load(sys.stdin)
query_pages = defaultdict(list)
for row in data.get('rows', []):
    query_pages[row['keys'][0]].append({
        'page': row['keys'][1],
        'clicks': row['clicks'],
        'impressions': row['impressions'],
        'position': row['position']
    })
print('== Keyword Cannibalization (multiple pages for same query) ==')
for query, pages in sorted(query_pages.items(), key=lambda x: -sum(p['impressions'] for p in x[1])):
    if len(pages) > 1:
        total_impr = sum(p['impressions'] for p in pages)
        if total_impr > 100:
            print(f\"\nQuery: {query} ({total_impr} total impressions)\")
            for p in sorted(pages, key=lambda x: -x['impressions']):
                print(f\"  {p['page'][-60:]}  Pos: {p['position']:.1f}  Impr: {p['impressions']}  Clicks: {p['clicks']}\")
"

ワークフロー:検索パフォーマンスの総合監査

GSC の総合監査を依頼された場合:

  1. 全体指標:過去 90 日間とその前の 90 日間の合計クリック数、表示回数、平均 CTR、平均掲載順位
  2. 上位 30 件のクエリ:クリック数順。CTR と掲載順位も含めます
  3. 上位 20 件のページ:クリック数順。CTR と掲載順位も含めます
  4. デバイス別の内訳:デスクトップとモバイルのパフォーマンス
  5. 取り組みやすい機会:表示回数が多く CTR が低い機会
  6. 上位進出の可能性:最適化の余地がある掲載順位 5~20 位のキーワード
  7. カニバリゼーション:競合する複数のページがあるクエリ
  8. インデックス登録状況:重要な URL を抜き取り確認
  9. サイトマップの健全性:サイトマップが送信され、インデックスに登録されていることを確認
レポート形式
## Search Console Audit: {domain}
### Period: {date range}

### Summary
| Metric | Current | Previous | Change |
|--------|---------|----------|--------|
| Clicks | X | Y | +Z% |
| Impressions | X | Y | +Z% |
| Avg CTR | X% | Y% | +Z pp |
| Avg Position | X | Y | +Z |

### Top Queries
| Query | Clicks | Impressions | CTR | Position |
|-------|--------|-------------|-----|----------|
| ...   | ...    | ...         | ... | ...      |

### Optimization Opportunities

#### Title/Description Optimization (High Impressions, Low CTR)
1. "{query}" - {impressions} impressions, {ctr}% CTR, position {pos}
   - Page: {url}
   - Recommendation: ...

#### Content Optimization (Striking Distance)
1. "{query}" - position {pos}, {impressions} impressions
   - Action: Add {query} to H2, expand section on {topic}

#### Cannibalization Fixes
1. "{query}" appears on {n} pages
   - Consolidate to: {best_url}
   - Redirect/noindex: {other_urls}

レート制限

  • Search Analytics API:1 分あたり 1,200 クエリ
  • URL Inspection API:プロパティごとに 1 日あたり 2,000 件の検査
  • データの鮮度:検索データは通常 2~3 日遅れます

よくあるエラー

エラー原因対処方法
403このプロパティへのアクセス権がありませんGSC で所有権を確認してください
400日付範囲が無効です日付は過去 16 か月以内である必要があります
空の行フィルターに一致するデータがありません日付範囲を広げるか、フィルターを削除してください

コメント