mcpField
G
gr-seo-patrol

gr-seo-patrol

github.com/gingiris-1031マーケティング・グロース87184 回インストール2 週間前に更新
リポジトリ

gr-seo-patrol について

ウェブサイトの検索パフォーマンスを管理するチーム向けの、SEO/GEO監視・診断スキルです。ランキング、インデックス、llms.txt、GA4を確認し、記事の修正やサイト全体の監査を行う手順を提供します。

主な機能

  1. 01キーワード順位の日次レポートとアラート
  2. 02インデックス、llms.txt、GA4の確認
  3. 03キーワードとランディングページの診断
  4. 04canonicalの一括修正
  5. 05記事の改善とサイト全体の監査

活用シーン

  1. 01キーワード順位の日々の変化を確認
  2. 02順位低下の原因を調査
  3. 03関連記事のcanonical URLを統一
  4. 04ページと構造化データを監査

インストール

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

$npx skills add https://github.com/gingiris-1031/gingiris-skills --skill gr-seo-patrol

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

gr-seo-patrol/scripts/
canonical-fix.py
check-page.py
check-schema.py
check-site.py
check-social.py
daily-report.py
README.md
rescue-post.py
scripts/
canonical-fix.py
check-page.py
check-schema.py
check-site.py
check-social.py
daily-report.py
README.md
rescue-post.py

詳細

gr-seo-patrol — SEO/GEO 日常パトロール

使用するタイミング

シナリオアクション
「今日の SEO 日報を実行」パトロール全体を実行(scripts/daily-report.py)
「特定のキーワードの順位が下がった」キーワード診断(Claude が下記の診断フローを直接実行)
「canonical を修正」一括統合(scripts/canonical-fix.py)
「この記事を立て直して」ソーシャルメディア救援(scripts/rescue-post.py)——title を前置きし、重みの高い内部リンクを 3 つ追加
「GA4 のデプロイを確認」HTML 内の G-XXXXX tag をスキャン
「llms.txt を確認」HTTP 200 + バイト数

コアフロー

1. 日報モード

入力:なし(全自動)、または指定キーワードリスト 出力:

  • キーワード順位の差分表(今日 vs 昨日のベースライン)
  • Google のインデックス数
  • llms.txt のステータス
  • GA4 のカバレッジ状況
  • 🚨 異常アラート(top 100 圏外への下落、全体的な順位更新)
2. キーワード診断

入力:キーワード 1 つ 手順:

  1. long-tail のバリエーションで SERP を 4~5 件実行
  2. 対象 URL が HTTP 200 か確認
  3. site: クエリでインデックス登録を確認
  4. 3 日前のデータと比較(履歴がある場合)
  5. 2026-06-24 追加チェック:
    • キーワードが volume 300–1,000 / KD 5–35 の範囲内であることを確認(範囲外の場合は優先度低として記録)
    • ページの title に best/free/top/guide+年が含まれているか確認(CTR の公式)
    • ページ内の内部リンク密度が段落あたり 2~3 個を超えていないか確認
    • ページに BreadcrumbList schema があることを確認
    • 最終更新日が表示されていることを確認(鮮度シグナル) 出力:雪崩 / 個別 / SERP 更新 / リンク切れの 4 つから 1 つを選択し、2026 年の準拠スコアを添付
3. Canonical の一括修正

入力:同じトピックの記事 N 件 + master URL 1 件 手順:各記事の frontmatter にある canonical_url: → master に置換し、GitHub API PUT 安全ガード:

  • _posts/ 内の .md のみ変更
  • 記事ごとに独立して commit(ロールバックしやすくするため)
  • ja/ko はスキップ(hreflang で代替し、self-canonical を維持)
4. ソーシャルメディア救援

入力:雪崩 URL 1 件 アクション:

  • a. title を書き直す:主要キーワードを前置きし、長さは ≤ 60 文字、必ず best/free/top/guide+年を含める(2026-06-24 CTR の公式)
  • b. meta description を書き直す:キーワードを言い換える(例:「figma alternative」→「the alternative to Figma」)
  • c. 重みの高い記事 top-3 から内部リンクを追加(anchor text = 対象キーワード)、段落あたりの内部リンクは最大 2~3 個
  • d. 競合ブログへの外部リンクを 1~2 件積極的に追加(信頼スコア → 順位を向上)
  • e. 【最終更新日】を確認して追加/更新(鮮度シグナル)
  • f. BreadcrumbList schema が設定されていることを確認
  • g. 変更前後をログに記録

API 依存関係

ServiceEnv var用途
DataForSEODATAFORSEO_B64SERP クエリ
GitHub PATGITHUB_TOKEN_posts/ の読み書き

完全な key テンプレートは docs/api-keys-template.md を参照してください。


SERP クエリテンプレート

import urllib.request, json
def serp(kw, loc=2840, lang="en", depth=100):
    key = os.environ["DATAFORSEO_B64"]
    payload = json.dumps([{"keyword": kw, "location_code": loc,
                           "language_code": lang, "device": "desktop",
                           "depth": depth}]).encode()
    req = urllib.request.Request(
        "https://api.dataforseo.com/v3/serp/google/organic/live/advanced",
        data=payload,
        headers={"Authorization": f"Basic {key}",
                 "Content-Type": "application/json"})
    with urllib.request.urlopen(req, timeout=40) as r:
        return json.loads(r.read())

よく使う location_code:

  • 2840 US / 2826 UK / 2392 JP / 2410 KR / 2156 CN(無効、中国からは結果が返されません)

実行スクリプト

実行可能なスクリプトは scripts/ 内にあります:

  • daily-report.py — 日報全体
  • canonical-fix.py — canonical の一括統合
  • rescue-post.py — ソーシャルメディア記事の救援
  • diag-keyword.py — キーワード診断(roadmap、当面は下記の「キーワード診断」フローで代用)

各スクリプトは単独で実行できます。呼び出す際は Bash ツールを優先し、スクリプトを書き直さないでください。


出力規則

  1. 先に表、次に結論
  2. 差分は矢印で表示:#6 ↑ / #19 ↓↓
  3. 異常が 3 件を超える場合 →「🚨 異常」の節を個別に設ける
  4. すべての順位に location_code を付ける。推測で補わない

連鎖的な推奨アクション

  • cannibalization(同じキーワードで複数の記事が近い順位を獲得)を発見 → gr-blog-post で canonical を統合
  • 同じ日にキーワード N 件が top 100 圏外に下落 → まず 24h 待ち、コンテンツを無理に変更しない
  • 新しいキーワードの機会(long-tail で top 30)を発見 → gr-blog-post で内容を拡充

アンチパターン

  • ❌ grep / find で _posts/ をスキャンしないでください。代わりに GitHub Contents API を使用してください
  • ❌ 本番環境で直接 git push しないでください —— Contents API の PUT を使用してください
  • ❌ SERP クエリを一度に 50 キーワード実行しないでください —— バッチが大きすぎると rate limit が発生しやすいため、6~10 件ずつ処理してください
  • ❌ canonical を master に変更した後、すぐに Google に再インデックスを強制しないでください —— 自然なクロールを 3~7 日待ってください

月次サイト全体監査ワークフロー

2026-05-07 に 58 ページで検証済み:30 分の実行で、SERP で切り詰められる title 43 件、schema の警告 36 件、ストップワードを含む slug 27 件を検出しました。レイアウトレベルの修正 1 件(commit 24a0410e)で、title の問題 43 件中 20 件を解決しました。

phase2-monthly-checkpoint の前に月 1 回実行してください。出力:HTML レポート + 機械可読な findings.json を ~/Downloads/seo-audit/audit-{YYYY-MM-DD}.json にアーカイブします。

ステージ 1 — 検出(5 分)
import urllib.request, re
sm = urllib.request.urlopen("https://gingiris.tools/sitemap.xml").read().decode()
urls = [u for u in re.findall(r"<loc>([^<]+)</loc>", sm) if "/blog/" in u]
# typically 50-70 URLs
ステージ 2 — 並列監査(60 ページ、4 スレッドで 20 分)

scripts/ 内の採用済み seo-audit-skill スクリプトを使用します:

# For each URL — run 2 scripts in parallel
python3 scripts/check-page.py URL --timeout 20    # title, H1, meta, canonical, slug, alt, keyword placement
python3 scripts/check-schema.py URL --timeout 20  # JSON-LD validation

または Python の concurrent.futures.ThreadPoolExecutor(max_workers=4) でバッチ処理します。4 より大きくしないでください — GitHub Pages CDN は過度な並列アクセスをスロットリングします。

各スクリプトは、構造化された JSON エンベロープを出力します:

{"field": {"status": "pass|warn|fail|info", "detail": "...", "llm_review_required": false}}
ステージ 3 — 検出結果の集計

カテゴリ別に分類します:

  • Title の長さ > 70 文字(SERP で切り詰められるリスク)
  • H1 の長さ > 70 文字(モバイルでの読みやすさ)
  • Meta description < 80 または > 170 文字
  • Schema の警告:@type ごと(BlogPosting、Article、Organization)
  • Canonical の問題(最終 URL と一致しない)
  • Slug の問題(ストップワード、大文字、キーワードの欠落)
  • 画像の alt text:コンテンツ画像に設定されていない

集計件数と問題ごとの URL リストを findings.json に保存します。

Stage 4 — Layered Fix Strategy (HIGH ROI ORDER)

1️⃣ Layout-level fixes first (1 commit, fixes 20+ pages):

  • Schema bugs in _layouts/default.html
  • Site-name suffix in <title> tag
  • Missing dateModified from last_modified_at frontmatter
  • Organization / Publisher / contactPoint completeness

2️⃣ Config-level fixes (1 commit, fixes site-wide):

  • _config.yml — logo URL (must be absolute), twitter, social, author structure

3️⃣ Per-article batch fixes (1 commit per file, parallelizable):

  • Trim long titles while preserving keyword (target ≤ 70 chars, ideal 50-60)
  • Trim long H1s (target ≤ 70 chars)
  • Expand short meta descriptions (target 120-160 chars)
  • Add missing Citable Statistics blocks for top GSC-impression pages

4️⃣ Skip these (low ROI):

  • Slug stop words (changing breaks 301)
  • Old articles with <50 imp/month (low traffic = low fix priority)
Stage 5 — Verify (after Jekyll rebuild ~60-90s)

Re-run check-schema.py on a sample page. Confirm status: pass for at least: Article · BlogPosting · Organization · FAQPage

Stage 6 — Archive

Commit findings.json to ~/Downloads/seo-audit/audit-{YYYY-MM-DD}.json for trend tracking. Add 2-5 atoms documenting any new lessons learned.


HARD RULE (anti-hallucination guardrail)

Adopted from JeffLi1993/seo-audit-skill — strict whitelist pattern.

⛔ Output ONLY the checks defined in the audit script's JSON envelope.

  • Do NOT add "bonus" checks not in the script output
  • Do NOT contradict the script's status field unless you have additional observable evidence
  • Do NOT invent metrics like "EEAT score 89" — third-party scoring tools are unofficial (per Google's 2026 guidance)
  • Do NOT include checks marked llm_review_required: false in your judgment commentary — the script's status is final
  • If llm_review_required: true, make explicit judgment, document reasoning, then update status

The script envelope is the single source of truth. Treat it as a strict whitelist.


Companion skill

For single-page audits (not full-site), the same scripts power JeffLi1993/seo-audit-skill which produces a polished HTML audit report. Install as a complementary skill if you want client-presentable per-page audits.


Platform Description

EN: Daily SEO/GEO patrol skill (2026-06-24 standards). Tracks SERP keyword rankings (DataForSEO, filters volume 300–1,000 / KD 5–35), checks Google index count, llms.txt accessibility, GA4 tag deployment + AI traffic channel grouping. Rescues underperforming posts by applying title formula (best/free/top/guide+year), keyword rephrase in meta description, internal link density enforcement (≤2–3 per paragraph), competitor blog external link injection, BreadcrumbList schema check, and freshness date update. Fixes canonical issues.

ZH: 每日 SEO/GEO 巡逻 skill(2026-06-24 标准)。追踪 SERP 排名(DataForSEO,volume 300–1,000 / KD 5–35 筛选),检查 Google 索引数、llms.txt 可达性、GA4 部署 + AI 流量频道分组。救援雪崩文章:title 含 best/free/top/guide+年份、meta description 关键词 rephrase、内链密度 ≤2–3/段、主动 cite 竞品外链、BreadcrumbList schema、freshness 日期更新、canonical 修复。

JA: デイリーSEO/GEOパトロールskill(2026-06-24基準)。SERPランキング追跡(DataForSEO、volume 300–1,000/KD 5–35フィルター)、Googleインデックス数、llms.txt確認、GA4タグ+AIトラフィックチャンネル設定。スノーアバランシュ記事の救援:タイトルにbest/free/top/guide+年、meta descriptionキーワードrephrase、内部リンク密度≤2–3/段落、競合ブログ外部リンク挿入、BreadcrumbListスキーマ、freshness日付更新、canonical修正。

KO: 일일 SEO/GEO 순찰 skill(2026-06-24 기준). SERP 순위 추적(DataForSEO, volume 300–1,000/KD 5–35 필터), Google 인덱스 수, llms.txt 접근성, GA4 태그 + AI 트래픽 채널 그룹 확인. 부진 게시물 복구: 제목 best/free/top/guide+연도 적용, meta description 키워드 rephrase, 내부 링크 밀도 ≤2–3/단락, 경쟁사 블로그 외부링크 삽입, BreadcrumbList 스키마, freshness 날짜 업데이트, canonical 수정.

出海コミュニティへの参加と資料パックの購入 · コミュニティ&リソース

  • 出海コミュニティへの参加: WeChat で staywildgrow を追加し、「加入社群」とメッセージを送信してください。

  • 資料パックの購入: WeChat で staywildgrow を追加し、Gingiris の出海資料パックについてお問い合わせください。価格は 599 元人民币 です。

  • グローバル成長コミュニティへの参加: WeChat で staywildgrow を追加し、「加入社群」(コミュニティに参加)と送信してください。

  • 資料パックの入手: WeChat で staywildgrow を追加し、Gingiris のグローバル成長資料パックをご購入ください。価格は CNY 599 です。

コミュニティと資料パックは任意の窓口です。オープンソースの Skill のインストールや使用には影響しません。

コミュニティと有料の資料パックは任意です。オープンソースのスキルのインストールや使用に必要なものではありません。

コメント