mcpField
S
seo-local

seo-local

github.com/seranking营销与增长19179 次安装18 周前更新
代码仓库

关于 seo-local

seo-local 是面向本地企业 SEO 审核的 Skill,帮助评估网站的本地搜索可见度。它结合 Google 商家资料页面信号、NAP 一致性、本地排名、评论和目录样本,整理优先修复清单。

主要功能

  1. 01检查页面上的 GBP 信号
  2. 02核对多页面 NAP 一致性
  3. 03跟踪本地搜索包排名
  4. 04抽查评论平台信号
  5. 05审核本地 SEO 页面问题

适用场景

  1. 01审查本地商家网站的搜索表现
  2. 02发现地址、名称或电话信息不一致
  3. 03检查目标关键词的本地搜索包可见度
  4. 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-local skill(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。

流程

  1. 验证目标并执行预检。 有关规范的三阶段预检(额度余额、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。
  2. 检测商家类型

    • 阅读主页、/contact 页面和页脚文本(使用 WebFetch Markdown 即可)。
    • 归类为以下其中一种:
      • 实体店 — 显示街道地址、“Visit us at”字样或嵌入式 Maps iframe。
      • 服务区域商家(SAB) — 没有街道地址,出现“serving {region}”“we come to you”等表述,或架构中包含 areaServed 但没有 address.streetAddress。
      • 混合型 — 同时具备两类信号(例如,设有展厅且提供区域服务)。
    • 这决定了后续适用哪些检查。SAB 会跳过嵌入地图和实体地址一致性检查。在 LOCAL-SEO-REPORT.md 的“Snapshot”中记录此项。
  3. 检测行业垂直领域

    • 根据 URL 模式(/menu、/practice-areas、/listings、/inventory)、<title> 和页面文本,推断属于以下哪一类:餐厅 / 医疗保健 / 法律 / 家庭服务 / 房地产 / 汽车 / 通用。
    • 此项决定后续的引文来源和架构子类型建议——加载 references/local-citation-sources.md,查找该垂直领域的 Tier-1 目录。
  4. 页面上的 GBP 信号:使用 mcp__firecrawl-mcp__firecrawl_scrape(设置 formats: ["rawHtml"])

    • 抓取首页和 /contact(或本地意图最强的页面)。
    • 从 rawHtml 中提取:
      • 嵌入的 Google Maps iframe(<iframe src="https://www.google.com/maps/embed?...">)——如果存在,记录地点 ID。
      • 评论组件 / GBP 丰富摘要标记。
      • aggregateRating JSON-LD 区块(存在与否是网站希望在搜索结果中显示星级的最强信号)。
      • 页面上营业时间的可见情况(搜索时是否营业与排名相关——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 + 显示格式)、商家名称(logo alt、页脚、schema name)。
      • JSON-LD 中的 NAP。 解析每个 <script type="application/ld+json"> 区块。提取 name、address.streetAddress、address.addressLocality、address.addressRegion、address.postalCode、telephone。
    • 对比 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 中保持一致”。
  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. 抓取评价:对用户提供的评价网址调用 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 方案。
  8. 页面本地 SEO 审核:DATA_getAuditReport(现有审核)+ 对主页调用 DATA_getIssuesByUrl

    • 复用近期的现有网站审核(<30 天,见 seo-technical-audit)。 不要仅为本地 SEO 创建新审核——审核数据已涵盖标题标签问题、缺失的架构标记、移动设备易用性等。
    • 从审核中提取与本地 SEO 特别相关的问题:
      • 标题 / H1 缺少主要城市或服务关键词。
      • 缺少或无效的 LocalBusiness JSON-LD。
      • 移动设备易用性问题(“附近”搜索主要发生在移动设备上)。
      • 架构标记验证错误(aggregateRating 损坏、address 格式错误)。
    • 将架构标记修复交由 seo-schema 处理。 此技能不会生成 JSON-LD。如果缺少或损坏 LocalBusiness 架构标记,交付内容应注明“运行 seo-schema,获取可直接粘贴且包含正确行业子类型的 LocalBusiness 标记”——这属于 seo-schema 的工作,在此处重新实现会造成重复。

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 或内容单薄风险)。
  • 单地点网站:在快照中将主页的自然搜索会话数记录为一行。
  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

  • 根据下方评分标准,对 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;此技能仅针对与本地相关的发现,而非完整审核。

评论

支持 Markdown