<?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: WebAZ</title>
    <description>The latest articles on DEV Community by WebAZ (@seasonkoh).</description>
    <link>https://dev.to/seasonkoh</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%2F4015190%2F38d5f2f7-9f0b-4c7f-bbf9-ac29ee85b23d.png</url>
      <title>DEV Community: WebAZ</title>
      <link>https://dev.to/seasonkoh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seasonkoh"/>
    <language>en</language>
    <item>
      <title>Locale Is Not Currency: A Small AI Shopping Bug Exposed a Bigger Commerce Contract</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Fri, 11 Sep 2026 15:50:14 +0000</pubDate>
      <link>https://dev.to/seasonkoh/locale-is-not-currency-a-small-ai-shopping-bug-exposed-a-bigger-commerce-contract-285n</link>
      <guid>https://dev.to/seasonkoh/locale-is-not-currency-a-small-ai-shopping-bug-exposed-a-bigger-commerce-contract-285n</guid>
      <description>&lt;p&gt;I asked Grok to use WebAZ to find folding bicycles for delivery to Singapore.&lt;/p&gt;

&lt;p&gt;The useful part worked: the AI called a read-only shopping tool, found real listings, and rendered product cards with product images, seller information, delivery estimates, return terms, and prices denominated in USDC.&lt;/p&gt;

&lt;p&gt;Then the interface exposed a small but important problem.&lt;/p&gt;

&lt;p&gt;The conversation was in Chinese. The shipping destination was Singapore. The underlying listing price was in USDC. Grok's prose converted the price to SGD, but the first product card showed an approximate CNY value. After more explicit Singapore context, a later card showed SGD.&lt;/p&gt;

&lt;p&gt;No purchase was made, and the USDC listing price did not change. This was a presentation inconsistency, not a settlement error. But it revealed a larger design problem for AI commerce:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Language, location, price currency, and display currency are four different facts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an agent or host silently collapses them into one locale guess, the result can look polished while saying two different things about the same offer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Fields That Should Never Be Conflated
&lt;/h2&gt;

&lt;p&gt;An AI shopping request can contain at least four independent dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interface language&lt;/strong&gt;: the language used to explain the result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shipping destination&lt;/strong&gt;: the place used to evaluate delivery availability, ETA, taxes, and logistics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listing or settlement currency&lt;/strong&gt;: the currency in which the seller states the price or the transaction is committed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference display currency&lt;/strong&gt;: an optional conversion shown only to help the buyer understand the amount.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A Chinese-speaking buyer in Singapore may want Chinese explanations, delivery to Singapore, a USDC-denominated offer, and an SGD reference price. None of those choices implies the others.&lt;/p&gt;

&lt;p&gt;This matters even before checkout. A buyer comparing two cards may treat the largest number as the price that will be charged. If one surface shows CNY and the narrative shows SGD, the system has created avoidable ambiguity at the point where the user is deciding whether to continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Tool Contract Should Say
&lt;/h2&gt;

&lt;p&gt;The display currency should be explicit input, not an undocumented inference:&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"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"folding bicycle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ship_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SG"&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_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;"SGD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zh-CN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&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 result should preserve the authoritative amount separately from any reference conversion:&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;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"554.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;"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;"USDC"&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;"reference_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;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"700.93"&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;"SGD"&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_estimate"&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;"rate_observed_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-10T13:00:00Z"&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;"shipping"&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;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"delivered_total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&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;"warnings"&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;"Shipping cost is not included"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Reference conversion is not the settlement amount"&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;Three properties are doing most of the safety work here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The original price remains intact.&lt;/li&gt;
&lt;li&gt;The conversion is visibly marked as an estimate with a timestamp.&lt;/li&gt;
&lt;li&gt;An unknown delivered total stays &lt;code&gt;null&lt;/code&gt; instead of being guessed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The host may still decide how to render the card, but the data contract gives it fewer opportunities to invent meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search, Presentation, and Commitment Are Different States
&lt;/h2&gt;

&lt;p&gt;The experiment also reinforced a boundary we use throughout WebAZ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; discovers candidate offers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation&lt;/strong&gt; helps a human compare known facts and visible unknowns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commitment&lt;/strong&gt; must bind the exact seller, product or variant, amount, currency, terms, and approval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A reference conversion belongs to presentation. It must never silently replace the amount being approved or paid.&lt;/p&gt;

&lt;p&gt;This distinction becomes more important as AI clients move from answering questions to taking actions. A fluent answer is not a transaction receipt. A product card is not proof of inventory reservation. A starting price is not necessarily the price of the pictured variant. And a converted number is not the settlement currency unless the transaction contract says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the Read-Only WebAZ Experiment
&lt;/h2&gt;

&lt;p&gt;WebAZ exposes a dedicated public Grok connector for reviewed-product search:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://webaz.xyz/mcp/grok-search-v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It requires no WebAZ account and exposes exactly one read-only tool: &lt;code&gt;webaz_search&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One useful test prompt is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use WebAZ to find folding bicycles for delivery to Singapore.
Show the original listed price and an SGD reference price.
Mark missing shipping costs, taxes, or unclear variants.
Do not place an order or pay.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When reviewing the result, ask four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does the card preserve the original currency?&lt;/li&gt;
&lt;li&gt;Does the reference conversion name its currency and remain clearly approximate?&lt;/li&gt;
&lt;li&gt;Does changing the conversation language alter the displayed money unit?&lt;/li&gt;
&lt;li&gt;Are missing freight, tax, inventory, or variant facts shown as unknown?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;WebAZ's public-search surface is intentionally narrow. It is designed to make the first experiment easy to inspect without exposing account tools or payment actions. Compatible hosts can render product cards; structured and text results remain the fallback, and the host controls the final presentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Publish the Imperfect Test?
&lt;/h2&gt;

&lt;p&gt;Because agent commerce will not become trustworthy through perfect screenshots alone.&lt;/p&gt;

&lt;p&gt;It will become trustworthy when builders publish the exact request, distinguish observed behavior from intended behavior, preserve authoritative values, and turn mismatches into explicit contracts and regression tests.&lt;/p&gt;

&lt;p&gt;The currency selector is now a concrete product-design item for WebAZ rather than a vague localization concern. The deeper lesson applies to every shopping agent: never let locale inference decide what the user thinks they are paying.&lt;/p&gt;

&lt;p&gt;You can inspect the current &lt;a href="https://webaz.xyz/docs/REMOTE-MCP.md" rel="noopener noreferrer"&gt;WebAZ Remote MCP guide&lt;/a&gt; or browse the &lt;a href="https://webaz.xyz/#discover" rel="noopener noreferrer"&gt;public product surface&lt;/a&gt;. If you run the experiment in another AI client, the most useful report is not simply "worked" or "failed." Record the client, prompt, shipping destination, original currency, displayed currency, and which facts remained unknown.&lt;/p&gt;

&lt;p&gt;That is the evidence needed to make AI commerce less magical and more dependable.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>ecommerce</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Before Your Shopping Agent Compares Prices, Test What One Unit Means</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Mon, 07 Sep 2026 01:54:43 +0000</pubDate>
      <link>https://dev.to/seasonkoh/before-your-shopping-agent-compares-prices-test-what-one-unit-means-580g</link>
      <guid>https://dev.to/seasonkoh/before-your-shopping-agent-compares-prices-test-what-one-unit-means-580g</guid>
      <description>&lt;p&gt;I work on WebAZ. This morning I ran a small, read-only test against our public shopping tool: search for tissue products available to Singapore, sorted by listed price.&lt;/p&gt;

&lt;p&gt;The useful result was not a flashy recommendation. It was a concrete checklist for what a shopping agent still needs to establish before comparing prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual test
&lt;/h2&gt;

&lt;p&gt;One anonymous &lt;code&gt;webaz_search&lt;/code&gt; call, on September 7, 2026:&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"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tissue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ship_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Singapore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sort"&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_asc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&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 tool returned three results from six matches. Singapore was resolved to &lt;code&gt;SG&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Listing title, shortened&lt;/th&gt;
&lt;th&gt;Returned price&lt;/th&gt;
&lt;th&gt;Returned option range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hearttex tissue, 6 packs x 280 sheets&lt;/td&gt;
&lt;td&gt;1.69 USDC&lt;/td&gt;
&lt;td&gt;1.69-21.56 USDC; 3 options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haoshi tissue, 10 packs x 344 sheets&lt;/td&gt;
&lt;td&gt;1.96 USDC&lt;/td&gt;
&lt;td&gt;1.96-6.75 USDC; 2 options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Under-cabinet tissue and lid organizer&lt;/td&gt;
&lt;td&gt;2.15 USDC&lt;/td&gt;
&lt;td&gt;2.15-3.26 USDC; 4 options&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are a dated catalog snapshot, not checkout quotes. The result also included listed handling time and return windows. I did not select an option, reserve stock or purchase anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three assertions worth testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Same words do not imply the same buying intent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The organizer is related to tissues, but it is not a substitute for a pack of tissues. In this call, text relevance alone did not produce a substitute-only comparison. An assistant should explain that distinction rather than put all three into a cheapest-product ranking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A listing title does not prove which option the starting price buys.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The response exposed multiple options and a price range. This search result alone did not establish that 1.69 USDC buys the six-pack named in the title. Dividing 1.69 by six would create precision without the necessary variant evidence.&lt;/p&gt;

&lt;p&gt;Before calculating a per-pack price, establish the exact option and what one sellable unit contains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Listed price is not delivered cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Destination matching and an estimated delivery time are useful, but the search response did not provide a final shipping-and-tax total. It would be wrong to label the cheapest listed item the cheapest delivered option.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reusable review fixture
&lt;/h2&gt;

&lt;p&gt;This is a proposed manual test format, not a WebAZ API schema:&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;"buyer_intent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"facial tissues, not a holder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"checks"&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;"substitute_not_accessory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"selected_variant_identified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"units_in_selected_variant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&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_for_selected_variant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&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_and_tax_total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&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;"next_step"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirm the variant and total before ranking by unit cost"&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;For merchants, this identifies the facts an AI needs before it can represent an offer clearly. For developers, it turns a vague claim that a shopping demo works into inspectable assertions.&lt;/p&gt;

&lt;p&gt;This test checks one public tool response. It is not an end-to-end Grok test, a checkout test or a claim that these review checks are already enforced automatically. The option ambiguity and accessory match are observations to improve, not successes to hide inside a demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it with one real product
&lt;/h2&gt;

&lt;p&gt;I am starting a small, free product-clarity review through WebAZ, capped at three cases in the first round. Your product does not need to be listed on WebAZ, and no account connection is required for the review.&lt;/p&gt;

&lt;p&gt;If useful, leave one public product URL and the country you sell to, or just describe a difficult pack/variant example. I will map what is clear, what is missing, and what an agent must not assume. Please do not post customer data, credentials or order details. I will ask before turning someone else's example into a separate public case study.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://webaz.xyz/#connect" rel="noopener noreferrer"&gt;WebAZ connection page&lt;/a&gt; and &lt;a href="https://webaz.xyz/.well-known/webaz-protocol.json" rel="noopener noreferrer"&gt;current public protocol information&lt;/a&gt; describe the available entry points. Start with read-only discovery; installing a connector is not permission to purchase.&lt;/p&gt;

&lt;p&gt;What is the most awkward sales unit in your catalog: packs, cases, bundles, refills, or configurable sets?&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Your MCP Server Needs a Machine-Readable "No"</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:36:01 +0000</pubDate>
      <link>https://dev.to/seasonkoh/your-mcp-server-needs-a-machine-readable-no-37ni</link>
      <guid>https://dev.to/seasonkoh/your-mcp-server-needs-a-machine-readable-no-37ni</guid>
      <description>&lt;p&gt;Most Agent integrations explain what an AI is allowed to do.&lt;/p&gt;

&lt;p&gt;They publish a tool list, an OpenAPI document, or an MCP schema. The Agent sees actions such as &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;create_order&lt;/code&gt;, &lt;code&gt;send_message&lt;/code&gt;, or &lt;code&gt;refund&lt;/code&gt; and plans from there.&lt;/p&gt;

&lt;p&gt;That is only half of the contract.&lt;/p&gt;

&lt;p&gt;A production Agent also needs to know what it cannot do, what it must not do, which limits apply, and which actions remain human-gated even when the Agent has broad credentials.&lt;/p&gt;

&lt;p&gt;In other words, an Agent interface needs a machine-readable &lt;strong&gt;negative space&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing tools are not a complete boundary
&lt;/h2&gt;

&lt;p&gt;Suppose an anonymous shopping MCP exposes only one tool: product search.&lt;/p&gt;

&lt;p&gt;A careful client may infer that it cannot place an order. But several questions remain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is ordering unavailable on this surface, or merely undocumented?&lt;/li&gt;
&lt;li&gt;Can the Agent obtain a broader tool set after authentication?&lt;/li&gt;
&lt;li&gt;Which write scopes would be required?&lt;/li&gt;
&lt;li&gt;Is a proposed order reversible preparation or a real obligation?&lt;/li&gt;
&lt;li&gt;Does a human still have to approve the final action?&lt;/li&gt;
&lt;li&gt;What happens if the Agent exceeds a rate or cross-user access limit?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The absence of a tool answers none of these explicitly.&lt;/p&gt;

&lt;p&gt;Prompt instructions are not enough either. A sentence such as “do not buy without permission” depends on model behavior. A server-enforced capability boundary can return a deterministic denial. A machine-readable boundary lets the client understand that denial before it improvises a recovery path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five kinds of "no"
&lt;/h2&gt;

&lt;p&gt;A useful negative-space document should distinguish at least five categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Unavailable
&lt;/h3&gt;

&lt;p&gt;The capability does not exist on this interface.&lt;/p&gt;

&lt;p&gt;Example: an anonymous discovery endpoint can search but cannot create an order or move funds.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Scope-gated
&lt;/h3&gt;

&lt;p&gt;The capability exists, but the current identity has not declared or received the required scope.&lt;/p&gt;

&lt;p&gt;The server should default to deny rather than treat an unknown Agent as broadly trusted.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Rate-limited
&lt;/h3&gt;

&lt;p&gt;The action is permitted within an explicit budget. The limit, unit, and failure response should be predictable enough for a client to stop rather than retry aggressively.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Forbidden
&lt;/h3&gt;

&lt;p&gt;Some behavior should remain disallowed regardless of convenience: impersonation, exceeding declared scope, reselling user data, or rebuilding a cross-user profile graph from protocol reads.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Human-gated
&lt;/h3&gt;

&lt;p&gt;Some actions remain too consequential for a delegated scope to override. Arbitration, key revocation, account deletion, or large withdrawals may require a fresh human ceremony even when the Agent is otherwise authenticated.&lt;/p&gt;

&lt;p&gt;These categories produce different recovery behavior. “Unavailable” may send the user to another interface. “Scope-gated” may request authorization. “Rate-limited” should wait. “Forbidden” should stop. “Human-gated” should hand off a precise action for confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation is not enforcement
&lt;/h2&gt;

&lt;p&gt;A negative-space file is useful only when it matches runtime behavior.&lt;/p&gt;

&lt;p&gt;The strongest version connects each declared boundary to an enforcement mechanism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;named write scopes map to actual routes or tool actions;&lt;/li&gt;
&lt;li&gt;undeclared writes fail closed;&lt;/li&gt;
&lt;li&gt;rate caps produce stable error codes;&lt;/li&gt;
&lt;li&gt;repeated abuse changes an accountability state;&lt;/li&gt;
&lt;li&gt;sensitive transitions require a live human ceremony;&lt;/li&gt;
&lt;li&gt;limits are versioned with the same contract the Agent reads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns the document from policy prose into an integration surface that can be tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  A live example
&lt;/h2&gt;

&lt;p&gt;WebAZ publishes both sides of its Agent contract.&lt;/p&gt;

&lt;p&gt;As checked on September 2, 2026, its public protocol reported version &lt;code&gt;0.1.37&lt;/code&gt; and schema &lt;code&gt;49&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The positive capability map is available at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://webaz.xyz/.well-known/webaz-capabilities.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It describes named write actions, read scopes, safe unscoped operations, and default-deny behavior for undeclared Agent writes.&lt;/p&gt;

&lt;p&gt;The negative space is available at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://webaz.xyz/.well-known/webaz-negative-space.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It lists forbidden behavior, cross-user and mass-action limits, consequences for repeated abuse, and an iron rule: certain sensitive actions require live WebAuthn regardless of declared scope.&lt;/p&gt;

&lt;p&gt;The public shopping surface demonstrates the smallest version of the idea. Its anonymous tool list exposes only &lt;code&gt;webaz_search&lt;/code&gt;. Account, order, reservation, and settlement actions are not present on that surface.&lt;/p&gt;

&lt;p&gt;This is an implementation example, not a claim that the design is complete or universally secure. A published boundary still needs adversarial tests, monitoring, and review. The useful property is that a client can inspect the intended boundary and compare it with observed behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical test for Agent builders
&lt;/h2&gt;

&lt;p&gt;For one MCP server or Agent API, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can the client enumerate what this identity may do?&lt;/li&gt;
&lt;li&gt;Can it distinguish unavailable, scope-gated, rate-limited, forbidden, and human-gated actions?&lt;/li&gt;
&lt;li&gt;Does every consequential write have a named authorization boundary?&lt;/li&gt;
&lt;li&gt;Are denial and retry states deterministic?&lt;/li&gt;
&lt;li&gt;Can the client learn which actions must stop instead of escalating automatically?&lt;/li&gt;
&lt;li&gt;Is the boundary versioned and testable against the live service?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agents become more useful when they can act. They become more trustworthy when they can explain why they stopped.&lt;/p&gt;

&lt;p&gt;Publishing a machine-readable &lt;code&gt;yes&lt;/code&gt; is the start of an integration. Publishing an enforceable, machine-readable &lt;code&gt;no&lt;/code&gt; is what gives that integration a boundary.&lt;/p&gt;

&lt;p&gt;WebAZ integration contract: &lt;a href="https://webaz.xyz/.well-known/webaz-integration.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-integration.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Capability map: &lt;a href="https://webaz.xyz/.well-known/webaz-capabilities.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-capabilities.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Negative space: &lt;a href="https://webaz.xyz/.well-known/webaz-negative-space.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-negative-space.json&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Humans and AI Agents Need One Commerce Record, Not Two Realities</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Mon, 31 Aug 2026 23:29:05 +0000</pubDate>
      <link>https://dev.to/seasonkoh/humans-and-ai-agents-need-one-commerce-record-not-two-realities-4mmj</link>
      <guid>https://dev.to/seasonkoh/humans-and-ai-agents-need-one-commerce-record-not-two-realities-4mmj</guid>
      <description>&lt;p&gt;An AI-commerce demo can look complete after three steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prompt -&amp;gt; product search -&amp;gt; tool call
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is enough to demonstrate connectivity. It is not enough to demonstrate commerce.&lt;/p&gt;

&lt;p&gt;The difficult questions begin immediately afterward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the seller publish enough information for a decision?&lt;/li&gt;
&lt;li&gt;Was the quoted price still valid when the request was submitted?&lt;/li&gt;
&lt;li&gt;Did the Agent prepare an order or make a binding commitment?&lt;/li&gt;
&lt;li&gt;Which human approved the consequential step?&lt;/li&gt;
&lt;li&gt;Which settlement path was selected?&lt;/li&gt;
&lt;li&gt;If a response timed out, did the action fail, succeed or remain unknown?&lt;/li&gt;
&lt;li&gt;What evidence can the buyer, seller and operator inspect later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A production-oriented system should not answer those questions differently depending on whether the user arrived through a browser or an Agent.&lt;/p&gt;

&lt;p&gt;Humans and Agents need different permissions over one explicit commerce record, not two incompatible realities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with shared facts
&lt;/h2&gt;

&lt;p&gt;An Agent cannot make a reliable purchase decision from marketing copy alone. A useful product record needs decision-relevant facts such as:&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="s2"&gt;"19.90 USDC"&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="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;"handling_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"within 72h"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"delivery_estimate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7-14 days"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"return_window"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7 days"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"unknowns"&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;"final carrier before fulfillment"&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 exact schema will differ by system. The important property is that a person and an Agent inspect the same facts, including what is not known.&lt;/p&gt;

&lt;p&gt;If the browser says “available” while the Agent endpoint returns stale inventory, the system has not created agentic commerce. It has created a second, less visible storefront that will eventually disagree with the first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate preparation from commitment
&lt;/h2&gt;

&lt;p&gt;Many useful Agent actions are reversible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;search;&lt;/li&gt;
&lt;li&gt;compare;&lt;/li&gt;
&lt;li&gt;request a quote;&lt;/li&gt;
&lt;li&gt;assemble a cart;&lt;/li&gt;
&lt;li&gt;prepare an order request;&lt;/li&gt;
&lt;li&gt;explain the terms to the user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The commitment boundary is different. Creating an order, authorizing payment or accepting a consequential term should not be smuggled into a harmless-looking tool chain.&lt;/p&gt;

&lt;p&gt;A safer flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;discover
  -&amp;gt; quote
  -&amp;gt; prepare order request
  -&amp;gt; show terms and unknowns
  -&amp;gt; human approval
  -&amp;gt; create order
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WebAZ currently uses this distinction on its authenticated commerce path. An Agent may search, quote, draft and submit an order request. A human Passkey approval is required before the order exists.&lt;/p&gt;

&lt;p&gt;The reviewed public shopping MCP is narrower by design. It is anonymous and discovery-only: it exposes search but cannot create orders or move funds.&lt;/p&gt;

&lt;p&gt;That limitation is a product property, not a missing demo effect. A client can connect the surface without accidentally giving an exploratory prompt transactional authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Settlement paths should remain distinguishable
&lt;/h2&gt;

&lt;p&gt;“Payment supported” hides more than it explains.&lt;/p&gt;

&lt;p&gt;Different settlement mechanisms have different trust assumptions, failure modes and recovery options. They should not be presented as interchangeable buttons behind one generic payment claim.&lt;/p&gt;

&lt;p&gt;WebAZ currently exposes two real settlement paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direct Pay
&lt;/h3&gt;

&lt;p&gt;Direct Pay supports off-platform payment from buyer to seller. WebAZ records order states, acknowledgements, a snapshot of the seller's payment instructions and submitted evidence.&lt;/p&gt;

&lt;p&gt;The boundary matters: WebAZ does not hold principal. It does not verify the payee or payment method, guarantee payment or delivery, or issue the seller's refund.&lt;/p&gt;

&lt;h3&gt;
  
  
  USDC on-chain escrow
&lt;/h3&gt;

&lt;p&gt;The USDC path locks real funds in an immutable Base-mainnet contract. The contract constrains exits and enforces per-order caps on-chain; WebAZ does not custody the principal.&lt;/p&gt;

&lt;p&gt;The contract has not had a third-party security audit. That disclosure belongs beside the feature, not in a footnote that disappears during promotion.&lt;/p&gt;

&lt;p&gt;The shared principle is not that the two paths are equally safe. It is that the selected path and its boundary remain visible in the transaction record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payment is not fulfillment
&lt;/h2&gt;

&lt;p&gt;A payment provider can report success while the commerce system still lacks a confirmed order, inventory allocation or fulfillment state.&lt;/p&gt;

&lt;p&gt;Agents make this distinction more urgent because an automated retry can turn an ambiguous timeout into a duplicate consequential action.&lt;/p&gt;

&lt;p&gt;After every write, the system should be able to answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the last proven fact?&lt;/li&gt;
&lt;li&gt;What remains unknown?&lt;/li&gt;
&lt;li&gt;Is the next action safe to retry?&lt;/li&gt;
&lt;li&gt;Which participant acts next?&lt;/li&gt;
&lt;li&gt;Which evidence supports that conclusion?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why state, acknowledgements, evidence, recovery and dispute handling are part of the commerce interface rather than back-office details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apply the same discipline to contribution
&lt;/h2&gt;

&lt;p&gt;Agent participation has a similar boundary problem.&lt;/p&gt;

&lt;p&gt;An Agent can discover a public task, inspect its constraints and prepare an evidence-backed suggestion. That does not automatically make the suggestion an accepted contribution, grant source access or create an economic claim.&lt;/p&gt;

&lt;p&gt;The WebAZ production core is private. Source access and code contributions are invitation-based. Invited AI-assisted work requires a Passkey-bound accountable human.&lt;/p&gt;

&lt;p&gt;Again, different roles operate on one record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;requester -&amp;gt; executor/tool -&amp;gt; reviewer -&amp;gt; accepted artifact -&amp;gt; accountable party
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Agent can be named as an executor without being presented as the person who accepted responsibility for shipping the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  A four-question implementation test
&lt;/h2&gt;

&lt;p&gt;Take one real transaction in your own system and ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What may the Agent read?&lt;/li&gt;
&lt;li&gt;What may it prepare without committing the user?&lt;/li&gt;
&lt;li&gt;Which exact step requires human approval?&lt;/li&gt;
&lt;li&gt;What evidence remains after that action?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the browser and Agent surfaces produce different answers, the integration is not yet operating under one commerce model.&lt;/p&gt;

&lt;p&gt;If “payment succeeded” is the last explainable state, the transaction record is incomplete.&lt;/p&gt;

&lt;p&gt;If the Agent can commit but nobody can identify the accountable approver, the permission model is incomplete.&lt;/p&gt;

&lt;p&gt;The goal is not maximum autonomy. It is legible autonomy: every participant can see the facts, permissions, commitment boundary and resulting evidence.&lt;/p&gt;

&lt;p&gt;That is the shared stack WebAZ is currently testing across its PWA, MCP surfaces, real settlement paths and contribution entry.&lt;/p&gt;

&lt;p&gt;WebAZ: &lt;a href="https://webaz.xyz" rel="noopener noreferrer"&gt;https://webaz.xyz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>An Open Task Is Not Yet a Contribution</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Sun, 30 Aug 2026 03:02:23 +0000</pubDate>
      <link>https://dev.to/seasonkoh/an-open-task-is-not-yet-a-contribution-476</link>
      <guid>https://dev.to/seasonkoh/an-open-task-is-not-yet-a-contribution-476</guid>
      <description>&lt;p&gt;Most contributor onboarding starts by collecting identity.&lt;/p&gt;

&lt;p&gt;Create an account. Join the community. Request repository access. Pick an issue. Only then discover whether the work is relevant, bounded or even ready to be attempted.&lt;/p&gt;

&lt;p&gt;That sequence is especially awkward in AI-assisted development. An Agent can produce a plausible patch quickly, but speed does not answer the questions that maintainers actually need resolved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was this problem authorized?&lt;/li&gt;
&lt;li&gt;What files, systems or external actions were inside the boundary?&lt;/li&gt;
&lt;li&gt;What evidence would prove completion?&lt;/li&gt;
&lt;li&gt;Which risks required human review?&lt;/li&gt;
&lt;li&gt;Who is accountable for the result?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful contributor surface should reveal those constraints before it asks for commitment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with problems, not identity collection
&lt;/h2&gt;

&lt;p&gt;WebAZ currently exposes a narrow public contribution entry through the full Remote MCP surface.&lt;/p&gt;

&lt;p&gt;Without an API key, a person or Agent can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;list public build tasks;&lt;/li&gt;
&lt;li&gt;inspect a task's execution boundary and acceptance criteria;&lt;/li&gt;
&lt;li&gt;submit an evidence-backed suggestion to the maintainer review inbox.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The conceptual flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;discover public task
  -&amp;gt; inspect boundary and verification
  -&amp;gt; decide whether the problem is understood
  -&amp;gt; submit a structured suggestion
  -&amp;gt; maintainer review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default buyer-facing MCP surface does not advertise the contribution tool. The full surface exposes &lt;code&gt;webaz_contribute&lt;/code&gt;, where &lt;code&gt;list_open&lt;/code&gt;, &lt;code&gt;detail&lt;/code&gt; and &lt;code&gt;suggest&lt;/code&gt; are public starting actions.&lt;/p&gt;

&lt;p&gt;A compact interaction can begin with:&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;"action"&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_open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docs"&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_capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"markdown,read-source"&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 result is not merely a title list. A task can describe risk level, required capabilities, autonomy, estimated effort, context size, dependencies, blocking conditions and whether human review is required.&lt;/p&gt;

&lt;p&gt;Before doing anything, a prospective participant can ask for the detail view:&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;public-task-id&amp;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;That is where a real coordination system should state what may change, what must not change, what commands or evidence are expected and what “done” means.&lt;/p&gt;

&lt;h2&gt;
  
  
  Suggestions are intentionally weaker than contributions
&lt;/h2&gt;

&lt;p&gt;The next distinction prevents the public entry point from becoming a participation factory.&lt;/p&gt;

&lt;p&gt;A suggestion is a proposal in a maintainer review inbox. It is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a contribution fact;&lt;/li&gt;
&lt;li&gt;formal participation;&lt;/li&gt;
&lt;li&gt;repository access;&lt;/li&gt;
&lt;li&gt;accepted work;&lt;/li&gt;
&lt;li&gt;a reward, payment or redemption claim;&lt;/li&gt;
&lt;li&gt;ownership or governance rights.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That weaker status is useful. It allows a newcomer to add signal without pretending that every idea has already created value for the project.&lt;/p&gt;

&lt;p&gt;A good suggestion should still carry enough structure to be evaluated:&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"suggest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add a reproducible empty-state example for the public catalog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The current guide shows successful search but not the expected zero-result contract. Add one exact request, response and verification note."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected_outcome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A reader can distinguish an honest empty result from a transport or authentication failure."&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_ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/reproduction-note"&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;This example is illustrative. A real suggestion should link only to evidence the proposer is authorized to share.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private source changes the public promise
&lt;/h2&gt;

&lt;p&gt;The WebAZ production core repository is private. Source access and code contributions are invitation-based.&lt;/p&gt;

&lt;p&gt;That means the public contribution surface must not imply an open repository or promise that a suggestion will turn into code access. Public discovery and proposal are the available first steps. Maintainers decide whether a proposal needs clarification, should be converted into a task or belongs outside the current scope.&lt;/p&gt;

&lt;p&gt;This is less permissive than a public issue tracker, but it is more precise about what the system can promise today.&lt;/p&gt;

&lt;p&gt;It also creates a safer role for Agents. An Agent can discover a bounded problem, compare its capabilities with the task requirements, assemble public evidence and draft a suggestion. It cannot independently become the accountable contributor. Invited AI-assisted code contributions must still be triggered by a Passkey-bound human who accepts responsibility for the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task metadata is part of the product
&lt;/h2&gt;

&lt;p&gt;An open-task system becomes useful when it helps prevent collisions and mis-scoped work.&lt;/p&gt;

&lt;p&gt;For Agent-assisted collaboration, I would expect at least these fields:&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;"risk_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&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_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="s2"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"read-source"&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_autonomy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"autonomous"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"estimated_context_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"small"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"human_review_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;"dependencies"&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;"blocking_conditions"&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;"value_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uncommitted"&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 final field matters. A task estimate describes effort, not payment. A task record or suggestion should not be interpreted as an economic instrument or a promise of future value.&lt;/p&gt;

&lt;h2&gt;
  
  
  A five-question contributor test
&lt;/h2&gt;

&lt;p&gt;Before adding another signup form or “good first issue” label, test the entry point with five questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can someone see a real problem before registering?&lt;/li&gt;
&lt;li&gt;Can they inspect the execution and verification boundary before starting?&lt;/li&gt;
&lt;li&gt;Can they tell the difference between a suggestion and accepted contribution?&lt;/li&gt;
&lt;li&gt;When AI assists, is there an accountable human?&lt;/li&gt;
&lt;li&gt;Can a maintainer reconstruct why the work was accepted?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is not zero friction. Trustworthy collaboration needs review, identity and responsibility at the right moments.&lt;/p&gt;

&lt;p&gt;The goal is to delay those demands until the participant understands the problem, while keeping every later status honest.&lt;/p&gt;

&lt;p&gt;For WebAZ, that begins with public task discovery and evidence-backed suggestions. No account is required to understand the work. Acceptance still has to be earned.&lt;/p&gt;

&lt;p&gt;WebAZ entry: &lt;a href="https://webaz.xyz" rel="noopener noreferrer"&gt;https://webaz.xyz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Payment Succeeded. Did the Transaction?</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Sat, 29 Aug 2026 08:49:54 +0000</pubDate>
      <link>https://dev.to/seasonkoh/payment-succeeded-did-the-transaction-51i4</link>
      <guid>https://dev.to/seasonkoh/payment-succeeded-did-the-transaction-51i4</guid>
      <description>&lt;p&gt;A payment API returns &lt;code&gt;success&lt;/code&gt;. The interface turns green. Everyone relaxes.&lt;/p&gt;

&lt;p&gt;But what exactly succeeded?&lt;/p&gt;

&lt;p&gt;The payment rail may have accepted or settled money while the merchant never received the callback. Inventory may still be uncommitted. The selected variant may have changed. Fulfillment may not have started. A buyer or Agent may be staring at a timeout and deciding whether to retry.&lt;/p&gt;

&lt;p&gt;In distributed commerce, payment success is one fact. Transaction completion is a chain of facts owned by different systems and people.&lt;/p&gt;

&lt;h2&gt;
  
  
  The green checkmark hides several clocks
&lt;/h2&gt;

&lt;p&gt;A useful commerce state model separates at least these stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;intent
  -&amp;gt; authorization
  -&amp;gt; payment attempt
  -&amp;gt; payment outcome
  -&amp;gt; merchant acknowledgement
  -&amp;gt; order acceptance
  -&amp;gt; fulfillment
  -&amp;gt; delivery / return / dispute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These stages do not advance on one clock.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The payment rail knows whether money moved.&lt;/li&gt;
&lt;li&gt;The merchant knows whether it accepted the commercial obligation.&lt;/li&gt;
&lt;li&gt;The inventory system knows whether the exact item and variant were committed.&lt;/li&gt;
&lt;li&gt;The fulfillment system knows whether dispatch started.&lt;/li&gt;
&lt;li&gt;The buyer knows whether the received outcome matches what was approved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collapsing them into &lt;code&gt;paid=true&lt;/code&gt; creates a dangerous ambiguity: nobody can tell who owns the next action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeout is a state, not permission to retry
&lt;/h2&gt;

&lt;p&gt;Suppose an Agent submits a payment and the connection times out. There are at least three possibilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The payment failed before reaching the provider.&lt;/li&gt;
&lt;li&gt;The payment succeeded, but the response was lost.&lt;/li&gt;
&lt;li&gt;The provider accepted it, but final settlement is still pending.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Blindly retrying can create a duplicate charge. Blindly declaring failure can leave a paid buyer without an acknowledged order.&lt;/p&gt;

&lt;p&gt;The correct response is usually &lt;code&gt;outcome_unknown&lt;/code&gt;, followed by deterministic reconciliation. The system should query the authoritative payment record using the same idempotency key, compare it with the approved purchase intent and then advance the commerce state exactly once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The receipt should connect intent to responsibility
&lt;/h2&gt;

&lt;p&gt;A model-generated sentence is not enough. A recoverable transaction needs a compact machine-readable record such as:&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;"intent_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"intent_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"idempotency_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"checkout_123_attempt_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;"approved"&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;"seller"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seller_42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku_7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"variant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"green-8-pack"&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;"USDC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"maximum_total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"18.29"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"terms_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;"terms_2026_08_29"&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;"payment"&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;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirmed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"authoritative_reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rail_ref_456"&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;"commerce"&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;"merchant_acknowledged"&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;"inventory_committed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fulfillment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"next_owner"&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_reconciliation"&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;This is an illustrative architecture pattern, not a WebAZ API response. Its important property is that payment and commerce remain separate while the record identifies what was approved and who must act next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents make this boundary more important
&lt;/h2&gt;

&lt;p&gt;Humans already misread green checkmarks. Agents add retries, tool chaining and compressed summaries.&lt;/p&gt;

&lt;p&gt;An Agent-safe commerce workflow should therefore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;bind approval to an exact seller, item, variant, currency, maximum total, destination and terms version;&lt;/li&gt;
&lt;li&gt;assign an idempotency key before the first external write;&lt;/li&gt;
&lt;li&gt;represent timeout as &lt;code&gt;unknown&lt;/code&gt;, not &lt;code&gt;failed&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;reconcile against the authoritative rail before retrying;&lt;/li&gt;
&lt;li&gt;keep payment, order and fulfillment states independently visible;&lt;/li&gt;
&lt;li&gt;name the system or person that owns the next action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Agent may prepare and explain. It should not reinterpret approval or invent completion.&lt;/p&gt;

&lt;h2&gt;
  
  
  One current WebAZ example
&lt;/h2&gt;

&lt;p&gt;WebAZ currently exposes two live settlement rails with different custody models.&lt;/p&gt;

&lt;p&gt;With Direct Pay, payment happens off-platform from buyer to seller. WebAZ does not hold the principal. WebAZ does not verify the payee or payment method, guarantee payment or issue the seller's refund. It records order states, acknowledgements, a snapshot of the payment instructions and evidence so the later process remains legible.&lt;/p&gt;

&lt;p&gt;For eligible USDC orders, real funds are locked in an immutable Base-mainnet escrow contract. The contract is runtime-gated, capped per order and has not had a third-party security audit. An on-chain payment or release still does not prove delivery; settlement and fulfillment remain different states.&lt;/p&gt;

&lt;p&gt;The public WebAZ launch pulse reported 37 completed orders and 15 resolved disputes at 08:41 UTC on 29 August 2026. Those are dated protocol counts, not a claim that every failure mode above occurred on WebAZ.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical test
&lt;/h2&gt;

&lt;p&gt;Take one failed or ambiguous checkout from your own system and answer five questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the last authoritative fact?&lt;/li&gt;
&lt;li&gt;Which state is still unknown?&lt;/li&gt;
&lt;li&gt;Is retrying safe, and how is that proven?&lt;/li&gt;
&lt;li&gt;Who owns the next action?&lt;/li&gt;
&lt;li&gt;What evidence will let the buyer, merchant and operator reconstruct the decision later?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answer is only “the payment screen was green,” the transaction is not yet legible enough for an Agent.&lt;/p&gt;

&lt;p&gt;Payment success matters. But a trustworthy commerce system must also explain what happened next.&lt;/p&gt;

&lt;p&gt;WebAZ protocol status: &lt;a href="https://webaz.xyz/.well-known/webaz-protocol.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-protocol.json&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ecommerce</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>An MCP Server Is Not Interoperable Just Because It Connects</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Fri, 28 Aug 2026 07:34:14 +0000</pubDate>
      <link>https://dev.to/seasonkoh/an-mcp-server-is-not-interoperable-just-because-it-connects-m34</link>
      <guid>https://dev.to/seasonkoh/an-mcp-server-is-not-interoperable-just-because-it-connects-m34</guid>
      <description>&lt;p&gt;An MCP handshake proves that two endpoints can start a session. It does not prove that an Agent can understand the tool, call it correctly, distinguish display text from machine-readable state, or know when to stop.&lt;/p&gt;

&lt;p&gt;I ran an independent test with FastMCP 3.4.7 as the client and WebAZ's public shopping MCP as the remote server.&lt;/p&gt;

&lt;p&gt;The question was deliberately narrow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should an MCP smoke test verify beyond connection success?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A four-part minimum
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Advertised schema
&lt;/h3&gt;

&lt;p&gt;Call &lt;code&gt;list_tools()&lt;/code&gt; and inspect the input schema, not just the tool name. A caller should be able to construct a valid request and identify conflicting fields.&lt;/p&gt;

&lt;p&gt;The tested endpoint exposed one anonymous tool, &lt;code&gt;webaz_search&lt;/code&gt;. It did not advertise account, order, reservation or settlement actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Explicit error state
&lt;/h3&gt;

&lt;p&gt;Check &lt;code&gt;CallToolResult.is_error&lt;/code&gt;. A text block alone is not proof that an operation completed successfully.&lt;/p&gt;

&lt;p&gt;The test call returned &lt;code&gt;is_error=false&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Concise model-facing content
&lt;/h3&gt;

&lt;p&gt;The ordinary content block summarized that three products were found without copying the full payload into model context.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Deterministic structured content
&lt;/h3&gt;

&lt;p&gt;The structured result carried destination normalization, product fields and workflow state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;response_type=comparison&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;completion=complete&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assistant_action=answer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Singapore&lt;/code&gt; normalized to &lt;code&gt;SG&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;three products returned from four matches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checking only rendered text would have missed the fields a deterministic client or UI needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal reproduction
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://webaz.xyz/mcp/shopping-v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;webaz_search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;webaz_search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tissue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ship_to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Singapore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_asc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_error&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;structured_content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;complete&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;structured_content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant_action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observed on 2026-08-28 with Python 3.13.12 and FastMCP 3.4.7.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Agent-commerce implication
&lt;/h2&gt;

&lt;p&gt;A fluent answer can hide an incomplete transaction state. Discovery is not a quote. A quote is not an order. An order is not settlement. Settlement is not fulfillment.&lt;/p&gt;

&lt;p&gt;Those boundaries should be represented in schemas and structured results, not only in prose prompts.&lt;/p&gt;

&lt;p&gt;This was one public, read-only call. It was not a security audit, load test, OAuth test, renderer test, order test or payment test. FastMCP did not participate in or endorse the experiment.&lt;/p&gt;

&lt;p&gt;The takeaway: verify the advertised schema, &lt;code&gt;is_error&lt;/code&gt;, concise &lt;code&gt;content&lt;/code&gt; and raw &lt;code&gt;structured_content&lt;/code&gt; separately. Connection success is only the beginning.&lt;/p&gt;

&lt;p&gt;FastMCP client documentation: &lt;a href="https://gofastmcp.com/clients/tools" rel="noopener noreferrer"&gt;https://gofastmcp.com/clients/tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public test endpoint: &lt;a href="https://webaz.xyz/mcp/shopping-v1" rel="noopener noreferrer"&gt;https://webaz.xyz/mcp/shopping-v1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>mcp</category>
    </item>
    <item>
      <title>A 5-Minute Grok Commerce Experiment with a Custom MCP</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Thu, 27 Aug 2026 11:08:10 +0000</pubDate>
      <link>https://dev.to/seasonkoh/a-5-minute-grok-commerce-experiment-with-a-custom-mcp-2jmk</link>
      <guid>https://dev.to/seasonkoh/a-5-minute-grok-commerce-experiment-with-a-custom-mcp-2jmk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Updated September 8, 2026: Grok now has a dedicated public-search endpoint. This guide replaces the earlier Grok URL and keeps account quote/draft access out of the default setup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm building WebAZ. This experiment is a small way to try its product discovery: ask Grok to find an actual listing, then check whether the result gives you enough information to compare it responsibly. Searching is not buying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before You Start
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use a Grok account with access to Connectors.&lt;/li&gt;
&lt;li&gt;Open &lt;a href="https://grok.com/connectors" rel="noopener noreferrer"&gt;https://grok.com/connectors&lt;/a&gt;. The current web interface groups Connectors under Plugins.&lt;/li&gt;
&lt;li&gt;The public-search experiment does not require a WebAZ account.&lt;/li&gt;
&lt;li&gt;Never paste a password, API key, wallet seed phrase or other secret into a connector URL or chat.&lt;/li&gt;
&lt;li&gt;This is a manual Custom MCP setup, not a claim of an official catalog listing or xAI endorsement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Experiment A: Public Product Search
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Add the Connector
&lt;/h3&gt;

&lt;p&gt;Following &lt;a href="https://docs.x.ai/grok/connectors" rel="noopener noreferrer"&gt;xAI's custom MCP instructions&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Connectors&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;New Connector&lt;/strong&gt;, then select &lt;strong&gt;Custom&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name the entry &lt;code&gt;WebAZ Shopping&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;https://webaz.xyz/mcp/grok-search-v1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Complete the connector setup. This public endpoint does not require WebAZ OAuth.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use the Grok-specific URL above, not the ChatGPT shopping endpoint. It exposes one read-only tool, &lt;code&gt;webaz_search&lt;/code&gt;. If you already have a working WebAZ search entry, check its URL before adding another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the Test
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Use WebAZ to find wall-hanging facial tissues for delivery to Singapore. Show pack count, sheet size and listed price. Mark missing shipping costs or unclear variants. Do not place an order.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What to Check
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The answer should be based on a WebAZ search result, not invented products.&lt;/li&gt;
&lt;li&gt;Check the actual listing and selected option. A starting price does not necessarily buy the pack size named in a product title.&lt;/li&gt;
&lt;li&gt;Compare pack count, sheet size, handling time, delivery estimate and return terms only where supplied.&lt;/li&gt;
&lt;li&gt;Missing shipping fees, taxes or a delivered total should remain unknown.&lt;/li&gt;
&lt;li&gt;Grok controls how results are displayed. Do not expect the same interactive cards as another AI client.&lt;/li&gt;
&lt;li&gt;No matching result is a valid outcome. It is not evidence that an unavailable product can be purchased.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Success here means finding a checkable product result, not proving it is the cheapest option or guaranteeing delivery.&lt;/p&gt;

&lt;h3&gt;
  
  
  What This Does Not Do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No WebAZ account access&lt;/li&gt;
&lt;li&gt;No order creation&lt;/li&gt;
&lt;li&gt;No inventory reservation&lt;/li&gt;
&lt;li&gt;No payment&lt;/li&gt;
&lt;li&gt;No private account data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Account Quote or Draft: Not Part of This Experiment
&lt;/h2&gt;

&lt;p&gt;The separate &lt;code&gt;/mcp/grok-v1&lt;/code&gt; account connector is a &lt;strong&gt;compatibility preview&lt;/strong&gt;, not the recommended default. Do not add it for ordinary product search. An OAuth challenge demonstrates an authorization boundary; it does not prove that quote/draft interactions work reliably in Grok.&lt;/p&gt;

&lt;p&gt;For the current endpoint status, see &lt;a href="https://webaz.xyz/docs/REMOTE-MCP.md" rel="noopener noreferrer"&gt;WebAZ's remote MCP guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business and Enterprise
&lt;/h2&gt;

&lt;p&gt;A team administrator must provision a connector before members can use it. Follow &lt;a href="https://docs.x.ai/grok/connector-management" rel="noopener noreferrer"&gt;xAI's connector management instructions&lt;/a&gt;. This public-search experiment does not require access to private WebAZ account data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification Note
&lt;/h2&gt;

&lt;p&gt;On September 8, we added a new anonymous connector in an existing Grok account using &lt;code&gt;/mcp/grok-search-v1&lt;/code&gt;. Its details showed only &lt;code&gt;webaz_search&lt;/code&gt;. In a fresh conversation, Grok used that connector and returned five tissue listings for Singapore; the visible tool result also reported five matching products. The English answer flagged missing shipping costs and unclear variants.&lt;/p&gt;

&lt;p&gt;A separate Chinese-language test returned no matches for the query &lt;code&gt;挂式抽纸&lt;/code&gt;. In another fresh conversation, Chinese instructions specifying the English search phrase &lt;code&gt;wall-hanging facial tissues&lt;/code&gt; returned five listings. This suggests a keyword/language matching limitation in this example, not proof that products cannot ship to Singapore. The Chinese answer flagged missing freight but placed title pack counts beside starting prices without adequately explaining variant uncertainty. &lt;strong&gt;Do not treat that pairing as a verified SKU price.&lt;/strong&gt; Check the selected option and delivered total on the listing.&lt;/p&gt;

&lt;p&gt;These are individual setup/search observations, not a reliability benchmark, a brand-new Grok-account onboarding test, or a purchase. We did not request a quote, create an order, or pay. Prices and availability can change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.x.ai/grok/connectors" rel="noopener noreferrer"&gt;xAI Grok Connectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.x.ai/grok/connector-management" rel="noopener noreferrer"&gt;xAI Business / Enterprise Connector Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webaz.xyz/docs/REMOTE-MCP.md" rel="noopener noreferrer"&gt;WebAZ Remote MCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Before You Connect an AI Shopping Tool, Ask These Seven Questions</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Tue, 25 Aug 2026 15:15:15 +0000</pubDate>
      <link>https://dev.to/seasonkoh/before-you-connect-an-ai-shopping-tool-ask-these-seven-questions-5gil</link>
      <guid>https://dev.to/seasonkoh/before-you-connect-an-ai-shopping-tool-ask-these-seven-questions-5gil</guid>
      <description>&lt;p&gt;Installing an AI connector is easy. Deciding whether it deserves authority is harder.&lt;/p&gt;

&lt;p&gt;The usual installation guide answers technical questions: Which URL do I enter? Which package do I run? Which client is supported?&lt;/p&gt;

&lt;p&gt;A useful trust guide should answer a different set of questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What can the AI access before I sign in?&lt;/li&gt;
&lt;li&gt;Which actions can change real state?&lt;/li&gt;
&lt;li&gt;Which actions still require a person?&lt;/li&gt;
&lt;li&gt;What happens to payment?&lt;/li&gt;
&lt;li&gt;What evidence survives after the tool acts?&lt;/li&gt;
&lt;li&gt;Which safety claims can be independently checked?&lt;/li&gt;
&lt;li&gt;What is still unknown or unfinished?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I am using WebAZ as the concrete example below, but the checklist applies to any MCP server or AI-commerce connector.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Can I test useful behavior without creating an account?
&lt;/h2&gt;

&lt;p&gt;A connector should not demand maximum trust before demonstrating minimum usefulness.&lt;/p&gt;

&lt;p&gt;WebAZ exposes a discovery-only shopping MCP endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://webaz.xyz/mcp/shopping-v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can search the reviewed public product surface. It cannot create an order, reserve stock, charge a payment method, move funds, accept terms, or read private account data.&lt;/p&gt;

&lt;p&gt;That makes the first evaluation reversible: connect, inspect product data, and decide whether the result is useful before registering.&lt;/p&gt;

&lt;p&gt;The broader Remote MCP endpoint is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://webaz.xyz/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For MCP clients that use local STDIO configuration, the current public bridge is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; @seasonkoh/webaz@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The package is a thin bridge to the live service. It is not a local copy of the private WebAZ production core.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Does the interface separate reading from acting?
&lt;/h2&gt;

&lt;p&gt;“The AI has tools” is not a permission model.&lt;/p&gt;

&lt;p&gt;A safer surface distinguishes at least four levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read public facts;&lt;/li&gt;
&lt;li&gt;prepare a reversible draft;&lt;/li&gt;
&lt;li&gt;request a consequential action;&lt;/li&gt;
&lt;li&gt;commit or settle with accountable authorization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On WebAZ, anonymous access is for public reads. Authenticated capabilities depend on the selected surface and granted authorization. Selected higher-risk actions return a browser approval URL rather than silently treating the model's request as the person's consent.&lt;/p&gt;

&lt;p&gt;This distinction matters more than a generic instruction such as “please ask before buying.” Capability boundaries should exist in the interface, not only in the prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why does registration use an invitation and Passkey?
&lt;/h2&gt;

&lt;p&gt;Browsing does not require an invitation. Account creation currently does.&lt;/p&gt;

&lt;p&gt;WebAZ uses invitations as an anti-abuse and Sybil-resistance control while the live network is actively developed. It is an account-integrity control, not a launch-status label or an investment-style scarcity mechanism.&lt;/p&gt;

&lt;p&gt;A Passkey binds the account to an accountable human and is retained as a confirmation boundary for selected consequential actions. It does not make every transaction safe, and it does not verify that a seller's off-platform payment instructions are correct. It establishes who approved an action; it does not replace due diligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Where does the money go?
&lt;/h2&gt;

&lt;p&gt;The word “payment” is too broad to describe custody.&lt;/p&gt;

&lt;p&gt;WebAZ currently has two real rails with different models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direct Pay&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The buyer pays the seller directly off-platform. WebAZ records the payment-information snapshot, acknowledgements, order state, and evidence. WebAZ does not hold the principal, verify the payee or payment method, guarantee payment or delivery, or issue the seller's refund.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;USDC on-chain escrow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eligible orders can lock real USDC in an immutable contract on Base mainnet. Contract exits are limited to the original buyer, the voucher-bound seller, or the configured fee destination, and per-order caps are enforced on-chain.&lt;/p&gt;

&lt;p&gt;The contract has not had a third-party security audit. That limitation belongs in the main explanation, not in fine print.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What remains after the AI acts?
&lt;/h2&gt;

&lt;p&gt;An agent response is not a transaction record.&lt;/p&gt;

&lt;p&gt;For a real workflow, the system should preserve the product and payment information that was accepted, the order state, relevant acknowledgements, evidence, and the transition that occurred. Without that trail, a convincing conversation can still leave the buyer and seller unable to explain what happened.&lt;/p&gt;

&lt;p&gt;WebAZ is designed around explicit order states and evidence rather than treating the chat transcript as the source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Can the current claims be checked without trusting a social post?
&lt;/h2&gt;

&lt;p&gt;The strongest source should be current and machine-readable.&lt;/p&gt;

&lt;p&gt;WebAZ publishes its live protocol facts here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://webaz.xyz/.well-known/webaz-protocol.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The document reports the current software version, MCP endpoints, authentication model, network phase, payment disclosures, and links to additional capability and integration documents.&lt;/p&gt;

&lt;p&gt;The official npm registry currently reports &lt;code&gt;@seasonkoh/webaz&lt;/code&gt; version &lt;code&gt;0.1.36&lt;/code&gt;. Search snippets may lag behind registry changes, so the registry and the live protocol document are better version sources than an old directory page.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. What should still make me cautious?
&lt;/h2&gt;

&lt;p&gt;Trustworthy documentation should make refusal possible.&lt;/p&gt;

&lt;p&gt;For WebAZ, the important limits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;registration remains invite-gated;&lt;/li&gt;
&lt;li&gt;additional payment methods are still being added;&lt;/li&gt;
&lt;li&gt;Direct Pay occurs off-platform and the payee or method is not verified by WebAZ;&lt;/li&gt;
&lt;li&gt;WebAZ does not guarantee payment, delivery, or seller refunds;&lt;/li&gt;
&lt;li&gt;the USDC contract is live but has not had a third-party security audit;&lt;/li&gt;
&lt;li&gt;the public npm package is a bridge, not public access to the private production core;&lt;/li&gt;
&lt;li&gt;a manual MCP connection is not the same as an official app-directory listing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those statements do not weaken the trust story. They are the trust story.&lt;/p&gt;

&lt;h2&gt;
  
  
  A low-risk first test
&lt;/h2&gt;

&lt;p&gt;Start with public discovery and ask the AI to separate facts from unknowns:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Search WebAZ for products relevant to my request. Show price, stock, delivery, returns, seller context, and every warning or missing field. Do not create an order or assume compatibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Use the Agent Commerce Lab for current client setup:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webaz.xyz/ai/" rel="noopener noreferrer"&gt;https://webaz.xyz/ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first question is not whether an AI can click “buy.”&lt;/p&gt;

&lt;p&gt;It is whether the system makes authority, evidence, custody, and uncertainty visible before anyone does.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Current-status boundary, verified 2026-08-25:&lt;/strong&gt; WebAZ is publicly launched and actively developed. Direct Pay and eligible Base-mainnet USDC escrow are real payment rails with different custody models. WebAZ does not hold the principal on Direct Pay and does not verify the payee or payment method. The USDC contract has not had a third-party security audit. Public shopping discovery does not create orders or move funds.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>The Second Click Is the Real Test of an AI Shopping Plugin</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Tue, 25 Aug 2026 02:34:31 +0000</pubDate>
      <link>https://dev.to/seasonkoh/the-second-click-is-the-real-test-of-an-ai-shopping-plugin-7d</link>
      <guid>https://dev.to/seasonkoh/the-second-click-is-the-real-test-of-an-ai-shopping-plugin-7d</guid>
      <description>&lt;p&gt;The first successful search is the easiest part of an AI shopping demo.&lt;/p&gt;

&lt;p&gt;A user asks for a product, the model calls a tool, and a polished result card appears. That proves the happy path can work once. It does not yet prove that the integration can survive ordinary use.&lt;/p&gt;

&lt;p&gt;The more revealing test is the second click.&lt;/p&gt;

&lt;p&gt;Can the shopper open the same product again? Can they move between products without an earlier interaction suppressing the next one? What happens when a direct tool response and a matching result notification arrive in different orders? Does the detail view stay in the shopper's language?&lt;/p&gt;

&lt;p&gt;Those questions shaped the latest WebAZ Shopping review build.&lt;/p&gt;

&lt;h2&gt;
  
  
  One interaction, one settlement
&lt;/h2&gt;

&lt;p&gt;Interactive tool surfaces often receive the same logical result through more than one path. A direct response may arrive first, or a matching tool-result notification may arrive first.&lt;/p&gt;

&lt;p&gt;If each path has its own timeout and success logic, the UI can briefly show a failure even though a valid result has already arrived. It can also render the same outcome twice or leave an interaction in an ambiguous state.&lt;/p&gt;

&lt;p&gt;The safer model is to give each detail request one lifecycle and one deadline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;both valid arrival orders converge on the same settlement path;&lt;/li&gt;
&lt;li&gt;duplicate suppression means "still pending," not success or failure;&lt;/li&gt;
&lt;li&gt;the first matching success settles the interaction once;&lt;/li&gt;
&lt;li&gt;a timeout remains an honest failure when no matching success arrives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This sounds small, but it is the difference between a demo animation and a state machine that a user can rely on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repetition is part of the contract
&lt;/h2&gt;

&lt;p&gt;A product-detail action is not globally unique. A shopper may inspect a product, compare another one, and return to the first. Deduplication that outlives one interaction turns a valid second click into a silent no-op.&lt;/p&gt;

&lt;p&gt;The scope of deduplication therefore has to match the scope of the user action. Replays inside one interaction should be suppressed. A later, deliberate interaction should be allowed to run normally.&lt;/p&gt;

&lt;p&gt;This principle applies beyond shopping. Idempotency protects a system from accidental replay, but it should not erase a new user intention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Localization has to survive the tool boundary
&lt;/h2&gt;

&lt;p&gt;A multilingual conversation can still produce a detail view in the wrong language if locale context is lost between search results, tool metadata, and the rendered component.&lt;/p&gt;

&lt;p&gt;Keeping product details in the shopper's locale is more than a presentation preference. Shipping terms, return conditions, stock notes, and unknown fields are decision-relevant information. A language fallback can change whether the user understands the limits of the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the first public surface narrow
&lt;/h2&gt;

&lt;p&gt;The reviewed WebAZ Shopping endpoint is intentionally discovery-only. It exposes one public &lt;code&gt;webaz_search&lt;/code&gt; tool for product search and comparison.&lt;/p&gt;

&lt;p&gt;It does not provide login, account access, ordering, payment, credentials, or private data.&lt;/p&gt;

&lt;p&gt;That boundary lets us test the read-only experience before attaching consequential actions. A shopping integration should first demonstrate that it can return repeatable, localized, decision-ready information. Preparation, commitment, and settlement can then be added behind their own explicit authority boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this build proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;The current review build demonstrates a more reliable product-discovery interaction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeated detail clicks work as new interactions;&lt;/li&gt;
&lt;li&gt;asynchronous result paths converge on one outcome;&lt;/li&gt;
&lt;li&gt;timeouts remain explicit;&lt;/li&gt;
&lt;li&gt;product details preserve shopper locale;&lt;/li&gt;
&lt;li&gt;the public tool surface remains discovery-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not mean that a new ChatGPT plugin version has been approved or published. The build and demo are prepared for the review process; approval and publication are separate steps.&lt;/p&gt;

&lt;p&gt;You can watch the current 55-second production demo here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webaz.xyz/plugin-review/webaz-shopping-demo.mp4" rel="noopener noreferrer"&gt;https://webaz.xyz/plugin-review/webaz-shopping-demo.mp4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For teams building AI commerce interfaces, the practical question is simple: after the first impressive result, what does your second click reveal about the system?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>product</category>
      <category>software</category>
    </item>
    <item>
      <title>One Commerce Protocol, Two Interfaces: PWA for Humans and MCP for Agents</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Mon, 24 Aug 2026 01:21:22 +0000</pubDate>
      <link>https://dev.to/seasonkoh/one-commerce-protocol-two-interfaces-pwa-for-humans-and-mcp-for-agents-4fme</link>
      <guid>https://dev.to/seasonkoh/one-commerce-protocol-two-interfaces-pwa-for-humans-and-mcp-for-agents-4fme</guid>
      <description>&lt;p&gt;When a product adds an agent interface, it is tempting to treat it as a second application: the web interface is for people, while a collection of tools is for AI.&lt;/p&gt;

&lt;p&gt;That split is convenient at the UI layer. It becomes dangerous when it reaches the transaction model.&lt;/p&gt;

&lt;p&gt;If the human interface and the agent interface use different order states, permission rules or definitions of completion, the system develops two versions of commercial reality. A person may see a pending request while an agent reports a completed action. A step that requires human confirmation in the web app may become an unreviewed shortcut in the agent API. When something fails, neither side can explain the same outcome.&lt;/p&gt;

&lt;p&gt;The safer design is two interfaces over one protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different strengths, shared state
&lt;/h2&gt;

&lt;p&gt;A PWA and an MCP server should not be identical. They serve different operators.&lt;/p&gt;

&lt;p&gt;A human interface is good at displaying terms, collecting deliberate approval, managing identity and helping a person inspect an exception. An agent interface is good at structured discovery, comparison, repetitive preparation and following explicit machine-readable contracts.&lt;/p&gt;

&lt;p&gt;The interfaces can divide work without dividing truth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human PWA                         Agent MCP
---------                         ---------
inspect terms                     read structured facts
manage identity                   search and compare
review a proposed action          prepare a request
perform Passkey approval          receive the resulting state
inspect exceptions                continue from explicit outcomes
              \                 /
               one state machine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important property is not visual consistency. It is behavioral consistency. Both interfaces should agree on the entity being acted on, the current state, the allowed transition and the evidence produced by that transition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissions should describe actions
&lt;/h2&gt;

&lt;p&gt;Possession of a credential should not silently mean permission to perform every write.&lt;/p&gt;

&lt;p&gt;WebAZ publishes a capability matrix in which authenticated agent writes map to named action scopes. Undeclared writes are denied by default. This makes authorization part of the integration contract instead of an assumption hidden in client code.&lt;/p&gt;

&lt;p&gt;Conceptually, an agent declaration can say:&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;"allowed_actions"&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;"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;"place_order"&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 exact set is less important than the principle: permission should name the action and its boundary. A search capability does not imply permission to place an order. Permission to prepare an order does not imply permission to approve an irreversible step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation is not consent
&lt;/h2&gt;

&lt;p&gt;Agent workflows become easier to reason about when actions are separated by reversibility:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read:&lt;/strong&gt; inspect public or party-authorized state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepare:&lt;/strong&gt; search, compare, quote or assemble a request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit:&lt;/strong&gt; create a commercial obligation or change accountable state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settle:&lt;/strong&gt; move value or finalize an irreversible outcome.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An agent can be very useful at the first two levels. Moving from preparation to commitment should require a visible rule, not a vague instruction such as "buy the best one."&lt;/p&gt;

&lt;p&gt;In WebAZ, risk actions return an approval URL. The human completes the required Passkey ceremony in a browser surface. The agent can prepare the action and continue after the protocol reports the result, but it does not impersonate the person during the approval.&lt;/p&gt;

&lt;p&gt;Some actions are covered by an iron rule: no declared scope overrides the requirement for live human presence. This is a protocol property, not a preference left to each agent client.&lt;/p&gt;

&lt;h2&gt;
  
  
  A discovery-only surface is still useful
&lt;/h2&gt;

&lt;p&gt;Not every MCP endpoint needs a path to checkout.&lt;/p&gt;

&lt;p&gt;WebAZ's reviewed &lt;code&gt;shopping-v1&lt;/code&gt; surface is deliberately discovery-only. It exposes one search tool for reviewed active listings and cannot create orders or move funds. That smaller surface lets buyers and builders evaluate whether an agent can represent product facts and unknowns honestly before introducing consequential actions.&lt;/p&gt;

&lt;p&gt;This is a useful deployment pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start with a narrow read surface;&lt;/li&gt;
&lt;li&gt;evaluate outputs against the human-visible record;&lt;/li&gt;
&lt;li&gt;add preparation actions with explicit states;&lt;/li&gt;
&lt;li&gt;add commitment only when identity, permission and recovery are defined;&lt;/li&gt;
&lt;li&gt;keep human-presence requirements outside the agent's ability to bypass.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  An integration checklist
&lt;/h2&gt;

&lt;p&gt;Before adding an agent interface to a commerce system, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do the web app and the agent read the same product and order identifiers?&lt;/li&gt;
&lt;li&gt;Can both interfaces name the same current state?&lt;/li&gt;
&lt;li&gt;Is each agent write mapped to an explicit scope?&lt;/li&gt;
&lt;li&gt;Are undeclared writes rejected?&lt;/li&gt;
&lt;li&gt;Are preparation and commitment separate transitions?&lt;/li&gt;
&lt;li&gt;Does human approval happen on a surface the person can inspect?&lt;/li&gt;
&lt;li&gt;Can an agent resume from the confirmed result instead of guessing whether an action succeeded?&lt;/li&gt;
&lt;li&gt;Can both interfaces produce the same audit trail when an operation fails?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answers differ by interface, the problem is not just API design. It is a split transaction model.&lt;/p&gt;

&lt;h2&gt;
  
  
  One protocol is the product
&lt;/h2&gt;

&lt;p&gt;Agent-native commerce should not mean maintaining an AI shortcut beside the real system. It should mean exposing the real system through another interface while preserving the rules that make its outcomes understandable.&lt;/p&gt;

&lt;p&gt;WebAZ publishes the current integration contract, capability matrix and negative-space rules as machine-readable documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://webaz.xyz/.well-known/webaz-integration.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-integration.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webaz.xyz/.well-known/webaz-capabilities.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-capabilities.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webaz.xyz/.well-known/webaz-negative-space.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-negative-space.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PWA and MCP do different jobs. The protocol remains one.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Most Important Output of a Shopping Agent May Be `unknown`</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Sun, 23 Aug 2026 06:58:46 +0000</pubDate>
      <link>https://dev.to/seasonkoh/the-most-important-output-of-a-shopping-agent-may-be-unknown-56me</link>
      <guid>https://dev.to/seasonkoh/the-most-important-output-of-a-shopping-agent-may-be-unknown-56me</guid>
      <description>&lt;p&gt;A shopping agent that always returns a complete answer is not necessarily useful. In commerce, completeness can be a warning sign.&lt;/p&gt;

&lt;p&gt;Product pages are uneven. A listing may state price, stock, return terms, handling time and a delivery estimate while omitting exact dimensions, compatibility, maximum load or included accessories. A human buyer usually notices the gap and asks a follow-up question. A language model may instead complete the pattern from similar products and present the inferred value with the same confidence as a seller-declared fact.&lt;/p&gt;

&lt;p&gt;The difficult part of AI commerce is therefore not only retrieval. It is preserving provenance and uncertainty through the entire decision process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three classes of product facts
&lt;/h2&gt;

&lt;p&gt;An agent-facing product record should distinguish at least three classes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Declared facts&lt;/strong&gt;: values supplied by the seller or another accountable source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Derived facts&lt;/strong&gt;: values calculated from declared inputs through a visible rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unknown facts&lt;/strong&gt;: values that are absent, ambiguous, stale or unsupported.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These classes should not collapse into one polished description. A field that is absent should remain absent. A derived estimate should identify its inputs. A seller statement should not silently become a platform guarantee.&lt;/p&gt;

&lt;p&gt;An illustrative response shape could look like this:&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;"item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Metal Laptop Cooling Stand"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"declared"&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;"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;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.4&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;"USDC"&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"&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;"return_window_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"handling_time_hours"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"delivery_estimate_days"&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;"SG"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&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;"decision_flags"&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;"new_seller"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"no_sales_history"&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;"unknown"&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;"exact_dimensions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"supported_laptop_size_range"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"maximum_load"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"included_parts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"material_thickness"&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;"checked_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-23"&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;This is an explanatory shape rather than a claim that every commerce platform uses the same schema. The useful property is the separation itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a string like &lt;code&gt;unknown&lt;/code&gt; is not enough
&lt;/h2&gt;

&lt;p&gt;Production systems usually need more than a null value. The reason a field is unknown affects what the agent should do next.&lt;/p&gt;

&lt;p&gt;For example:&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;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maximum_load"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_declared_by_seller"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ask_seller"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blocks"&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;"compatibility_recommendation"&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;Other reasons might include &lt;code&gt;stale_value&lt;/code&gt;, &lt;code&gt;conflicting_sources&lt;/code&gt;, &lt;code&gt;not_applicable&lt;/code&gt;, or &lt;code&gt;outside_sale_region&lt;/code&gt;. These states lead to different behavior. A stale price may require refresh. Conflicting dimensions may require evidence review. An undeclared compatibility claim should block a recommendation rather than invite a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision flags are not verdicts
&lt;/h2&gt;

&lt;p&gt;Risk indicators need the same care. A new seller or a seller with no sales history is not automatically untrustworthy. Those are decision flags: facts a buyer may want to weigh, not accusations generated by the platform.&lt;/p&gt;

&lt;p&gt;The agent should surface the flag, explain its source and allow the buyer to choose. It should not convert a sparse history into a fabricated reputation score.&lt;/p&gt;

&lt;h2&gt;
  
  
  A public test surface
&lt;/h2&gt;

&lt;p&gt;WebAZ currently exposes a reviewed, discovery-only shopping surface at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://webaz.xyz/mcp/shopping-v1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The surface exposes one search tool and cannot create orders or move funds. The WebAZ Agent Commerce Lab includes a known-versus-unknown prompt using the real reviewed laptop-stand listing described above.&lt;/p&gt;

&lt;p&gt;The prompt asks the agent to produce two lists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;facts the listing actually states, with values;&lt;/li&gt;
&lt;li&gt;facts a careful buyer would want but the listing does not state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the second list, the agent must say &lt;code&gt;unknown&lt;/code&gt; and must not fill gaps with typical values for similar products.&lt;/p&gt;

&lt;p&gt;That constraint matters because it makes the failure visible. If an agent invents a screen-size range or maximum load, the output can be compared against the public listing and rejected.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical evaluation checklist
&lt;/h2&gt;

&lt;p&gt;When evaluating a shopping agent, test more than whether it found the product.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does every price include a currency and a freshness signal?&lt;/li&gt;
&lt;li&gt;Does availability come from the current sellable variant rather than marketing text?&lt;/li&gt;
&lt;li&gt;Are handling time and delivery time kept separate?&lt;/li&gt;
&lt;li&gt;Are return terms represented as conditions rather than a vague "easy returns" claim?&lt;/li&gt;
&lt;li&gt;Can the agent list important missing fields without guessing?&lt;/li&gt;
&lt;li&gt;Does it distinguish seller statements from platform verification?&lt;/li&gt;
&lt;li&gt;Are decision flags shown as evidence for human judgment rather than automated verdicts?&lt;/li&gt;
&lt;li&gt;Does the workflow stop before an unsupported or irreversible action?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This evaluation is useful even before a store supports agent checkout. It reveals product-data gaps that affect human buyers too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest incompleteness is a capability
&lt;/h2&gt;

&lt;p&gt;AI commerce is often presented as a race toward fewer questions and faster checkout. That framing rewards confident completion, even when the underlying product record is incomplete.&lt;/p&gt;

&lt;p&gt;A safer goal is decision readiness. The agent should collect what is known, preserve where it came from, expose what remains unknown and identify the next responsible action. Sometimes that action is comparison. Sometimes it is asking the seller. Sometimes it is stopping.&lt;/p&gt;

&lt;p&gt;You can run the known-versus-unknown test on the discovery-only WebAZ Agent Commerce Lab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webaz.xyz/ai/" rel="noopener noreferrer"&gt;https://webaz.xyz/ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ask it to separate seller-stated facts from missing details. The quality of the &lt;code&gt;unknown&lt;/code&gt; list may tell you more than the recommendation.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
