<?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: no7software</title>
    <description>The latest articles on DEV Community by no7software (@no7software).</description>
    <link>https://dev.to/no7software</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%2F3925573%2F64bb2171-9910-4202-abcf-4b9609abb8df.png</url>
      <title>DEV Community: no7software</title>
      <link>https://dev.to/no7software</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/no7software"/>
    <language>en</language>
    <item>
      <title>Shopify CLI 4.0 Breaking Changes: Engineering Migration (2026)</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Fri, 22 May 2026 15:26:10 +0000</pubDate>
      <link>https://dev.to/no7software-uk/shopify-cli-40-breaking-changes-engineering-migration-2026-1ppl</link>
      <guid>https://dev.to/no7software-uk/shopify-cli-40-breaking-changes-engineering-migration-2026-1ppl</guid>
      <description>&lt;p&gt;Shopify CLI 4.0 shipped on 21 May 2026 and the upgrade is not a routine bump. The release removes the &lt;code&gt;--force&lt;/code&gt; flag from &lt;code&gt;shopify app deploy&lt;/code&gt;, retires five legacy commands, and introduces automatic upgrades that engineering teams running production CI/CD pipelines must reckon with before the next deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Shopify CLI 4.0 actually ships
&lt;/h2&gt;

&lt;p&gt;Three concrete changes land at once. First, the CLI now follows &lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;Semantic Versioning&lt;/a&gt; — minor releases ship features, patch releases ship bug fixes, and majors signal breaking changes to command structure or behaviour. Second, starting with 4.0 the CLI upgrades itself automatically through the package manager you installed it with (npm, yarn, pnpm), and the upgrade is explicitly skipped inside CI, in project-local installs, and across major versions. Third, the &lt;code&gt;--force&lt;/code&gt; flag that previously short-circuited the safety prompt on &lt;code&gt;shopify app deploy&lt;/code&gt; and &lt;code&gt;shopify app release&lt;/code&gt; is gone — split into &lt;code&gt;--allow-updates&lt;/code&gt; and &lt;code&gt;--allow-deletes&lt;/code&gt; so high-risk operations are no longer hidden behind one ambiguous switch. The full release note lives at the &lt;a href="https://shopify.dev/changelog/shopify-cli-40-semver-auto-updates-removing-deprecated-flags-and-commands" rel="noopener noreferrer"&gt;Shopify Dev changelog entry&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the --force flag removal changes your deploy pipeline
&lt;/h2&gt;

&lt;p&gt;If your CI/CD pipeline currently runs &lt;code&gt;shopify app deploy --force&lt;/code&gt; on every merge, the next pipeline execution against CLI 4.0 will fail with an unrecognised-flag error and stall mid-deploy. The replacement is granular. &lt;code&gt;--allow-updates&lt;/code&gt; covers low-risk operations like adding a new extension or updating an existing one without manual confirmation. &lt;code&gt;--allow-deletes&lt;/code&gt; covers the high-risk path: removing an extension that already shipped, which the old &lt;code&gt;--force&lt;/code&gt; would have silently approved. The split exists because the CLI team measured that &lt;code&gt;--force&lt;/code&gt; hid every category of deploy operation behind the same prompt-bypass switch, and an accidental deletion of a production extension is irreversible.&lt;/p&gt;

&lt;p&gt;The migration is mechanical — find every CI/CD script using &lt;code&gt;--force&lt;/code&gt; and replace it with the explicit pair of flags appropriate to that pipeline. Most release pipelines we ship for client engagements use &lt;code&gt;--allow-updates&lt;/code&gt; alone, and reserve &lt;code&gt;--allow-deletes&lt;/code&gt; for a separate, manually-triggered cleanup job that runs against a feature branch before its production cutover.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five deprecated commands you must replace in 2026
&lt;/h2&gt;

&lt;p&gt;The 4.0 release also drops five legacy command and flag shapes. Each has a 1:1 modern replacement, and pinning to the new form before the upgrade is the safest order of operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shopify CLI 4.0 removed commands and replacements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Removed (pre-4.0)&lt;/th&gt;
&lt;th&gt;Replacement (4.0+)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;shopify webhook trigger&lt;/td&gt;
&lt;td&gt;shopify app webhook trigger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shopify theme serve&lt;/td&gt;
&lt;td&gt;shopify theme dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shopify app generate schema&lt;/td&gt;
&lt;td&gt;shopify app function schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shopify app webhook trigger --shared-secret&lt;/td&gt;
&lt;td&gt;--client-secret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shopify app generate extension --type&lt;/td&gt;
&lt;td&gt;--template&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;shopify theme serve&lt;/code&gt; → &lt;code&gt;shopify theme dev&lt;/code&gt; rename is the one most likely to silently break legacy npm scripts. We have seen &lt;code&gt;package.json&lt;/code&gt; scripts in client repos that still alias &lt;code&gt;"theme:serve": "shopify theme serve"&lt;/code&gt; three years after the command was first deprecated. A repo-wide grep for the removed forms before you bump the CLI version saves the panic when a developer hits "start dev" on Monday and the command no longer exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to handle the new auto-upgrade behaviour in CI/CD
&lt;/h2&gt;

&lt;p&gt;The auto-upgrade default deserves a separate look because the consequences differ between local developer machines and CI runners. On a local install, the CLI will detect a newer minor or patch version and upgrade through the original package manager during the next invocation. That is convenient for ad-hoc work but unpredictable in a release window — a developer demoing on Friday afternoon does not want the CLI silently bumping mid-deploy.&lt;/p&gt;

&lt;p&gt;Inside CI, auto-upgrade is skipped by default; CI containers respect their pinned &lt;code&gt;shopify-cli&lt;/code&gt; version. Project-local installs (where the CLI lives inside the repo's &lt;code&gt;node_modules&lt;/code&gt;) also skip auto-upgrade because the project manifest is the source of truth. Major version upgrades are skipped everywhere — the 4.0 → 5.0 jump will require an explicit opt-in. If you want to disable auto-upgrade outright on a developer machine, the &lt;a href="https://shopify.dev/docs/api/shopify-cli" rel="noopener noreferrer"&gt;Shopify CLI documentation&lt;/a&gt; documents &lt;code&gt;shopify config autoupgrade off&lt;/code&gt; as the off switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  SemVer: what it means for future minor and major upgrades
&lt;/h2&gt;

&lt;p&gt;The CLI moving to SemVer is the quietly important change. Until 4.0, version numbers carried no contract — a "minor" bump could break commands and a "patch" could ship a feature. Going forward, a 4.x → 4.y bump (minor) ships features without breaking changes, a 4.x.y → 4.x.z bump (patch) ships bug fixes only, and any breaking change waits for a 5.0 release with explicit migration notes. For engineering teams running production deploys behind a CLI version constraint, this is the green light to pin to &lt;code&gt;^4.0.0&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt; and trust that minor-version bumps will not break the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  How should engineering teams sequence the CLI 4.0 migration?
&lt;/h2&gt;

&lt;p&gt;The right order minimises blast radius. Step one: audit every CI/CD pipeline and every developer's local &lt;code&gt;package.json&lt;/code&gt; for the five removed commands and the &lt;code&gt;--force&lt;/code&gt; flag. Step two: replace them with the modern equivalents while still on CLI 3.x — every replacement is back-compatible with the older CLI. Step three: bump to CLI 4.0 in a feature branch, run a full deploy dry-run against a development store, and confirm the &lt;code&gt;--allow-updates&lt;/code&gt;/&lt;code&gt;--allow-deletes&lt;/code&gt; behaviour matches the operational intent. Step four: pin &lt;code&gt;^4.0.0&lt;/code&gt; in your engineering repo manifest and roll the update out to production CI runners. We typically see a full agency-grade migration land inside one engineering day for a single-app team, and 2-3 days when the rollout spans multiple Shopify Plus stores with different CI pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;p&gt;If your CI/CD pipelines deploy Shopify apps weekly or more often, the &lt;code&gt;--force&lt;/code&gt; removal is the change that warrants action this week — the next pipeline execution against CLI 4.0 will fail without it. If your team is on the Shopify AI Toolkit + Claude Code path covered in our &lt;a href="https://no7software.co.uk/blog/shopify-ai-toolkit-claude-code-production" rel="noopener noreferrer"&gt;production guide&lt;/a&gt;, audit the AI agent's CLI invocations as well: agentic deploy workflows that learned the pre-4.0 command shapes will hit the same deprecation wall. For teams running custom MCP integrations, our &lt;a href="https://no7software.co.uk/blog/shopify-mcp-server-implementation-guide" rel="noopener noreferrer"&gt;MCP server implementation guide&lt;/a&gt; covers the adjacent CLI flow most often paired with custom apps.&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>webdev</category>
      <category>programming</category>
      <category>cli</category>
    </item>
    <item>
      <title>Anchor Loyalty is Live on the Shopify App Store (2026)</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Fri, 22 May 2026 10:03:50 +0000</pubDate>
      <link>https://dev.to/no7software-uk/anchor-loyalty-is-live-on-the-shopify-app-store-2026-3g75</link>
      <guid>https://dev.to/no7software-uk/anchor-loyalty-is-live-on-the-shopify-app-store-2026-3g75</guid>
      <description>&lt;p&gt;Anchor Loyalty &amp;amp; Rewards is live on the Shopify App Store. The Shopify App Store launch ships a Shopify loyalty app with points, VIP tiers, two-sided referrals, and a signed API for Hydrogen and other headless storefronts. Free plan included, paid tiers from around 14.99 USD per month, and the same loyalty data renders identically across admin, theme block, checkout extension, and customer account block.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ships in the Shopify App Store launch
&lt;/h2&gt;

&lt;p&gt;The listing at &lt;a href="https://apps.shopify.com/anchor-loyalty" rel="noopener noreferrer"&gt;apps.shopify.com/anchor-loyalty&lt;/a&gt; ships four loyalty primitives merchants asked for. Points for purchases, referrals, signups, and spending milestones. VIP tiers with per-tier point multipliers and exclusive rewards. Two-sided referrals that reward both the inviter and the new customer in the same flow. Welcome bonus on signup. The Shopify App Store listing copy describes Anchor as "a complete loyalty system" — that is the surface we built, not a placeholder.&lt;/p&gt;

&lt;p&gt;Anchor renders loyalty state inside the embedded admin, on the storefront via a native theme block, on the cart and checkout via a Shopify Checkout UI extension, and inside the customer account via the customer account block. Every surface reads from the same source of truth so the points balance on a product page matches the points balance on the order confirmation — no race conditions, no stale cache. Available in 32 languages out of the box (Arabic, German, Spanish, French, Hebrew, Hindi, Japanese, Korean, Polish, Portuguese (Brazil), Portuguese (Portugal), Russian, Thai, Turkish, Vietnamese, Simplified and Traditional Chinese, and more) — the same translation surface we use across our agency work powers the merchant-facing strings here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we built it on Hydrogen and headless from day one
&lt;/h2&gt;

&lt;p&gt;Our agency work is heavily Hydrogen and custom-storefront. We typically see a third of incoming Shopify Plus migrations land on a headless stack inside the first 18 months, and every loyalty app we have integrated has been the friction point: most apps ship a Liquid widget and a REST endpoint, neither of which compose cleanly with a React Server Components storefront. Anchor was architected the other way around. The data layer is a signed-token API; the native theme block and checkout extension are consumers of that API, not the source. Hydrogen and other headless storefronts read the same data through the same signed API as the native storefront block.&lt;/p&gt;

&lt;p&gt;The practical consequence is concrete. A merchant running a Hydrogen storefront on Oxygen can render the points balance in a Server Component without proxying through a Liquid include. A customer account block on a native Online Store theme reads identical data. There is no fork between "native" and "headless" — the API surface is the canonical contract, and every UI block is a thin consumer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does Anchor pricing compare to the other Shopify loyalty apps?
&lt;/h2&gt;

&lt;p&gt;Three plans, billed in USD per the App Store listing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anchor Loyalty plans
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; up to 200 orders / month, up to 3 active rewards, customisable storefront widget, welcome bonus on signup, 32 languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth — around 14.99 USD / month (around 143.90 USD / year, saving 20%):&lt;/strong&gt; up to 1,000 orders / month, up to 10 active rewards, up to 3 VIP tiers, referral program. 14-day free trial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro — around 39.99 USD / month (around 383.90 USD / year, saving 20%):&lt;/strong&gt; unlimited orders, rewards, and tiers; spending milestones; Checkout UI Extension (Shopify Plus only); the headless and Hydrogen JavaScript SDK; "Powered by" branding removed; priority support. 14-day free trial.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free tier covers a real merchant — 200 orders a month with three active rewards is enough for a brand validating loyalty before committing to a paid plan. Growth is the typical first paid tier; Pro unlocks the headless SDK and the checkout extension, which is where most Shopify Plus stores will land.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does Anchor do that the dominant loyalty apps do not?
&lt;/h2&gt;

&lt;p&gt;The honest answer: we are entering a category with established incumbents (Smile.io, Recharge Loyalty,, the LoyaltyLion line), and the loyalty mechanic itself — points for purchases, tier multipliers, referrals — is mature. We did not invent a new loyalty primitive. We rebuilt the engineering surface around three constraints most loyalty apps ignore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, performance.&lt;/strong&gt; Our December 2025 reflection on &lt;a href="https://no7software.co.uk/blog/the-science-of-retention-how-anchor-loyalty-is-redefining-shopify-growth" rel="noopener noreferrer"&gt;the science of retention&lt;/a&gt; measured 200-400 ms of JavaScript page-load weight from popular loyalty widgets — a measurable conversion drag on every visit, not just loyalty-engaged sessions. Anchor's storefront widget loads asynchronously and does not block the critical render path; the points balance hydrates after the buy button is interactive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, headless parity.&lt;/strong&gt; Most loyalty apps ship a Liquid block and an unsigned REST endpoint. We ship a signed-token API as the canonical contract and consume it from every surface — admin, theme block, checkout extension, customer account, Hydrogen. No fork.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, theme block depth.&lt;/strong&gt; A loyalty surface buried three clicks deep in the customer account is invisible; a loyalty surface on the product page below the buy button is read. The native theme block is positioned for the latter pattern, and the customer account block is positioned for visible engagement rather than archival lookup.&lt;/p&gt;

&lt;h2&gt;
  
  
  How merchants install and configure Anchor
&lt;/h2&gt;

&lt;p&gt;Installation is the standard Shopify OAuth flow. Hit Install on the App Store listing, approve the requested scopes, and the embedded admin loads in around 5-10 seconds. The first-run flow walks through three steps: set the point-earning rate (default 1 point per 1 currency unit spent, adjustable per merchant), enable or skip VIP tiers, and enable or skip referrals. Every step has a sensible default — a brand-new merchant can install Anchor and ship the storefront block in well under 30 minutes.&lt;/p&gt;

&lt;p&gt;Anchor inherits the platform's compliance posture out of the box. Loyalty data is scoped to the merchant's tenant; we never touch cross-store data; the API tokens are signed per merchant and rotate on the same cadence Shopify's own session tokens do. Merchants on regulated stacks ask us this — the answer is the same one we publish in our &lt;a href="https://no7software.co.uk/blog/ecommerce-security-headers-guide" rel="noopener noreferrer"&gt;ecommerce security headers guide&lt;/a&gt;: defaults that fail closed, not open.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is on the immediate roadmap
&lt;/h2&gt;

&lt;p&gt;The launch surface is the floor, not the ceiling. The next three engineering quarters concentrate on four things. First, the headless JavaScript SDK that ships in the Pro tier — currently in alpha, generally available shortly after launch. Second, Shopify Flow triggers and actions so merchants can fire loyalty rewards from Flow workflows alongside the rest of their automation. Third, deeper segmentation that lets merchants run "dormant member re-engagement" campaigns from Anchor without exporting to a separate CRM. Fourth, a metafield-backed merchant API extension that exposes loyalty tier as a customer attribute so theme and Hydrogen code can branch on it natively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;p&gt;If your store is on Shopify or Shopify Plus, hit Install on &lt;a href="https://apps.shopify.com/anchor-loyalty" rel="noopener noreferrer"&gt;apps.shopify.com/anchor-loyalty&lt;/a&gt; and take the Free plan for a spin. Two hundred orders a month and three active rewards is enough to validate whether loyalty moves your numbers before you commit to a paid tier. If you are running Hydrogen or a custom storefront and you want the headless SDK preview, the Pro plan unlocks it; reach out to our team and we will walk you through the integration patterns we ship in our agency engagements.&lt;/p&gt;

&lt;p&gt;If you are still evaluating the loyalty category, the December 2025 reflection on &lt;a href="https://no7software.co.uk/blog/the-science-of-retention-how-anchor-loyalty-is-redefining-shopify-growth" rel="noopener noreferrer"&gt;how Anchor is redefining Shopify growth&lt;/a&gt; walks through what we learned about loyalty apps before we shipped — performance, integration depth, and the mechanics that actually move retention. It pairs with this launch announcement; one is the "why we built it" essay, this one is the "we built it; here is where to find it" page.&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>loyalty</category>
      <category>microservices</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>GitHub VS Code Extension Breach 2026: Engineering Response</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Thu, 21 May 2026 10:48:37 +0000</pubDate>
      <link>https://dev.to/no7software-uk/github-vs-code-extension-breach-2026-engineering-response-2bkp</link>
      <guid>https://dev.to/no7software-uk/github-vs-code-extension-breach-2026-engineering-response-2bkp</guid>
      <description>&lt;p&gt;GitHub's 20 May 2026 incident — around 3,800 internal repositories exfiltrated after a single poisoned VS Code extension compromised one employee device — confirms the github vs code extension breach pattern most security teams had ignored. The editor itself is now a supply-chain surface. The container, not the code, was the entry point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened in the GitHub VS Code extension breach on 20 May 2026
&lt;/h2&gt;

&lt;p&gt;GitHub's incident response thread on 20 May 2026 stated that a single employee device was compromised through a poisoned VS Code extension. The attacker reached around 3,800 GitHub-internal repositories before the endpoint was isolated. Critical secrets were rotated overnight, with the highest-impact credentials prioritised first.&lt;/p&gt;

&lt;p&gt;The blast radius was confined to internal repositories. GitHub stated there is no evidence of impact to customer information stored outside its internal estate — meaning the enterprises, organisations, and repositories owned by customers were not touched in the breach window. The published timeline shows the malicious extension version was removed, the endpoint was isolated, and incident response began on the same day the activity was detected. We typically see public companies take 4-7 days to acknowledge a breach of this size; GitHub's containment-to-disclosure window was roughly 24 hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a poisoned VS Code extension exfiltrates internal repositories
&lt;/h2&gt;

&lt;p&gt;The VS Code Marketplace hosts more than 60,000 published extensions and Microsoft's own &lt;a href="https://code.visualstudio.com/docs/editor/extension-marketplace" rel="noopener noreferrer"&gt;extension marketplace documentation&lt;/a&gt; notes that extensions run with the same operating-system privileges as the editor itself. There is no per-extension sandbox. An extension that ships a benign 1.0.0 release can quietly push 1.0.1 with a malicious payload, and every developer with auto-update enabled receives it on the next editor restart.&lt;/p&gt;

&lt;p&gt;The exfiltration chain is concrete. The poisoned extension reads files inside the user's workspace, scans the developer's shell history for tokens, and accesses any credentials cached by GitHub CLI (&lt;code&gt;gh auth token&lt;/code&gt;), Git Credential Manager, or the official GitHub Pull Requests and Issues extension. From there, the attacker has the same git push and API authority as the compromised engineer. If that engineer is part of an internal org with broad &lt;code&gt;repo&lt;/code&gt; scope, the attacker walks the org's repository graph and clones whatever the token can read.&lt;/p&gt;

&lt;p&gt;In our work with Shopify Plus and BigCommerce engineering teams, this is the model we see most teams completely underestimate. The token that lives inside &lt;code&gt;~/.config/gh/hosts.yml&lt;/code&gt; usually has scopes for every private app repo, every CI runner, and the build artefacts behind them. A single poisoned extension does not need malware, root access, or a network exploit — it just needs read access to a few well-known files in the developer's home directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is a supply-chain attack, not a credential leak
&lt;/h2&gt;

&lt;p&gt;The framing matters because the remediation is different. A credential leak — a single token posted in a Slack thread — gets fixed by rotating that one token. A supply-chain compromise inside the developer's editor means every credential, environment variable, or session token the engineer touches during the compromise window is potentially exposed.&lt;/p&gt;

&lt;p&gt;GitHub's response confirms this. The thread explicitly says "critical secrets were rotated yesterday and overnight with the highest-impact credentials prioritised first." That phrasing is not the language of single-token rotation. That is the language of a credential-rotation programme covering every secret the compromised engineer could plausibly have touched, prioritised by blast radius.&lt;/p&gt;

&lt;h2&gt;
  
  
  How should engineering teams audit their VS Code extension policy?
&lt;/h2&gt;

&lt;p&gt;Most engineering teams we audit have zero policy around VS Code extensions. The IDE is treated as a personal-productivity tool rather than a production-adjacent attack surface. After the GitHub breach, that posture is indefensible. There are four concrete questions every engineering lead should answer this week.&lt;/p&gt;

&lt;h3&gt;
  
  
  VS Code extension audit checklist (post-GitHub breach)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Which extensions are installed?&lt;/strong&gt; Run &lt;code&gt;code --list-extensions --show-versions&lt;/code&gt; on every developer workstation. Diff against an approved list. Unknown extensions become approved-or-removed within 48 hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who publishes each approved extension?&lt;/strong&gt; Pin to publishers you trust (Microsoft, ESLint, Prettier, established vendors). A 12,000-install extension from an anonymous publisher is a higher-risk surface than a 50-million-install extension from Microsoft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are extensions allowed to auto-update?&lt;/strong&gt; Default behaviour is yes. Disable &lt;code&gt;extensions.autoUpdate&lt;/code&gt; and pin specific versions in workspace-level &lt;code&gt;.vscode/extensions.json&lt;/code&gt; for client work so a poisoned 1.0.1 push cannot land without review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where are GitHub tokens cached?&lt;/strong&gt; Audit &lt;code&gt;~/.config/gh/&lt;/code&gt;, &lt;code&gt;~/.gitconfig&lt;/code&gt;, &lt;code&gt;~/.git-credentials&lt;/code&gt;, and any local &lt;code&gt;.env&lt;/code&gt; files. The attacker did not need root to read them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Detection patterns: what GitHub did right that most teams cannot replicate
&lt;/h2&gt;

&lt;p&gt;GitHub's response window — detection, containment, public disclosure within 24 hours — is exceptional. It is also unrepeatable for the vast majority of engineering teams. GitHub operates a dedicated security operations team with real-time endpoint telemetry, deep audit logs on every internal repository clone, and the institutional muscle memory to rotate thousands of secrets overnight.&lt;/p&gt;

&lt;p&gt;Your engineering team almost certainly cannot do any of that in under a week. The lesson is not "be more like GitHub" — it is "build the prevention layer because the response layer is unaffordable." Preventing the extension from running in the first place is roughly 100x cheaper than detecting that it ran and reconstructing what it touched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical hardening steps for Shopify and BigCommerce engineering teams
&lt;/h2&gt;

&lt;p&gt;The threat model maps directly onto eCommerce engineering work. If your team builds custom Shopify apps, Hydrogen storefronts, or BigCommerce headless integrations, the developer workstation holds API keys with deep access to client stores. A compromised workstation does not just leak a single token — it can rewrite published apps, push malicious storefront commits, or exfiltrate customer data via API calls that look entirely legitimate to the platform.&lt;/p&gt;

&lt;p&gt;The remediation is procedural, not technical. Most of it costs around £0 to implement and takes a single sprint.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Allowlist extensions per repository.&lt;/strong&gt; Commit a &lt;code&gt;.vscode/extensions.json&lt;/code&gt; with the recommended list, and disable auto-update for the workspace. New extensions require a PR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use scoped tokens, never personal access tokens.&lt;/strong&gt; Generate fine-grained tokens per repository with the minimum required scopes — &lt;code&gt;contents:read&lt;/code&gt; only for read paths, &lt;code&gt;contents:write&lt;/code&gt; only where push is genuinely needed. Personal access tokens with &lt;code&gt;repo&lt;/code&gt; scope are an unbounded liability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate the GitHub CLI auth token monthly.&lt;/strong&gt; Run &lt;code&gt;gh auth refresh&lt;/code&gt; on a scheduled job. A token that lives for six months has six months of exposure if a single extension goes bad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate the workstation from the production-token environment.&lt;/strong&gt; Production deployment credentials should live in CI runners with short-lived OIDC-issued tokens, not on the engineer's laptop. We cover the pattern in our &lt;a href="https://no7software.co.uk/blog/shopify-ai-toolkit-claude-code-production" rel="noopener noreferrer"&gt;Shopify AI Toolkit production guide&lt;/a&gt; — the same separation applies to any agent-driven workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does this affect AI-assistant integrations like Claude Code and Copilot?
&lt;/h2&gt;

&lt;p&gt;The GitHub incident reframes a question we get often: is it safe to give an AI assistant — Claude Code, GitHub Copilot, Cursor, the &lt;a href="https://no7software.co.uk/blog/shopify-mcp-server-implementation-guide" rel="noopener noreferrer"&gt;Shopify Dev MCP server&lt;/a&gt; — access to your engineering workstation? The answer is not "no". The answer is "only with the same hardening you would apply to any other extension."&lt;/p&gt;

&lt;p&gt;AI-assistant extensions are software extensions. They run with the editor's privileges. They have read access to your workspace, your environment variables, and the same shell history any other extension can see. &lt;a href="https://docs.github.com/en/code-security/secret-scanning/introduction/about-secret-scanning" rel="noopener noreferrer"&gt;GitHub's own secret-scanning documentation&lt;/a&gt; already warns that any cached credential is a target. The arrival of mainstream agentic-coding extensions raises the value of compromising a developer workstation by an order of magnitude — the attacker no longer needs to wait for the engineer to push code; the agent will push it for them if the attacker can plant a prompt in the project repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;p&gt;If you operate a small engineering team without a dedicated security function, three actions matter more than the rest. Run an extension audit today across every developer workstation. Replace personal access tokens with fine-grained tokens scoped to specific repositories. Disable extension auto-update for any workspace that holds production credentials.&lt;/p&gt;

&lt;p&gt;If you operate a larger team or run client engagements where a compromise would have legal weight, treat the GitHub breach as the catalyst for a formal IDE policy. Specify the approved extension list, the token-rotation cadence, the credential-storage rules, and the incident-response runbook for the case where a workstation does get compromised. The cost of writing that policy is around 2-3 days of senior engineering time. The cost of replaying GitHub's 20 May 2026 response without GitHub's team is significantly higher.&lt;/p&gt;

</description>
      <category>github</category>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Hydrogen MCP UCP Migration: Production Cutover Before June 15</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Fri, 15 May 2026 08:28:14 +0000</pubDate>
      <link>https://dev.to/no7software-uk/hydrogen-mcp-ucp-migration-production-cutover-before-june-15-i9b</link>
      <guid>https://dev.to/no7software-uk/hydrogen-mcp-ucp-migration-production-cutover-before-june-15-i9b</guid>
      <description>&lt;p&gt;Shopify flipped the Storefront Catalog MCP server to the Universal Commerce Protocol on April 22, 2026, per the official Shopify developer changelog. The old &lt;code&gt;/api/mcp&lt;/code&gt; endpoint and the previous &lt;code&gt;search_shop_catalog&lt;/code&gt; and lookup tool names are deprecated. Both stay live until June 15, 2026 — then they go away. Any Hydrogen storefront, custom AI agent, or third-party integration that still calls the old endpoint after the sunset will fail.&lt;/p&gt;

&lt;p&gt;In our experience, this is one of those changes that reads as a footnote on the changelog and lands as a production incident two weeks before the deadline. The work itself is small: an endpoint rename, two tool renames, and a response-schema check against the new UCP catalog spec. The risk is that it is easy to defer until something visible breaks. For Shopify Plus engineering teams running Hydrogen, this is also not the only change in motion. The Hydrogen Winter 26 release made every Hydrogen storefront on Oxygen an MCP-ready endpoint by default, and the Storefront API proxy that exposes the new &lt;code&gt;/api/ucp/mcp&lt;/code&gt; path is now expected to be in place. Sequencing matters — UCP assumes the proxy is already wrapping your storefront routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 90-Second Engineering Action List
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What changed, in six lines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;/api/mcp&lt;/code&gt; deprecated; new endpoint &lt;code&gt;/api/ucp/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard sunset:&lt;/strong&gt; June 15, 2026 — after that, the legacy endpoint and the previous tool names stop responding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool renames:&lt;/strong&gt; the previous &lt;code&gt;search_shop_catalog&lt;/code&gt; maps to &lt;code&gt;search_catalog&lt;/code&gt;; the previous lookup tool maps to &lt;code&gt;lookup_catalog&lt;/code&gt;; &lt;code&gt;get_product&lt;/code&gt; is the new full-product retrieval tool with interactive variant selection and availability signals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request and response shapes:&lt;/strong&gt; updated to match the UCP catalog spec — re-run your client-side schema validation against the published UCP catalog reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hydrogen Winter 26:&lt;/strong&gt; Storefront MCP is supported on every Hydrogen storefront on Oxygen out of the box. UCP assumes the Storefront API proxy is in place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action sequence:&lt;/strong&gt; grep &lt;code&gt;/api/mcp&lt;/code&gt; in your codebase, rename the endpoint, rename the tool calls, validate the response shape against the UCP spec, run a parallel test suite, ship before June 15.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the Rename Actually Breaks
&lt;/h2&gt;

&lt;p&gt;In our experience, three things tend to break in a half-finished UCP migration. The first is the endpoint. The line is short and easy to find, but easy to miss in a team where MCP calls live in two or three different services — replace &lt;code&gt;https://&amp;amp;#123;storeDomain&amp;amp;#125;/api/mcp&lt;/code&gt; with &lt;code&gt;https://&amp;amp;#123;storeDomain&amp;amp;#125;/api/ucp/mcp&lt;/code&gt; wherever it appears.&lt;/p&gt;

&lt;p&gt;The second is the tool names. We have seen merchants update the endpoint, deploy, and then stare at JSON-RPC errors for an hour because their agent still sends &lt;code&gt;name: "search_shop_catalog"&lt;/code&gt; instead of &lt;code&gt;name: "search_catalog"&lt;/code&gt;. The renames are deterministic — Shopify's changelog is explicit that the previous search and lookup tools are deprecated in favour of &lt;code&gt;search_catalog&lt;/code&gt;, &lt;code&gt;lookup_catalog&lt;/code&gt;, and &lt;code&gt;get_product&lt;/code&gt;, and that the request and response shapes are updated to match UCP.&lt;/p&gt;

&lt;p&gt;The third is the response shape itself. UCP is a layered protocol with capability declarations alongside the commerce payload. The shape of a &lt;code&gt;get_product&lt;/code&gt; response now follows the UCP catalog specification — pricing, availability, options, and variant data have moved to UCP-aligned fields. Treat the &lt;a href="https://shopify.dev/docs/agents/catalog/storefront-catalog" rel="noopener noreferrer"&gt;Storefront Catalog MCP documentation&lt;/a&gt; as the authoritative reference for the new schemas; client code that hard-coded the legacy field paths will silently produce wrong data, not a hard error, which is the worst kind of regression.&lt;/p&gt;

&lt;h2&gt;
  
  
  UCP Capability Negotiation Explained
&lt;/h2&gt;

&lt;p&gt;The reason this migration looks small in the changelog and matters more than that in practice is that UCP is not an evolution of MCP — it is a layered protocol with a different mental model. UCP is the Universal Commerce Protocol, co-developed by Shopify and Google and published openly at NRF 2026. The Shopify engineering team describes it as a layered design that separates commerce surface area into three concerns: a shopping service layer that defines core primitives (checkout sessions, line items, totals), capabilities that group functional areas (Catalog, Checkout, Orders) each independently versioned, and extensions that augment capabilities with domain-specific schemas via composition.&lt;/p&gt;

&lt;p&gt;What this means for engineering teams is that the response payload now tells you what the merchant supports. If a merchant has a loyalty-vendor extension active, your agent can negotiate reward redemption. If it does not, you get the core checkout schema and your agent should gracefully degrade. UCP uses reverse-domain naming (&lt;code&gt;dev.ucp.shopping.*&lt;/code&gt; for the official spec, &lt;code&gt;com.merchantvendor.*&lt;/code&gt; for vendor extensions), which means there is no central registry — capabilities can be added by merchants, payment providers, or loyalty vendors without waiting for protocol committees.&lt;/p&gt;

&lt;p&gt;The architectural shift this implies for client code: your agent should stop assuming a fixed product schema and start branching on the merchant-declared capabilities. We have found this is the single most common source of latent bugs after the rename — code that worked because the old MCP returned exactly one schema now silently misses fields when capabilities are negotiated differently per merchant. For deeper context on how UCP relates to ACP and the older MCP-only patterns, see our breakdown of &lt;a href="https://no7software.co.uk/blog/agentic-commerce-protocols-acp-mcp-ucp-explained" rel="noopener noreferrer"&gt;agentic commerce protocols&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hydrogen Winter 26 and the Storefront API Proxy
&lt;/h2&gt;

&lt;p&gt;Per the Hydrogen Winter 26 update, every Hydrogen storefront on Oxygen now supports Storefront MCP, with custom AI agents able to give customers personalised recommendations, manage carts, and walk buyers through checkout — all powered by real-time data through the Storefront API. UCP runs on the same proxy layer that exposes the storefront to AI agents.&lt;/p&gt;

&lt;p&gt;For teams already on the latest Hydrogen release, this is a non-event for UCP — the proxy layer is in place and the only work is the endpoint and tool rename. For teams on older Hydrogen releases, there is an extra migration to sequence. The proxy migration must happen first because UCP assumes the proxy is wrapping all storefront routes; without it, the new &lt;code&gt;/api/ucp/mcp&lt;/code&gt; endpoint will not be exposed correctly.&lt;/p&gt;

&lt;p&gt;Hydrogen Winter 26 also exposes the Dev MCP server for AI coding tools like Cursor and Claude, giving them access to comprehensive Hydrogen documentation, Storefront API references, and the Hydrogen Cookbook. We have found that pulling the Dev MCP into your IDE during the UCP migration significantly reduces the time spent looking up new schema field paths. If your team is sequencing the broader changes alongside UCP, the order is: confirm the Storefront API proxy is wrapping your routes, audit consent-mode handling on that proxy layer, then ship the UCP endpoint and tool rename. For broader Hydrogen production context, see our &lt;a href="https://no7software.co.uk/blog/shopify-hydrogen-2-production-ready" rel="noopener noreferrer"&gt;Hydrogen 2.0 production-readiness guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Migration Diff
&lt;/h2&gt;

&lt;p&gt;We typically execute UCP migrations as a six-step sequence. The work is small, but auditable steps make rollback cheap.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update the endpoint constant.&lt;/strong&gt; Replace the literal &lt;code&gt;/api/mcp&lt;/code&gt; path with &lt;code&gt;/api/ucp/mcp&lt;/code&gt; wherever your code constructs the MCP URL. Include environment variables, deployment manifests, and any shared SDK constants in the search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rename tool calls.&lt;/strong&gt; Wherever your agent invokes &lt;code&gt;search_shop_catalog&lt;/code&gt;, swap to &lt;code&gt;search_catalog&lt;/code&gt;. Wherever it invokes the previous lookup tool, swap to &lt;code&gt;lookup_catalog&lt;/code&gt;. &lt;code&gt;get_product&lt;/code&gt; is the new full-product retrieval tool — expect the UCP-aligned response shape rather than the legacy Storefront MCP fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update request shapes against the UCP spec.&lt;/strong&gt; The core argument keys (&lt;code&gt;query&lt;/code&gt;, &lt;code&gt;context&lt;/code&gt;) carry over conceptually, but Shopify's changelog explicitly states that the request schemas are updated to match UCP. Treat the &lt;a href="https://shopify.dev/docs/agents/catalog/storefront-catalog" rel="noopener noreferrer"&gt;Storefront Catalog MCP documentation&lt;/a&gt; as the authoritative reference for the new request shape and validate against it before shipping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify response field locations.&lt;/strong&gt; The legacy Storefront MCP returned a flat structure with &lt;code&gt;product_name&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;variant_id&lt;/code&gt;, and &lt;code&gt;image_url&lt;/code&gt; at the top level. Under UCP the product, pricing, availability, and option data follow the UCP catalog spec, which structures them differently. Re-run your client-side schema validation rather than assuming the legacy field paths still resolve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run integration tests in parallel.&lt;/strong&gt; Keep one suite hitting &lt;code&gt;/api/mcp&lt;/code&gt; and a duplicate hitting &lt;code&gt;/api/ucp/mcp&lt;/code&gt;. Both should pass during the transition window, then drop the legacy suite once the new endpoint is canonical in production and the old endpoint is no longer in use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship before June 15.&lt;/strong&gt; Aim for at least 14 days of canary traffic in production before the sunset, so any latent regression has time to surface under realistic load.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Decision Framework: UCP, Direct Storefront API, or Custom MCP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When to use each pattern
&lt;/h3&gt;

&lt;p&gt;Three commerce-data access patterns now coexist on a Hydrogen storefront. Use this matrix to pick the right one for the job.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;UCP via /api/ucp/mcp&lt;/th&gt;
&lt;th&gt;Direct Storefront API&lt;/th&gt;
&lt;th&gt;Custom MCP server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;Medium (proxy + UCP wrap)&lt;/td&gt;
&lt;td&gt;Low (direct GraphQL)&lt;/td&gt;
&lt;td&gt;Medium-high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;Storefront access token&lt;/td&gt;
&lt;td&gt;Storefront/Admin token&lt;/td&gt;
&lt;td&gt;Custom (your stack)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema versioning&lt;/td&gt;
&lt;td&gt;Capability-negotiated&lt;/td&gt;
&lt;td&gt;Storefront API version&lt;/td&gt;
&lt;td&gt;You own it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI agent compatibility&lt;/td&gt;
&lt;td&gt;Native (MCP binding)&lt;/td&gt;
&lt;td&gt;Requires wrapper&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Public agentic search and cart&lt;/td&gt;
&lt;td&gt;Frontend rendering&lt;/td&gt;
&lt;td&gt;Bespoke enterprise tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In our experience, the right default for AI-agent-facing surface area is UCP via the Hydrogen proxy. Direct Storefront API calls remain the right choice for your own frontend rendering — there is no reason to pay the UCP wrapping overhead for code you control. Custom MCP servers make sense only when you have bespoke commerce capabilities (custom B2B pricing tiers, ERP-driven inventory rules) that the standard UCP catalog capability cannot model, and even then, we recommend implementing them as UCP extensions under your own reverse-domain namespace rather than as a parallel protocol. The architectural patterns for scaling a custom MCP layer in production are covered separately in our &lt;a href="https://no7software.co.uk/blog/shopify-storefront-mcp-scaling-patterns" rel="noopener noreferrer"&gt;scaling patterns post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Cutover Before June 15
&lt;/h2&gt;

&lt;p&gt;The migration is only as safe as the test suite that verifies it. We typically build a parallel suite that hits both endpoints with the same set of fixtures, asserts the response shapes, and gates the legacy suite removal on a clean canary in production.&lt;/p&gt;

&lt;p&gt;The first pattern is fixture parity. Capture a set of representative agent requests from production logs, replay them against both &lt;code&gt;/api/mcp&lt;/code&gt; and &lt;code&gt;/api/ucp/mcp&lt;/code&gt;, and diff the response shapes. The legacy endpoint should still match the old schema; the UCP endpoint should match the new one. Any drift is a sign that your client code is making assumptions that one or the other endpoint does not satisfy.&lt;/p&gt;

&lt;p&gt;The second is canary traffic gating. We have found that 1% of agent traffic to the new endpoint for 48 hours is enough to surface most schema-coupling bugs. If you do not have feature-flag infrastructure for agent traffic, a header-based router ahead of the storefront works — branch on a custom header like &lt;code&gt;X-UCP-Migration: enabled&lt;/code&gt; for internal testing accounts before cutting over the full agent population.&lt;/p&gt;

&lt;p&gt;The third is the sunset rehearsal. Before June 15, point your test suite at a Pilot or staging storefront where the legacy endpoint is already disabled. This forces every code path that quietly depends on the old endpoint to fail loudly, in test, where you can fix it. Sunset rehearsals are how you catch the half-migrated dependency that nobody remembered was still on the old tool name. For teams already running Shopify Functions in production, the same fixture-from-production pattern applies — the broader testing strategy is covered in our post on &lt;a href="https://no7software.co.uk/blog/shopify-functions-production" rel="noopener noreferrer"&gt;Shopify Functions in production&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;p&gt;If you run a Hydrogen storefront with any custom AI agent integration, the migration is on a fixed clock. We recommend the following sequence over the next 30 days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit your codebase.&lt;/strong&gt; Run &lt;code&gt;grep -r "/api/mcp"&lt;/code&gt; across every service that talks to your Hydrogen storefront — including custom agents, Slack integrations, ERP middleware, and any internal tooling. The endpoint is also commonly referenced in environment variables, so include &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;wrangler.toml&lt;/code&gt;, and any deployment manifests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm your Hydrogen version.&lt;/strong&gt; If you are on 2026.3.x or earlier, schedule the proxy and consent-mode migration first. UCP will not work cleanly without the proxy in place, and consent state desync is a quiet failure mode that is expensive to debug after the fact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update the endpoint and tool names.&lt;/strong&gt; The two-line fix is as small as it reads. Keep the legacy endpoint operational in your codebase until the parallel test suite is green.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate response shapes.&lt;/strong&gt; Map every property your client code reads from MCP responses to its UCP equivalent. Treat the &lt;a href="https://shopify.dev/docs/agents/catalog/storefront-catalog" rel="noopener noreferrer"&gt;Storefront Catalog MCP documentation&lt;/a&gt; as the authoritative schema reference rather than relying on the legacy Storefront MCP field paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan the canary cutover.&lt;/strong&gt; Aim to land the new endpoint in production with at least two weeks of parallel running, and complete the cutover well ahead of the June 15 sunset rather than racing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most teams, this is a one-day engineering exercise. The hard part is not the rename — it is making sure the migration is sequenced correctly with the proxy and consent changes that landed alongside it. If your storefront is on Hydrogen and you have not yet looked at this, the cost of acting now is much lower than the cost of acting on June 14.&lt;/p&gt;

&lt;p&gt;For broader headless context, see our &lt;a href="https://no7software.co.uk/blog/catalyst-vs-hydrogen-headless-engineering-choice" rel="noopener noreferrer"&gt;Catalyst vs Hydrogen comparison&lt;/a&gt; and our breakdown of &lt;a href="https://no7software.co.uk/blog/shopify-mcp-server-implementation-guide" rel="noopener noreferrer"&gt;Shopify's four native MCP servers&lt;/a&gt;. If you are running a Shopify Plus migration alongside the UCP cutover, our &lt;a href="https://no7software.co.uk/migrate-to-shopify-plus" rel="noopener noreferrer"&gt;Shopify Plus migration service&lt;/a&gt; covers the architecture and risk-register work that keeps both threads from colliding mid-cutover.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>mcp</category>
      <category>news</category>
    </item>
    <item>
      <title>Shopify Quietly Auto-Shipped /llms.txt, /agents.md and /.well-known/ucp — Engineering Override Guide (2026)</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Thu, 14 May 2026 12:31:27 +0000</pubDate>
      <link>https://dev.to/no7software-uk/shopify-quietly-auto-shipped-llmstxt-agentsmd-and-well-knownucp-engineering-override-33cg</link>
      <guid>https://dev.to/no7software-uk/shopify-quietly-auto-shipped-llmstxt-agentsmd-and-well-knownucp-engineering-override-33cg</guid>
      <description>&lt;p&gt;Some time in the first week of May 2026, Shopify quietly turned on four agent-facing endpoints across the platform — no changelog post, no email, no banner in the admin. Open any Shopify store's &lt;code&gt;/llms.txt&lt;/code&gt;, &lt;code&gt;/agents.md&lt;/code&gt;, &lt;code&gt;/.well-known/ucp&lt;/code&gt;, or &lt;code&gt;/sitemap_agentic_discovery.xml&lt;/code&gt; in a browser and a generated file loads. Nobody on the merchant's team made them. Shopify is serving them. Live probe across a sample of UK and US Plus stores on 13 May 2026 confirms the rollout: Allbirds, Allbirds UK, and Kylie Cosmetics all return &lt;code&gt;200&lt;/code&gt; on the full set; some smaller and headless stores still &lt;code&gt;404&lt;/code&gt;, which suggests the rollout is store-by-store rather than instantaneous.&lt;/p&gt;

&lt;p&gt;The infrastructure side of the &lt;a href="https://no7software.co.uk/blog/agentic-commerce-protocols-acp-mcp-ucp-explained" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt; rollout has now landed in production for most merchants. The interesting engineering work is no longer "do we have agentic endpoints"; it is "do the defaults fit our store, and if not, how do we override them safely". This post is the engineering view of that decision — what auto-shipped, what the defaults actually contain, when to leave them alone, when to override via theme Liquid, the multi-region &lt;a href="https://no7software.co.uk/blog/shopify-markets-international-selling-guide" rel="noopener noreferrer"&gt;Shopify Markets&lt;/a&gt; trap that catches most multi-storefront merchants today, and how to wire the new &lt;code&gt;commerce-readiness.shopify.io&lt;/code&gt; scanner into CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What auto-shipped, verified
&lt;/h2&gt;

&lt;p&gt;Four endpoints now resolve on a default Shopify storefront without any merchant work. The shapes are stable enough to write integrations against:&lt;/p&gt;

&lt;h3&gt;
  
  
  The four default agent-facing endpoints
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;Editable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/llms.txt&lt;/td&gt;
&lt;td&gt;Markdown manifest pointing agents at search, agents.md, UCP discovery, MCP endpoint, sitemap&lt;/td&gt;
&lt;td&gt;Yes — templates/llms.txt.liquid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/agents.md&lt;/td&gt;
&lt;td&gt;Long-form agent operating manual: UCP discovery flow, supported versions, checkout rules, rate-limit guidance&lt;/td&gt;
&lt;td&gt;Yes — templates/agents.md.liquid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/.well-known/ucp&lt;/td&gt;
&lt;td&gt;JSON UCP merchant profile: supported versions, transports, services, capabilities, payment handlers&lt;/td&gt;
&lt;td&gt;No — generated from store config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/sitemap_agentic_discovery.xml&lt;/td&gt;
&lt;td&gt;Discovery index listing /llms.txt, /llms-full.txt, /agents.md with weekly changefreq&lt;/td&gt;
&lt;td&gt;No — generated from storefront state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What an agent gets when it hits these endpoints out of the box, on a real store today (Allbirds UK, abbreviated):&lt;/p&gt;

&lt;p&gt;The default &lt;code&gt;llms.txt&lt;/code&gt; opens with the store name and one-line description from the storefront settings, then lists the canonical browse URLs (&lt;code&gt;/collections/all&lt;/code&gt; and a &lt;code&gt;/search?q={'{'}query{'}'}&lt;/code&gt; template), basic store metadata (currency, contact email, phone), and a "For Agents &amp;amp; Developers" block that points at &lt;code&gt;agents.md&lt;/code&gt;, the UCP discovery endpoint, and the MCP endpoint at &lt;code&gt;/api/ucp/mcp&lt;/code&gt; — note the new UCP path, not the legacy &lt;code&gt;/api/mcp&lt;/code&gt; we covered in the &lt;a href="https://no7software.co.uk/blog/hydrogen-storefront-mcp-ucp-migration-2026" rel="noopener noreferrer"&gt;Hydrogen MCP→UCP migration guide&lt;/a&gt;. The default closes with a Shopify-branded footer linking to &lt;code&gt;shopify.com/start&lt;/code&gt;; we will come back to that.&lt;/p&gt;

&lt;p&gt;The default &lt;code&gt;agents.md&lt;/code&gt; is the more interesting file — it reads like an operator's manual aimed squarely at AI agents. It declares the supported UCP versions (currently &lt;code&gt;2026-04-08&lt;/code&gt; stable and &lt;code&gt;2026-01-23&lt;/code&gt;), spells out the six-step agent flow (Discover → Search → Cart → Checkout → Fulfill → Complete), and includes hard rules every agent must respect: checkout requires explicit human approval, the MCP endpoint is per-IP rate-limited, and buyer context (country, currency) must be passed for correct pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to leave the defaults alone
&lt;/h2&gt;

&lt;p&gt;The defaults are good for the median store. If you sell in one currency, on one domain, in one language, with a healthy &lt;code&gt;/pages/about&lt;/code&gt;, &lt;code&gt;/pages/contact&lt;/code&gt;, &lt;code&gt;/pages/faq&lt;/code&gt;, and &lt;code&gt;/pages/shipping&lt;/code&gt;, the auto-shipped &lt;code&gt;llms.txt&lt;/code&gt; and &lt;code&gt;agents.md&lt;/code&gt; point agents at the right places and represent your store accurately. Leave them alone. Override is configuration debt you do not need to take on.&lt;/p&gt;

&lt;p&gt;The defaults stop being good in three situations: multi-region or multi-language stores running Shopify Markets, high-AOV or regulated stores that need to declare agent constraints the default does not cover (age verification, prescription gating, B2B-only catalogues), and brands that do not want the Shopify-branded promotional footer appearing in their agent-facing files. Each of these wants a Liquid template override.&lt;/p&gt;

&lt;h2&gt;
  
  
  Override pattern: templates/llms.txt.liquid
&lt;/h2&gt;

&lt;p&gt;Shopify uses the same theme-asset pattern as &lt;code&gt;robots.txt.liquid&lt;/code&gt;. Drop a file at &lt;code&gt;templates/llms.txt.liquid&lt;/code&gt; and Shopify renders it in place of the default for every request to &lt;code&gt;/llms.txt&lt;/code&gt;. A minimal override that removes the Shopify-branded footer and adds your brand-specific guidance might look like:&lt;/p&gt;

&lt;p&gt;The file is plain Liquid with the same objects you use in a normal theme — &lt;code&gt;shop&lt;/code&gt;, &lt;code&gt;request&lt;/code&gt;, &lt;code&gt;localization&lt;/code&gt;, &lt;code&gt;collections&lt;/code&gt; — so you can interpolate live store data. A practical override starts from a copy of the rendered default, removes what does not apply, and adds the sections your category needs. For example, a regulated category (alcohol, supplements, age-restricted goods) should add a header line declaring the constraint so the agent does not try to complete a checkout it cannot legally close:&lt;/p&gt;

&lt;p&gt;The pattern works identically for &lt;code&gt;templates/agents.md.liquid&lt;/code&gt;. The longer agent operating manual is where most of the per-store nuance belongs — checkout-state preconditions for B2B-only catalogues, returns and exchange policies referenced as URLs the agent can fetch, fulfilment-method constraints for cold-chain or hazmat products, and any market-specific currency or shipping notes the default cannot infer from &lt;code&gt;shop.metafields&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shopify Markets multi-region trap
&lt;/h2&gt;

&lt;p&gt;This is the single biggest gotcha for engineering teams running international storefronts in May 2026. The default &lt;code&gt;/llms.txt&lt;/code&gt; sits at the root of each domain — &lt;code&gt;example.com/llms.txt&lt;/code&gt;, &lt;code&gt;example.de/llms.txt&lt;/code&gt;, &lt;code&gt;example.fr/llms.txt&lt;/code&gt; — but it does not currently translate the link metadata, currency, or language attribution across markets. An agent landing on the wrong domain reads the canonical catalogue at the wrong locale and pulls a price the buyer would not actually see at checkout.&lt;/p&gt;

&lt;p&gt;In practice we see two symptom classes. First, an agent fetches &lt;code&gt;/llms.txt&lt;/code&gt; on a country domain and follows the &lt;code&gt;collections/all&lt;/code&gt; link, but the products it surfaces are described in the store's default language rather than the locale the user is shopping in. Second, currency-divergent storefronts (a GBP UK domain and a USD US domain on the same Markets setup) show consistent &lt;code&gt;llms.txt&lt;/code&gt; currency metadata while the actual cart pricing applies a market-specific override at checkout — the agent's quote and the buyer's checkout disagree by 8-12% depending on the currency pair and shipping origin.&lt;/p&gt;

&lt;p&gt;The fix until Shopify ships native Markets-aware &lt;code&gt;llms.txt&lt;/code&gt; is to override the template per market. In &lt;code&gt;templates/llms.txt.liquid&lt;/code&gt; branch on &lt;code&gt;localization.country.iso_code&lt;/code&gt; and &lt;code&gt;shop.currency&lt;/code&gt;, emit the canonical URLs that route through Shopify Markets' per-market routing, and explicitly tag the currency in the Store Information block. The same logic applies to &lt;code&gt;templates/agents.md.liquid&lt;/code&gt; for the agent operating manual itself, where you also want to advertise which UCP versions and capabilities your specific market negotiates — they can drift from the platform default for storefronts running custom checkout extensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What /.well-known/ucp actually declares
&lt;/h2&gt;

&lt;p&gt;The UCP discovery endpoint at &lt;code&gt;/.well-known/ucp&lt;/code&gt; is the JSON manifest an agent reads first. It is generated by Shopify from your store configuration — there is no Liquid template override for this file, and you should not want one. Hand-editing it would invite drift between what your store actually supports and what your discovery document claims, which is exactly the failure mode the protocol exists to prevent.&lt;/p&gt;

&lt;p&gt;What you get is a JSON document declaring the negotiated UCP version (&lt;code&gt;2026-04-08&lt;/code&gt; at the time of writing, with &lt;code&gt;2026-01-23&lt;/code&gt; still supported for fallback), the transports the store accepts (&lt;code&gt;mcp&lt;/code&gt; over HTTP and &lt;code&gt;embedded&lt;/code&gt; for in-conversation surfaces), the services advertised — &lt;code&gt;dev.ucp.shopping&lt;/code&gt; currently — and the capabilities each service exposes. For a default Shopify storefront in May 2026 the capabilities array includes &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;fulfillment&lt;/code&gt; (extending checkout and cart), and &lt;code&gt;discount&lt;/code&gt; (also extending checkout). Each capability declares its protocol minimum and its config — for example, &lt;code&gt;allows_multi_destination.shipping: false&lt;/code&gt; on default Shopify, which is one of the constraints an agent must respect when building a cart for a buyer.&lt;/p&gt;

&lt;p&gt;If your store needs to advertise a different capability set — a custom subscription handler, a non-default fulfilment provider, a payment method outside Shopify Payments — the path is Shopify Functions and app extensions, not a Liquid override. The discovery JSON regenerates from your active app graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wire the readiness scanner into CI
&lt;/h2&gt;

&lt;p&gt;Shopify also shipped a public agentic-readiness scanner at &lt;code&gt;commerce-readiness.shopify.io&lt;/code&gt;. It runs 31 checks across five categories — Agent Discovery, Product Intelligence, Transaction Readiness, Store Quality, and Operational Readiness — and the failures it surfaces are deterministic enough to wire into CI rather than treating as a one-off audit.&lt;/p&gt;

&lt;p&gt;What it actually probes is unromantic. Does &lt;code&gt;/llms.txt&lt;/code&gt;, &lt;code&gt;/agents.md&lt;/code&gt;, and &lt;code&gt;/.well-known/ucp&lt;/code&gt; return 200. Does &lt;code&gt;/products/{'{'}handle{'}'}.json&lt;/code&gt; resolve for every product in the catalogue. Are sitemaps reachable, including locale variants. Do &lt;code&gt;/pages/about&lt;/code&gt;, &lt;code&gt;/pages/contact&lt;/code&gt;, &lt;code&gt;/pages/faq&lt;/code&gt;, &lt;code&gt;/pages/shipping&lt;/code&gt; contain real HTML rather than redirects, modal overlays, or Notion embeds. If you have been doing product-data hygiene already, the score is high; if you haven't, this is the first time anyone is putting a number on it.&lt;/p&gt;

&lt;p&gt;For an engineering team the value is not running the scanner once and screenshotting the score. The value is running it on every theme deploy, parsing the per-category JSON output, and failing the pipeline if any of the four Agent Discovery checks regress. We typically wire this in as a post-deploy job in GitHub Actions or the Shopify CLI deploy script — request the scan, poll for completion, fail loudly if any category drops below threshold. The scanner does not require auth and is rate-limited at a level that comfortably handles a deploy-time call per store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision matrix: what to override, what to leave alone
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Override decisions for the four endpoints
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;llms.txt&lt;/th&gt;
&lt;th&gt;agents.md&lt;/th&gt;
&lt;th&gt;.well-known/ucp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single-region, single-currency, single-language store&lt;/td&gt;
&lt;td&gt;Leave default&lt;/td&gt;
&lt;td&gt;Leave default&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify Markets multi-region&lt;/td&gt;
&lt;td&gt;Override&lt;/td&gt;
&lt;td&gt;Override&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Age-restricted / regulated category&lt;/td&gt;
&lt;td&gt;Override (declare gate)&lt;/td&gt;
&lt;td&gt;Override (declare rules)&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B-only catalogue&lt;/td&gt;
&lt;td&gt;Override (auth note)&lt;/td&gt;
&lt;td&gt;Override (declare rules)&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium brand wants no Shopify footer&lt;/td&gt;
&lt;td&gt;Override (trim footer)&lt;/td&gt;
&lt;td&gt;Leave default&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How this connects to the wider AI visibility audit
&lt;/h2&gt;

&lt;p&gt;The agentic endpoints are the new floor. Every Shopify store has them now, so they are no longer a differentiator on their own. The differentiation lives in the layer above — the technical signals AI search engines (ChatGPT Search, Perplexity, Claude Web, Google AI Overviews) use to decide whether your domain is citation-worthy at all, separate from whether an agent can transact on your store. Speakable spec on long-form content, AI crawler allow-list in robots.txt, structured-data depth on every page, llms-full.txt corpus quality, and entity authority via &lt;code&gt;sameAs&lt;/code&gt; links to Crunchbase, LinkedIn, GitHub are the signals that move citation share. Our free &lt;a href="https://no7software.co.uk/tools/ai-visibility-audit" rel="noopener noreferrer"&gt;AI visibility tool&lt;/a&gt; scores all eight of those signals on any domain in 5-10 seconds and emails a remediation plan — it is broader than the Shopify-specific scanner, and we recommend running both: &lt;code&gt;commerce-readiness.shopify.io&lt;/code&gt; for the agentic-transaction floor, the visibility audit for the discovery-and-citation ceiling.&lt;/p&gt;

&lt;p&gt;If you want help shipping the overrides — multi-region &lt;code&gt;llms.txt&lt;/code&gt; work, custom &lt;code&gt;agents.md&lt;/code&gt; rules for regulated categories, CI-wired readiness scans on every theme deploy — that is fixed-scope engineering work we quote on. The faster path is to &lt;a href="https://no7software.co.uk/contact" rel="noopener noreferrer"&gt;talk to engineering&lt;/a&gt; with the store URL and the override scope, and we will come back with a quote inside one working day.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>saas</category>
    </item>
    <item>
      <title>Shopify AI Toolkit in Production: 19 Skills and Safe Execution (2026)</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Wed, 13 May 2026 06:41:43 +0000</pubDate>
      <link>https://dev.to/no7software-uk/shopify-ai-toolkit-in-production-19-skills-and-safe-execution-2026-40h7</link>
      <guid>https://dev.to/no7software-uk/shopify-ai-toolkit-in-production-19-skills-and-safe-execution-2026-40h7</guid>
      <description>&lt;p&gt;The April 2026 release of the open-source Shopify AI Toolkit gives Claude Code 19 dedicated skills to manipulate Shopify environments directly, but running &lt;code&gt;shopify store execute&lt;/code&gt; with the &lt;code&gt;--allow-mutations&lt;/code&gt; flag introduces severe live-store risks. For agency teams, adopting this Apache 2.0 toolkit requires strict multi-store credential scoping, domain pinning, and a Git-backed rollback strategy before it touches production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 19-skill architecture and forced validation loop
&lt;/h2&gt;

&lt;p&gt;The repository at &lt;code&gt;github.com/Shopify/shopify-ai-toolkit&lt;/code&gt; fundamentally changes how autonomous agents interact with Shopify codebases. Instead of relying on an LLM's static training data—which often hallucinates deprecated REST endpoints or obsolete Storefront API structures—the toolkit exposes 19 discrete skills to Claude Code. These cover the entire stack: &lt;code&gt;shopify-admin&lt;/code&gt; for Admin GraphQL design, &lt;code&gt;shopify-liquid&lt;/code&gt; for theme architecture, &lt;code&gt;shopify-hydrogen&lt;/code&gt; for headless builds, and &lt;code&gt;shopify-functions&lt;/code&gt; for backend extensibility.&lt;/p&gt;

&lt;p&gt;The critical engineering pattern here is the forced validation loop. Every skill directory ships with two executable scripts: &lt;code&gt;scripts/search_docs.mjs&lt;/code&gt; and &lt;code&gt;scripts/validate.mjs&lt;/code&gt;. The system prompt defining each skill strictly mandates that Claude Code must execute these scripts to verify syntax and schema compatibility before returning a response to the developer.&lt;/p&gt;

&lt;p&gt;In our experience, this validation step reduces API hallucination rates to near zero. However, it shifts the engineering bottleneck. You are no longer debugging bad code generation; you are managing the risk of an agent successfully executing highly destructive, perfectly formatted commands against your store infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The danger of use-shopify-cli and the mutation gate
&lt;/h2&gt;

&lt;p&gt;The most volatile component of the toolkit is the &lt;code&gt;use-shopify-cli&lt;/code&gt; skill. This acts as the primary execution engine. When Claude Code determines it needs to read store state or apply a structural change, it uses this skill to invoke &lt;code&gt;shopify store execute&lt;/code&gt; under the hood.&lt;/p&gt;

&lt;p&gt;By default, the CLI restricts these agent-driven commands to read-only queries. This is safe for auditing catalogue data, verifying webhook subscriptions, or pulling metafield definitions. The danger arises when the &lt;code&gt;--allow-mutations&lt;/code&gt; flag is appended. This flag acts as the gatekeeper, authorising the agent to fire state-changing Admin GraphQL mutations directly at the connected store.&lt;/p&gt;

&lt;p&gt;There is no draft mode in the Admin API, and there is no undo button for a bulk execution. If Claude Code hallucinates the business logic—perhaps misunderstanding a prompt and deleting all product variants instead of updating their pricing tier—the data is instantly gone. We typically see teams leave this flag enabled during local testing out of convenience, which inevitably leads to accidental production data loss when the CLI context is misconfigured or points to the wrong environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to scope multi-store credentials for safe execution
&lt;/h2&gt;

&lt;p&gt;To use the &lt;code&gt;use-shopify-cli&lt;/code&gt; skill safely, you must isolate the execution environment. Relying on developer discipline to verify the active CLI context before approving a Claude Code prompt is a failing strategy. Here is how to configure your environment to prevent catastrophic agent actions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pin the target store domain via environment variables.&lt;/strong&gt; Do not allow the CLI to infer the store from the current directory's configuration file. Explicitly export &lt;code&gt;SHOPIFY_SHOP=your-staging-store.myshopify.com&lt;/code&gt; in your shell profile before launching Claude Code to force the context to a safe environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provision a restricted, task-specific access token.&lt;/strong&gt; Never authenticate the agent using your primary Partner account credentials. Generate a custom app token in the Shopify Admin with the absolute minimum scopes required (for example, strictly &lt;code&gt;write_products&lt;/code&gt; and nothing else) and feed this specific token to the CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce a pre-mutation Git-backed state export.&lt;/strong&gt; Before you append the &lt;code&gt;--allow-mutations&lt;/code&gt; flag to any agent prompt, run a read-only query to dump the target objects into a local JSON file. Commit this file to Git. If the agent corrupts the data, you have a structured payload ready for a restoration script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit the validation script outputs manually.&lt;/strong&gt; Intercept the output of &lt;code&gt;scripts/validate.mjs&lt;/code&gt;. Review the exact GraphQL payload the agent intends to send in your terminal before you authorise the final execution step.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Decision Matrix: AI Toolkit vs Custom MCP Server
&lt;/h3&gt;

&lt;p&gt;When deciding how to connect LLMs to your Shopify infrastructure, compare the built-in AI Toolkit against custom implementations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shopify AI Toolkit (19 Skills):&lt;/strong&gt; Best for general app development, theme building, and standard Admin API tasks. It requires zero infrastructure setup but limits you to Shopify's official documentation and CLI capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand-built MCP Server:&lt;/strong&gt; Best when you need to expose proprietary agency logic, external PIM data, or custom ERP endpoints to the agent. Building this typically costs £15,000-£30,000 in agency time, but provides absolute control over the execution context and authentication scoping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raw Admin API via Scripts:&lt;/strong&gt; Best for deterministic, high-volume data migrations where agent autonomy is a liability, not an asset. Do not use LLMs for bulk data insertion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are leaning towards the custom route to integrate external systems or proprietary logic, read our &lt;a href="https://no7software.co.uk/blog/shopify-mcp-server-implementation-guide" rel="noopener noreferrer"&gt;Shopify MCP Server implementation guide&lt;/a&gt; to understand the authentication requirements and latency targets required for production deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compiling WebAssembly via the shopify-functions skill
&lt;/h2&gt;

&lt;p&gt;The toolkit also addresses backend extensibility through the &lt;code&gt;shopify-functions&lt;/code&gt; skill. Shopify Functions cap each invocation at roughly &lt;a href="https://shopify.dev/docs/api/functions" rel="noopener noreferrer"&gt;11 million WebAssembly instructions&lt;/a&gt;, making code efficiency critical. When Claude Code writes a custom discount or delivery configuration in Rust, the validation script ensures the code compiles to a valid &lt;code&gt;.wasm&lt;/code&gt; binary before attempting deployment.&lt;/p&gt;

&lt;p&gt;This prevents the agent from deploying syntactically correct Rust that fails Shopify’s strict memory and instruction limits during the build phase. However, the agent cannot inherently profile the WebAssembly execution cost. You must still pull the compiled function and run it through the CLI's replay tool to verify it executes within the allowed instruction bounds. Relying solely on the toolkit’s validation loop for performance metrics will result in production timeouts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Polaris variants and UI extensions
&lt;/h2&gt;

&lt;p&gt;The toolkit is not limited to backend logic. It includes specific skill variants tailored for frontend surfaces, particularly Polaris. There are distinct skills for admin, app-home, checkout, and customer-account extensions.&lt;/p&gt;

&lt;p&gt;This granularity is crucial. A checkout UI extension has entirely different component constraints and network access rules compared to an admin block. By routing Claude Code through the specific &lt;code&gt;shopify-pos-ui&lt;/code&gt; or checkout skill, the agent is forced to validate its code against the correct subset of the Polaris library.&lt;/p&gt;

&lt;p&gt;The recent update to the Shopify.dev MCP server, which now explicitly supports Polaris web components, directly complements these toolkit skills. The agent can pull the latest component specifications dynamically, ensuring that the React code it generates relies on current, non-deprecated props rather than hallucinated legacy components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrating with the Storefront and UCP ecosystem
&lt;/h2&gt;

&lt;p&gt;Beyond the Admin environment, the toolkit includes &lt;code&gt;shopify-storefront-graphql&lt;/code&gt; and &lt;code&gt;shopify-hydrogen&lt;/code&gt; skills. These are designed to navigate the complexities of headless commerce, where query optimisation directly impacts user experience metrics.&lt;/p&gt;

&lt;p&gt;We typically target an INP (Interaction to Next Paint) under 200ms for category pages. When Claude Code generates Storefront API queries, the &lt;code&gt;scripts/validate.mjs&lt;/code&gt; loop ensures the query adheres to pagination best practices and does not request overly nested, expensive fields that would degrade edge-cached performance.&lt;/p&gt;

&lt;p&gt;Furthermore, these skills integrate cleanly with the wider Model Context Protocol ecosystem. With the Storefront Catalog MCP now implementing the Universal Commerce Protocol (UCP), the agent can reason about product taxonomy across different platforms. For teams scaling these architectures, managing context windows becomes the primary challenge, as detailed in our analysis of &lt;a href="https://no7software.co.uk/blog/shopify-storefront-mcp-scaling-patterns" rel="noopener noreferrer"&gt;Shopify Storefront MCP scaling patterns&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;p&gt;Adopting the Shopify AI Toolkit changes how your engineering team interacts with the platform, but it requires immediate governance. Do not simply install the toolkit and grant Claude Code unrestricted access to your CLI.&lt;/p&gt;

&lt;p&gt;First, pull the repository from &lt;code&gt;github.com/Shopify/shopify-ai-toolkit&lt;/code&gt; and inspect the &lt;code&gt;scripts/validate.mjs&lt;/code&gt; logic for the skills your team uses most frequently. Understand exactly what the script checks and what it ignores. Second, audit your local environment variables. Ensure that multi-store credentials are strictly isolated and that developers cannot accidentally execute a mutation against a production store. Finally, run a dry-run exercise. Prompt Claude Code to perform a complex catalogue update without the &lt;code&gt;--allow-mutations&lt;/code&gt; flag, and manually verify the generated GraphQL payload before considering it safe for live execution.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Catalyst vs Hydrogen: Engineering Decision Guide (2026)</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Tue, 12 May 2026 06:41:01 +0000</pubDate>
      <link>https://dev.to/no7software-uk/catalyst-vs-hydrogen-engineering-decision-guide-2026-1fff</link>
      <guid>https://dev.to/no7software-uk/catalyst-vs-hydrogen-engineering-decision-guide-2026-1fff</guid>
      <description>&lt;p&gt;The debate surrounding headless ecommerce has shifted from 'whether' to 'how'. In 2026, the primary point of friction for engineering teams is no longer the underlying API, but the reference architecture used to orchestrate it. For teams operating at scale, the choice usually narrows down to BigCommerce Catalyst and Shopify Hydrogen. Both frameworks have matured significantly, moving away from simple starter kits toward opinionated, enterprise-ready architectures.&lt;/p&gt;

&lt;p&gt;We have found that the decision often hinges on your team's existing proficiency with specific React meta-frameworks and your requirement for complex data modelling. While Hydrogen is deeply integrated into the Shopify ecosystem via Remix, Catalyst represents BigCommerce's bet on the Next.js ecosystem. In our experience, neither is a default winner; the superior choice depends on how you intend to handle state, caching, and multi-storefront logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework Foundations: Remix vs Next.js
&lt;/h2&gt;

&lt;p&gt;Hydrogen is built on Remix. This architectural choice dictates a specific approach to data loading and mutations. Remix's focus on web standards and server-side execution means that Hydrogen applications typically see excellent performance in high-concurrency environments, such as flash sales. We have found that the &lt;code&gt;loader&lt;/code&gt; and &lt;code&gt;action&lt;/code&gt; patterns in Remix simplify the mental model for developers who prefer a clear separation between server-side data fetching and client-side rendering.&lt;/p&gt;

&lt;p&gt;Catalyst, conversely, is built on the Next.js App Router. It leverages React Server Components (RSC) to minimize the JavaScript bundle sent to the browser. For teams already embedded in the Vercel ecosystem, Catalyst feels familiar. The use of &lt;code&gt;Suspense&lt;/code&gt; boundaries and incremental static regeneration (ISR) allows for a highly granular caching strategy. In our experience, Catalyst often provides a faster path to a high Lighthouse score for content-heavy sites, whereas Hydrogen excels in dynamic, checkout-heavy workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Experience and the Rise of MCP
&lt;/h2&gt;

&lt;p&gt;A significant trend we are observing is the integration of Model Context Protocol (MCP) servers into the development workflow. Shopify has recently introduced support for the Shopify.dev MCP server, which allows AI-assisted development tools to deeply understand the storefront schema and Polaris web components. We have found that this significantly reduces the time spent looking up GraphQL fragments or component props.&lt;/p&gt;

&lt;p&gt;While BigCommerce Catalyst does not yet have an equivalent first-party MCP server, its reliance on standard Next.js patterns means it benefits from general-purpose AI coding assistants. However, for teams that value a tightly coupled development environment, Shopify's recent updates to the Dev Assistant and the inclusion of Shopify Functions support within these tools provide a more cohesive experience. If your team is looking to automate repetitive boilerplate, the &lt;a href="https://no7software.co.uk/blog/shopify-mcp-server-implementation-guide" rel="noopener noreferrer"&gt;Shopify MCP implementation&lt;/a&gt; currently offers a more specialised toolset for ecommerce-specific tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Modelling and Metaobject Access
&lt;/h2&gt;

&lt;p&gt;Historically, BigCommerce was the preferred choice for complex data requirements due to its flexible custom fields and native multi-storefront capabilities. However, Shopify has closed this gap with Metaobjects. Recent updates now allow for Metaobject access directly within Shopify Functions, enabling logic that was previously difficult to implement without a third-party middleware.&lt;/p&gt;

&lt;p&gt;In Catalyst, data fetching is managed through a GraphQL client that is highly optimized for the BigCommerce Storefront API. We typically see teams using Catalyst when they need to aggregate data from multiple sources—such as an external PIM or a legacy ERP—directly within the Next.js layer. Because Catalyst is unopinionated about where it is hosted, you have more freedom to architect your middleware. Hydrogen is more opinionated, nudging developers toward Oxygen, Shopify's global hosting platform. While Oxygen is highly performant, it does impose certain constraints on the runtime environment that we have found some enterprise teams find restrictive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision Framework: Catalyst vs Hydrogen
&lt;/h3&gt;

&lt;p&gt;Use this checklist to determine which framework aligns with your current technical requirements.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Hydrogen (Shopify)&lt;/th&gt;
&lt;th&gt;Catalyst (BigCommerce)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary Framework&lt;/td&gt;
&lt;td&gt;Remix (React)&lt;/td&gt;
&lt;td&gt;Next.js App Router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting Preference&lt;/td&gt;
&lt;td&gt;Oxygen (Optimised)&lt;/td&gt;
&lt;td&gt;Vercel / Netlify / AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Storefront&lt;/td&gt;
&lt;td&gt;Via Shopify Markets&lt;/td&gt;
&lt;td&gt;Native Multi-Storefront&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Tooling&lt;/td&gt;
&lt;td&gt;First-party MCP Support&lt;/td&gt;
&lt;td&gt;Standard Next.js Patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B Complexity&lt;/td&gt;
&lt;td&gt;Strong via B2B APIs&lt;/td&gt;
&lt;td&gt;Deep native B2B features&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance and Caching Strategies
&lt;/h2&gt;

&lt;p&gt;Performance in a headless environment is largely a function of how you manage sub-requests. Hydrogen uses a sub-request caching mechanism that is built into the Remix fetch wrapper. This allows you to cache individual GraphQL queries at the edge. We have found that this is particularly effective for reducing the load on the Shopify API during peak traffic periods.&lt;/p&gt;

&lt;p&gt;Catalyst leverages Next.js's native fetch cache and tag-based revalidation. This allows for more granular control over when specific parts of a page are updated. For example, you can revalidate product descriptions less frequently than inventory levels. In our experience, Catalyst's caching model is slightly more intuitive for teams that have previously built high-performance SaaS applications, whereas Hydrogen's model requires a deeper understanding of the Remix request-response lifecycle. For a deeper dive into these patterns, see our guide on &lt;a href="https://no7software.co.uk/blog/headless-commerce-practical-guide-2026" rel="noopener noreferrer"&gt;headless commerce implementation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Storefront and Internationalisation
&lt;/h2&gt;

&lt;p&gt;BigCommerce Catalyst has a distinct advantage for merchants who need to run completely different storefronts (different domains, different catalogues, different currencies) from a single backend. BigCommerce's native Multi-Storefront (MSF) architecture is deeply baked into Catalyst. We typically see this as a deciding factor for large European merchants who need to manage distinct regional entities with separate P&amp;amp;L requirements.&lt;/p&gt;

&lt;p&gt;Shopify Hydrogen handles internationalisation primarily through Shopify Markets. While this is highly effective for most merchants, it can sometimes feel like an abstraction layer on top of a single-store architecture. However, for teams that want a 'single source of truth' with minimal configuration, Hydrogen's tight integration with Markets makes it easier to deploy localized versions of a site quickly. We have found that Hydrogen is often the faster path to market for brands expanding from the US into the UK and EU, while Catalyst is better suited for complex, multi-brand conglomerates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensibility: Functions and Middleware
&lt;/h2&gt;

&lt;p&gt;The ability to inject custom logic into the commerce engine is critical. Shopify Functions have become the standard for this on the Shopify side. With the recent addition of &lt;code&gt;functionHandle&lt;/code&gt; and enhanced discount support, the level of customisation available without a custom app is significant. We have found that Hydrogen developers can often offload complex logic to the Shopify backend, reducing the work the headless frontend needs to do.&lt;/p&gt;

&lt;p&gt;Catalyst relies more on the BigCommerce 'Open SaaS' philosophy. This means you are more likely to implement custom logic in a Next.js API route or a separate microservice. This provides more flexibility but increases the maintenance burden on your engineering team. If you require highly non-standard checkout logic, BigCommerce's checkout extensibility is often cited as being more flexible than Shopify's, though Shopify's &lt;a href="https://no7software.co.uk/blog/shopify-checkout-extensions-guide" rel="noopener noreferrer"&gt;checkout extensions&lt;/a&gt; have largely closed this gap for the majority of use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do Next
&lt;/h2&gt;

&lt;p&gt;Choosing between Catalyst and Hydrogen should not be a matter of platform loyalty, but of architectural fit. We suggest taking the following steps to validate your choice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit your team's skills:&lt;/strong&gt; If your developers are Next.js experts, Catalyst will feel more natural. If they prefer the web-standards approach of Remix, Hydrogen is the better fit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark your data requirements:&lt;/strong&gt; Map out your product attributes. If you have thousands of custom fields or complex B2B price lists, test how each framework handles the GraphQL payload size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototype a core feature:&lt;/strong&gt; Don't just look at the demo stores. Build a custom product configurator or a complex filtering system in both frameworks to see where the friction lies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate your hosting:&lt;/strong&gt; Decide if you want a managed environment like Oxygen or the flexibility of Vercel. This will often dictate which framework is more viable for your DevOps team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are still undecided, we recommend starting with a technical discovery phase to map your specific requirements against the latest feature sets of both frameworks. In the rapidly evolving landscape of 2026, the 'best' framework is the one that your team can maintain and iterate on with the least resistance.&lt;/p&gt;

&lt;p&gt;Going deeper into headless: &lt;a href="https://no7software.co.uk/blog/shopify-hydrogen-2-production-ready" rel="noopener noreferrer"&gt;Hydrogen 2.0 production-readiness&lt;/a&gt;, &lt;a href="https://no7software.co.uk/blog/bigcommerce-multi-storefront-guide" rel="noopener noreferrer"&gt;multi-storefront on BigCommerce&lt;/a&gt;, &lt;a href="https://no7software.co.uk/blog/composable-commerce-explained" rel="noopener noreferrer"&gt;composable commerce reality check&lt;/a&gt;, and &lt;a href="https://no7software.co.uk/blog/shopify-store-performance-optimization" rel="noopener noreferrer"&gt;why most Shopify stores are slow&lt;/a&gt;. For platform-vs-platform reasoning, see our &lt;a href="https://no7software.co.uk/blog/bigcommerce-vs-shopify-decision-guide" rel="noopener noreferrer"&gt;BigCommerce vs Shopify decision guide&lt;/a&gt;. Frontend builders should also factor in &lt;a href="https://no7software.co.uk/blog/ecommerce-accessibility-eaa-compliance" rel="noopener noreferrer"&gt;European Accessibility Act compliance&lt;/a&gt; (now in force across both stacks) and the &lt;a href="https://no7software.co.uk/blog/advanced-search-filter-ecommerce" rel="noopener noreferrer"&gt;search and filtering layer that actually converts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Newer related guide: &lt;a href="https://no7software.co.uk/blog/introducing-gpt-5-5-shopify-agentic-commerce" rel="noopener noreferrer"&gt;Introducing GPT-5.5: Engineering Agentic Commerce (2026)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Newer related guide: &lt;a href="https://no7software.co.uk/blog/what-is-shopify-plus-uk-engineering-guide" rel="noopener noreferrer"&gt;What is Shopify Plus: UK Engineering Decision Guide (2026)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Newer related guide: &lt;a href="https://no7software.co.uk/blog/bigcommerce-stencil-vs-catalyst-headless-2026" rel="noopener noreferrer"&gt;BigCommerce Web Development: Stencil vs Catalyst Costs (2026)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>nextjs</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Shopify Flow and AI Agent Triggers: Architecture and Patterns</title>
      <dc:creator>no7software</dc:creator>
      <pubDate>Mon, 11 May 2026 18:26:14 +0000</pubDate>
      <link>https://dev.to/no7software-uk/shopify-flow-and-ai-agent-triggers-architecture-and-patterns-poh</link>
      <guid>https://dev.to/no7software-uk/shopify-flow-and-ai-agent-triggers-architecture-and-patterns-poh</guid>
      <description>&lt;p&gt;Shopify Flow has traditionally been viewed as a closed-loop automation tool for internal store operations, such as tagging high-value customers or sending inventory alerts. However, the recent introduction of the Model Context Protocol (MCP) and the expansion of the Shopify Dev Assistant have fundamentally changed the utility of Flow within the engineering stack. We are seeing a shift where Flow is no longer just a recipient of platform events, but a critical execution layer for AI agents.&lt;/p&gt;

&lt;p&gt;The challenge for technical teams is no longer just writing the automation logic, but designing the interface between unstructured AI intent and structured commerce execution. By leveraging &lt;code&gt;shopify flow ai agent triggers&lt;/code&gt;, developers can provide LLMs with a safe, governed environment to perform complex operations without granting direct, unmitigated access to the Admin API. This architecture reduces the risk of non-deterministic AI behaviour causing havoc in the production environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture of Agentic Triggers
&lt;/h2&gt;

&lt;p&gt;In our experience, the most robust way to connect an AI agent to Shopify Flow is through the &lt;code&gt;flowTriggerReceive&lt;/code&gt; Admin GraphQL mutation. The agent's middleware calls the mutation with a custom trigger &lt;code&gt;handle&lt;/code&gt; and a JSON &lt;code&gt;payload&lt;/code&gt;, and Shopify Flow runs any workflow that begins with that trigger. The reverse direction is also supported: a Flow workflow can call back into your app through a custom action, and your handler verifies the request with &lt;code&gt;authenticate.flow()&lt;/code&gt; before deciding what to do. Either direction acts as a functional bridge, where the AI determines 'what' needs to happen and Flow determines 'how' it happens within the Shopify ecosystem.&lt;/p&gt;

&lt;p&gt;We have found that using Flow as a middleware layer provides several advantages over direct API calls from an agent. Firstly, it offers a visual audit trail that is accessible to non-technical stakeholders. Secondly, it allows for native integration with other Shopify apps without writing custom wrapper code for every integration point. When an agent triggers a Flow workflow, it can pass variables that the workflow then uses to look up metaobjects, update customer records, or adjust discount logic.&lt;/p&gt;

&lt;p&gt;The recent support for Metaobject access in Shopify Functions further enhances this. An agent can now query store configuration stored in Metaobjects and use that context to decide which Flow trigger to invoke. This creates a feedback loop where the store's data informs the agent's logic, and the agent's logic drives the store's automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing the Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol is becoming the standard for how AI agents interact with external data sources. For Shopify merchants, implementing an MCP server allows an AI assistant to 'see' the store's schema and available actions. We typically see engineering teams building thin MCP wrappers around their existing Shopify infrastructure to expose specific Flow triggers as 'tools' that the agent can call.&lt;/p&gt;

&lt;p&gt;For a detailed breakdown of how these protocols interact, you may find our guide on &lt;a href="https://no7software.co.uk/blog/agentic-commerce-protocols-acp-mcp-ucp-explained" rel="noopener noreferrer"&gt;agentic commerce protocols&lt;/a&gt; useful. By exposing a Flow trigger as an MCP tool, you provide the agent with a typed interface. The agent knows it needs to provide a &lt;code&gt;customer_id&lt;/code&gt; and a &lt;code&gt;reason_code&lt;/code&gt;, and Flow handles the heavy lifting of the actual database mutation. This separation of concerns is vital for maintaining a stable codebase as your AI implementation grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leveraging Shopify Functions for Context
&lt;/h2&gt;

&lt;p&gt;While Flow handles the asynchronous automation, Shopify Functions provide the synchronous logic required for complex commerce rules. We have observed that the most effective agentic implementations use a combination of both. For instance, a Function might determine the eligibility of a discount based on real-time cart data, while a Flow trigger—invoked by an agent—handles the post-purchase loyalty adjustments.&lt;/p&gt;

&lt;p&gt;The introduction of &lt;code&gt;functionHandle&lt;/code&gt; and binary testing for Shopify Functions has made it easier to deploy these complex logic gates. When an AI agent triggers a workflow, that workflow can interact with the results of these Functions. This is particularly relevant for merchants using &lt;a href="https://no7software.co.uk/blog/shopify-functions-production" rel="noopener noreferrer"&gt;Shopify Functions in production&lt;/a&gt; to manage bespoke pricing or shipping rules. The agent acts as the orchestrator, calling the right triggers at the right time based on the customer's conversational context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision Framework: Direct API vs. Flow Agent Triggers
&lt;/h3&gt;

&lt;p&gt;Use this framework to decide how your AI agent should interact with Shopify data.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Direct Admin API Call&lt;/th&gt;
&lt;th&gt;Shopify Flow Trigger&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;Low (Synchronous)&lt;/td&gt;
&lt;td&gt;Medium (Asynchronous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;High (Requires custom code)&lt;/td&gt;
&lt;td&gt;Low (Low-code builder)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;Logs only&lt;/td&gt;
&lt;td&gt;Visual execution history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Full Scopes required&lt;/td&gt;
&lt;td&gt;Scoped to specific workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best For&lt;/td&gt;
&lt;td&gt;Real-time data retrieval&lt;/td&gt;
&lt;td&gt;Multi-step operations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Security and Governance in Agentic Workflows
&lt;/h2&gt;

&lt;p&gt;One of the primary concerns we hear from CTOs is the risk of an LLM 'hallucinating' an API call and deleting product data or issuing thousands of unauthorised refunds. Using Flow as the execution layer provides a natural sandbox. An agent cannot perform any action that you have not explicitly defined within a Flow workflow.&lt;/p&gt;

&lt;p&gt;When setting up &lt;code&gt;shopify flow ai agent triggers&lt;/code&gt;, we recommend the following security practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payload Validation:&lt;/strong&gt; Use Flow's internal logic to validate that the data sent by the agent falls within expected ranges (e.g., a discount percentage cannot exceed 20%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request Verification:&lt;/strong&gt; External-to-Flow calls authenticate against your Admin GraphQL session, so guard the API token rather than building separate webhook HMAC checks. For the reverse direction (Flow calling a custom action your app exposes), use &lt;code&gt;authenticate.flow()&lt;/code&gt; — it handles signature verification for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiting:&lt;/strong&gt; While Shopify manages Flow's scale, your own agentic middleware should implement rate limiting to prevent the LLM from triggering thousands of workflows in a loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-in-the-loop:&lt;/strong&gt; For high-stakes actions, such as bulk price changes, the Flow workflow should include a 'Wait' step or send an approval request to a Slack channel before proceeding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more on maintaining a secure Shopify environment, see our guide on &lt;a href="https://no7software.co.uk/blog/ecommerce-security-headers-guide" rel="noopener noreferrer"&gt;ecommerce security headers&lt;/a&gt; and general platform hardening.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Role of Metaobjects as Agent Memory
&lt;/h2&gt;

&lt;p&gt;A significant bottleneck in agentic commerce is state management. AI agents are typically stateless, meaning they don't 'remember' previous interactions unless that context is passed in the prompt. Shopify Metaobjects can serve as a persistent memory store for your agents. By using Flow to write to Metaobjects, an agent can record customer preferences, previous troubleshooting steps, or bespoke configuration data.&lt;/p&gt;

&lt;p&gt;We have found that this approach is much more scalable than trying to manage state within the LLM's context window. Since Shopify recently added Metaobject access to Functions, these 'memories' can now influence the checkout experience in real-time. For example, an agent might trigger a Flow to update a 'Customer Style Profile' metaobject, which a Shopify Function then uses to reorder search results or apply specific upsell logic. This is a primary example of how &lt;a href="https://no7software.co.uk/blog/shopify-flow-advanced-automation" rel="noopener noreferrer"&gt;advanced automation in Shopify Flow&lt;/a&gt; is moving toward a more dynamic, personalised model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;p&gt;To begin integrating AI agents with your Shopify Flow environment, we suggest taking the following technical steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit your manual processes:&lt;/strong&gt; Identify workflows that currently require human intervention but follow a predictable logic. These are your primary candidates for agentic triggers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build a prototype MCP server:&lt;/strong&gt; Use the Shopify Storefront or Admin API to create a bridge that exposes one or two specific Flow custom triggers — invoked from your agent via the &lt;code&gt;flowTriggerReceive&lt;/code&gt; Admin GraphQL mutation — to your AI assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define your data contract:&lt;/strong&gt; Clearly document the JSON schema required for each Flow trigger. This ensures that your agent provides the correct parameters every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement observability:&lt;/strong&gt; Set up monitoring for your Flow execution logs to identify where the agent might be providing malformed data or triggering unnecessary workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are exploring how to scale these patterns across multiple storefronts or complex enterprise environments, our team can provide an architectural review of your current automation strategy to ensure it is ready for the shift toward agentic commerce.&lt;/p&gt;

&lt;p&gt;Companion code: the reference action handler that verifies a Flow request via &lt;code&gt;authenticate.flow()&lt;/code&gt;, the Zod schema, and the decision matrix in plain Markdown live in our open-source engineering-notes repository at &lt;a href="https://github.com/no7software/engineering-notes/tree/main/shopify/flow-ai-agent-actions" rel="noopener noreferrer"&gt;github.com/no7software/engineering-notes&lt;/a&gt; (Apache 2.0).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>automation</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
