mcpField
S
seo-indexability

seo-indexability

github.com/hainrixz营销与增长79203 次安装4 天前更新
代码仓库

关于 seo-indexability

seo-indexability 是用于诊断抓取、索引、规范化和站点健康问题的 SEO 审计技能。它结合页面快照、爬取与响应数据,并谨慎处理环境差异及用户代理内容差异等不确定信号。

主要功能

  1. 01Canonical 与 robots 指令检查
  2. 02重复页面与分页审查
  3. 03重定向、链接及混合内容检查
  4. 04孤立页面与点击深度分析
  5. 05用户代理内容比较
  6. 06预览环境识别

适用场景

  1. 01查找意外阻止索引的页面
  2. 02追踪失效链接和重定向链
  3. 03审查 canonical 与重复 URL 行为
  4. 04比较浏览器与 Googlebot 响应

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hainrixz/claude-seo-ai --skill seo-indexability

安装后在 Claude Code 中输入/seo-indexability确认已加载。

详细介绍

SEO 可索引性(M2)

如果页面无法被正确抓取、索引或规范化,那么其他所有信号都将毫无用处——这是搜索评分的基础。Schema 侧的上下文:references/schema-tier1.md。AI 机器人访问权限和摘要资格由 M14(seo-ai-crawlers)负责;本模块负责经典搜索侧,包括搜索轴上的伪装检查。

输入

根据调度信封中指定的 PageSnapshot 开展工作:从 <run_dir>/pages/<slug>.json 读取 parsed(canonicals[]、robots_meta[]),以及 status_chain、headers、robots_directives.effective 和 <run_dir>/crawl.json 中的抓取图,以检查孤立页面、深度、重复内容簇和内部链接状态;<run_dir>/profile.json 包含 environment.kind(production|preview|staging|local);如果本次运行包含用户代理差异,<run_dir>/ua-diff.json 会保存各用户代理的响应字段。使用 grep 搜索 pages/<slug>.html,查找原文证据;站点产物位于 <run_dir>/site/{robots.json,sitemaps.json,discovery.json}。audit.mjs 已生成的确定性发现列在 <run_dir>/findings.deterministic.json 中——不要重复输出这些 ID;仅添加由模型判断的发现。如果直接使用 URL/路径调用且没有快照,先运行 node "${CLAUDE_PLUGIN_ROOT}/scripts/snapshot.mjs" <target> --out "${CLAUDE_PLUGIN_DATA}/runs",并使用打印出的快照路径。

审计

结合 PageSnapshot(当 render.used 不为 none 时使用 parsed_rendered,否则使用 parsed)、headers、status_chain 和 robots_directives 进行检查:

  1. Canonical:必须恰好有一个 <link rel="canonical">;必须是绝对 HTTPS URL;判断它是自引用、跨域,还是链式(canonical 指向的 URL 本身又 canonical 到其他位置)。如果 canonical 最终解析到重定向或 4xx 状态码,则标记出来。
  2. Canonical + noindex——正确解读。 noindex 与自引用 canonical 同时出现,并非致命组合:这是逻辑一致且通常有意设置的排除方式(例如感谢页面、筛选视图、暂存环境)。将其报告为 M2.robots.noindex_present,并在更改前征求确认。只有当 canonical 指向其他位置时,这一组合才是致命的:页面一边告诉 Google“改为索引另一个 URL”,一边又说“不要索引我”,这种矛盾可能会将 noindex 传递到 canonical 目标;这属于 M2.canonical.noindex_conflict。
  3. Robots 指令:检查 <meta name="robots"> 和 X-Robots-Tag 标头中的 noindex/nofollow/none;协调标头与 meta 的指令(以限制最严格者为准;标头指令也适用于非 HTML 响应)。记录作用范围——由模板或边缘规则发出的指令属于 template/site,写入单个文档的指令属于 page。
  4. 重复内容簇:检查不同 URL 是否存在标题/H1/正文近乎相同且没有统一 canonical 的情况。
  5. 分页:检查分页系列的信号(每一页都应使用自引用 canonical;不要将第 2 页及之后的页面 canonical 到第 1 页,否则深层条目会从索引中移除)。
  6. 站点健康状况(涵盖 M3):检查重定向链(超过 1 跳)和循环、返回 4xx/5xx 的内部链接、软 404(空页面或“未找到”页面返回 200 状态码)、混合内容(HTTPS 页面加载 HTTP 子资源)、HTTP 到 HTTPS 强制跳转、孤立页面(抓取范围内没有内部入链),以及从首页到页面的点击深度。
  7. 用户代理内容差异(伪装,搜索轴):根据 ua-diff.json,比较源站对默认浏览器 UA 和 googlebot 提供的内容——状态码、标题、H1、字数、canonical、robots 指令、JSON-LD。实质性差异是搜索轴上的伪装信号(M2.cloaking.ua_content_divergence)。同一差异中 AI 机器人一侧的情况(受到质询的 GPTBot、被拒绝的伪造 Googlebot)属于 M14。
  8. 环境:读取 profile.json.environment.kind。在 preview/staging/local 环境中,设置 noindex 或全面封锁 robots 是预期配置,并非缺陷——记录 M2.hosting.preview_environment_audited,以便报告注明审计的主机。

修复

  • 自动修复(fixable: auto):缺少时,注入单个自引用绝对 HTTPS <link rel="canonical">。对于 fix,此操作是确定性的、仅添加内容,并且差异可验证。
  • 建议修复(fixable: proposed):移除用户已确认为意外设置的 noindex;合并重复内容簇(应由哪个 URL 胜出属于编辑决策);修改指向失效页面的内部链接,或将其移除。
  • 建议处理(fixable: advisory):重定向链/循环、状态码、HTTP 到 HTTPS 强制跳转、混合内容来源,以及任何导致 UA 差异的边缘规则——这些设置位于服务器/CDN 配置中,因此工具只会报告具体更改建议,不会写入任何内容。
  • 绝不臆测哪个 URL“应该”胜出、某个页面是否有意设置为 noindex,或 UA 条件响应背后的意图——应询问用户,或留下明确标注的 TODO 占位符。

验证

  • dom_assert:解析 DOM,检查 canonical/robots 是否存在及其值。
  • header_check:读取 X-Robots-Tag 并跟踪重定向链(每一跳的状态码和 Location,并检测循环)。
  • link_graph:从 <run_dir>/crawl.json 检查内部链接状态、孤立页面和点击深度。
  • ua_diff:node "${CLAUDE_PLUGIN_ROOT}/scripts/ua-diff.mjs" --url <final_url> --ua default,googlebot — 并排显示两种响应。
  • 如果所需数据层不可用(无法实时抓取、没有用于检查孤立页面和深度的爬取图谱、没有 UA 差异),状态为 needs_api,绝不可误报为 pass。

发现项

发现项遵循 schema/finding.schema.json;轴为 search。每项都包含引用页面/标头原文的 evidence.observed,以及可运行的 verification.reproduce。严重性策略:5 仅用于站点/模板级别上灾难性、会导致失去资格的事实;4 重大 · 3 中等 · 2 轻微 · 1 外观问题 · 0 信息性 — 只有处于启用类别中的 established 严重性为 5 的 fail 才能限制评分(references/scoring-model.md)。

  • M2.canonical.missing — 可编入索引的页面没有 <link rel="canonical">(warn;存在重复页面时为 fail;严重性 4,fixable: auto,established)。
  • M2.canonical.noindex_conflict — 某 URL 的 canonical 指向不同 URL,但该 URL 带有 noindex(fail,严重性 4,fixable: proposed,established)。
  • M2.robots.noindex_present — 带有自引用 canonical(或没有 canonical)的页面设置了 noindex:这是合理的排除设置,报告但不判定为问题(warn,严重性 3,fixable: proposed,established)。
  • M2.robots.unintended_noindex — 用户确认该 URL 应编入索引后,仍存在相同指令(fail;站点/模板级别严重性为 5,单个页面为 4;fixable: proposed,established)。
  • M2.redirect.chain — 内部链接在返回 200 之前经过多于一跳的重定向(warn,严重性 4,fixable: advisory,established)。
  • M2.redirect.loop — 重定向链无法解析;该 URL 无法访问(模板或全站规则导致时严重性为 5,单个 URL 为 4;fail,fixable: advisory,established)。
  • M2.links.broken_internal — 返回 4xx/5xx 的内部链接,并注明来源页面和锚文本(warn,严重性 3,fixable: proposed,established)。
  • M2.mixed_content — HTTPS 页面包含 HTTP 子资源;浏览器会阻止主动混合内容(warn,严重性 3,fixable: proposed,established)。
  • M2.https.not_enforced — HTTP URL 未重定向到 HTTPS(fail,严重性 4,fixable: advisory,established)。
  • M2.cloaking.ua_content_divergence — 源站向 googlebot 提供的内容与向默认浏览器 UA 提供的内容存在实质差异(warn,严重性 4,fixable: advisory,置信度为 directional)。
  • M2.hosting.preview_environment_audited — 经审计的主机属于预览/暂存/本地环境(warn,严重性 1,fixable: advisory,established)。

依平台启用的 id。 仅当 profile.json 指定平台(shopify、wordpress)时,此模块也会发出 6 个 id。这些 id 列于 references/routing.md § 依平台启用的发现项 id,并在 references/platforms/<id>.md §10 中说明。

诚实性

  • 规范链接是一个提示,而非指令——Google 可能会选择不同的规范链接;应将其报告为强整合信号,而非保证。
  • 自身规范链接 + noindex 并非错误。 将每个 noindex 页面都报告为致命矛盾,是一种广为人知的误报;此模块仅在规范链接指向其他位置时,才会将两者组合判定为致命问题,而且绝不会在未获用户确认的情况下移除 noindex。
  • 伪装是一种推断,而非测量结果。 我们会发送 Googlebot 用户代理字符串,但我们并未通过验证,不能确认自己就是 Googlebot。地理位置/A-B 路由、个性化、同意提示墙和机器人防护规则都可能造成差异,而这并不意味着有人有意欺骗。将其称为伪装之前,请通过反向 DNS、服务器日志或 Search Console 的 URL 检查进行确认——此发现属于方向性判断。
  • 对于预览/暂存/本地主机,noindex 和 robots 屏蔽都是正确的配置。若评分器使用 --environment preview|staging|local 参数,则会将这些严重性为 5 的上限移入 suppressed_caps[],而不会将搜索分数限制为 F;请说明审计的是哪种环境,而不要报告并不存在的紧急问题。
  • Google 已不再使用 rel=next/prev 进行分页;不要建议将其作为排名策略添加——应让每个页面保留指向自身的规范链接。
  • 点击深度和孤立状态与抓取优先级相关,但并非有文档说明的排名因素——应标记为方向性判断,绝不能将其视为已确认的分数上限。孤立证据必须说明生成该证据的抓取边界。

评论

支持 Markdown