关于 ai-content-discovery
ai-content-discovery 是用于修复 IsAgentReady.com AI 内容发现检查项的技能,面向希望 AI 系统能够发现、抓取和读取其网站的维护者。它涵盖 robots.txt、站点地图、llms.txt 等发现信号,并提供验证与复扫步骤。
主要功能
- 01配置 robots.txt 与爬虫规则
- 02生成 XML 站点地图
- 03添加 llms.txt 和 AGENTS.md
- 04支持 Markdown 内容协商
- 05检查 HTTP 可访问性与软 404
适用场景
- 01修复 AI 内容发现扫描失败
- 02允许或限制特定 AI 爬虫访问
- 03为 Agent 提供站点文档和内容入口
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bartwaardenburg/ isagentready-skills --skill ai-content-discovery安装后在 Claude Code 中输入/ai-content-discovery确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/checkpoints.mdgotchas.mdllms-txt-guide.mdrobots-txt-guide.md详细介绍
AI 内容发现
修复 IsAgentReady.com 的 AI 内容发现类别。这些检查点用于测试 AI 系统能否发现、抓取和读取网站。
- 方法论版本:
2026-10-22。方法论:https://isagentready.com/en/methodology - 评分(权重和分数):https://isagentready.com/api/v2/methodology/2026-10-22/scoring
- 完整检查点数据(阶段、证据类型、验证命令、重新扫描命令):references/checkpoints.md
适用场景
- 扫描显示 AI 内容发现类别中存在未通过项(旧版 ID 为 1.x)。
- robots.txt 缺失、返回 HTML,或阻止 AI 爬虫访问。
- 网站没有站点地图、llms.txt 或 AGENTS.md。
- Agent 需要获取 Markdown、Link 标头或 Content-Signal 偏好设置。
- 用户要求“让 AI 可以抓取网站”或“修复 AI 可发现性”。
不适用场景
- JSON-LD 或 Schema.org 标记:使用
structured-data。 - 语义化 HTML、标题或 SSR:使用
content-semantics。 - MCP、A2A、OpenAPI 或 WebMCP:使用
agent-protocols。 - 安全标头或 OAuth 元数据:使用
security-trust。
操作说明
- 从扫描结果中获取未通过的检查点。每项结果都包含一个旧版 ID(
1.4)和一个稳定 ID(ia.llms-txt)。 - 前往修复工作流,并使用与稳定 ID 相同的锚点。
- 根据网站调整示例。将
example.com替换为网站域名。 - 运行验证命令。所有验证命令均为只读操作。
- 使用
isagentready results <domain> --checkpoint <stable-id>重新扫描,或前往 isagentready.com。
如果提供了 $ARGUMENTS,请将其用作要修复的网址或检查点。
检查点
Strength 表示 agentready.org 规范级别(MUST、SHOULD、MAY)。Strength 不会改变得分。
| 旧版 | 稳定 ID | 名称 | AR ID | Strength |
|---|---|---|---|---|
| 1.1 | ia.robots-txt | robots.txt 存在 | AR-FIND-01 | MUST |
| 1.2 | ia.ai-crawler-directives | AI 爬虫指令 | AR-FIND-01 | MUST |
| 1.3 | ia.xml-sitemap | XML 站点地图 | AR-FIND-03 | SHOULD |
| 1.4 | ia.llms-txt | llms.txt | AR-READ-07 | SHOULD |
| 1.5 | ia.meta-robots | Meta robots / X-Robots-Tag | AR-FIND-01 | MUST |
| 1.6 | ia.content-freshness | 内容新鲜度信号 | 无 | MAY |
| 1.7 | ia.markdown-negotiation | 内容协商(text/markdown) | AR-READ-09 | MAY |
| 1.8 | ia.bot-accessibility | HTTP 爬虫可访问性 | AR-FIND-01 | MUST |
| 1.9 | ia.link-headers | Link 响应标头 | AR-FIND-04, AR-READ-06 | MAY |
| 1.10 | ia.content-usage | Content-Usage 偏好设置 | 无 | MAY |
| 1.11 | ia.agents-md | AGENTS.md Agent 指南 | 无 | MAY |
| 1.12 | ia.agent-content-contracts | Agent 内容约定 | AR-READ-11, AR-ACT-01 | MAY |
| 1.13 | ia.soft-404 | Soft-404 规范 | AR-READ-02 | MUST |
| 1.14 | ia.dns-aid | DNS-AID Agent 记录 | 无 | MAY |
| 1.15 | ia.pricing-page | 第一方定价页面 | AR-READ-11 | SHOULD |
训练暴露度检查(te.1 至 te.5)仅供参考,不计分。请参阅 references/checkpoints.md。
修复工作流
1.1 robots.txt 存在
当 /robots.txt 返回 200、Content-Type: text/plain,且不是 HTML 页面时,即为通过。
- 将
robots.txt文件放在 Web 根目录:User-agent: * Allow: / Sitemap: https://example.com/sitemap.xml - 将其作为
text/plain提供。Nginx:location = /robots.txt { default_type text/plain; }。
验证:curl -sfI https://example.com/robots.txt | grep -i '^content-type: text/plain'
1.2 AI 爬虫指令
当 robots.txt 明确允许 AI 用户代理时通过。没有提及可获得部分分数。禁止所有 AI Agent 则不通过。
- 为每个 AI 用户代理添加一个组。完整列表见 references/robots-txt-guide.md。
User-agent: GPTBot User-agent: OAI-SearchBot User-agent: ChatGPT-User User-agent: ClaudeBot User-agent: Claude-User User-agent: Claude-SearchBot User-agent: PerplexityBot User-agent: Google-Extended Allow: / - 若要禁止用于训练但允许用于搜索,仅对训练 Agent 使用
Disallow: /。
验证:curl -sf https://example.com/robots.txt | grep -iE '^user-agent: *(GPTBot|OAI-SearchBot|ClaudeBot|Claude-User|PerplexityBot)'
1.3 XML 站点地图
当 robots.txt 中的 Sitemap: 行、/sitemap.xml 或 /sitemap_index.xml 返回含有 <urlset> 或 <sitemapindex> 的 XML 时通过。
- 使用框架生成站点地图(Next.js
sitemap.ts、WordPress/wp-sitemap.xml、Djangodjango.contrib.sitemaps)。<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/</loc><lastmod>2026-10-01</lastmod></url> </urlset> - 在 robots.txt 中添加
Sitemap: https://example.com/sitemap.xml。
验证:curl -sf https://example.com/sitemap.xml | grep -qE '<(urlset|sitemapindex)'
1.4 llms.txt
当 /llms.txt 返回 text/plain 或 text/markdown、以 # 标题开头且包含一个或多个 URL 时通过。提供 /llms-full.txt 文件可获得额外分数。
- 编写
/llms.txt:# Example Inc > Example Inc sells project planning software for small teams. ## Docs - [Getting started](https://example.com/docs/start): Set up a first project - [API reference](https://example.com/docs/api): REST endpoints - 将其作为
text/markdown或text/plain提供。参见 references/llms-txt-guide.md。
验证:curl -sf https://example.com/llms.txt | head -1 | grep -q '^# '
1.5 Meta robots / X-Robots-Tag
当不存在限制性指令时通过。nofollow、nosnippet、noai 或 noimageai 可获得部分分数。noindex 则不通过。
- 从
<meta name="robots">中移除noindex和noai。使用<meta name="robots" content="index, follow">或不添加此标签。 - 从服务器或 CDN 配置中移除限制性的
X-Robots-Tag标头。
验证:curl -sfI https://example.com/ | grep -i '^x-robots-tag'(预期无输出,或不含 noindex)
1.6 内容新鲜度信号
当 JSON-LD 含有 dateModified 或页面含有 article:modified_time 时通过。datePublished 或 <time datetime> 可获得部分分数。仅有 Last-Modified 标头则可获得更少分数。
- 将日期添加到页面的 JSON-LD 中:
{ "@context": "https://schema.org", "@type": "Article", "datePublished": "2026-09-01T09:00:00Z", "dateModified": "2026-10-15T14:30:00Z" } - 或添加
<meta property="article:modified_time" content="2026-10-15T14:30:00Z">。
验证:curl -sf https://example.com/ | grep -qE 'dateModified|article:modified_time'
1.7 内容协商(text/markdown)
当带有 Accept: text/markdown 的请求获得 Content-Type: text/markdown、Vary: Accept 标头以及超过 200 字节且包含标题的内容时通过。
- 当
Accept标头请求 Markdown 时,返回页面的 Markdown 版本:app.get("/", (req, res) => { res.vary("Accept"); if (req.accepts(["text/html", "text/markdown"]) === "text/markdown") { return res.type("text/markdown; charset=utf-8").send(renderMarkdown("/")); } res.send(renderHtml("/")); }); - 确保 CDN 保留
Vary: Accept,以免为所有客户端缓存同一版本。
验证:curl -sfI -H 'Accept: text/markdown' https://example.com/ | grep -iE '^(content-type: text/markdown|vary:.*accept)'
1.8 HTTP 爬虫可访问性
当首页返回 2xx 时通过。WAF 或 CDN 返回 401 或 403 则不通过。
- 找出拦截规则。比较浏览器用户代理和 AI 用户代理的状态码。
- 为经过验证的 AI 爬虫添加 WAF 例外。Cloudflare:Security、WAF、Custom rules、“User Agent contains GPTBot”,操作选择 Skip。
- 不要对遵守 robots.txt 的爬虫限制首页请求速率。
验证:curl -s -o /dev/null -w '%{http_code}' -A 'Mozilla/5.0 (compatible; GPTBot/1.0)' https://example.com/
1.9 链接响应标头
当首页发送 Link 标头(RFC 8288),其中包含 api-catalog、service-desc、service-doc、sitemap、describedby 和 related 中至少两项时通过。一个 rel 可获得部分分数。
- 在首页响应中添加标头:
add_header Link '</.well-known/api-catalog>; rel="api-catalog", </sitemap.xml>; rel="sitemap"' always; - 确保每个目标 URL 均返回 200。
验证:curl -sfI https://example.com/ | grep -i '^link:'
1.10 内容使用偏好
当 robots.txt 中包含 Content-Signal: 行,且其中有已知键(search、ai-input、ai-train)时通过。没有已知键的行可获得部分分数。
- 将偏好添加到 robots.txt 的
User-agent: *组中:User-agent: * Content-Signal: search=yes, ai-input=yes, ai-train=no Allow: /
验证:curl -sf https://example.com/robots.txt | grep -i '^content-signal:'
1.11 AGENTS.md Agent 指南
当 /AGENTS.md 返回文本、以 # 标题开头且包含 50 个或更多字符时通过。HTML 软 404 页面不通过。
- 编写
/AGENTS.md:# Example Inc for agents - API: https://example.com/openapi.json (no key for read endpoints) - MCP: https://example.com/mcp (Streamable HTTP) - Docs: https://example.com/docs - Rate limit: 60 requests per minute - 将其作为
text/markdown提供。
验证:curl -sf https://example.com/AGENTS.md | head -1 | grep -q '^# '
1.12 Agent 内容约定
当 HTML 显示登录、定价或应用相关信号时适用。当 /auth.md 和 /pricing.md(视情况而定)返回包含 # 标题且不少于 80 个字符的文本时通过。
- 编写
/pricing.md,以文本形式列出套餐和价格。编写/auth.md,说明登录方式、权限范围和 Agent 规则。# Pricing - Free: 0 USD per month, 3 projects - Team: 12 USD per user per month, unlimited projects - 将这两个文件都作为
text/markdown提供。
验证:curl -sfI https://example.com/pricing.md | grep -iE '^content-type: text/(markdown|plain)'
1.13 软 404 规范
当未知路径返回 404 或 410 时通过。其他状态码或跨源重定向可获得部分分数。未知路径返回 2xx 页面则不通过。
- 删除返回 200 或重定向到首页的兜底规则。对于 SPA,让服务端对未知路由返回 404:
location / { try_files $uri $uri/ =404; } - 在框架中,使用未找到页面返回 404 状态码。不要以 200 状态码渲染该页面。
验证:curl -s -o /dev/null -w '%{http_code}' https://example.com/.well-known/isagentready-missing-check
1.14 DNS-AID Agent 记录
当域名下的 _index._agents、_mcp._agents 或 _a2a._agents 存在 SVCB 或 HTTPS 记录时通过。仅有 TXT 记录可获得部分分数。
- 在 DNS 提供商处添加 SVCB 记录:
_mcp._agents.example.com. 3600 IN SVCB 1 mcp.example.com. alpn="h2" port=443
验证:curl -s 'https://dns.google/resolve?name=_mcp._agents.example.com&type=SVCB' | jq -e '.Answer | length > 0'
1.15 第一方定价页面
当网站显示定价信号时适用。当 /pricing(或链接到的定价页面)返回 200,且以服务端渲染的文本显示价格时通过。Offer JSON-LD 为可选项。
- 在服务端 HTML 中渲染套餐和价格。不要只通过 JavaScript 加载。
<section id="plans"> <h2>Team</h2> <p><data value="12">$12</data> per user per month</p> </section> - 在首页导航中添加指向该页面的链接。
验证:curl -sf https://example.com/pricing | grep -qE '[$€£] ?[0-9]'
重要注意事项
- robots.txt 返回 HTML 404 页面,但状态码为 200。
- robots.txt 或 llms.txt 的
Content-Type: text/html。 - 带有
Disallow: /的User-agent: *会屏蔽所有 AI 爬虫。 - CDN 丢弃
Vary: Accept,导致 Markdown 和 HTML 在缓存中混杂。 - 兜底路由为每个路径都返回 200(软 404)。
请参阅 references/gotchas.md,了解正确和错误示例。
参考资料
- references/checkpoints.md:各检查点的生成检查点数据
- references/robots-txt-guide.md:robots.txt 语法、AI 用户代理和测试
- references/llms-txt-guide.md:llms.txt 结构及各类网站示例
- references/gotchas.md:常见错误及正确和错误示例