- What's the measure?
There is one
robots.txtvalid and it does not prevent access to content.- How to implement
A text file at the root, with at least one group
User-agentand the DirectiveSitemappointing to the absolute index.- In this project
/robots. txt — versioned on
public/robots.txt, served as it is.- How to validate
curl -s https://seu-site/robots.txt
Agent Web · Web Standards
How to Make a Website Agent-Ready — and what 100 in the IsItAgentReady really proves
Agent Readiness is not a list of files in /.well-known/. It's treating the agent.
as a third-class consumer — who arrives without session, without layout and without
context — and publish by machine reading, what exists,
in which format, under which rules and
with which credential.
Measured in 7 September 2026 against
mauricio.issei.com.br by the API of
IsItAgentReady.
This score is static and dated on purpose: a page that consults an appraiser
external in loading time exchanges a verifiable statement for a dependency
third party. Play yourself — the command is in
How to Test Your Website.
01 · The Problem
The Web was built for humans and searchers
The Web was originally built for humans and search engines. Now so is she. needs to be understandable, discoverable and usable by AI agents.
The third consumer arrived without an invitation
A browser asks for HTML and knows what to do with it: apply CSS, run JavaScript, show
a page. A search crawler asks for the same HTML and extracts an index from it. They both were.
provided by web architecture and have contracts published for decades —
Content-Type, robots.txt, sitemap.xml,
structured data.
The agent arrives without any of that. He has no session, he doesn't render layout, he doesn't have the context that a human accumulated browsing other pages of the site, and operates within one finite context budget — each token spent reading marking is one Token that is not left to reason. When he asks for the only thing the site knows serve, receive a full application page.
The cost of this is measurable. Page Vibe Coding with Devin this site responds 197 KB HTML for a browser. The same content, in Markdown, 3,7 KB. They are. 52 times minus bytes to get exactly the same text — and no layout line to untangle.
What an agent can't do on your website today
Without a surface published to him, there are four questions the agent cannot answer:
- What resources are there here? He guesses ways or he gives up.
- What format can I read in? It parseates HTML application and twists.
- What can I do with this content? Index? Quote? Training? No one did.
- How do I invoke an action? There is no contract — just finger forms.
Each of these questions today has an open pattern that answers it. Agent Readiness is implement them so that the agent can find the answer without a guess.
02 · Concept
What Agent Readiness is
Operational definition
Agent Readiness is the property of a website whose public surface is designed to be consumed by autonomous software: resources are discoverable by explicit mechanism, the content is delivered in the format the agent asks for, the rules of use are declared legibly by machine, and the available actions are published as Invocable contracts.
The term gained practical contour with the announcement of Cloudflare Agent Readiness, who organized scattered patterns — some with RFC, others still in draft — in a verifiable set, and published the IsItAgentReady as an instrument of measurement.
The five properties
Each property answers a question the agent asks before acting:
| Property | Officer's question | Where the answer lives |
|---|---|---|
| Discoverable | What's going on here? | DNS, header Link, robots.txt, sitemap.xml |
| Readable | What format do I read? | Content Negotiation (Accept), Markdown, JSON |
| Controllable | What can I do with this? | Rules for AI bots, Content Signals |
| Callable | How do I summon something? | API Catalog, MCP, A2A, Agent Skills, WebMCP, OAuth |
| Payable | How do I pay if there's something to pay? | Agentic payment protocols (out of scope here) |
What Agent Readiness is Not
- It's not blocking AI crawler. Blocking is a policy decision that the surface allows express. A site that blocks everything, and declares it legibly, is more agent-ready than one that says nothing.
- Not to publish
llms.txtAnd consider it settled. A text index helps read; it does not solve discovery, format, rule of use or invocation. - Not to create files in
/.well-known/the kick. Every document there is a contract. Publishing a contract that nobody honors is worse than not publishing anything — the agent trusts what you have stated. - It's not SEO with another name. The difference is in the next section.
03 · Evolution
HTML → SEO → AEO → Agent Readiness
Each wave of the Web added a consumer and, with it, a new contract. None replaced the previous one: one site in 2026 serves the four at the same time.
| Layer | Consumer | What he reads | What breaks if you're missing |
|---|---|---|---|
| HTML | Human with browser | Marking, CSS, JavaScript | Page not usable |
| SEO | Search Crawler | robots.txt, sitemap.xml, <title>, canonical |
Page not found |
| AEO | Response engine | Structured data, direct response, FAQ | The page is read but not quoted |
| Agent Readiness | Autonomous agent | Explicit discovery, negotiated format, rule of use, invocable contract | The page is quoted, but nothing in it can be used |
AEO optimizes the quote. Agent Readiness enables action. They are objectives different: one wants the machine to repeat you correctly; the other wants it to do Something you published.
That's why the border between the two is technical, not rhetorical. Structured data says What one thing is; a tool contract says What can be done with She, with what entrance and under which permission — the same border design discussed ed AI Agent Engineering, where MCP appears as the agent's safety limit.
04 · Context
Before continuing: the video problem
You just accepted that there is a fourth Web consumer. The intuition of why this changes the architecture of a site, and not just its contents. O video below covers this question in narrative format; the rest of this page covers the implementation. If the intuition is already formed, jump straight to the five-layer architecture — nothing that comes after depends to watch.
What to Watch Carefully
- The distinction between be accessible to a bot and be designed for an agent — is the axis of From Zero to Agent-Native.
- Why the delivery format matters as much as the content — developed in Content Accessibility.
- Why declare rule of use is business decision, not technical detail — developed in Bot Access Control.
05 · Architecture
The five-layer architecture
The structural decision of this site was to publish the agnettic surface in five layers
independent of each other. None depends on the other, and the agent enters by
any one: who solves DNS before opening connection finds the site; who makes a
GET anyone gets the header Link; whoever follows convention goes
direct to /.well-known/.
Why deliberate redundancy, and not a single layer
Because there is no agent. There are many, with unequal implementations: some only
Do GET and read headers; others know /.well-known/; few
consult DNS before opening connection. Betting on a single layer is betting on a profile
from a client you don't control.
Redundancy is also the reason the marginal cost is low. The five layers describe o same resources by different paths — publishing a new resource costs one entry in each index, not a new architecture.
| Layer | Where you live | Discovered by | Operating cost |
|---|---|---|---|
| DNS | Records HTTPS/SVCB under _agents. |
DNS resolution, before any HTTP | Zone DNS + DNSSEC |
| HTTP Header | Header Link in the CDN response |
Any request to the site | Headers policy on CDN |
| Well-known | Static files in public/.well-known/ |
Road Convention (RFC 8615) | File versioned in repository |
| Auth | auth.md + OAuth metadata |
Header Link and /.well-known/ | Versioned File |
| Runtime | navigator.modelContext on page |
Agent running within browser | Script on page |
06 · The score, untangled
Score categories, one by one
IsItAgentReady evaluates 22 checks in five categories. What follows is not the list of checks — is the principle that each category measures, the pattern that solves it, how to implement, how it is implemented here and how you check without believing in No one.
Precision note: the interface of the evaluator groups the category of discovery as
8/8, while the JSON answer lists nine entries in
checks.discovery — the ninth (ard) appears in another aggregation of
interface. The nine are described below; the total of 22 and the count 16/0/6 do not change.
6.1 Discoverability — the agent needs to know what exists
Discoverability is not having a sitemap. It's giving it to the agent. explicit mechanisms to find out what resources there are and how to get to them — in at least two layers independent, because you don't control which one the client knows.
- What's the measure?
There is one
sitemap.xmlreachable, with absolute URLs.- The principle
The sitemap is the inventory of what you either to be consumed. The list of exclusions is as important as that of inclusions: administrative area, test pages and internal utilities are not invitations.
- In this project
Generated in build by
vite-plugin-sitemap, with explicit list of exclusions invite.config.js. Never handwritten — a manually maintained sitemap differs from the site on the new front page.- How to validate
curl -sI https://seu-site/sitemap.xmlyou must respond200andapplication/xml.
- What's the measure?
The site announces related features in HTTP headerNot just in the body of the document.
- The principle
-
This is the cheapest layer for the agent and the most ignored by the implementer. One
HEADin any URL already delivers the map: no download of page, no HTML parser, no convention to guess. It's also the only layer that works for features that are not HTML. - In this project
-
Seven relationships in every response, applied by a leader policy in the CDN — I mean, outside the repository. If your website runs in Vercel, Netlify, nginx or Cloudflare, the recipe is that of your stack; the content is the same.
link: </.well-known/api-catalog>; rel="api-catalog",
</.well-known/ai-catalog.json>; rel="service-desc"; type="application/json",
</llms.txt>; rel="service-doc"; type="text/plain",
</llms-full.txt>; rel="describedby"; type="text/plain",
</cv-for-ai.md>; rel="service-doc"; type="text/markdown",
</cv.json>; rel="describedby"; type="application/json",
</.well-known/oauth-protected-resource>; rel="oauth-protected-resource"
vary: Accept
- How to validate
-
Generic example shell
curl -sI https://seu-site/ | grep -i '^link\|^vary'
- What's the measure?
The domain publishes DNS records that point to agentic entry points — and the response is validated by DNSSEC.
- The principle
-
Discovered before the first HTTP package. An agent who solves
_index._agents.domain already knows where to search without loading Nothing. And here's a rule that documentation implies: No DNSSEC validation does not pass. The record published without a chain of trust is, for the evaluator, a record that any solver on the way could have I made it up. - In this project
Three names (
_index,_mcp,_a2a) under_agents., with the area signed. Publication script lives inscripts/setup-dns-aid-route53.shand the operation indocs/DNS_AID_SETUP.md.
curl -s -H 'accept: application/dns-json' \
'https://cloudflare-dns.com/dns-query?name=_index._agents.seu-site&type=HTTPS&do=1'
AD: true It's the authenticated answer. If you come false, a
DNSSEC chain does not close — and no record adjustment solves this.
6.2 Content Accessibility — Agent Needs to Read Without Parse layout
Content accessibility is not having files .md. Yeah. respond in format
that the client requested — in the same URL, without requiring it to know a path
alternative — and fit in the context budget of it.
- What's the measure?
A request with
Accept: text/markdownreceives Markdown; a browser receives HTML. Same URL, different formats.- The principle
-
Content negotiation is a 1996 mechanism that almost nobody used, and it is Just what the agent needs. The common alternative — publish
/pagina.mdas separate URL — works, but forces the agent to guess convention and fragment resource identity: two URLs for the same content, two canonical, two places to outdate. - How to implement
-
A function at the edge of the CDN inspects the header
Acceptand rewrites Way. Two traps: compare quality valuesq(a browser sendstext/html,…,*/*;q=0.8and no can receive Markdown), and issueVary: Accept— without it the CDN delivers the wrong cached version to the wrong client. - In this project
infra/cloudfront-functions/viewer-request.js, with the companies.mdgenerated inpublic/by the same pipeline that generates the metadata.
function prefersMarkdown(acceptHeader) {
if (!acceptHeader) return false;
var markdownQ = -1;
var htmlQ = -1;
acceptHeader.split(',').forEach(function (part) {
var tokens = part.trim().split(';');
var type = tokens[0].trim().toLowerCase();
var q = 1.0;
for (var i = 1; i < tokens.length; i++) {
var param = tokens[i].trim();
if (param.indexOf('q=') === 0) {
var parsed = parseFloat(param.slice(2));
q = isNaN(parsed) ? 0 : parsed;
break;
}
}
if (type === 'text/markdown') {
markdownQ = q;
} else if (type === 'text/html') {
if (q > htmlQ) htmlQ = q;
}
});
return markdownQ > 0 && markdownQ >= htmlQ;
}
- How to validate
-
Generic example both sides of the negotiation need to be tested.
# o agente pede Markdown → deve receber text/markdown curl -s -H 'Accept: text/markdown' -o /dev/null \ -w '%{content_type}\n' https://seu-site/pagina # o navegador NÃO pode receber Markdown → deve receber text/html curl -s -H 'Accept: text/html,application/xhtml+xml,*/*;q=0.8' -o /dev/null \ -w '%{content_type}\n' https://seu-site/pagina
This document responds to the same negotiation: /agent-ready. md is the same content without layout.
6.3 Bot Access Control — the agent needs to know what he can do with the content
Bot access control is not blocking. Yeah. declare the rule of use legibly by host — index yes, train no, answer yes — so that the agent respecting rules know yours, without inferring from terms of use written for lawyers.
- What's the measure?
If
robots.txttreats AI bots — by specific rule or by a joker that reaches them.- Honest Reading
-
Check here with the message "No AI-specific bot rules; wildcard rules apply to all crawlers including AI bots". That means he passes. for absence of blockage, not for the presence of a rule. Understand this difference is worth more than celebrating the green — if your policy is to be different by agent, you need to write it; the joker doesn't decide anything for you.
- In this project
User-agent: *withAllow: /, and exclusions restricted to internal directories.
- What's the measure?
Presence of the Directive
Content-Signalinrobots.txt, declaring the permitted uses of the content.- The principle
-
robots.txtresponds if the bot can fetch. Content Signals responds what he can do after he's searched — three decisions independent: appear in search, be used as source of response, be used to train model. They are different questions and deserve different answers. - In this project
Index yes, serve as input for yes answer, train no.
User-agent: *
Allow: /
Content-Signal: ai-train=no, search=yes, ai-input=yes
Sitemap: https://mauricio.issei.com.br/sitemap.xml
Agentmap: https://mauricio.issei.com.br/.well-known/ai-catalog.json
LLMs: https://mauricio.issei.com.br/llms.txt
LLMs-full: https://mauricio.issei.com.br/llms-full.txt
- What's the measure?
Whether the site publishes a key directory that allows checking cryptographically the identity of a bot by HTTP message signature.
- The principle
-
O
User-Agentis a string that any client writes. Web Bot Auth replaces statement by proof: bot signs request, and site validates against the published key. It's the difference between say who is a known agent and demonstrate It is. - State here
-
Neutral — not implemented. Makes sense to the needy distinguish legitimate bot from copycat and apply different policy to each. For a public content site, whose Content Signal is already the same for everyone, Doesn't change any decisions. A neutral check does not penalize the note — and it is precisely That's why he doesn't vouch for anything. View the score limits.
6.4 API, Auth, MCP & Skill Discovery — the agent must be able to act
Protocol discovery is not publishing JSON in /.well-known/. Is to publish a
contract that someone can invoke — with typed entry, permission
declared and documentation achievable from the contract itself.
This is the densest category: nine documents, each answering a question different about action. The table summarizes; the cards detail those requiring decision.
| Check | Default | Question you answer | In this project |
|---|---|---|---|
apiCatalog |
RFC 9727 | Which APIs exist and where is the specification of each? | /.well-known/api-catalog |
ard | Agent Resource Description | What resources are legible by agent with a stable identifier? | /.well-known/ai-catalog.json |
oauthDiscovery |
RFC 8414 | Who issues credentials for this appeal? | /.well-known/openid-configuration |
oauthProtectedResource |
RFC 9728 | What scope does this resource require and where is politics? | /.well-known/oauth-protected-resource |
authMd | auth.md | How does an agent authenticate here, in prose he can follow? | /auth.md |
mcpServerCard |
MCP | What tools and resources does this domain display by MCP? | /.well-known/mcp/server-card.json |
a2aAgentCard |
A2A | What skills does this domain offer other agents? | /.well-known/agent-card.json |
agentSkills |
Agent Skills | What reusable procedures can I carry from here? | /.well-known/agent-kills/index.json |
webMcp |
WebMCP | What actions can I perform without leaving the page? | src/index.html |
- The principle
-
One linkset: for each resource (
anchor), which links typed people exist. A machine-readable specification (service-desc), prose documentation (service-doc), the state (status). The agent finds out API and how to understand it in a single request.
{
"linkset": [
{
"anchor": "https://seu-site/dados.json",
"service-desc": [
{ "href": "https://seu-site/openapi.json",
"type": "application/openapi+json;version=3.0" }
],
"service-doc": [
{ "href": "https://seu-site/dados.md", "type": "text/markdown" }
]
}
]
}
- The principle
-
Agent authentication has two faces. A host needs metadata: which authorization server, which scopes, where is the policy of privacy. O agent need instructions in prose —
auth.mdis literally this: a Markdown document describing the flow, to be read by those who reason in natural language.It goes for anonymous access, too. "No credentials are required, and these are the available scopes" is a useful statement — prevents the agent from trying a flow that doesn't exist.
{
"resource": "https://mauricio.issei.com.br",
"authorization_servers": ["https://mauricio.issei.com.br"],
"scopes_supported": ["cv:read", "projects:read", "profile"],
"bearer_methods_supported": ["header"],
"resource_documentation": "https://mauricio.issei.com.br/cv-for-ai.md",
"resource_policy_uri": "https://mauricio.issei.com.br/privacidade"
}
The authorization document of this website declares anonymous identity explicitly.
The exact format — and why it cost three iterations of deploy — is in
the case of agent_auth.
- The principle
-
One skill It is a procedure, not given: "how to make X in this domain", written to be loaded in the context of an agent. The index points to each
SKILL.mdand brings the digest SHA-256 file — Agent checks that he carried what the index promised, not something exchanged in Way. Instruction entering the context of a model is the surface of attack; digest is what makes it verifiable. - In this project
Two skills — conventions from this repository and access to structured curriculum data — each with digest.
{
"$schema": "https://schemas.agentskills.io/discovery/0.2.0/schema.json",
"skills": [
{
"name": "cv-data-access",
"type": "skill-md",
"description": "How to retrieve and parse structured CV data…",
"url": "https://mauricio.issei.com.br/.well-known/agent-skills/cv-data-access/SKILL.md",
"digest": "sha256:95a3d61a86da45cae9037e0f4f7d41a64a37cc4f2a61567791b95c2f5a2178ec"
}
]
}
- The principle
-
The other eight layers are static: published documents that the agent reads from Out. WebMCP is the only in execution time — the page records tools in the browser, and an agent running in there can invoke them with user session, without intermediate server.
It is proposed in evolution, so the record goes after a test of existence. No
navigator.modelContextNothing happens and the page is identical.
if (typeof navigator.modelContext !== 'undefined') {
const controller = new AbortController();
const signal = controller.signal;
navigator.modelContext.registerTool({
name: 'get_cv_data',
description: 'Retrieve the full structured curriculum vitae in JSON format.',
inputSchema: { type: 'object', properties: {} },
execute: async () => {
const response = await fetch('/cv.json');
return await response.json();
}
}, { signal });
}
6.5 Commerce — Why Five Checks Stay Neutral Here
The five agentic trade checks — machine-to-machine payment, product catalogue for agents, checkout protocols — come marked as neutral: "not a Commercial site." This site doesn't sell anything, so there's no transaction to describe.
The scope decision matters more than the result. Post a payment protocol without to have what to charge is noise in the contract: the agent reads a capacity that does not exist. The rule general applies for all categories — state what you haveThat's all.
07 · Progression
From Zero to Agent-Native
The evaluator summarizes the result at a level of 1 to 5. It is not a sum of files: each step adds one of the five properties of §2and Order matters — there is no point in publishing an invocable contract for an agent who is not yet you can find out the resource exists.
Accessible
The bot can search: answers 200, there is no general block, there is robots.txt. It's the floor -- and that's where most of the sites are undone.
Discoverable
There is an explicit inventory of what the site offers: sitemap, and some way to advertise features beyond HTML pages.
Legible
The content is delivered in a format that the agent can consume with low context cost — content negotiation, or at least structured versions of the main resources.
Ruled
The rules of use are declared by machine: what can be indexed, quoted, used as response input, used to train.
Agent-Native
There are published and undiscoverable invocable contracts — catalogued APIs, declared tools, documented authentication. The agent not only reads: he knows what he can do and how to ask permission.
"Site that a bot can access" "site designed for agents". The first does not block, respond 200 and has sitemap — the agent still needs to guess Everything. In the second, the agent discovers without guessing, reads in the format he asked for, you know the rule of use and finds an invocable contract. The difference is not the amount of files: it is who carries the burden of inference.
08 · Case study
This site, in practice
What follows are the actual implementations of this domain in the format problem → solution → implementation → validation → impact. The impact is always qualitative or a measured count: this site does not instrument agent traffic, then there is no percentage to present — and inventing one would be exactly the type of statement that the page exists to discourage.
The three most useful cases are the ones that went wrong first.
The agent didn't know there were resources beyond the pages.
- Problem
The site published structured data, Markdown curriculum and catalogs — and none of this was announced. An agent who would.
GET /He received an HTML page and no clue that there was more.- Solution
Header
Link(RFC 8288) with seven types of all site response, not just at home.- Implementation
A header policy applied on the edge of the CDN, with
Vary: Accepttogether. Stays out of the repository by nature — it is infrastructure configuration, not file served.- Validation
curl -sI https://mauricio.issei.com.br/ | grep -i '^link'- Impact
The agent discovers the entire surface in a request
HEADNo download page, no convention on the way.
The agent read 197 KB of HTML to extract 3.7 Text KB
- Problem
All content only existed as an application page. An agent paid the full cost of marking, style and script to get to the text.
- Solution
Content negotiation in the same URL:
Accept: text/markdownReturns Companion.md; any other client receives HTML.- Implementation
Edge function (
infra/cloudfront-functions/viewer-request.js) comparing valuesq, more companies.mdgenerated by the same pipeline that produces metadata — never handwritten, not to differ from the page.- Validation
Both sides:
Accept: text/markdown→text/markdown;Acceptbrowser →text/html.- Impact
52 times less bytes for the same content, without a second URL to maintain and without changing anything for browsers.
Markdown trading dropped 21 search index URLs
- Problem
-
Markdown trading was written as a new function on the edge, next to function that already existed to resolve URLs without extension. A cache behavior accepted one function associated by type of event. When associating Markdown, the other came out — and every URL without
.htmlHe went on to answer 404. Twenty-one pages appeared as "Not found" in Search Console: Exactly from the sitemap. - Solution
A unique function, with responsibilities in explicit order: normalize end bar → negotiate Markdown → solve root → suffix
.html.- Implementation
-
Two guards were born from the incident. The first:
/.well-known/Yeah. free suffixing — is a record of names without extension, and suffix.htmlThere would break the whole discovery. The second: the test extension looks at the last segment of the IRU, not the entire IRU — the old test shut down the rule because of any point anywhere in the Way. - Validation
A unit test that evaluates the function in an isolated context, with one case for each URL that Search Console saw fail (
tests/cloudfront-viewer-request.test.js). The test runs on the gate before any deploy.- Impact
The 21 URLs returned to 200 and regression became a test case — which is the only outcome that prevents the incident from happening again.
// `/.well-known/*` é um registro IANA de nomes SEM extensão
// (api-catalog, openid-configuration, oauth-protected-resource…).
// Sufixar `.html` ali quebraria a descoberta por agentes.
if (uri.indexOf('/.well-known/') === 0) {
return request;
}
// O teste antigo era `!uri.includes('.')`, que olhava a URI inteira:
// qualquer ponto em qualquer lugar do caminho desligava a regra.
var lastSegment = uri.slice(uri.lastIndexOf('/') + 1);
if (lastSegment.indexOf('.') === -1) {
request.uri = uri + '.html';
}
The agent didn't know if he could train with the contents.
- Problem
The policy of use existed only in terms of the website — a legal text written for humans that no crawler interprets.
- Solution
One line
Content-Signalinrobots.txt, separating the three decisions: indexing, serving as input for response, training.- Implementation
ai-train=no, search=yes, ai-input=yes— the content can be found and cited; it cannot become a model weight.- Validation
curl -s https://mauricio.issei.com.br/robots.txt | grep Content-Signal- Impact
Politics no longer depends on interpretation. An agent who respects rules now has a rule to respect.
Authentication check failed three times in a row
- Problem
-
Access to this site is anonymous, and the statement of this seemed trivial. It wasn't three. deploys followed failed check, with a generic remediation message that did not It changed between attempts.
- Solution
-
Three unobvious rules, discovered one by one:
- the agent authentication block lives in permission server metadata, not in
auth.md; - the field that points to the prose documentation should refer to the
auth.mdpublished; - The triad that declares anonymous identity needs to be inside block — repeated in the list of methods or at the top of the document, is ignored.
- the agent authentication block lives in permission server metadata, not in
- Implementation
public/.well-known/oauth-authorization-server, with the block in accepted format, andpublic/auth.mddescribing the prose flow.- Validation
A dedicated test (
tests/oauth-discovery.spec.js) checks the shape of the metadata and their presence in the catalogues — the structure that cost three deploys does not regress silently.- Impact
-
In addition to check: the method lesson. The message at the top of the report is fixed by check; The real signal is in the detail of the evidence inside JSON. Each correction revealed the next message from a validator queue while the top text It remained identical. View Read JSON.
Published DNS records and still failing check
- Problem
The three discovery records were in the air and solved it correctly. Check was still red.
- Solution
The evaluator requires the answer to be validated by DNSSEC. Correct registration in unsigned zone does not pass — and no change in registration would solve.
- Implementation
Signature of zone with managed key, and manual publication of the DS record in the domain register — in case of a
.com.br, a form in the Register. br and about four hours of spread.- Validation
DNS query on HTTPS with
do=1: the answer needs to bring"Status": 0and"AD": true. OADIt's the sign that the jail closed.- Impact
-
Check passed — and the entire domain now depends on the signature key. This changes the reversal procedure: to turn off DNSSEC you need to remove DS in register first and wait for full spread before deactivating signature. In reverse order, the domain Entire becomes irresolvable for validating solvers. It's not a detail of operation: is the difference between a reversal and a blackout.
Give agent actions, not just text
- Problem
The whole surface was reading. An agent running inside the user browser had nothing to do Besides scraping the page.
- Solution
Two registered tools via
navigator.modelContext: structured curriculum and project cases.- Implementation
Record conditioned to API existence, with
AbortControllerfor the life cycle. Without browser support, nothing happens.- Validation
The evaluator reports the tools found by name — if the record breaks, the check accuses.
- Impact
The surface now has an execution layer, beyond the four of reading.
09 · Implementation
Tutorial: implement on your website
Eight steps in increasing order of cost. The first four are static files and solve most of the result; the last four require architectural decision. Do it in order: each step presupposes the previous.
Code blocks marked as example general They're for you to copy and adapt. The ones marked as Real code of this site are what is in fact published here, with the file path.
Step 1 Discoverability
Objective: the agent discovers what resources exist without guessing paths.
Prerequisite: None.
Implementation: (a) robots.txt at the root with Sitemap: absolute; (b) sitemap.xml generated by build, never by hand; (c) header Link announcing features that are not pages.
Warning: the header Link requires server or server control
CDN. Not a file you commit — it's platform configuration
(headers in Vercel/Netlify, add_header nginx, nginx rule
Cloudflare transformation, CloudFront header policy). If you don't have that
Control, make the other layers and come back here later.
Link: </.well-known/api-catalog>; rel="api-catalog",
</llms.txt>; rel="service-doc"; type="text/plain"
Vary: Accept
Validation: curl -sI https://seu-site/ | grep -i '^link'
Step 2 Content accessibility
Objective: deliver the content in cheap to consume format.
Prerequisite: Step 1 — the agent needs to know that the resource exists.
Implementation: manages a company .md per page from
from the same source that generates the page. Then make the border inspect Accept and
serve .md when asked. Emite Vary: Accept —
without it, CDN delivers the wrong cache version and someone's browser downloads Markdown.
Acceptable shortcut: If the edge isn't yours, publish
/pagina.md as URL and advertise in header
Link … rel="alternate"; type="text/markdown". Less elegant, that'll do.
Validation: both sides of the negotiation, always — the browser's path is what breaks in silence.
Step 3 Bot access control
Objective: declare by machine what can be done with the content.
Prerequisite: a business decision, not a technical decision. Decide before you write.
Implementation: add Content-Signal ed robots.txt. Three independent axes:
User-agent: *
Allow: /
Content-Signal: ai-train=no, search=yes, ai-input=yes
search = appear in search · ai-input = be used as source of a generated response · ai-train = to be trained.
Validation: curl -s https://seu-site/robots.txt | grep Content-Signal
Step 4 API and protocol discovery
Objective: publish the contract inventory.
Prerequisite: have at least one structured resource — a JSON, an API, a data document.
Implementation: one /.well-known/api-catalog (RFC 9727) with an anchor per resource. If you don't have OpenAPI, point service-doc for Markdown documentation; a catalog with prose documentation is better than no catalog.
Validation: curl -s https://seu-site/.well-known/api-catalog | jq .
Check also the Content-Type answer: objects without file extension tend to exit with the standard type of storage instead of application/linkset+json. The evaluator tolerates; other tools have no reason to tolerate.
Step 5 MCP
Objective: declare the tools and resources that the domain exposes by the Model Context Protocol.
Prerequisite: know what actions you want to offer — and be willing to keep them.
Implementation: one server card ed
/.well-known/mcp/server-card.json, describing name, tools and
resources. Each tool is a function with typed input; each feature is a document
the agent can carry.
Warning, and is the most important tutorial: a card is a description a contract. State exactly what you're ready for sustain — discovery and execution are different things, and the agent trusts what You declared it. View What a score 100 doesn't prove.
Validation: curl -s https://seu-site/.well-known/mcp/server-card.json | jq . — and, for each declared capacity, a test that exercises the ability of truth.
Step 6 Agent Skills
Objective: publish reusable procedure, not just given.
Prerequisite: to have something that repeats and that today lives in someone's head.
Implementation: one SKILL.md by procedure and index.json That list. Post digest SHA-256 of each file: instruction that enters the context of a model needs to be verifiable.
printf 'sha256:%s\n' "$(sha256sum SKILL.md | cut -d' ' -f1)"
Validation: download SKILL.md by the published URL and check the digest — if not beat, the index is old.
Step 7 Authentication and OAuth
Objective: tell the agent how to get permission — even if the answer is "no need".
Prerequisite: knowing what scopes make sense in your domain.
Implementation: (a) /.well-known/oauth-protected-resource
(RFC 9728) with resource, authorization_servers,
scopes_supported and policy; auth.md describing the
prose flow for the agent read; (c) metadata from the authorization server
(RFC 8414), declaring the accepted types of identity.
If the access is anonymous, say it explicitly. Declaring identity anonymous is more useful than omitting — prevents the agent from trying a nonexistent flow. And declare only the respondent endpoints: consent metadata is contract, no form to be completed.
Validation: an automated test on the form of the document. This is the easiest part of the surface to break by manual editing.
Step 8 Advanced: DNS, runtime and bot identity
Objective: layers that require evolving infrastructure or APIs.
DNS-AID: records HTTPS/SVCB under _agents. of yours
domain. Requires DNSSEC — and signing the area makes the signature key
a single point of failure of the entire domain. Before enabling, write the
reverse procedure: remove DS in register, wait for propagation
complete and only then disable the signature. In that order.
WebMCP: register tools in
navigator.modelContextAlways behind a test of existence. Yeah.
evolving proposal; the code needs to degrade in silence.
Web Bot Auth: publish a key directory so that agents can prove identity by signature. Worth when you need to treat bots in shape different from each other — if your policy is the same for everyone, it changes nothing.
10 · Validation
How to Test Your Website
Rotate scan
By the interface of IsItAgentReady, or directly through the API — which is what you want when you are iterating:
curl -s -X POST https://isitagentready.com/api/scan \
-H 'content-type: application/json' \
-d '{"url":"https://seu-site"}' > scan.json
Read JSON: where is the real sign
This is the part that saves hours. The remediation text displayed in the interface is fixed by check: it is identical on every site that fails that check and doesn't change between your attempts. Correction based on it is trying to hit in the dark.
The real signal is in the detail of the evidence inside JSON. Each failed check It usually goes through a line of validators, and the evidence points out which of them failed — so that each correction reveals the next message, while the top text It stays the same. Reading JSON is what turns "not passed" into "missed this field here."
jq '[.checks | to_entries[] | .value | to_entries[]
| select(.value.status != "pass")
| { check: .key, status: .value.status,
evidence: (.value.evidence // []) }]' scan.json
The cycle fix → publish → rescan
- Correct one Check at a time. Two fixes on the same deploy and you don't know which one worked.
- Publish. A scan turns against productionNot against your repository.
- Rescan and read the evidence, not the remediation text.
- When you pass, write the test. A check you passed without a test is a check you're going to regress.
Check what's in the air, not what's in the repository. The more error common diagnosis on this journey is to look at the local file, see it correct, and complete that the appraiser is wrong — when the deploy simply hasn't left, or the cache the border still serves the previous version.
In this repository this discipline is automated: structure checks, tests unitary edge function, site coherence audit and browser suite with axe rotate in a single gate before any push. The result of the external evaluator is the Final confirmation, not the control mechanism.
11 · Limits
What a score 100 doesn't prove
This is the section that justifies the page to exist. A round number invites you to stop think; his value is entirely in knowing what he measures.
Discovery Metadata is not runtime
Discovery checks validate documents: file exists, is JSO N valid, has the required fields, is on the way. They don't open connection to what the document describes, do not invoke tool, do not complete flow of authorization.
The practical consequence is an engineering rule, not a criticism of the instrument: the contract you publish is a promise, and the service is the fulfillment, not the file. State what you hold; test each declared capacity I'm actually exercising it, not rereading the document that announces it. No appraiser Metadata will do it for you.
Neutral is not pass
Of the 22 checks, six come neutral on this site: five of the agency trade (by decision of scope — there is no transaction to describe) and a bot cryptographic identity (no implemented). A neutral check does not penalize the note, and that is exactly why it does not It testifies nothing. An instrument that does not punish absence does not certify presence.
Reading "100" as "22 of 22" is the mistake. There are 16 checked, six not evaluated — and the second number is information, not noise: it says where the surface has not yet been exercised.
The ruler is the instrument, not the reality
A score 100 means one precise thing: The site passed the checks that that instrument considered, in that configuration, that date. Doesn't mean Any agent can do anything on the site. Doesn't mean the patterns chosen are the ones who will win — most of them are still drafts, and some will be replaced. And it doesn't mean the surface remains correct tomorrow: it's code, and Code regresses.
The value of the exercise is not the number. It's just that he has to answer, verifiably, the four questions of start of this page — what there is, in which format, under which rules, with which credential. A site that responds well to these four questions remain agent-ready even when the ruler changes.
12 · Sources
References
Primary sources. Where there is RFC, RFC is the reference — not its summary.
Agent Readiness
RFCs
- RFC 8288 — Web Linking (header
Link) - RFC 9309 — Robots Exclusion Protocol
- RFC 9460 — SVCB and HTTPS records
- RFC 7231 § 5.3.2 — content negotiation (
Accept) - RFC 7763 — type
text/markdown - RFC 9727 — API Catalog
- RFC 9728 — OAuth Protected Resource Metadata
- RFC 8414 — OAuth Authorization Server Metadata
- RFC 8615 — prefix
/.well-known/
Agent Protocols
On this site
- AI Agent Engineering — the MCP as the agent's security border
- Trust Engineering — deterministic-first and rigid contracts
- The complete catalogue
- This page at Markdown — the version without layout
- Illms. txt — the index of this domain for models
In short
What Agent Readiness is
Agent Readiness is not a list of files in `/.well-known/`. It's treating the agent like a third first class consumer — arriving without a session, without layout and without context — and publishing by machine reading, what exists, in which format, under which rules and with which credential.
- Discoverable — explicit discovery in independent layers: DNS, 'Link' header (RFC 8288), 'robots.txt', sitemap.
- Readable — content negotiation: 'Accept: text/markdown' in the same URL, with 'Vary: Accept'.
- Controllable — machine-readable rule of use: 'Content-signal: ai-train=no, search=yes, ai-input=yes'.
- Callable — invocable contracts: API Catalog (RFC 9727), MCP Server Card, Agent Skills with digest, WebMCP.
Auditable case study: this domain measures 16 pass · 0 fail · 6 neutral · level 5 (Agent-Native) at the IsItAgentReady, measured on September 7, 2026.
Frequently Asked Questions
Frequently Asked Questions
What is Agent Readiness?
Agent Readiness is the property of a site whose public surface is designed to be consumed by autonomous software: the resources are discoverable by explicit mechanism, the content is delivered in the format the agent requests, the rules of use are declared legible by machine and the available actions are published as invocable contracts. It's a new layer on HTML, SEO and AEO — not a replacement of any of them.
What does it mean to be Agent-Ready?
It means that an agent can answer four questions about his website without guessing: what features there are, in which format he can read them, what he can do with the content and how he invokes an action. A bot-only site responds to 200 and does not block; an agent-ready site transfers to itself the burden of inference, publishing each of these responses verifiably.
How to reach score 100 on IsItAgentReady?
Implementing the categories in order: discovery (robots.txt, sitemap, header Link RFC 8288, DNS records with DNSSEC), content accessibility (access negotiation: text/markdown with Vary: Accept), access control (Content Signals), and protocol discovery (API Catalog RFC 9727, OAuth RFC 8414/9728 metadata, auth.md, MCP server card, A2A agent card, Agent Skills and WebMCP). Fix one check at a time, publish, and read the evidence in the JSON scan instead of the generic text of the interface.
What's Markdown for agents?
It is delivering the same URL in Markdown when the client sends Accept: text/markdown, by content negotiation (RFC 7231 §5.3.2). An application page with 197 KB of HTML usually fits in a few KB of Markdown — on this site, 3.7 KB for the same text, 52 times less bytes. Two traps: compare q quality values, since a browser sends /;q=0.8 and cannot receive Markdown, and issue Vary: Accept for CDN does not serve the wrong version.
What is an MCP Server Card?
It is a JSON document in /.well-known/mcp/server-card.json that describes, in a machine-readable way, which tools and features a domain exposes by the Model Context Protocol: server name, transport, typed input tools and downloadable features. It is the layer of discovery — the description of the contract. Post on it exactly the capabilities you are ready to sustain.
What are Agent Skills?
Agent Skills publish reusable procedure, not given: each skill is a SKILL.md file with instructions on how to do something in that domain, listed in an index.json with the URL and digest SHA-256 file. The digest is the central point — instruction that enters the context of a model is the surface of attack, and the digest allows the agent to verify that it carried what the index promised.
How do agents find APIs?
By the RFC 9727 Catalog API: a linket in /.well-known/api-catalog that, for each feature (anchor), lists typed links — service-desc for machine-readable specification, service-doc for prose documentation, status for the state. The same catalogue can be advertised on the Link header (RFC 8288), which allows the agent to discover everything with a HEAD request, without downloading page or knowing path convention.
How to control access to AI bots?
With two complementary layers. The robots.txt (RFC 9309) responds if the bot can fetch. The Content-Signal directive answers what it can do after it has sought, separating three independent decisions: search (appearing in search), ai-input (being used as source of a generated response) and ai-train (turn training data). To distinguish bots from each other by cryptographic identity, there is also Web Bot Auth, based on HTTP message signature.
How to test if a website is Agent-Native?
Run a scan on the IsItAgentReady — by the interface or by POST in the API — and read the JSON, not the interface remediation text, which is fixed by check and identical on every site that fails that check. The real signal is in the detail of the evidence, which indicates which validator failed. Then fix one check at a time, publish (the scan runs against production, not against the repository), rescan and write a test for each check you have passed.
Does a score 100 mean the site is perfect for agents?
Nope. It means something precise and limited: the site passed the checks that that instrument considered, in that configuration, on that date. Discovery checks validate documents — which the file exists, is valid JSON and has mandatory fields — and do not connect with what the document describes. In addition, neutral checks do not penalize the note and therefore do not attest anything: an instrument that does not punish the absence does not certify the presence.