01架构
五层,一张连接它们的卡片
伙伴在多个层面遇见网站,每层回答不同的问题。agents.json 是顶部的单张卡片,指向所有这些层面,因此无需猜测。
内容
页面本身——编写一次,作为 HTML 供读者使用,作为 Markdown 供机器使用。
发现
指示起点的标识:网站地图、llms.txt、指向两者的标头。
语义
赋予事实含义 — 页面中的 JSON-LD、Markdown 中的 frontmatter。
操作
可以立即在访问者已打开的浏览器中完成的操作:WebMCP 页面工具。
远程功能
服务可从任何位置执行的操作:OAuth 后的 MCP 端点。
agents.json
能力卡片:您发布了什么、暴露了哪些接口、如何登录,以及可以联系哪位负责人。
02评分
六个部分共一百分
每个层级按读者识别的部分进行评级。在一个部分中,要求占权重的大部分,辅助诊断占其余部分。
| 层级 | 部分 | 它问什么 | 分数 |
|---|---|---|---|
| 发现 | 发现 | AI 代理能否发现您的内容? | 15 |
| 语义 | 理解 | 代理能否正确理解您的业务? | 15 |
| 内容 | 阅读 | 代理能否高效地使用您的内容? | 20 |
| 操作 | 行动 | 代理能否在您的网站上执行操作? | 20 |
| 远程功能 | 连接 | 外部代理能否调用您的系统? | 20 |
| 安全 | 信任 | 代理能否进行身份验证、确认操作并联系到人工? | 10 |
| 总分 | 100 | ||
最后一行评级上方数据未涉及的一个关注点:谁被允许采取行动,以及访客在没人应该接触时如何联系到人。
无法适用于您的检查项不计入分母,而不是扣分——当服务的每个工具都已对所有人开放时,就不需要提供登录发现。
8 个35 项检查是尚未达成共识的惯例。无论发现还是否则,价值都为零:发现时报告,缺失时不扣分。
03要求
网站必须满足的十项要求
十条条款决定了网站是否已就绪。扫描报告的其他所有内容都是诊断信息——有用的、有根据的,但不会是就绪和未就绪之间的分界线。
内容
- R1
- 重要内容呈现在初始 HTML 中。
- R2
- 页面可以公开其自身的 Markdown 表示。
发现
- R3
- 网站发布站点地图。
- R4
- 该网站发布 llms.txt。
- R5
- 该网站发布机器可读的能力清单。
语义
- R6
- 页面声明其语言和规范 URL。
- R7
- 该网站发布结构化的商业或产品元数据。
操作
- R8
- 页面提供任何操作时需声明网络操作。
- R9
- 服务提供任何工具或 API 时需声明后端伙伴工具或 API。
安全
- R10
- 身份验证、授权和人工移交是明确的。
第九条接受任何诚实的答案——一个实时 MCP 端点、一份 OpenAPI 文档、一个 GraphQL 架构或能力卡中命名的接口。拥有其中之一才是关键,而不是哪一个。
最后一条条款被证明了两次:一个伙伴可以转交访客的人,以及一份关于谁可以做什么的声明立场。
04一个地址
同一链接,以调用方所需的任何形式
读者打开页面就看到页面内容。机器通过一个请求标头请求纯文本就获得纯文本。不会分出第二个网站。
提问即得 Markdown
一个请求如果带有 Accept: text/markdown 标头,将返回 200 状态码和 Content-Type: text/markdown; charset=utf-8;其他所有请求都返回未修改的 HTML。
Vary: Accept,每次都要
响应会注明塑造它的请求标头,这样中间的缓存会将两种形式区分开来,而不是都返回其中一种。
随行携带的 Frontmatter
Markdown 开头包含其规范地址、最后修改日期和使用的语言——这些在正文之前就已确定。
指向明确的链接标头
一个标头通过 llms.txt 描述网站,一个提供 agents.json 作为备选方案,另一个提供页面自身的 Markdown 备选方案;HTML 头部也重复该标头。它们一起区分了一个碰巧存在的文件和一个有意让人阅读的网站。
GET /pricing HTTP/1.1
Host: yourwebsite.com
Accept: text/markdown
HTTP/1.1 200 OK
Content-Type: text/markdown; charset=utf-8
Vary: Accept
Link: </llms.txt>; rel="describedby"; type="text/plain"
Link: </agents.json>; rel="alternate"; type="application/json"
Link: </pricing/md>; rel="alternate"; type="text/markdown"
---
title: Pricing
description: What each plan includes and what it costs.
canonical: https://yourwebsite.com/pricing
updated: 2026-09-15
language: en
---
# Pricing这里没有 AI URLs。/md 后缀可能以无声备选方案的形式存在在页面后面,供无法进行内容协商的客户端使用,但永远不会被公布也不是规范形式——人们分享的就是代理获取的内容。
05证据
每一项裁定都有据可查
没有支持数据的分数只是观点。每个检查保留三行:它发出的请求、本文档期望的答案,以及实际得到的答案。
check: markdown_representation
request: GET https://yourwebsite.com/pricing
Accept: text/markdown
expected: text/markdown with Vary: Accept
received: 200 text/html; charset=utf-8 — no Vary header
status: fail
weight: 5
earned: 0仅记录改变答案的标头,凭证永不记录。
check: mcp_transport
endpoint: https://yourwebsite.com/mcp
transport: streamable-http
protocol:
offered: 2025-06-18
returned: 2025-03-26
negotiated: 2025-03-26
initialize: true
toolsList: true
auth:
mode: oauth
oauthMetadata: true
metadataUrl: https://yourwebsite.com/.well-known/oauth-authorization-server
pkce: [S256]
dynamicRegistration: true # optional either way
requirementsDocumentedAt: the capability manifest
tools:
listedWithoutToken: 7 # listed, not usable
authenticated: null # we never sign in to your server
withReadOnlyHint: 7
executionTested: false # so the execution check stays UNVERIFIED
status: pass远程接口记录更多信息:它的位置、识别的传输方式、如何通告登录方式,以及有多少工具在无令牌情况下能够响应,而有多少需要令牌。
当没有人登录计数时,经过身份验证的计数显示为未知,而不是零。
06判定
检查可以落地的四种方式
每一个都是对网站所有者的不同陈述,所以它们都不会合并为另一个。
- 通过
条款所要求的内容已经返回。
- 部分
部分内容已就位;收据指出了不完整的一半。
- 可选
一项未确定的约定,记录为已找到或不存在,在任何一个方向上都不计分。
- 失败
要求了,但什么都没有。
无法检查永远不是通过
一个拒绝、一个超时、一个永远无法完成的重定向:探针保留了其权重并单独列出。读者随后可以将缺失的功能与未回答的问题区分开来,没有间隙会被悄悄评分为成功。
07有什么改变
版本 1.2
对我们自己的一份实时报告进行的外部审计发现了得分比证据更有信心的地方,也发现了对网站因做正确的事而扣分的地方。下面的每个发现都是一条移动的规则,因此您在此版本之前阅读的报告可能会得到不同的得分——而且应该如此。
找到功能不等于被允许使用它
不需要令牌即可应答的工具目录告诉您这些工具已被列出。它不会告诉您其中任何一个会为您今天运行。版本 1 将这些合并为一个判决,并为第一个给予满分。现在它们是四个独立的发现:
- 发现——端点应答、协商协议版本并列出其工具。
- 文档化访问——服务声明哪些功能需要令牌,哪些不需要。
- 登录发现——OAuth 元数据解析,并在客户端必须验证时宣传 PKCE。
- 已测试的执行——经过身份验证的调用实际上成功。
只有前三个可以从外部测量。第四个在此扫描器编写的每份报告上保持未验证:它不为您的服务持有凭证,也从不调用陌生的工具。这些分数单独报告,永不计为通过,也永不归咎于您。
一个结果,三种形式
页面、Markdown 和 JSON 现在呈现相同的结果对象——相同的扫描、相同的状态、相同的总计。它们以前可能彼此不同。
无完美连接分数
身份验证执行从不在外部进行测试,因此其分数对每个网站(包括我们的)都保持未验证状态。报告不能再基于没有的证据声称服务完全可调用。
版本感知探测
报告记录它提供了什么、您的服务器如何应答以及原始握手。后续版本引入的功能永远不会被用来评判固定在早期版本上的会话。
提示不是行为
有多少个工具声明只读提示会单独报告且不计分。代理在执行重要操作前是否真正被询问需要工作流测试来验证。
三种爬虫
模型训练、AI 搜索和引用,以及人工要求助手打开的页面是三个决策。只有后两个属于发现。选择不参与训练不需要任何成本。
默认就是一项政策
页面工具没有 permissions-policy 条目意味着草稿的默认允许列表适用——您自己的源,没有其他人。这是通过的。显式允许列表是在其基础上的加固。
每种类型的正确字段
对定义了最后修改日期的内容类型进行查询,不对代表您身份的节点进行查询。身份和新鲜度分别评分。
发现结果标明其范围
从一个页面读取的结果会说明这一点,扫描实际读取的路由与报告一起传输。在主页上测量的任何内容都不会被写成好像描述了每个屏幕。
孪生体必须与自身一致
在众所周知的路径和根路径上发布的能力清单现在被检查为在两个位置说的是同一件事——而不仅仅是检查一份副本是否存在。
网站地图必须是真实文档
网站地图现在被检查为是否是真实的 urlset 或 sitemapindex,其链接指向您自己的地址,而不仅仅是检查是否返回 200。
转接联系人无需抓取
mailto 链接、联系页面、结构化联系数据或 llms.txt 中声明的联系方式现在都可以计为到达人工的方式——它们都不需要事先进行任何爬取。
报告是根据此标准(版本 1.2)的得分——一份您可以采取行动的诊断,而非认证也非符合性徽章。规则已发布在此,以便您可以对它们提出异议。