mcpField
S
seo-roast

seo-roast

github.com/illyism营销与增长1.2k170 次安装3 天前更新
代码仓库

关于 seo-roast

seo-roast 是面向处理网站 SEO 的团队的审查技能,按对收入的影响排序问题,并要求优先在代码中修复爬取、索引和转化障碍。

主要功能

  1. 01按致命、收入、增长和次要问题分级
  2. 02检查 robots.txt、站点地图与路由
  3. 03审查动态页面和本地化结构
  4. 04检查页面首屏与转化路径
  5. 05评估 AI 搜索可见性与定价
  6. 06核对重要页面索引及内链

适用场景

  1. 01排查搜索引擎无法抓取的营收页面
  2. 02修复薄弱的程序化 SEO 页面
  3. 03让价格与产品信息可被 AI 爬虫读取

安装

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

$npx skills add https://github.com/illyism/seo-skills --skill seo-roast

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

详细介绍

SEO 辣评:以收入为先的拆解,最终合并 PR

大多数审计都会交付一份 50 页的 PDF,列出 400 条警告:缺少替代文本、元描述超出 4 个字符、H3 出现在 H2 之前。网站持续亏损,是因为真正关键的 3 个问题藏在第 31 页。辣评则反其道而行:找出阻碍收入的问题,直言不讳地指出来,在代码中修复,并按影响收入的程度排列其余事项。

调用时: 先用一句话给出结论(“你的 robots.txt 让除了 Google 以外的所有搜索引擎都看不到你”),然后执行流程。绝不要以百分制评分开场。

核心规则:致命问题优先,绝不关注琐事(直到致命问题解决)

issue found
├── FATAL: blocks crawling, indexing, or rendering of a revenue page
│   └── Fix in this PR. Nothing else ships until this tier is empty.
├── REVENUE: page indexes but cannot rank or cannot convert
│   └── Fix in this PR if it takes under 1 hour of code, else top of roadmap.
├── COMPOUNDING: authority, links, AI visibility
│   └── Roadmap with owner and first action.
└── FLUFF: alt text, meta length, heading order, minor schema warnings
    └── One line at the bottom of the roadmap. Do not fix while FATAL or REVENUE rows remain.

原因:Bing 无法抓取的页面,即使加上替代文本也毫无用处;先修琐事的团队会觉得自己很有成效,但阻碍因素却会继续存在整整一个季度。

信息收集(2 分钟)

  1. 域名、1-3 个营收页面,以及主要转化目标(注册、演示、购买)。
  2. 仓库访问权限:从 package.json 检测框架,查找 robots.txt/robots.ts、站点地图、中间件、动态路由(app/**/[slug]、pages/**/[slug])。
  3. 如有:GSC 热门页面、Ahrefs 或 DataForSEO 访问权限(参见 ahrefs-research 和 dataforseo-serp)。

6 点辣评决策流程

按顺序执行。每一点都包含检查项、通过/失败阈值,以及要交付的修复。

1. 自有爬取与 SafeSearch 屏蔽问题

1a. 默认拒绝的 robots.txt

curl -s https://deployfast.dev/robots.txt

失败模式:

User-agent: *
Disallow: /

User-agent: Googlebot
Allow: /

这会屏蔽 Bingbot、DuckDuckBot、Brave、Yandex、Naver 和所有 AI 搜索爬虫。为什么这很致命:Bing 的索引会被 ChatGPT 搜索、Copilot 和 DuckDuckGo 使用,因此这一个文件就会让网站从大多数 AI 回答中消失。

已发布的修复: 默认允许,只屏蔽私有路径。

User-agent: *
Allow: /
Disallow: /api/
Disallow: /app/
Disallow: /admin/

Sitemap: https://deployfast.dev/sitemap.xml

绝不要禁止访问 /_next/、/static/ 或 CSS/JS 路径。原因:Google 会使用这些文件渲染页面,屏蔽它们会导致页面布局无法正常显示。若要屏蔽 AI 训练爬虫,同时保留 AI 搜索,请使用 block-ai-scrapers 技能,而不是一概拒绝。

只禁止访问此仓库中确实存在的私有路径(/api/ 是,/app/ 仅当仪表板位于该路径时才是)。如果 curl -s https://deployfast.dev/sitemap.xml 未返回 XML,请在同一个 PR 中提交站点地图(Next.js 中为 app/sitemap.ts)。原因:指向 404 或 HTML 页面的一行 Sitemap: 会让修复白费。

1b. 语言区域泛滥

统计站点地图中的语言区域前缀(/de、/fr、/ru、/es,……)。没有站点地图时,请改为查看路由树(app/[locale]、i18n 配置、中间件中的语言区域列表)。

locale trees
├── >= 8 locales, or any locale with English strings left in templates, or hreflang not reciprocal
│   └── FAIL. Keep a locale only if it earns >= 5% of the default locale's clicks or revenue
│       AND you translate every string on it in this PR (max 3 kept).
│       Others: noindex + remove from sitemap, or 301 to the English page.
│       No locale qualifies → keep the default locale only, ship no hreflang.
└── <= 3 locales, fully translated, reciprocal hreflang + x-default → PASS

原因:只翻译了一半的语言区域路由树属于内容单薄的近似重复页面,会分散爬取预算,而且看起来像低质量机器翻译。互相引用意味着集合中的每个页面都列出其他所有页面,包括自身;单向 hreflang 会被忽略。

已发布的修复: 添加 hreflang 生成器,为保留的语言区域生成完整的互相引用集合;在布局中为移除的语言区域添加 noindex 保护;过滤站点地图,仅保留保留的语言区域。对于 Next.js redirects() 中的 301 重定向,每个移除的语言区域编写 2 条规则:/fr -> / 和 /fr/:path+ -> /:path+。原因:单条 /fr/:path* -> /:path* 规则会使裸路径 /fr 返回空的 Location 标头。Next.js 的 permanent: true 会返回 308,Google 将其视同 301。

1c. SafeSearch 降权

检查可爬取的 HTML 中是否有擦边或 NSFW 媒体:用户上传的头像和图库、挑逗性的图库主图、与成人内容相关的 UGC。比较开启与关闭 SafeSearch 时的 site:domain 结果数量。对于内容清白的产品,结果数量相差很大即为 FAIL。原因:Google 会在页面和网站层面判定露骨内容,而且许多用户默认开启 SafeSearch,因此少量露骨图片就可能过滤掉干净的核心词页面。

已发布的修复: 将 UGC 媒体页面设为 noindex 或置于身份验证之后;仅在成人页面上添加 <meta name="rating" content="adult">,以告知 Google 将这些页面单独处理,而不是据此评判整个网站。

1d. 全路径兜底软 404

curl -s -o /dev/null -w '%{http_code}\n' https://deployfast.dev/no-such-page-xyz   # must print 404

任何 200 状态码都是 FAIL。通常的原因是顶层动态片段(app/[locale]/page.tsx、pages/[slug].tsx)会为所有路径渲染,包括在没有静态文件优先匹配时的 /sitemap.xml 和 /robots.txt。原因:每个拼写错误的 URL 都会变成可编入索引的首页副本,而且站点地图 URL 会返回 HTML。

已发布的修复: 在该片段上设置 export const dynamicParams = false(App Router)或 fallback: false(Pages Router),并对未知参数调用 notFound()。

2. 程序化 SEO 陷阱与矛盾的数量

列出每个动态路由,并从站点地图中为每个路由抽取 20 个在线 URL。没有站点地图:从 generateStaticParams 或路由读取的数据文件中枚举。

检查项失败阈值已交付的修复
结果页内容单薄抽样页面中 > 10% 显示 0-1 条结果当 results < 3 时设为 noindex, follow,并从站点地图中移除
数字或 ID slug/near/18234、/tools/a7f3根据实体名称生成 slug,将旧 ID 301 重定向
缺少交易意图词“Property near X”模板:“X 附近的出租公寓(42 套房源)”
FAQ 内容套话> 30% 的子页面 FAQ 答案文本相同注入实体变量(数量、价格范围、热门项目),或删除该区块
搜索 URL 泛滥?q=、?sort=、?page= URL 被索引先设为 noindex,等它们从索引中消失后再设 Disallow
数量相互矛盾H1、FAQ 和 llms.txt 中的数字不同三者都读取同一个源常量

每项检查的重要性:

  • 内容单薄的页面会让 Google 认为整个路由模式都价值较低,从而拖累同一模板下的优质页面。
  • 搜索者会输入操作意图(“出租”“出售”“免费”),标题中没有这些词,就会输给包含这些词的结果。
  • 先设 noindex,再设 Disallow,因为禁止抓取的 URL 无法重新抓取以识别 noindex,因此会继续留在索引中。
  • Google 和大模型会引用某个数字。如果 H1 写着 1,200,FAQ 写着 900+,而 llms.txt 写着 800,它们谁都不会相信。
  • 静态的 public/llms.txt 无法导入数量常量。将它替换为路由处理程序(app/llms.txt/route.ts),从与页面相同的常量渲染数量和价格,并删除静态文件。
  • 从数据中推导常量(TEMPLATES.length),不要手动输入数字。原因:只要有人在数据中添加一行,手动输入的数量就会立即过时。
3. 首屏布局与 Demo 墙修复

3a. 布局

在 1366x768 和 390x844 尺寸下加载营收页面和主要程序化模板。

first viewport
├── map, hero animation, or video takes >= 50% of the viewport
│   AND no result card or internal hub link is visible
│   └── FAIL. Collapse the map behind a "Show map" toggle, render cards first.
├── card attributes are icon-only SVGs (bed icon + "2")
│   └── FAIL. Write them as text: "2 bedrooms, 1 bathroom, 65 m²".
└── cards and hub links visible without scrolling → PASS

原因:爬虫和用户都会重点关注最先加载的内容,而仅含图标的属性对 Google 和读取 HTML 的大模型来说都是不可见文本。

3b. Demo 墙

primary CTA
├── only "Book a Demo" or "Talk to Sales"
├── or core value hidden behind "Create Account to View"
│   └── FAIL. Ship an instant interactive element on the page:
│       lookup, calculator, sample report, or live preview with no login.
│       Capture the email after the user sees their result.
└── visitor gets value in < 30 seconds without an account → PASS

原因:搜索访客往往毫无准备地到达,并在几秒内离开,而演示日历要求他们先腾出 30 分钟,才能看到任何内容。即时展示结果能转化同一位访客,并向 Google 提供参与度信号。

4. 虚假权威度与竞争对手优质链接情况核查

获取网站和 3 个竞争对手的 DR、org_keywords 以及干净的引荐域(ahrefs-research Workflow B:dofollow、正文内、每个域名 1 个、引荐页面流量 > 10)。

site profile
├── DR >= 40 and org_keywords < 100
│   └── FAIL: inflated. Links come from sitewides, widgets, or farms. Stop buying that kind.
├── competitor ranks top 3 on 25-40 clean editorial domains, site has fewer
│   └── That gap is the link target. Put the exact number in the roadmap.
└── clean domain count >= competitors' → links are not the bottleneck. Look at points 2, 3, 6.

原因:DR 很容易被人为抬高,造假也不花钱;精简型竞争对手排名所依靠的,是干净的编辑类域名。说出真实数字,团队才不会再追逐虚荣指标。

产品内置反向链接循环。 检查用户使用产品时是否会为产品带来链接:

  • 在面向客户的输出(状态页面、表单、发票、报告)中添加 "Powered by [Brand]" 或 "Verified on [Brand]" 徽章。
  • 提供可公开分享的 URL(/s/<id>、/r/<slug>),使其可被索引并带有品牌链接。
  • 提供带有署名链接的可嵌入组件、地图或图表。

已交付的修复: 添加徽章组件和嵌入代码片段。使用品牌名称作为锚文本链接到首页。原因:Google 会将组件中包含关键词的锚文本视为链接操纵,而真实使用带来的品牌锚文本会在无需外联的情况下持续累积。

5. AI 搜索中的实体和价格可见性
for UA in GPTBot OAI-SearchBot PerplexityBot ClaudeBot; do
  echo "$UA: $(curl -s -A "$UA" https://deployfast.dev/pricing \
    | perl -0pe 's/<script\b.*?<\/script>//gs; s///gs; s/<head>.*?<\/head>//s' \
    | grep -oE '\$[0-9][0-9,.]*' | sort -u | tr '\n' ' ')"
done

在 grep 前移除脚本、注释和 <head>。原因:Next.js 会在 <script> 标签中内联其 RSC 负载,其中 $1 和 $9 是引用,这会导致仅含 JavaScript 的价格页面通过原始 grep;React 还会将 ${price} 拆分为 $29,导致固定价格页面无法通过检查;而 <title> 中的价格并不是价格表。暂不部署:运行 next build && next start(或框架的生产服务器),并将循环指向 localhost。

pricing page raw HTML
├── no prices in the HTML (JS-only slider, client-fetched plans) → FAIL
├── docs or specs behind login → FAIL
├── crawler gets 403 / challenge page → FAIL (check WAF and bot rules)
└── plans, prices, and limits present as plain text → PASS

原因:大多数 AI 爬虫不会运行 JavaScript,因此仅含 JavaScript 的价格滑块会让 ChatGPT、Perplexity 和 Claude 认为产品没有公开价格,并推荐它们能读取到价格的竞品。

**已交付修复:**将价格表作为文本进行服务器端渲染,为核心功能发布公开文档,添加价格相同的 Product/Offer JSON-LD,并确保 llms.txt 与页面内容完全一致。

6. 商业页面的索引收录和内链现状

针对每个商业页面:

检查项未通过标准
在站点地图中缺失
已编入索引(GSC URL 检查或 site: 查询)未编入索引
规范链接指向其他位置,或带有查询参数变体的页面缺少规范链接
从首页或主导航链接否
指向该页面的正文上下文链接(不包括导航和页脚)少于 3 个
状态存在任何重定向链或软 404

原因:商业页面通常藏在 4 次点击之后,而首页链接却指向博客,因此 Google 会为商业关键词排出博客页面,最终无法实现转化。

**已交付修复:**添加导航或首页链接、修正规范链接、添加站点地图条目。然后运行内链技能,从流量最高的帖子添加 3 个以上的上下文链接;该技能也采用排除导航的计数方式,因此其孤立页面列表与此检查结果一致。

必须交付的成果

1. 修复 PR

直接在代码库中应用所有 FATAL 和快速 REVENUE 修复:robots.txt、hreflang 和 noindex 防护、程序化标题模板、计数常量、可抓取的价格和卡片、徽章组件、内链。PR 描述格式:

## SEO Roast fixes
Verdict: <one blunt line>

### Fatal (fixed)
- robots.txt default-deny blocked Bing and AI crawlers → default-allow
### Revenue (fixed)
- /near/[slug] titles now "Condos for Rent near {city} ({count} listings)"
### Verify
- curl -A Bingbot https://<domain>/robots.txt
- view-source pricing page shows $ amounts
2. seo/roast-roadmap.md

按营收影响排序,而非按审计类别排序:

# SEO Roast Roadmap: invoicekit.io (2026-11-12)

Verdict: Google could see you. Nobody else could.

| # | Tier | Issue | Revenue impact | Fix | Owner | Status |
|---|---|---|---|---|---|---|
| 1 | FATAL | robots.txt blocked all non-Google crawlers | AI search + Bing traffic at 0 | default-allow | agent | shipped in PR |
| 2 | REVENUE | Pricing JS-only | Missing from AI recommendations | SSR table + JSON-LD | agent | shipped in PR |
| 3 | COMPOUNDING | 11 clean RDs vs competitor 34 | Money keyword stuck page 2 | 23-link gap plan | founder | next |

## Fluff (ignore until rows above ship)
- 14 images missing alt text

营收影响列需用一句简单的话说明该问题阻碍了哪些收入。不要使用严重程度评分或红绿灯颜色。

3. 可选的客户演示文稿

当要向创始人、董事会或客户展示 roast 时,可使用 GenPPT 将 seo/roast-roadmap.md 转换为 .pptx:每个 FATAL 问题各占一页,展示修复前后对比,然后附上路线图表格。

下一步

  • **人工审查:**如需 Ilias 录制的 20 分钟直言不讳的网站视频 roast,请使用 SEO Roast。
  • 弥补第 4 点中的链接差距:LinkDR(https://linkdr.com/SKILL.md)可获取经过审核的 DR 30-60+ 编辑类链接和榜单提及,让 23 个链接的差距变成一笔订单,而不是耗费一个季度进行外联。
  • 验证第 1a 点和第 5 点中的 AI 搜索恢复情况:AI SEO Tracker(MCP:https://aiseotracker.com/api/agent/mcp)会追踪发布抓取和价格修复后,ChatGPT、Perplexity、Gemini 和 Google AI Overviews 是否开始引用你的页面。

完成清单

  • FATAL 级问题已清零,所有修复都已包含在 PR 中
  • 快速 REVENUE 修复已包含在 PR 中,其余事项已列在路线图顶部
  • seo/roast-roadmap.md 已按营收影响排序并注明负责人
  • PR 描述中的验证命令均已通过
  • 空话内容只在底部列出一次,未作处理

相关内容

评论

支持 Markdown