mcpField
S
seo-local

seo-local

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

seo-local について

seo-localは、地域検索での可視性を評価するローカルビジネス向けSEO監査スキルです。ページ上のGoogle Business Profile情報、NAPの一貫性、ローカルパック順位、レビュー、ディレクトリ掲載状況を調べ、優先修正リストを作成します。

主な機能

  1. 01ページ上のGBP情報を確認
  2. 02複数ページのNAPを比較
  3. 03ローカルパック順位の追跡
  4. 04レビューサイトの情報を抽出
  5. 05ローカルSEO上のページ課題を監査

活用シーン

  1. 01地域ビジネスサイトの検索状況を確認
  2. 02名称・住所・電話番号の不一致を特定
  3. 03対象キーワードのローカルパック表示を確認
  4. 04ディレクトリやレビューの改善点を整理

MCP 対応

ローカル順位、ページ監査、ドメイン情報の取得にSE Ranking MCP サーバーを使用します。Firecrawl MCP サーバーではページやレビュー掲載ページを取得できます。

インストール

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

$npx skills add https://github.com/seranking/seo-skills --skill seo-local

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

同梱ファイルreferences/local-citation-sources.md

詳細

出力例:examples/seo-local-sweetgreen-com-20260514/LOCAL-SEO-REPORT.md

ローカル SEO

ローカルパックや「近くの」検索での可視性を左右するシグナルに基づいて、地域密着型ビジネスのウェブサイトを評価します。ページ上の GBP 連携、NAP の一貫性、ページ内のローカルインテント、Tier-1 ディレクトリでのサイテーション状況、レビューサイトでの掲載状況、ビジネスの主要キーワードにおけるローカルパックの順位を確認します。成果物は、観測可能なシグナルに基づいて優先順位を付けた修正リストです。

AgriciDaniel/claude-seo の seo-local スキル(MIT)を基にしています。コンセプトと評価軸の構成は上流版を踏襲し、バックエンドを SE Ranking + Firecrawl + Google APIs に置き換えています。上流版の DataForSEO Maps のジオグリッドと Business Listings のチェックは、同等のバックエンドがないため省略しています。成果物の「制限事項」を参照してください。

前提条件

  • SE Ranking MCP サーバーが接続されていること(ローカルパックの順位、ページ内監査データ、ドメインのコンテキストに使用します)。
  • Claude の WebFetch ツールが利用できること(Firecrawl が利用できない場合の妥当性確認用フォールバックとして使用します)。
  • ユーザーから次の情報が提供されていること:(a)対象ドメインまたはホームページ URL、(b)主要なローカルキーワードを少なくとも 1 つ(例:"dentist Brooklyn"、"plumber near me")、(c)対象国と、ローカルパックの地域を絞り込むための市区町村/地域(可能であれば)。任意:GBP リスティング URL、レビュー取得用の Yelp/Trustpilot URL。

プロセス

  1. 対象の検証と事前チェック。 標準の 3 段階の事前チェック(クレジット残高、Firecrawl の利用可否、Google APIs)については、skills/seo-firecrawl/references/preflight.md を参照してください。このスキル固有の補足:

    • 対象を正規化します(ドメインからプロトコルを削除し、ホームページを取得できることを確認します)。ローカルキーワードが少なくとも 1 つ提供されていることを確認します。提供されていない場合は、ホームページの <title> と <h1> から推定します。それでも曖昧な場合は、続行する前にユーザーに確認します。
    • このスキルで見込まれる SE Ranking のコスト:約 15~25 クレジット(監査の再確認 1 回 + SERP クエリ 3~5 件 + ドメイン概要 1 件)。
    • Firecrawl:WebFetch によるフォールバックが可能なため任意です。利用可能な場合、Firecrawl クレジットは約 6~9(上限 12)です。利用可能な場合、ステップ 4(ページ上の GBP 監査)、5(NAP の抽出)、7(レビューの取得)は、ホームページ + サンプルページ 5 件 + 提供されたレビュー URL に対して実行します。Firecrawl が利用できない場合、これらのステップは WebFetch のみで実行するため、スキーマ/JSON-LD の検出と tel:/住所要素の抽出は、文章の確認によるベストエフォートになります。WebFetch のみで実行するには --no-firecrawl を渡してください。
    • Google APIs:Tier 1(GSC)では、ローカルパックの順位確認後にステップ 8b(GSC のローカルクエリパフォーマンス)が利用可能になります。Tier 2(GA4)では、さらにステップ 8c(ランディングページ別の GA4 オーガニック流入データによる拡充)が利用可能になります。拡充に関する完全な仕様については、skills/seo-google/references/cross-skill-integration.md を参照してください。
  2. ビジネスタイプの検出

    • ホームページ + /contact + フッターの文章を読みます(WebFetch の Markdown で十分です)。
    • 次のいずれかに分類します。
      • 実店舗型 — 目に見える住所、「こちらへお越しください」という案内、埋め込みの Maps iframe がある。
      • サービス提供地域型ビジネス(SAB) — 住所がなく、「{region} にサービスを提供」「お客様のもとへ伺います」という案内がある。address.streetAddress がなく、スキーマに areaServed がある。
      • ハイブリッド型 — 両方のシグナルがある(例:ショールーム + サービス提供地域)。
    • この分類により、後続で適用するチェック項目が決まります。SAB では、埋め込み地図と実住所の一貫性チェックを省略します。LOCAL-SEO-REPORT.md の「Snapshot」に記録します。
  3. 業種の検出

    • URL パターン(/menu、/practice-areas、/listings、/inventory)、<title>、ページ本文から、Restaurant/Healthcare/Legal/Home Services/Real Estate/Automotive/Generic のいずれかを推定します。
    • これにより、後続のサイテーションソースとスキーマサブタイプの推奨内容を決定します。業種の Tier-1 ディレクトリについては、references/local-citation-sources.md を読み込みます。
  4. ページ上の GBP シグナル mcp__firecrawl-mcp__firecrawl_scrape(formats: ["rawHtml"] を指定)

    • ホームページと /contact(またはローカル検索意図が最も強いページ)をスクレイピングします。
    • rawHtml から以下を抽出します。
      • 埋め込み Google Maps iframe(<iframe src="https://www.google.com/maps/embed?...">)— 存在する場合は place ID を記録します。
      • レビューウィジェット/GBP リッチスニペットのマークアップ。
      • aggregateRating JSON-LD ブロック(存在する場合、そのサイトが SERP で星評価を表示したい意向を示す最も強いシグナルです)。
      • ページ上での営業時間の表示(検索時に営業中であることは、ランキングとの相関があります — Whitespark の第 5 位の要因です)。
      • クリック発信:<a href="tel:..."> 要素の数を数えます。
      • GBP プロフィールリンク:https://g.page/...、https://maps.app.goo.gl/...、または https://www.google.com/maps/place/... への <a href> があるか確認します。
    • Firecrawl を利用できない場合: WebFetch の Markdown でも一部のレンダリングでは tel: リンクを検出できますが、iframe と JSON-LD は失われます。Maps 埋め込み/aggregateRating/GBP プロフィールリンクの検出は (skipped — Firecrawl required) と記録します。
  5. NAP の一貫性 ホームページとサンプルページ 5 件に対して mcp__firecrawl-mcp__firecrawl_scrape を実行します。

    • サンプルページ:ホームページ、/contact、/about、およびサービスページまたはロケーションページ 2 件(サイトマップまたはトラフィック上位ページから選びます)。
    • 各ページから以下を抽出します。
      • レンダリングされた本文に表示されている NAP。 住所のパターン(番地+市区町村+州・地域+郵便番号)、電話番号(tel: href と表示形式)、事業者名(ロゴの alt、フッター、スキーマの name)。
      • JSON-LD の NAP。 すべての <script type="application/ld+json"> ブロックを解析します。name、address.streetAddress、address.addressLocality、address.addressRegion、address.postalCode、telephone を取得します。
    • 6 件のページサンプルとスキーマを比較します。 相違がある場合(連絡先ページとホームページで電話番号の形式が異なる、あるフッターでは「Suite 200」が欠落している、スキーマの電話番号が国際形式なのにページでは現地形式になっているなど)は、nap-inconsistencies.csv に記録します。
    • 実店舗のみ: Maps iframe がある場合は、iframe URL から埋め込み住所の読み取りを試みます(place ID と住所は URL エンコードされています)。ページ/スキーマの NAP と比較します。SAB は対象外です。
    • スキャン後に nap-inconsistencies.csv が空の場合は、ヘッダーのみの 1 行ファイルとして nap-inconsistencies.csv を作成し、LOCAL-SEO-REPORT.md に「NAP consistent across {n} pages and schema」と記載します。
  6. ローカルパックの順位追跡 国/地域フィルターを指定して DATA_getSerpResults を実行します。

    • ユーザーが指定したローカルキーワードごと(またはホームページから推定した 1~3 件ごと)に、以下を行います。
      • ユーザーの国と、API が対応する最も詳細な地域/市区町村を指定して DATA_getSerpResults を呼び出します(ユーザーが市区町村を指定した場合は、まず DATA_getSerpLocations を使って有効なロケーションコードを確認します)。
      • オーガニック検索結果の上位 10 件、ローカルパックの有無(はい/いいえ)、表示された場合はローカルパック内の 3 事業者(名前、評価、レビュー数)、AIO の有無を記録します。
      • クロスチェックします。対象ドメインはオーガニック検索結果の上位 10 件に含まれているか。対象事業者名はローカルパックに含まれているか。
    • 解析した結果をキーワードごとに local-keywords.csv に保存します(列:keyword,country,location,local_pack_present,target_in_pack,target_pack_position,target_organic_position,top_pack_competitor_1,top_pack_competitor_2,top_pack_competitor_3)。
    • ローカルパック広告に関する注意点を記載します。SE Ranking の SERP は、Google が表示する AI/広告によって変更されたパックを返します。ローカルパックに広告が表示された場合は記録してください。Sterling Sky によると、米国のモバイルでのローカル検索に占めるローカルパック広告の割合は、2025~2026 年に 1% から 22% に急増しました。
  7. レビューのスクレイピング ユーザーが提供したレビュー URL に対して mcp__firecrawl-mcp__firecrawl_scrape を実行します

    • 入力(ユーザー提供、任意)。 GBP リスティング URL(https://www.google.com/maps/place/...)、Yelp のビジネス URL、Trustpilot のビジネス URL、BBB のプロフィール URL。
    • 提供された各 URL について: formats: ["rawHtml"] を指定してスクレイピングします。解析した DOM から、レビュー総数、平均評価、最新レビューの日付(レビュー頻度の指標)、直近 10 件のレビューに対するオーナーの返信数を抽出します。
    • シグナルの集計:
      • 頻度:過去 18 日間に新しいレビューが 1 件以上ある場合は健全です(Sterling Sky の 18 日ルール)。最後のレビューから 21 日を超えている場合は「レビューの停滞」リスクです。
      • 件数:Google のレビューが 10 件未満の場合、マジックナンバーの基準を下回っていると判定します。
      • 星評価:4.5 以上は消費者のフィルタリング基準に一致します(BrightLocal:31% が 4.5 以上のみを検討)。
      • Google でのオーナー返信率:直近 10 件で 50% 未満の場合は、エンゲージメントに課題があります。
    • ユーザーがレビュー URL を提供しない場合: ステップ 7 全体をスキップします。LOCAL-SEO-REPORT.md に「レビュー プラットフォーム:未提供です。レビューの健全性を監査するには、--reviews 'gbp_url,yelp_url,trustpilot_url' を指定して再実行してください。」と記載します。URL を探そうとしないでください。レビュー URL の探索は別の問題であり、Maps API の方法は利用できないためです。
  8. ページ内ローカル SEO 監査 ホームページに対して DATA_getAuditReport(既存の監査)と DATA_getIssuesByUrl を実行します

    • 既存のサイト監査が最近(30 日未満、seo-technical-audit を参照)の場合は再利用します。 ローカル SEO のためだけに新しい監査を作成しないでください。監査データには、タイトルタグの問題、スキーマの欠落、モバイルでのユーザビリティなどがすでに含まれています。
    • 監査結果から、特にローカル SEO に関係する問題を提示します。
      • タイトルまたは H1 に主要な都市名やサービスの語句が含まれていない。
      • LocalBusiness の JSON-LD が欠落している、または無効である。
      • モバイルでのユーザビリティに関する問題(「近く」の検索が行われるのはモバイルです)。
      • スキーマの検証エラー(aggregateRating の破損、address の形式不正)。
    • スキーマの修正は seo-schema に任せます。 このスキルは JSON-LD を生成しません。LocalBusiness スキーマが欠落または破損している場合、納品物には「業種のサブタイプが正しい、すぐに貼り付けられる LocalBusiness マークアップを作成するには、seo-schema を実行してください」と記載します。これは seo-schema の役割であり、ここで再実装すると作業が重複します。

8b. GSC のローカル検索クエリのパフォーマンス (google-api.json が存在し、tier ≥ 1 の場合のみ)

  • 対象プロパティの過去 28 日間の GSC 検索アナリティクスを、dimension=query で取得し、ローカル検索意図のパターンに絞り込みます。 python3 scripts/gsc_query.py --property "{config.default_property}" --days 28 --json
  • クライアント側でクエリを絞り込み、near me を含むもの、ビジネスの所在地として知られる都市名・地域名を含むもの、または地名で終わるものを対象にします。インプレッション数の上位 10 件を提示します。
  • 都市名を含むクエリのインプレッション数が >100 で、平均掲載順位が >10 の場合は、ローカルパックへのリーチ不足です。GSC の数値を根拠として、LOCAL-SEO-REPORT.md の「優先修正項目」に記載します。
  • アカウントでプロパティが確認されていない場合は、「GSC:{target_domain} は未確認です。Search Console に追加してください」と提示して続行します。
  • エラー発生時の挙動については、skills/seo-google/references/cross-skill-integration.md を参照してください。

8c. ランディングページ別の GA4 オーガニック流入 (google-api.json が存在し、tier ≥ 2 の場合のみ)

  • 過去 28 日間の GA4 オーガニック流入の上位ランディングページを取得します。 python3 scripts/ga4_report.py --report top-pages --days 28 --json
  • 複数の拠点があるサイトでは、拠点ごとのページのセッション数を提示します。ある拠点ページがオーガニック流入の 80% 以上を獲得し、他の拠点ページがそれぞれ 5% 未満の場合は、拠点ページの品質にばらつきがあるため、指摘する価値があります(成績の低いページでドアウェイページまたは薄いコンテンツのリスクが考えられます)。
  • 拠点が 1 つのサイトでは、スナップショットにホームページのオーガニックセッション数を 1 行で記録します。
  1. 引用の掲載状況サンプル(可能な範囲で) WebSearch(API キーの費用はかかりません)

    • 業種別リストにある Tier-1 ディレクトリ(references/local-citation-sources.md を読み込みます)ごとに、site:{directory} "{business_name}" のクエリを使用して WebSearch で検索し、そのビジネスの掲載情報があるか確認します。
    • ディレクトリは最大 8 件まで(Google、Yelp、Facebook、BBB、Apple Maps、Bing Places に、業種別ディレクトリを 2 件追加)。これを超えると効果は逓減し、ユーザーが独自に監査できます。
    • LOCAL-SEO-REPORT.md の「Citations」セクションに、ディレクトリごとの検出済み/未検出と、見つかった場合は掲載ページの URL を記録します。
    • 明記すべき注意点: WebSearch の検索結果はサンプルであり、包括的な監査ではありません。「未検出」は掲載がないことの証明ではなく、特定のクエリで掲載情報が表示されなかったことを示すものです。網羅的な調査には、有料の引用監査ツール(Whitespark、BrightLocal、Yext)の利用を推奨します。
  2. LOCAL-SEO-REPORT.md を作成します

  • 以下の評価基準に沿って、ローカル SEO の 5 つの要素を評価し、優先度別(Critical/High/Medium/Low)に主な修正項目を列挙し、制限事項を記録します。
  • 判定の目安を適用します。詳細は Tips を参照してください。

出力形式

seo-local-{domain-slug}-{YYYYMMDD}/ フォルダーを作成し、以下を格納します。

seo-local-{domain-slug}-{YYYYMMDD}/
├── LOCAL-SEO-REPORT.md         (PRIMARY: verdict, scores, top fixes, limitations)
├── local-keywords.csv          (load-bearing: per-keyword local-pack + organic positions)
├── nap-inconsistencies.csv     (load-bearing: only emitted if discrepancies found)
└── evidence/
    ├── 01-homepage-snapshot.md     (Firecrawl raw HTML extracts: NAP, schema, GBP signals)
    ├── 02-nap-page-samples.md      (per-page NAP extracts across 5 sample URLs)
    ├── 03-serp-context.md          (raw DATA_getSerpResults per keyword)
    ├── 04-reviews.md               (per-platform review-page snapshots, only if user provided URLs)
    └── 05-citation-sample.md       (raw WebSearch results per directory check)

LOCAL-SEO-REPORT.md は次の形式に従います。

# Local SEO Report: {domain}

> Snapshot dated {YYYY-MM-DD} · Country: {country} · Region: {region} · Primary keyword: "{keyword}"

## Snapshot
- Business type: {Brick-and-Mortar | SAB | Hybrid}
- Industry vertical: {Restaurant | Healthcare | Legal | Home Services | Real Estate | Automotive | Generic}
- Pages sampled for NAP: {n}
- Local keywords tracked: {n}
- Local pack present on {n}/{m} keywords; target in pack on {p}/{m}
- Review platforms audited: {Google, Yelp, ... | not provided}
- GSC last 28d local-intent queries: {n} queries / {clicks} clicks / {impressions} impressions  *(or `not configured`)*

## Verdict: {STRONG | NEEDS WORK | WEAK}

{One-sentence summary anchored in dimension scores below}

## Dimension scores (0–10)

| Dimension | Score | Top finding |
|---|---|---|
| GBP integration on page | {n}/10 | {one-line} |
| NAP consistency | {n}/10 | {one-line} |
| Local on-page (title/H1/contact/service pages) | {n}/10 | {one-line} |
| Local-pack rank | {n}/10 | {one-line} |
| Reviews & citations | {n}/10 | {one-line} |
| **Composite** | {n}/10 | — |

## Top fixes

### Critical
1. {Specific fix anchored in a finding above. Example: "NAP discrepancy: footer shows '(212) 555-1234' but JSON-LD shows '+1-212-555-9999'. Pick one canonical phone, fix the wrong one." Cite the page/schema source.}

### High
- {fix}

### Medium
- {fix}

### Low
- {fix}

## Local-pack rank summary
- "{keyword 1}": local pack {present/absent}, target {in pack at #n / not in pack}, organic position {n}.
- "{keyword 2}": …
- (Full data: `local-keywords.csv`)

## Reviews health (if audited)
- Google: {n} reviews, {rating} avg, last review {n} days ago, owner response rate {p}%.
- Yelp: …
- Trustpilot: …

## Citation sample
- Google Business: {detected / not detected via site:google.com "..." search}
- Yelp: …
- Facebook: …
- BBB: …
- Apple Business Connect: …
- Bing Places: …
- {vertical-specific 1}: …
- {vertical-specific 2}: …

(Caveat: this is a sample, not a comprehensive citation audit. For definitive coverage, use Whitespark / BrightLocal / Yext.)

## Schema status
- LocalBusiness JSON-LD: {present and valid / present but missing recommended properties / invalid / absent}
- Recommended next step: run `seo-schema {homepage_url}` for paste-ready LocalBusiness markup with the correct industry subtype.

## Limitations
This skill could NOT assess:
- **Geo-grid local-pack rank by lat/long.** Requires a Maps API (e.g. DataForSEO Maps geo-grid endpoint) we don't have. Workaround: pay for Local Falcon, GMB Crush, or BrightLocal Local Search Grid.
- **Comprehensive citation audit.** WebSearch sampling covers ~8 directories; full audits cover 50+. Use Whitespark, BrightLocal, or Yext.
- **GBP Insights data.** Requires GBP API access scoped to the listing owner. Ask the listing owner to export Insights and share.
- **Real-time local-pack rank tracking over time.** This skill is a snapshot. Use SE Ranking's project-level rank tracker (`PROJECT_runPositionCheck`) or pair with `seo-drift` for diff snapshots.
- **DataForSEO Business Listings.** Not in our backend; if the user needs it, they'd need to subscribe to DataForSEO directly.

local-keywords.csv の列:keyword,country,location,local_pack_present,target_in_pack,target_pack_position,target_organic_position,top_pack_competitor_1,top_pack_competitor_2,top_pack_competitor_3,aio_present

nap-inconsistencies.csv の列:source,name,address,phone,page_or_schema_path,canonical_value,divergence_note

ヒント

  • SE Ranking Data API のレート制限(1 秒あたり 10 リクエスト)を守ってください。キーワードごとの DATA_getSerpResults 呼び出しは順番に実行してください。
  • 実行前に DATA_getCreditBalance を呼び出してください。SE Ranking クレジットは通常 15~25、Firecrawl がインストールされている場合は Firecrawl クレジットが 6~12 必要です。
  • 判定の目安:
    • STRONG:複合スコアが 7/10 以上、サンプル対象のすべてのページで NAP が一貫している、過半数のキーワードで対象がローカルパックに表示される、業種に適したサブタイプを持つ有効な LocalBusiness スキーマがある、Google レビューが 10 件以上あり、投稿頻度も健全です。
    • NEEDS WORK:複合スコアが 4~6.9/10、または NAP に 1 件以上の不一致がある、または過半数のキーワードで対象がローカルパックに表示されません。この場合の成果物は「主な修正点」セクションです。ローカル SEO 監査の大半はこの判定になります。
    • WEAK:複合スコアが 4 未満、または LocalBusiness スキーマがなくページ上に NAP も表示されていない、または追跡対象のすべてのキーワードで対象がローカルパックに表示されません。複数の側面にわたる大幅な改善が必要です。
  • このスキルでは LocalBusiness スキーマを生成しないでください。必ず seo-schema に委ねてください。seo-schema には、このスキルでは再現できないリッチリザルト検証と業種別サブタイプの振り分け機能があります。
  • 検索結果からレビュー URL を生成しないでください。ユーザーが Yelp/Trustpilot/BBB の URL を指定していない場合は、レビューのスクレイピングを省略し、再実行時に URL を指定するようユーザーに伝えてください。ドメインからレビュー URL を特定するのは確実ではありません。
  • 5 か所を超える拠点がある複数拠点サイトでは、拠点ごとではなく、地域ごとに 1 ページの拠点ページを監査してください。ローカル監査のパターンは拠点ごとに繰り返されるため、サンプルで基準を確立できます。拠点ページ間の品質差が懸念される場合は、拠点ページのサンプルを対象に seo-content-audit も実施してください。
  • ChatGPT、Perplexity、AI Overviews などの AI 検索におけるローカルコンテキストは、このスキルの対象外です。AI 検索でのローカル可視性を調べるには、seo-geo(URL レベルの GEO)または seo-ai-search-share-of-voice(ドメインレベルのブランド可視性)を併用してください。
  • レビュー分析で最も実践的な単一の指標は、18 日間のレビュー投稿頻度ルール(Sterling Sky)です。最新のレビューが 21 日以上前の場合、ローカルパックの順位が今後低下する先行指標となるため、星評価にかかわらず「重大」として報告してください。
  • 業種別のサイテーションディレクトリについては、references/local-citation-sources.md を読み込んでください。このリストは、影響の大きいディレクトリ(Tier 1 および業種固有)を厳選したもので、数だけ多い小規模ディレクトリの一覧ではありません。
  • ステップ 8 でサイト全体に関わる技術的 SEO の問題が見つかった場合は、seo-technical-audit を併用してください。このスキルの対象はローカル SEO に関係する調査結果であり、監査全体ではありません。

コメント