博客

适配 AI 智能体的网站需要什么:打造 dardo.studio 的心得

我们逐层改造 dardo.studio,让 AI 智能体既能读取,也能调用。本文介绍每一层的作用、目前哪些平台在文档中说明会读取它,以及哪些层我们还会再做一次。

作者: Nicolás Cerón ·

一台带轮子的小机器人在夜晚的美术馆展厅里,沿着一条深红色引导线驶向一件被灯光照亮的雕塑。

简短回答

适配 AI 智能体的网站要做到三件事:AI 智能体能够访问它;能够直接读取内容,而不必穿过层层菜单、横幅和脚本;在合适的情况下,还能调用几个已声明的工具,而不是猜测该点哪个按钮。

2026 年 10 月初,我们在 dardo.studio 上把这三件事都做了。以下是我们上线的内容,以及主要 AI 平台在文档中说明使用其中哪些层的情况(已于 2026 年 10 月 8 日对照线上站点核实)。

结论没有大多数“AI 就绪”清单那么惊艳。最古老的层最重要:爬虫访问权限和干净的语义化 HTML。Markdown 副本和 llms.txt 只是成本很低的便利措施。MCP、A2A 和 WebMCP 都是真实的协议,也有可用的客户端,但在我们引用的 OpenAI、Anthropic、Perplexity 和 Google 的爬虫文档中,没有一份提到它们的助手会自行发现网站的工具。

先从访问开始:robots.txt 与边缘层

我们的 robots.txt 为默认代理(*)以及我们点名的每个 AI 搜索爬虫和用户触发抓取器重复了同一组规则:

User-agent: OAI-SearchBot
Allow: /
Disallow: /api/
Content-Signal: search=yes, ai-input=yes

同样的规则也适用于 ChatGPT-User、PerplexityBot、Perplexity-User、Claude-SearchBot、Claude-User 和 Bingbot。只有 /api/ 被禁止访问。

搜索爬虫与训练爬虫是分开的

各大公司现在都在文档中为搜索和训练分别提供了不同的标识:

  • OpenAI。OAI-SearchBot 负责让网站出现在 ChatGPT 搜索中。屏蔽它的网站不会出现在 ChatGPT 搜索的回答里,不过仍可能以普通导航链接的形式出现。GPTBot 用于收集训练数据。(OpenAI 爬虫)
  • Anthropic。Claude-SearchBot 为搜索建立索引,ClaudeBot 收集训练数据,Claude-User 则在用户向 Claude 提问时抓取网页。(Anthropic 爬虫)
  • Perplexity。PerplexityBot 在 Perplexity 的结果中展示并链接网站,不用于训练基础模型。(Perplexity 爬虫)
  • Google。Google-Extended 是一个控制标识,用于 Gemini 的训练以及其他 Google 产品中的内容依据(grounding)。它不影响网站在 Google 搜索中的收录或排名。(Google 通用爬虫)

用户触发的抓取器则不同。OpenAI 表示 robots.txt 可能不适用于 ChatGPT-User,因为这些请求由用户发起。Perplexity-User 和 Google 的用户触发抓取器通常会忽略它。这类抓取器是实时替某一个人行事的;即使屏蔽生效,多半也只是阻止了这个人的助手读取你的页面。

我们的文件没有点名训练爬虫,所以它们归入 *,是被允许的。这是一项商业决策,各厂商也把它作为单独的控制项来说明:屏蔽 GPTBot 或 ClaudeBot,与退出它们的搜索索引并不是一回事。

Content Signals:一行代码,没有任何承诺

Content-Signal 这一行来自 Cloudflare 的 Content Signals Policy,其中列出三种用途:search、ai-input(在回答时把内容提供给模型)和 ai-train。我们省略了 ai-train,按照该政策,这既不表示允许,也不表示限制该用途。Cloudflare 表示,这些信号只表达偏好,不会阻止任何访问,也可能被忽略。这里引用的爬虫文档页面都没有提到它们。它只需要一行;但眼下不要抱有期待。

要检查边缘层,而不只是文件

robots.txt 只是声明一项策略,真正决定结果的是你的 CDN。10 月 2 日测试时,尽管 robots.txt 允许一切访问,Cloudflare 的浏览器完整性检查(Browser Integrity Check)仍对 Python 默认的 HTTP 客户端(Python-urllib)和 libwww-perl 返回了 403。编程智能体编写的脚本经常原样使用 Python 标准库。

我们添加了一条 Cloudflare 配置规则,对公开内容的 GET 和 HEAD 请求予以豁免;/api/ 仍然返回 403。同一次检查还发现,我们的 .txt 文件没有指定字符集,导致一些客户端把“Bogotá”读成“Bogotá”。修复只需一个响应头:charset=utf-8。

用各个 user agent 发送真实请求来测试。这能证明没有任何规则屏蔽这个名称,但不能证明真正的爬虫来访过。

朴素的语义化 HTML:所有智能体都依赖的一层

Google 的 AI 优化指南介绍了浏览器智能体:它们会分析截图、检查 DOM,并解读无障碍树。该指南引导网站所有者阅读 web.dev 的智能体友好指南,其内容大多属于无障碍工作:使用 <button> 和 <a>,而不是加了样式的 <div>;让每个标签与对应的输入框关联;并避免页面布局在截图时发生位移。

在 dardo.studio 上,每个页面都只有一个 <main>,并带有设置了标签的 <nav> 地标。菜单和主题切换都是真正的按钮,通过 aria-expanded 和 aria-pressed 报告状态,关闭的菜单设置为 inert。联系表单的每个字段都放在自己的 <label> 内,从而拥有可访问的名称。web.dev 建议使用 for 属性;把输入框包在标签里,效果相同。

这对如今的屏幕阅读器用户就有帮助,仅此一点就足够了。

每个页面都有一份干净的 Markdown 副本

智能体每读一个 token 都要付费,而渲染后的页面包含导航、Cookie 横幅、脚本和装饰性图形。在这项工作之前,用 Accept: text/markdown 请求我们的页面,返回的仍是包含所有这些内容的 HTML。

现在,构建步骤会在每个可被索引的页面旁生成一个 index.md。文件开头是 front matter(标题、描述、规范网址、语言、另一语言版本和更新日期),然后是页面的 <main> 内容,不含脚本、按钮、装饰性图片和页内目录。常见问题的解答会保留。表单会转换为字段和选项的列表,这样智能体无需操作表单,就能告诉用户我们的联系表单会询问哪些内容。

获取这份副本有三种方式:

  • 向常规网址发送 Accept: text/markdown。这类响应带有 Vary: Accept,因此缓存会将不同版本分开保存。
  • 直接请求文件:/en/services/seo/index.md。
  • 在页面路径后加上 .md(/en/services/seo.md)。对于以斜杠结尾的网址,llms.txt 提案使用 index.md,即上文的形式。

每个 HTML 页面还会通过 <link rel="alternate" type="text/markdown"> 指向它的副本。

让搜索引擎回到 HTML 页面

Google 的指南提到,除 HTML 之外,它也可以抓取和索引许多文件类型,并且不会特殊对待。Markdown 副本可能与其对应的页面互相竞争,因此每个 markdown 响应都会将 HTML 页面声明为规范版本:

$ curl -sI https://dardo.studio/en/services/seo/index.md
content-type: text/markdown; charset=utf-8
link: <https://dardo.studio/en/services/seo/>; rel="canonical", ...

谁会读取这些副本?Cloudflare 打造了 Markdown for Agents,在边缘节点为偏好 markdown 的请求转换 HTML,这说明确实有智能体在请求。但它没有说明哪些客户端会发送该请求头,我们也没有经过验证的名单。如果你使用 Cloudflare 的这项功能,除非源站自行设置,否则它会添加 Content-Signal: ai-train=yes, search=yes, ai-input=yes。我们在构建时生成副本,使其与页面完全一致。

llms.txt:实用的索引,但对搜索没有影响

llms.txt 是 Jeremy Howard 的提案,于 2024 年 9 月首次发布,目前仍在征集社区意见:它是位于 /llms.txt 的 markdown 文件,包含网站名称、简短摘要,以及智能体可能需要的链接列表。

我们的文件位于 /llms.txt 和 /es/llms.txt,与页面使用同一份数据生成,因此不会出现内容偏差。它列出了工作室的基本情况(波哥大、2026 年成立、三人团队、项目如何定价、联系方式),列出服务和作品,并说明如何获取 markdown 副本。llms-full.txt 包含工作室、服务、作品和联系页面的完整文本。

其中有一行列出了与我们名称相似、但与我们无关的企业。我们在 10 月 2 日查看时,它们占据了“dardo studio”搜索结果的前列。这一行也许是整个文件中最有用的。

现状,直说如下:

  • Google 表示,出现在搜索或其 AI 功能中并不需要 llms.txt,搜索会忽略它,有没有这个文件既无益也无害。
  • OpenAI、Anthropic 和 Perplexity 在爬虫文档中并未说明其机器人会读取其他网站的 llms.txt。不过,OpenAI、Anthropic 和 Perplexity 自己的文档网站确实发布了 llms.txt,供读取其文档的智能体使用。

如果文件是自动生成且内容准确,不妨保留。它对编程智能体和会查找它的工具有帮助,但不是提升可见度的手段。

智能体可调用的工具:MCP、A2A 和 API 目录

我们发布了两个只读工具:

  • list_services 以英文或西班牙文返回我们已发布的服务、范围、交付内容和来源网址,可通过可选关键词筛选。
  • get_project_brief 返回联系我们之前需要回答的问题,以及该服务对应语言的联系链接。

多个入口背后是同一套实现:

入口dardo.studio 上的地址标准与状态
MCP 服务器/mcp,卡片位于 /.well-known/mcp/server-card.jsonMCP Streamable HTTP;服务器卡片是一份草案提案
A2A 智能体/a2a,卡片位于 /.well-known/agent-card.jsonA2A 1.0,JSON-RPC
JSON 端点/agent/services.json,以 OpenAPI 描述普通 HTTP
API 目录/.well-known/api-catalogRFC 9727,IETF 标准轨道

每个 HTML 和 markdown 响应都会发送一个 Link 头,指向该目录、智能体技能索引以及两张卡片,因此从任何页面都能找到其余内容。

我们愿意重复采用的设计原则

  • 只读且公开。MCP 工具声明了 readOnlyHint: true,读取的是与 HTML 相同的已发布目录,背后没有数据库。get_project_brief 不会提交、预约或报价;由人来审阅并发送。
  • 限定输入。请求正文上限为 8 KiB,会检查浏览器的 Origin 头(MCP 规范要求如此),调用还有单独的速率限制。
  • 无状态。A2A 智能体即时作答,不保留任务,关闭了流式传输,也不会获取发送给它的文件或网址。
  • 条款清晰。/auth.md 说明无需任何凭据,并且读取公开数据并不代表获得授权去发送消息或付款。

我们也有所取舍。就绪度扫描工具会检查商务协议和 OAuth 发现。我们不通过结账流程销售任何东西,也不保护任何资源,所以发布这些内容只会描述并不存在的能力。

目前谁在使用这些工具:有人连接到 /mcp 的 MCP 客户端,以及拿到我们卡片的 A2A 客户端。对一家工作室来说,价值有限:对“Dardo 做什么,我该发给他们什么?”给出准确的回答。对于拥有人们会询问的实时数据的网站,例如库存、可用情况或产品文档,这种做法更有价值。会写入数据的智能体需要身份验证和审核环节,那属于 AI 自动化的工作。

WebMCP:浏览器内的同一套工具

WebMCP 允许页面注册工具,供浏览器中的 AI 智能体调用。它是 W3C Web Machine Learning 社区组的社区组报告草案,并声明它不是 W3C 标准。web.dev 表示它正处于积极开发中,可能会变化,可以在 Chrome 中通过源试用(origin trial)进行体验。

我们的页面通过 document.modelContext(旧版预览中为 navigator.modelContext)注册同样的两个工具。没有这个 API,浏览器不会额外运行任何内容。由于这些工具本来就存在,这部分只用了大约 40 行代码。请把它当作一次实验。

每一层,以及它是否值得做

层级是什么目前谁在读取值得做吗?
语义化 HTML 与带标签的表单真正的按钮、链接、页面地标和标签浏览器、辅助技术和浏览器智能体值得。优先做好
面向搜索和用户代理的 robots.txt按爬虫分别设置规则,区分搜索与训练OpenAI、Anthropic、Perplexity 和 Google 都公开了各自的标识值得。然后在 CDN 层测试
Content Signals在 robots.txt 中设置 search、ai-input、ai-train 偏好我们查证过的 AI 公司,都没有公开说明会遵守只需一行。但别抱期望
带规范标头的 Markdown 副本每个页面的干净纯文本版本会请求 Markdown 的智能体;没有公开的名单说明具体是哪些值得,但要加上规范标头
llms.txt 和 llms-full.txt为智能体准备的精选索引和完整文本Google 搜索会忽略它;没有爬虫文档声称会读取它如果是自动生成的就保留。它不是提升可见度的手段
MCP 服务器(只读)声明好、可供智能体调用的工具由用户自行连接的 MCP 客户端仅当有值得调用的数据或操作时
A2A 智能体卡片对智能体的机器可读描述指向它的 A2A 客户端对大多数网站来说只是推测
API 目录(RFC 9727)一份集中列出你的公开 API 的 well-known 清单会查找它的工具如果已有 API,成本很低
WebMCP页面在浏览器中注册的工具Chrome,通过 origin trial实验性

我们还会再做的事

按顺序:语义化 HTML、经过测试的爬虫访问、带规范标头的 Markdown 副本、自动生成的 llms.txt,以及只在有值得调用的内容时才提供工具。然后进行衡量。服务器日志会显示哪些智能体抓取了 Markdown 副本或调用了 /mcp。抓取不等于引用,以上这些都不能保证AI 系统会提到你。

智能体就绪是我们AI 搜索优化工作的一部分,同时还包括决定 AI 回答是否引用你的内容与衡量工作。想把它融入你的网站,请告诉我们你的项目。