关于 seo-local
seo-local 是面向本地企业 SEO 审核的 Skill,帮助评估网站的本地搜索可见度。它结合 Google 商家资料页面信号、NAP 一致性、本地排名、评论和目录样本,整理优先修复清单。
主要功能
- 01检查页面上的 GBP 信号
- 02核对多页面 NAP 一致性
- 03跟踪本地搜索包排名
- 04抽查评论平台信号
- 05审核本地 SEO 页面问题
适用场景
- 01审查本地商家网站的搜索表现
- 02发现地址、名称或电话信息不一致
- 03检查目标关键词的本地搜索包可见度
- 04整理本地目录与评论方面的改进项
MCP 相关
该 Skill 使用 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-localskill(MIT)。概念和维度结构沿用上游;后端已改接 SE Ranking、Firecrawl 和 Google API。上游的 DataForSEO Maps 地理网格和 Business Listings 检查已移除(后端没有对应功能)——请参阅交付成果中的“限制”。
前提条件
- 已连接 SE Ranking MCP 服务(用于本地包排名、页面审计数据和域名背景信息)。
- Claude 的
WebFetch工具可用(当 Firecrawl 不可用时,用于交叉核验)。 - 用户提供:(a) 目标域名或主页 URL;(b) 至少一个主要本地关键词(例如
"dentist Brooklyn"、"plumber near me");(c) 目标国家,最好也提供用于限定本地包范围的城市/地区。可选:GBP 商家信息 URL,以及用于抓取评价的 Yelp/Trustpilot URL。
流程
-
验证目标并执行预检。 有关规范的三阶段预检(额度余额、Firecrawl 可用性、Google API),请参阅
skills/seo-firecrawl/references/preflight.md。本技能专属说明:- 规范化目标(从域名中去掉协议;确认主页可以抓取)。确认用户至少提供了一个本地关键词;如果没有,则从主页的
<title>和<h1>中推断;如果仍有歧义,先询问用户再继续。 - 本技能的 SE Ranking 预估成本:约 15–25 个额度(1 次审计复查 + 3–5 次 SERP 查询 + 1 次域名概览)。
- Firecrawl:可选,可回退到 WebFetch;如果可用,约消耗 6–9 个 Firecrawl 额度(硬上限为 12)。可用时,步骤 4(页面 GBP 审计)、5(NAP 提取)和 7(评价抓取)会针对主页、5 个示例页面和用户提供的评价 URL 执行。没有 Firecrawl 时,这些步骤会降级为仅使用 WebFetch——架构/JSON-LD 检测以及
tel:/ 地址元素提取将尽力通过文本检查完成。传入--no-firecrawl可强制仅使用 WebFetch。 - Google API:第 1 层(GSC)可在本地包排名步骤之后启用步骤 8b(GSC 本地查询效果);第 2 层(GA4)还可启用步骤 8c(按落地页补充 GA4 自然搜索数据)。完整的数据补充规范请参阅
skills/seo-google/references/cross-skill-integration.md。
- 规范化目标(从域名中去掉协议;确认主页可以抓取)。确认用户至少提供了一个本地关键词;如果没有,则从主页的
-
检测商家类型
- 阅读主页、
/contact页面和页脚文本(使用 WebFetch Markdown 即可)。 - 归类为以下其中一种:
- 实体店 — 显示街道地址、“Visit us at”字样或嵌入式 Maps iframe。
- 服务区域商家(SAB) — 没有街道地址,出现“serving {region}”“we come to you”等表述,或架构中包含
areaServed但没有address.streetAddress。 - 混合型 — 同时具备两类信号(例如,设有展厅且提供区域服务)。
- 这决定了后续适用哪些检查。SAB 会跳过嵌入地图和实体地址一致性检查。在
LOCAL-SEO-REPORT.md的“Snapshot”中记录此项。
- 阅读主页、
-
检测行业垂直领域
- 根据 URL 模式(
/menu、/practice-areas、/listings、/inventory)、<title>和页面文本,推断属于以下哪一类:餐厅 / 医疗保健 / 法律 / 家庭服务 / 房地产 / 汽车 / 通用。 - 此项决定后续的引文来源和架构子类型建议——加载
references/local-citation-sources.md,查找该垂直领域的 Tier-1 目录。
- 根据 URL 模式(
-
页面上的 GBP 信号:使用
mcp__firecrawl-mcp__firecrawl_scrape(设置formats: ["rawHtml"])- 抓取首页和
/contact(或本地意图最强的页面)。 - 从
rawHtml中提取:- 嵌入的 Google Maps iframe(
<iframe src="https://www.google.com/maps/embed?...">)——如果存在,记录地点 ID。 - 评论组件 / GBP 丰富摘要标记。
aggregateRatingJSON-LD 区块(存在与否是网站希望在搜索结果中显示星级的最强信号)。- 页面上营业时间的可见情况(搜索时是否营业与排名相关——Whitespark 排名第 5 的因素)。
- 点击拨号:统计
<a href="tel:...">元素的数量。 - GBP 个人资料链接:任何指向
https://g.page/...、https://maps.app.goo.gl/...或https://www.google.com/maps/place/...的<a href>。
- 嵌入的 Google Maps iframe(
- 如果 Firecrawl 不可用: WebFetch Markdown 在某些呈现结果中可以检测到
tel:链接,但会丢失 iframe 和 JSON-LD。将 Maps 嵌入、aggregateRating 和 GBP 个人资料链接检测标记为(skipped — Firecrawl required)。
- 抓取首页和
-
NAP 一致性:在首页和 5 个示例页面上使用
mcp__firecrawl-mcp__firecrawl_scrape- 示例页面:首页、
/contact、/about,再加 2 个服务或地点页面(从站点地图或流量最高的页面中选择)。 - 对每个页面,提取:
- 呈现文本中可见的 NAP。 地址模式(街道 + 城市 + 地区 + 邮政编码)、电话(
tel:href + 显示格式)、商家名称(logo alt、页脚、schemaname)。 - JSON-LD 中的 NAP。 解析每个
<script type="application/ld+json">区块。提取name、address.streetAddress、address.addressLocality、address.addressRegion、address.postalCode、telephone。
- 呈现文本中可见的 NAP。 地址模式(街道 + 城市 + 地区 + 邮政编码)、电话(
- 对比 6 个页面样本及 schema。 任何差异(联系页面与首页的电话号码格式不同;某个页脚漏掉了“Suite 200”;schema 电话使用国际格式而页面显示本地格式)→ 记录到
nap-inconsistencies.csv。 - **仅限实体店:**如果存在 Maps iframe,尝试从 iframe URL 中读取嵌入地址(地点 ID 和地址经过 URL 编码)。与页面/schema NAP 对比。SAB 跳过此项。
- 如果扫描后
nap-inconsistencies.csv为空,则将其写为仅包含表头的一行文件,并在LOCAL-SEO-REPORT.md中注明“NAP 在 {n} 个页面和 schema 中保持一致”。
- 示例页面:首页、
-
本地包排名跟踪:使用带国家/地区筛选条件的
DATA_getSerpResults- 对于用户提供的每个本地关键词(或从首页推断出的 1–3 个关键词):
- 使用用户所在国家/地区以及 API 支持的最具体地区/城市调用
DATA_getSerpResults(如果用户提供了城市,先使用DATA_getSerpLocations确认有效的位置代码)。 - 记录:自然搜索结果前 10 名、本地包是否出现(是/否)、本地包中显示的 3 家商家(名称、评分、评论数)、AIO 是否出现。
- 交叉检查:目标域名是否位于自然搜索结果前 10 名?目标商家名称是否出现在本地包中?
- 使用用户所在国家/地区以及 API 支持的最具体地区/城市调用
- 将每个关键词的解析结果保存到
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%。
- 对于用户提供的每个本地关键词(或从首页推断出的 1–3 个关键词):
-
抓取评价:对用户提供的评价网址调用
mcp__firecrawl-mcp__firecrawl_scrape- 输入(用户提供,可选)。 GBP 商家信息页网址(
https://www.google.com/maps/place/...)、Yelp 商家网址、Trustpilot 商家网址、BBB 商家资料页网址。 - 针对每个提供的网址: 使用
formats: ["rawHtml"]抓取。从解析后的 DOM 中提取:评价总数、平均评分、最近一条评价的日期(作为评价速度的参考指标)、最近 10 条评价中商家回复的数量。 - 汇总信号:
- 速度:最近 18 天内新增 ≥1 条评价 = 健康(Sterling Sky 的 18 天规则)。距离最近一条评价 >21 天 = 存在“评价断层”风险。
- 数量:Google 评价少于 10 条,标记为低于神奇门槛。
- 星级评分:4.5+ 符合消费者筛选门槛(BrightLocal:31% 的消费者只考虑 4.5+ 的商家)。
- Google 上商家的回复率:最近 10 条评价的回复率 <50% = 互动不足。
- 如果用户未提供评价网址: 完全跳过第 7 步。在
LOCAL-SEO-REPORT.md中注明:“评价平台:未提供。如需审核评价状况,请使用--reviews 'gbp_url,yelp_url,trustpilot_url'重新运行。”不要尝试发现这些网址——发现评价网址是另一个问题,而且我们没有 Maps API 方案。
- 输入(用户提供,可选)。 GBP 商家信息页网址(
-
页面本地 SEO 审核:
DATA_getAuditReport(现有审核)+ 对主页调用DATA_getIssuesByUrl- 复用近期的现有网站审核(<30 天,见
seo-technical-audit)。 不要仅为本地 SEO 创建新审核——审核数据已涵盖标题标签问题、缺失的架构标记、移动设备易用性等。 - 从审核中提取与本地 SEO 特别相关的问题:
- 标题 / H1 缺少主要城市或服务关键词。
- 缺少或无效的
LocalBusinessJSON-LD。 - 移动设备易用性问题(“附近”搜索主要发生在移动设备上)。
- 架构标记验证错误(
aggregateRating损坏、address格式错误)。
- 将架构标记修复交由
seo-schema处理。 此技能不会生成 JSON-LD。如果缺少或损坏 LocalBusiness 架构标记,交付内容应注明“运行seo-schema,获取可直接粘贴且包含正确行业子类型的 LocalBusiness 标记”——这属于seo-schema的工作,在此处重新实现会造成重复。
- 复用近期的现有网站审核(<30 天,见
8b. GSC 本地查询表现 (仅当存在 google-api.json 且 tier ≥ 1 时)
- 获取目标资源最近 28 天的 GSC 搜索分析数据,维度为 query,并筛选具有本地意图的模式:
python3 scripts/gsc_query.py --property "{config.default_property}" --days 28 --json - 在客户端筛选包含
near me、包含该商家所在城市 / 地区名称,或以地名结尾的查询。按展示次数列出前 10 项。 - 如果包含城市名称的查询展示次数 >100 且平均排名 >10,则表示本地搜索结果覆盖不足——在
LOCAL-SEO-REPORT.md的“优先修复项”中标记,并附上 GSC 数据作为依据。 - 如果此账号未验证该资源:显示“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%,则说明各地点页面的质量存在差异,值得标记(表现较差的页面可能存在 doorway page 或内容单薄风险)。
- 单地点网站:在快照中将主页的自然搜索会话数记录为一行。
-
引用存在性抽样检查(尽力而为)
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)。
- 对该垂直领域列表中的每个 Tier-1 目录(加载
-
综合整理
LOCAL-SEO-REPORT.md
- 根据下方评分标准,对 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 的速率限制:每秒 10 个请求。按顺序逐一调用每个关键词的
DATA_getSerpResults。 - 运行前调用
DATA_getCreditBalance。通常需要约 15–25 个 SE Ranking 积分;安装了 Firecrawl 时,还需要 6–12 个 Firecrawl 积分。 - 结论判定规则:
- STRONG:综合评分 ≥7/10;所有抽样页面上的 NAP 信息一致;目标商家在多数关键词的本地包中;具有有效的 LocalBusiness Schema,且子类型符合行业;Google 评价不少于 10 条,且增长势头良好。
- NEEDS WORK:综合评分为 4–6.9/10,或至少有 1 处 NAP 信息不一致,或目标商家未进入多数关键词的本地包。此处的交付内容是“优先修复项”部分——大多数本地 SEO 审核都属于这一类。
- WEAK:综合评分 <4/10,或没有 LocalBusiness Schema 且页面上看不到 NAP 信息,或目标商家未出现在任何已跟踪关键词的本地包中。需要在多个方面进行大量改进。
- 不要在此技能中生成 LocalBusiness Schema。务必交由
seo-schema处理——它具备此技能不涵盖的富媒体搜索结果验证和行业子类型路由功能。 - 不要根据搜索结果生成评价 URL。如果用户未提供 Yelp/Trustpilot/BBB URL,请跳过评价抓取,并告知用户重新运行时提供 URL。根据域名查找评价 URL 不可靠。
- 对于拥有超过 5 个地点的多地点网站,每个地区审核一个地点页面,而不是逐个地点审核——本地审核模式会在各地点间重复,因此抽样即可建立基准。如果怀疑地点页面质量存在差异,请将此项与对一组地点页面样本运行的
seo-content-audit配合使用。 - AI 搜索中的本地上下文(ChatGPT、Perplexity、AI Overviews)不属于此技能的工作范围——请搭配
seo-geo(URL 级 GEO)或seo-ai-search-share-of-voice(域名级品牌可见度),评估 AI 搜索中的本地可见度。 - 18 天评价增长速度规则(Sterling Sky)是评价平台分析中最具可操作性的单一指标。如果最近一条评价距今超过 21 天,这是本地包排名即将下降的先行指标——无论星级评分如何,都应标记为“严重”。
- 各垂直领域的引文目录:加载
references/local-citation-sources.md。此列表精选了真正能带来效果的目录(Tier 1 + 垂直领域专属),而非长尾目录。 - 如果第 8 步发现全站技术 SEO 问题,请搭配
seo-technical-audit;此技能仅针对与本地相关的发现,而非完整审核。