kbag.se
Work at kbag.se?Verify your @kbag.se email to rescan on demand.
Agents can reach the site, but product data is thin or inconsistent.
Higher than 77% of 216 scanned stores
Pillars
- Access20/35
- Catalog legibility3.5/25
- Transactability12/25
- Trust & policy10/15
Capped at 59: No product page could be found to read structured data from
Checks
11 of 20 scored checks passed. Expand a row for the evidence behind it.
Access
20/35Catalog legibility
3.5/25Transactability
12/25Trust & policy
10/15How to fix it
9 fixes for kbag.se, ready to paste into a ticket or hand to a coding agent.
Add a Content-Signal directive
access.content-signal · partial
Your robots.txt has no Content-Signal directive. Content Signals (contentsignals.org) is a robots.txt extension that states, separately, whether your content may be used for search, as real-time AI input (which is what shopping agents do), and for training. An explicit signal scores fully; silence scores half.
You can welcome shopping agents while still declining training. Add to the
*group (or to each group you care about):User-agent: * Content-Signal: search=yes, ai-input=yes, ai-train=no Allow: /Keep
ai-input=yes; setai-trainhowever you like. If Cloudflare manages your robots.txt, the equivalent setting lives in AI Crawl Control → Content Signals.Edit the
robots.txtserved from your web root (or the CDN/edge rule that generates it) and redeploy. Crawlers cache robots.txt for up to 24 hours, so re-scan after a day.Publish a Web Bot Auth key directory
access.web-bot-auth · fail
Nothing usable was found at
/.well-known/http-message-signatures-directory(HTTP 404). Web Bot Auth is the IETF draft that lets agents sign requests with HTTP Message Signatures; parties that sign publish their Ed25519 public keys in this directory, and verifiers fetch it to check theSignatureandSignature-Inputheaders. Visa's Trusted Agent Protocol, Mastercard's Agent Pay, and Cloudflare's signed-agent verification are all built on it.Two steps matter for a storefront:
- Verify signatures at your edge so signed agents are let through bot management instead of challenged. On Cloudflare this is the Verified Bots / signed agents setting; other WAFs are adding the same.
- Publish your own directory for any requests you sign (your own agent, service-to-service calls, or a verifier that expects one to exist). Serve it with
Content-Type: application/http-message-signatures-directory+json:
{ "keys": [ { "kty": "OKP", "crv": "Ed25519", "kid": "2026-01", "x": "<base64url-encoded public key>", "nbf": 1767225600, "exp": 1798761600 } ] }Serve the file from the same origin as the storefront, with a long cache lifetime, and rotate keys by adding the new one before removing the old.
List product URLs in your sitemap
catalog.sitemap-products · partial
Your sitemap (https://kbag.se/sitemap.xml) is reachable and we sampled 371 URLs, but none looked like a product URL and no child sitemap was named after products. Agents use the sitemap to enumerate the catalog without crawling.
Make product entries recognisable: either keep product URLs on a conventional path (
/products/…,/product/…,/p/…,/item/…) or split products into a child sitemap whose filename contains "product" (for examplesitemap-products-1.xml). Compressed (.xml.gz) sitemaps are skipped; serve plain XML.Answer tools/list on your UCP MCP endpoint
tx.ucp-mcp-endpoint · fail
https://kbag.se/api/ucp/mcpdid not return a tool list (HTTP 200). The endpoint must speak MCP over Streamable HTTP: accept a JSON-RPC POST and answer with JSON or an SSE stream.Test it the way we do:
curl -sS -X POST https://kbag.se/api/ucp/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'tools/listmust work without authentication; require auth on the tool calls that need it, and advertise it through OAuth discovery (see that fix).- Return
200withContent-Type: application/json(ortext/event-stream), never a 405 for POST or an HTML page. - Make sure the URL in the UCP profile (
services → dev.ucp.shopping → mcp.endpoint) points at this endpoint exactly.
Any MCP server SDK (TypeScript, Python, Go) with the Streamable HTTP transport will do; mount it on the storefront origin so the profile, the endpoint, and the cookies share a domain.
Serve a Storefront MCP server at /api/mcp
tx.storefront-mcp · fail
No MCP server answered
tools/listat/api/mcp(HTTP 200). This is the conventional storefront endpoint (Shopify's Storefront MCP lives here) where an agent can search the catalog, read policies, and manage a cart without scraping.Expose an MCP server over Streamable HTTP at that path with tools such as
search_shop_catalog,get_product_details,search_shop_policies_and_faqs,get_cart, andupdate_cart.tools/listmust be callable without authentication.If you already run the UCP MCP endpoint, mounting the same server at
/api/mcpis enough.Publish an API catalog (RFC 9727)
tx.api-catalog · fail
No API catalog was found. RFC 9727 defines
/.well-known/api-catalog, a linkset that points agents at your APIs and their descriptions (OpenAPI, MCP, UCP) in one place.Serve this as
application/linkset+json:{ "linkset": [ { "anchor": "https://www.example.com/", "service-desc": [ { "href": "https://www.example.com/api/openapi.json", "type": "application/vnd.oai.openapi+json" } ], "service-doc": [ { "href": "https://www.example.com/developers", "type": "text/html" } ], "service-meta": [ { "href": "https://www.example.com/.well-known/ucp", "type": "application/json" }, { "href": "https://www.example.com/.well-known/mcp/server-card.json", "type": "application/json" } ] } ] }Also advertise it from the homepage with a
Linkheader, which we accept on its own:Link: </.well-known/api-catalog>; rel="api-catalog"Publish OAuth discovery metadata
tx.oauth-discovery · fail
None of
/.well-known/oauth-authorization-server,/.well-known/openid-configuration, and/.well-known/oauth-protected-resourcereturned a JSON document. Agents that need to act on a customer's account (order status, saved addresses, loyalty) look for OAuth 2.0 discovery before they will attempt authenticated calls; it is also what MCP clients use to authorise against your MCP server.If you run an authorization server on this origin, publish RFC 8414 metadata at
/.well-known/oauth-authorization-server:{ "issuer": "https://www.example.com", "authorization_endpoint": "https://www.example.com/oauth/authorize", "token_endpoint": "https://www.example.com/oauth/token", "registration_endpoint": "https://www.example.com/oauth/register", "scopes_supported": ["cart:write", "orders:read"], "response_types_supported": ["code"], "grant_types_supported": ["authorization_code", "refresh_token"], "code_challenge_methods_supported": ["S256"] }If authentication is handled by a separate identity provider, publish RFC 9728 protected-resource metadata at
/.well-known/oauth-protected-resourcepointing at it:{ "resource": "https://www.example.com/api/mcp", "authorization_servers": ["https://auth.example.com"], "scopes_supported": ["cart:write", "orders:read"], "bearer_methods_supported": ["header"] }Support PKCE and dynamic client registration (RFC 7591) so agents can onboard without a manual app review.
Add Organization structured data to the homepage
trust.org-jsonld · partial
Your homepage has Organization markup but it is missing
sameAs. Agents use these to confirm who is selling and to cross-check the brand against its official profiles.Add to the homepage (an
OnlineStoreis anOrganization, and is the better fit for a shop):{ "@context": "https://schema.org", "@type": "OnlineStore", "name": "Example Outdoor", "url": "https://www.example.com/", "logo": "https://www.example.com/images/logo.png", "sameAs": [ "https://www.instagram.com/example", "https://www.facebook.com/example", "https://en.wikipedia.org/wiki/Example_Outdoor" ], "contactPoint": { "@type": "ContactPoint", "contactType": "customer service", "email": "help@example.com" } }Add MerchantReturnPolicy markup
trust.return-policy-markup · fail
No
MerchantReturnPolicystructured data was found on the product offer, the homepage, or the organization. A written policy page is good; machine-readable terms let agents compare return windows and fees across stores without reading prose.Attach it to the product
Offer(preferred, since that is where agents are when deciding) or to theOrganization/OnlineStoreon the homepage:"hasMerchantReturnPolicy": { "@type": "MerchantReturnPolicy", "applicableCountry": "US", "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow", "merchantReturnDays": 30, "returnMethod": "https://schema.org/ReturnByMail", "returnFees": "https://schema.org/FreeReturn", "refundType": "https://schema.org/FullRefund", "merchantReturnLink": "https://www.example.com/policies/refund-policy" }Use
MerchantReturnNotPermittedfor final-sale items andMerchantReturnUnlimitedWindowif you accept returns indefinitely. Keep it consistent with the written policy page.
History
First scan — rescan later to see history.