kbag.se

CustomScanned 3 hours ago · engine v1.0.1Open in new tab
Rescan

Work at kbag.se?Verify your @kbag.se email to rescan on demand.

Visible

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/35

Catalog legibility

3.5/25

Transactability

12/25

Trust & policy

10/15

How to fix it

9 fixes for kbag.se, ready to paste into a ticket or hand to a coding agent.

  1. 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; set ai-train however you like. If Cloudflare manages your robots.txt, the equivalent setting lives in AI Crawl Control → Content Signals.

    Edit the robots.txt served 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.

  2. 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 the Signature and Signature-Input headers. 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.

  3. 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 example sitemap-products-1.xml). Compressed (.xml.gz) sitemaps are skipped; serve plain XML.

  4. Answer tools/list on your UCP MCP endpoint

    tx.ucp-mcp-endpoint · fail

    https://kbag.se/api/ucp/mcp did 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/list must work without authentication; require auth on the tool calls that need it, and advertise it through OAuth discovery (see that fix).
    • Return 200 with Content-Type: application/json (or text/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.

  5. Serve a Storefront MCP server at /api/mcp

    tx.storefront-mcp · fail

    No MCP server answered tools/list at /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, and update_cart. tools/list must be callable without authentication.

    If you already run the UCP MCP endpoint, mounting the same server at /api/mcp is enough.

  6. 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 Link header, which we accept on its own:

    Link: </.well-known/api-catalog>; rel="api-catalog"
    
  7. Publish OAuth discovery metadata

    tx.oauth-discovery · fail

    None of /.well-known/oauth-authorization-server, /.well-known/openid-configuration, and /.well-known/oauth-protected-resource returned 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-resource pointing 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.

  8. 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 OnlineStore is an Organization, 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" }
    }
    
  9. Add MerchantReturnPolicy markup

    trust.return-policy-markup · fail

    No MerchantReturnPolicy structured 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 the Organization/OnlineStore on 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 MerchantReturnNotPermitted for final-sale items and MerchantReturnUnlimitedWindow if you accept returns indefinitely. Keep it consistent with the written policy page.

History

First scan — rescan later to see history.