mcpField
A
ai-content-discovery

ai-content-discovery

github.com/bartwaardenburg营销与增长0183 次安装1 周前更新
代码仓库

关于 ai-content-discovery

ai-content-discovery 是用于修复 IsAgentReady.com AI 内容发现检查项的技能,面向希望 AI 系统能够发现、抓取和读取其网站的维护者。它涵盖 robots.txt、站点地图、llms.txt 等发现信号,并提供验证与复扫步骤。

主要功能

  1. 01配置 robots.txt 与爬虫规则
  2. 02生成 XML 站点地图
  3. 03添加 llms.txt 和 AGENTS.md
  4. 04支持 Markdown 内容协商
  5. 05检查 HTTP 可访问性与软 404

适用场景

  1. 01修复 AI 内容发现扫描失败
  2. 02允许或限制特定 AI 爬虫访问
  3. 03为 Agent 提供站点文档和内容入口

安装

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

$npx skills add https://github.com/bartwaardenburg/isagentready-skills --skill ai-content-discovery

安装后在 Claude Code 中输入/ai-content-discovery确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
checkpoints.md
gotchas.md
llms-txt-guide.md
robots-txt-guide.md

详细介绍

AI 内容发现

修复 IsAgentReady.com 的 AI 内容发现类别。这些检查点用于测试 AI 系统能否发现、抓取和读取网站。

适用场景

  • 扫描显示 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。

操作说明

  1. 从扫描结果中获取未通过的检查点。每项结果都包含一个旧版 ID(1.4)和一个稳定 ID(ia.llms-txt)。
  2. 前往修复工作流,并使用与稳定 ID 相同的锚点。
  3. 根据网站调整示例。将 example.com 替换为网站域名。
  4. 运行验证命令。所有验证命令均为只读操作。
  5. 使用 isagentready results <domain> --checkpoint <stable-id> 重新扫描,或前往 isagentready.com。

如果提供了 $ARGUMENTS,请将其用作要修复的网址或检查点。

检查点

Strength 表示 agentready.org 规范级别(MUST、SHOULD、MAY)。Strength 不会改变得分。

旧版稳定 ID名称AR IDStrength
1.1ia.robots-txtrobots.txt 存在AR-FIND-01MUST
1.2ia.ai-crawler-directivesAI 爬虫指令AR-FIND-01MUST
1.3ia.xml-sitemapXML 站点地图AR-FIND-03SHOULD
1.4ia.llms-txtllms.txtAR-READ-07SHOULD
1.5ia.meta-robotsMeta robots / X-Robots-TagAR-FIND-01MUST
1.6ia.content-freshness内容新鲜度信号无MAY
1.7ia.markdown-negotiation内容协商(text/markdown)AR-READ-09MAY
1.8ia.bot-accessibilityHTTP 爬虫可访问性AR-FIND-01MUST
1.9ia.link-headersLink 响应标头AR-FIND-04, AR-READ-06MAY
1.10ia.content-usageContent-Usage 偏好设置无MAY
1.11ia.agents-mdAGENTS.md Agent 指南无MAY
1.12ia.agent-content-contractsAgent 内容约定AR-READ-11, AR-ACT-01MAY
1.13ia.soft-404Soft-404 规范AR-READ-02MUST
1.14ia.dns-aidDNS-AID Agent 记录无MAY
1.15ia.pricing-page第一方定价页面AR-READ-11SHOULD

训练暴露度检查(te.1 至 te.5)仅供参考,不计分。请参阅 references/checkpoints.md。

修复工作流

1.1 robots.txt 存在

当 /robots.txt 返回 200、Content-Type: text/plain,且不是 HTML 页面时,即为通过。

  1. 将 robots.txt 文件放在 Web 根目录:
    User-agent: *
    Allow: /
    
    Sitemap: https://example.com/sitemap.xml
    
  2. 将其作为 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 则不通过。

  1. 为每个 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: /
    
  2. 若要禁止用于训练但允许用于搜索,仅对训练 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 时通过。

  1. 使用框架生成站点地图(Next.js sitemap.ts、WordPress /wp-sitemap.xml、Django django.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>
    
  2. 在 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 文件可获得额外分数。

  1. 编写 /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
    
  2. 将其作为 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 则不通过。

  1. 从 <meta name="robots"> 中移除 noindex 和 noai。使用 <meta name="robots" content="index, follow"> 或不添加此标签。
  2. 从服务器或 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 标头则可获得更少分数。

  1. 将日期添加到页面的 JSON-LD 中:
    { "@context": "https://schema.org", "@type": "Article",
      "datePublished": "2026-09-01T09:00:00Z", "dateModified": "2026-10-15T14:30:00Z" }
    
  2. 或添加 <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 字节且包含标题的内容时通过。

  1. 当 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("/"));
    });
    
  2. 确保 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 则不通过。

  1. 找出拦截规则。比较浏览器用户代理和 AI 用户代理的状态码。
  2. 为经过验证的 AI 爬虫添加 WAF 例外。Cloudflare:Security、WAF、Custom rules、“User Agent contains GPTBot”,操作选择 Skip。
  3. 不要对遵守 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 可获得部分分数。

  1. 在首页响应中添加标头:
    add_header Link '</.well-known/api-catalog>; rel="api-catalog", </sitemap.xml>; rel="sitemap"' always;
    
  2. 确保每个目标 URL 均返回 200。

验证:curl -sfI https://example.com/ | grep -i '^link:'

1.10 内容使用偏好

当 robots.txt 中包含 Content-Signal: 行,且其中有已知键(search、ai-input、ai-train)时通过。没有已知键的行可获得部分分数。

  1. 将偏好添加到 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 页面不通过。

  1. 编写 /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
    
  2. 将其作为 text/markdown 提供。

验证:curl -sf https://example.com/AGENTS.md | head -1 | grep -q '^# '

1.12 Agent 内容约定

当 HTML 显示登录、定价或应用相关信号时适用。当 /auth.md 和 /pricing.md(视情况而定)返回包含 # 标题且不少于 80 个字符的文本时通过。

  1. 编写 /pricing.md,以文本形式列出套餐和价格。编写 /auth.md,说明登录方式、权限范围和 Agent 规则。
    # Pricing
    
    - Free: 0 USD per month, 3 projects
    - Team: 12 USD per user per month, unlimited projects
    
  2. 将这两个文件都作为 text/markdown 提供。

验证:curl -sfI https://example.com/pricing.md | grep -iE '^content-type: text/(markdown|plain)'

1.13 软 404 规范

当未知路径返回 404 或 410 时通过。其他状态码或跨源重定向可获得部分分数。未知路径返回 2xx 页面则不通过。

  1. 删除返回 200 或重定向到首页的兜底规则。对于 SPA,让服务端对未知路由返回 404:
    location / { try_files $uri $uri/ =404; }
    
  2. 在框架中,使用未找到页面返回 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 记录可获得部分分数。

  1. 在 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 为可选项。

  1. 在服务端 HTML 中渲染套餐和价格。不要只通过 JavaScript 加载。
    <section id="plans">
      <h2>Team</h2>
      <p><data value="12">$12</data> per user per month</p>
    </section>
    
  2. 在首页导航中添加指向该页面的链接。

验证:curl -sf https://example.com/pricing | grep -qE '[$€£] ?[0-9]'

重要注意事项

  1. robots.txt 返回 HTML 404 页面,但状态码为 200。
  2. robots.txt 或 llms.txt 的 Content-Type: text/html。
  3. 带有 Disallow: / 的 User-agent: * 会屏蔽所有 AI 爬虫。
  4. CDN 丢弃 Vary: Accept,导致 Markdown 和 HTML 在缓存中混杂。
  5. 兜底路由为每个路径都返回 200(软 404)。

请参阅 references/gotchas.md,了解正确和错误示例。

参考资料

评论

支持 Markdown