Report for
example.com
https://example.com/visit site ↗
- Find
blocked
- Understand
blocked
- Act
blocked
- Survival
- 28
- Can an agent read and act at all?
- Superpower
- 0
- WebMCP tools exposed
- If WebMCP added
- 44
- Headline with WebMCP at full marks
Do this first
ranked by severity × category weight
- Machine-readable structurehigh
No structured data (JSON-LD)
Add a JSON-LD block describing the page's primary entity.
Show the fix
One script tag turns guesswork into facts. Start with WebSite/Organization, then the page type (Product, Article, FAQPage…).
Reference ↗<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebSite", "name": "example.com", "url": "https://example.com/", "potentialAction": { "@type": "SearchAction", "target": "https://example.com/search?q={query}", "query-input": "required name=query" } } </script> - WebMCP capabilityhigh
No WebMCP tools — this is the biggest single upgrade available
Declare a site-search tool
Show the fix
The declarative attributes are the cheapest path: the browser synthesizes the JSON Schema from the controls you already have.
Reference ↗<form action="/search" method="get" toolname="search_site" tooldescription="Search https://example.com"> <input name="q" type="search" toolparamdescription="Search query" required> <button type="submit">Search</button> </form>
- Agent discoverymedium
No sitemap found
Publish /sitemap.xml and reference it from robots.txt.
Show the fix
Most frameworks generate one; Next.js supports app/sitemap.ts.
Reference ↗<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/</loc></url> </urlset>
Category breakdown
- 15
Agent discovery
Agents have little to go on beyond the HTML itself.
weight 26.1% · confidence high
- 10
Machine-readable structure
Agents must infer what this page is from prose alone.
weight 26.1% · confidence high
- 60
Access & renderability
Readable, with some friction for agents.
weight 26.1% · confidence low
- n/a
Form semantics
No forms on this page.
weight 0% · confidence high
- n/a
Actionability
Nothing to do on this page (in the HTML).
weight 0% · confidence medium
- 0
WebMCP capabilitysuperpower
No WebMCP tools — the single biggest upgrade available here.
weight 21.7% · confidence medium
Find
blockedCan an agent locate this page and its entry points?
Agent discovery
15/100Agents have little to go on beyond the HTML itself.
lowNo robots.txtAbsence means allow-all, but you lose the chance to point agents at your sitemap and declare agent policy.▶
Evidence
- robots.txt · https://example.com/robots.txt not found
Fix
Add a minimal robots.txt with a Sitemap line.
Two lines that every crawler and agent reads first.
User-agent: * Allow: / Sitemap: https://example.com/sitemap.xml
mediumNo sitemap foundAgents that plan multi-step tasks use the sitemap to find the right page without crawling.▶
Evidence
- sitemap.xml · https://example.com/sitemap.xml not found and no Sitemap: line in robots.txt
Fix
Publish /sitemap.xml and reference it from robots.txt.
Most frameworks generate one; Next.js supports app/sitemap.ts.
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/</loc></url> </urlset>
lowNo llms.txtAn optional Markdown file that tells LLM-based agents what the site is and where the important pages are. Cheap to add; adoption by agents is still emerging.▶
Evidence
- llms.txt · https://example.com/llms.txt not found
Fix
Add /llms.txt (Markdown).
Five minutes of work; some agents and Lighthouse's agentic audit already look for it.
# example.com > One-paragraph description of what this site is for and who it serves. ## Key pages - [Home](https://example.com/): what visitors can do here - [Docs](https://example.com/docs): how to use the product
lowNo feed or API description linkedNothing on the page tells an agent where structured data or an API lives.▶
Evidence
- raw-html · No <link rel=alternate type=application/rss+xml> or OpenAPI link
Fix
Link your API description or a feed from <head>.
A single <link> makes the machine entry point discoverable without guessing URLs.
<link rel="service-desc" type="application/vnd.oai.openapi+json" href="https://example.com/openapi.json"> <!-- or --> <link rel="alternate" type="application/rss+xml" title="Updates" href="https://example.com/feed.xml">
lowNo MCP discovery filesNothing under /.well-known tells an agent whether this site exposes an MCP server. Only relevant if you run one — but if you do, this is how agents find it.▶
Evidence
- well-known · https://example.com/.well-known/oauth-protected-resource, mcp.json, mcp/server-card.json not found
Fix
If you host an MCP server, publish /.well-known/oauth-protected-resource.
Required by the MCP authorization spec; clients use it to locate your authorization server.
{
"resource": "https://example.com/mcp",
"authorization_servers": ["https://auth.example.com"],
"scopes_supported": ["read"],
"bearer_methods_supported": ["header"]
}Understand
blockedCan it tell what the page is without guessing?
Machine-readable structure
10/100Agents must infer what this page is from prose alone.
highNo structured data (JSON-LD)Without schema.org markup an agent must infer what this page is — a product, an article, an organisation — from prose. That inference is where agents make mistakes.▶
Evidence
- raw-html · No script[type=application/ld+json] found
Fix
Add a JSON-LD block describing the page's primary entity.
One script tag turns guesswork into facts. Start with WebSite/Organization, then the page type (Product, Article, FAQPage…).
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "example.com",
"url": "https://example.com/",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={query}",
"query-input": "required name=query"
}
}
</script>lowMissing meta descriptionTitle and description are the first summary an agent reads when deciding whether this page is relevant.▶
Evidence
- raw-html · title: "Example Domain"; description: none
Fix
Add a specific <title> and meta description.
Cheap, universal, and used by every agent and crawler.
<title>What this page is — example.com</title> <meta name="description" content="One sentence saying what a visitor (or agent) can do here.">
lowNo OpenGraph metadataSocial metadata is a minor signal for agents, but many crawlers read og:* as a fallback summary.▶
Evidence
- raw-html · No meta[property^=og:]
Fix
Add og:title, og:description and og:image.
Low effort; improves link previews and gives agents a second summary source.
<meta property="og:title" content="Example Domain"> <meta property="og:description" content="…"> <meta property="og:image" content="https://example.com/og.png">
mediumNo <main> landmarkLandmarks tell an agent where the content is and what is chrome. Found: none.▶
Evidence
- raw-html · No <main> or [role=main]
Fix
Wrap the primary content in <main>; use <nav>, <header>, <footer>.
Semantic landmarks are free structure — screen readers and agents both use them to skip chrome.
<header>…site header…</header> <nav aria-label="Primary">…</nav> <main> …the content agents should read… </main> <footer>…</footer>
mediumNo <h1> on the pageAgents build an outline from headings to decide what a page is about and where sections start.▶
Evidence
- raw-html · h1×0, total headings 0, skipped levels 0
Fix
One <h1> per page; do not skip levels (h2 → h4).
A clean outline is the cheapest map of your page an agent can get.
Reference ↗lowNo canonical URLLanguage and canonical URL help agents choose the right version of a page and parse its text correctly.▶
Evidence
- raw-html · lang=en; canonical=none
Fix
Declare lang and a canonical link.
Two attributes; prevents duplicate-URL confusion and wrong-language parsing.
<html lang="en"> <head> <link rel="canonical" href="https://example.com/">
Access & renderability
60/100Readable, with some friction for agents.
mediumPage likely depends on JavaScriptThe rendered DOM was not tested; this assessment is heuristic based on the raw HTML only. Overall score is capped at 60 when two JS-dependence heuristics fire.▶
Evidence
- raw-html · 2 JS-dependence heuristics fired
Fix
Server-render the primary content so the first HTML response contains it.
Agents fetch raw HTML; SPAs that mount into empty divs hide their content.
Server-render the primary content: in Next.js use Server Components / generateStaticParams; in a client-only SPA add pre-rendering (e.g. prerender step or SSR) so the first HTML response contains the content.
2 things already working
- ✓Response headers allow agent access — No noindex/noai directives or bot-management headers detected.
- ✓No CAPTCHA markup detected — No reCAPTCHA, hCaptcha, or Turnstile widgets found in the raw HTML.
Act
blockedCan it complete the task — book, buy, submit?
Form semantics — not applicable. No forms on this page.
Actionability — not applicable. Nothing to do on this page (in the HTML).
WebMCP capability
0/100No WebMCP tools — the single biggest upgrade available here.
highNo WebMCP tools — this is the biggest single upgrade availableWebMCP lets a page hand an agent a named, typed tool instead of a form it has to reverse-engineer. Browsers in the Chrome/Edge origin trial and agent clients such as ChatGPT Desktop already call these tools. The "+N" on this report is what declaring one is worth to your score. Note that we only read the served HTML: a tool registered from a JavaScript bundle would be invisible to us.▶
Evidence
- raw-html · No form on this page — the snippet below is a site-search starting point
Fix
Declare a site-search tool
The declarative attributes are the cheapest path: the browser synthesizes the JSON Schema from the controls you already have.
<form action="/search" method="get" toolname="search_site" tooldescription="Search https://example.com"> <input name="q" type="search" toolparamdescription="Search query" required> <button type="submit">Search</button> </form>
infoSame tool, imperative APIIf the form is rendered by JavaScript or the tool needs to do more than submit, register it imperatively. execute() resolves to a plain JSON-serializable value; the browser stringifies it.▶
Evidence
- raw-html · No form on this page — the snippet below is a site-search starting point
Fix
Register the tool with document.modelContext.registerTool.
WebMCP is not on by default in any shipping browser yet, so include the polyfill: <script src="https://unpkg.com/@mcp-b/webmcp-polyfill@5.1.0/dist/index.iife.js" integrity="sha384-ZLqD1afbu2b2LJVDDqBf95wR/DGWh5FT1bx6E2S+4uMPdMOc8QGIIfw2gBWLKIB2" crossorigin="anonymous"></script>
// Until Chrome ships WebMCP by default, include the polyfill:
// <script src="https://unpkg.com/@mcp-b/webmcp-polyfill@5.1.0/dist/index.iife.js" integrity="sha384-ZLqD1afbu2b2LJVDDqBf95wR/DGWh5FT1bx6E2S+4uMPdMOc8QGIIfw2gBWLKIB2" crossorigin="anonymous"><\/script>
document.modelContext.registerTool({
name: "search_site",
description: "Search https://example.com",
inputSchema: {
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Search query"
}
},
"required": [
"q"
]
},
async execute({ q }, { signal }) {
const res = await fetch("/api/search?q=" + encodeURIComponent(q), { signal });
return await res.json(); // plain JSON-serializable value — not an MCP { content } envelope
},
annotations: { readOnlyHint: true },
});Fetched Wed, 14 Oct 2026 19:24:29 GMT in 0.1s · HTTP 200 · 8 discovery files checked · rendered DOM: skipped
Rendered-DOM checks are not run in v1; JavaScript dependence is estimated from the raw HTML.