<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Giuseppe Socci</title>
    <description>The latest articles on DEV Community by Giuseppe Socci (@kalicart-bridge).</description>
    <link>https://dev.to/kalicart-bridge</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3974679%2Fa6b87c09-fb0f-4b18-b408-bd08a8580549.png</url>
      <title>DEV Community: Giuseppe Socci</title>
      <link>https://dev.to/kalicart-bridge</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kalicart-bridge"/>
    <language>en</language>
    <item>
      <title>The website chatbot was a workaround, not a solution</title>
      <dc:creator>Giuseppe Socci</dc:creator>
      <pubDate>Thu, 25 Jun 2026 09:27:31 +0000</pubDate>
      <link>https://dev.to/kalicart-bridge/the-website-chatbot-was-a-workaround-not-a-solution-gd</link>
      <guid>https://dev.to/kalicart-bridge/the-website-chatbot-was-a-workaround-not-a-solution-gd</guid>
      <description>&lt;p&gt;Open almost any company website built in the last two years and a little circle pops up in the bottom-right corner. &lt;em&gt;"Hi! How can I help you today?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You already know how this goes. You type a real question, the bot hands back a help-center link you'd already found, and you end up emailing support anyway.&lt;/p&gt;

&lt;p&gt;We've collectively decided that every website needs a chatbot. I think we added them for the wrong reason — and the reason is more interesting than the complaint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern we all recognize
&lt;/h2&gt;

&lt;p&gt;The generic site bot has three problems, and they're structural, not cosmetic.&lt;/p&gt;

&lt;p&gt;It only knows your site. It was trained or indexed on a narrow slice of your own content, so the moment a question steps outside that slice, it has nothing. Ask it something a human support agent would answer in one sentence by combining two facts, and it stalls.&lt;/p&gt;

&lt;p&gt;It has no real capability. It can't check your actual order, can't see live stock, can't do the thing you came to do. It retrieves text and reformats it.&lt;/p&gt;

&lt;p&gt;And it interrupts. It's a layer between you and the page, and most of the time you'd rather just read the page.&lt;/p&gt;

&lt;p&gt;None of this is a knock on any particular vendor. The bots behave this way because of &lt;em&gt;what they fundamentally are&lt;/em&gt;. Which is the part worth examining.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why they're everywhere
&lt;/h2&gt;

&lt;p&gt;Here's my claim: chatbots spread across the web not because users wanted them, but because they were the only way we had to put "AI" on a website.&lt;/p&gt;

&lt;p&gt;Think about the actual sequence of events. A company decides it needs an AI story. The available, off-the-shelf, drop-in-a-script-tag option is a chatbot widget. So a chatbot widget is what gets installed. The technology answered a marketing question — &lt;em&gt;"how do we show we have AI?"&lt;/em&gt; — not a user question — &lt;em&gt;"how do I get my answer faster?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the definition of a workaround: a thing you reach for because it's available, not because it's right.&lt;/p&gt;

&lt;h2&gt;
  
  
  How these things actually work
&lt;/h2&gt;

&lt;p&gt;I recently asked a popular chatbot vendor — through their normal support channel — to explain in detail how their system ingests and answers from a website's data. The reply was polite, professional, and genuinely illuminating. I'll keep it anonymous, because the point isn't to single anyone out; this is how the whole category works today.&lt;/p&gt;

&lt;p&gt;Three things stood out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It answers from a snapshot, not from your live site.&lt;/strong&gt; When a user asks a question, the bot does not read your website at that moment. It reads a copy it indexed earlier — refreshed on a schedule, daily, weekly, or monthly. For a blog that's fine. For anything that changes — prices, availability, terms — it means the bot can confidently cite information that's weeks stale, with no signal to the user that it's looking at an old photograph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It can't follow a paginated feed.&lt;/strong&gt; I asked how it walks through a structured catalog with multiple pages. It doesn't. The recommended workaround was to flatten everything into a list of separate static URLs and hand it an XML sitemap. In other words: to ingest a modern structured source, go back to the one-document-per-page model from twenty years ago, because the ingester can't traverse a feed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The capabilities you'd need are upsells.&lt;/strong&gt; Things like preserving query-string URLs, ingesting paginated feeds, and handling structured catalogs properly weren't standard. They were described as things they'd &lt;em&gt;consider building&lt;/em&gt; for customers on a paid plan.&lt;/p&gt;

&lt;p&gt;Sit with that. The entire architecture is designed around &lt;em&gt;not&lt;/em&gt; looking at the live source. Snapshot, scheduled recrawl, flattened sitemap — every piece exists to avoid reading your site at the moment the question is asked. The bot doesn't read your website. It keeps a faded photocopy and answers from that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the user actually wanted
&lt;/h2&gt;

&lt;p&gt;Step back to the person typing the question. They never wanted &lt;em&gt;an assistant living inside your website&lt;/em&gt;. They wanted an answer. And increasingly they're getting it somewhere else entirely — by asking the assistant they already have open, before they ever land on your page.&lt;/p&gt;

&lt;p&gt;That's the shift the chatbot misses completely. The chatbot assumes the AI should live on your site. But the AI users actually rely on doesn't live on anyone's site. It's the general assistant in their pocket — and it's perfectly capable of reading and reasoning over real, current information &lt;em&gt;if the information is exposed in a way it can read&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  From "AI on my site" to "my site readable by AI"
&lt;/h2&gt;

&lt;p&gt;This is the reframing I think matters.&lt;/p&gt;

&lt;p&gt;The chatbot approach brings a weak, sandboxed AI &lt;em&gt;into&lt;/em&gt; your page. The opposite approach makes your content legible to the strong, general AI the user &lt;em&gt;already uses&lt;/em&gt;. One traps a bad assistant on your site; the other frees your content to be read by a good one.&lt;/p&gt;

&lt;p&gt;And the second one is where the platforms are quietly heading. Structured, machine-readable content. Standard protocols for agents to discover and read what a site offers. The shift is from optimizing a page for a human eye (and a search crawler) to also making it readable by an agent acting on a person's behalf — reading the &lt;em&gt;current&lt;/em&gt; data, following the &lt;em&gt;actual&lt;/em&gt; structure, reasoning over what's really there rather than a month-old copy.&lt;/p&gt;

&lt;p&gt;That's the exact inverse of the snapshot-and-sitemap model. The agent reads the source, now. No photocopy.&lt;/p&gt;

&lt;h2&gt;
  
  
  This isn't free
&lt;/h2&gt;

&lt;p&gt;I don't want to pretend the readable-to-agents direction is pure upside. It moves the hard problems rather than removing them, and two of them are worth naming honestly.&lt;/p&gt;

&lt;p&gt;The first is the business model. If a customer's assistant reads your data and resolves the question — or even completes a purchase — without the customer ever landing on your page, what happens to everything that page was doing? The cross-sell, the brand experience, the related products, the ad you were going to show. Search engines already started this with zero-click answers; agents push it further. Making your content legible to an external assistant solves the information problem and sharpens a monetization problem that nobody has a clean answer to yet.&lt;/p&gt;

&lt;p&gt;The second is liability. If an assistant misreads your data — even data you structured carefully and exposed correctly — and tells the user something wrong, who's responsible? The site that published it, the assistant that interpreted it, or the vendor behind the assistant? There's no settled answer, legally or in practice.&lt;/p&gt;

&lt;p&gt;I'm not going to resolve those here, and I'd be suspicious of anyone who claims to. But notice they don't rescue the chatbot. A bot answering from a stale snapshot has &lt;em&gt;the same&lt;/em&gt; exposure problems with &lt;em&gt;worse&lt;/em&gt; information. The hard questions are real — they're just the hard questions of the right direction instead of the wrong one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;If you're responsible for a website and you're thinking about AI, the instinct is to add a chatbot. I'd push back on that instinct.&lt;/p&gt;

&lt;p&gt;A bot trapped on your page, answering from a stale copy of your own content, is solving a problem your users don't have. The problem they actually have is that the assistant they're &lt;em&gt;already&lt;/em&gt; talking to can't yet read your site clearly.&lt;/p&gt;

&lt;p&gt;So the question isn't &lt;em&gt;"which chatbot should I install?"&lt;/em&gt; It's &lt;em&gt;"is my content readable by the agents people already use?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Stop optimizing for a chatbot stuck in the corner of your page. Start making your content legible to the agents people bring with them.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatbot</category>
      <category>webdev</category>
      <category>futureofweb</category>
    </item>
    <item>
      <title>Turn Woo catalog into an AI-ready API — now on WordPress.org</title>
      <dc:creator>Giuseppe Socci</dc:creator>
      <pubDate>Thu, 18 Jun 2026 16:47:20 +0000</pubDate>
      <link>https://dev.to/kalicart-bridge/turn-woo-catalog-into-an-ai-ready-api-now-on-wordpressorg-jdo</link>
      <guid>https://dev.to/kalicart-bridge/turn-woo-catalog-into-an-ai-ready-api-now-on-wordpressorg-jdo</guid>
      <description>&lt;p&gt;AI agents are starting to shop. Not in a sci-fi way — in a "your storefront is getting hit by something that parses HTML, recovers a price, and gets it wrong" way. If you run a WooCommerce store, the agent reading it today has to scrape the rendered product page and reverse-engineer what's for sale, what it costs, and whether it's in stock.&lt;/p&gt;

&lt;p&gt;That's fragile, and it's the wrong layer. A catalog already knows all of this precisely. It should just say so, in a format built for machines.&lt;/p&gt;

&lt;p&gt;That's what &lt;strong&gt;KaliCart Bridge&lt;/strong&gt; does — a WooCommerce plugin (now on the WordPress.org directory, search "KaliCart Bridge") that exposes the catalog as a read-only, agent-oriented API with a discovery document. Below is how it's designed and why, with real responses from a live install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with discovery, not endpoints
&lt;/h2&gt;

&lt;p&gt;The entry point is a single discovery document. An agent fetches it first and learns the catalog's capabilities, endpoints, and rules before issuing a single product query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /wp-json/kalicart/v1/discovery
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"document_kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kalicart_merchant_bridge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugin_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.101"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"search"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"availability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shipping_policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mutations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"read_only"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"freshness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"live_woocommerce_database"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"is_realtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"is_sync_snapshot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two design choices worth calling out here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's read-only and says so explicitly.&lt;/strong&gt; &lt;code&gt;cart&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;payments&lt;/code&gt;, and &lt;code&gt;mutations&lt;/code&gt; are all &lt;code&gt;false&lt;/code&gt;. The Bridge is a read surface over the catalog — it never touches orders or money. Checkout authority stays with the WooCommerce storefront. An agent reading this knows immediately what it is and isn't allowed to assume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data is live, not a sync snapshot.&lt;/strong&gt; Responses are read straight from the WooCommerce database at query time. There's no separate index to fall out of date — the price the agent reads is the price in the store right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoints
&lt;/h2&gt;

&lt;p&gt;Discovery advertises the read surface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"discovery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/discovery"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"search"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/catalog/search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/catalog/products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"product"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/catalog/product/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"categories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/catalog/categories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/catalog/meta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/mcp"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authentication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key. The public catalog is public — the same information a human sees on the storefront, just structured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Query construction: the spine goes in &lt;code&gt;q&lt;/code&gt;, attributes go in filters
&lt;/h2&gt;

&lt;p&gt;This is the part most people get wrong when they design a search API for agents, so the discovery document is prescriptive about it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query_construction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"q must contain ONLY the bare product noun (the spine). Every attribute (category, gender, color, price) MUST go in its own structured filter, never inside q. Stacking attributes into q returns 0 results."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"correct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"?q=t-shirt&amp;amp;gender=male&amp;amp;max_price=50"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"?q=costume&amp;amp;gender=female&amp;amp;color=blue"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agents love to cram &lt;code&gt;"blue men's t-shirt under 50"&lt;/code&gt; into a single search string. Against a real catalog, that returns nothing. By splitting the product spine (&lt;code&gt;q=t-shirt&lt;/code&gt;) from structured filters (&lt;code&gt;gender&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;max_price&lt;/code&gt;), search stays predictable and the agent gets results instead of an empty array. The contract tells the agent how to behave, so you don't depend on it guessing right.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real search response
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /wp-json/kalicart/v1/catalog/search?q=t-shirt&amp;amp;max_price=50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;460&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"T-shirt Nike Sportswear"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"encoding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"decimal_major_units"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"regular"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"sale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"current"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"on_sale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"discount_pct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;9.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"display"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"20,00 €"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"stock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"availability_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quantity_tracked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"availability_status_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"agent_note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Merchant does not expose numeric stock quantity. Treat as available for purchase, not as confirmed inventory count."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"categories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Uomo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uomo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Moda &amp;gt; Uomo"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice what's modeled here that scraping can't reliably recover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price is unambiguous.&lt;/strong&gt; &lt;code&gt;current&lt;/code&gt;, &lt;code&gt;regular&lt;/code&gt;, &lt;code&gt;sale&lt;/code&gt;, and the on-sale flag are separate fields, plus a &lt;code&gt;display&lt;/code&gt; string for humans and an explicit &lt;code&gt;encoding&lt;/code&gt; so nobody confuses major units with ISO minor units.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stock carries its own confidence.&lt;/strong&gt; This merchant doesn't track numeric inventory, so the response says so and tells the agent how to interpret it — "available for purchase" is not the same claim as "47 in stock." That distinction is the difference between an agent making a safe statement and a wrong one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categories are the merchant's own.&lt;/strong&gt; The Bridge doesn't force a global taxonomy onto the store; it exposes the merchant's native WooCommerce categories with their full path, and a &lt;code&gt;/catalog/categories&lt;/code&gt; endpoint to enumerate them. The principle behind the whole thing is that the domain constrains the machine, not the merchant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Evidence-required reasoning
&lt;/h2&gt;

&lt;p&gt;The discovery document also ships a rule that's more about agent behavior than data shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Every product claim must be traceable to a catalog field."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"product_url"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"price.current"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stock.in_stock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stock.confidence"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Do not present prices, availability or shipping estimates without citing the source field."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The point is to make hallucination structurally harder. If every claim an agent makes has to map back to a concrete field, it can't invent a price or a delivery promise — it either has the field or it doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  REST or MCP — same data
&lt;/h2&gt;

&lt;p&gt;For agent runtimes that speak Model Context Protocol, the same read-only catalog is exposed as an MCP server over JSON-RPC 2.0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http-post-jsonrpc-2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/wp-json/kalicart/v1/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"search_products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list_products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list_categories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_meta"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same catalog, same read-only guarantees — pick whichever your stack prefers. REST if you're calling HTTP directly, MCP if you're wiring it into an agent framework that already speaks the protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where checkout lives (and doesn't)
&lt;/h2&gt;

&lt;p&gt;The Bridge deliberately stops short of payment. There's a defined contract for an optional checkout &lt;em&gt;session&lt;/em&gt; — create a WooCommerce cart and hand back a &lt;code&gt;checkout_url&lt;/code&gt; for a human to finish — but it processes nothing and creates no order. Full autonomous checkout (agent holds a pre-authorized mandate, completes the purchase end to end) is on the roadmap as an AP2-compatible contract, gated on WooCommerce/gateway support for programmatic payment confirmation. Until that exists, the safe boundary is: agents read the catalog, humans (or a redirect) own the money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's free on the WordPress.org directory — search "KaliCart Bridge" in your plugins page, activate, and your catalog gets a discovery document and the read endpoints above. Then &lt;code&gt;curl&lt;/code&gt; your own &lt;code&gt;/wp-json/kalicart/v1/discovery&lt;/code&gt; and point an agent at it.&lt;/p&gt;

&lt;p&gt;Feedback from people who build agents or live in WooCommerce internals is exactly what I'm after — especially catalog edge cases and anything in the agent contract that reads ambiguously.&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>ai</category>
      <category>api</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your WooCommerce store is now readable by AI agents. It still isn't comparable — and that's the harder problem.</title>
      <dc:creator>Giuseppe Socci</dc:creator>
      <pubDate>Sat, 13 Jun 2026 18:27:14 +0000</pubDate>
      <link>https://dev.to/kalicart-bridge/your-woocommerce-store-is-now-readable-by-ai-agents-it-still-isnt-comparable-and-thats-the-1dm3</link>
      <guid>https://dev.to/kalicart-bridge/your-woocommerce-store-is-now-readable-by-ai-agents-it-still-isnt-comparable-and-thats-the-1dm3</guid>
      <description>&lt;p&gt;Your WooCommerce store is now readable by AI agents. It still isn't comparable — and that's the harder problem.&lt;/p&gt;

&lt;p&gt;If you read my last post, you added an agent-readable API to your WooCommerce store — or you're counting on the WooCommerce MCP that shipped in 10.3. Either way, an AI assistant can now access more of your store data. But access is not the same as cross-merchant comparability.&lt;/p&gt;

&lt;p&gt;You've solved visibility. You have not solved comparability. And comparability is the whole game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Readable is not comparable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When someone tells an agent "find me a waterproof jacket under €150 in size M", the agent isn't shopping one store. It's lining up candidates from many stores and ranking them on the same axes: category, size, color, price including tax, availability right now.&lt;/p&gt;

&lt;p&gt;To do that it needs every store to speak the same language for those axes. Reading one store is easy. Comparing fifty is the problem — because fifty WooCommerce stores describe the same product in fifty different ways.&lt;/p&gt;

&lt;p&gt;The same t-shirt, fifty shapes&lt;/p&gt;

&lt;p&gt;WooCommerce is open-source and composable. That's its strength for merchants and its liability for agents: there is no platform-enforced semantic model shared across stores, so every store invents its own.&lt;/p&gt;

&lt;p&gt;The same cotton t-shirt, across three stores, looks like this to a machine:&lt;/p&gt;

&lt;p&gt;size: M / Taglia M / 48&lt;br&gt;
category: Apparel &amp;gt; Men &amp;gt; T-shirts / Magliette / Abbigliamento/Uomo&lt;br&gt;
price: 29.00 (tax included) / 23.77 (tax excluded) / "29,00 €" as a string&lt;br&gt;
the "color" attribute: a taxonomy term in one store, a custom field in another, baked into the title in a third&lt;/p&gt;

&lt;p&gt;None of these is wrong. They're all valid WooCommerce. That's exactly why it's hard.&lt;/p&gt;

&lt;p&gt;And it gets worse below the surface. In one real catalog I audited, a single dimensions field was being populated in about ten mutually incompatible shapes, and roughly one value in six was physically impossible when read as centimeters. One store. One field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is WooCommerce's tax, not a bug&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Shopify has less of this problem at the platform boundary, because it controls more of the product and checkout model. That control is — not coincidentally — why it keeps showing up as the launch partner for every agentic surface.&lt;/p&gt;

&lt;p&gt;Look at who went live first. ChatGPT's Instant Checkout launched in September 2025 with U.S. Etsy sellers first, and OpenAI announced over a million Shopify merchants as the next channel. Google's Universal Cart was announced at I/O 2026; Google named Nike, Sephora, Target, Ulta Beauty, Walmart, Wayfair, and Shopify merchants among the brands for upcoming select checkout features. Notice what's on neither list: a single WooCommerce store.&lt;/p&gt;

&lt;p&gt;That's not a snub. It's structural. Agentic commerce launches where the catalog is already uniform — managed platforms, and big retailers with dedicated integration teams. The 4.3 million live WooCommerce stores (StoreLeads, May 2026) are the long tail, and the long tail is heterogeneous by construction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The three answers that don't close the gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"WooCommerce MCP already makes my store agent-ready." The MCP that shipped in 10.3 is a thin wrapper over your store's existing REST API — product and order operations, still in developer preview, with consumer shopping listed as a future step. It transports your data faithfully. It does nothing to reconcile your data with anyone else's. Readable, not comparable.&lt;/p&gt;

&lt;p&gt;"schema.org normalizes it." schema.org can express variants, size, and color — Google added ProductGroup support back in 2024. But the values are free text, not a controlled vocabulary, so M, Taglia M, and 48 stay three different strings — and there's no shared category tree. It was built to earn rich results in search, not to make catalogs comparable across merchants. It reduces the chaos; it doesn't resolve it.&lt;/p&gt;

&lt;p&gt;"The agent's model will just normalize on the fly." It can, per request — but normalizing millions of SKUs at query time is slow, costs money, and is non-deterministic: is 48 a EU clothing size, a shoe size, or a waist in centimeters? Comparison needs a stable key that means the same thing on every query, not a fresh guess each time. That's why the platforms are standardizing on structured feeds instead of leaning on inference at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually closes it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a prettier API. Not a richer feed. A normalization layer.&lt;/p&gt;

&lt;p&gt;Something that maps each store's idiosyncratic vocabulary onto one shared, governed semantic frame — categories reconciled to a common tree, sizes and colors and attributes canonicalized, price normalized to a tax-explicit encoding — and does it once, as a durable decision, instead of re-guessing it on every query. It's the unglamorous part. It's also the part that decides whether a store is comparable or merely readable.&lt;/p&gt;

&lt;p&gt;That's the layer I've been building underneath KaliCart: a federated catalog where heterogeneous WooCommerce stores resolve to a single comparable surface an agent can query and rank. The store stays itself. The agent sees one language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest scope&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This bites hardest for cross-merchant work — discovery, ranking, a cart that spans stores. A single store talking to a single agent feels it far less. And yes, schema.org and platform feeds shrink the problem at the edges.&lt;/p&gt;

&lt;p&gt;But they don't make it disappear, because someone still has to map each heterogeneous store onto the shared frame. For Shopify, the platform does it. For millions of WooCommerce stores, no one does — unless a layer is built for exactly that.&lt;/p&gt;

&lt;p&gt;The agentic web doesn't reward the prettiest storefront. It rewards the most impeccable source of truth. And impeccable doesn't mean exposed. It means normalized.&lt;/p&gt;

&lt;p&gt;Giuseppe Socci — creator of KaliCart Bridge&lt;br&gt;
&lt;a href="https://bridge.kalicart.com/" rel="noopener noreferrer"&gt;bridge.kalicart.com&lt;/a&gt; · &lt;a href="https://github.com/giuseppesocci-bot/kalicart-bridge" rel="noopener noreferrer"&gt;github.com/giuseppesocci-bot/kalicart-bridge&lt;/a&gt; · &lt;a href="https://global.kalicart.com/v1/global-catalog/discovery" rel="noopener noreferrer"&gt;global.kalicart.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>ai</category>
      <category>ecommerce</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>"A reality was not given to us": the web that is coming does not exist yet — an agent will build it for you</title>
      <dc:creator>Giuseppe Socci</dc:creator>
      <pubDate>Tue, 09 Jun 2026 16:00:19 +0000</pubDate>
      <link>https://dev.to/kalicart-bridge/a-reality-was-not-given-to-us-the-web-that-is-coming-does-not-exist-yet-an-agent-will-build-it-1oj7</link>
      <guid>https://dev.to/kalicart-bridge/a-reality-was-not-given-to-us-the-web-that-is-coming-does-not-exist-yet-an-agent-will-build-it-1oj7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Because a reality wasn't given to us and is not there; but we have to make it ourselves, if we want to be; and it will never be one for ever, but constant and infinitely changeable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Luigi Pirandello, One, No One, and One Hundred Thousand&lt;br&gt;
Pirandello wrote this about the human condition. He didn't know he was describing the future of the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The web we know is about to disappear&lt;/strong&gt;&lt;br&gt;
Not slowly. Not gradually. The web page, as the default unit of human navigation, is about to disappear: it will strip itself of everything we call "interface" and what remains will be only what it always was underneath — data, structure, instruction.&lt;/p&gt;

&lt;p&gt;The enticing homepages. The banners. The product carousels engineered by UX teams to capture attention in the first second and a half. The brand colors. The call-to-action buttons optimized for conversion rate. All of this is designed for a human eye that navigates alone.&lt;/p&gt;

&lt;p&gt;That eye is about to delegate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent that browses for you&lt;/strong&gt;&lt;br&gt;
Imagine you want to buy a pair of shoes. Today you open a browser, search, filter, compare, go back, reopen the tab you closed, forget what you were looking for, start again.&lt;/p&gt;

&lt;p&gt;In a few years — maybe less — you will tell the agent what you want. The agent will already know that you have wide feet, that you prefer leather to synthetic, that you're looking for something for a wedding in June but deep down you want something that works afterward too. It will know that today you're in a practical mood, not an aspirational one. That you've spent a lot this month.&lt;/p&gt;

&lt;p&gt;The agent won't open a homepage. It will query a data structure. It will receive prices, availability, variants, return policies. It will build for you — and only for you, and only in that moment — a presentation tailored to measure. Colors that belong to you. Texts that speak your language. Images generated for your aesthetic sensibility of that day.&lt;/p&gt;

&lt;p&gt;The same store. Five billion different versions. One for each person, one for each moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One, No One, and One Hundred Thousand — applied to the web&lt;/strong&gt;&lt;br&gt;
Pirandello imagined a man who discovers he has as many faces as there are people looking at him. Vitangelo Moscarda is not one — he is one hundred thousand, one for every other person's gaze. And he goes mad trying to understand which one is real.&lt;/p&gt;

&lt;p&gt;The agentic web resolves this paradox by reversing it.&lt;/p&gt;

&lt;p&gt;It's not you who has one hundred thousand faces in the eyes of others. It is the world that will have one hundred thousand faces in your eyes. Every site, every store, every piece of content will be built by the agent in your image and likeness — not fixed and identity-bound, but temporary, seasonal, mood-dependent. Faithful to who you are in that precise instant.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Because a reality wasn't given to us and is not there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no "true" web page. There is no "right" interface. There is only the construction — continuous, personal, unrepeatable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What remains when the frontend disappears&lt;/strong&gt;&lt;br&gt;
If the agent builds the interface, what must the merchant provide?&lt;br&gt;
Not design. Not copy. Not a mobile-optimized WordPress theme. They must provide &lt;strong&gt;instructions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instructions about what they sell. At what price. With what constraints. What values the brand holds. What is available right now, in this moment — not what was available yesterday when the crawler last updated the index. What it means to buy from them — the story, the guarantee, the meaning.&lt;/p&gt;

&lt;p&gt;The merchant of the future doesn't manage a storefront. They manage a &lt;strong&gt;source of truth&lt;/strong&gt; — structured, machine-readable, always current. The agent does the rest.&lt;/p&gt;

&lt;p&gt;This future will not be served by prettier landing pages. It will be served by APIs, product feeds, schema.org metadata, MCP-compatible interfaces, real-time availability endpoints, signed policies, and machine-readable brand constraints. The stack already exists in pieces — what is missing is the layer that makes it coherent and discoverable.&lt;br&gt;
This is the collapse of the frontend. HTML, CSS, JavaScript as presentation layers become optional. What remains is raw data — and raw data must be impeccable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The vehicle remains the web. But a stripped web.&lt;/strong&gt;&lt;br&gt;
There is an obvious objection: the web won't disappear. True.&lt;/p&gt;

&lt;p&gt;The protocol remains. HTTP remains. URLs remain. But what travels on that protocol changes its nature.&lt;/p&gt;

&lt;p&gt;Today a web page is a document — designed to be read by a human eye, built with layers of presentation over layers of content over layers of structure. Tomorrow a web page is an interface for agents — an endpoint that responds to structured queries, returns normalized data, declares its own capabilities in a discovery document.&lt;/p&gt;

&lt;p&gt;The graphics don't disappear — they are generated downstream, by the agent, for the human. But they don't live on the merchant's server. They live in the agent, constructed at the moment, on measure.&lt;/p&gt;

&lt;p&gt;The devices through which all of this will arrive have probably not been perfected yet. Glasses. Ambient voice interfaces. Surfaces we don't yet know how to imagine. The agentic web doesn't need a screen — it needs a connection and a structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The paradox of discovery&lt;/strong&gt;&lt;br&gt;
There is a question that keeps coming back to me as I think about all of this.&lt;/p&gt;

&lt;p&gt;If the agent filters the world according to who I am, how will I find what I don't know I want?&lt;/p&gt;

&lt;p&gt;Discovery — the accidental encounter with a store you weren't looking for, the book that changed your life found by mistake, the brand whose existence you didn't know — has always been a function of the web's chaos. Of the search engine's imperfection. Of the banner that for once caught something true.&lt;/p&gt;

&lt;p&gt;A perfectly aligned agent is also an agent that protects you from surprise. From dissonance. From chance.&lt;/p&gt;

&lt;p&gt;This is the paradox of total personalization: the more the world is built for you, the less it truly belongs to you. Because it is you who builds it — or rather, it is your past history that builds it, not who you could become.&lt;/p&gt;

&lt;p&gt;This is the problem no one has yet solved. Perhaps it is the most human problem of all.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;…reality is not a thing conferred upon us or which exists; it is something that we have to manufacture ourselves."&lt;br&gt;
&lt;em&gt;Luigi Pirandello, One, No One, and One Hundred Thousand&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pirandello was talking about the human condition. He was describing the internet.&lt;/p&gt;

&lt;p&gt;Giuseppe Socci — &lt;a href="https://bridge.kalicart.com" rel="noopener noreferrer"&gt;bridge.kalicart.com&lt;/a&gt; | &lt;a href="https://github.com/giuseppesocci-bot/kalicart-bridge" rel="noopener noreferrer"&gt;github.com/giuseppesocci-bot/kalicart-bridge&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>agents</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Your WooCommerce store is invisible to AI shopping agents. Here's how to fix it.</title>
      <dc:creator>Giuseppe Socci</dc:creator>
      <pubDate>Mon, 08 Jun 2026 18:34:36 +0000</pubDate>
      <link>https://dev.to/kalicart-bridge/your-woocommerce-store-is-invisible-to-ai-shopping-agents-heres-how-to-fix-it-1i4h</link>
      <guid>https://dev.to/kalicart-bridge/your-woocommerce-store-is-invisible-to-ai-shopping-agents-heres-how-to-fix-it-1i4h</guid>
      <description>&lt;p&gt;AI shopping agents are already buying things on behalf of real users. ChatGPT Shopping has been live since September 2025. Google announced Universal Cart at I/O 2026 — a persistent cross-merchant cart spanning Search, Gemini, YouTube, and Gmail. The underlying standard is UCP (Universal Commerce Protocol).&lt;br&gt;
None of this works with a standard WooCommerce store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI agents actually do when they shop&lt;/strong&gt;&lt;br&gt;
When a user asks ChatGPT "find me a waterproof jacket under €150 in size M", the agent doesn't open a browser and scroll through your homepage. It queries structured data sources — product feeds, APIs, discovery endpoints. If your store doesn't have one, it doesn't exist.&lt;br&gt;
The agent needs to answer machine questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the exact current price?&lt;/strong&gt;&lt;br&gt;
Is size M actually in stock right now, or is it backordered?&lt;br&gt;
Does this product have variants? Which ones are available?&lt;br&gt;
Is there a discount I can apply at checkout?&lt;br&gt;
How do I initiate a purchase session?&lt;/p&gt;

&lt;p&gt;A standard WooCommerce store can't answer any of these questions in a machine-readable way. The data is there — buried in the database — but there's no structured API surface for an agent to consume.&lt;br&gt;
This is the gap. And it's about to matter a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's shipping right now&lt;/strong&gt;&lt;br&gt;
ChatGPT Shopping — live since September 2025, 900M weekly users. Queries structured product feeds. Non-Shopify merchants need an ACP-compliant product feed to appear.&lt;br&gt;
Google AI Mode — replaces the classic search results page with a structured product panel. Reasons over the Shopping Graph to match intent, not just keywords. Feed completeness and live data are the ranking signals — not SEO.&lt;br&gt;
Google Universal Cart — announced at I/O 2026. Cross-merchant persistent cart across Search, Gemini, YouTube, Gmail. Powered by UCP. Initial rollout to Shopify merchants and major US retailers.&lt;br&gt;
WooCommerce MCP — shipped in WooCommerce 10.3 (Oct 2025), finalized in 10.7. Lets AI assistants interact with WooCommerce stores via Model Context Protocol. Current focus: store management (products, orders). Consumer shopping via MCP is the stated next step.&lt;br&gt;
The pattern is clear: every major AI platform is building a commerce layer, and they're all pulling from structured data. The stores with complete, machine-readable catalogs get surfaced. The rest don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The WooCommerce problem&lt;/strong&gt;&lt;br&gt;
WooCommerce powers ~28% of global online stores. Almost none of it is natively readable by AI agents.&lt;br&gt;
The WooCommerce REST API exists, but it's designed for store management — not for agent consumption. It requires authentication, returns data in a format agents don't expect, and has no discovery mechanism. An agent landing on a WooCommerce storefront has no standardized way to find the catalog, understand its structure, or initiate a purchase.&lt;br&gt;
Shopify solved this with their managed agentic stack. WooCommerce, being open-source, is taking the composable path — which means the solution space is open for plugins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a machine-readable WooCommerce store looks like&lt;/strong&gt;&lt;br&gt;
I've been building KaliCart Bridge — a free WooCommerce plugin that exposes your live catalog as a normalized REST API for AI agents.&lt;br&gt;
Here's what it adds to a standard WooCommerce store:&lt;br&gt;
Discovery signals — A &lt;code&gt;&amp;lt;link rel="kalicart-agent"&amp;gt;&lt;/code&gt; in the page &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;tells any agent where to start. &lt;code&gt;/.well-known/kalicart-bridge&lt;/code&gt; and &lt;code&gt;/.well-known/ucp&lt;/code&gt; provide standardized discovery files. &lt;code&gt;robots.txt&lt;/code&gt; explicitly allows the catalog endpoints.&lt;br&gt;
Structured catalog API —&lt;code&gt;/wp-json/kalicart/v1/discovery&lt;/code&gt; is the entry point. From there, agents can search with real filters (category, gender, color, on_sale, in_stock, price range), get paginated product lists, fetch individual products with full variations, and navigate the category tree.&lt;br&gt;
Normalized product data — every product exposes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"current"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"regular"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;110.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"on_sale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"discount_pct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;19.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"encoding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"decimal_major_units"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"display"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"89,00 €"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vat_included"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"availability_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"quantity_tracked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"backorder_allowed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"barcodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EAN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1234567890123"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"purchase_readiness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"direct_cart_possible"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stock_confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"numeric_stock_quantity"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;UCP compatibility&lt;/strong&gt; — &lt;code&gt;/.well-known/ucp&lt;/code&gt; declares &lt;code&gt;dev.ucp.shopping.catalog.search&lt;/code&gt; and &lt;code&gt;dev.ucp.shopping.catalog.lookup&lt;/code&gt; capabilities. Stock uses UCP-standard &lt;code&gt;availability_status&lt;/code&gt; values. Price encoding is explicit &lt;code&gt;(decimal_major_units)&lt;/code&gt; with a conversion hint for UCP minor units.&lt;br&gt;
Checkout sessions — optional. Agents can create multi-product sessions returning &lt;code&gt;cart_url&lt;/code&gt; and &lt;code&gt;checkout_url&lt;/code&gt;. The human pays on WooCommerce. The merchant stays Merchant of Record.&lt;br&gt;
No LLM. No cloud. No API key. Everything runs on your server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The discovery flow&lt;/strong&gt;&lt;br&gt;
An agent that encounters a KaliCart Bridge store follows this path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;1. GET page HTML → finds &lt;/li&gt;
&lt;li&gt;GET /wp-json/kalicart/v1/discovery → reads capabilities, filters, UCP profile, checkout policy&lt;/li&gt;
&lt;li&gt;GET /wp-json/kalicart/v1/catalog/search?q=waterproof+jacket&amp;amp;in_stock=true&amp;amp;max_price=150&lt;/li&gt;
&lt;li&gt;GET /wp-json/kalicart/v1/catalog/product/{id} → full variants for variable products&lt;/li&gt;
&lt;li&gt;POST /wp-json/kalicart/v1/checkout/session → returns cart_url + checkout_url
Five requests from zero knowledge to checkout-ready. No scraping, no guessing, no hallucinated prices.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Catalog health&lt;/strong&gt;&lt;br&gt;
The plugin also adds a health dashboard in WP Admin. Products are scored 0–100 based on data completeness. Deductions: NO_TITLE (−25), NO_DESCRIPTION (−30), NO_CATEGORY (−30), ZERO_PRICE (−25), NO_IMAGE (−8), NO_SKU (−4).&lt;br&gt;
Products with blocking issues are quarantined — they don't appear in agent responses until fixed. The dashboard shows exactly what's wrong and links directly to filtered product lists for remediation.&lt;br&gt;
This turns out to be useful even outside the agent context — most WooCommerce stores have a tail of products with incomplete data that nobody ever audits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where things are headed&lt;/strong&gt;&lt;br&gt;
The checkout layer (UCP + AP2) is still early — autonomous checkout at scale is probably 12–18 months away for the average merchant. But the discovery layer is live now.&lt;br&gt;
Google AI Mode is already routing product searches away from classic results. ChatGPT Shopping is already surfacing products from structured feeds. The stores that are machine-readable today will have indexed history, agent familiarity, and structured data quality by the time autonomous checkout becomes mainstream.&lt;br&gt;
The window to get ahead is now, not when it's obvious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plugin + docs: &lt;a href="https://bridge.kalicart.com" rel="noopener noreferrer"&gt;bridge.kalicart.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/giuseppesocci-bot/kalicart-bridge" rel="noopener noreferrer"&gt;github.com/giuseppesocci-bot/kalicart-bridge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live discovery endpoint: &lt;a href="https://www.project2209.com/wp-json/kalicart/v1/discovery" rel="noopener noreferrer"&gt;project2209.com/wp-json/kalicart/v1/discovery&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>api</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
