DocsGetting started / The agent-readiness score

The agent-readiness score

Send an AI assistant to a website and ask it to book a job. Either it can, or it cannot. The score measures that, out of 100, and this page is the whole method.

The score answers one question and nothing else: if a customer’s AI assistant arrives at this site and is told to book, quote or enquire, how much of what it needs is actually there?

It is five categories, 20 points each, 100 in total. Each category is capped at 20, so no single check can carry a site, and a category can only earn points for something the scanner positively found. There is no "nothing looked broken" route to a good score.

The walk the score counts

  1. HomeReadableHours and address found. An agent can read them.
  2. ServicesReadableEvery service listed. Nothing here to book.
  3. Book onlineDead endA CAPTCHA. It stops a customer’s agent as surely as it stops a bot.
  4. Get a quoteDead endThe send button is a picture. Nothing for an agent to press.
  5. ContactDead endA phone number. That hands off to a human, so the agent stops here.
  6. AboutReadableReadable, and nothing for an agent to do.
  7. The score: this walk, counted.
  • An agent can read this
  • Where an agent stops
  • The scan’s path
Not a real site and not a score: a typical one, drawn, with no number on it. Each of the five categories below asks one thing of pages like these, can an agent get past this one?

The three bands

Grade bands
ScoreGradeWhat it means
70–100agent-readyAn agent sent here to book, quote or enquire has a structured way in and can complete at least one job end to end.
40–69partially readyAn agent can read the site. It cannot reliably finish a job, the ways in are built for a person with a mouse, not for software.
0–39invisible to agentsAn agent asked to book or enquire here has almost nothing it can call directly. It can still try driving a browser through whatever is on the page, but that is slow, unverified, and gives the business no say, most agents read the page and move to the next business instead.

The five categories

1. Crawlability and discovery: 20 points

Before an agent reads a page it checks whether the site has published anything about itself at the addresses agents look at. This category is that check.

Crawlability and discovery
SignalPointsNote
robots.txt present and not locking agents out5A robots.txt that disallows everything, or names an AI agent and disallows it, scores nothing here and is reported as a finding.
No robots.txt at all3Open by default, but an agent cannot confirm intent. Recorded as a warning, not a pass.
sitemap.xml found3
/llms.txt present3A plain description of the site for language models.
/.well-known/ard.json published (or the predecessor /.well-known/ai-catalog.json)5The Agent Readiness Discovery catalogue. The path was renamed to ard.json on 26 Aug 2026; the predecessor is still served for registries built against the original path.
Canonical URL declared2
Page not set to noindex2A noindex page scores nothing here.
The well-known files are only probed in URL mode. A scan of a saved HTML file skips them entirely, see the limits below.

2. Structured data: 20 points

Whether the page tells a machine what this business is, in the format machines already read. With no structured data at all, an agent has to guess the business type, the hours and the address from prose.

Structured data
SignalPoints
Any parsable JSON-LD present6
A business entity type declared (LocalBusiness, Dentist, RealEstateAgent…)5
Machine-readable opening hours3
Phone in structured data2
Address in structured data2
Service, Offer or Product entities2
A JSON-LD block that fails to parse is reported as a warning and earns nothing, broken structured data is ignored by the things that read it.

3. Action affordances: 20 points

Is there anything on the page for an agent to do? A booking or quote form, a known booking widget, a clickable phone number, real buttons rather than clickable divs.

Action affordances
SignalPoints
A known booking-widget signature detected6
At least one booking, quote, callback or contact form that survives the non-action filter6
A tel: link3
Not overrun with clickable divs styled as buttons3
Real <button> or <a> elements present2

Two filters do most of the work here, and both exist because an earlier version of the scanner counted things that were not actions.

A form matching an action keyword is necessary but not sufficient. It is excluded, from the detected actions and from the form-quality score, when it carries a positive signature of being something else: a search box (role="search", a search input, a search/typeahead token in its attributes, or a field named s, q, query, search or keyword), a newsletter signup (a newsletter/subscribe/mailchimp token, or a lone email field, or newsletter wording when every field is an email or a checkbox), or a form with nothing to submit. A genuine enquiry form carrying a newsletter opt-in tick-box is not excluded, and a genuine one-field-plus-submit enquiry form still counts: the floor is structural, never field count alone.

Widget signatures are matched structurally, against URL-bearing attributes only, and each vendor pattern targets that vendor’s booking endpoint rather than its marketing site. A "powered by" credit in a footer, a blog paragraph naming a vendor, or a CRM script tag is not a booking widget. Under the earlier whole-page substring match, a test page that merely named four vendors in prose emitted four booking actions and gained six points.

4. Form quality: 20 points

Assessed over action forms only. A site’s form quality is not scored on the strength of its property-search box.

Form quality
SignalPoints
At least one action form exists4
80% or more of fields properly labelled4
90% or more of fields carry a name attribute3
Half or more of fields use a semantic input type (email, tel, date…)3
Any autocomplete attributes2
A real submit control inside the form2
At least one field marked required2
A CAPTCHA anywhere on the page−2
A page with forms on it, none of which is an action an agent could call directly, scores 0 in this category rather than being scored on its search box.

5. Agent interface: 20 points

Whether the site declares what it can do to software, rather than leaving software to infer it from the layout.

Agent interface
SignalPoints
WebMCP signals, the page declares its tools to the browser8
A persistent MCP endpoint advertised, or an ARD catalogue published6
Semantic landmarks and at least one h13
Images carry alt text (or there are no images)3

WebMCP is a proposal. A page declares its tools through document.modelContext, which browsers have not shipped; navigator.modelContext is a deprecated alias, and using either today means loading the @mcp-b/global polyfill.

The ARD catalogue at /.well-known/ard.json, found via a rel="ard" link, was published as a discovery standard in June 2026. Its earlier path, /.well-known/ai-catalog.json, is still served for registries built against it. A persistent MCP endpoint is the third route, and the one that keeps working when nobody has the page open. The scanner finds it either from a <link> to a server card in the page or from a server card published at /.well-known/mcp/server-card.json or /.well-known/mcp.json.

Frontlatch emits to all three from one Action Graph, so a business does not have to bet on one of them.

Agent-callable is a separate answer, and it is not part of the score

A site can have a contact form and still have no action an agent can call directly, a browser-driving agent might still fill it, but that is a different and weaker thing than a machine calling it on its own. So each detected action carries its own verdict, computed from positive evidence only, and it deliberately does not feed the 0–100 number. The score describes a site; agentCallable describes one action.

The rule, as one exported string in the source

WebMCP tool declaration, advertised MCP endpoint, ARD catalog, known booking widget,
or a fully machine-completable form (every field labelled and named, an email/tel
reply channel, a real submit control, no CAPTCHA)
Verbatim from the scanner’s own AGENT_CALLABLE_RULE. It is exported and imported by the benchmark so a report and its summary can never disagree about the rule they were scored under.
The five routes to agent-callable
RouteWhat has to be true
webmcp-tool-declarationThe form element itself carries mcp-tool, data-mcp-tool or toolname.
mcp-endpointThe page advertises a persistent endpoint, link[rel=mcp], meta[name=mcp-server].
ard-catalogThe site publishes an ARD catalogue at /.well-known/ard.json (or the predecessor /.well-known/ai-catalog.json).
booking-widgetA known booking-widget signature. This is a weaker claim than the others: it is a path our own routing could drive natively, not proof that any agent could do it unaided today.
machine-completable-formEvery field labelled and named, an email or tel reply channel, a real submit control inside the form, and no CAPTCHA on the page.
A near miss is false and carries a blockers list naming exactly what is missing. That list is the fix list. A tel: link is never agent-callable: it hands off to a human.

What fifteen real sites scored

Fifteen service businesses, five trades, five clinics, five real estate agencies, scanned read-only on 25 August 2026. The fifteen sample report pages were retired on 9 October 2026; the run’s figures below stay as its record, and every business in the index now has its own live page.

The 25 August 2026 run
VerticalMean scoreWith a form or widgetWith an agent-callable action
Trades58.04 of 51 of 5
Clinics47.61 of 50 of 5
Real estate31.40 of 50 of 5
All fifteen45.75 of 151 of 15

15 of 15

published no WebMCP declaration, no MCP endpoint and no ARD catalogue. Every site in the sample scored zero on all three routes at once.

What the score does not claim

This section is published because an instrument that hides its error bars is not an instrument. Every item below is recorded in the scanner’s own repository, not discovered here.

  • The bare instrument reads one page, fetched once, and does not run JavaScript. A booking flow two clicks deep scores as if it were not there. That is the correct measurement of what an agent gets on arrival to that one page, and it is not a measurement of what the business can do. A live scan run today, at /get-scanned or a rescan from /app, wraps the same instrument with a renderer and a crawl of up to 15 pages, so it already sees more than a bare run of it would; the fifteen worked examples below were scored by the bare instrument and are not rescanned this way.
  • It understates most sites, and we know roughly by how much. Opening the same fifteen sites in a real browser, rendering, waiting for scripts, clicking, following links, reached 28 actions this pass did not see, on 14 of the 15 sites.
  • A file scan is not a URL scan. Scanning a saved HTML file skips the robots.txt, sitemap, llms.txt and catalogue probes entirely, so the same page can score up to about 11 points higher as a live URL than as a fixture.
  • It is not a ranking. A category score is a direction; the fix list is the useful part. Its known measurement defects are recorded in the repository rather than in a footnote, and the fifteen scores in this page’s worked examples are not re-scored when the scanner changes.
  • It says nothing about mappability or execution success. Those need a real browser and a sandbox, so the benchmark summary prints n/a for both rather than substituting the detected-action rate as a proxy. The detected-action rate is mappability’s ceiling, not its stand-in.
  • A zero in the agent-callable column is a fact about those sites, not a property of the instrument. It is computed from positive evidence, and one site in fifteen did earn it.

The scanner is a read-only visitor. It scans one site at a time, two seconds apart, with a 45-second timeout and one retry. Within a site it fetches robots.txt, the page and six well-known files (llms.txt, the ARD catalogue at its current and earlier paths, two MCP server-card paths, and sitemap.xml) one at a time, half a second apart, so a site sees eight spaced requests and never a burst.

Every request carries a user-agent that names the project and says the scan is read-only. A form is never filled and never submitted.

How the measurement is made

Inside the repository

npm install
npm run scan -- https://somebusiness.com --html report.html --json report.json
npm run scan -- fixtures/bad-plumber.html      # offline fixture mode
npm test                                        # tsc --noEmit, then scoring, callability and publication assertions on 10 fixtures
npm run build:public                            # regenerate publish/public-reports.json from the committed benchmark reports
npm run build:public -- --check                 # fail if that bundle is stale (also asserted by npm test)
Verbatim from the scanner’s own documentation, "Run".

You do not install the scanner. To scan your own site, enter your domain at /get-scanned and the report opens in the same tab when the scan finishes. The commands above show how the sample reports were produced, so the method can be checked.

See what an AI agent can do on your site.