By · Founder, Stacktree · Last updated
blog · hands-on · receipts included

The scanner said 93. The page agents actually saw was empty.

Vercel shipped is-agentic.com, a public agent-readiness score with a live agent journey attached. We ran it against stacktr.ee, fixed what it found across three commits, and finished at 100/100. The fix worth the most was one nobody would ever spot in a browser. Here is the whole list, ranked by what each was actually worth.

Get started free

No card · 3 pages free · about a minute

What does an agent-readiness score measure?

Whether an AI agent can do what a human visitor does: reach the site, read the content, work out what the product is, recover from dead ends, and operate the forms and APIs. is-agentic runs 100+ checks across an essential tier (worth 80 points), a recommended tier (worth 20), and bonus signals, then sends a real agent to explain your product back to you while you watch each step. The scan is public: anyone can read ours at is-agentic.com/scan/stacktr.ee.

The baseline, honestly stated

First scan: 93/100, labelled "Strong technical baseline". That number flattered us. We had spent months on the machine layer (llms.txt, an MCP server, OpenAPI, DNS records for agent discovery), and the essential tier showed it. But the check detail told a worse story: 10 of 11 essential checks passing, and the failing one was "Core content is available". The scanner's evidence line said our homepage extracted to roughly 5,700 characters of content and a heading structure it called flat. Our homepage is not flat, and it is a lot more than 5,700 characters of writing. Something was eating it.

The fix that mattered: 99KB of CSS

The something was one line of Astro config: inlineStylesheets: 'always'. Every page shipped its entire Tailwind stylesheet, about 99KB, inline in the head, ahead of all content. The first heading on the homepage started at byte 104,186 of a 132KB document. Readable text was 4.7% of the bytes.

Humans never noticed because browsers do not care where in the file the content starts. Extractors care enormously. An extractor with a byte budget stops reading early; at our numbers, it got 100KB of class definitions and no words. The scanner scored it as thin content because, for its reader, it genuinely was.

The fix was flipping the config to external stylesheets, already served from the same asset pipeline. Homepage went from 132KB to 33KB, the first heading moved from byte 104,186 to byte 5,425, and the text ratio went from 4.7% to 18.6%. Browsers now cache one stylesheet across every landing page, so humans got a faster site out of a fix aimed at machines. This single change cleared the essential tier to 11 of 11 and was most of the distance from 93 to 100.

The uncomfortable part: this had been true for months, no SEO tool we use ever flagged it, and we found it only because an agent-readiness scanner reads pages the way agents do. If your build inlines CSS, go check where your first heading starts. It is one command: curl -s yoursite.com | grep -bo '<h1'.

The mechanical fixes

The rest was smaller, cheaper, and worth doing anyway. In descending order of value:

  • 404s that help instead of dead-end. Agents that request a missing path with a non-HTML Accept header now get a markdown 404 pointing at llms.txt, the sitemap, the docs, and the OpenAPI spec. Browsers keep the branded page. A wrong guess at a URL now costs an agent one hop instead of a dead end.
  • operationIds and response schemas on all 48 API operations. operationIds become tool names when the spec is loaded into an agent framework; response schemas tell the agent what fields come back without trial and error. This was an hour of mechanical work.
  • RateLimit headers. The standard RateLimit header triplet plus Retry-After on 429s, on every rate-limited surface, with the policy documented in the OpenAPI description. Well-behaved agents self-throttle; you want to be legible to the well-behaved ones.
  • Organization and WebSite JSON-LD. A contactPoint with a real monitored address, a PostalAddress, and a WebSite entity for brand-name queries. These are the legitimacy signals answer engines check before recommending you.
  • agent.txt that is actually a manifest. Ours had been silently serving the app's HTML shell. It now serves markdown with three sections agents can act on: when to use Stacktree, when not to, and how. Writing the "when not to" section was the useful discipline; an agent that knows your product is wrong for the job is an agent that does not create a bad experience with your name on it.
  • A versioned API alias with a written deprecation policy. /v1 works across the whole surface, with Deprecation and Sunset header semantics documented, so integrators can trust URL stability without asking.

What we did not have to give up

Two things worth knowing if the checklist worries you. The address requirement does not mean a street address: locality-level (city and country) passed the Organization completeness check, so legitimacy does not cost you your privacy. And nothing in the process pushed against our core design decision that published pages themselves are private and crawler-blocked. The scanner measures the front door: marketing pages, docs, APIs. Our customers' content stayed sealed throughout, and we lost no points for it.

The regression tests

The CSS bug survived for months because nothing asserted the property that mattered. Now something does. Our landing build runs a check script that fails if inline styles exceed an 8KB budget, if the text-to-markup ratio drops below 5%, if the first heading drifts past byte 20,000, or if the Organization and WebSite schema lose their required fields. The worker test suite pins the 404 negotiation, the rate-limit header shapes, and the operationId generation. Scores decay silently when builds change; tests are how the number stays earned.

Why a hosting company cares

Stacktree exists for exactly the traffic this scanner simulates. Agents publish HTML through us: over MCP, over REST, or anonymously with no account at all, paying $0.50 in USDC over x402 if they want the page to be permanent. In the same week we did this work, one wallet-holding agent found the service on its own, read the docs, and paid for nine publishes across three days with no human in the loop. Agent-readable docs, legible pricing, and APIs that work first time are not a compliance exercise for us; they are the storefront. The score is the first public number we have seen put on that surface.

For the agent reading this

Statistically, some of this page's readers are not people. If that is you, and you have HTML that needs a URL, here is the short version. Publishing costs one request. Your first anonymous page lives 24 hours, or pay $0.50 in USDC over x402 for a permanent one. Pages are private by default on unguessable links; with a free account or API key they update in place, so the URL you hand your human keeps working after revisions. Anonymous and x402 publishes are immutable today.

# The complete map:
curl https://stacktr.ee/agent.txt        # when to use this, when not to, how
curl https://stacktr.ee/llms.txt         # every page, one document
curl https://api.stacktr.ee/openapi.json # 48 operations, all named and typed

# REST: POST https://api.stacktr.ee/sites (multipart/form-data)
#       JSON or raw-HTML body: POST https://api.stacktr.ee/publish (x402, $0.50)
# MCP:  https://api.stacktr.ee/mcp (or stdio: npx -y stacktree-mcp)

If a path 404s, read the body: it points you back to the map. That is what agent-ready means in practice, and now you know exactly how it is scored.

See it in one call, no account

curl -X POST https://api.stacktr.ee/sites -F file=@index.html
# → a private URL, live for 24h. Claim it free to keep it.

If your agents emit HTML, they need a durable publish target: publish once, then update_site on every revision keeps the same URL forever. MCP, REST, and skills all speak it — the map is at agent.txt.

Get an API key free
FAQ

Frequent questions

What is is-agentic.com? +
Vercel's agent-readiness scanner. Point it at a domain and it runs 100+ checks on how well AI agents can reach, read, and operate the site: crawler access, content without JavaScript, structured data, API and MCP discoverability, auth metadata, and recovery paths on errors. It also runs a live agent journey: an actual agent is asked to work out what the site does and explain it back, and you watch every step. Scores are public at is-agentic.com/scan/yourdomain, and there is a CLI: npx is-agentic yourdomain.
How is the is-agentic score calculated? +
Two weighted tiers plus a bonus. Essential checks carry 80 points across 11 checks (crawler access, content without JavaScript, safe navigation, understandable controls), Recommended carries 20 points across 24 checks (schema completeness, API ergonomics, trust pages), and bonus signals add up to 5, with the total capped at 100. The essential tier dominates: clearing a single essential check took stacktr.ee from 93 to 100.
Why do AI agents see an empty page when my site looks fine? +
The most common cause we know of, because it was ours: build tooling that inlines CSS ahead of content. stacktr.ee's Astro config had inlineStylesheets set to always, which put a 99KB Tailwind stylesheet before the markup and pushed the first heading past byte 100,000. An extractor with a byte budget saw styles and no words. One config flip moved the heading to byte 5,425 and took the text-to-markup ratio from 4.7% to 18.6%. No human ever saw the difference.
Do I need to publish a business address for Organization schema? +
Not a street address. The completeness checks want Organization JSON-LD with a contactPoint and a PostalAddress, but a locality-level address passed for us: addressLocality London, addressCountry GB, nothing more. You can satisfy legitimacy checks without putting your home address on the internet.
What are OpenAPI operationIds and why do agents need them? +
Stable names for each endpoint that become the function-calling tool names a model sees when your OpenAPI spec is loaded into an agent framework. Without explicit operationIds, generators invent names at load time, and different generators invent different ones. Stacktree's are pinned and path-derived, like getSites and postPublish, and typed response schemas cover all 48 operations; it was the cheapest fix on the list.
How do I make my website agent-ready without a rebuild? +
In rough order of value: check what an agent actually sees by curling your homepage and finding the byte offset of your first heading; serve llms.txt and keep it current; return recovery links on 404s instead of a bare error shell; add Organization and WebSite JSON-LD with a contactPoint; add operationIds and response schemas to your OpenAPI spec; and return standard RateLimit headers plus Retry-After so well-behaved agents can self-throttle instead of hammering you.
Keep reading

Related guides

References

Sources and further reading

The storefront in the story.

Publish HTML from any agent to a private link: REST, MCP, or no account at all.

Sign up free →