{"product":"waymark","weights":{"find":20,"door":30,"tools":40,"pay":10},"checkCount":129,"statuses":["pass","fail","warn","na","error"],"scoring":"error and na are excluded from the score denominator. fail is a missing site signal. warn is 1 point when max>=2. Pay drops out unless a cart or live rail is found. Essentials reading: baseline 80 + recommended 20; bonus never reduces baselineScore. Emerging public-fetch extras may set inLayerScore=false so they report without fluffing the 20/30/40/10 mix.","checks":[{"id":"https-ok","name":"HTTPS reachable","layer":"find","description":"Homepage answers over HTTPS.","band":"baseline"},{"id":"robots-txt","name":"robots.txt present","layer":"find","description":"Root robots.txt with User-agent rules.","band":"baseline"},{"id":"sitemap-xml","name":"XML sitemap","layer":"find","description":"sitemap.xml or robots Sitemap line.","band":"baseline"},{"id":"llms-txt","name":"llms.txt","layer":"find","description":"Root markdown index for models.","band":"baseline"},{"id":"agents-md","name":"AGENTS.md","layer":"find","description":"Root notes for agent operators.","band":"baseline"},{"id":"well-known-ai-catalog","name":"Well-known AI catalog","layer":"find","description":"ai-plugin.json or ai-catalog.json.","band":"baseline"},{"id":"title-meta","name":"Title and description","layer":"door","description":"Document title and meta description.","band":"baseline"},{"id":"json-ld","name":"JSON-LD structured data","layer":"door","description":"application/ld+json on the homepage.","band":"baseline"},{"id":"openapi-or-swagger-link","name":"OpenAPI / Swagger link","layer":"door","description":"Homepage points at an API description.","band":"baseline"},{"id":"html-lang","name":"html lang attribute","layer":"door","description":"Language declared on <html>.","band":"baseline"},{"id":"feed-or-rss","name":"RSS or Atom feed","layer":"door","description":"Machine-readable update feed.","band":"baseline"},{"id":"security-headers","name":"CSP or X-Frame-Options","layer":"door","description":"Framing / script policy headers.","band":"baseline"},{"id":"cors-on-api-hint","name":"CORS / API hint","layer":"door","description":"CORS header or obvious API path.","band":"baseline"},{"id":"oauth-well-known","name":"OAuth / OIDC well-known","layer":"door","description":"OAuth or OpenID discovery document.","band":"baseline"},{"id":"login-or-docs-link","name":"Login or docs link","layer":"door","description":"Human door to login or developer docs.","band":"baseline"},{"id":"not-blocking-common-ai-bots","name":"AI crawlers not blanket-blocked","layer":"door","description":"robots.txt does not Disallow: / for common AI bots.","band":"baseline"},{"id":"mcp-well-known","name":"MCP well-known card","layer":"tools","description":"MCP descriptor under .well-known.","band":"baseline"},{"id":"mcp-sse-or-http-hint","name":"MCP SSE / HTTP hint","layer":"tools","description":"Page or headers mention MCP transport.","band":"baseline"},{"id":"openapi-json-fetchable","name":"openapi.json fetchable","layer":"tools","description":"OpenAPI or Swagger JSON at a common path.","band":"baseline"},{"id":"webhook-or-api-docs","name":"Webhook or API docs","layer":"tools","description":"Webhook or API documentation mention.","band":"baseline"},{"id":"skill-or-agent-skills-index","name":"Agent skills index","layer":"tools","description":"Skills index or SKILL.md mention.","band":"baseline"},{"id":"wm-robots-ai-policy","name":"robots.txt AI policy","layer":"find","arId":"AR-DISC-01","strength":"MUST","applies":"baseline","description":"robots.txt names identified AI crawlers with explicit allow or deny.","band":"baseline"},{"id":"wm-sitemap","name":"Sitemap for agents","layer":"find","arId":"AR-DISC-02","strength":"SHOULD","applies":"baseline","description":"Fetchable sitemap listing main URLs.","band":"recommended"},{"id":"wm-llms-txt","name":"llms.txt index","layer":"find","arId":"AR-DISC-03","strength":"SHOULD","applies":"baseline","description":"Root llms.txt summarizing the product.","band":"recommended"},{"id":"wm-llms-full-txt","name":"llms-full.txt","layer":"find","arId":"AR-DISC-04","strength":"MAY","applies":"baseline","description":"Single-file ingestible documentation at /llms-full.txt.","band":"bonus"},{"id":"wm-http-link-header","name":"HTTP Link header","layer":"find","arId":"AR-DISC-05","strength":"MAY","applies":"baseline","description":"Link headers with sitemap, describedby, api-catalog, or alternate.","band":"bonus"},{"id":"wm-nlweb-schemamap","name":"NLWeb schemamap","layer":"find","arId":"AR-DISC-06","strength":"MAY","applies":"search or NL retrieval","description":"robots.txt schemamap directive for a schema.org feed.","band":"bonus"},{"id":"wm-json-ld","name":"JSON-LD entities","layer":"door","arId":"AR-CONT-01","strength":"SHOULD","applies":"baseline","description":"schema.org types in JSON-LD (Organization, Product, FAQ, etc.).","band":"recommended"},{"id":"wm-markdown-negotiate","name":"Markdown negotiation","layer":"door","arId":"AR-CONT-02","strength":"MAY","applies":"baseline","description":"Accept: text/markdown returns a markdown body.","band":"bonus"},{"id":"wm-index-md","name":"/index.md fallback","layer":"door","arId":"AR-CONT-03","strength":"MAY","applies":"baseline","description":"Homepage also served as /index.md.","band":"bonus"},{"id":"wm-speakable","name":"Speakable markup","layer":"door","arId":"AR-CONT-04","strength":"MAY","applies":"voice content","description":"schema.org SpeakableSpecification or speakable property.","band":"bonus"},{"id":"wm-mcp-initialize","name":"MCP initialize","layer":"tools","arId":"AR-CAPA-01","strength":"MUST","applies":"tools or resources for agents","description":"JSON-RPC initialize against a discovered MCP HTTP endpoint.","band":"recommended"},{"id":"wm-a2a-card","name":"A2A agent card","layer":"tools","arId":"AR-CAPA-04","strength":"MUST","applies":"agent-to-agent surface","description":"/.well-known/agent-card.json or agent.json.","band":"recommended"},{"id":"wm-openapi","name":"OpenAPI document","layer":"tools","arId":"AR-CAPA-08","strength":"MUST","applies":"HTTP API","description":"Machine-readable OpenAPI or Swagger document.","band":"recommended"},{"id":"wm-mcp-card","name":"MCP server card","layer":"tools","arId":"AR-CAPA-02","strength":"SHOULD","applies":"MCP over HTTP","description":"/.well-known/mcp.json or mcp/server-card.json.","band":"recommended"},{"id":"wm-mcp-apps","name":"MCP Apps UI hint","layer":"tools","arId":"AR-CAPA-03","strength":"MAY","applies":"MCP servers that return UI","description":"ui:// resources or io.modelcontextprotocol/ui mention.","band":"bonus"},{"id":"wm-webmcp","name":"WebMCP page tools","layer":"tools","arId":"AR-CAPA-05","strength":"MAY","applies":"in-page agent actions","description":"navigator.modelContext or HTML tool metadata.","band":"bonus"},{"id":"wm-nlweb-ask","name":"NLWeb /ask","layer":"tools","arId":"AR-CAPA-06","strength":"MAY","applies":"natural-language retrieval","description":"A /ask or NLWeb query endpoint.","band":"bonus"},{"id":"wm-agent-skills","name":"Agent Skills files","layer":"tools","arId":"AR-CAPA-07","strength":"MAY","applies":"portable skills","description":"SKILL.md or well-known agent-skills index.","band":"bonus"},{"id":"wm-ai-plugin","name":"ai-plugin.json","layer":"find","arId":"AR-CAPA-09","strength":"MAY","applies":"plugin-style capability","description":"/.well-known/ai-plugin.json manifest.","band":"bonus"},{"id":"wm-oauth","name":"OAuth 2.0 surface","layer":"door","arId":"AR-IDEN-02","strength":"MUST","applies":"delegated access","description":"Discoverable authorization or token endpoints.","band":"recommended"},{"id":"wm-oauth-as-metadata","name":"OAuth AS metadata","layer":"door","arId":"AR-IDEN-03","strength":"MUST","applies":"OAuth authorization server","description":"oauth-authorization-server or openid-configuration.","band":"recommended"},{"id":"wm-pkce","name":"PKCE S256","layer":"door","arId":"AR-IDEN-05","strength":"MUST","applies":"public or agent OAuth clients","description":"code_challenge_methods_supported includes S256.","band":"recommended"},{"id":"wm-web-bot-auth","name":"Web Bot Auth keys","layer":"door","arId":"AR-IDEN-01","strength":"SHOULD","applies":"baseline","description":"http-message-signatures-directory for signed agent traffic.","band":"recommended"},{"id":"wm-oauth-resource","name":"OAuth protected resource","layer":"door","arId":"AR-IDEN-04","strength":"SHOULD","applies":"OAuth-protected resources","description":"/.well-known/oauth-protected-resource.","band":"recommended"},{"id":"wm-api-catalog","name":"API catalog linkset","layer":"find","arId":"AR-IDEN-06","strength":"MAY","applies":"public APIs","description":"/.well-known/api-catalog.","band":"bonus"},{"id":"wm-x402","name":"x402 payment","layer":"pay","arId":"AR-COMM-01","strength":"MAY","applies":"paid API calls","band":"bonus","description":"402 / x402 headers or documentation."},{"id":"wm-acp","name":"Agentic checkout (ACP)","layer":"pay","arId":"AR-COMM-02","strength":"MAY","applies":"agent-driven checkout","band":"bonus","description":"ACP checkout session or agentic commerce mention."},{"id":"wm-acp-delegate","name":"ACP delegated payment","layer":"pay","arId":"AR-COMM-03","strength":"MAY","applies":"delegated payment tokens","band":"bonus","description":"Delegate-payment token flow mention."},{"id":"wm-ucp","name":"Universal Commerce Protocol","layer":"pay","arId":"AR-COMM-04","strength":"MAY","applies":"agent-driven commerce","band":"bonus","description":"/.well-known/ucp profile."},{"id":"wm-mpp","name":"Machine Payments Protocol","layer":"pay","arId":"AR-COMM-05","strength":"MAY","applies":"per-call API monetization","band":"bonus","description":"MPP / Payment auth or x-payment-info."},{"id":"wm-security-txt","name":"security.txt","layer":"door","strength":"SHOULD","applies":"baseline","description":"RFC 9116 contact file at /.well-known/security.txt.","band":"recommended"},{"id":"wm-humans-txt","name":"humans.txt","layer":"door","strength":"MAY","applies":"baseline","description":"Root humans.txt naming people or teams behind the site.","band":"bonus"},{"id":"wm-ads-txt","name":"ads.txt","layer":"find","strength":"MAY","applies":"ad inventory","band":"bonus","description":"IAB ads.txt when the origin sells inventory; N/A otherwise."},{"id":"wm-change-password","name":"change-password well-known","layer":"door","strength":"MAY","applies":"login accounts","description":"/.well-known/change-password for account recovery doors.","band":"bonus"},{"id":"wm-web-app-origin-association","name":"web-app-origin-association","layer":"door","strength":"MAY","applies":"installed web apps","description":"/.well-known/web-app-origin-association for Digital Asset Links-style web apps.","band":"bonus"},{"id":"wm-assetlinks","name":"assetlinks.json","layer":"door","strength":"MAY","applies":"Android app links","description":"/.well-known/assetlinks.json; N/A if no mobile app.","band":"bonus"},{"id":"wm-apple-app-site-association","name":"apple-app-site-association","layer":"door","strength":"MAY","applies":"iOS app links","description":"Apple app site association; N/A if no iOS app.","band":"bonus"},{"id":"wm-llms-txt-quality","name":"llms.txt size and links","layer":"find","strength":"SHOULD","applies":"baseline","description":"llms.txt is long enough and points at real URLs.","band":"recommended"},{"id":"wm-robots-crawl-delay","name":"robots Crawl-delay","layer":"find","strength":"MAY","applies":"rate-limited crawlers","description":"robots.txt mentions Crawl-delay for polite agents.","band":"bonus"},{"id":"wm-web-manifest","name":"Web app manifest","layer":"door","strength":"MAY","applies":"installable web app","description":"manifest.json or manifest.webmanifest for installable surfaces.","band":"bonus"},{"id":"wm-related-website-set","name":"related-website-set","layer":"find","strength":"MAY","applies":"multi-origin product","description":"/.well-known/related-website-set.json listing related origins.","band":"bonus"},{"id":"wm-rate-limit-hint","name":"Rate limit signal","layer":"tools","strength":"SHOULD","applies":"HTTP API","description":"Rate-limit or retry headers documented or sent on an API surface.","band":"recommended"},{"id":"wm-idempotency-hint","name":"Idempotency signal","layer":"tools","strength":"SHOULD","applies":"HTTP API","description":"Idempotency keys or equivalent documented for mutating API calls.","band":"recommended"},{"id":"wm-json-error-hint","name":"Machine-readable errors","layer":"tools","strength":"SHOULD","applies":"HTTP API","description":"JSON or problem+json error shape for APIs.","band":"recommended"},{"id":"wm-oembed","name":"oEmbed discovery","layer":"door","strength":"MAY","applies":"embeddable content","description":"oEmbed link or endpoint so agents can unfurl a page.","band":"bonus"},{"id":"wm-dev-portal","name":"Developer portal","layer":"door","band":"recommended","description":"Self-serve docs or developer hub."},{"id":"wm-cli","name":"CLI tool","layer":"tools","band":"recommended","description":"Official CLI mention."},{"id":"wm-agent-404","name":"Honest 404","layer":"tools","band":"recommended","description":"Unknown paths return 404."},{"id":"wm-mcp","name":"MCP server","layer":"tools","band":"recommended","description":"Discoverable MCP server or handshake."},{"id":"wm-trust-pages","name":"Trust pages","layer":"door","band":"recommended","description":"About, privacy, or contact links."},{"id":"wm-pricing-page","name":"Pricing page","layer":"door","band":"recommended","description":"Discoverable pricing page."},{"id":"wm-scopes","name":"Scoped permissions","layer":"door","band":"recommended","description":"Named OAuth scopes in a spec or resource metadata."},{"id":"wm-public-api","name":"Public API surface","layer":"door","band":"recommended","description":"Documented API agents can call."},{"id":"wm-wikipedia","name":"Wikipedia sitelink","layer":"find","strength":"MAY","band":"bonus","description":"Live Wikipedia sitelink for the domain."},{"id":"wm-wikidata","name":"Wikidata official website","layer":"find","strength":"MAY","band":"bonus","description":"Wikidata P856 official website matches the domain."},{"id":"wm-brand-web","name":"Brand official-website match","layer":"find","strength":"SHOULD","band":"recommended","description":"Wikidata official website confirms the brand domain."},{"id":"wm-mcp-registry","name":"Public MCP registry listing","layer":"find","strength":"MAY","band":"bonus","description":"Live search of public MCP registries."},{"id":"wm-feed-file","name":"RSS or Atom document","layer":"door","strength":"MAY","band":"bonus","description":"Fetchable /feed, /rss.xml, or /atom.xml."},{"id":"wm-pricing-md","name":"pricing.md","layer":"door","strength":"MAY","band":"bonus","description":"Machine-readable /pricing.md."},{"id":"wm-nodeinfo","name":"NodeInfo","layer":"door","strength":"MAY","band":"bonus","description":"/.well-known/nodeinfo for federated servers."},{"id":"wm-openapi-ui","name":"OpenAPI UI page","layer":"tools","strength":"MAY","band":"bonus","description":"swagger-ui or redoc.html adjacent to a spec."},{"id":"wm-auth-md","name":"auth.md","layer":"door","strength":"MAY","band":"bonus","description":"Root /auth.md walkthrough."},{"id":"wm-agent-mode","name":"Agent mode view","layer":"find","strength":"MAY","band":"bonus","description":"?mode=agent homepage variant."},{"id":"wm-docs-llms","name":"Section llms.txt","layer":"find","strength":"MAY","band":"bonus","description":"/docs/llms.txt modular index."},{"id":"wm-sameas","name":"JSON-LD sameAs","layer":"door","strength":"MAY","band":"bonus","description":"sameAs profile links in JSON-LD."},{"id":"wm-og-meta","name":"Open Graph basics","layer":"door","strength":"MAY","band":"bonus","description":"og:image or og:title plus canonical."},{"id":"wm-sitemap-lastmod","name":"Sitemap lastmod","layer":"find","strength":"MAY","band":"bonus","description":"lastmod dates in sitemap.xml."},{"id":"wm-gql-hint","name":"GraphQL GET hint","layer":"tools","strength":"MAY","band":"bonus","description":"GET common GraphQL paths; response shape only."},{"id":"wm-pkg-home","name":"Package homepage match","layer":"find","strength":"MAY","band":"bonus","description":"Public package registry homepage matches the domain."},{"id":"wm-content-no-js","name":"Content without JavaScript","layer":"door","strength":"MUST","applies":"baseline","band":"baseline","mapsOra":"content-no-js","description":"Most AI crawlers never run JavaScript. If your pages need it to show content, agents see a blank site. We fetch your pages with JavaScript off and check the content is still there."},{"id":"wm-agent-instruction","name":"Agent instruction / when-to-use","layer":"door","strength":"MUST","applies":"baseline","band":"baseline","mapsOra":"agent-instruction","description":"Explicit guidance on when to use your product, written where agents will read it. An agent choosing between ten tools picks the one that says what it is for."},{"id":"wm-robots-agent-user-policy","name":"robots.txt agent-user policy","layer":"door","strength":"MUST","applies":"baseline","band":"baseline","mapsOra":"robots-agent-user-policy","description":"Whether robots.txt lets user-triggered agents (ChatGPT-User, Claude-User, Perplexity-User) read the site. Silence passes — robots.txt allows by default."},{"id":"wm-org-schema-completeness","name":"Organization schema completeness","layer":"door","strength":"SHOULD","band":"recommended","mapsOra":"org-schema-completeness","description":"Company details (contact, address) in your structured data. AIs use them to verify you are a real business before recommending you."},{"id":"wm-schema-type-breadth","name":"Schema type breadth","layer":"door","strength":"SHOULD","band":"recommended","mapsOra":"schema-type-breadth","description":"The more schema.org types you publish (FAQs, products, articles, events), the more kinds of questions an AI can answer about you with confidence."},{"id":"wm-llms-txt-links-resolve","name":"llms.txt links resolve","layer":"door","strength":"SHOULD","band":"recommended","mapsOra":"llms-txt-links-resolve","description":"The markdown links an llms.txt declares actually resolve — broken links and homepage-shell 200s strand agents that follow the index."},{"id":"wm-markdown-link-alternate","name":"Markdown alternate link","layer":"door","strength":"MAY","band":"bonus","inLayerScore":false,"mapsOra":"markdown-link-alternate","description":"Pages advertise their markdown twin via a rel=alternate link or HTTP Link header, and the advertised target really serves markdown."},{"id":"wm-markdown-frontmatter","name":"Markdown frontmatter metadata","layer":"door","strength":"MAY","band":"bonus","inLayerScore":false,"mapsOra":"markdown-frontmatter","description":"Served markdown docs open with a frontmatter block (title plus description / canonical / last-updated) so agents get document metadata without scraping."},{"id":"wm-markdown-negotiation-vary","name":"Markdown content negotiation (acceptmarkdown.com)","layer":"door","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"markdown-negotiation-vary","description":"Markdown negotiation done to spec: the canonical URL serves markdown on request, with the Vary header set so CDNs cache both versions correctly."},{"id":"wm-redirect-hygiene","name":"Redirect hygiene","layer":"door","strength":"SHOULD","band":"recommended","mapsOra":"redirect-hygiene","description":"Pages reach real content without meta-refresh stubs, JavaScript-only redirects, or cross-domain hops that strand non-JS agents."},{"id":"wm-page-token-budget","name":"Page token budget","layer":"door","strength":"SHOULD","band":"recommended","mapsOra":"page-token-budget","description":"Individual pages keep extracted text within an agent-readable budget (~25K tokens / ~100K characters)."},{"id":"wm-code-fence-validity","name":"Code fence validity","layer":"door","strength":"MAY","band":"bonus","inLayerScore":false,"mapsOra":"code-fence-validity","description":"Fenced code blocks in served markdown are balanced — an unclosed fence swallows the rest of the document."},{"id":"wm-docs-auth-gate","name":"Content behind auth","layer":"door","strength":"SHOULD","band":"recommended","mapsOra":"docs-auth-gate","description":"Sampled content pages are publicly readable — pages behind a login wall are invisible to agents."},{"id":"wm-ax-document-structure","name":"Accessible document structure","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"ax-document-structure","description":"Agents navigate your page the way screen readers do: by landmarks and headings. We check raw HTML for main, nav, and a sane heading order."},{"id":"wm-skills-sh-listed","name":"Listed on skills.sh","layer":"find","strength":"MAY","band":"bonus","inLayerScore":false,"mapsOra":"skills-sh-listed","description":"Official skills published on skills.sh, the public directory where agents and developers browse for ready-made capabilities. HTTP 429 is a scanner error, not a site fail."},{"id":"wm-registry-branding","name":"Registry branding","layer":"find","strength":"MAY","band":"bonus","inLayerScore":false,"mapsOra":"registry-branding","description":"Your MCP server card has a display name, icon, and description. N/A unless a real MCP card was fetched."},{"id":"wm-api-error-model","name":"REST typed error model","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"api-error-model","description":"A typed error schema in your OpenAPI spec, so agents know every failure shape in advance. N/A if no spec."},{"id":"wm-api-versioning-policy","name":"REST versioning / deprecation policy","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"api-versioning-policy","description":"A versioning and deprecation policy agents can rely on. N/A if no spec."},{"id":"wm-pagination-shape","name":"REST pagination pattern","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"pagination-shape","description":"A predictable way to page through lists, cursor-based preferred. N/A if no spec or no list surface."},{"id":"wm-async-job-pattern","name":"REST async-job pattern","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"async-job-pattern","description":"Long-running operations should return 202 Accepted with a poll URL. N/A if the spec has no async surface."},{"id":"wm-response-schema-coverage","name":"REST response schema coverage","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"response-schema-coverage","description":"Typed response schemas on most API operations. N/A if no spec."},{"id":"wm-function-calling-compat","name":"Function calling compatibility","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"function-calling-compat","description":"Whether your API spec translates cleanly into function-calling format (operationIds, typed schemas, descriptions). N/A if no spec."},{"id":"wm-batch-endpoints","name":"REST batch / bulk endpoint","layer":"tools","strength":"MAY","band":"bonus","inLayerScore":false,"mapsOra":"batch-endpoints","description":"Batch operations let an agent do many things in one request. N/A if the spec has no batch/bulk path."},{"id":"wm-scoped-permissions","name":"Scoped permissions","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"scoped-permissions","description":"Named OAuth scopes in OpenAPI security schemes or RFC 9728 metadata. N/A if no spec or only API-key security."},{"id":"wm-rest-sdk-packages","name":"Multi-language SDK packages","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"rest-sdk-packages","description":"Official SDKs across ecosystems (npm plus PyPI) whose homepage matches this domain. N/A if no spec."},{"id":"wm-sandbox-environment","name":"Sandbox / test environment","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"sandbox-environment","description":"A sandbox or test mode documented in fetched docs HTML. N/A unless docs mention it."},{"id":"wm-onboarding-friction","name":"Agent onboarding friction","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"onboarding-friction","description":"Self-serve API keys or a free/trial path in fetched docs. N/A unless docs discuss onboarding; fail only when a public API is sales-gated."},{"id":"wm-mcp-tool-listing","name":"MCP tool listing","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"mcp-tool-listing","description":"tools/list after a real initialize. N/A if OAuth-gated or no discovered MCP endpoint."},{"id":"wm-mcp-tool-descriptions","name":"MCP tool descriptions","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"mcp-tool-descriptions","description":"Each listed MCP tool has a useful description. N/A if tools/list is gated."},{"id":"wm-mcp-param-schemas","name":"MCP parameter schemas","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"mcp-param-schemas","description":"Typed inputSchema on MCP tools. N/A if tools/list is gated."},{"id":"wm-mcp-tool-naming","name":"MCP tool naming","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"mcp-tool-naming","description":"Predictable tool names (create_invoice, search_docs). N/A if tools/list is gated."},{"id":"wm-mcp-tool-annotations","name":"MCP tool annotations","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"mcp-tool-annotations","description":"readOnlyHint / destructiveHint on MCP tools. N/A if tools/list is gated."},{"id":"wm-mcp-resource-listing","name":"MCP resources exposed","layer":"tools","strength":"SHOULD","band":"recommended","mapsOra":"mcp-resource-listing","description":"If initialize advertises resources, resources/list should return some. N/A if no resources capability or OAuth-gated."},{"id":"wm-mcp-auth-mechanism","name":"MCP auth mechanism","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"mcp-auth-mechanism","description":"OAuth gate or public initialize on a real discovered MCP endpoint. Never guessed from mcp.{apex}."},{"id":"wm-mcp-error-handling","name":"MCP error handling","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"mcp-error-handling","description":"A bad tools/call returns a structured JSON-RPC error. N/A if OAuth-gated."},{"id":"wm-ap2","name":"AP2 - Agent Payments Protocol","layer":"pay","strength":"MAY","band":"bonus","mapsOra":"ap2-support","description":"Google AP2 mandate in a well-known or UCP profile. N/A unless a cart or live commerce rail exists."},{"id":"wm-auth-md-structure","name":"auth.md structure","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"auth-md-structure","description":"auth.md follows the discover / register / claim / use / errors / revocation walkthrough. N/A if /auth.md is missing."},{"id":"wm-agent-auth-www-authenticate","name":"Agent auth WWW-Authenticate hint","layer":"tools","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"agent-auth-www-authenticate","description":"A 401 on a documented API path includes resource_metadata. N/A if the path does not 401."},{"id":"wm-agent-ua-markdown","name":"Agent-UA markdown docs","layer":"door","strength":"SHOULD","band":"bonus","inLayerScore":false,"mapsOra":"agent-ua-markdown","description":"Docs hosts that serve text/markdown to GPTBot (and similar agent UAs). N/A if no docs host."}]}