local-seo について
OpenSEO Local SEOは、実店舗やサービスエリアを持つ事業者向けに、Google Mapsやローカル検索での表示状況を調べるスキルです。店舗情報、口コミ、順位グリッドを比較し、優先して直す点を整理します。
主な機能
- 01地域の事業者と競合の特定
- 02カテゴリ、口コミ、情報の充実度を比較
- 03複数地点の地図順位を確認
- 04優先する改善項目の整理
活用シーン
- 01店舗周辺の検索順位の差を把握
- 02地域の競合情報や口コミを比較
- 03チェーン各店舗の地域での表示を評価
MCP 対応
OpenSEO MCPツールで近隣事業者、Maps検索結果、事業者プロフィールや口コミ、地域順位グリッドを調べます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ every-app/ open-seo --skill local-seoインストール後、Claude Code で/local-seoを入力して読み込まれたか確認します。
詳細
OpenSEO ローカル SEO
目標
ビジネスが顧客の近くで Google マップやローカルパックに表示される理由、または表示されない理由を明らかにし、最初に修正すべき点を特定します。
順位が実店舗の所在地やサービス提供地域に左右される場合に使用します。全国規模のオーガニック検索対策には、competitor-analysis または keyword-research を使用してください。
必要な入力
projectId- ビジネス:名前、または
cid/placeId(最も信頼性が高い方法) - 座標(緯度/経度)—
search_local_businesses/get_local_serp_resultsの行から導き出します。導出が曖昧な場合に限り、ユーザーに確認してください - 顧客が実際に検索するキーワードを1~3個(例:「緊急 配管工」。ブランド名ではありません)
プロジェクトのコンテキスト
プロジェクトコンテキスト用ツールは無料で、アプリやほかのエージェントと共有されています。
- まず
get_project_contextを呼び出し、その内容を調査の土台にしてください。ビジネスの内容と営業地域によって、重要なキーワードと半径が決まります。 - このスキルには
business_overviewが必要です。空の場合は、最小限のインライン設定を行います。サイトからビジネスの内容と所在地を推測し、ユーザーに1つの質問で確認してから、update_project_contextで書き戻し、その後に続行してください。最初に詳細なヒアリングを行わないでください。残りの設定には最後にseo-project-setupを提案してください。 - クレジットを使う前に、調査ログを確認してください。同じ調査が過去30日以内に実行されている場合は、再度購入するのではなく、その結果を再利用し、その旨を伝えてください。
- 完了時には、長期的に有用な情報を
update_project_contextで書き戻してください。ウェブサイトがあるローカル競合他社はaddCompetitorsで追加します(競合他社の行はドメインをキーにするため、ドメインのない掲載情報はスキップしてください)。修正したbusiness_overviewも書き戻し、次の調査ログエントリを追記してください:{ appendResearchLog: { summary: "Local SEO: <business> near <area>. Verdict: <conclusion>" } }。
レポートとして提出
seo-report スキルを使って提出し、skill: "local-seo" を指定して保存してください。このスキルが利用できない場合は、その旨を伝え、HTML の作成に進まずに終了してください。
OpenSEO MCP ツール
search_local_businesses:近隣の掲載情報。minRating、minReviews、isClaimedで絞り込めます。見込み客の調査では、未申請の掲載情報を見つけるためにisClaimed: falseを使用します。ブランド名をqueryに指定して広い半径で1回呼び出すと、チェーンの各店舗について、カテゴリー、評価、レビュー数、申請状況、座標、cidが返されます。通常、店舗ごとにget_business_profileを呼び出す必要はありません。get_local_serp_results:座標周辺のマップ/ローカル検索結果。各行にはcidとplace_idが含まれます。一度取得し、以下のすべての処理で再利用してください。get_business_profile:search_local_businessesの行だけでは情報が足りない場合に使用する、ビジネス1件分の完全なプロフィール(営業時間、評価の内訳)。get_business_reviews:評価、本文、オーナーが返信したかどうかを含むレビュー。キュー処理の場合、processing応答にtaskIdが返されます。30~60秒後にその ID を指定して再度呼び出してください。追加費用はかかりません。get_local_rank_grid:座標周辺のグリッドの各地点における順位と、各地点の検索結果数および1位のビジネス。3x3 は9回の検索です。サービス提供地域が本当に広い場合に限り、5x5 にしてください。get_google_business_questions:プロフィールのQ&A(cid/placeIdを指定できます)。get_business_updates:プロフィールに公開された投稿とその日付。list_business_categories:search_local_businessesで有効なカテゴリーのスラッグ。
ワークフロー
- ビジネスを特定します。名前またはウェブサイトのみが与えられた場合は、
search_local_businesses(queryに名前を指定し、広い検索半径を設定)で掲載情報を特定し、cidと座標を取得します。複数の場所が返された場合、そのビジネスはチェーンです。下記の複数店舗向けの手順を参照してください。 - ビジネスの座標付近でメインキーワードを指定して
get_local_serp_resultsを実行します。上位3~5社の競合のcid/place_idと、ユーザー自身の行を記録します。 - ユーザーの掲載情報を上位2社の競合と比較します。主カテゴリ、追加カテゴリ、レビュー数、営業時間の充実度、写真の数、オーナー確認済みかどうかを確認します。通常、
search_local_businessesの行にはこれらの情報がすべて含まれています。不足している情報はget_business_profileで取得します。 - 各掲載情報のウェブサイトリンク(行内の
url/contact_url)を確認します。その店舗のプロジェクトドメイン内のページに直接リンクしている必要があり、ホームページや古いドメインへのリンクではいけません。ページ上のより広範な調査は、run_site_auditに引き継ぎます。 - ユーザーと最有力の競合について
get_business_reviewsを呼び出します。レビュー数、最近のレビュー、平均評価、オーナーが返信したレビューの数を確認します。 - メインキーワードで
get_local_rank_gridを実行し、ユーザーが提示した追加キーワードごとにも実行します(同じグリッド、同じ中心点を使用し、最初に費用を伝えます)。グリッドを使って「店舗付近でのみ順位が高い」場合と「サービス提供エリア全域で順位が高い」場合を区別し、各地点のtopResultから、対象のビジネスが勝っていない場所でどのビジネスが勝っているかを示します。 - プロフィールの基本情報がすでに競争力を持ち、設定ではなくエンゲージメントに差がある場合は、
get_google_business_questionsとget_business_updatesを追加します。 - 根拠を優先順位付きのリストにまとめます。カテゴリとオーナー確認の問題は、常に投稿頻度より優先されます。
複数店舗を持つビジネス
チェーン全体のプロフィールスナップショット表を必ず作成します。search_local_businessesを1回呼び出すだけで取得できます。店舗ごとの詳細調査(レビュー、グリッド、投稿、Q&A)では、店舗数に応じて費用が増えます。
- 5店舗以下:すべての店舗を詳細に調査します。
- 5店舗超:スナップショット表を提示してから、どの1~3店舗を詳細に調査するか、ユーザーに尋ねます(AskUserQuestion)。おすすめの候補として、最も密集した市場にある最も弱いプロフィールなど、妥当なデフォルトを選びます。
出力形式
h1:ビジネス名。
レポートテンプレートが適用される場合(seo-reportを参照)、そのセクションとトーンをこのリストの代わりに使用します。
セクションの順序:
- スナップショット — 冒頭に1~2文を記載し、その後にカテゴリ、評価、レビュー数、オーナー確認済みかどうかを示す表を続けます。チェーンの場合は、店舗ごとに1行を設けます。
- 最優先の改善点 — 調査結果を1つ提示します。カテゴリとオーナー確認の問題は、常に投稿頻度より優先されます。
- 競合との直接比較 — 指標、このビジネス、最良の競合、差を列にした表を作成します。カテゴリ、レビュー(件数、最近のレビュー、オーナーからの返信)、営業時間とプロフィールの充実度、掲載情報のウェブサイトリンクを取り上げます。
- マップのカバー範囲 — 下記の「グリッドの描画」に従ってグリッドを描画し、4つの統計ブロックを示してから、そこから分かることを説明します。表示順位がどこで低下するか、どの方向で低下するか、その場所でどのビジネスが優勢かを示します。
- Q&Aと投稿 — 基本情報がすでに競争力を持つ場合に限ります。
- 次のアクション — 順序付きリストにします。
- このレポートの作成方法 —
seo-reportのスキルリンク行から始め、https://openseo.so/docs/skills/local-seo(「OpenSEO Local SEO skill」)を指すようにします。次に、どのツールが何を返したかを記載し、グリッドの順位が取得できなかった場合は、その地点のresultsCountを基準に読み取り、表示されていないと解釈しない旨を注記します。
グリッドの描画
ローカル順位トラッカー(SE Ranking、Local Falcon、BrightLocal)は、どれも同じ図を描画します。グリッド状に並んだ番号付きの円を順位に応じて色分けし、店舗の位置を示します。これらのツールを知っている読者に見慣れた図になるよう、同じ図を再現してください。この図には2つの役割があります。グリッドのデータをもとに、閲覧者がライブのGoogleマップを描画することと、同じグリッドをインラインSVGで描画し、印刷物やエクスポートしたPDF、地図を読み込めない場所でも読者が見られるようにすることです。
ポイントごとの値。 キーワードが1つの場合は、その順位です。複数のキーワードの場合は、そのキーワード群の平均順位を小数第1位まで表示します(3.5)。これは、SE Rankingが複数のキーワードを1つのマップにまとめる方法と同じです。ある地点を検索したキーワードでビジネスが見つからなかった場合(rank が null で、error がない場合)、その地点の平均では21として数えます。そのため、順位1と未検出の平均は11.0です。20を超える値は「20+」と表示します。これは、その地点でどのキーワードでもビジネスが見つからなかった場合に限られます。ある地点でキーワードの検索に失敗した場合(error: true)、その地点の順位はありません。その地点の値にも、以下のすべての統計にも含めないでください。
カラースケール。 固定とし、レポートごとに変更しないでください。
| 値 | 塗りつぶし | 数字 |
|---|---|---|
| 1–3 | #3F9D4E | 白 |
| 3超–5 | #8BC34A | 白 |
| 5超–7 | #F2C94C | #2A1E05 |
| 7超–10 | #F28C28 | 白 |
| 10超–15 | #E23B3B | 白 |
| 15超–20 | #A31515 | 白 |
| 未検出 | #A3ADB8 | 白 |
SVG。 北を上、西を左にして、グリッド上の各地点に円を1つずつ配置します。間隔は120単位、半径は22です。そのため、3x3では viewBox="0 0 360 400"、5x5では viewBox="0 0 600 640" を使用します。3x3では width を360に、5x5では480に設定し、図がカラムいっぱいに引き伸ばされないようにしてください。テンプレートではすでに、スマートフォンで幅が100%を超えないよう制限されています。各円の内側に値を表示します(太字、15px、中央揃え。text-anchor="middle" と dominant-baseline="central" を使用)。店舗の円には、同じ円をもう1つ重ねて二重リングを付けます。fill="none"、濃色の線、幅2px、半径27にします。最上段の上に「N」ラベルを追加し、最下段の下に間隔(「地点間は2 km」)を追加します。さらに、読み上げ順にすべての値をテキストで記した figcaption を追加してください。グラフには、テキストでも記載されていない数値を含めてはいけません。エージェントが繰り返せるよう、3x3の最上段を示します。
<svg viewBox="0 0 360 400" width="360" role="img" aria-label="Rank grid, 3 by 3, 2 km spacing">
<text x="180" y="18" text-anchor="middle" font-size="12" fill="#8f8f8f">N</text>
<circle cx="60" cy="80" r="22" fill="#3F9D4E"/><text x="60" y="80" text-anchor="middle" dominant-baseline="central" font-size="15" font-weight="700" fill="#fff">3.0</text>
<circle cx="180" cy="80" r="22" fill="#8BC34A"/><text x="180" y="80" text-anchor="middle" dominant-baseline="central" font-size="15" font-weight="700" fill="#fff">3.5</text>
<circle cx="300" cy="80" r="22" fill="#8BC34A"/><text x="300" y="80" text-anchor="middle" dominant-baseline="central" font-size="15" font-weight="700" fill="#fff">3.5</text>
<circle cx="180" cy="200" r="27" fill="none" stroke="#0a0a0a" stroke-width="2"/>
<text x="180" y="372" text-anchor="middle" font-size="12" fill="#8f8f8f">2 km between points</text>
</svg>
figcaption には読み上げ順にすべての値を記載します。「2つのキーワードの平均順位。NW 3.0、N 3.5、NE 3.5、W 3.0、店舗 1.5、E 3.5、SW 4.5、S 4.5、SE 3.5。」
4つの統計ブロックを図の横または下に配置します。それぞれ見出しと数値または短いリストを含めます。
- 平均順位:地点ごとの値の平均を小数第2位まで表示します。
- 順位分布:地点ごとの値のうち、3位以内、3位超から10位まで、10位超から20位まで、20+がそれぞれいくつあるかを
.barsグラフで示します。 - キーワード別の平均順位:キーワードごとに1行設け、平均順位と地点のうちトップ3に入った数を表示します。
- 最も頻繁に1位になるのは誰か:すべてのキーワードについて、各地点の
topResultを集計し、ビジネスごとの割合を一覧にします。
読み解き方。 方角と距離に沿って、どこから視認性が落ちるかを説明します(ユーザーから目印が示されている場合は「2 km南、75th St付近」のように記載します。そうでない場合は方角だけで示します)。その地点で優位なビジネスを topResult から挙げてください。競合の店舗座標がその位置関係を裏付ける場合は、競合との距離が視認性の低下の主な理由であることも説明してください。
図。 描画は必ずウィジェットのfigureで囲みます。閲覧者はこれをグリッドに合わせたライブのGoogleマップとして表示し、キーワードフィルターと各地点のポップアップを使えます。地図の表示中はSVGが非表示になります。
<figure data-widget="rank-grid">
<script type="application/json">{"spacingKm":1,"keywords":[{"keyword":"italian restaurant","points":[{"row":0,"col":0,"lat":41.7918,"lng":-88.1714,"rank":3,"top":"La Sorella di Francesca"}]}]}</script>
<svg …the drawing above…</svg>
<figcaption>…</figcaption>
</figure>
ツールが返した各地点を points に含めます。各地点には row と col、latitude を lat、longitude を lng として記載し、rank(その地点でビジネスが見つからなかった場合は null)、および topResult.title を top として記載します。検索に失敗した地点(error: true)は除外してください。閲覧者はそのキーワードがその地点で「検索失敗」と表示します。実行したグリッドごとに keywords に1件ずつ記載し、すべて同じ中心座標と間隔にします。このブロックはデータです。コメント、末尾のカンマ、計算で求める値を含めないでください。
ガードレール
- 事前に費用をユーザーに伝えずに、5x5 グリッドや複数のキーワードを対象としたグリッドを実行しないでください。各ポイントで有料の SERP 呼び出しが発生します。
cidまたはplace_idがある場合は、それを使ってビジネスを照合してください。名前での照合では、チェーン店や名前の似たビジネスが重複してヒットします。- あるグリッドポイントで順位が見つからない場合、そのビジネスがその地点で返された結果に含まれていなかったことを意味します。その地点の
resultsCountと合わせて確認してください。結果が十分に返されていれば順位で上回られたということですが、ほとんど返されていなければ SERP の結果が少ないだけであり、表示されていない証拠にはなりません。 - 全国規模のオーガニック検索指標から、ローカルパックでの強さを推測しないでください。
- レビューの選別、偽レビュー、キーワードを詰め込んだビジネス名を推奨しないでください。
- 間違った場所を中心にしたグリッドは、グリッドがないよりも悪い結果になります。グリッドのクレジットを消費する前に、座標が店舗の位置と一致していることを確認してください。