rubric v0.9 · scanned
cloudflare.com
MCP server tester
Your MCP server result
The MCP server tester puts these checks first. The full report below lists every check, these included.
-
Passed Adopted MCP server answers and lists its tools — The server card at /.well-known/mcp/server-card.json names https://docs.mcp.cloudflare.com/mcp. It answered initialize with protocol version 2025-11-25, and tools/list named 2 tools: "search_cloudflare_documentation" and "migrate_pages_to_workers_guide". The scan called no tool.
Observation
{"endpoint":"https://docs.mcp.cloudflare.com/mcp","discoveredBy":"server-card","protocolVersion":"2025-11-25","tools":["search_cloudflare_documentation","migrate_pages_to_workers_guide"],"requests":["initialize 200","notifications/initialized 202","tools/list 200"]}An agent given the address of an MCP server can call its tools. The scan opens one session to see that the server answers and what it offers.
Sources: MCP 2025-11-25: lifecycle (Model Context Protocol, 2025-11), MCP 2025-11-25: transports (Model Context Protocol, 2025-11), MCP 2025-11-25: tools (Model Context Protocol, 2025-11), Agentic AI Foundation: MCP joins the Linux Foundation (Linux Foundation, 2025-12)
- Read today by
- MCP clients: agent apps, coding agents, and chat products that connect to MCP servers.
- Google Search
- None
-
Out of scope 0 points Draft MCP server card — Not scored: this check applies to a site that runs an MCP server, and the scan found none.
An MCP server card describes a remote MCP server. It is an optional extension (SEP-2127), not core MCP.
Sources: SEP-2127 (Model Context Protocol, 2026-10), discovery.md (Model Context Protocol)
- Read today by
- MCP clients that implement SEP-2127; Cloudflare's scanner.
- Google Search
- None
Verdict
L5 · Agent-native
Web standards 92.4 · Agent conventions 79.4
Usable by agents: Yes: MCP server with 2 tools (search_cloudflare_documentation and migrate_pages_to_workers_guide)
L5 is the highest level in this rubric. Read the level rules
Readable: HTTP 200 at https://www.cloudflare.com/, 1,092 words in the HTML. 7 to fix, 3 optional choices, 2 agent conventions not used, 1 agent convention to correct, and 24 out of scope.
Give this site's MCP server to an agent and it can call these 2 tools: search_cloudflare_documentation and migrate_pages_to_workers_guide.
How this was measured
Measured at https://www.cloudflare.com/, where https://cloudflare.com/ redirects (HTTP 301).
Measured once, from 1 vantage point, at https://www.cloudflare.com. The scanner reads the homepage and at most 129 URLs, runs no JavaScript, and calls no API or MCP tool it finds.
Not a ranking prediction, not AI visibility, not a certification.
We sell no consulting. No ads, no sponsored listings, and we never contact the sites that are scanned. Scanning is free today.
Defects 7
Web-standards checks that fail or are partial, and optional files served with an error. Each lists what fixing it is worth.
-
Fails worth 2 points Adopted API catalog — No API catalog linkset was served: /.well-known/api-catalog answered HTTP 404.
An API catalog lists a publisher's APIs in one document at a fixed address (RFC 9727).
Sources: RFC 9727 (IETF, 2025-06)
- Read today by
- API clients that follow RFC 9727.
- Google Search
- None
Fix
{ "linkset": [ { "anchor": "<choose: URL that identifies the API>", "service-desc": [ { "href": "https://www.cloudflare.com/openapi.json" } ] } ] }Note
Serve it as Content-Type application/linkset+json with profile="https://www.rfc-editor.org/info/rfc9727" and keep the anchors and hrefs absolute URLs that resolve. A target only counts once it answers: point service-desc at a document the scanner already requests, such as /openapi.json, and make it return 200, because an href that is never fetched leaves the catalog partial.
Verify with
ORIGIN=https://www.cloudflare.com curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: application/linkset+json, application/json;q=0.9, */*;q=0.5' "$ORIGIN/.well-known/api-catalog" | jq '.linkset[] | {anchor, "service-desc": .["service-desc"], status: .status}' -
Partial worth 2 points Adopted Title and description — Title "Cloudflare: Build for the agent era" (35 characters) and a description of 68 characters. The first H1 "Everything we learned from powering 20% of the Internet—yours by defa…" shares 0 of 3 words with the title, brand names aside. The other H1 does not reflect it either. Microsoft's guide to AI search answers (October 2025) asks for an H1 that matches the title or closely reflects it.
Observation
title (35 characters): Cloudflare: Build for the agent era · description (68 characters): Welcome to Cloudflare - Powering the next generation of applications · first H1: Everything we learned from powering 20% of the Internet—yours by default
The title and the description say what a page is about. Google uses them for the title link and the snippet.
Sources: Google: title links (Google Search Central), Google: snippets (Google Search Central), Bing Webmaster Guidelines, §13: titles, descriptions and headings (Microsoft Bing), Microsoft: optimizing content for AI search answers (Microsoft Advertising, 2025-10)
- Read today by
- Google, Bing, and link previews.
- Google Search
- Direct
Note
Give the first H1 and the title the same subject. Either can change, and brand names do not count.
Verify with
HOMEPAGE=https://www.cloudflare.com/ curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$HOMEPAGE" | perl -0777 -CS -ne 'if (m{<title[^>]*>(.*?)</title>}si) { my $t=$1; $t=~s/\s+/ /g; $t=~s/^ | $//g; print "title (", length($t), "): $t\n" } else { print "title: none\n" } if (m{<meta\b[^>]*\bname=["\x27]?description["\x27]?[^>]*>}i) { my ($c)=$& =~ /\bcontent=["\x27]([^"\x27]*)/i; $c //= ""; print "description (", length($c), "): $c\n" } else { print "description: none\n" }' -
Partial worth 0.5 points Adopted Service status and changelog feed — A status page answered at /status (HTTP 200), but the homepage links no status or changelog feed.
A status page and a changelog feed say whether the service is up and what changed.
Sources: RFC 9727 (status relation) (IETF), RFC 4287 (IETF)
- Read today by
- Integrators and monitoring tools.
- Google Search
- None
Fix
<link rel="alternate" type="application/atom+xml" title="Changelog" href="https://www.cloudflare.com<choose: path of the changelog feed>">Note
A link only counts if it resolves: a feed that 404s is served with an error, and one whose newest entry is months old is stale. The scan reads a status page on the scanned origin, such as /status; a status page on another host is not requested, so it is reported as not measured.
Verify with
ORIGIN=https://www.cloudflare.com curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$ORIGIN/" | grep -oiE '<link[^>]+(atom|rss)[^>]*>|href="[^"]*(status|changelog)[^"]*"' | sort -u for p in /status /changelog; do printf '%s -> ' "$p"; curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' -o /dev/null -w '%{http_code} %{content_type}\n' "$ORIGIN$p"; done -
Partial worth 0.3 points Adopted Structured contact information — Homepage markup declares 1 organization-type node with 0 contact details, while the page itself carries 0 plain-text contact signals. Organization "Cloudflare": no contact detail.
A ContactPoint in the Organization markup makes the contact route machine-readable.
Sources: Google: Organization structured data (Google Search Central)
- Read today by
- Google lists contactPoint as a recommended Organization property.
- Google Search
- Indirect
Fix
{ "contactPoint": { "@type": "ContactPoint", "contactType": "<choose: what this contact is for, such as customer service>", "email": "<choose: email address>" } }Verify with
HOMEPAGE=https://www.cloudflare.com/ curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$HOMEPAGE" | tr -d '\n' | grep -oE '"contactPoint":|"(contactType|email|telephone)":"[^"]*"' | sort -u -
Partial worth 0.3 points Adopted HTTP caching of the homepage — The homepage sends Cache-Control "max-age=10" and no ETag or Last-Modified header, so a crawler cannot ask whether it changed, and no conditional request was made.
Observation
Cache-Control: max-age=10 · ETag: (none) · Last-Modified: (none) · no conditional GET
Cache-Control says how long the homepage may be reused. A validator lets a crawler ask whether it changed, and a 304 answer skips the body.
Sources: RFC 9111: HTTP Caching (IETF, 2022-06), RFC 9110, 13: conditional requests (IETF), Google: HTTP caching for crawlers (Google Search Central, 2024-12), Bing Webmaster Guidelines, §3: ETag and lastmod (Microsoft Bing)
- Read today by
- Googlebot sends If-None-Match and If-Modified-Since. Every HTTP cache reads Cache-Control.
- Google Search
- Direct
Fix
ETag: "<choose: a value that changes when the page changes>"Note
Most servers send an ETag or a Last-Modified header for a static page and answer If-None-Match with 304 Not Modified. A page rendered on each request needs the framework to set them.
Verify with
HOMEPAGE=https://www.cloudflare.com/ HEADERS=$(curl -sSL -o /dev/null -D - -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$HOMEPAGE" | tr -d '\r') printf '%s\n' "$HEADERS" | grep -iE '^(cache-control|etag|last-modified):' ETAG=$(printf '%s\n' "$HEADERS" | sed -n 's/^[Ee][Tt][Aa][Gg]: *//p' | tail -1) DATE=$(printf '%s\n' "$HEADERS" | sed -n 's/^[Ll][Aa][Ss][Tt]-[Mm][Oo][Dd][Ii][Ff][Ii][Ee][Dd]: *//p' | tail -1) curl -sSL -o /dev/null -w 'status=%{http_code}\n' -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' -H "If-None-Match: $ETAG" -H "If-Modified-Since: $DATE" "$HOMEPAGE" -
optional file, served with an error 0 points Experimental Sandbox or test environment documented — A sandbox is referenced at /docs, but it names no non-production base URL, so an agent cannot integrate safely.
A documented sandbox lets a client test calls without touching production data.
Sources: OpenAPI 3.1 (servers) (OpenAPI Initiative)
- Read today by
- API integrators.
- Google Search
- None
Note
Merge the two servers entries into the OpenAPI document you already publish rather than replacing it: OpenAPI standardises servers but says nothing about test keys, sandbox tenants, or data resets, so those can only be stated as info.description prose. A sandbox on its own host is reported as declared, not observed, because this scan requests no other host; one on the scanned host has to answer a request without credentials. The declaring source also has to say what the sandbox excludes - no live data, test data only, resets nightly - because that statement is part of what the check reads.
Verify with
ORIGIN=https://www.cloudflare.com { curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: application/json, application/linkset+json;q=0.9, */*;q=0.5' "$ORIGIN/openapi.json" | jq -r '.servers[]?.url' 2>/dev/null | grep -iE 'sandbox|staging|test'; curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$ORIGIN/docs/sandbox" | grep -oiE 'https://[a-z0-9.-]*(sandbox|staging)[a-z0-9./_-]*'; } | sort -u | while read -r u; do printf '%s -> ' "$u"; curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' -o /dev/null -w '%{http_code} %{content_type}\n' "$u"; done -
optional file, served with an error 0 points Adopted security.txt (RFC 9116) — security.txt at /.well-known/security.txt: 2 Contact lines; no Expires line. RFC 9116 says every file carries a Contact and an Expires line. Not scored: its Policy URL /disclosure/ answered HTTP 200.
Observation
Contact: https://hackerone.com/cloudflare # All abuse reports should be submitted to our Trust & Safety team through # our dedicated page. Contact: https://www.cloudflare.com/abuse/ Policy: https://www.cloudflare.com/disclosure/ Hiring: https://www.cloudflare…
security.txt tells a researcher where to report a vulnerability (RFC 9116). It has no effect on search.
Sources: RFC 9116 (IETF, 2022-04)
- Read today by
- Security researchers and disclosure tools.
- Google Search
- None
Fix
Expires: 2027-04-18T17:05:35.000ZNote
Add this line to /.well-known/security.txt, in place of any Expires line it has. RFC 9116 recommends an Expires less than a year ahead.
Verify with
ORIGIN=https://www.cloudflare.com curl -sSL -o /dev/null -w '/.well-known/security.txt HTTP %{http_code} %{content_type}\n' -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/plain, */*;q=0.5' "$ORIGIN/.well-known/security.txt" curl -sSL -o /dev/null -w '/security.txt HTTP %{http_code} %{content_type}\n' -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/plain, */*;q=0.5' "$ORIGIN/security.txt" curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/plain, */*;q=0.5' "$ORIGIN/.well-known/security.txt" | grep -Ei '^(contact|expires|canonical|policy|preferred-languages):'
Optional choices 3
Show 3 Hide 3 in Optional choices
Decisions only you can make. None earns points or holds a level.
-
Not used 0 points Adopted Snippet and AI grounding directives — Not used: the homepage has no noarchive, nocache, nosnippet or max-snippet:0 directive, and no data-nosnippet attribute, so Bing applies none of the limits they set on snippets and Copilot answers.
Observation
no robots meta tag for robots, bingbot or googlebot, no X-Robots-Tag header · data-nosnippet: 0 elements
noarchive, nocache, nosnippet and data-nosnippet limit how Bing shows a page and how Copilot uses it. Each is the site owner's choice.
Sources: Bing Webmaster Guidelines, §10: NOARCHIVE, NOCACHE and NOSNIPPET (Microsoft Bing), Bing: robots meta tags and attributes that Bing supports (Microsoft Bing), Google: robots meta tag specifications (Google Search Central)
- Read today by
- Bing reads all five, and Copilot follows noarchive and nocache. Google reads nosnippet, max-snippet and data-nosnippet.
- Google Search
- Direct
Note
Each directive is your choice. noarchive keeps the page out of Copilot answers, nocache lets Copilot use only the URL, the title and the snippet, and nosnippet or data-nosnippet may limit the quality of what Copilot cites.
Verify with
HOMEPAGE=https://www.cloudflare.com/ curl -sSL -o /dev/null -D - -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$HOMEPAGE" | tr -d '\r' | grep -i '^x-robots-tag:' curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$HOMEPAGE" | perl -0777 -ne 'my $h = /^(.*?)<\/head>/si ? $1 : substr($_, 0, 8192); while ($h =~ m{<meta\b[^>]*>}gi) { my $t = $&; next unless $t =~ /\bname=["\x27]?(robots|bingbot|googlebot)["\x27]?[\s>\/]/i; my $n = lc $1; my ($c) = $t =~ /\bcontent=["\x27]([^"\x27]*)/i; print "meta $n: ", ($c // ""), "\n" } my $body = $_; $body =~ s{<!--.*?-->}{}gs; $body =~ s{<(script|style|template|title|textarea|noscript)\b[^>]*>.*?</\1\s*>}{}gsi; my $n = 0; while ($body =~ m{<[a-z][a-z0-9-]*\b((?:[^>"\x27]|"[^"]*"|\x27[^\x27]*\x27)*)>}gi) { (my $t = $1) =~ s{"[^"]*"|\x27[^\x27]*\x27}{}g; $n++ if $t =~ /(?:^|\s)data-nosnippet(?=[\s=\/]|$)/i } print "data-nosnippet: $n\n"' -
Not used 0 points Adopted Breadcrumb markup on an inner page — The inner page /resource/contact-enterprise-sales/ has no BreadcrumbList in its JSON-LD, Microdata, or RDFa.
Observation
https://www.cloudflare.com/resource/contact-enterprise-sales/ · HTTP 200 · text/html · BreadcrumbList: 0
BreadcrumbList states where an inner page sits in the site. A homepage has no trail.
Sources: Google: breadcrumb (Google Search Central), Google blog (Google Search Central, 2025-01)
- Read today by
- Google shows breadcrumbs in desktop results.
- Google Search
- Direct
Fix
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Cloudflare", "item": "https://www.cloudflare.com/" }, { "@type": "ListItem", "position": 2, "name": "<choose: name of this section>", "item": "<choose: URL of the /resource page, if the site has one>" }, { "@type": "ListItem", "position": 3, "name": "Contact Enterprise Sales", "item": "https://www.cloudflare.com/resource/contact-enterprise-sales/" } ] } </script>Note
Replace each <choose: …> with the name or the URL the site uses for that section, and drop a level that has no page. Show the same trail as links on the page.
Verify with
PAGE=https://www.cloudflare.com/resource/contact-enterprise-sales/ curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' -o /tmp/aws-page.html "$PAGE"; perl -0777 -ne 'while (m{<script[^>]*application/ld\+json[^>]*>(.*?)</script>}gsi) { print "$1\n" }' /tmp/aws-page.html | jq -r '.. | objects | select((.["@type"]? | if type == "array" then .[] else . end) == "BreadcrumbList") | .itemListElement[] | [(.position | tostring), (.name // .item.name? // "NO NAME"), ((.item["@id"]? // .item) // "NO URL" | tostring)] | @tsv'; grep -c 'schema.org/BreadcrumbList' /tmp/aws-page.html -
Not used 0 points Experimental Rate limits and quotas documented — Not published: the developer documentation (/docs/rate-limits answered HTTP 404) states no quota, and the probe responses carry 0 quota headers.
Declared limits let a client pace its calls. RateLimit headers are an IETF draft.
Sources: draft-ietf-httpapi-ratelimit-headers (IETF)
- Read today by
- API clients.
- Google Search
- None
Note
No IETF standard covers a machine-readable quota declaration: RateLimit and RateLimit-Policy are still an Internet-Draft (draft-ietf-httpapi-ratelimit-headers, a WG document and not an RFC), and the widely deployed X-RateLimit-* family was never specified. Publish the numbers as this documented local convention and make the server enforce them, because a page that promises a limit the API does not return 429 with Retry-After for misleads an agent more than no page at all.
Verify with
ORIGIN=https://www.cloudflare.com { curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: application/json, application/linkset+json;q=0.9, */*;q=0.5' "$ORIGIN/rate-limits.json" | jq -c '{policies:[.policies[]?|{name,scope,limit,unit,window}],onExceeded}' 2>/dev/null || echo 'no rate-limits.json'; curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$ORIGIN/docs/rate-limits" | grep -oiE '[0-9,]+ (requests?|calls?) per (second|minute|hour|day)|429|retry-after'; curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' -D - -o /dev/null "$ORIGIN/" | grep -iE '^(HTTP/|ratelimit|retry-after|x-ratelimit)'; } | head -25
Agent conventions 10
Show 10 Hide 10 in Agent conventions
The scored ones make up 30% of the score, and the unscored ones earn no points. None has an effect on Google Search today. Each scored row not in use lists what using it is worth.
-
Not used worth 3.5 points Adopted Structured errors for JSON requests — Not used: /aws-probe-b7f46872c3f5, asked for JSON, answered HTTP 404 with an HTML page, not a JSON error.
Observation
HTTP 404 · text/html · first 16 KB read · final https://www.cloudflare.com/aws-probe-b7f46872c3f5/
An agent that asks for JSON and gets an HTML error page has to read a page meant for people. RFC 9457 defines a JSON error format.
Sources: RFC 9457: Problem Details for HTTP APIs (IETF, 2023-07), RFC 9110, 12.5.1: Accept (IETF)
- Read today by
- API clients and agents that send Accept: application/json. No search engine reads it.
- Google Search
- None
Fix
{ "type": "about:blank", "title": "Not Found", "status": 404, "detail": "Nothing is published at this address." }Note
Send this with Content-Type: application/problem+json and the status 404 when a request for a missing path asks for JSON. Browsers can keep the HTML page (RFC 9457).
Verify with
ORIGIN=https://www.cloudflare.com MISSING="/aws-probe-$(head -c 6 /dev/urandom | od -An -tx1 | tr -d ' \n')" curl -sS -D - -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: application/json, application/problem+json;q=0.9, */*;q=0.1' "$ORIGIN$MISSING" | head -20 -
Partial worth 2.6 points Experimental WebMCP browser tool declaration — The homepage declares 1 WebMCP tool: 1 registerTool call, 0 with a name, a description, and an inputSchema. An incomplete tool cannot be called reliably.
WebMCP lets a page register tools for an in-browser agent. It is a W3C Community Group draft.
Sources: WebMCP draft (W3C Web Machine Learning Community Group), Chrome: WebMCP (Chrome for Developers)
- Read today by
- Chrome, behind an origin trial. Lighthouse audits it.
- Google Search
- None
Fix
// WebMCP (W3C Community Group draft): register a tool an in-browser agent can call. if ('modelContext' in navigator) { navigator.modelContext.registerTool({ name: 'search_site', description: 'Search this site and return the matching pages.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The words to search for' } }, required: ['query'], }, async execute({ query }) { // Call the site's own search here and return its results as text. return { content: [{ type: 'text', text: 'Results for ' + query }] }; }, }); }Note
Give every tool a name, a description, and an input schema: registerTool() takes them as members, and a form takes toolname and tooldescription.
Verify with
HOMEPAGE=https://www.cloudflare.com/ curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7' "$HOMEPAGE" | grep -oE 'registerTool\(|<form[^>]*toolname[^>]*>' | sort | uniq -c -
Present Adopted AI crawler policy in robots.txt — 7 of 18 AI crawler tokens have their own robots.txt group: GPTBot, ChatGPT-User, PerplexityBot, Google-Extended, CCBot and anthropic-ai allowed, and 1 more. The other 11 follow the * group (1 of the file's 9 rules).
Observation
GPTBot: own group, 1 rule, allowed · ChatGPT-User: own group, 1 rule, allowed · PerplexityBot: own group, 1 rule, allowed · Google-Extended: own group, 1 rule, allowed · CCBot: own group, 1 rule, allowed · anthropic-ai: own group, 1 rule, allowed · cohere-ai: own group, 1 rule, allowed · * group: 1 rule, allowed, followed by 11 AI crawler tokens · robots.txt: 9 groups, 9 rules
A crawler follows the robots.txt group that names it, otherwise the * group. A named group states the site's rules for that crawler.
Sources: RFC 9309, 2.2.1 (IETF), Google common crawlers (Google Search Central), OpenAI bots (OpenAI)
- Read today by
- AI crawlers that document robots.txt tokens.
- Google Search
- None
-
Present Draft Content-Signal preferences — robots.txt states Content-Signal search=yes, ai-input=yes, ai-train=yes in the Cohere-ai group.
Observation
robots.txt: ai-train=yes, search=yes, ai-input=yes
Content-Signal states search, ai-input and ai-train preferences in robots.txt. No crawler documents honouring it.
Sources: Cloudflare: Content Signals Policy (Cloudflare, 2025-09), IETF AIPREF (IETF)
- Read today by
- Cloudflare's scanner scores it. The IETF AIPREF drafts are the standards track.
- Google Search
- None
-
Present Adopted Discovery via Link response headers — The homepage Link header names the OpenAPI document at /openapi.json (rel=service-desc) and /llms.txt (rel=service-doc). It does not name a markdown variant of the homepage.
Observation
link: <https://www.cloudflare.com/.well-known/api-catalog>; rel="api-catalog", <https://www.cloudflare.com/.well-known/agents.json>; rel="service-desc", <https://www.cloudflare.com/.well-known/webmcp.json>; rel="service-desc", <https://www.cloudflare.com/openapi.json>; rel="service-desc", <https://www.cloudflare.com/llms.txt>; rel="service-doc", <https://www.cloudflare.com/sit…
A Link header (RFC 8288) points a client at a resource before it parses the HTML.
Sources: RFC 8288 (IETF), IANA link relations (IANA)
- Read today by
- Clients that follow RFC 8288 and RFC 9727 links.
- Google Search
- None
-
Present Draft /llms-full.txt expanded context — /llms-full.txt carries 17307 words of page text in 166 KB. /llms.txt links it.
Observation
HTTP 200 · text/plain · 166 KB · # Cloudflare - Full Documentation > This is the expanded llms.txt for Cloudflare, containing full content from all page…
A convention that puts a site's text in one file. The llms.txt proposal does not define it.
Sources: llmstxt.org (llmstxt.org), Mintlify (Mintlify)
- Read today by
- Some documentation tools.
- Google Search
- None
-
Present Draft /llms.txt published and well-structured — /llms.txt opens with H1 "Cloudflare", with 12 H2 link sections and 90 links, 16.8 KB. The scan requested 7 links it names, and each answered 2xx. Not requested: 7 links on another origin and 76 same-origin links (the scan samples up to 6).
Observation
HTTP 200 · text/plain · 16.8 KB · headings: Cloudflare | About Cloudflare | Developer Platform - Compute | Developer Platform - Storage | Developer Platform - AI |…
A 2024 proposal for a markdown index of a site. Google Search does not use it.
Sources: llmstxt.org (llmstxt.org), Google: AI optimization guide (Google Search Central), Lighthouse llms.txt (Chrome for Developers)
- Read today by
- Some documentation tools and coding agents. Lighthouse audits it.
- Google Search
- None
-
Present Experimental Markdown content negotiation — The homepage serves text/markdown to `Accept: text/markdown, text/html;q=0.5`, with Vary: Accept, accept-encoding (HTTP 200).
Observation
HTTP 200 · text/markdown · Vary: Accept, accept-encoding · markdown body: yes
Some coding agents ask for text/markdown. Google Search does not use markdown.
Sources: RFC 7763 (IETF), Cloudflare: Markdown for Agents (Cloudflare), Google: AI optimization guide (Google Search Central)
- Read today by
- Claude Code, OpenCode and Cursor send Accept: text/markdown by default (Cloudflare, 2026-04).
- Google Search
- None
-
Not used 0 points Draft MPP discovery in OpenAPI (x-payment-info) — Not declared: /openapi.json describes 4 operations, and none declares x-payment-info.
Observation
/openapi.json: HTTP 200, 1 KB; 4 operations read
An operation with x-payment-info tells an agent that the call is paid, and states the intent, the payment method, and the amount. MPP is a draft, and charging agents is a business decision.
Sources: MPP (mpp.dev), MPP: multi-method discovery (mpp.dev), draft-ryan-httpauth-payment (IETF (individual draft)), isitagentready.com: MPP skill (isitagentready.com)
- Read today by
- Agents that pay with MPP; isitagentready.com.
- Google Search
- None
Note
Add x-payment-info to each operation you charge for, inside the OpenAPI description you already serve. Whether to charge agents, how much, and by which method are your decisions. MPP is a draft, so the field names may change.
Verify with
ORIGIN=https://www.cloudflare.com # The scan reads the OpenAPI description it already holds. /openapi.json is the usual path; use the path your description is served at. curl -sSL -A 'AgenticWebScore/0.3 (+https://agenticwebscore.com/bot)' -H 'Accept-Language: en' -H 'Accept: application/json, application/linkset+json;q=0.9, */*;q=0.5' "$ORIGIN/openapi.json" | jq -c '[.paths | to_entries[] | .key as $p | .value | to_entries[] | select(.value | type == "object" and has("x-payment-info")) | {operation: ((.key | ascii_upcase) + " " + $p), "x-payment-info": .value["x-payment-info"]}]' -
Present 0 points Draft Agent Skills declaration — Agent skills index at /.well-known/agent-skills/index.json lists 19 skills, each with name, type, description, url, and a sha256 digest under $schema https://schemas.agentskills.io/discovery/0.2.0/schema.json. 19 artifacts (https://developers.cloudflare.com/.well-known/agent-skills/agents-sdk.tar.gz, …) are on another host, which this scan does not request (declared, not observed).
An agent skills index lists skill packages for agent runtimes. It is a draft on GitHub.
Sources: Agent Skills Discovery RFC (Cloudflare)
- Read today by
- Agent runtimes that read the draft.
- Google Search
- None
Out of scope for this site 24
Show 24 Hide 24 in Out of scope for this site
The scan did not ask this site for these checks. Each says why. If one should apply, the error is ours, not yours.
Sites with an API or agent surface
The scan found an HTTP API. A check that reads another kind of surface is not asked.
-
Out of scope 0 points Draft A2A agent card — Not scored: this check applies to a site that runs an A2A agent, and the scan found none.
An A2A agent card describes an agent the site runs. An A2A server publishes it.
Sources: A2A specification (A2A Project)
- Read today by
- A2A clients.
- Google Search
- None
-
Out of scope 0 points Draft Cryptographically signed agent card — Not scored: this check applies to a site that runs an A2A agent, and the scan found none.
An A2A card may be signed with JWS. Signing is optional in the specification.
Sources: A2A specification (A2A Project), RFC 7515 (IETF)
- Read today by
- A2A clients that verify cards.
- Google Search
- None
-
Out of scope 0 points Experimental ARD resource discovery manifest — Not scored: the homepage links no ARD manifest, and the 4 manifest paths served none (/.well-known/ard.json 404 text/plain; /.well-known/agent-resources.json 404 text/plain; /.well-known/ai-catalog.json 404 text/plain; /ard.json 404 text/plain).
An ARD manifest lists a site's agent resources. Lighthouse does not count a missing one against a site.
Sources: Lighthouse agentic browsing (Chrome for Developers)
- Read today by
- Lighthouse (ard-schema audit).
- Google Search
- None
-
Out of scope 0 points Draft /auth.md agent authentication guide — Not scored: this check applies to a site that uses OAuth, and the scan found none.
auth.md is one vendor's convention (WorkOS) for telling an agent how to authenticate.
Sources: WorkOS auth.md (WorkOS)
- Read today by
- Agents built on WorkOS.
- Google Search
- None
-
Out of scope 0 points Experimental DNS-AID discovery record — Not scored: this check applies to a site that runs an MCP server or runs an A2A agent, and the scan found none.
DNS-AID publishes agents in DNS. It is an individual Internet-Draft with no IETF standing.
Sources: draft-mozleywilliams-dnsop-dnsaid (IETF)
- Read today by
- Cloudflare's scanner.
- Google Search
- None
-
Out of scope 0 points Draft MCP server card — Not scored: this check applies to a site that runs an MCP server, and the scan found none.
An MCP server card describes a remote MCP server. It is an optional extension (SEP-2127), not core MCP.
Sources: SEP-2127 (Model Context Protocol, 2026-10), discovery.md (Model Context Protocol)
- Read today by
- MCP clients that implement SEP-2127; Cloudflare's scanner.
- Google Search
- None
-
Out of scope Adopted OAuth discovery documents — Not scored: this check applies to a site that uses OAuth, and the scan found none.
-
Out of scope 0 points Draft Web Bot Auth key directory — Not scored: this check applies to a site that runs an A2A agent, and the scan found none.
The operator of a signing agent publishes its keys here. A site that only serves content needs none.
Sources: draft-ietf-webbotauth-httpsig-protocol (IETF, 2026-09), Cloudflare: Web Bot Auth (Cloudflare)
- Read today by
- Sites and CDNs that verify signed agents.
- Google Search
- None
Sites with a commercial signal
The homepage shows no commercial signal, so commerce checks are not asked of this site.
-
Out of scope 0 points Draft ACP discovery (/.well-known/acp.json) — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
An ACP discovery document at /.well-known/acp.json tells an agent where a business's checkout API is and which services it offers. The RFC behind it is a proposal.
Sources: ACP discovery RFC (status: Proposal) (Agentic Commerce Protocol), isitagentready.com: ACP skill (isitagentready.com)
- Read today by
- Agents that implement ACP checkout; isitagentready.com.
- Google Search
- None
-
Out of scope 0 points Draft Agent purchase policy — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
Whether agents may buy, and with what approval, is a policy the site states.
Sources: ACP (Agentic Commerce Protocol)
- Read today by
- Agent checkouts.
- Google Search
- None
-
Out of scope Adopted Inventory and price freshness — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
availability says whether an item is in stock. A past priceValidUntil can hide a product snippet.
Sources: Google: product snippet (Google Search Central)
- Read today by
- Google product snippets.
- Google Search
- Direct
-
Out of scope 0 points Draft Agent payment protocol (UCP profile or x402) — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
-
Out of scope Adopted Product/catalog schema — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
Product and Offer markup on product pages feeds merchant listings.
Sources: Google: merchant listing (Google Search Central), Google: product (Google Search Central)
- Read today by
- Google merchant listings and shopping agents.
- Google Search
- Direct
-
Out of scope Adopted Return policy machine-readable — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
A MerchantReturnPolicy states return terms in markup, also under the Organization.
Sources: Google: return policy (Google Search Central)
- Read today by
- Google merchant listings.
- Google Search
- Direct
-
Out of scope Adopted Seller identity declared — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
On a marketplace, the seller named on an offer is who the buyer contracts with.
Sources: Google: merchant listing (Google Search Central)
- Read today by
- Google merchant listings.
- Google Search
- Direct
-
Out of scope Adopted Shipping cost and delivery declared — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
shippingDetails lets a client compute the delivered price.
Sources: Google: merchant listing (Google Search Central)
- Read today by
- Google merchant listings.
- Google Search
- Direct
-
Out of scope 0 points Draft UCP manifest (/.well-known/ucp) — Not scored: the homepage shows no commercial signal, so commerce checks are not asked of this site.
A UCP profile at /.well-known/ucp declares commerce capabilities. UCP is a draft.
Sources: UCP (Universal Commerce Protocol), Shopify profiles (Shopify)
- Read today by
- UCP agents; Shopify stores serve it.
- Google Search
- None
Every site
-
Out of scope 0 points Experimental AI usage policy page — Not scored: robots.txt and Content-Signal state no AI restriction, so there is none for a policy page to explain.
A page that explains in prose the AI restrictions the site states. No standard defines it.
Sources: RFC 9309 (IETF)
- Read today by
- People reading the site's terms.
- Google Search
- None
-
Out of scope 0 points Draft Machine-readable booking action — Not scored: this check applies to services sites; this site was measured as API platform.
A ReserveAction declares a booking target in markup. No search engine documents a feature that reads it.
Sources: schema.org/ReserveAction (Schema.org)
- Read today by
- None documented.
- Google Search
- None
-
Out of scope 0 points Adopted Documents in machine-readable formats — Not scored: this check applies to institution sites; this site was measured as API platform.
Tagged PDF or an HTML version can be read by screen readers and by machines.
Sources: GOV.UK: HTML not PDF (Government Digital Service), ISO 14289 (PDF/UA) (ISO)
- Read today by
- Screen readers; GOV.UK publishes HTML first.
- Google Search
- None
-
Out of scope 0 points Adopted FAQ markup for visible questions — Not scored: no heading on the homepage names a FAQ section, and the homepage carries no FAQPage markup.
Observation
visible questions under a FAQ heading: 0
FAQPage marks up questions that are visible on the page. Google stopped showing FAQ rich results on 7 May 2026.
Sources: Google Search updates (Google Search Central), Google: structured data policies (Google Search Central)
- Read today by
- Bing names FAQ markup as an example of labelled content.
- Google Search
- None
-
Out of scope 0 points Draft Reuse and licensing terms declared — Not scored: this check applies to publisher or institution sites; this site was measured as API platform.
TDMRep reserves text and data mining rights in a machine-readable form, as EU DSM Article 4(3) allows.
Sources: TDMRep CG report (W3C), Directive (EU) 2019/790 (European Union)
- Read today by
- Text and data mining tools that implement TDMRep.
- Google Search
- None
-
Out of scope 0 points Adopted Content provenance declared — Not scored: this check applies to publisher or institution sites; this site was measured as API platform.
Article markup with an author and dates lets a client attribute and date a source.
Sources: Google: Article structured data (Google Search Central)
- Read today by
- Google article features.
- Google Search
- Direct
-
Out of scope Adopted Service/product scope machine-readable — Not scored: the homepage markup declares no Service-type node.
Service markup states what is offered, by whom and where. An incomplete node leaves a client to guess.
Sources: schema.org/Service (Schema.org)
- Read today by
- Clients that read schema.org Service. Google has no Service rich result.
- Google Search
- None
Passed 16
Show 16 Hide 16 in Passed
Scored checks that pass, the heaviest first.
-
Passed Adopted MCP server answers and lists its tools — The server card at /.well-known/mcp/server-card.json names https://docs.mcp.cloudflare.com/mcp. It answered initialize with protocol version 2025-11-25, and tools/list named 2 tools: "search_cloudflare_documentation" and "migrate_pages_to_workers_guide". The scan called no tool.
Observation
{"endpoint":"https://docs.mcp.cloudflare.com/mcp","discoveredBy":"server-card","protocolVersion":"2025-11-25","tools":["search_cloudflare_documentation","migrate_pages_to_workers_guide"],"requests":["initialize 200","notifications/initialized 202","tools/list 200"]}An agent given the address of an MCP server can call its tools. The scan opens one session to see that the server answers and what it offers.
Sources: MCP 2025-11-25: lifecycle (Model Context Protocol, 2025-11), MCP 2025-11-25: transports (Model Context Protocol, 2025-11), MCP 2025-11-25: tools (Model Context Protocol, 2025-11), Agentic AI Foundation: MCP joins the Linux Foundation (Linux Foundation, 2025-12)
- Read today by
- MCP clients: agent apps, coding agents, and chat products that connect to MCP servers.
- Google Search
- None
-
Passed Adopted OpenAPI definition — OpenAPI 3.1.0 at /openapi.json (Link header rel=service-desc) declares info.title "Cloudflare Public Site API", info.version 1.0.0, and 4 paths. Not scored: the scan requested 4 of its 4 GET operations on this origin, and 3 answered with 2xx: /llms.txt answered HTTP 200; /llms-full.txt answered HTTP 200; /.well-known/api-catalog redirected to https://www.cloudflare.com/.well-known/api-catalog/ and answered HTTP 404; and 1 more.
Observation
tried: /.well-known/agents.json 200 | /.well-known/webmcp.json not requested | /openapi.json 200
An OpenAPI document describes an HTTP API so a client can call it without guessing.
Sources: OpenAPI 3.1 (OpenAPI Initiative), RFC 8631 (IETF)
- Read today by
- API clients and code generators.
- Google Search
- None
-
Passed Adopted JSON-LD structured data — 3 JSON-LD blocks parse, and the page entity, Organization "Cloudflare", is stated under a schema.org @context.
Observation
JSON-LD: 3 blocks, 3 parsed · schema.org @context: yes · Microdata: 0 items · RDFa: 0 items · top-level types: Organization, WebSite, WebPage
Structured data names the entity a page describes. Google reads JSON-LD, Microdata and RDFa alike.
Sources: Google: intro to structured data (Google Search Central), schema.org (Schema.org), Bing Webmaster Guidelines, §14: structured data (Microsoft Bing)
- Read today by
- Google rich results; any schema.org reader.
- Google Search
- Direct
-
Passed Adopted Content that needs no JavaScript — 6984 characters of text are in the HTML before any script runs.
Observation
static text: 6984 characters · inside <noscript>: 0 characters · markup: 1334077 characters
Several AI crawlers do not run JavaScript. Text that appears only after scripts run is invisible to them.
Sources: Vercel: the rise of the AI crawler (Vercel), Google: JavaScript SEO basics (Google Search Central), Bing Webmaster Guidelines, §8: rendering (Microsoft Bing)
- Read today by
- GPTBot and ClaudeBot fetch HTML without rendering; Googlebot renders.
- Google Search
- Indirect
-
Passed Adopted Readable homepage — Measured at https://www.cloudflare.com/, where https://cloudflare.com/ redirects (HTTP 301). HTTP 200 text/html, 1303 KB, 1092 words of visible text.
Observation
HTTP 200 · text/html · 1303 KB · final https://www.cloudflare.com/
The homepage is the first URL every agent requests. An error or an empty page gives it nothing to read.
Sources: RFC 9110 (IETF), Google: 301 redirects (Google Search Central), Bing Webmaster Guidelines, §7: 301 and 302 redirects (Microsoft Bing)
- Read today by
- Every crawler and agent.
- Google Search
- Direct
-
Passed Adopted Semantic heading structure — 2 H1s, 4 H2s, and 12 H3s in an outline of 51 headings. It jumps from H2 to H6, which the WAI tutorial advises against; more than one H1 is valid HTML.
Observation
outline: H1 H2 H6 H6 H3 H3 H3 H2 H3 H2 H3 H3 H2 H3 H4 H4 H4 H4 H6 H6 H6 H4 H4 H4 H6 H4 H6 H6 H6 H6 H6 H6 H6 H6 H6 H4 H6 H6 H6 H6 (first 40 of 51)
Headings outline the page for screen readers and for any client that splits text by section.
Sources: W3C WAI headings tutorial (W3C), Google SEO starter guide (Google Search Central), Bing Webmaster Guidelines, §13: titles, descriptions and headings (Microsoft Bing)
- Read today by
- Screen readers; clients that chunk HTML by heading.
- Google Search
- Indirect
-
Passed Adopted Homepage indexable: no noindex directive — No noindex: the homepage has no robots meta tag for robots, bingbot or googlebot, and no X-Robots-Tag header.
Observation
no robots meta tag for robots, bingbot or googlebot, no X-Robots-Tag header
A noindex in a meta tag or in a response header keeps the page out of search results. Bing keeps it out of Copilot too.
Sources: Bing Webmaster Guidelines, §10: NOINDEX and the other robots directives (Microsoft Bing), Bing: robots meta tags and attributes that Bing supports (Microsoft Bing), Google: block indexing with noindex (Google Search Central), Google: robots meta tag specifications (Google Search Central)
- Read today by
- Google and Bing. Bing applies the same directives to Copilot answers.
- Google Search
- Direct
-
Passed Adopted robots.txt crawl policy — /robots.txt has 9 groups and 9 rules across all groups, and 1 Sitemap line.
Observation
HTTP 200 · text/plain · 1.1 KB · # Robots.txt for www.cloudflare.com User-agent: * Allow: / # Sitemap Sitemap: https://www.cloudflare.com/sitemap.xml # AI/LLM friendly cont…
Crawlers read robots.txt before they fetch a page (RFC 9309). Its Sitemap line tells them where the URL list is.
Sources: RFC 9309 (IETF, 2022-09), Google robots.txt (Google Search Central)
- Read today by
- Google, Bing, and the AI crawlers that document robots.txt support.
- Google Search
- Direct
-
Passed Adopted XML sitemap — Sitemap https://www.cloudflare.com/sitemap.xml parses and lists 1011 URLs, each with <lastmod>.
Observation
HTTP 200 · application/xml · 1591 KB · root <urlset>
A sitemap lists the URLs a site wants crawled. Google says a small, well-linked site may not need one.
Sources: Google: build a sitemap (Google Search Central), sitemaps.org (sitemaps.org), Bing Webmaster Guidelines, §3: lastmod (Microsoft Bing)
- Read today by
- Google and Bing.
- Google Search
- Direct
-
Passed Adopted Documentation reachable — Documentation is reachable at /llms.txt (Link header rel=service-doc) and returns HTTP 200 text/plain with 1638 readable words.
Observation
tried: /llms.txt 200 | /docs 200 | /documentation 404 | /developers 200 | /gelistiriciler 404
Documentation linked as service-doc (RFC 8631), or from the homepage, is how a client learns the API.
Sources: RFC 8631 (IETF)
- Read today by
- Developers and agents integrating the API.
- Google Search
- None
-
Passed Adopted Canonical URL — Measured at https://www.cloudflare.com/, where https://cloudflare.com/ redirects (HTTP 301). Canonical https://www.cloudflare.com/ matches the page reached.
Observation
<link rel="canonical" href="https://www.cloudflare.com/">
A canonical link names the one URL a page is known by. Google treats it and redirects as canonical signals.
Sources: Google: consolidate duplicate URLs (Google Search Central), RFC 6596 (IETF), Bing Webmaster Guidelines, §6: duplicate URLs and canonicals (Microsoft Bing)
- Read today by
- Google and Bing.
- Google Search
- Direct
-
Passed Adopted Structured pricing information — Markup on /pricing carries 136 complete price nodes; the first, Offer "Requests", states 0.3 USD.
Observation
{"price":0.3,"priceCurrency":"USD","where":"/pricing"}A price in markup is read without parsing prose. An Offer with a price and no currency is ambiguous.
Sources: schema.org/Offer (Schema.org), Google: product snippet (Google Search Central)
- Read today by
- Clients that read schema.org Offer. Google reads an Offer only inside a Product, which product-schema measures.
- Google Search
- None
-
Passed Adopted Language declaration and multilingual access — html lang="en" with 10 hreflang alternates (x-default, es-es, fr-fr, de-de, it-it, pt-br), each with an absolute href, and one refers to this page.
Observation
html lang="en" · alternates: x-default -> https://www.cloudflare.com/, es-es -> https://www.cloudflare.com/es-es/, fr-fr -> https://www.cloudflare.com/fr-fr/, de-de -> https://www.cloudflare.com/de-de/, it-it -> https://www.cloudflare.com/it-it/, pt-br -> https://www.cloudflare.com/pt-br/, zh-cn -> https://www.cloudflare.com/zh-cn/, ja-jp -> https://www.cloudflare.com/ja-jp/, …
The lang attribute names the language of the text. WCAG 3.1.1 requires it at level A. Google reads hreflang, not lang.
Sources: WCAG 2.2, 3.1.1 (W3C), Google: managing multi-regional sites (Google Search Central), Google: localized versions (Google Search Central)
- Read today by
- Screen readers and translation tools. Google ignores the lang attribute and reads hreflang.
- Google Search
- Indirect
-
Passed Adopted A real 404 for a missing page — /aws-probe-b7f46872c3f5, a path that does not exist, answered HTTP 404 after a redirect to https://www.cloudflare.com/aws-probe-b7f46872c3f5/.
Observation
HTTP 404 · text/html · first 16 KB read · final https://www.cloudflare.com/aws-probe-b7f46872c3f5/
A URL that does not exist answers 404 or 410 (RFC 9110). A 200 there makes every mistyped link look like a page.
Sources: RFC 9110, 15.5.5: 404 Not Found (IETF), Google: HTTP status codes and soft 404s (Google Search Central), Bing Webmaster Guidelines, §9: 404 for missing pages (Microsoft Bing)
- Read today by
- Google reports a missing page that answers 200 as a soft 404. Every HTTP client reads the status first.
- Google Search
- Direct
-
Passed Adopted Per-page content separation (no SPA fallback) — The homepage and /about have different titles ("Cloudflare: Build for the agent era" and "About us | Cloudflare") and different main text (13% word overlap).
Observation
compared / with /about · titles "Cloudflare: Build for the agent era" / "About us | Cloudflare" · skeleton 31% · main-text word overlap 13% · main text 4513 characters
A route that answers every URL with the same page makes every URL look alike to a crawler.
Sources: Google: HTTP errors and soft 404s (Google Search Central)
- Read today by
- Google flags such pages as soft 404s.
- Google Search
- Direct
-
Passed Adopted Responsive markup — viewport content "width=device-width, initial-scale=1.0, viewport-fit=cover" sets width=device-width and leaves zoom on.
Observation
viewport meta: width=device-width, initial-scale=1.0, viewport-fit=cover
Google indexes the smartphone rendering of a page. A viewport that blocks zoom fails WCAG 1.4.4.
Sources: Google: mobile-first indexing (Google Search Central), WCAG 2.2, 1.4.4 (W3C)
- Read today by
- Browsers; Google's smartphone crawler renders the page with it. No Google feature reads the tag itself.
- Google Search
- Indirect
Hand this report to your coding agent
The prompt lists 7 checks to fix. Each has the value the scan measured and a command that repeats the measurement. It adds the change to make where the scan could build one. After them it lists 2 agent conventions, at lower priority. The prompt is served at https://agenticwebscore.com/aws/cloudflare.com/prompt.md. The command below prints it, so you can paste the output into your agent.
curl -s https://agenticwebscore.com/aws/cloudflare.com/prompt.md - prompt.md The prompt Paste this into your own agent
- agent-brief.md Agent brief The prompt plus every finding
- bundle.md Bundle Status and brief in one document
- status.md Status Every check with its measurement
This scan cannot see which AI answers cite the site. Bing Webmaster Tools reports citations in Copilot and in Bing's AI summaries under AI Performance. Google Search Console includes AI Overviews and AI Mode in its Performance report totals, without a separate view (Google's guide to AI features). Both need a verified owner of the site.
Badge
Show this score on your own site. Press Get the badge, paste its snippet into your homepage, and press Check my badge. The directory then lists your site as a verified listing.
Ship a fix, then re-scan
Measured 8 days ago. Nothing re-scans a site on its own. A scan runs once, when somebody asks for it — and that somebody need not be you. Anyone can request a scan of any public host, so this page may be the first you hear of it. After you ship a fix, press Re-scan now. A check that now passes adds its points to the score.
Why a re-scan can differ
The current rubric evaluates 3 of its 60 checks against a clock: security-txt, status-page, and inventory-freshness. They can change with no change to the site. A response slower than 12 s is reported as not measured, so the same bytes served slowly can move the score and the fingerprint.
Measured as: API / developer platform
Can an agent discover, authorise against and call the API without reading a tutorial? Checks that only apply to other site profiles were not scored, so you are not asked to do work that does not apply to you.
- · API / developer platform (score 7), matched: An OpenAPI document responds; A documentation path responds; A developer portal responds.
Signal scores
- API platform 7
- SaaS 4
- E-commerce 1
- Services 1
Modules
- Every site: always in scope.
- Sites with an API or agent surface : in scope.
- · Link rel="api-catalog" <https://www.cloudflare.com/.well-known/api-catalog> on the homepage
- · /openapi.json is an OpenAPI 3.1 document
- · homepage links https://developers.cloudflare.com/
- Sites with a commercial signal : out of scope. The homepage shows no commercial signal.
Scan record
- Target
- https://cloudflare.com
- Measured at
- https://www.cloudflare.com/
- Redirect
- https://cloudflare.com/ to https://www.cloudflare.com/, HTTP 301
- Scanned
- Requests
- 89
- Duration
- 4.3s
- Confidence
- 100% · high
- Rubric
- rubric v0.9
Fingerprint
53b19edfed7e… verify this record
full hash
53b19edfed7ea4ff0fa43e4aa5ef50c2354074259610da27c840862fdfbac45a
Page as an agent receives it
- Words
- 1092
- Est. tokens
- 1474
- Markup
- 1303.2 KB
- Language
- en
“Cloudflare: Build for the agent era”
By dimension
Each score is the share of the in-scope web-standards points a dimension earned. A dash means the dimension has no web-standards check in scope. The agent conventions are scored apart, as their own part.
-
Discoverability
98- Pass
- 5
- Partial
- 1
- Fails
- 0
- Not counted
- 0
Unscored: 0 in use, 0 not used
-
Content
90.3- Pass
- 7
- Partial
- 2
- Fails
- 0
- Not counted
- 1
Unscored: 0 in use, 1 not used
-
Crawler access
100- Pass
- 1
- Partial
- 0
- Fails
- 0
- Not counted
- 0
Unscored: 0 in use, 1 not used, 1 with an error
-
API and agent
89.1- Pass
- 3
- Partial
- 1
- Fails
- 1
- Not counted
- 1
Unscored: 1 in use, 2 not used, 1 with an error
-
Commerce
—- Pass
- 0
- Partial
- 0
- Fails
- 0
- Not counted
- 5
Unscored: 0 in use, 0 not used
Request transcript 89 requests
Every fetch this scan record logged, in order. A fetch that followed redirects shows how many redirect requests it made. A row marked POST is a message of the one MCP session the scan opened. It calls no tool.
59 fetches, 30 redirect requests.
-
/
200 +1 redirect text/html 1303.2 KB 223ms
-
/robots.txt
200 text/plain 1.1 KB 49ms
-
/sitemap.xml
200 application/xml 1591.4 KB 37ms
-
/llms.txt
200 text/plain 16.8 KB 52ms
-
/.well-known/security.txt
200 text/plain 368 B 76ms
-
/security.txt
404 text/plain 12 B 166ms
-
/about
200 +1 redirect text/html 253.5 KB 222ms
-
/contact
403 +2 redirects text/html 5.6 KB 29ms
-
/pricing
200 +2 redirects text/html 697.0 KB 197ms
-
/docs
200 +2 redirects text/html 215.4 KB 94ms
-
/developers
200 +2 redirects text/html 215.4 KB 89ms
-
/.well-known/api-catalog
404 +1 redirect text/html 16.1 KB 402ms
-
/openapi.json
200 application/json 1.5 KB 57ms
-
/.well-known/openapi.json
404 text/plain 12 B 92ms
-
/.well-known/mcp/server-card.json
200 application/json 1.3 KB 44ms
-
/.well-known/ai-catalog.json
404 text/plain 12 B 182ms
-
/.well-known/agent-card.json
404 text/plain 12 B 173ms
-
/.well-known/oauth-protected-resource
404 +1 redirect text/html 16.0 KB 510ms
-
/.well-known/oauth-authorization-server
404 +1 redirect text/html 16.0 KB 504ms
-
/.well-known/openid-configuration
404 +1 redirect text/html 16.0 KB 507ms
-
/llms-full.txt
200 text/plain 165.6 KB 90ms
-
/mcp
404 +1 redirect text/html 16.0 KB 715ms
-
/openapi.yaml
404 +1 redirect text/html 16.0 KB 535ms
-
/api/openapi.json
404 text/plain 12 B 130ms
-
/swagger.json
404 text/plain 12 B 252ms
-
/.well-known/agent-skills/index.json
200 application/json 8.8 KB 62ms
-
/.well-known/agent-skills.json
404 text/plain 12 B 95ms
-
/.well-known/skills.json
404 text/plain 12 B 175ms
-
/.well-known/ard.json
404 text/plain 12 B 199ms
-
/.well-known/agent-resources.json
404 text/plain 12 B 173ms
-
/ard.json
404 text/plain 12 B 255ms
-
/documentation
404 +1 redirect text/html 16.1 KB 542ms
-
/gelistiriciler
404 +1 redirect text/html 16.1 KB 543ms
-
/plans
200 +1 redirect text/html 697.0 KB 197ms
-
/status
200 +2 redirects text/html 28.9 KB 328ms
-
/changelog
404 +1 redirect text/html 19.8 KB 564ms
-
/releases
404 +1 redirect text/html 16.0 KB 842ms
-
/whats-new
200 +1 redirect text/html 389.4 KB 776ms
-
/docs/sandbox
404 +1 redirect text/html 16.0 KB 610ms
-
/sandbox
404 +1 redirect text/html 16.1 KB 742ms
-
/developers/sandbox
404 +1 redirect text/html 16.0 KB 589ms
-
/rate-limits.json
404 text/plain 12 B 214ms
-
/.well-known/rate-limits.json
404 text/plain 12 B 175ms
-
/docs/rate-limits
404 +1 redirect text/html 16.0 KB 474ms
-
/resource/contact-enterprise-sales/
200 text/html 409.0 KB 186ms
-
/disclosure/
200 text/html 391.8 KB 402ms
-
/products/workers.md
200 text/markdown 3.2 KB 22ms
-
/products/containers.md
200 text/markdown 2.4 KB 21ms
-
/products/durable-objects.md
200 text/markdown 3.3 KB 22ms
-
/products/sandboxes.md
200 text/markdown 2.0 KB 22ms
-
/products/workflows.md
200 text/markdown 2.1 KB 23ms
-
/products/pages.md
200 text/markdown 1010 B 22ms
-
/.well-known/agents.json
200 application/json 4.7 KB 45ms
-
/
200 text/markdown 2.9 KB 43ms
-
/aws-probe-b7f46872c3f5
404 +1 redirect text/html 19.8 KB 485ms
-
/aws-probe-b7f46872c3f5
404 +1 redirect text/html 16.0 KB 484ms
-
POST https://docs.mcp.cloudflare.com/mcp
200 text/event-stream 224 B 36ms
-
POST https://docs.mcp.cloudflare.com/mcp
202 — 0 B 12ms
-
POST https://docs.mcp.cloudflare.com/mcp
200 text/event-stream 1.8 KB 17ms