Formula v9.57

Scoring formula and method

16 HTTP checks with fixed rules, worth up to 18 points. Download the published measurements at /corpus.json. The score describes public signals; integration success requires a separate task test.

Dataset terms

The published measurements may be reused, quoted and republished with attribution to Let Agents In and a link to this methodology. Keep the formula version with any figures so another reader can check which rules produced them.

Checks

ADiscoveryCan an agent find and read you?7 pts

  • 1 pt
    Answers an agent user-agentAn agent sends HTTP with its own user-agent, not a browser fingerprint. A 403 here ends the funnel before any of it starts.answers_plain_request
  • 1 pt
    Price or entry condition in the search snippetAn agent shortlists from search results and drops candidates on the summary alone, without opening the page. A pricing description carrying no number and no entry condition reads as "contact sales" and is skipped there, before anything about the product is compared.price_in_snippet
  • 1 pt
    llms.txt publishedA curated map of your docs is the cheapest way to control what an agent reads first. Worth one point and not more: in eighteen isolated agent runs across four categories, not one cited llms.txt among its sources, and an independent ninety-day measurement published by Otterly in February 2026 found it served 84 requests against 62,100 AI-bot visits.llms_txt
  • 1 pt
    Docs readable without JavaScriptMost agents fetch HTML, they do not run your bundle. An empty shell reads as an empty product.docs_without_js
  • 1 pt
    On-demand agents not blockedChatGPT-User and Claude-User are not crawlers. They are your prospect, reading your docs mid-integration.user_agents_allowed
  • 1 pt
    Paths robots.txt points at answerAn Allow line is a claim that a path is worth fetching. An agent that follows it into a 404 has spent budget on your map being wrong.robots_paths_resolve
  • 1 pt
    No punishing crawl delayA polite agent honouring Crawl-delay: 10 spends 200 seconds to read 20 doc pages, then gives up.no_crawl_delay

BAgent entryIs there a door built for a machine?4 pts

  • 2 pt
    Agent entry pointA markdown file written for a machine turns a guessing game into a procedure it can follow.agent_entry_point
  • 1 pt
    OAuth dynamic client registrationRFC 7591 lets an agent register itself without a human. MCP 2026-07-28 deprecates it in favour of Client ID Metadata Documents, so it is the compatibility path rather than the only one.oauth_dcr
  • 1 pt
    MCP surfaceAn MCP server turns your API from something an agent reads about into something it can call.mcp_present

CRegistrationCan an agent get an account?2 pts

  • 1 pt
    No CAPTCHA in the signup HTMLA CAPTCHA is a hard stop. Permissions after signup beat a gate before it.signup_no_captcha
  • 1 pt
    Signup reachable without a browserAn agent fetches HTML and submits what it finds. A signup page that answers 200 and builds its form in the browser has nothing in it to fill, which is the same dead end as a refusal and much harder to notice.signup_reachable

DProvisioningCan it get credentials without a human?3 pts

  • 2 pt
    Programmatic key provisioningDocumented key creation is the difference between a two-minute integration and a support ticket.programmatic_provisioning
  • 1 pt
    Free tier or no-card trial stated in textA free tier is what lets an agent finish the job in the same session it started. Usage-priced products with self-serve signup can fail this honestly, which is why it is one point and not a verdict.self_serve

EIntegrationCan it ship working code?2 pts

  • 1 pt
    Typed SDK on the registryTypes are how an agent checks its own work before you ever see the code.132 of 155 measured rows rely on registry publisher matching. This is weaker than a package link on the vendor site, in llms.txt or in documentation.corpus.json records the source as npmSource.typed_package
  • 1 pt
    Machine-readable API descriptionAn OpenAPI file or markdown negotiation lets an agent read your API instead of guessing it.machine_readable_api

The three crawler classes

The named bots fall into three classes. A robots.txt rule can allow or refuse each class separately.

trainingControls crawling for model training; it does not remove existing training data.

GPTBot · ClaudeBot · anthropic-ai · Google-Extended · Bytespider · meta-externalagent · Applebot-Extended

searchControls the named search crawler; citations can also come from other sources.

OAI-SearchBot · Claude-SearchBot · PerplexityBot

userControls a named on-demand fetcher when it requests your pages.

ChatGPT-User · Claude-User · Perplexity-User

Agent entry paths probed

These candidate paths come from reference implementations. A matching file is a discovery signal, not proof that an integration works.

/agent-signup.md · /skill.md · /agents.md · /agent.md · /ai.txt · /.well-known/agent-access.json · /.well-known/mcp.json · /.well-known/agent.json · /.well-known/ai-plugin.json · /.well-known/agent-card.json

Verdicts and the score denominator

The maximum is 18 points. Each domain is scored out of the applicable points we could measure. The scorecard prints that denominator beside the score.

PASS, PART and FAIL
Measured. Earned points enter the score; the check maximum enters the denominator.
UNMEASURED
We could not evaluate the check. Examples include refused requests, JavaScript forms and insufficient documentation. Excluded from the score and denominator, with a reason.
N/A
The check does not apply to this product type, such as signup for a library without accounts. Excluded from the score and denominator.

Rankings use the share of measurable points. For example, 6 of 9 is ahead of 8 of 14.

Repeatability

The recorded noise floor is 0.59 percent of verdicts. It measures variation between rescans across the corpus. Recheck an individual result before acting on it.

MeasurementSampleObserved movement
10 August 2026167 domains, 2,338 verdicts; unchanged rules15 verdicts, 0.64%
Earlier pairs, formula 9.8Two passes within one sweep0.39% before three repairs; 0.20% after
17 August 2026170 domains, 2,550 verdicts; warm passes six hours apart, same formula15 verdicts, 0.59%; 9 up, 6 down
17 August breakdown10 changed verdicts; 5 changed measurability0.39% excluding measurability changes
Adversarial rule auditsSeparate measurement of incorrect verdicts0.39% recorded error rate
13 August 2026 manual pass282 verdicts in the checked familiesNo errors found; does not replace the earlier error rate
What changed in the measurements
  • Within-sweep pairs mixed a cold npm cache with a warm one. The last such pair moved 27 verdicts up and 3 down.
  • The 17 August pair used warm passes from separate sweeps. It replaced a formula 9.8 measurement made twelve days and over twenty rule changes earlier.
  • The scanner allows 27 seconds per domain. One run exhausted that budget on two domains, leaving eleven verdicts unmeasured. Repeating them reduced movement from 23 rows to 12. Truncated scans are now retried.
  • Two other repairs treated catch-all empty 202 responses as unmeasured and stopped inferring absent accounts from a missing link when prices were published.
  • The earlier 0.20% result contained five unstable rows: two MCP endpoints, two refused documentation pages, and one page varying by discovery path. A scan requests about nineteen documents within its 27-second budget.
  • Nine of the fifteen rows in the newer pair depended on host responses. name.com answered browser and both agent user-agents identically in three repeated checks. froala.com alternated 403, 200, 403 for the browser too.
  • The 13 August manual pass covered signup CAPTCHA markers, confirmed 404s, OAuth discovery on nine hosts and entry files on nine paths. Positive controls accompanied the probes. Its coverage was limited to those families.

When monitoring sends an alert

Same formula
The earlier measurement is rescored under the current formula before comparison. If it cannot be rescored, no email is sent.
Comparable evidence
Checks whose scan-time interpretation changed are excluded when stored evidence cannot support the new rule. Release 9.32 changed provisioning evidence; nineteen vendors were protected from a misleading comparison.
Measured on both sides
A change to or from unmeasured does not trigger an alert by itself. In one within-sweep pair, 21 of 22 changes were unmeasured to pass; sixteen came from the npm cache.
Rate limits and challenges
A 429 is retried, then recorded as unmeasured if it persists. An unresolved browser challenge from the vendor edge can trigger an alert. A challenge the scanner passed does not.

One changed, comparable verdict can trigger an email. The 0.59 percent corpus noise floor is a reason to verify it before making a change.

How the agent runs are counted

Each category has a buying question that names no vendor. A batch asks it five times in separate sessions and empty directories. The complete answers are published under the category.

Named
Number of runs that mentioned a vendor.
Named first
Number of runs that mentioned it before any other vendor we measure. This records order, not a purchase.

A published name list and regular expression count mentions. Common-word brands need emphasis, code, a link, all capitals, or repeated capitalised use. “the bunny hops” does not count as bunny.net; “**Sanity**” counts as sanity.io.

Five runs are a small sample. They do not rank close results or estimate real buyer choices. Some batches could read local instructions requesting Polish. Those answers describe that setup.

A second tool repeated the set without reading those instructions and answered in English. The findings page reports the two check associations that appeared on Claude Code and Codex across all 26 categories. Additional tools on selected category pages are outside that comparison.

What the other scanners measure

agent-ready.dev runs 70 checks against the Vercel Agent Readability Spec, llmstxt.org and a dozen protocol manifests, plus 23 accessibility checks, counted on their own pages on 19 August 2026.

Its specification focuses on discovery, structure and context. The words signup, provisioning and CAPTCHA appeared zero times in that reading. Our corpus earned 87 percent of discovery points and 36 percent of agent-entry points.

Two checks informed ours: llms.txt link health and differences between browser and agent responses. Per-page SEO checks remain outside this score.

kodustech/agent-readiness evaluates whether a coding agent can work in your repository.

What we score

On 2026-08-20, this site scored 12 of 13 points here, and the scorecard is public . We fail oauth_dcr. Our MCP tool requires no credential. The scan discovers no OAuth client-registration path.

Lighthouse 13.4.1 scored this site 92 of 100 for SEO on 19 August 2026. Its deduction was AI-Catalog: in robots.txt. The same version accepted Content-Signal:. RFC 9309 allows parsers to ignore unknown lines. We retain the catalog directive.

Limits and probe rules

Open a rule for its threshold, exception and recorded examples.

01llms.txt: a navigation signal

The file earns one point as a map of documentation. It does not establish agent selection. Our eighteen build runs never cited it; a run may read a file without citing it.

Ahrefs reported 137,210 domains in June 2026, with 97 percent of published files serving no traffic. Otterly reported 84 requests against 62,100 AI-bot visits over ninety days. John Mueller said in June 2025 that no AI system used it.

Mintlify tested 2,400 tasks across twenty documentation sites in July 2026. Wrong URLs averaged 2.23 per task on HTML, 1.42 on markdown and 0.11 with an llms.txt map. These studies measure different uses; none establishes a priority fix for a specific vendor.

02Agent user-agents: page-specific observations

The scanner requests the selected documentation page as itself, ChatGPT-User and Claude-User. A JavaScript challenge also triggers probes of the home page. Training crawlers are outside this check.

amplitude.com returned 404 for one documentation URL and 200 for another. bitmovin.com challenged our scanner but served Claude-User the page. A pass applies to the page tested.

03Rate limits do not subtract points

A 429 is retried. If it persists, dependent checks are unmeasured. Signup probes are spaced apart.

A challenge marker is reported separately, with the host and request count. It still costs no points. A browser-capable agent may behave differently from this HTTP client.

04Pricing is read twice

Self-serve wording is the union of both reads. One vendor changed its free-tier sentence between reads forty minutes apart. The scorecard records disagreements.

05OAuth discovery follows hosts and issuers

The check follows the apex, signup origin, MCP host and conventional authorization or resource-server subdomains. Protected-resource metadata can lead to authorization servers. Both well-known layouts are tried, with the issuer path before or after the well-known segment.

The scorecard lists attempted origins. Since 9.33, requests skipped after an earlier connection failure or timeout do not count as attempts. If no request was sent, the check is unmeasured.

06Price snippets use the description or opening text

The check reads the pricing-page description tag, or opening text if the tag is absent. It does not use the rest of the page. An amount, rate or entry condition such as free, no card or no account passes. The check is worth one point.

07Signup gates are retried

Gated checks run up to three times. The scorecard records the number of attempts and any disagreement. During research, one endpoint returned 200 once and 403 four times.

08A passing file does not establish integration success

The scan measures HTTP signals. Agent recommendations and task-based integration audits are separate measurements.

09Discovery can select the wrong page

Documentation, pricing, signup and npm-package paths are inferred from links. The scorecard names the selected pages so you can identify a bad match.

10Response size and discovery limits

Each response is capped at 400,000 bytes. Checks depending on a truncated document are unmeasured and name the cap. filestack.com returned 12,282 characters to a full quickstart read and 53 to ours.

Since 9.50, the ceiling stopped deciding which of your pages we read without a control comparison. A truncated guessed path is compared with an unregistered address. Matching oversized responses indicate a shared shell; if the control does not answer, we skip the path.

On 2026-08-20, 885 requests produced 114 responses above the cap. The old rule had excluded 16 paths on nine domains.

11Soft 404s count as absence

An application shell returned for an unknown path does not establish that the requested file exists.

12Provisioning uses a limited documentation sample

The check reads the documentation landing page, at most three additional credential-related pages, and discovered llms.txt files. It tests 7 phrases: management api, beside a credential or something being created; provisioning api, beside a credential or something being created; account api, beside a credential or something being created; create an api key (or api token, access token, personal access token, service account, auth token, secret key, access key, service token, signing key, publishable key, client key, licence key, project token), next to something programmatic; programmatically create, in either word order; service account, in a sentence that creates one by program; a documented path like /v1/api_keys or /v2/access-tokens.

A creation phrase requires programmatic context in the same sentence. Since 9.32, three bare phrases also require a credential or creation context. A menu label alone does not count.

The repair followed a review where twenty-eight of eighty credited rows depended on bare wording. Examples included "Media management API integration", "Content Delivery API Management API Image Service" and "Important Change to the Twilio Phone Number Provisioning API".

The scorecard quotes the matching sentence. A missing credential page can change the conclusion; send its URL for a rescan.

13Control probes distinguish files from catch-all responses

An unregistered path is requested in the same namespace with the same Accept header. Each entry file is compared with that response. Per file, not per namespace.

sentry.io returned a 976-byte page for unknown .md paths and a real 106-byte descriptor. If the control times out, is rate limited or is refused, the check says it could not tell.

MCP uses the same control. A bare 405 can also be an unrouted POST response. An address can count through a handshake, WWW-Authenticate, an MCP-specific host, or a response differing from an unrouted path on the origin.

When the answer is one only a control can read, a missing control makes it unmeasured. This applies to refusals, empty 202s and bare 405s. A handshake, a JSON body or an OAuth challenge needs no control and still counts.

14Signup request identity and budget

LetAgentsIn/1.0 is sent up to three times, stopping early if the scan budget is nearly exhausted. Results appear beside a Chrome user-agent response. Other requests use a browser user-agent, except the named-agent probes described above.

15WebMCP is outside this HTTP scan

The W3C Web Machine Learning Community Group draft of 26 August 2026 registers tools through document.modelContext at runtime. Detecting them requires a browser and getTools(); this scanner executes no JavaScript.

Lighthouse included three WebMCP audits on 19 August 2026. This site registers its own scan tool on the home page. No WebMCP result is inferred for other sites from their HTML.