如何让网站为 AI 智能体做好准备
发布:
「为 AI 智能体做好准备」对三种不同类型的 AI 智能体意味着三件不同的事——而且它们可以叠加使用。以下是我们让本验证器做好准备的完整过程,包含我们发布的代码,供你直接复用这一模式。
共有三个独立层级。你可以单独采用其中任何一个;合在一起,它们涵盖了:爬取你网站的爬虫智能体、在浏览器中操作你界面的智能体,以及通过网络调用你服务的另一个智能体。
第一层 — llms.txt:为爬虫提供上下文
这是基础层。在你的根目录放一个纯文本 llms.txt,按优先级顺序告诉 AI 爬虫你的网站是什么以及哪些页面重要。它在抓取时被读取——无需 JavaScript,无需任何协议。从这里开始:如何创建一个 llms.txt。
第二层 — WebMCP:为浏览器内智能体提供工具
WebMCP 让页面向运行在浏览器内的 AI 智能体暴露可调用的工具,从而让智能体调用一个有类型的动作,而不是猜测你的表单。有两种方式,我们两种都使用。
声明式 — 为真实的表单添加注解,由浏览器从中合成一个工具:
<form toolname="open_llms_txt_report"
tooldescription="Validate a site's llms.txt and open its report.">
<input name="url" toolparamdescription="Domain or URL to validate">
</form>
命令式 — 在 JavaScript 中注册一个直接返回结构化数据的工具:
navigator.modelContext?.registerTool({
name: "validate_llms_txt",
description: "Validate a website's llms.txt; returns a 0-100 score and findings.",
inputSchema: { type: "object", properties: { url: { type: "string" } }, required: ["url"] },
execute: (input) => fetch("/api/validate?url=" + encodeURIComponent(input.url))
.then(r => r.json())
.then(data => ({ content: [{ type: "text", text: JSON.stringify(data) }] }))
});
用 if (navigator.modelContext) 保护命令式调用,这样在不支持 WebMCP 的环境中它就是一个空操作。目前它是 Chrome 的源试验功能,实际覆盖率很低——将其视为前瞻性信号,而非流量来源。
第三层 — A2A:可被其他智能体调用的智能体
Agent2Agent(A2A)协议让其他智能体能够发现并调用你的服务。你需要发布一个智能体卡片,并用一个 JSON-RPC 端点来支撑它:
// GET /.well-known/agent-card.json
{
"name": "llms.txt Validator",
"url": "https://llms-txt-validator.dev/a2a",
"skills": [{ "id": "validate_llms_txt", "name": "Validate llms.txt" }]
}
url 必须指向一个能够处理 A2A 请求的有效端点——我们实现了同步的 message/send 方法,将相同的验证逻辑封装为一个技能。智能体卡片是一份契约,而非一个元标签。
唯一的原则:不要发布你无法兑现的信号
放一个空的智能体卡片或伪造表单注解来让审计变绿,这种做法很诱人。但请不要这样做。一个智能体如果抓取了你的卡片却调用到死端点,或者调用了一个什么都不做的工具,之后它对你的信任度只会下降。这里的每一个信号都应该能解析到真实可用的功能。这正是为什么本验证器只有在有真实实现作为支撑时,才会将 WebMCP 或 A2A 信号报告为「已存在」。
如何验证每个层级
- llms.txt — 将你的域名粘贴到验证器中;目标是 100/100 且无断链。
- WebMCP — 在 Chrome 149+ 中,启用
chrome://flags/#enable-webmcp-testing,然后运行 Lighthouse 的 Agentic Browsing 审计;你的工具应当被列出。 - A2A — 获取你的
/.well-known/agent-card.json,然后向其urlPOST 一个message/send调用,确认你能收到一个已完成的任务响应。