<?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: Tahmid Bin Taslim Rafi</title>
    <description>The latest articles on DEV Community by Tahmid Bin Taslim Rafi (@tahmidbintaslim).</description>
    <link>https://dev.to/tahmidbintaslim</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F299889%2F213275ad-7255-49a2-984f-8be9841e51f4.jpg</url>
      <title>DEV Community: Tahmid Bin Taslim Rafi</title>
      <link>https://dev.to/tahmidbintaslim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tahmidbintaslim"/>
    <language>en</language>
    <item>
      <title>AI Era for Shopify merchants</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:17:58 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/ai-era-for-shopify-merchants-bk5</link>
      <guid>https://dev.to/tahmidbintaslim/ai-era-for-shopify-merchants-bk5</guid>
      <description>&lt;p&gt;If you run a Shopify store, you are entering a new phase of e-commerce where &lt;strong&gt;"SEO" (Search Engine Optimization)&lt;/strong&gt; is being overtaken by &lt;strong&gt;"AEO" (AI Engine Optimization)&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Millions of shoppers are now using AI assistants to find products, but the journey usually breaks at the most critical moment: &lt;strong&gt;checkout or transaction.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" alt="Checkout Tractions" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP (Universal Commerce Protocol)&lt;/strong&gt; is the fix. It’s a new on-ramp that lets AI “shopping agents” discover your products, ask the right questions (variants, shipping, returns), and move a buyer from &lt;strong&gt;intent → checkout → order&lt;/strong&gt; with fewer clicks and less drop-off.&lt;/p&gt;

&lt;p&gt;Crucially, this isn't just some random tech. UCP is an open standard powered by &lt;strong&gt;Google&lt;/strong&gt; and co-developed with e-commerce giants like &lt;strong&gt;Shopify&lt;/strong&gt;. It defines the common language for that end-to-end flow across platforms, merchants, payment providers, and credential providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the f*** is UCP actually?
&lt;/h2&gt;

&lt;p&gt;Technically, UCP is a standard. Commercially, it is the &lt;strong&gt;universal translator&lt;/strong&gt; between your Shopify store and the AI world. It handles three critical things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Handshake (Discovery):&lt;/strong&gt; Your store tells the AI, "I am open for business, and here is exactly what I can do." This ensures the AI knows you are a trusted merchant, not just another random website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Actions (Capabilities):&lt;/strong&gt; These are the "verbs" of commerce. Instead of just reading text, the AI can trigger real business logic: &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Check Inventory&lt;/strong&gt;, &lt;strong&gt;Apply Discount&lt;/strong&gt;, or &lt;strong&gt;Link Identity&lt;/strong&gt;. It turns a conversation into a transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Connection (Bindings):&lt;/strong&gt; Whether the customer is on WhatsApp, a Google Search AI result, or a voice assistant, UCP ensures the transaction works the same way. It maps these commercial actions 1:1 to modern tools (like MCP) so you can build once and sell everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" alt="A Demo from Shopify Settings showing AI Agents using UCP" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For the technical folks (The Specs):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery &amp;amp; negotiation&lt;/strong&gt;: Agents and merchants “handshake” on what each supports (versions + capabilities).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities&lt;/strong&gt; (think: verbs): e.g., &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Order Management&lt;/strong&gt;, &lt;strong&gt;Identity Linking&lt;/strong&gt;, plus extensions (discounts, fulfillment, consent, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bindings / transports&lt;/strong&gt;: The same capability can be invoked over &lt;strong&gt;HTTP/REST&lt;/strong&gt;, &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; tools, or &lt;strong&gt;A2A&lt;/strong&gt;—UCP maps capabilities 1:1 to MCP tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick mental model:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" alt="Flow Chat showing UCP" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How this boosts revenue (conversion + AOV) for Shopify merchants
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1) You become “agent-ready” where shoppers already are
&lt;/h3&gt;

&lt;p&gt;Google is explicitly positioning UCP as a path to turn AI interactions into purchases across its AI surfaces (e.g., Gemini / AI Mode), starting with direct buying.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; capture incremental demand from high-intent shoppers who never reach a traditional PDP/cart flow.&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Lower friction checkout = fewer abandoned carts
&lt;/h3&gt;

&lt;p&gt;UCP’s checkout primitives let an agent complete the purchase with &lt;strong&gt;status-driven steps&lt;/strong&gt; (create → update → complete), and optionally escalate to a trusted embedded checkout UI when needed.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; fewer “form fatigue” drop-offs, especially on mobile and cross-border.&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Higher AOV via “agent-native” upsell logic (without being spammy)
&lt;/h3&gt;

&lt;p&gt;Once agents can reliably identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buyer intent (“I need a crewneck sweater, sustainable, ships to US”),&lt;/li&gt;
&lt;li&gt;variant constraints,&lt;/li&gt;
&lt;li&gt;shipping/returns requirements,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you can shape what the agent recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bundles&lt;/strong&gt; (“sweater + care kit”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threshold incentives&lt;/strong&gt; (“free shipping over $X”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart add-ons&lt;/strong&gt; (size/compatibility safe cross-sell)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bounded offers&lt;/strong&gt; surfaced at decision time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP supports extensions (e.g., discount/fulfillment extending checkout) in the protocol itself.&lt;/p&gt;


&lt;h2&gt;
  
  
  Now I want this, how?
&lt;/h2&gt;

&lt;p&gt;There are &lt;strong&gt;two practical paths&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Path A — Merchant checklist (no-code / low-code)
&lt;/h3&gt;

&lt;p&gt;This is how most Shopify merchants should start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make product data agent-friendly&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Clean titles, consistent variants, accurate inventory&lt;/li&gt;
&lt;li&gt;Strong shipping/returns policies&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rich attributes (materials, sizing, compatibility) so agents can filter accurately&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable fast, reliable checkout behaviors&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure checkout works smoothly end-to-end (especially shipping rates + payment methods).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep discount rules predictable (agents don’t handle weird edge cases well).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you want Google AI surfaces&lt;/strong&gt;: follow Google’s UCP onboarding guidance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google’s guide positions UCP as “turn AI interactions into instant sales” and provides an implementation/onboarding path (including business profile + capability negotiation).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Path B — Build (or hire someone to build) an agent that sells via Shopify’s UCP-compliant tools
&lt;/h3&gt;

&lt;p&gt;Shopify provides &lt;strong&gt;MCP servers that are UCP-compliant&lt;/strong&gt;, covering discovery, checkout, and orders.&lt;br&gt;
This is the fastest “developer path” to a working demo that can later become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an on-site AI concierge,&lt;/li&gt;
&lt;li&gt;a WhatsApp/LINE assistant,&lt;/li&gt;
&lt;li&gt;a support + reorder agent,&lt;/li&gt;
&lt;li&gt;a partner integration.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  An Example Step-by-step: build a simple “Shopify UCP” shopping agent (Node.js)
&lt;/h2&gt;

&lt;p&gt;Below is a minimal, beginner-friendly walkthrough using the same primitives Shopify documents:&lt;br&gt;
&lt;strong&gt;Authenticate → Search catalog → Create checkout → (Update) → Complete&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  0) Pre-requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js installed on your pc&lt;/li&gt;
&lt;li&gt;Access to Shopify Dev Dashboard (to generate credentials / tokens for agent APIs)&lt;/li&gt;
&lt;li&gt;VsCode or any IDE&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  1) Get a bearer token (JWT) for Shopify agent APIs
&lt;/h3&gt;

&lt;p&gt;Shopify’s agent docs: you generate a &lt;strong&gt;global access token&lt;/strong&gt; that authenticates your agent with Catalog + Checkout MCP servers.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; in your local VsCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_jwt_token_here
&lt;span class="nv"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_catalog_id_here

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Do &lt;strong&gt;not&lt;/strong&gt; commit &lt;code&gt;.env&lt;/code&gt;. Use .gitignore file to exclude &lt;code&gt;.env&lt;/code&gt;.)&lt;/p&gt;




&lt;h3&gt;
  
  
  2) Search products (Catalog MCP → &lt;code&gt;search_global_products&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;search-catalog.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://discover.shopifyapps.com/global/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search_global_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;saved_catalog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I need a crewneck sweater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer looking for sustainable fashion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;ships_to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;limit&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="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Shopify’s example parses the returned text payload as JSON.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is directly aligned with Shopify’s “search catalog” tutorial structure and parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’re looking for in results:&lt;/strong&gt; a &lt;strong&gt;product variant ID&lt;/strong&gt; (you’ll pass it to checkout) and the &lt;strong&gt;shop domain&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3) Create a checkout session (Shop’s MCP endpoint → &lt;code&gt;create_checkout&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Once you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopDomain&lt;/code&gt; (example: &lt;code&gt;your-store.myshopify.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;variantId&lt;/code&gt; (a &lt;code&gt;gid://shopify/ProductVariant/...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;code&gt;checkout.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shopDomain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_SHOP_DOMAIN.myshopify.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gid://shopify/ProductVariant/1234567890&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shopDomain&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/ucp/mcp`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create_checkout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;_meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;ucp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="c1"&gt;// Platform profile is required by UCP MCP binding for negotiation/versioning.&lt;/span&gt;
              &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://agent.example/profiles/shopping-agent.json&lt;/span&gt;&lt;span class="dl"&gt;'&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="na"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;idempotency_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="na"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This follows Shopify’s “complete checkout” tutorial and UCP’s MCP requirement that &lt;code&gt;_meta.ucp.profile&lt;/code&gt; is included for every tool invocation.&lt;/p&gt;




&lt;h3&gt;
  
  
  4) Update + complete checkout (status-driven)
&lt;/h3&gt;

&lt;p&gt;Shopify describes the flow as: create → update until ready → complete when status becomes &lt;code&gt;ready_for_complete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two important gotchas from Shopify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checkout updates replace the whole checkout state&lt;/strong&gt;—if you omit fields, they’re removed.&lt;/li&gt;
&lt;li&gt;Sometimes the checkout returns &lt;code&gt;requires_escalation&lt;/code&gt; and provides a &lt;code&gt;continue_url&lt;/code&gt; (meaning: hand off to embedded/trusted UI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice your agent loop looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;create_checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === incomplete&lt;/code&gt; → &lt;code&gt;update_checkout&lt;/code&gt; with missing info&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === requires_escalation&lt;/code&gt; → open the &lt;code&gt;continue_url&lt;/code&gt; in embedded checkout UI&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === ready_for_complete&lt;/code&gt; → &lt;code&gt;complete_checkout&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Shopify’s tutorial includes example payloads for &lt;code&gt;complete_checkout&lt;/code&gt; and the intermediate update steps.)&lt;/p&gt;





&lt;blockquote&gt;
&lt;p&gt;Shopify is building the foundation for agentic commerce.&lt;br&gt;&lt;br&gt;Universal Commerce Protocol, which we co-developed with Google, is now live. UCP will make it faster for agents and retailers to integrate.&lt;br&gt;&lt;br&gt;It’s open by default, so platforms and agents can use UCP to start transacting… &lt;a href="https://t.co/Gs0vzvfjra" rel="noopener noreferrer"&gt;pic.twitter.com/Gs0vzvfjra&lt;/a&gt;&lt;/p&gt;— tobi lutke (&lt;a class="mentioned-user" href="https://dev.to/tobi"&gt;@tobi&lt;/a&gt;) &lt;a href="https://twitter.com/tobi/status/2010372642843599064?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;January 11, 2026&lt;/a&gt;
&lt;/blockquote&gt; 


&lt;h2&gt;
  
  
  What Shopify merchants should do &lt;em&gt;this week&lt;/em&gt; to adapt quickly?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audit product data like an agent would&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a bot pick the right variant from your descriptions?&lt;/li&gt;
&lt;li&gt;Are shipping/returns explicit and consistent?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Create 2–3 “AOV plays” that are easy for an agent to apply&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Free shipping over $X”&lt;/li&gt;
&lt;li&gt;“Bundle discount”&lt;/li&gt;
&lt;li&gt;“Add-on with the top 3 products”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Decide your strategy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want quick wins: build an on-site agent that uses Shopify’s UCP-compliant MCP tools.&lt;/li&gt;
&lt;li&gt;If you want distribution via Google AI surfaces: start with Google’s UCP guide and required profile/onboarding steps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Ready to make your store AI and Agent Ready?
&lt;/h2&gt;

&lt;p&gt;The shift to Agentic Commerce is technical and moves fast. While the potential for revenue is huge, implementing UCP and MCP protocols correctly requires deep technical understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't have to figure this out alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need someone to architect and build a UCP integration for your Shopify store (or any e-commerce platform), I can help you turn this new technology into a competitive advantage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌐 See what I build:&lt;/strong&gt; &lt;a href="https://tahmid.space/" rel="noopener noreferrer"&gt;tahmid.space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 Specific questions or need a consultation?&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/tahmid-bin-taslim/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>shopify</category>
      <category>chatgpt</category>
      <category>gemini</category>
    </item>
    <item>
      <title>New Era for Shopify merchants</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:16:14 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/new-era-for-shopify-merchants-kei</link>
      <guid>https://dev.to/tahmidbintaslim/new-era-for-shopify-merchants-kei</guid>
      <description>&lt;p&gt;If you run a Shopify store, you are entering a new phase of e-commerce where &lt;strong&gt;"SEO" (Search Engine Optimization)&lt;/strong&gt; is being overtaken by &lt;strong&gt;"AEO" (AI Engine Optimization)&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Millions of shoppers are now using AI assistants to find products, but the journey usually breaks at the most critical moment: &lt;strong&gt;checkout or transaction.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" alt="Checkout Tractions" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP (Universal Commerce Protocol)&lt;/strong&gt; is the fix. It’s a new on-ramp that lets AI “shopping agents” discover your products, ask the right questions (variants, shipping, returns), and move a buyer from &lt;strong&gt;intent → checkout → order&lt;/strong&gt; with fewer clicks and less drop-off.&lt;/p&gt;

&lt;p&gt;Crucially, this isn't just some random tech. UCP is an open standard powered by &lt;strong&gt;Google&lt;/strong&gt; and co-developed with e-commerce giants like &lt;strong&gt;Shopify&lt;/strong&gt;. It defines the common language for that end-to-end flow across platforms, merchants, payment providers, and credential providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the f*** is UCP actually?
&lt;/h2&gt;

&lt;p&gt;Technically, UCP is a standard. Commercially, it is the &lt;strong&gt;universal translator&lt;/strong&gt; between your Shopify store and the AI world. It handles three critical things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Handshake (Discovery):&lt;/strong&gt; Your store tells the AI, "I am open for business, and here is exactly what I can do." This ensures the AI knows you are a trusted merchant, not just another random website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Actions (Capabilities):&lt;/strong&gt; These are the "verbs" of commerce. Instead of just reading text, the AI can trigger real business logic: &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Check Inventory&lt;/strong&gt;, &lt;strong&gt;Apply Discount&lt;/strong&gt;, or &lt;strong&gt;Link Identity&lt;/strong&gt;. It turns a conversation into a transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Connection (Bindings):&lt;/strong&gt; Whether the customer is on WhatsApp, a Google Search AI result, or a voice assistant, UCP ensures the transaction works the same way. It maps these commercial actions 1:1 to modern tools (like MCP) so you can build once and sell everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" alt="A Demo from Shopify Settings showing AI Agents using UCP" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For the technical folks (The Specs):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery &amp;amp; negotiation&lt;/strong&gt;: Agents and merchants “handshake” on what each supports (versions + capabilities).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities&lt;/strong&gt; (think: verbs): e.g., &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Order Management&lt;/strong&gt;, &lt;strong&gt;Identity Linking&lt;/strong&gt;, plus extensions (discounts, fulfillment, consent, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bindings / transports&lt;/strong&gt;: The same capability can be invoked over &lt;strong&gt;HTTP/REST&lt;/strong&gt;, &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; tools, or &lt;strong&gt;A2A&lt;/strong&gt;—UCP maps capabilities 1:1 to MCP tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick mental model:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" alt="Flow Chat showing UCP" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How this boosts revenue (conversion + AOV) for Shopify merchants
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1) You become “agent-ready” where shoppers already are
&lt;/h3&gt;

&lt;p&gt;Google is explicitly positioning UCP as a path to turn AI interactions into purchases across its AI surfaces (e.g., Gemini / AI Mode), starting with direct buying.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; capture incremental demand from high-intent shoppers who never reach a traditional PDP/cart flow.&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Lower friction checkout = fewer abandoned carts
&lt;/h3&gt;

&lt;p&gt;UCP’s checkout primitives let an agent complete the purchase with &lt;strong&gt;status-driven steps&lt;/strong&gt; (create → update → complete), and optionally escalate to a trusted embedded checkout UI when needed.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; fewer “form fatigue” drop-offs, especially on mobile and cross-border.&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Higher AOV via “agent-native” upsell logic (without being spammy)
&lt;/h3&gt;

&lt;p&gt;Once agents can reliably identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buyer intent (“I need a crewneck sweater, sustainable, ships to US”),&lt;/li&gt;
&lt;li&gt;variant constraints,&lt;/li&gt;
&lt;li&gt;shipping/returns requirements,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you can shape what the agent recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bundles&lt;/strong&gt; (“sweater + care kit”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threshold incentives&lt;/strong&gt; (“free shipping over $X”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart add-ons&lt;/strong&gt; (size/compatibility safe cross-sell)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bounded offers&lt;/strong&gt; surfaced at decision time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP supports extensions (e.g., discount/fulfillment extending checkout) in the protocol itself.&lt;/p&gt;


&lt;h2&gt;
  
  
  Now I want this, how?
&lt;/h2&gt;

&lt;p&gt;There are &lt;strong&gt;two practical paths&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Path A — Merchant checklist (no-code / low-code)
&lt;/h3&gt;

&lt;p&gt;This is how most Shopify merchants should start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make product data agent-friendly&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Clean titles, consistent variants, accurate inventory&lt;/li&gt;
&lt;li&gt;Strong shipping/returns policies&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rich attributes (materials, sizing, compatibility) so agents can filter accurately&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable fast, reliable checkout behaviors&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure checkout works smoothly end-to-end (especially shipping rates + payment methods).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep discount rules predictable (agents don’t handle weird edge cases well).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you want Google AI surfaces&lt;/strong&gt;: follow Google’s UCP onboarding guidance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google’s guide positions UCP as “turn AI interactions into instant sales” and provides an implementation/onboarding path (including business profile + capability negotiation).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Path B — Build (or hire someone to build) an agent that sells via Shopify’s UCP-compliant tools
&lt;/h3&gt;

&lt;p&gt;Shopify provides &lt;strong&gt;MCP servers that are UCP-compliant&lt;/strong&gt;, covering discovery, checkout, and orders.&lt;br&gt;
This is the fastest “developer path” to a working demo that can later become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an on-site AI concierge,&lt;/li&gt;
&lt;li&gt;a WhatsApp/LINE assistant,&lt;/li&gt;
&lt;li&gt;a support + reorder agent,&lt;/li&gt;
&lt;li&gt;a partner integration.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  An Example Step-by-step: build a simple “Shopify UCP” shopping agent (Node.js)
&lt;/h2&gt;

&lt;p&gt;Below is a minimal, beginner-friendly walkthrough using the same primitives Shopify documents:&lt;br&gt;
&lt;strong&gt;Authenticate → Search catalog → Create checkout → (Update) → Complete&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  0) Pre-requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js installed on your pc&lt;/li&gt;
&lt;li&gt;Access to Shopify Dev Dashboard (to generate credentials / tokens for agent APIs)&lt;/li&gt;
&lt;li&gt;VsCode or any IDE&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  1) Get a bearer token (JWT) for Shopify agent APIs
&lt;/h3&gt;

&lt;p&gt;Shopify’s agent docs: you generate a &lt;strong&gt;global access token&lt;/strong&gt; that authenticates your agent with Catalog + Checkout MCP servers.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; in your local VsCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_jwt_token_here
&lt;span class="nv"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_catalog_id_here

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Do &lt;strong&gt;not&lt;/strong&gt; commit &lt;code&gt;.env&lt;/code&gt;. Use .gitignore file to exclude &lt;code&gt;.env&lt;/code&gt;.)&lt;/p&gt;




&lt;h3&gt;
  
  
  2) Search products (Catalog MCP → &lt;code&gt;search_global_products&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;search-catalog.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://discover.shopifyapps.com/global/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search_global_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;saved_catalog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I need a crewneck sweater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer looking for sustainable fashion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;ships_to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;limit&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="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Shopify’s example parses the returned text payload as JSON.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is directly aligned with Shopify’s “search catalog” tutorial structure and parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’re looking for in results:&lt;/strong&gt; a &lt;strong&gt;product variant ID&lt;/strong&gt; (you’ll pass it to checkout) and the &lt;strong&gt;shop domain&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3) Create a checkout session (Shop’s MCP endpoint → &lt;code&gt;create_checkout&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Once you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopDomain&lt;/code&gt; (example: &lt;code&gt;your-store.myshopify.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;variantId&lt;/code&gt; (a &lt;code&gt;gid://shopify/ProductVariant/...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;code&gt;checkout.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shopDomain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_SHOP_DOMAIN.myshopify.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gid://shopify/ProductVariant/1234567890&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shopDomain&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/ucp/mcp`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create_checkout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;_meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;ucp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="c1"&gt;// Platform profile is required by UCP MCP binding for negotiation/versioning.&lt;/span&gt;
              &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://agent.example/profiles/shopping-agent.json&lt;/span&gt;&lt;span class="dl"&gt;'&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="na"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;idempotency_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="na"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This follows Shopify’s “complete checkout” tutorial and UCP’s MCP requirement that &lt;code&gt;_meta.ucp.profile&lt;/code&gt; is included for every tool invocation.&lt;/p&gt;




&lt;h3&gt;
  
  
  4) Update + complete checkout (status-driven)
&lt;/h3&gt;

&lt;p&gt;Shopify describes the flow as: create → update until ready → complete when status becomes &lt;code&gt;ready_for_complete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two important gotchas from Shopify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checkout updates replace the whole checkout state&lt;/strong&gt;—if you omit fields, they’re removed.&lt;/li&gt;
&lt;li&gt;Sometimes the checkout returns &lt;code&gt;requires_escalation&lt;/code&gt; and provides a &lt;code&gt;continue_url&lt;/code&gt; (meaning: hand off to embedded/trusted UI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice your agent loop looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;create_checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === incomplete&lt;/code&gt; → &lt;code&gt;update_checkout&lt;/code&gt; with missing info&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === requires_escalation&lt;/code&gt; → open the &lt;code&gt;continue_url&lt;/code&gt; in embedded checkout UI&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === ready_for_complete&lt;/code&gt; → &lt;code&gt;complete_checkout&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Shopify’s tutorial includes example payloads for &lt;code&gt;complete_checkout&lt;/code&gt; and the intermediate update steps.)&lt;/p&gt;





&lt;blockquote&gt;
&lt;p&gt;Shopify is building the foundation for agentic commerce.&lt;br&gt;&lt;br&gt;Universal Commerce Protocol, which we co-developed with Google, is now live. UCP will make it faster for agents and retailers to integrate.&lt;br&gt;&lt;br&gt;It’s open by default, so platforms and agents can use UCP to start transacting… &lt;a href="https://t.co/Gs0vzvfjra" rel="noopener noreferrer"&gt;pic.twitter.com/Gs0vzvfjra&lt;/a&gt;&lt;/p&gt;— tobi lutke (&lt;a class="mentioned-user" href="https://dev.to/tobi"&gt;@tobi&lt;/a&gt;) &lt;a href="https://twitter.com/tobi/status/2010372642843599064?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;January 11, 2026&lt;/a&gt;
&lt;/blockquote&gt; 


&lt;h2&gt;
  
  
  What Shopify merchants should do &lt;em&gt;this week&lt;/em&gt; to adapt quickly?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audit product data like an agent would&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a bot pick the right variant from your descriptions?&lt;/li&gt;
&lt;li&gt;Are shipping/returns explicit and consistent?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Create 2–3 “AOV plays” that are easy for an agent to apply&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Free shipping over $X”&lt;/li&gt;
&lt;li&gt;“Bundle discount”&lt;/li&gt;
&lt;li&gt;“Add-on with the top 3 products”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Decide your strategy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want quick wins: build an on-site agent that uses Shopify’s UCP-compliant MCP tools.&lt;/li&gt;
&lt;li&gt;If you want distribution via Google AI surfaces: start with Google’s UCP guide and required profile/onboarding steps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Ready to make your store AI and Agent Ready?
&lt;/h2&gt;

&lt;p&gt;The shift to Agentic Commerce is technical and moves fast. While the potential for revenue is huge, implementing UCP and MCP protocols correctly requires deep technical understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't have to figure this out alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need someone to architect and build a UCP integration for your Shopify store (or any e-commerce platform), I can help you turn this new technology into a competitive advantage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌐 See what I build:&lt;/strong&gt; &lt;a href="https://tahmid.space/" rel="noopener noreferrer"&gt;tahmid.space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 Specific questions or need a consultation?&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/tahmid-bin-taslim/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>gemini</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Agentic Commerce for Shopify merchants</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:14:31 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/agentic-commerce-for-shopify-merchants-2pa5</link>
      <guid>https://dev.to/tahmidbintaslim/agentic-commerce-for-shopify-merchants-2pa5</guid>
      <description>&lt;p&gt;If you run a Shopify store, you are entering a new phase of e-commerce where &lt;strong&gt;"SEO" (Search Engine Optimization)&lt;/strong&gt; is being overtaken by &lt;strong&gt;"AEO" (AI Engine Optimization)&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Millions of shoppers are now using AI assistants to find products, but the journey usually breaks at the most critical moment: &lt;strong&gt;checkout or transaction.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" alt="Checkout Tractions" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP (Universal Commerce Protocol)&lt;/strong&gt; is the fix. It’s a new on-ramp that lets AI “shopping agents” discover your products, ask the right questions (variants, shipping, returns), and move a buyer from &lt;strong&gt;intent → checkout → order&lt;/strong&gt; with fewer clicks and less drop-off.&lt;/p&gt;

&lt;p&gt;Crucially, this isn't just some random tech. UCP is an open standard powered by &lt;strong&gt;Google&lt;/strong&gt; and co-developed with e-commerce giants like &lt;strong&gt;Shopify&lt;/strong&gt;. It defines the common language for that end-to-end flow across platforms, merchants, payment providers, and credential providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the f*** is UCP actually?
&lt;/h2&gt;

&lt;p&gt;Technically, UCP is a standard. Commercially, it is the &lt;strong&gt;universal translator&lt;/strong&gt; between your Shopify store and the AI world. It handles three critical things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Handshake (Discovery):&lt;/strong&gt; Your store tells the AI, "I am open for business, and here is exactly what I can do." This ensures the AI knows you are a trusted merchant, not just another random website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Actions (Capabilities):&lt;/strong&gt; These are the "verbs" of commerce. Instead of just reading text, the AI can trigger real business logic: &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Check Inventory&lt;/strong&gt;, &lt;strong&gt;Apply Discount&lt;/strong&gt;, or &lt;strong&gt;Link Identity&lt;/strong&gt;. It turns a conversation into a transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Connection (Bindings):&lt;/strong&gt; Whether the customer is on WhatsApp, a Google Search AI result, or a voice assistant, UCP ensures the transaction works the same way. It maps these commercial actions 1:1 to modern tools (like MCP) so you can build once and sell everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" alt="A Demo from Shopify Settings showing AI Agents using UCP" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For the technical folks (The Specs):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery &amp;amp; negotiation&lt;/strong&gt;: Agents and merchants “handshake” on what each supports (versions + capabilities).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities&lt;/strong&gt; (think: verbs): e.g., &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Order Management&lt;/strong&gt;, &lt;strong&gt;Identity Linking&lt;/strong&gt;, plus extensions (discounts, fulfillment, consent, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bindings / transports&lt;/strong&gt;: The same capability can be invoked over &lt;strong&gt;HTTP/REST&lt;/strong&gt;, &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; tools, or &lt;strong&gt;A2A&lt;/strong&gt;—UCP maps capabilities 1:1 to MCP tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick mental model:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" alt="Flow Chat showing UCP" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How this boosts revenue (conversion + AOV) for Shopify merchants
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1) You become “agent-ready” where shoppers already are
&lt;/h3&gt;

&lt;p&gt;Google is explicitly positioning UCP as a path to turn AI interactions into purchases across its AI surfaces (e.g., Gemini / AI Mode), starting with direct buying.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; capture incremental demand from high-intent shoppers who never reach a traditional PDP/cart flow.&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Lower friction checkout = fewer abandoned carts
&lt;/h3&gt;

&lt;p&gt;UCP’s checkout primitives let an agent complete the purchase with &lt;strong&gt;status-driven steps&lt;/strong&gt; (create → update → complete), and optionally escalate to a trusted embedded checkout UI when needed.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; fewer “form fatigue” drop-offs, especially on mobile and cross-border.&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Higher AOV via “agent-native” upsell logic (without being spammy)
&lt;/h3&gt;

&lt;p&gt;Once agents can reliably identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buyer intent (“I need a crewneck sweater, sustainable, ships to US”),&lt;/li&gt;
&lt;li&gt;variant constraints,&lt;/li&gt;
&lt;li&gt;shipping/returns requirements,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you can shape what the agent recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bundles&lt;/strong&gt; (“sweater + care kit”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threshold incentives&lt;/strong&gt; (“free shipping over $X”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart add-ons&lt;/strong&gt; (size/compatibility safe cross-sell)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bounded offers&lt;/strong&gt; surfaced at decision time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP supports extensions (e.g., discount/fulfillment extending checkout) in the protocol itself.&lt;/p&gt;


&lt;h2&gt;
  
  
  Now I want this, how?
&lt;/h2&gt;

&lt;p&gt;There are &lt;strong&gt;two practical paths&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Path A — Merchant checklist (no-code / low-code)
&lt;/h3&gt;

&lt;p&gt;This is how most Shopify merchants should start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make product data agent-friendly&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Clean titles, consistent variants, accurate inventory&lt;/li&gt;
&lt;li&gt;Strong shipping/returns policies&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rich attributes (materials, sizing, compatibility) so agents can filter accurately&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable fast, reliable checkout behaviors&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure checkout works smoothly end-to-end (especially shipping rates + payment methods).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep discount rules predictable (agents don’t handle weird edge cases well).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you want Google AI surfaces&lt;/strong&gt;: follow Google’s UCP onboarding guidance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google’s guide positions UCP as “turn AI interactions into instant sales” and provides an implementation/onboarding path (including business profile + capability negotiation).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Path B — Build (or hire someone to build) an agent that sells via Shopify’s UCP-compliant tools
&lt;/h3&gt;

&lt;p&gt;Shopify provides &lt;strong&gt;MCP servers that are UCP-compliant&lt;/strong&gt;, covering discovery, checkout, and orders.&lt;br&gt;
This is the fastest “developer path” to a working demo that can later become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an on-site AI concierge,&lt;/li&gt;
&lt;li&gt;a WhatsApp/LINE assistant,&lt;/li&gt;
&lt;li&gt;a support + reorder agent,&lt;/li&gt;
&lt;li&gt;a partner integration.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  An Example Step-by-step: build a simple “Shopify UCP” shopping agent (Node.js)
&lt;/h2&gt;

&lt;p&gt;Below is a minimal, beginner-friendly walkthrough using the same primitives Shopify documents:&lt;br&gt;
&lt;strong&gt;Authenticate → Search catalog → Create checkout → (Update) → Complete&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  0) Pre-requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js installed on your pc&lt;/li&gt;
&lt;li&gt;Access to Shopify Dev Dashboard (to generate credentials / tokens for agent APIs)&lt;/li&gt;
&lt;li&gt;VsCode or any IDE&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  1) Get a bearer token (JWT) for Shopify agent APIs
&lt;/h3&gt;

&lt;p&gt;Shopify’s agent docs: you generate a &lt;strong&gt;global access token&lt;/strong&gt; that authenticates your agent with Catalog + Checkout MCP servers.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; in your local VsCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_jwt_token_here
&lt;span class="nv"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_catalog_id_here

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Do &lt;strong&gt;not&lt;/strong&gt; commit &lt;code&gt;.env&lt;/code&gt;. Use .gitignore file to exclude &lt;code&gt;.env&lt;/code&gt;.)&lt;/p&gt;




&lt;h3&gt;
  
  
  2) Search products (Catalog MCP → &lt;code&gt;search_global_products&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;search-catalog.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://discover.shopifyapps.com/global/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search_global_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;saved_catalog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I need a crewneck sweater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer looking for sustainable fashion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;ships_to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;limit&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="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Shopify’s example parses the returned text payload as JSON.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is directly aligned with Shopify’s “search catalog” tutorial structure and parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’re looking for in results:&lt;/strong&gt; a &lt;strong&gt;product variant ID&lt;/strong&gt; (you’ll pass it to checkout) and the &lt;strong&gt;shop domain&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3) Create a checkout session (Shop’s MCP endpoint → &lt;code&gt;create_checkout&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Once you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopDomain&lt;/code&gt; (example: &lt;code&gt;your-store.myshopify.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;variantId&lt;/code&gt; (a &lt;code&gt;gid://shopify/ProductVariant/...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;code&gt;checkout.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shopDomain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_SHOP_DOMAIN.myshopify.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gid://shopify/ProductVariant/1234567890&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shopDomain&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/ucp/mcp`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create_checkout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;_meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;ucp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="c1"&gt;// Platform profile is required by UCP MCP binding for negotiation/versioning.&lt;/span&gt;
              &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://agent.example/profiles/shopping-agent.json&lt;/span&gt;&lt;span class="dl"&gt;'&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="na"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;idempotency_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="na"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This follows Shopify’s “complete checkout” tutorial and UCP’s MCP requirement that &lt;code&gt;_meta.ucp.profile&lt;/code&gt; is included for every tool invocation.&lt;/p&gt;




&lt;h3&gt;
  
  
  4) Update + complete checkout (status-driven)
&lt;/h3&gt;

&lt;p&gt;Shopify describes the flow as: create → update until ready → complete when status becomes &lt;code&gt;ready_for_complete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two important gotchas from Shopify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checkout updates replace the whole checkout state&lt;/strong&gt;—if you omit fields, they’re removed.&lt;/li&gt;
&lt;li&gt;Sometimes the checkout returns &lt;code&gt;requires_escalation&lt;/code&gt; and provides a &lt;code&gt;continue_url&lt;/code&gt; (meaning: hand off to embedded/trusted UI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice your agent loop looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;create_checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === incomplete&lt;/code&gt; → &lt;code&gt;update_checkout&lt;/code&gt; with missing info&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === requires_escalation&lt;/code&gt; → open the &lt;code&gt;continue_url&lt;/code&gt; in embedded checkout UI&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === ready_for_complete&lt;/code&gt; → &lt;code&gt;complete_checkout&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Shopify’s tutorial includes example payloads for &lt;code&gt;complete_checkout&lt;/code&gt; and the intermediate update steps.)&lt;/p&gt;





&lt;blockquote&gt;
&lt;p&gt;Shopify is building the foundation for agentic commerce.&lt;br&gt;&lt;br&gt;Universal Commerce Protocol, which we co-developed with Google, is now live. UCP will make it faster for agents and retailers to integrate.&lt;br&gt;&lt;br&gt;It’s open by default, so platforms and agents can use UCP to start transacting… &lt;a href="https://t.co/Gs0vzvfjra" rel="noopener noreferrer"&gt;pic.twitter.com/Gs0vzvfjra&lt;/a&gt;&lt;/p&gt;— tobi lutke (&lt;a class="mentioned-user" href="https://dev.to/tobi"&gt;@tobi&lt;/a&gt;) &lt;a href="https://twitter.com/tobi/status/2010372642843599064?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;January 11, 2026&lt;/a&gt;
&lt;/blockquote&gt; 


&lt;h2&gt;
  
  
  What Shopify merchants should do &lt;em&gt;this week&lt;/em&gt; to adapt quickly?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audit product data like an agent would&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a bot pick the right variant from your descriptions?&lt;/li&gt;
&lt;li&gt;Are shipping/returns explicit and consistent?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Create 2–3 “AOV plays” that are easy for an agent to apply&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Free shipping over $X”&lt;/li&gt;
&lt;li&gt;“Bundle discount”&lt;/li&gt;
&lt;li&gt;“Add-on with the top 3 products”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Decide your strategy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want quick wins: build an on-site agent that uses Shopify’s UCP-compliant MCP tools.&lt;/li&gt;
&lt;li&gt;If you want distribution via Google AI surfaces: start with Google’s UCP guide and required profile/onboarding steps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Ready to make your store AI and Agent Ready?
&lt;/h2&gt;

&lt;p&gt;The shift to Agentic Commerce is technical and moves fast. While the potential for revenue is huge, implementing UCP and MCP protocols correctly requires deep technical understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't have to figure this out alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need someone to architect and build a UCP integration for your Shopify store (or any e-commerce platform), I can help you turn this new technology into a competitive advantage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌐 See what I build:&lt;/strong&gt; &lt;a href="https://tahmid.space/" rel="noopener noreferrer"&gt;tahmid.space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 Specific questions or need a consultation?&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/tahmid-bin-taslim/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>news</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Universal Commerce Protocol (UCP) for Shopify merchants</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:11:41 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/universal-commerce-protocol-ucp-for-shopify-merchants-2e9o</link>
      <guid>https://dev.to/tahmidbintaslim/universal-commerce-protocol-ucp-for-shopify-merchants-2e9o</guid>
      <description>&lt;p&gt;If you run a Shopify store, you are entering a new phase of e-commerce where &lt;strong&gt;"SEO" (Search Engine Optimization)&lt;/strong&gt; is being overtaken by &lt;strong&gt;"AEO" (AI Engine Optimization)&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Millions of shoppers are now using AI assistants to find products, but the journey usually breaks at the most critical moment: &lt;strong&gt;checkout or transaction.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" alt="Checkout Tractions" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP (Universal Commerce Protocol)&lt;/strong&gt; is the fix. It’s a new on-ramp that lets AI “shopping agents” discover your products, ask the right questions (variants, shipping, returns), and move a buyer from &lt;strong&gt;intent → checkout → order&lt;/strong&gt; with fewer clicks and less drop-off.&lt;/p&gt;

&lt;p&gt;Crucially, this isn't just some random tech. UCP is an open standard powered by &lt;strong&gt;Google&lt;/strong&gt; and co-developed with e-commerce giants like &lt;strong&gt;Shopify&lt;/strong&gt;. It defines the common language for that end-to-end flow across platforms, merchants, payment providers, and credential providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the f*** is UCP actually?
&lt;/h2&gt;

&lt;p&gt;Technically, UCP is a standard. Commercially, it is the &lt;strong&gt;universal translator&lt;/strong&gt; between your Shopify store and the AI world. It handles three critical things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Handshake (Discovery):&lt;/strong&gt; Your store tells the AI, "I am open for business, and here is exactly what I can do." This ensures the AI knows you are a trusted merchant, not just another random website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Actions (Capabilities):&lt;/strong&gt; These are the "verbs" of commerce. Instead of just reading text, the AI can trigger real business logic: &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Check Inventory&lt;/strong&gt;, &lt;strong&gt;Apply Discount&lt;/strong&gt;, or &lt;strong&gt;Link Identity&lt;/strong&gt;. It turns a conversation into a transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Connection (Bindings):&lt;/strong&gt; Whether the customer is on WhatsApp, a Google Search AI result, or a voice assistant, UCP ensures the transaction works the same way. It maps these commercial actions 1:1 to modern tools (like MCP) so you can build once and sell everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" alt="A Demo from Shopify Settings showing AI Agents using UCP" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For the technical folks (The Specs):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery &amp;amp; negotiation&lt;/strong&gt;: Agents and merchants “handshake” on what each supports (versions + capabilities).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities&lt;/strong&gt; (think: verbs): e.g., &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Order Management&lt;/strong&gt;, &lt;strong&gt;Identity Linking&lt;/strong&gt;, plus extensions (discounts, fulfillment, consent, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bindings / transports&lt;/strong&gt;: The same capability can be invoked over &lt;strong&gt;HTTP/REST&lt;/strong&gt;, &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; tools, or &lt;strong&gt;A2A&lt;/strong&gt;—UCP maps capabilities 1:1 to MCP tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick mental model:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" alt="Flow Chat showing UCP" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How this boosts revenue (conversion + AOV) for Shopify merchants
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1) You become “agent-ready” where shoppers already are
&lt;/h3&gt;

&lt;p&gt;Google is explicitly positioning UCP as a path to turn AI interactions into purchases across its AI surfaces (e.g., Gemini / AI Mode), starting with direct buying.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; capture incremental demand from high-intent shoppers who never reach a traditional PDP/cart flow.&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Lower friction checkout = fewer abandoned carts
&lt;/h3&gt;

&lt;p&gt;UCP’s checkout primitives let an agent complete the purchase with &lt;strong&gt;status-driven steps&lt;/strong&gt; (create → update → complete), and optionally escalate to a trusted embedded checkout UI when needed.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; fewer “form fatigue” drop-offs, especially on mobile and cross-border.&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Higher AOV via “agent-native” upsell logic (without being spammy)
&lt;/h3&gt;

&lt;p&gt;Once agents can reliably identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buyer intent (“I need a crewneck sweater, sustainable, ships to US”),&lt;/li&gt;
&lt;li&gt;variant constraints,&lt;/li&gt;
&lt;li&gt;shipping/returns requirements,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you can shape what the agent recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bundles&lt;/strong&gt; (“sweater + care kit”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threshold incentives&lt;/strong&gt; (“free shipping over $X”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart add-ons&lt;/strong&gt; (size/compatibility safe cross-sell)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bounded offers&lt;/strong&gt; surfaced at decision time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP supports extensions (e.g., discount/fulfillment extending checkout) in the protocol itself.&lt;/p&gt;


&lt;h2&gt;
  
  
  Now I want this, how?
&lt;/h2&gt;

&lt;p&gt;There are &lt;strong&gt;two practical paths&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Path A — Merchant checklist (no-code / low-code)
&lt;/h3&gt;

&lt;p&gt;This is how most Shopify merchants should start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make product data agent-friendly&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Clean titles, consistent variants, accurate inventory&lt;/li&gt;
&lt;li&gt;Strong shipping/returns policies&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rich attributes (materials, sizing, compatibility) so agents can filter accurately&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable fast, reliable checkout behaviors&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure checkout works smoothly end-to-end (especially shipping rates + payment methods).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep discount rules predictable (agents don’t handle weird edge cases well).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you want Google AI surfaces&lt;/strong&gt;: follow Google’s UCP onboarding guidance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google’s guide positions UCP as “turn AI interactions into instant sales” and provides an implementation/onboarding path (including business profile + capability negotiation).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Path B — Build (or hire someone to build) an agent that sells via Shopify’s UCP-compliant tools
&lt;/h3&gt;

&lt;p&gt;Shopify provides &lt;strong&gt;MCP servers that are UCP-compliant&lt;/strong&gt;, covering discovery, checkout, and orders.&lt;br&gt;
This is the fastest “developer path” to a working demo that can later become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an on-site AI concierge,&lt;/li&gt;
&lt;li&gt;a WhatsApp/LINE assistant,&lt;/li&gt;
&lt;li&gt;a support + reorder agent,&lt;/li&gt;
&lt;li&gt;a partner integration.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  An Example Step-by-step: build a simple “Shopify UCP” shopping agent (Node.js)
&lt;/h2&gt;

&lt;p&gt;Below is a minimal, beginner-friendly walkthrough using the same primitives Shopify documents:&lt;br&gt;
&lt;strong&gt;Authenticate → Search catalog → Create checkout → (Update) → Complete&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  0) Pre-requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js installed on your pc&lt;/li&gt;
&lt;li&gt;Access to Shopify Dev Dashboard (to generate credentials / tokens for agent APIs)&lt;/li&gt;
&lt;li&gt;VsCode or any IDE&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  1) Get a bearer token (JWT) for Shopify agent APIs
&lt;/h3&gt;

&lt;p&gt;Shopify’s agent docs: you generate a &lt;strong&gt;global access token&lt;/strong&gt; that authenticates your agent with Catalog + Checkout MCP servers.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; in your local VsCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_jwt_token_here
&lt;span class="nv"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_catalog_id_here

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Do &lt;strong&gt;not&lt;/strong&gt; commit &lt;code&gt;.env&lt;/code&gt;. Use .gitignore file to exclude &lt;code&gt;.env&lt;/code&gt;.)&lt;/p&gt;




&lt;h3&gt;
  
  
  2) Search products (Catalog MCP → &lt;code&gt;search_global_products&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;search-catalog.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://discover.shopifyapps.com/global/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search_global_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;saved_catalog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I need a crewneck sweater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer looking for sustainable fashion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;ships_to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;limit&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="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Shopify’s example parses the returned text payload as JSON.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is directly aligned with Shopify’s “search catalog” tutorial structure and parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’re looking for in results:&lt;/strong&gt; a &lt;strong&gt;product variant ID&lt;/strong&gt; (you’ll pass it to checkout) and the &lt;strong&gt;shop domain&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3) Create a checkout session (Shop’s MCP endpoint → &lt;code&gt;create_checkout&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Once you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopDomain&lt;/code&gt; (example: &lt;code&gt;your-store.myshopify.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;variantId&lt;/code&gt; (a &lt;code&gt;gid://shopify/ProductVariant/...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;code&gt;checkout.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shopDomain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_SHOP_DOMAIN.myshopify.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gid://shopify/ProductVariant/1234567890&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shopDomain&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/ucp/mcp`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create_checkout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;_meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;ucp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="c1"&gt;// Platform profile is required by UCP MCP binding for negotiation/versioning.&lt;/span&gt;
              &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://agent.example/profiles/shopping-agent.json&lt;/span&gt;&lt;span class="dl"&gt;'&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="na"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;idempotency_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="na"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This follows Shopify’s “complete checkout” tutorial and UCP’s MCP requirement that &lt;code&gt;_meta.ucp.profile&lt;/code&gt; is included for every tool invocation.&lt;/p&gt;




&lt;h3&gt;
  
  
  4) Update + complete checkout (status-driven)
&lt;/h3&gt;

&lt;p&gt;Shopify describes the flow as: create → update until ready → complete when status becomes &lt;code&gt;ready_for_complete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two important gotchas from Shopify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checkout updates replace the whole checkout state&lt;/strong&gt;—if you omit fields, they’re removed.&lt;/li&gt;
&lt;li&gt;Sometimes the checkout returns &lt;code&gt;requires_escalation&lt;/code&gt; and provides a &lt;code&gt;continue_url&lt;/code&gt; (meaning: hand off to embedded/trusted UI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice your agent loop looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;create_checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === incomplete&lt;/code&gt; → &lt;code&gt;update_checkout&lt;/code&gt; with missing info&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === requires_escalation&lt;/code&gt; → open the &lt;code&gt;continue_url&lt;/code&gt; in embedded checkout UI&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === ready_for_complete&lt;/code&gt; → &lt;code&gt;complete_checkout&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Shopify’s tutorial includes example payloads for &lt;code&gt;complete_checkout&lt;/code&gt; and the intermediate update steps.)&lt;/p&gt;





&lt;blockquote&gt;
&lt;p&gt;Shopify is building the foundation for agentic commerce.&lt;br&gt;&lt;br&gt;Universal Commerce Protocol, which we co-developed with Google, is now live. UCP will make it faster for agents and retailers to integrate.&lt;br&gt;&lt;br&gt;It’s open by default, so platforms and agents can use UCP to start transacting… &lt;a href="https://t.co/Gs0vzvfjra" rel="noopener noreferrer"&gt;pic.twitter.com/Gs0vzvfjra&lt;/a&gt;&lt;/p&gt;— tobi lutke (&lt;a class="mentioned-user" href="https://future.forem.com/tobi"&gt;@tobi&lt;/a&gt;) &lt;a href="https://twitter.com/tobi/status/2010372642843599064?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;January 11, 2026&lt;/a&gt;
&lt;/blockquote&gt; 


&lt;h2&gt;
  
  
  What Shopify merchants should do &lt;em&gt;this week&lt;/em&gt; to adapt quickly?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audit product data like an agent would&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a bot pick the right variant from your descriptions?&lt;/li&gt;
&lt;li&gt;Are shipping/returns explicit and consistent?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Create 2–3 “AOV plays” that are easy for an agent to apply&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Free shipping over $X”&lt;/li&gt;
&lt;li&gt;“Bundle discount”&lt;/li&gt;
&lt;li&gt;“Add-on with the top 3 products”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Decide your strategy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want quick wins: build an on-site agent that uses Shopify’s UCP-compliant MCP tools.&lt;/li&gt;
&lt;li&gt;If you want distribution via Google AI surfaces: start with Google’s UCP guide and required profile/onboarding steps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Ready to make your store AI and Agent Ready?
&lt;/h2&gt;

&lt;p&gt;The shift to Agentic Commerce is technical and moves fast. While the potential for revenue is huge, implementing UCP and MCP protocols correctly requires deep technical understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't have to figure this out alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need someone to architect and build a UCP integration for your Shopify store (or any e-commerce platform), I can help you turn this new technology into a competitive advantage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌐 See what I build:&lt;/strong&gt; &lt;a href="https://tahmid.space/" rel="noopener noreferrer"&gt;tahmid.space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 Specific questions or need a consultation?&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/tahmid-bin-taslim/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>shopify</category>
      <category>seo</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Universal Commerce Protocol (UCP) for Shopify merchants</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Tue, 03 Feb 2026 06:53:03 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/universal-commerce-protocol-ucp-for-shopify-merchants-4jg5</link>
      <guid>https://dev.to/tahmidbintaslim/universal-commerce-protocol-ucp-for-shopify-merchants-4jg5</guid>
      <description>&lt;p&gt;If you run a Shopify store, you are entering a new phase of e-commerce where &lt;strong&gt;"SEO" (Search Engine Optimization)&lt;/strong&gt; is being overtaken by &lt;strong&gt;"AEO" (AI Engine Optimization)&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Millions of shoppers are now using AI assistants to find products, but the journey usually breaks at the most critical moment: &lt;strong&gt;checkout or transaction.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frks41462eqxfjmylzo3s.jpg" alt="Checkout Tractions" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP (Universal Commerce Protocol)&lt;/strong&gt; is the fix. It’s a new on-ramp that lets AI “shopping agents” discover your products, ask the right questions (variants, shipping, returns), and move a buyer from &lt;strong&gt;intent → checkout → order&lt;/strong&gt; with fewer clicks and less drop-off.&lt;/p&gt;

&lt;p&gt;Crucially, this isn't just some random tech. UCP is an open standard powered by &lt;strong&gt;Google&lt;/strong&gt; and co-developed with e-commerce giants like &lt;strong&gt;Shopify&lt;/strong&gt;. It defines the common language for that end-to-end flow across platforms, merchants, payment providers, and credential providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the f*** is UCP actually?
&lt;/h2&gt;

&lt;p&gt;Technically, UCP is a standard. Commercially, it is the &lt;strong&gt;universal translator&lt;/strong&gt; between your Shopify store and the AI world. It handles three critical things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Handshake (Discovery):&lt;/strong&gt; Your store tells the AI, "I am open for business, and here is exactly what I can do." This ensures the AI knows you are a trusted merchant, not just another random website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Actions (Capabilities):&lt;/strong&gt; These are the "verbs" of commerce. Instead of just reading text, the AI can trigger real business logic: &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Check Inventory&lt;/strong&gt;, &lt;strong&gt;Apply Discount&lt;/strong&gt;, or &lt;strong&gt;Link Identity&lt;/strong&gt;. It turns a conversation into a transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Connection (Bindings):&lt;/strong&gt; Whether the customer is on WhatsApp, a Google Search AI result, or a voice assistant, UCP ensures the transaction works the same way. It maps these commercial actions 1:1 to modern tools (like MCP) so you can build once and sell everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy7df7y3v8knnm76ney.webp" alt="A Demo from Shopify Settings showing AI Agents using UCP" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For the technical folks (The Specs):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery &amp;amp; negotiation&lt;/strong&gt;: Agents and merchants “handshake” on what each supports (versions + capabilities).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities&lt;/strong&gt; (think: verbs): e.g., &lt;strong&gt;Checkout&lt;/strong&gt;, &lt;strong&gt;Order Management&lt;/strong&gt;, &lt;strong&gt;Identity Linking&lt;/strong&gt;, plus extensions (discounts, fulfillment, consent, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bindings / transports&lt;/strong&gt;: The same capability can be invoked over &lt;strong&gt;HTTP/REST&lt;/strong&gt;, &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; tools, or &lt;strong&gt;A2A&lt;/strong&gt;—UCP maps capabilities 1:1 to MCP tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick mental model:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz95nnj6l2pra41nfdizk.png" alt="Flow Chat showing UCP" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How this boosts revenue (conversion + AOV) for Shopify merchants
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1) You become “agent-ready” where shoppers already are
&lt;/h3&gt;

&lt;p&gt;Google is explicitly positioning UCP as a path to turn AI interactions into purchases across its AI surfaces (e.g., Gemini / AI Mode), starting with direct buying.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; capture incremental demand from high-intent shoppers who never reach a traditional PDP/cart flow.&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Lower friction checkout = fewer abandoned carts
&lt;/h3&gt;

&lt;p&gt;UCP’s checkout primitives let an agent complete the purchase with &lt;strong&gt;status-driven steps&lt;/strong&gt; (create → update → complete), and optionally escalate to a trusted embedded checkout UI when needed.&lt;br&gt;
&lt;strong&gt;Business impact:&lt;/strong&gt; fewer “form fatigue” drop-offs, especially on mobile and cross-border.&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Higher AOV via “agent-native” upsell logic (without being spammy)
&lt;/h3&gt;

&lt;p&gt;Once agents can reliably identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buyer intent (“I need a crewneck sweater, sustainable, ships to US”),&lt;/li&gt;
&lt;li&gt;variant constraints,&lt;/li&gt;
&lt;li&gt;shipping/returns requirements,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you can shape what the agent recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bundles&lt;/strong&gt; (“sweater + care kit”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threshold incentives&lt;/strong&gt; (“free shipping over $X”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart add-ons&lt;/strong&gt; (size/compatibility safe cross-sell)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bounded offers&lt;/strong&gt; surfaced at decision time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP supports extensions (e.g., discount/fulfillment extending checkout) in the protocol itself.&lt;/p&gt;


&lt;h2&gt;
  
  
  Now I want this, how?
&lt;/h2&gt;

&lt;p&gt;There are &lt;strong&gt;two practical paths&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Path A — Merchant checklist (no-code / low-code)
&lt;/h3&gt;

&lt;p&gt;This is how most Shopify merchants should start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make product data agent-friendly&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Clean titles, consistent variants, accurate inventory&lt;/li&gt;
&lt;li&gt;Strong shipping/returns policies&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rich attributes (materials, sizing, compatibility) so agents can filter accurately&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable fast, reliable checkout behaviors&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure checkout works smoothly end-to-end (especially shipping rates + payment methods).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep discount rules predictable (agents don’t handle weird edge cases well).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you want Google AI surfaces&lt;/strong&gt;: follow Google’s UCP onboarding guidance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google’s guide positions UCP as “turn AI interactions into instant sales” and provides an implementation/onboarding path (including business profile + capability negotiation).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Path B — Build (or hire someone to build) an agent that sells via Shopify’s UCP-compliant tools
&lt;/h3&gt;

&lt;p&gt;Shopify provides &lt;strong&gt;MCP servers that are UCP-compliant&lt;/strong&gt;, covering discovery, checkout, and orders.&lt;br&gt;
This is the fastest “developer path” to a working demo that can later become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an on-site AI concierge,&lt;/li&gt;
&lt;li&gt;a WhatsApp/LINE assistant,&lt;/li&gt;
&lt;li&gt;a support + reorder agent,&lt;/li&gt;
&lt;li&gt;a partner integration.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  An Example Step-by-step: build a simple “Shopify UCP” shopping agent (Node.js)
&lt;/h2&gt;

&lt;p&gt;Below is a minimal, beginner-friendly walkthrough using the same primitives Shopify documents:&lt;br&gt;
&lt;strong&gt;Authenticate → Search catalog → Create checkout → (Update) → Complete&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  0) Pre-requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js installed on your pc&lt;/li&gt;
&lt;li&gt;Access to Shopify Dev Dashboard (to generate credentials / tokens for agent APIs)&lt;/li&gt;
&lt;li&gt;VsCode or any IDE&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  1) Get a bearer token (JWT) for Shopify agent APIs
&lt;/h3&gt;

&lt;p&gt;Shopify’s agent docs: you generate a &lt;strong&gt;global access token&lt;/strong&gt; that authenticates your agent with Catalog + Checkout MCP servers.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; in your local VsCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_jwt_token_here
&lt;span class="nv"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_catalog_id_here

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Do &lt;strong&gt;not&lt;/strong&gt; commit &lt;code&gt;.env&lt;/code&gt;. Use .gitignore file to exclude &lt;code&gt;.env&lt;/code&gt;.)&lt;/p&gt;




&lt;h3&gt;
  
  
  2) Search products (Catalog MCP → &lt;code&gt;search_global_products&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;search-catalog.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CATALOG_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://discover.shopifyapps.com/global/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search_global_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;saved_catalog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;catalogId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I need a crewneck sweater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer looking for sustainable fashion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;ships_to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;limit&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="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Shopify’s example parses the returned text payload as JSON.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is directly aligned with Shopify’s “search catalog” tutorial structure and parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’re looking for in results:&lt;/strong&gt; a &lt;strong&gt;product variant ID&lt;/strong&gt; (you’ll pass it to checkout) and the &lt;strong&gt;shop domain&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3) Create a checkout session (Shop’s MCP endpoint → &lt;code&gt;create_checkout&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Once you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopDomain&lt;/code&gt; (example: &lt;code&gt;your-store.myshopify.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;variantId&lt;/code&gt; (a &lt;code&gt;gid://shopify/ProductVariant/...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;code&gt;checkout.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bearerToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BEARER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shopDomain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_SHOP_DOMAIN.myshopify.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gid://shopify/ProductVariant/1234567890&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shopDomain&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/ucp/mcp`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create_checkout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;_meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;ucp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="c1"&gt;// Platform profile is required by UCP MCP binding for negotiation/versioning.&lt;/span&gt;
              &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://agent.example/profiles/shopping-agent.json&lt;/span&gt;&lt;span class="dl"&gt;'&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="na"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;idempotency_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variantId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="na"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyer@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&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;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This follows Shopify’s “complete checkout” tutorial and UCP’s MCP requirement that &lt;code&gt;_meta.ucp.profile&lt;/code&gt; is included for every tool invocation.&lt;/p&gt;




&lt;h3&gt;
  
  
  4) Update + complete checkout (status-driven)
&lt;/h3&gt;

&lt;p&gt;Shopify describes the flow as: create → update until ready → complete when status becomes &lt;code&gt;ready_for_complete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two important gotchas from Shopify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checkout updates replace the whole checkout state&lt;/strong&gt;—if you omit fields, they’re removed.&lt;/li&gt;
&lt;li&gt;Sometimes the checkout returns &lt;code&gt;requires_escalation&lt;/code&gt; and provides a &lt;code&gt;continue_url&lt;/code&gt; (meaning: hand off to embedded/trusted UI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice your agent loop looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;create_checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === incomplete&lt;/code&gt; → &lt;code&gt;update_checkout&lt;/code&gt; with missing info&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === requires_escalation&lt;/code&gt; → open the &lt;code&gt;continue_url&lt;/code&gt; in embedded checkout UI&lt;/li&gt;
&lt;li&gt;if &lt;code&gt;status === ready_for_complete&lt;/code&gt; → &lt;code&gt;complete_checkout&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Shopify’s tutorial includes example payloads for &lt;code&gt;complete_checkout&lt;/code&gt; and the intermediate update steps.)&lt;/p&gt;





&lt;blockquote&gt;
&lt;p&gt;Shopify is building the foundation for agentic commerce.&lt;br&gt;&lt;br&gt;Universal Commerce Protocol, which we co-developed with Google, is now live. UCP will make it faster for agents and retailers to integrate.&lt;br&gt;&lt;br&gt;It’s open by default, so platforms and agents can use UCP to start transacting… &lt;a href="https://t.co/Gs0vzvfjra" rel="noopener noreferrer"&gt;pic.twitter.com/Gs0vzvfjra&lt;/a&gt;&lt;/p&gt;— tobi lutke (&lt;a class="mentioned-user" href="https://dev.to/tobi"&gt;@tobi&lt;/a&gt;) &lt;a href="https://twitter.com/tobi/status/2010372642843599064?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;January 11, 2026&lt;/a&gt;
&lt;/blockquote&gt; 


&lt;h2&gt;
  
  
  What Shopify merchants should do &lt;em&gt;this week&lt;/em&gt; to adapt quickly?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audit product data like an agent would&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a bot pick the right variant from your descriptions?&lt;/li&gt;
&lt;li&gt;Are shipping/returns explicit and consistent?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Create 2–3 “AOV plays” that are easy for an agent to apply&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Free shipping over $X”&lt;/li&gt;
&lt;li&gt;“Bundle discount”&lt;/li&gt;
&lt;li&gt;“Add-on with the top 3 products”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Decide your strategy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want quick wins: build an on-site agent that uses Shopify’s UCP-compliant MCP tools.&lt;/li&gt;
&lt;li&gt;If you want distribution via Google AI surfaces: start with Google’s UCP guide and required profile/onboarding steps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Ready to make your store AI and Agent Ready?
&lt;/h2&gt;

&lt;p&gt;The shift to Agentic Commerce is technical and moves fast. While the potential for revenue is huge, implementing UCP and MCP protocols correctly requires deep technical understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't have to figure this out alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need someone to architect and build a UCP integration for your Shopify store (or any e-commerce platform), I can help you turn this new technology into a competitive advantage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌐 See what I build:&lt;/strong&gt; &lt;a href="https://tahmid.space/" rel="noopener noreferrer"&gt;tahmid.space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 Specific questions or need a consultation?&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/tahmid-bin-taslim/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ucp</category>
      <category>ai</category>
      <category>agents</category>
      <category>shopify</category>
    </item>
    <item>
      <title>Kubernetes Ingress-NGINX Is Retiring in March 2026</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Tue, 20 Jan 2026 09:36:23 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/kubernetes-ingress-nginx-is-retiring-in-march-2026-2g0h</link>
      <guid>https://dev.to/tahmidbintaslim/kubernetes-ingress-nginx-is-retiring-in-march-2026-2g0h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; If you run &lt;strong&gt;ingress-nginx&lt;/strong&gt; in production, treat &lt;strong&gt;March 2026&lt;/strong&gt; as a hard deadline. After retirement, you should not expect new releases or security fixes. Start migrating to &lt;strong&gt;Kubernetes Gateway API&lt;/strong&gt; (or another supported ingress/gateway implementation) now.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Quick checklist
&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt; List every Ingress + annotations&lt;/li&gt;
  &lt;li&gt; Identify snippet usage&lt;/li&gt;
  &lt;li&gt; Install Gateway API CRDs&lt;/li&gt;
  &lt;li&gt; Choose a Gateway API implementation&lt;/li&gt;
  &lt;li&gt; Convert 1 low-risk service first&lt;/li&gt;
  &lt;li&gt; Run parallel + test&lt;/li&gt;
  &lt;li&gt; Cut over with rollback ready&lt;/li&gt;
  &lt;li&gt; Repeat service-by-service&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why you should care?
&lt;/h2&gt;

&lt;p&gt;If your cluster’s north–south traffic depends on &lt;strong&gt;Ingress-NGINX&lt;/strong&gt;, you’re likely relying on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TLS termination&lt;/li&gt;
&lt;li&gt;path/host routing&lt;/li&gt;
&lt;li&gt;HTTP header rewrites&lt;/li&gt;
&lt;li&gt;rate limits / auth integrations&lt;/li&gt;
&lt;li&gt;“magic” annotation behaviors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retirement means: your current setup may keep running… until a &lt;strong&gt;CVE&lt;/strong&gt;, a &lt;strong&gt;Kubernetes upgrade&lt;/strong&gt;, or a &lt;strong&gt;cloud load balancer change&lt;/strong&gt; turns it into a pager storm.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ingress vs Gateway API
&lt;/h2&gt;

&lt;p&gt;Ingress was a simple contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one resource (&lt;code&gt;Ingress&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;annotations for “advanced” behaviors&lt;/li&gt;
&lt;li&gt;controller-specific knobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gateway API&lt;/strong&gt; splits responsibilities and makes traffic management &lt;strong&gt;portable&lt;/strong&gt; across implementations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GatewayClass&lt;/code&gt; — &lt;em&gt;which controller provides gateway capability&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Gateway&lt;/code&gt; — &lt;em&gt;the actual data-plane entry point (listeners, TLS, addresses)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HTTPRoute&lt;/code&gt; / &lt;code&gt;TCPRoute&lt;/code&gt; / &lt;code&gt;GRPCRoute&lt;/code&gt; — &lt;em&gt;routing rules&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;policies (e.g., TLS policies) — &lt;em&gt;portable behaviors that don’t require annotations&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How Resources are connected?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1vjkkxkqzpug5mfktgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1vjkkxkqzpug5mfktgq.png" alt="Kubernetes Ingress-NGINX" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Migration plan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 0 — Inventory what you’re actually using
&lt;/h3&gt;

&lt;p&gt;Most Ingress-NGINX clusters are &lt;strong&gt;annotation-heavy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Run these to find your “hidden complexity”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all ingresses and controllers&lt;/span&gt;
kubectl get ingress &lt;span class="nt"&gt;-A&lt;/span&gt;

&lt;span class="c"&gt;# Show every annotation in ingresses (quick scan)&lt;/span&gt;
kubectl get ingress &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
  .items[] |
  "\(.metadata.namespace)/\(.metadata.name)\t" +
  ((.metadata.annotations // {}) | to_entries | map("\(.key)=\(.value)") | join("; "))
'&lt;/span&gt;

&lt;span class="c"&gt;# Find the scary ones (snippets, custom templates)&lt;/span&gt;
kubectl get ingress &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
  .items[] |
  select((.metadata.annotations // {}) | has("nginx.ingress.kubernetes.io/server-snippet")
  or has("nginx.ingress.kubernetes.io/configuration-snippet")) |
  "\(.metadata.namespace)/\(.metadata.name)"
'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make a list of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TLS behavior (single cert? wildcard? per-host?)&lt;/li&gt;
&lt;li&gt;rewrites and redirects&lt;/li&gt;
&lt;li&gt;auth (OIDC, basic auth, external auth)&lt;/li&gt;
&lt;li&gt;rate-limits&lt;/li&gt;
&lt;li&gt;custom NGINX snippets&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rule&lt;/strong&gt;: the more snippets you have, the more you must treat this as an application migration—not just YAML changes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 1 — Install Gateway API CRDs
&lt;/h2&gt;

&lt;p&gt;You can install the Gateway API CRDs via your preferred method (Helm / kustomize / manifests), but &lt;strong&gt;don’t&lt;/strong&gt; attach production traffic yet.&lt;/p&gt;

&lt;p&gt;Verify CRDs exist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get crd | &lt;span class="nb"&gt;grep &lt;/span&gt;gateway
kubectl api-resources | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'gateway|httproute|tcproute|grpcroute'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2 — Pick an implementation
&lt;/h2&gt;

&lt;p&gt;Gateway API is a spec. You still need an implementation.&lt;/p&gt;

&lt;p&gt;Common choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Managed gateways&lt;/strong&gt; (cloud-provider)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service mesh gateways&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dedicated gateway controllers&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pick based on&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;features you need (TCP/UDP? WAF? mTLS?)&lt;/li&gt;
&lt;li&gt;operational complexity&lt;/li&gt;
&lt;li&gt;observability and rate-limiting&lt;/li&gt;
&lt;li&gt;support and upgrade story&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3 — Convert one Ingress
&lt;/h2&gt;

&lt;p&gt;Let’s migrate a typical Ingress:&lt;/p&gt;

&lt;h3&gt;
  
  
  Before: Ingress-NGINX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/$1&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ingressClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app.example.com&lt;/span&gt;
    &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-tls&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app.example.com&lt;/span&gt;
    &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/?(.*)&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-svc&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After: Gateway + HTTPRoute
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: the exact fields can vary slightly by implementation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Gateway
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway.networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Gateway&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod-gateway&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;gatewayClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-gatewayclass&lt;/span&gt;
  &lt;span class="na"&gt;listeners&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HTTPS&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
    &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app.example.com&lt;/span&gt;
    &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Terminate&lt;/span&gt;
      &lt;span class="na"&gt;certificateRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-tls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  HTTPRoute
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway.networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HTTPRoute&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-route&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;parentRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod-gateway&lt;/span&gt;
  &lt;span class="na"&gt;hostnames&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app.example.com&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;matches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PathPrefix&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
    &lt;span class="na"&gt;backendRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-svc&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rewrite behavior: what to do instead of &lt;code&gt;rewrite-target&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ingress-NGINX had lots of rewrite tricks.&lt;/p&gt;

&lt;p&gt;In Gateway API, you’ll typically use &lt;strong&gt;filters&lt;/strong&gt; (implementation support varies):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway.networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HTTPRoute&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-route&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;parentRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod-gateway&lt;/span&gt;
  &lt;span class="na"&gt;hostnames&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app.example.com&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;matches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PathPrefix&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/api&lt;/span&gt;
    &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;URLRewrite&lt;/span&gt;
      &lt;span class="na"&gt;urlRewrite&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ReplacePrefixMatch&lt;/span&gt;
          &lt;span class="na"&gt;replacePrefixMatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
    &lt;span class="na"&gt;backendRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-svc&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your rewrite logic depends on regex capture groups (&lt;code&gt;/$1&lt;/code&gt;), you may need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refactor routes&lt;/li&gt;
&lt;li&gt;move logic into the app&lt;/li&gt;
&lt;li&gt;or pick an implementation that supports your needs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 4 — Run both in parallel
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option A: Separate DNS names (cleanest)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep &lt;code&gt;app.example.com&lt;/code&gt; on Ingress-NGINX&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;app-gw.example.com&lt;/code&gt; on Gateway&lt;/li&gt;
&lt;li&gt;Test, load-test, verify metrics&lt;/li&gt;
&lt;li&gt;Switch DNS once stable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Option B: Weighted traffic (advanced)
&lt;/h3&gt;

&lt;p&gt;Some gateways support traffic splitting between backends or routes.&lt;/p&gt;

&lt;p&gt;If supported, roll out progressively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1% → 10% → 50% → 100%&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 5 — Validate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Functional checks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# TLS and SNI&lt;/span&gt;
curl &lt;span class="nt"&gt;-vk&lt;/span&gt; https://app.example.com/

&lt;span class="c"&gt;# Host routing&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Host: app.example.com'&lt;/span&gt; https://&amp;lt;gateway-lb-ip&amp;gt;/

&lt;span class="c"&gt;# Path behavior&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://app.example.com/api/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Load and latency checks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;p95/p99 latency&lt;/li&gt;
&lt;li&gt;error rate (4xx/5xx)&lt;/li&gt;
&lt;li&gt;upstream timeouts&lt;/li&gt;
&lt;li&gt;connection reuse&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common pitfalls
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Annotation-only features&lt;/strong&gt;: Snippets and custom NGINX directives rarely translate 1:1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth flows&lt;/strong&gt;: External auth in NGINX may need a dedicated auth service or gateway plugin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLS edge cases&lt;/strong&gt;: Wildcard certs + SNI + multiple hosts = test carefully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path matching differences&lt;/strong&gt;: &lt;code&gt;Prefix&lt;/code&gt; vs regex behaviors differ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: Make sure you have equivalent access logs, metrics, tracing.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Rollback plan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep Ingress-NGINX resources intact during migration.&lt;/li&gt;
&lt;li&gt;Make DNS changes reversible.&lt;/li&gt;
&lt;li&gt;Use low TTLs during cutover.&lt;/li&gt;
&lt;li&gt;Maintain a “back to old gateway” runbook.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rollback should be &lt;strong&gt;one command&lt;/strong&gt; or &lt;strong&gt;one DNS change&lt;/strong&gt;, not a 2-hour YAML surgery.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>devops</category>
      <category>docker</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Agentic UI (A2UI + AG-UI) — Build UIs Your Agent Can Update in Real Time</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Thu, 08 Jan 2026 08:07:07 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/agentic-ui-a2ui-ag-ui-build-uis-your-agent-can-update-in-real-time-274n</link>
      <guid>https://dev.to/tahmidbintaslim/agentic-ui-a2ui-ag-ui-build-uis-your-agent-can-update-in-real-time-274n</guid>
      <description>&lt;p&gt;If you only ship a chat box, your agent will spend all its time &lt;em&gt;describing&lt;/em&gt; interfaces instead of using them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic UI&lt;/strong&gt; changes that. It lets agents drive real UI elements—forms, pickers, checklists, tables, charts, and confirmations—in real time.&lt;/p&gt;

&lt;p&gt;This guide shows you how to build it using two key technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A2UI&lt;/strong&gt;: A declarative, updateable UI specification that agents can generate and stream&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AG-UI&lt;/strong&gt;: An event stream protocol connecting agent backends to client UIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll also learn where &lt;strong&gt;MCP Apps&lt;/strong&gt; (UI for tools) and &lt;strong&gt;A2A&lt;/strong&gt; (agent-to-agent communication) fit into the ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Agentic UI?
&lt;/h2&gt;

&lt;p&gt;Agentic UI enables agents to &lt;strong&gt;render&lt;/strong&gt;, &lt;strong&gt;update&lt;/strong&gt;, and &lt;strong&gt;react to&lt;/strong&gt; UI state in real time—not just return text.&lt;/p&gt;

&lt;p&gt;There are three main approaches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Static UI&lt;/strong&gt;: Hardcoded interfaces where agents only populate data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declarative UI&lt;/strong&gt;: Agents output UI blueprints (like A2UI) that clients render using trusted components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generated UI&lt;/strong&gt;: Agents output raw HTML/JSX—fast for prototyping but risky in production&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agentic UI typically refers to approach #2: declarative, component-based interfaces.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;Chat-only flows create friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users type details one message at a time&lt;/li&gt;
&lt;li&gt;Agents ask endless clarifying questions&lt;/li&gt;
&lt;li&gt;The conversation becomes a worse version of a form&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With agentic UI&lt;/strong&gt;, agents can surface the right interface at the right moment. Users click instead of type, and you get structured input immediately.&lt;/p&gt;

&lt;p&gt;Here's an example reservation flow powered by A2UI:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-2-reserve-table.original.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-2-reserve-table.original.png" alt="A2UI restaurant reservation example UI" width="800" height="523"&gt;&lt;/a&gt;&lt;br&gt;A2UI-style reservation interface: fewer chat turns, more structured input
  &lt;/p&gt;




&lt;h2&gt;
  
  
  How the Pieces Fit Together
&lt;/h2&gt;

&lt;p&gt;Think of the agentic UI stack like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxhkp46lm3tynpwuuxer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxhkp46lm3tynpwuuxer.png" alt="AG2UI Flow Chart" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AG-UI&lt;/strong&gt; handles the plumbing: events, streaming, tool calls, and UI updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2UI&lt;/strong&gt; defines the payload format: UI blueprints and incremental patches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; provides tool access; &lt;strong&gt;MCP Apps&lt;/strong&gt; can include tool-specific UI in sandboxed HTML&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A&lt;/strong&gt; enables agent-to-agent communication across systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This diagram illustrates the complete data flow from agent to UI to tools:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-3-end-to-end-data-flow.original.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-3-end-to-end-data-flow.original.png" alt="A2UI end-to-end data flow" width="800" height="433"&gt;&lt;/a&gt;&lt;br&gt;Complete flow: agents stream UI and state updates; clients render and send user actions back
  &lt;/p&gt;

&lt;p&gt;Use this checklist when planning your implementation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-4-checklist.original.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-4-checklist.original.png" alt="A2UI ecosystem checklist" width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;Essential components for production-ready agent-driven UI: rendering, actions, state, and safety
  &lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Demo: Run A2UI Locally
&lt;/h2&gt;

&lt;p&gt;See A2UI in action with this complete example using a Lit renderer and agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js v18 or higher&lt;/li&gt;
&lt;li&gt;A Gemini API key&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/google/a2ui.git
&lt;span class="nb"&gt;cd &lt;/span&gt;a2ui

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_gemini_api_key_here"&lt;/span&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;samples/client/lit
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run demo:all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Try These Prompts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;"book a table for 2"&lt;/li&gt;
&lt;li&gt;"find italian restaurants near me"&lt;/li&gt;
&lt;li&gt;"i want 7pm tomorrow"&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;The UI adapts its structure based on user intent&lt;/li&gt;
&lt;li&gt;Users interact through clicks and selections, not just text input&lt;/li&gt;
&lt;li&gt;The interface updates incrementally as the agent processes requests&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How A2UI Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;Unlike generated HTML, A2UI streams &lt;strong&gt;structured messages&lt;/strong&gt; that reference a predefined component catalog. This approach prioritizes safety and consistency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-1-component-gallery_2.original.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-developer-goog-blog-assets%2Fimages%2Fa2ui-blog-1-component-gallery_2.original.png" alt="A2UI component gallery" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;A2UI component catalog: agents select from trusted components instead of generating arbitrary markup
  &lt;/p&gt;

&lt;h3&gt;
  
  
  Core Message Types
&lt;/h3&gt;

&lt;p&gt;Most A2UI applications use three fundamental message types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;surfaceUpdate&lt;/strong&gt;: Defines component structure (IDs and specifications)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dataModelUpdate&lt;/strong&gt;: Provides data bindings for components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;beginRendering&lt;/strong&gt;: Instructs the client to render the interface&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example: Building a Reservation Form
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Define the Surface Structure
&lt;/h4&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;"surfaceUpdate"&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;"surfaceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"components"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"component"&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;"Text"&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;"text"&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;"literalString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Book a table"&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;"usageHint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"h1"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"component"&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;"DateTimeInput"&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;"label"&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;"literalString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Date"&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"&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/reservation/date"&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;"enableDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"component"&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;"DateTimeInput"&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;"label"&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;"literalString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Time"&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"&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/reservation/time"&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;"enableTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"component"&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;"Button"&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;"child"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirmText"&lt;/span&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirm_booking"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirmText"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"component"&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;"Text"&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;"text"&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;"literalString"&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"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;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;h4&gt;
  
  
  2. Populate the Data Model
&lt;/h4&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;"dataModelUpdate"&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;"surfaceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"contents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"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;"reservation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"valueMap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"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;"date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"valueString"&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-01-10"&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;"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;"time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"valueString"&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:00"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Trigger Rendering
&lt;/h4&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;"beginRendering"&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;"surfaceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"root"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"title"&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;h3&gt;
  
  
  Why This Beats Agent-Generated HTML
&lt;/h3&gt;

&lt;p&gt;A2UI treats &lt;strong&gt;UI as data&lt;/strong&gt;, which provides critical advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The client maintains a catalog of vetted, trusted components&lt;/li&gt;
&lt;li&gt;Agents can only request components from this approved catalog&lt;/li&gt;
&lt;li&gt;Messages are declarative specifications, not executable code&lt;/li&gt;
&lt;li&gt;Remote agents can't inject arbitrary markup or scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architectural choice becomes essential when dealing with multi-agent systems or untrusted agent sources.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Demo: Scaffold an AG-UI Application
&lt;/h2&gt;

&lt;p&gt;AG-UI creates a unified event protocol that makes agents and UIs feel like a single cohesive system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a New Project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-ag-ui-app@latest
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What AG-UI Provides
&lt;/h3&gt;

&lt;p&gt;AG-UI gives you a standardized event stream for building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming text responses&lt;/li&gt;
&lt;li&gt;Tool call handling&lt;/li&gt;
&lt;li&gt;Real-time UI updates (including A2UI payloads)&lt;/li&gt;
&lt;li&gt;Bidirectional agent-client communication&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Minimal AG-UI Streaming Server
&lt;/h2&gt;

&lt;p&gt;This pattern provides everything you need for a production application using Server-Sent Events (SSE).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/run&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Configure SSE headers&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/event-stream&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Connection&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;keep-alive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Helper function for sending events&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;send&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`data: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;\n\n`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Start the agent run&lt;/span&gt;
  &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RunStarted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;runId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Stream a text update&lt;/span&gt;
  &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MessageDelta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Finding options…&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Send an A2UI surface as a UI event&lt;/span&gt;
  &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GenerativeUI&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a2ui&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;surfaceUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;surfaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;components&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
                &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;literalString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pick a time&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
                &lt;span class="na"&gt;usageHint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h2&lt;/span&gt;&lt;span class="dl"&gt;"&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="p"&gt;]&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="c1"&gt;// Complete the run&lt;/span&gt;
  &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RunFinished&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3030&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SSE server running on :3030&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AG-UI uses an event-driven architecture&lt;/li&gt;
&lt;li&gt;Transport can be SSE (shown here) or WebSockets&lt;/li&gt;
&lt;li&gt;A2UI messages travel inside AG-UI events&lt;/li&gt;
&lt;li&gt;Events are structured, typed, and loggable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Closing the Loop: Handling User Actions
&lt;/h2&gt;

&lt;p&gt;Rendering UI is straightforward. The real challenge is processing user input cleanly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Complete Interaction Cycle
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Agent streams a surface definition&lt;/li&gt;
&lt;li&gt;User interacts with UI elements&lt;/li&gt;
&lt;li&gt;Client emits typed user action events&lt;/li&gt;
&lt;li&gt;Agent processes actions and patches UI incrementally&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why Incremental Updates Matter
&lt;/h3&gt;

&lt;p&gt;When you send only the changes instead of rebuilding the entire interface, the UI remains stable and responsive. The agent doesn't waste tokens or bandwidth resending unchanged components.&lt;/p&gt;




&lt;h2&gt;
  
  
  A2UI vs MCP Apps: When to Use Each
&lt;/h2&gt;

&lt;p&gt;Both technologies are valuable—they solve different problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Apps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Tool-specific interfaces that need custom functionality&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools return &lt;code&gt;text/html&lt;/code&gt; content&lt;/li&gt;
&lt;li&gt;UI renders in sandboxed iframes for security&lt;/li&gt;
&lt;li&gt;Ideal when a tool needs its own specialized mini-application&lt;/li&gt;
&lt;li&gt;Each tool controls its own interface design&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A2UI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Native-feeling interfaces integrated into your main application&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents send blueprints referencing your component catalog&lt;/li&gt;
&lt;li&gt;UI matches your application's styling, accessibility, and behavior&lt;/li&gt;
&lt;li&gt;Ideal when the agent needs to orchestrate your product's native UI&lt;/li&gt;
&lt;li&gt;Maintains consistent user experience across all agent interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb&lt;/strong&gt;: If your UI must feel like a native part of your application, choose A2UI. If you need isolated, tool-specific UI panels, use MCP Apps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trade-offs to Consider
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Faster user flows&lt;/strong&gt;: Reduces back-and-forth messaging by surfacing the right interface at the right time&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced safety&lt;/strong&gt;: Declarative components are safer than agent-generated HTML&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better accessibility&lt;/strong&gt;: Native components inherit your existing accessibility implementation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Improved observability&lt;/strong&gt;: Event-based architecture makes logging and debugging straightforward&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Component maintenance&lt;/strong&gt;: You need to build and maintain a component catalog&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema validation&lt;/strong&gt;: Requires robust validation and graceful fallback handling&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent prompt engineering&lt;/strong&gt;: Agents need clear guidelines on when and how to use UI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runtime complexity&lt;/strong&gt;: You're building a binding system, action handlers, and state synchronization&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The best way to learn is to build. Start with the demos above, then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define your core component catalog based on your most common UI patterns&lt;/li&gt;
&lt;li&gt;Implement a minimal AG-UI event stream&lt;/li&gt;
&lt;li&gt;Add A2UI message handling for your key use cases&lt;/li&gt;
&lt;li&gt;Iterate based on real user interactions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent-driven UI paradigm is still evolving, but the foundation is solid. These protocols give you the building blocks to create interfaces that feel both intelligent and responsive.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/a2ui" rel="noopener noreferrer"&gt;A2UI GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/create-ag-ui-app" rel="noopener noreferrer"&gt;AG-UI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP Apps Specification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ui</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Top 15 React Component Libraries to Use in 2026</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Sat, 20 Dec 2025 05:05:31 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/top-15-react-component-libraries-to-use-in-2026-33a4</link>
      <guid>https://dev.to/tahmidbintaslim/top-15-react-component-libraries-to-use-in-2026-33a4</guid>
      <description>&lt;p&gt;React continues to be one of the most popular frameworks for building robust user interfaces — and a big reason why is the ecosystem of &lt;strong&gt;component libraries&lt;/strong&gt; that saves you from rewriting basic UI patterns like buttons, modals, navigation, and forms from scratch.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll explore the &lt;strong&gt;top React component libraries for 2026&lt;/strong&gt;, what makes them valuable, and when to choose each one. This is based on the latest ecosystem analysis from Builder.io’s 2026 roundup.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a React Component Library?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;React component library&lt;/strong&gt; is a curated collection of pre-built UI elements — often with styling, accessibility, themes, and responsive behavior included — that you can import and reuse in your apps. These reduce development time and help enforce &lt;strong&gt;consistency across your UI&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Component Libraries Matter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Boost productivity:&lt;/strong&gt; No need to re-implement basic UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; Shared design language across your app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility &amp;amp; performance:&lt;/strong&gt; Many libraries ship accessible markup and optimized bundles out of the box.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Complete Design Systems
&lt;/h2&gt;

&lt;p&gt;If you want a rich, professional UI set with strong documentation and components for almost every use case:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Material UI (MUI)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A full design system implementing Google’s Material Design — extensive component set with advanced tools like data grids.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Ant Design&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Enterprise-ready UI library with advanced form support, data tables, and dashboard components — ideal for business apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Chakra UI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developer-friendly with intuitive styling props, built-in accessibility, dark mode, and responsive utilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tailwind CSS-Friendly Libraries
&lt;/h2&gt;

&lt;p&gt;React libraries that pair beautifully with &lt;strong&gt;Tailwind CSS&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;shadcn/ui&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A copy-and-paste-ready component collection built with Tailwind and Radix primitives. You own the code, no dependency headaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Headless UI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Unstyled components with complete logic — you style everything using Tailwind classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;DaisyUI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Adds semantic UI classes to Tailwind (e.g., &lt;code&gt;btn&lt;/code&gt;, &lt;code&gt;btn-primary&lt;/code&gt;) with multiple theme options.&lt;/p&gt;




&lt;h2&gt;
  
  
  Unstyled &amp;amp; Headless Libraries
&lt;/h2&gt;

&lt;p&gt;These give behavior and accessibility without enforcing styles — great when you want full design control:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;React Aria&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Adobe’s accessibility-focused primitives handle keyboard navigation and ARIA behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Radix UI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Low-level primitives (Dialog, Tooltip, Dropdown) that you style yourself and compose into design systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Base UI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Unstyled building blocks emphasizing accessibility and performance — works with Tailwind or plain CSS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rapid Prototyping Libraries
&lt;/h2&gt;

&lt;p&gt;Libraries offering lots of ready-to-use components so you can ship quickly:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Mantine&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;100+ components + helpful hooks, form utilities, and theming — great for MVPs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;HeroUI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Beautiful default styles, smooth animations, dark mode support, and easy integration with modern stacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;PrimeReact&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Huge component catalog including charts, tables, and advanced widgets with themes and templates.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;React-Admin&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Turn REST/GraphQL APIs into admin dashboards with built-in authentication, layouts, and patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  Specialty Libraries
&lt;/h2&gt;

&lt;p&gt;Sometimes you don’t need a full system — you just need dependable UI tools in specific niches:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;React Bootstrap&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Bootstrap components fully rewritten for React — perfect for migrating Bootstrap projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Semantic UI React&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Natural, human-readable React components with intuitive HTML-like syntax.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Choose the Right Library
&lt;/h2&gt;

&lt;p&gt;Here are some practical criteria for evaluating component libraries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Design fit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Will it match your brand style or require heavy overrides?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Better IDE autocomplete and fewer runtime errors.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bundle size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Smaller bundles = faster load times.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in WCAG support reduces rework.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance &amp;amp; community&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frequent updates and responsive issues are crucial.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before adopting anything, check its &lt;strong&gt;GitHub activity&lt;/strong&gt;, issue responses, and how recent releases have been.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Syncing Designs With Code
&lt;/h2&gt;

&lt;p&gt;Bridging the gap between Figma designs and real React components is still a common challenge — many devs end up rewriting prototypes because generic code generators don’t match their component APIs.&lt;/p&gt;

&lt;p&gt;Tools like &lt;strong&gt;Builder.io Fusion&lt;/strong&gt; can generate React code that &lt;strong&gt;uses your actual component library&lt;/strong&gt;, respects your import patterns, and even generates Storybook stories.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;React’s ecosystem for component libraries is richer than ever in 2026. Whether you prefer &lt;strong&gt;opinionated design systems&lt;/strong&gt;, &lt;strong&gt;unstyled primitives&lt;/strong&gt;, or &lt;strong&gt;Tailwind-ready components&lt;/strong&gt;, there’s a library that fits your stack — just evaluate against performance, accessibility, and long-term maintenance before you commit.&lt;/p&gt;

&lt;p&gt;Happy building! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you enjoyed this guide, smash that 💜 and share it with your frontend friends!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ui</category>
      <category>webdev</category>
      <category>react</category>
      <category>ai</category>
    </item>
    <item>
      <title>Next.js vs TanStack in 2025: A Practical Comparison</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Mon, 15 Dec 2025 12:00:00 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/nextjs-vs-tanstack-in-2025-a-practical-comparison-1991</link>
      <guid>https://dev.to/tahmidbintaslim/nextjs-vs-tanstack-in-2025-a-practical-comparison-1991</guid>
      <description>&lt;p&gt;Over the last decade, &lt;strong&gt;Next.js&lt;/strong&gt; became the de facto full-stack React framework, praised for its integrated server rendering, routing conventions, and performance optimizations. In 2025, however, a new competitor has emerged from the creators of &lt;strong&gt;TanStack Query and Router&lt;/strong&gt;: &lt;strong&gt;TanStack Start&lt;/strong&gt; — a framework geared toward type safety, explicit architecture, and modern tooling. Many developers are re-evaluating their tooling decisions as both ecosystems evolve.&lt;/p&gt;

&lt;p&gt;Below we explore the technical, developer-experience, and architectural trade-offs between these frameworks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Community Sentiment and Adoption
&lt;/h2&gt;

&lt;p&gt;Many developers express frustration with the increasing complexity of Next.js, particularly after the introduction of the App Router, React Server Components (RSC), and frequent large releases:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Next.js lost me with the constant changes and complexity. The benefits don’t justify the cognitive overload.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Concerns also include perceived coupling with Vercel and the mental overhead required to master Next.js conventions.&lt;/p&gt;

&lt;p&gt;Meanwhile, developers adopting &lt;strong&gt;TanStack Start&lt;/strong&gt; often highlight its:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type safety&lt;/strong&gt; and &lt;strong&gt;compile-time guarantees&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicit routing and data contracts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility in deployment&lt;/strong&gt; and toolchain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This shift reflects a broader desire for predictable developer experiences in full-stack JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architectural Overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Next.js
&lt;/h3&gt;

&lt;p&gt;Next.js features a &lt;strong&gt;server-first architecture&lt;/strong&gt; that centers around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File-based routing&lt;/li&gt;
&lt;li&gt;Server-Side Rendering (SSR), Static Site Generation (SSG), and Incremental Static Regeneration (ISR)&lt;/li&gt;
&lt;li&gt;React Server Components (App Router) with client/server component boundaries&lt;/li&gt;
&lt;li&gt;First-party optimizations for SEO and analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features make Next.js suitable for content-heavy applications and SEO-driven sites.&lt;/p&gt;

&lt;h3&gt;
  
  
  TanStack Start
&lt;/h3&gt;

&lt;p&gt;TanStack Start, on the other hand, is designed from the ground up on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TanStack Router&lt;/strong&gt;: a fully type-safe routing system&lt;/li&gt;
&lt;li&gt;Vite for development server and build&lt;/li&gt;
&lt;li&gt;Nitro for SSR and server functions&lt;/li&gt;
&lt;li&gt;Explicit configuration for routes and server APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The philosophy prioritizes &lt;strong&gt;explicit code and type safety&lt;/strong&gt; over conventions and “framework magic.”&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;TanStack Start&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File-based routing&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type-safe routing params&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Yes (compile time)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server components&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Planned / leverage full-stack server functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSR &amp;amp; streaming&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server functions&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (integrated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framework abstractions&lt;/td&gt;
&lt;td&gt;Opinionated&lt;/td&gt;
&lt;td&gt;Explicit / less magic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dev server speed&lt;/td&gt;
&lt;td&gt;Integrated&lt;/td&gt;
&lt;td&gt;Vite-powered (fast)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment options&lt;/td&gt;
&lt;td&gt;Vercel-first, others supported&lt;/td&gt;
&lt;td&gt;Multiple presets (Vite/Nitro)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sources for comparison data include official docs and community analyses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Simple Route: Next.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HomePage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Welcome to Next.js&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Simple Route: TanStack Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/app/index.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HomePage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Welcome to TanStack Start&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Type-safe Routing in TanStack Router
&lt;/h3&gt;

&lt;p&gt;With TanStack Router, routes and parameters are inferred at compile time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createRouter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RouterProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tanstack/router&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createRouter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;routeTree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rootRoute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addChildren&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="nx"&gt;homeRoute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;blogRoute&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces type-safe navigation and route parameters, reducing runtime errors. (&lt;a href="https://blog.prototyp.digital/tanstack-start-vs-next-js-choosing-the-right-react-framework-in-2025" rel="noopener noreferrer"&gt;blog.prototyp.digital&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Server Functions in TanStack Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/app/api/hello.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from server function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Server functions run on the server and can be called from the client with full type safety. (&lt;a href="https://blog.prototyp.digital/tanstack-start-vs-next-js-choosing-the-right-react-framework-in-2025" rel="noopener noreferrer"&gt;blog.prototyp.digital&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Metrics
&lt;/h2&gt;

&lt;p&gt;Empirical benchmarks show that smaller, client-focused framework approaches (like TanStack Start with Vite) can yield faster reloads and leaner development builds compared to heavier server-centric frameworks. Specific metrics vary by workload, but developers report notable differences in bundle sizes and dev server speed. (&lt;a href="https://www.lorenstew.art/blog/10-kanban-boards" rel="noopener noreferrer"&gt;lorenstew.art&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9409uwlmjwljijpqz0es.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9409uwlmjwljijpqz0es.png" alt="Diagram generated by Mermaid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This example illustrates typical relative speeds during development. The actual performance will vary based on project size.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deployment and Ecosystem
&lt;/h2&gt;

&lt;p&gt;Next.js integrates deeply with Vercel and offers edge hosting, automated code splitting, and built-in optimizations. TanStack Start uses Nitro and Vite and supports many hosting providers with flexible presets. (&lt;a href="https://prototyp.digital/blog/tanstack-start-vs-next-js-choosing-the-right-react-framework-in-2025" rel="noopener noreferrer"&gt;prototyp.digital&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The trade-off here is between &lt;strong&gt;out-of-the-box opinionated optimizations&lt;/strong&gt; (Next.js) and &lt;strong&gt;toolchain flexibility&lt;/strong&gt; (TanStack Start).&lt;/p&gt;




&lt;h2&gt;
  
  
  Supporting Video
&lt;/h2&gt;

&lt;p&gt;Below is a recent community comparison that walks through the developer experience side-by-side:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=D27AfH0pSp8" rel="noopener noreferrer"&gt;An Honest Review of TanStack vs Next.js by Ankita Kulkarni (YouTube)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/D27AfH0pSp8"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Quote from a Thought Leader
&lt;/h2&gt;

&lt;p&gt;John Resig (creator of jQuery) commented publicly on the benefits of TanStack Start:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’ve been using TanStack Start for a new project and it’s super good. The server functions completely replace the need for TRPC/GraphQL/REST, the middleware is composable and fully typed…” (&lt;a href="https://www.infoq.com/news/2025/11/tanstack-start-v1" rel="noopener noreferrer"&gt;InfoQ&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This highlights the shift toward &lt;strong&gt;built-in developer workflows&lt;/strong&gt; and type safety.&lt;/p&gt;




&lt;h2&gt;
  
  
  Considerations and Trade-offs
&lt;/h2&gt;

&lt;p&gt;This analysis acknowledges that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; remains strong for SEO, established conventions, and large ecosystems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TanStack Start&lt;/strong&gt; offers superior developer control, type safety, and Vite-first workflows.&lt;/li&gt;
&lt;li&gt;Migration costs should be considered; many teams combine TanStack Query with Next.js rather than fully replacing their stack. (&lt;a href="https://saas-path.com/blog/articles/tanstack-vs-nextjs-qui-est-le-grand-gagnant-en-2025" rel="noopener noreferrer"&gt;SaaS Path&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In 2025, &lt;strong&gt;TanStack Start and Router&lt;/strong&gt; represent a compelling alternative for modern React developers seeking &lt;strong&gt;clarity, type safety, and predictable developer experience&lt;/strong&gt; without heavy abstractions. Next.js continues to excel where its conventions and render optimizations align with project requirements.&lt;/p&gt;

&lt;p&gt;The choice between Next.js and TanStack Start should be informed by project needs, team expertise, and long-term maintainability considerations, rather than tribal preferences.&lt;/p&gt;

&lt;p&gt;What matters most is &lt;strong&gt;understanding the trade-offs&lt;/strong&gt; and selecting the tool that best supports your engineering goals.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>fullstack</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Prisma ORM v7 — What’s New &amp; How to Migrate from v6 to v7</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Fri, 28 Nov 2025 07:22:05 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/prisma-orm-v7-whats-new-how-to-migrate-from-v6-to-v7-537l</link>
      <guid>https://dev.to/tahmidbintaslim/prisma-orm-v7-whats-new-how-to-migrate-from-v6-to-v7-537l</guid>
      <description>&lt;p&gt;The team behind Prisma officially released &lt;strong&gt;Prisma ORM 7.0.0&lt;/strong&gt; — and it brings major changes under the hood. If you’re currently on Prisma v6 (or older), upgrading can give you significant performance, developer-experience, and deployment benefits. In this article, I’ll walk you through &lt;strong&gt;what’s new in v7&lt;/strong&gt;, &lt;strong&gt;why it matters&lt;/strong&gt;, and a &lt;strong&gt;step-by-step migration guide&lt;/strong&gt; to move your project from v6 → v7 safely.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s New in Prisma ORM v7
&lt;/h2&gt;

&lt;p&gt;The v7 release is a major milestone for Prisma. Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rust-free Prisma Client (default)&lt;/strong&gt; — Prisma Client no longer depends on a Rust-based query engine. Instead, the core logic is now implemented in TypeScript/JavaScript. (&lt;a href="https://www.prisma.io/blog/announcing-prisma-orm-7-0-0" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Much smaller bundles + better performance&lt;/strong&gt; — With v7: ~ 90% smaller bundle output, up to &lt;strong&gt;3× faster query execution&lt;/strong&gt;, and lower CPU/memory usage. Deployments (e.g. serverless, edge) become simpler and more robust. (&lt;a href="https://www.prisma.io/blog/announcing-prisma-orm-7-0-0" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generated Client now lives in your source tree, not &lt;code&gt;node_modules&lt;/code&gt;&lt;/strong&gt; — Instead of hiding generated client code in &lt;code&gt;node_modules&lt;/code&gt;, Prisma now outputs generated client code (and types) under your project source (e.g. &lt;code&gt;src/generated/…&lt;/code&gt;). This helps build tools, watchers, bundlers to treat it like part of your app — improving DX. (&lt;a href="https://www.prisma.io/blog/announcing-prisma-orm-7-0-0" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New config file: &lt;code&gt;prisma.config.ts&lt;/code&gt; (or similar)&lt;/strong&gt; — Prisma moves configuration (schema paths, adapter settings, env variables, etc.) into a dedicated config file instead of scattered &lt;code&gt;package.json&lt;/code&gt; or schema metadata. This brings more structure and flexibility. (&lt;a href="https://www.prisma.io/blog/announcing-prisma-orm-7-0-0" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster &amp;amp; leaner type generation / type checking&lt;/strong&gt; — Prisma claims ~ 98% fewer types needed to evaluate a schema; ~ 45% fewer types for query evaluation; and ~ 70% faster full type-checks. (&lt;a href="https://www.prisma.io/blog/announcing-prisma-orm-7-0-0" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better support for modern environments (E.g. ES Modules, edge, serverless, etc.)&lt;/strong&gt; — v7 aims to make Prisma more compatible with ESM, bundlers, Cloudflare Workers / edge runtimes, monorepos, etc. (&lt;a href="https://www.prisma.io/blog/rust-free-prisma-orm-is-ready-for-production" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem changes: driver adapters, database support, new Prisma Studio version, updated minimum Node/TypeScript versions, etc.&lt;/strong&gt; (&lt;a href="https://www.prisma.io/blog/announcing-prisma-orm-7-0-0" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All together — v7 represents a strategic overhaul to make Prisma leaner, faster, more flexible, and more in tune with modern JS/TS / deployment ecosystems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the Changes Matter (Especially for Medium-to-Large Projects)
&lt;/h2&gt;

&lt;p&gt;If you are working on a non-trivial project (multiple models, relations, custom schema, serverless or edge deployment, bundlers, etc.), v7 makes a lot of sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smaller bundle + no native binaries → &lt;strong&gt;simpler deployments&lt;/strong&gt;, fewer compatibility headaches (important for serverless, edge, or bundler-based setups).&lt;/li&gt;
&lt;li&gt;Generated code in source + new config → &lt;strong&gt;better maintainability&lt;/strong&gt;, easier code reviews, version control, CI/CD, and clearer project structure.&lt;/li&gt;
&lt;li&gt;Faster type-checking &amp;amp; leaner types → &lt;strong&gt;smoother developer experience&lt;/strong&gt;, especially with large schemas or frequent changes.&lt;/li&gt;
&lt;li&gt;Broader ecosystem support (ESM, adapter-based drivers, modern runtime environments) → &lt;strong&gt;future-proofing&lt;/strong&gt; your codebase and easier adoption of new deployment targets.&lt;/li&gt;
&lt;li&gt;Less overhead for teams: easier collaboration, simpler onboarding, fewer environment assumptions (no Rust, no binary engine dependencies).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build a complicated schema — e.g. many models, relations, custom logic — or target serverless/edge, v7 is a solid win.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migration Guide: From Prisma v6 → v7
&lt;/h2&gt;

&lt;p&gt;Here’s a recommended &lt;strong&gt;step-by-step migration path&lt;/strong&gt; to upgrade your project from Prisma v6 to Prisma v7. Adapt to your project’s structure (directory layout, TS/JS, build tools, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Update dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @prisma/client@7 prisma@7 &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;span class="c"&gt;# or using yarn/pnpm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need to bump &lt;strong&gt;both&lt;/strong&gt; &lt;code&gt;prisma&lt;/code&gt; and &lt;code&gt;@prisma/client&lt;/code&gt; to version 7. (&lt;a href="https://www.prisma.io/docs/orm/more/upgrade-guides/upgrading-versions" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Update Prisma schema / generator block
&lt;/h3&gt;

&lt;p&gt;In your &lt;code&gt;schema.prisma&lt;/code&gt;, update the &lt;code&gt;generator client&lt;/code&gt; block. For example, change from something like (v6-style):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generator client {
  provider      = "prisma-client-js"
  engineType    = "binary"
  output        = "./generated"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to the new default for v7:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generator client {
  provider = "prisma-client"
  // optional: you can omit output (uses default), or define custom output dir
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depending on your preferences, you may also explicitly set an output path. (&lt;a href="https://medium.com/%40yashrajvrma/how-to-upgrade-to-prisma-v7-in-next-js-app-27007cbc046f" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;NOTE: Because Prisma v7 changes how the generated client is used, the previous import path (&lt;code&gt;import { PrismaClient } from "@prisma/client"&lt;/code&gt;) may no longer work out-of-the-box if you use a custom output directory. In that case, you need to import from the generated folder (e.g. &lt;code&gt;import { PrismaClient } from "@/generated/prisma/client"&lt;/code&gt; or similar). (&lt;a href="https://github.com/better-auth/better-auth/issues/6112" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create (or migrate to) new config file
&lt;/h3&gt;

&lt;p&gt;Prisma v7 introduces a dedicated config file (e.g. &lt;code&gt;prisma.config.ts&lt;/code&gt;, or &lt;code&gt;.config/prisma.ts&lt;/code&gt;). Use it to configure schema paths, environment variables, driver adapters, seeds, etc. This centralizes configuration in one place instead of scattering it. (&lt;a href="https://www.prisma.io/blog/announcing-prisma-orm-7-0-0" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Here’s a minimal example (TypeScript):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// prisma.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prisma/config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;classic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// or default, depending on what you need&lt;/span&gt;
  &lt;span class="na"&gt;datasource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prisma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;schema.prisma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="c1"&gt;// other config options if needed&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use environment variables (e.g. via &lt;code&gt;.env&lt;/code&gt;), note that Prisma CLI no longer automatically loads &lt;code&gt;.env&lt;/code&gt; by default — you may need to load them manually (e.g. with &lt;code&gt;dotenv&lt;/code&gt;) before running CLI commands, or rely on tooling in your build chain. (&lt;a href="https://www.prisma.io/docs/orm/reference/prisma-config-reference" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prisma Client generation
&lt;/h3&gt;

&lt;p&gt;After updating schema and config, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx prisma generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should generate the updated Prisma Client (in your chosen output directory), now based on the Rust-free, JS/TS implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Update imports and code usage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Modify import paths: if you previously imported from &lt;code&gt;@prisma/client&lt;/code&gt;, you may need to change to the new output path, e.g.:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PrismaClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./generated/prisma/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(or whatever relative path fits your project) (&lt;a href="https://github.com/better-auth/better-auth/issues/6112" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you used any driver-specific features, native-engine assumptions, binary targets, or engine-specific configs, review and adjust. The new Rust-free client may require driver adapters for certain databases (e.g. for PostgreSQL, SQLite, etc.), depending on your setup. (&lt;a href="https://www.prisma.io/blog/rust-free-prisma-orm-is-ready-for-production" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Test &amp;amp; verify
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run your application + test suite (if any).&lt;/li&gt;
&lt;li&gt;Test queries, migrations, type safety, and especially database interactions (reads/writes) to ensure nothing broke.&lt;/li&gt;
&lt;li&gt;If you use migrations (&lt;code&gt;prisma migrate&lt;/code&gt;), verify that migrations still run and schema sync is correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Clean up old config / dependencies (optional)
&lt;/h3&gt;

&lt;p&gt;If you had old settings (e.g. &lt;code&gt;binaryTargets&lt;/code&gt;, &lt;code&gt;previewFeatures&lt;/code&gt; related to legacy Rust engine, custom output paths, etc.), you can clean them up now, since v7’s defaults already incorporate many improvements (ESM, new generator, etc.).&lt;/p&gt;

&lt;p&gt;Also review &lt;code&gt;.gitignore&lt;/code&gt;, build configs, bundler settings, runtime environment configs — to ensure that the new generated client and config file are properly integrated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Pitfalls &amp;amp; What to Watch Out For
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Import paths&lt;/strong&gt;: If you use a custom output directory, importing from &lt;code&gt;@prisma/client&lt;/code&gt; will likely break — make sure to update imports. (&lt;a href="https://github.com/better-auth/better-auth/issues/6112" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variable loading&lt;/strong&gt;: Because Prisma no longer auto-loads &lt;code&gt;.env&lt;/code&gt; in config, you may need to manually load env variables (e.g. via &lt;code&gt;dotenv&lt;/code&gt;) depending on your setup. (&lt;a href="https://www.prisma.io/docs/orm/reference/prisma-config-reference" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Driver adapters for some DBs&lt;/strong&gt;: With the removal of the Rust engine, Prisma now may require explicit driver adapters (depending on the database) — so double-check dependencies if you use non-default databases. (&lt;a href="https://www.prisma.io/blog/rust-free-prisma-orm-is-ready-for-production" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breaking changes in schema / generator&lt;/strong&gt;: Changing the generator provider, output path, or config structure could affect build tools, watchers, deployment scripts, or CI/CD pipelines. Plan accordingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test thoroughly&lt;/strong&gt;: For apps with many models/relations (like e-commerce), there might be edge cases — ensure sufficient testing before rolling out to production.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example Migration (Minimal Project) — Before &amp;amp; After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before (v6)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;package.json&lt;/code&gt; with dependencies: &lt;code&gt;"prisma": "^6.x"&lt;/code&gt;, &lt;code&gt;"@prisma/client": "^6.x"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prisma/schema.prisma&lt;/code&gt; with generator:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generator client {
  provider      = "prisma-client-js"
  engineType    = "binary"
  output        = "./generated"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Code import:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PrismaClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@prisma/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PrismaClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After (v7)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Update dependencies to v7.&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;generator&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generator client {
  provider = "prisma-client"
  // (optionally specify output path)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;prisma.config.ts&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prisma/config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;classic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;datasource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prisma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;schema.prisma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Regenerate client:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx prisma generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Update code import:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PrismaClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./generated/prisma/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PrismaClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run and test — ensure database queries &amp;amp; migrations work as before.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Should You Upgrade Now? My Recommendation
&lt;/h2&gt;

&lt;p&gt;If you are working on a &lt;strong&gt;medium-to-large project&lt;/strong&gt;, especially with &lt;strong&gt;TypeScript + complex schema + potential for serverless/edge deployment&lt;/strong&gt;, then &lt;strong&gt;yes — upgrading to Prisma v7 is worth it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The performance improvements, smaller bundle size, simpler deployment, and improved DX make it a strong win. For smaller projects or quick prototypes, you may also benefit, but the migration overhead should be weighed.&lt;/p&gt;

&lt;p&gt;If you have a &lt;strong&gt;complex existing codebase with many dependencies&lt;/strong&gt;, plan a &lt;strong&gt;staged migration&lt;/strong&gt; (e.g. a branch, thorough testing) before rolling out to production — especially if you use custom schema structure, custom DB drivers, or special build/deploy configs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Prisma ORM v7 is a major evolution: a fully Rust-free, JS/TS-native client; better performance; modern project structure; improved type safety; and better fit for modern runtime environments. Migrating from v6 → v7 requires a few steps (dependency bump, schema generator update, config file, import paths changes), but nothing too drastic — given proper testing, most projects should migrate smoothly and benefit greatly.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

</description>
      <category>webdev</category>
      <category>prisma</category>
      <category>orm</category>
      <category>database</category>
    </item>
    <item>
      <title>Top AI-Powered IDEs for Vibe Coding in 2025</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Tue, 25 Nov 2025 07:10:28 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/top-ai-powered-ides-for-vibe-coding-in-2025-3haa</link>
      <guid>https://dev.to/tahmidbintaslim/top-ai-powered-ides-for-vibe-coding-in-2025-3haa</guid>
      <description>&lt;p&gt;Vibe coding, where developers use natural language to guide AI in generating, editing, and testing code, has exploded with agentic tools that handle complex tasks autonomously. Research suggests the leading options balance intuitive AI assistance with robust performance, though no single IDE dominates due to varying user needs and rapid advancements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor stands out for seamless agentic workflows&lt;/strong&gt;, making it ideal for developers seeking a balance of speed and control in vibe coding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Antigravity emerges as a strong contender for advanced agent orchestration&lt;/strong&gt;, especially for those prioritizing free access and multi-model integration, but it may have minor glitches in early previews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code with GitHub Copilot remains a reliable foundation&lt;/strong&gt;, offering broad extensibility for AI features, though it requires setup for full agentic capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zed excels in performance and collaboration&lt;/strong&gt;, appealing to teams needing fast, offline AI assistance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other notables like Windsurf, Tabnine, PearAI, Trae, and AWS Kiro provide specialized strengths&lt;/strong&gt;, such as privacy-focused suggestions or structured vibe-to-production pipelines, with free tiers available in many cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Key Considerations for Choosing an IDE
&lt;/h4&gt;

&lt;p&gt;When selecting a vibe code IDE, consider your workflow: Beginners might prefer Cursor's intuitive chat modes, while enterprises could lean toward Tabnine's secure, customizable agents. Pricing ranges from free (e.g., Antigravity preview, VS Code) to $40/month for premium features. Always test for compatibility with your languages and hardware, as performance varies.&lt;/p&gt;

&lt;h4&gt;
  
  
  Emerging Trends
&lt;/h4&gt;

&lt;p&gt;The evidence leans toward agentic IDEs becoming standard, with tools like Antigravity and Kiro addressing "chaos" in casual vibe coding by adding structure. For more, explore official sites like &lt;a href="https://cursor.com" rel="noopener noreferrer"&gt;cursor.com&lt;/a&gt; for Cursor or &lt;a href="https://antigravity.google" rel="noopener noreferrer"&gt;antigravity.google&lt;/a&gt; for Google's offering.&lt;/p&gt;




&lt;h3&gt;
  
  
  A Comprehensive Guide to Top Vibe Code IDEs: Comparing AI-Powered Editors in 2025
&lt;/h3&gt;

&lt;p&gt;In the fast-evolving landscape of software development, "vibe coding" has become a buzzword synonymous with intuitive, AI-driven programming. This approach allows developers to describe ideas in natural language, letting AI agents handle the intricacies of code generation, debugging, testing, and deployment. By November 2025, vibe coding has shifted from a niche trend to a mainstream practice, fueled by advancements in large language models (LLMs) and agentic systems. Tools like Google's Antigravity and Cursor are often hailed as pioneers, enabling "flow-state" coding where human creativity meets AI execution.&lt;/p&gt;

&lt;p&gt;This in-depth comparison draws from recent reviews, official documentation, and community discussions on platforms like X (formerly Twitter). We'll evaluate nine leading IDEs: Visual Studio Code (with GitHub Copilot), Cursor, Google Antigravity, Zed, Windsurf (formerly associated with Codeium), Tabnine, PearAI, Trae, and AWS Kiro. Criteria include features, AI integration, performance, pricing, supported languages and environments, pros/cons, and suitability for vibe coding. While VS Code provides a solid baseline, newer agentic IDEs like Antigravity and Kiro push boundaries by automating entire workflows, though they introduce complexities like model dependency and occasional glitches.&lt;/p&gt;

&lt;h4&gt;
  
  
  Understanding Vibe Coding and Its Role in Modern Development
&lt;/h4&gt;

&lt;p&gt;Vibe coding emphasizes casual, descriptive inputs over traditional syntax-heavy programming. For instance, a user might say, "Build a responsive webpage with a login form and test it in the browser," and the IDE's agents would plan, code, execute, and verify. Discussions on X highlight its appeal for rapid prototyping, with posts noting how tools like Antigravity enable "developer superpowers" by integrating browser control and artifact generation. However, critics point to potential "chaos" in unstructured vibe sessions, which IDEs like Kiro address through automated planning and checks.&lt;/p&gt;

&lt;p&gt;This style suits solo developers, teams, and even non-coders entering tech, but it requires reliable AI to avoid errors. In 2025, most top IDEs support multiple LLMs (e.g., Gemini 3 Pro, Claude Sonnet 4.5, GPT-5), allowing flexibility. Community feedback suggests vibe coding boosts productivity by 30-50% in prototyping but demands verification for production code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Detailed Comparisons of Top IDEs
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1. Visual Studio Code (VS Code) with GitHub Copilot
&lt;/h5&gt;

&lt;p&gt;VS Code, Microsoft's free, open-source editor, serves as the foundation for many AI-enhanced workflows. With GitHub Copilot, it transforms into a vibe coding powerhouse.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Built-in Git support, customizable UI, remote development, multibuffer editing. Copilot adds autocomplete, code generation from comments, chat for explanations, and agent mode for multi-step tasks like refactoring or endpoint implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Supports extensions like Copilot, Claude Code, and Gemini. Agent sessions handle codebase indexing, terminal commands, and cloud delegation for async tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Lightweight and fast, with low latency; excels in large codebases via GPU acceleration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free for VS Code; Copilot: Free for students/open-source, $10/month Individual, $19/user/month Business.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Nearly all languages; runs on macOS, Windows, Linux, and web (vscode.dev).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Vast ecosystem, reliable for enterprises; Cons: Requires extension setup for full agentic features, less "out-of-the-box" than dedicated AI IDEs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: Excellent entry point; natural language chats enable intuitive edits, though not as agent-focused as Cursor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  2. Cursor
&lt;/h5&gt;

&lt;p&gt;Cursor, a fork of VS Code, is tailored for AI-first coding and often tops lists for vibe workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Three modes (Agent, Ask, Manual); chat interface, multi-file editing, bug identification, terminal autocompletion. Includes codebase embeddings for context recall and custom commands (e.g., code-review).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Delegates tasks to agents using models from OpenAI, Anthropic, Gemini, xAI; supports scoped changes and multi-line predictions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Smooth and responsive, with rapid autocomplete; built for productivity in complex projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: 14-day Pro trial; Pro: $20/month; Business: $40/user/month; API key integration for custom models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: All major languages; macOS, Windows, Linux; integrates with Slack and mobile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Clean interface, powerful for understanding codebases; Cons: Learning curve for modes, manual copy-paste in some setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: High; agentic modes allow natural language delegation, making it a "game-changer" for flow-state coding.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  3. Google Antigravity
&lt;/h5&gt;

&lt;p&gt;Launched in late 2025, Antigravity is Google's agent-first IDE, built for Gemini 3 Pro and positioned as a "Cursor killer."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Editor view for tab completions, Manager surface for agent orchestration, task delegation (e.g., feature writing, bug fixes), artifacts (screenshots, plans) for verification, knowledge base for learning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Autonomous agents handle editor, terminal, browser tasks; supports Gemini 3 Pro, Claude Sonnet 4.5, GPT-OSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Cross-platform; smooth for most, but early glitches in browser subagent noted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free in public preview.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Broad support; macOS, Windows, Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Free, superior models, elegant agent management; Cons: Some glitches, requires Google account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: Exceptional; enables "next-level" vibe coding with browser integration and verifiable outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  4. Zed
&lt;/h5&gt;

&lt;p&gt;Zed focuses on speed and collaboration, integrating AI without vendor lock-in.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Multiplayer editing, built-in terminal, Vim bindings, outline view, custom snippets, Markdown preview.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: LLM support for code generation/transform/analysis; works with any agent, including local Ollama models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Blazing-fast (Rust-based), offline-first, low latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free; paid APIs for premium models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Via Language Server Protocol; macOS, Linux, Windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Exceptional speed, collaborative; Cons: Less feature-rich for non-AI tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: Strong for teams; context-aware AI aids intuitive editing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  5. Windsurf (Codeium IDE)
&lt;/h5&gt;

&lt;p&gt;Windsurf, evolving from Codeium, offers "agentic" assistance in a VS Code fork.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Cascade agent for scripts/iterations, AI Flows, live previews, MCP support, drag-and-drop images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Modes (Write, Chat, Legacy); anticipates needs, runs tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Feature-rich but with a learning curve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free with 2-week Pro; Pro: $15/month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Major languages; JetBrains integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Advanced automation; Cons: Complex interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: Ideal for synchronized workflows; "agentic" features enhance vibe sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  6. Tabnine
&lt;/h5&gt;

&lt;p&gt;Tabnine emphasizes privacy and enterprise customization as an AI assistant.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Code suggestions, test creation, explanations, fixes; Org-Native Agents for SDLC stages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Context-aware with repository history; supports multiple LLMs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Accurate in enterprise settings; secure deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Not specified; enterprise-focused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Wide range, including VS Code, IntelliJ, Eclipse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Privacy champion, adapts to styles; Cons: Less agentic than IDEs like Cursor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: Good for secure vibe inputs; fine-tuned models align with org standards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  7. PearAI
&lt;/h5&gt;

&lt;p&gt;PearAI is a browser-friendly editor with deep context awareness.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Router for best models, Agent for bug fixes, Creator for projects, Markdown/Jupyter support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Modes for chat/write/refactor; collaborative intelligence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Clean, zen-like; good for onboarding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free trial; Pro: $15/month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Broad; downloadable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Privacy-focused, easy for juniors; Cons: Some features coming soon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: High; acts as an "intellectual collaborator" for natural language tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  8. Trae
&lt;/h5&gt;

&lt;p&gt;Trae provides a distraction-free environment with analytical AI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Explains/refactors code, PR reviews, multi-file support, real-time previews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Analytical partner for complex problems; handles complete statements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Sophisticated but understated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Major languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Robust for research; Cons: Limited details available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: Solid; free AI for debugging and explanations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  9. AWS Kiro
&lt;/h5&gt;

&lt;p&gt;Kiro targets structured vibe coding, moving prototypes to production.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Prompt breakdown, auto-plans/blueprints, MCP support, agentic chat, code checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Agents for tasks; steering rules for behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Reduces boilerplate; excels in team alignment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free preview (50 interactions/month); Pro: $19/user/month (1,000); Pro+: $39 (3,000).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages/IDEs&lt;/strong&gt;: Broad; AWS ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros/Cons&lt;/strong&gt;: Pros: Ends "chaos"; Cons: Interaction limits in free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Suitability&lt;/strong&gt;: Excellent for maturing vibe ideas; adds rigor to casual inputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Comparative Table: Key Metrics at a Glance
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;IDE&lt;/th&gt;
&lt;th&gt;Pricing (Starting)&lt;/th&gt;
&lt;th&gt;AI Focus (Agentic/Autocomplete)&lt;/th&gt;
&lt;th&gt;Performance Highlights&lt;/th&gt;
&lt;th&gt;Best For Vibe Coding?&lt;/th&gt;
&lt;th&gt;Supported Platforms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VS Code + Copilot&lt;/td&gt;
&lt;td&gt;Free / $10/mo&lt;/td&gt;
&lt;td&gt;Both; multi-step agents&lt;/td&gt;
&lt;td&gt;Lightweight, extensible&lt;/td&gt;
&lt;td&gt;Entry-level intuition&lt;/td&gt;
&lt;td&gt;All major OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;High agentic; codebase recall&lt;/td&gt;
&lt;td&gt;Responsive, multi-file&lt;/td&gt;
&lt;td&gt;Flow-state delegation&lt;/td&gt;
&lt;td&gt;macOS/Win/Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Antigravity&lt;/td&gt;
&lt;td&gt;Free (preview)&lt;/td&gt;
&lt;td&gt;Agent orchestration; browser&lt;/td&gt;
&lt;td&gt;Smooth with glitches&lt;/td&gt;
&lt;td&gt;Advanced automation&lt;/td&gt;
&lt;td&gt;All major OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zed&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Flexible LLM integration&lt;/td&gt;
&lt;td&gt;Ultra-fast, offline&lt;/td&gt;
&lt;td&gt;Team collaboration&lt;/td&gt;
&lt;td&gt;macOS/Linux/Win&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windsurf&lt;/td&gt;
&lt;td&gt;$15/mo&lt;/td&gt;
&lt;td&gt;Agentic flows; iterations&lt;/td&gt;
&lt;td&gt;Feature-rich&lt;/td&gt;
&lt;td&gt;Workflow synchronization&lt;/td&gt;
&lt;td&gt;JetBrains+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tabnine&lt;/td&gt;
&lt;td&gt;Enterprise-varies&lt;/td&gt;
&lt;td&gt;Context-aware suggestions&lt;/td&gt;
&lt;td&gt;Secure, accurate&lt;/td&gt;
&lt;td&gt;Privacy-sensitive&lt;/td&gt;
&lt;td&gt;Multiple IDEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PearAI&lt;/td&gt;
&lt;td&gt;$15/mo&lt;/td&gt;
&lt;td&gt;Collaborative agents&lt;/td&gt;
&lt;td&gt;Clean, context-deep&lt;/td&gt;
&lt;td&gt;Onboarding juniors&lt;/td&gt;
&lt;td&gt;Downloadable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trae&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Analytical refactoring&lt;/td&gt;
&lt;td&gt;Distraction-free&lt;/td&gt;
&lt;td&gt;Research-oriented&lt;/td&gt;
&lt;td&gt;Broad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kiro&lt;/td&gt;
&lt;td&gt;Free / $19/mo&lt;/td&gt;
&lt;td&gt;Structured prompts; checks&lt;/td&gt;
&lt;td&gt;Reduces debt&lt;/td&gt;
&lt;td&gt;Prototype to prod&lt;/td&gt;
&lt;td&gt;AWS-integrated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Challenges and Future Outlook
&lt;/h4&gt;

&lt;p&gt;While these IDEs empower vibe coding, challenges persist: Dependency on cloud models raises privacy concerns (addressed by Tabnine's air-gapped options), and glitches in new tools like Antigravity highlight preview-stage risks. Community sentiment on X leans positive, with users praising Antigravity for "vibe coding for real" but noting resource usage. Looking ahead, expect deeper on-chain integrations (e.g., InfinityG AI's Web3 vibe coding) and hybrid local-cloud models.&lt;/p&gt;

&lt;p&gt;In summary, Cursor and Antigravity lead for pure vibe experiences, while VS Code offers versatility. Test multiple to find your fit—vibe coding's future is bright, but grounded in thoughtful tool selection.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Citations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.qodo.ai/blog/best-ai-coding-assistant-tools/" rel="noopener noreferrer"&gt;20 Best AI Coding Assistant Tools [Updated Aug 2025] - Qodo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.devgenius.io/i-tested-12-ai-coding-tools-so-you-dont-have-to-the-ultimate-2025-developer-s-guide-867aac83fb6c" rel="noopener noreferrer"&gt;I Tested 12 AI Coding Tools So You Don't Have To - Dev Genius&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.f22labs.com/blogs/7-best-ai-code-editors-in-2025/" rel="noopener noreferrer"&gt;7 Best AI Code Editors in 2025 - F22 Labs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/en/build-with-google-antigravity-our-new-agentic-development-platform/" rel="noopener noreferrer"&gt;Build with Google Antigravity - Google Developers Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/ai-software-engineer/i-tested-new-google-antigravity-ide-and-discovered-the-real-cursor-killer-96ffa7e55026" rel="noopener noreferrer"&gt;I Tested (New) Google Antigravity IDE - Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/features" rel="noopener noreferrer"&gt;Cursor Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zed.dev/" rel="noopener noreferrer"&gt;Zed Editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tabnine.com/" rel="noopener noreferrer"&gt;Tabnine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeium.com/" rel="noopener noreferrer"&gt;Codeium/Windsurf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://trypear.ai/" rel="noopener noreferrer"&gt;PearAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.trae.ai/" rel="noopener noreferrer"&gt;Trae AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techradar.com/pro/aws-launches-kiro-an-agentic-ai-ide-to-end-the-chaos-of-vibe-coding" rel="noopener noreferrer"&gt;AWS Kiro Launch - TechRadar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Easy Steps to Learn Machine Learning for Python Beginners</title>
      <dc:creator>Tahmid Bin Taslim Rafi</dc:creator>
      <pubDate>Sun, 15 Jun 2025 09:45:45 +0000</pubDate>
      <link>https://dev.to/tahmidbintaslim/easy-steps-to-learn-machine-learning-for-python-beginners-4o86</link>
      <guid>https://dev.to/tahmidbintaslim/easy-steps-to-learn-machine-learning-for-python-beginners-4o86</guid>
      <description>&lt;p&gt;Welcome to the world of &lt;strong&gt;Machine Learning (ML)&lt;/strong&gt;! If you’re just starting and know the basics of Python, you’re in the perfect spot. Machine learning can sound intimidating, but with a step-by-step approach, it becomes both fun and rewarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 What is Machine Learning?
&lt;/h3&gt;

&lt;p&gt;At its core, &lt;strong&gt;machine learning&lt;/strong&gt; is the process of teaching computers to learn from data — and then make predictions or decisions without being explicitly programmed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;📌 Think of it like teaching a child to recognize fruits: show enough examples of apples and bananas, and they’ll eventually distinguish between them even with new, unseen examples.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🔍 Types of Machine Learning
&lt;/h3&gt;

&lt;p&gt;Let’s break it down:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Supervised Learning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Think:&lt;/strong&gt; Learning with a teacher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; Labeled (input → output).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Predicting house prices based on size and location.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Unsupervised Learning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Think:&lt;/strong&gt; Learning without a teacher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; Unlabeled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Grouping customers into clusters based on purchasing behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Reinforcement Learning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Think:&lt;/strong&gt; Learning by trial and error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment:&lt;/strong&gt; Reward-based feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; A robot learning to walk by receiving rewards for staying balanced.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Key Concepts to Understand
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt; : The input variables (e.g., age, salary).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Labels&lt;/strong&gt; : The output you want to predict (e.g., will buy or not).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training vs. Testing&lt;/strong&gt; :&lt;/li&gt;
&lt;li&gt;Train your model on one part of the data.&lt;/li&gt;
&lt;li&gt;Test how well it performs on unseen data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Evaluation&lt;/strong&gt; :&lt;/li&gt;
&lt;li&gt;Use metrics like &lt;strong&gt;Accuracy&lt;/strong&gt; , &lt;strong&gt;Precision&lt;/strong&gt; , &lt;strong&gt;Recall&lt;/strong&gt; , and &lt;strong&gt;F1-Score&lt;/strong&gt; depending on your task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ Step-by-Step: Building a Machine Learning Model
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Data Collection&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use CSV files, APIs, databases, or scrape data from websites.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Data Preprocessing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handle missing data&lt;/li&gt;
&lt;li&gt;Encode categorical variables&lt;/li&gt;
&lt;li&gt;Scale features (e.g., normalization)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Choose a Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with simple ones: Linear Regression, KNN, Decision Trees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Train the Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fit your model on the training dataset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Evaluate&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test the model’s performance on test data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Tune Hyperparameters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use grid search or cross-validation to improve performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7. Deploy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save and use your model to predict new, real-world data!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧰 Tools and Libraries for Python Beginners
&lt;/h3&gt;

&lt;p&gt;Task Library Data Handling pandas, numpy Visualization matplotlib, seaborn ML Models scikit-learn Deep Learning (later) tensorflow, keras, pytorch&lt;/p&gt;

&lt;h3&gt;
  
  
  📚 Top Resources to Learn ML with Python
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Courses:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/learn/machine-learning" rel="noopener noreferrer"&gt;Coursera — Andrew Ng’s ML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/machinelearning/" rel="noopener noreferrer"&gt;Udemy — Machine Learning A-Z&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/machine-learning/crash-course" rel="noopener noreferrer"&gt;Google’s ML Crash Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Books:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Hands-On ML with Scikit-Learn, Keras, and TensorFlow&lt;/em&gt; by Aurélien Géron&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Python Machine Learning&lt;/em&gt; by Sebastian Raschka&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Websites:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://towardsdatascience.com/" rel="noopener noreferrer"&gt;Towards Data Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kdnuggets.com/" rel="noopener noreferrer"&gt;KDnuggets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.analyticsvidhya.com/" rel="noopener noreferrer"&gt;Analytics Vidhya&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communities:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/learnmachinelearning/" rel="noopener noreferrer"&gt;r/learnmachinelearning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/" rel="noopener noreferrer"&gt;Kaggle Forums&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Final Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Practice with datasets from &lt;a href="https://www.kaggle.com/" rel="noopener noreferrer"&gt;Kaggle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Start small: Try Titanic survival prediction or digit recognition&lt;/li&gt;
&lt;li&gt;Don’t memorize — understand!&lt;/li&gt;
&lt;li&gt;Keep experimenting 🧪&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Ready to Get Started?
&lt;/h3&gt;

&lt;p&gt;Machine learning is a journey. Start small, keep learning, and apply your skills to real-world problems. Python gives you the tools — all you need is curiosity and consistency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;✨&lt;/em&gt; “The best way to learn is by doing.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>machinelearning</category>
      <category>datascience</category>
      <category>python</category>
      <category>artificialintelligen</category>
    </item>
  </channel>
</rss>
