Hydrogen MCP → UCP Migration: Production Cutover Before June 15
No7 Engineering Team
Growth Architecture Unit

Shopify flipped the Storefront Catalog MCP server to the Universal Commerce Protocol on April 22, 2026. The old /api/mcp endpoint and the previous search_* 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.
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, three tool renames, and a response-schema check. 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. Hydrogen 2026.4.0 made the Storefront API proxy mandatory by removing the proxyStandardRoutes flag from createRequestHandler, and backend consent mode replaced the legacy _tracking_consent cookie. UCP assumes both of those changes are already in place — sequence matters.
The 90-Second Engineering Action List
What changed, in six lines
- Endpoint:
/api/mcpdeprecated; new endpoint/api/ucp/mcpbecomes effective May 30, 2026. - Hard sunset: June 15, 2026 — after that, the legacy endpoint stops responding.
- Tool renames:
search→search_catalog;lookup→lookup_catalog;get_productkeeps its name but the response shape changes. - Response shape: every UCP response wraps the payload in a top-level
ucpcapabilities block with a version field (currently2026-04-08). - Hydrogen 2026.4.0: removed
proxyStandardRoutes— the Storefront API proxy is now mandatory and UCP requires it. - Action sequence: grep
/api/mcpin your codebase, rename the endpoint, rename the tool calls, verify the response shape, run a parallel test suite, ship before June 15.
What the Rename Actually Breaks
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 https://{storeDomain}/api/mcp with https://{storeDomain}/api/ucp/mcp wherever it appears.
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 tool: "search" instead of tool: "search_catalog". The renames are deterministic — the old search_* tool maps to search_catalog, the old lookup_* tool maps to lookup_catalog, and get_product keeps its name but its response payload now lives under result.product alongside a sibling result.ucp object.
The third is the response shape itself. UCP responses are structured around capability declarations, not just commerce data. A get_product response now returns a top-level ucp block with version and capabilities, alongside the product payload. Pricing has moved into a price_range.min and price_range.max shape — not a single price field — and availability.available is a boolean on both the product and variant level. Code that does product.price or treats availability as a string will silently produce wrong data, not a hard error, which is the worst kind of regression.
UCP Capability Negotiation Explained
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. It separates commerce surface area into three layers: 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.
What this means for engineering teams is that the response payload now tells you what the merchant supports. If a merchant has a com.loyaltyprovider.points extension active, your agent can negotiate reward redemption. If it does not, you get the core checkout schema and your agent should gracefully degrade. Reverse-domain naming (dev.ucp.shopping.* for the official spec, com.merchantvendor.* for vendor extensions) means there is no central registry — capabilities can be added by merchants, payment providers, or loyalty vendors without waiting for protocol committees.
The architectural shift this implies for client code: your agent should stop assuming a fixed product schema and start branching on the ucp.capabilities array. 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 agentic commerce protocols.
Hydrogen 2026.4.0 and the Mandatory Storefront API Proxy
Hydrogen 2026.4.0, released April 2026, removed the proxyStandardRoutes flag from createRequestHandler. The Storefront API proxy is now always enabled, which means every Hydrogen storefront is an MCP/UCP endpoint by default at /api/mcp (legacy) or /api/ucp/mcp (UCP) — no opt-in required, no flag to set.
For teams already on 2026.4.0, 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 still on 2026.3.x or earlier, 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 /api/ucp/mcp endpoint will not be exposed correctly.
The same release also moved consent mode from the legacy _tracking_consent cookie to backend signals carried through the proxy layer. We have seen teams discover this only after a privacy audit flags consent state desync — the old cookie reads stale, the new backend state is authoritative, and code that branches on cookie presence silently breaks. If your team is sequencing all three changes, the order is: proxy migration, then consent mode update, then UCP rename. Doing them out of order leaves you with a working store and broken telemetry, which is hard to detect and harder to debug. For broader Hydrogen production context, see our Hydrogen 2.0 production-readiness guide.
Step-by-Step Migration Diff
We typically execute UCP migrations as a six-step sequence. The work is small, but auditable steps make rollback cheap.
- Update the endpoint constant. Replace the literal
/api/mcppath with/api/ucp/mcpwherever your code constructs the MCP URL. Include environment variables, deployment manifests, and any shared SDK constants in the search. - Rename tool calls. Wherever your agent invokes the previous
searchtool, swap tosearch_catalog. Wherever it invokeslookup, swap tolookup_catalog.get_productkeeps its name but expect the new response shape. - Update request shapes. The argument keys (
query,context) are stable, but UCP requires ameta.ucp-agent.profilefield declaring your agent profile URL. Without it, the merchant cannot negotiate which capabilities to expose to your agent. - Verify response field locations. The product payload still lives under
result.product, but pricing now lives underproduct.price_range.minandproduct.price_range.maxinstead of a singleproduct.price. Checkavailability.availableas a boolean, not a string. - Run integration tests in parallel. Keep one suite hitting
/api/mcpand a duplicate hitting/api/ucp/mcp. Both should pass until May 30, then drop the legacy suite once the new endpoint is canonical in production. - Ship before June 15. 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.
Decision Framework: UCP, Direct Storefront API, or Custom MCP
When to use each pattern
Three commerce-data access patterns now coexist on a Hydrogen storefront. Use this matrix to pick the right one for the job.
| Requirement | UCP via /api/ucp/mcp | Direct Storefront API | Custom MCP server |
|---|---|---|---|
| Latency | Medium (proxy + UCP wrap) | Low (direct GraphQL) | Medium-high |
| Auth | Storefront access token | Storefront/Admin token | Custom (your stack) |
| Schema versioning | Capability-negotiated | Storefront API version | You own it |
| AI agent compatibility | Native (MCP binding) | Requires wrapper | Native |
| Best for | Public agentic search and cart | Frontend rendering | Bespoke enterprise tools |
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 scaling patterns post.
Testing the Cutover Before June 15
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.
The first pattern is fixture parity. Capture a set of representative agent requests from production logs, replay them against both /api/mcp and /api/ucp/mcp, 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.
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 X-UCP-Migration: enabled for internal testing accounts before cutting over the full agent population.
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 Shopify Functions in production.
What to do next
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:
- Audit your codebase. Run
grep -r "/api/mcp"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.env,wrangler.toml, and any deployment manifests. - Confirm your Hydrogen version. 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.
- Update the endpoint and tool names. 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.
- Validate response shapes. Map every property your client code reads from MCP responses to its UCP equivalent. Pay particular attention to
price_range,availability.available, and the new top-levelucpcapabilities block. - Plan the canary cutover. Aim for May 30 in production with the new endpoint, two weeks of parallel running, and full cutover by June 13 — ahead of the June 15 sunset.
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.
For broader headless context, see our Catalyst vs Hydrogen comparison and our breakdown of Shopify's four native MCP servers. If you are running a Shopify Plus migration alongside the UCP cutover, our Shopify Plus migration service covers the architecture and risk-register work that keeps both threads from colliding mid-cutover.
Frequently Asked Questions
The questions buyers and engineers ask us most about this topic.
How long do I have to migrate from Storefront MCP to UCP?
Shopify made UCP effective on May 30, 2026 and is maintaining the legacy `/api/mcp` endpoint with the previous tool names through June 15, 2026. After June 15, the old endpoint stops responding. We typically recommend shipping the cutover at least two weeks ahead of the sunset so you get a clean canary window in production before the legacy path goes away.
Does the UCP migration affect Hydrogen storefronts that have not built custom AI agents?
Standard Hydrogen storefronts that do not make direct calls to `/api/mcp` are unaffected by the tool rename itself. However, any Hydrogen project still on a release earlier than 2026.4.0 must complete the Storefront API proxy migration separately, because UCP assumes the proxy layer is in place. If you have ever pasted `fetch('/api/mcp', ...)` into your codebase, you must act.
What does the new `ucp` capabilities block contain?
Every UCP response now wraps the payload in a top-level `ucp` block declaring the protocol version (currently `2026-04-08`) and the capabilities the merchant supports (such as `dev.ucp.shopping.catalog.lookup`). Treat the `ucp` block as the authoritative schema reference — capabilities your client supports tell you which response fields you can rely on, and capabilities you do not recognise should fall back to a graceful handoff.