Skip to main content

Storefront Catalog MCP

The Storefront Catalog MCP server enables AI agents to search and discover products from a single merchant's catalog, helping buyers find and purchase products from that store.

Storefront Catalog MCP implements the UCP Catalog capability and its MCP binding. The names, request and response shapes of tools conform to the UCP specification.

The same endpoint also implements the UCP Location capability and its MCP binding, so agents can find the merchant's physical stores.

Anchor to When to use Storefront Catalog MCPWhen to use Storefront Catalog MCP

Use Storefront Catalog MCP whenever buyer intent and query are scoped to a single merchant. For example, use Storefront Catalog MCP when building a storefront AI agent. For cross-merchant product discovery, use Global Catalog MCP. To find the merchant's stores, use the location tools.


Anchor to Use with the AI ToolkitUse with the AI Toolkit

The Shopify AI Toolkit installs the ucp skill, which lets agents in Cursor, Claude Code, and other compatible IDEs scope catalog operations to a single merchant. Ask your assistant in natural language ("search nike.com for running shoes") and the skill picks the right UCP CLI command, or pass --business <merchant-url> on any ucp catalog command directly in a terminal.

Use --input-schema against any of these commands to fetch the merchant's live input schema before composing a payload.

ucp catalog search --business https://{shop}.example.com \
--set /query='cold brew' \
--view :compact \
--format md
ucp catalog lookup --business https://{shop}.example.com \
--set '/ids/0=gid://shopify/ProductVariant/12345'
ucp catalog get_product gid://shopify/Product/67890 \
--business https://{shop}.example.com \
--set '/selected/0={"name":"Bag size","label":"12 oz"}'

Replace storedomain with the store's actual domain. The /api/ucp/mcp endpoint requires an agent profile — every request must include a meta.ucp-agent.profile URL pointing to your agent's UCP profile. The returned tools depend on the capabilities your agent advertises.

The location tools are listed only for stores with a physical retail location. Refer to Location tools for the requirements.

UCP catalog specification

The catalog tools conform to the Universal Commerce Protocol catalog specification, and the location tools conform to the UCP location specification. Refer to the UCP spec for the complete request/response schema.

For Shopify-specific extension fields (additional filters and variant fields), see Storefront Catalog extension.

POST

https://{storedomain}/api/ucp/mcp

{
"jsonrpc": "2.0",
"method": "tools/list",
"id": 1,
"params": {
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://shopify.dev/ucp/agent-profiles/examples/2026-08-25/valid-with-capabilities.json"
}
}
}
}
}

Searches the store's product catalog.

The response conforms to the UCP catalog search response, including a UCP metadata envelope; products with title, description, price range (minor units), media, and variants; and cursor-based pagination.

When to use:

  • A customer asks "Do you have any organic coffee?"
  • You need to find products matching specific criteria.
  • A customer wants to browse items in a category.

All parameters are wrapped in a catalog object. Refer to the UCP catalog search spec for the complete schema.


catalog.query•string

Free-text search query. For example, "organic coffee beans", "winter jacket".


catalog.context•object

Buyer signals for relevance and localization (address_country, language, currency, intent).


catalog.pagination•object

Cursor-based pagination controls. Accepts cursor (string, opaque cursor from a previous response) and limit (integer, min 1, default 10, max 250).


Anchor to Call from the Shopify AI Toolkit and UCP CLICall from the Shopify AI Toolkit and UCP CLI

With the Shopify AI Toolkit installed, ask your assistant in natural language ("search <shop> for cold brew") and the ucp skill picks the right UCP CLI command. You can also run the command directly in a terminal:

Search this storefront

ucp catalog search --business https://{shop}.example.com \
--set /query='cold brew' \
--view :compact \
--format md

Anchor to Call the tool directlyCall the tool directly

POST

https://{storedomain}/api/ucp/mcp

{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 1,
"params": {
"name": "search_catalog",
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://shopify.dev/ucp/agent-profiles/examples/2026-08-25/valid-with-capabilities.json"
}
},
"catalog": {
"query": "organic coffee beans",
"context": {
"address_country": "US",
"intent": "Customer prefers fair trade products"
}
}
}
}
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"ucp": {
"version": "2026-08-25",
"capabilities": {
"dev.ucp.shopping.catalog.search": [
{"version": "2026-08-25"}
]
}
},
"products": [
{
"id": "gid://shopify/Product/1001",
"handle": "fair-trade-organic-whole-bean",
"title": "Fair Trade Organic Whole Bean Coffee",
"description": {
"html": "USDA organic whole beans; Fair Trade Certified; medium roast. Roasted in small batches."
},
"url": "https://business.example.com/products/fair-trade-organic-whole-bean",
"categories": [
{"value": "413", "taxonomy": "google_product_category"},
{"value": "fb-1-2-3", "taxonomy": "shopify"},
{"value": "Food, Beverages & Tobacco > Beverages > Coffee", "taxonomy": "merchant"}
],
"price_range": {
"min": {"amount": 1899, "currency": "USD"},
"max": {"amount": 3499, "currency": "USD"}
},
"media": [
{
"type": "image",
"url": "https://cdn.example.com/products/fair-trade-organic-whole-bean.jpg",
"alt_text": "Bag of fair trade organic whole bean coffee"
}
],
"options": [
{
"name": "Bag size",
"values": [
{"label": "12 oz"},
{"label": "2 lb"},
{"label": "5 lb"}
]
}
],
"variants": [
{
"id": "gid://shopify/ProductVariant/2001",
"sku": "FT-ORG-WB-12OZ",
"title": "12 oz",
"description": {"plain": "12 oz bag — fair trade organic whole bean"},
"price": {"amount": 1899, "currency": "USD"},
"availability": {"available": true},
"options": [{"name": "Bag size", "label": "12 oz"}],
"tags": ["organic", "fair trade", "whole bean", "coffee"]
}
],
"rating": {"value": 4.7, "scale_max": 5, "count": 312},
"metadata": {
"certifications": ["USDA Organic", "Fair Trade Certified"]
}
}
],
"pagination": {
"cursor": "eyJwYWdlIjoxfQ==",
"has_next_page": true,
"total_count": 24
}
}
}
}

Retrieve products or variants by identifier.

The response conforms to the UCP catalog lookup response, including products with inputs correlation on each variant and not_found messages for unresolved identifiers.

When to use:

  • You have product or variant IDs from search results or deep links.
  • You need to resolve multiple identifiers in a single request.
  • You're validating cart items against current catalog data.

All parameters are wrapped in a catalog object. Refer to the UCP catalog lookup spec for the complete schema.


catalog.ids•arrayRequired

Array of product or variant identifiers (up to 10). For example, "gid://shopify/Product/123".


Anchor to Call from the Shopify AI Toolkit and UCP CLICall from the Shopify AI Toolkit and UCP CLI

With the Shopify AI Toolkit installed, ask your assistant in natural language ("look up these variants at <shop>") and the ucp skill picks the right UCP CLI command. You can also run the command directly in a terminal:

Lookup by IDs

ucp catalog lookup --business https://{shop}.example.com \
--set '/ids/0=gid://shopify/ProductVariant/12345'

Anchor to Call the tool directlyCall the tool directly

POST

https://{storedomain}/api/ucp/mcp

{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 1,
"params": {
"name": "lookup_catalog",
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://shopify.dev/ucp/agent-profiles/examples/2026-08-25/valid-with-capabilities.json"
}
},
"catalog": {
"ids": [
"gid://shopify/Product/123",
"gid://shopify/ProductVariant/456"
],
"context": {
"address_country": "US"
}
}
}
}
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"ucp": {
"version": "2026-08-25",
"capabilities": {
"dev.ucp.shopping.catalog.lookup": [
{"version": "2026-08-25"}
]
}
},
"products": [
{
"id": "gid://shopify/Product/123",
"title": "Blue Runner Pro",
"description": {
"html": "Lightweight running shoes with responsive cushioning."
},
"price_range": {
"min": {"amount": 12000, "currency": "USD"},
"max": {"amount": 12000, "currency": "USD"}
},
"variants": [
{
"id": "gid://shopify/ProductVariant/789",
"sku": "BRP-BLU-10",
"title": "Size 10",
"description": {"plain": "Size 10 variant"},
"price": {"amount": 12000, "currency": "USD"},
"availability": {"available": true},
"inputs": [
{"id": "gid://shopify/Product/123", "match": "featured"}
],
"tags": ["running", "road", "neutral"],
"seller": {
"name": "Example Store",
"links": [
{
"type": "refund_policy",
"url": "https://business.example.com/policies/refunds"
}
]
}
}
],
"metadata": {
"collection": "Winter 2026",
"technology": {
"midsole": "React foam",
"outsole": "Continental rubber"
}
}
},
{
"id": "gid://shopify/Product/880",
"title": "Trail Master X",
"description": {
"plain": "Rugged trail running shoes with aggressive tread."
},
"price_range": {
"min": {"amount": 15000, "currency": "USD"},
"max": {"amount": 15000, "currency": "USD"}
},
"variants": [
{
"id": "gid://shopify/ProductVariant/456",
"sku": "TMX-GRN-11",
"title": "Size 11 - Green",
"description": {"plain": "Size 11 Green variant"},
"price": {"amount": 15000, "currency": "USD"},
"availability": {"available": true},
"inputs": [
{"id": "gid://shopify/ProductVariant/456", "match": "exact"}
],
"tags": ["trail", "waterproof"],
"seller": {
"name": "Example Store"
}
}
]
}
]
}
}
}

Retrieves full details for a single product with optional variant selection.

The response conforms to the UCP catalog get_product response including product.selected reflecting effective option selections, option values with available or exists signals, and variants matching the selection.

When to use:

  • A customer has selected a product and needs full details.
  • You need to show variant options with availability signals.
  • A customer is making option selections (Color, Size, etc.).

All parameters are wrapped in a catalog object. Refer to the UCP catalog lookup spec for the complete schema.


catalog.id•stringRequired

Product or variant identifier. For example, "gid://shopify/Product/123".


catalog.selected•array

Option selections for variant narrowing. For example, [{"name": "Color", "label": "Blue"}].


Anchor to Call from the Shopify AI Toolkit and UCP CLICall from the Shopify AI Toolkit and UCP CLI

With the Shopify AI Toolkit installed, ask your assistant in natural language ("show me this product on <shop> in 12 oz") and the ucp skill picks the right UCP CLI command. You can also run the command directly in a terminal:

Get product

ucp catalog get_product gid://shopify/Product/67890 \
--business https://{shop}.example.com \
--set '/selected/0={"name":"Bag size","label":"12 oz"}'

Anchor to Call the tool directlyCall the tool directly

POST

https://{storedomain}/api/ucp/mcp

{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 1,
"params": {
"name": "get_product",
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://shopify.dev/ucp/agent-profiles/examples/2026-08-25/valid-with-capabilities.json"
}
},
"catalog": {
"id": "gid://shopify/Product/123",
"selected": [
{"name": "Color", "label": "Blue"}
],
"context": {
"address_country": "US"
}
}
}
}
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"ucp": {
"version": "2026-08-25",
"capabilities": {
"dev.ucp.shopping.catalog.lookup": [
{"version": "2026-08-25"}
]
}
},
"product": {
"id": "gid://shopify/Product/123",
"handle": "runner-pro",
"title": "Runner Pro",
"description": {
"html": "Lightweight running shoes with responsive cushioning."
},
"url": "https://business.example.com/products/runner-pro",
"price_range": {
"min": {"amount": 12000, "currency": "USD"},
"max": {"amount": 15000, "currency": "USD"}
},
"media": [
{
"type": "image",
"url": "https://cdn.example.com/products/runner-pro-blue.jpg",
"alt_text": "Runner Pro in Blue"
}
],
"options": [
{
"name": "Color",
"values": [
{"label": "Blue", "available": true, "exists": true},
{"label": "Red", "available": true, "exists": true},
{"label": "Green", "available": false, "exists": true}
]
},
{
"name": "Size",
"values": [
{"label": "8", "available": true, "exists": true},
{"label": "9", "available": true, "exists": true},
{"label": "10", "available": true, "exists": true},
{"label": "11", "available": false, "exists": false},
{"label": "12", "available": true, "exists": true}
]
}
],
"selected": [
{"name": "Color", "label": "Blue"}
],
"variants": [
{
"id": "gid://shopify/ProductVariant/1001",
"sku": "BRP-BLU-10",
"title": "Blue, Size 10",
"description": {"plain": "Blue, Size 10"},
"price": {"amount": 12000, "currency": "USD"},
"availability": {"available": true},
"options": [
{"name": "Color", "label": "Blue"},
{"name": "Size", "label": "10"}
]
},
{
"id": "gid://shopify/ProductVariant/1002",
"sku": "BRP-BLU-12",
"title": "Blue, Size 12",
"description": {"plain": "Blue, Size 12"},
"price": {"amount": 15000, "currency": "USD"},
"availability": {"available": true},
"options": [
{"name": "Color", "label": "Blue"},
{"name": "Size", "label": "12"}
]
}
],
"rating": {
"value": 4.5,
"scale_max": 5,
"count": 128
}
}
}
}
}

Use the location tools to find a merchant's physical stores. They're served from the same endpoint as the catalog tools, so you can pass variant IDs from search_catalog to search_locations to find stores that have those products.

The location tools are listed only when both of the following are true:

  • The store has at least one active location that sells in person.
  • Your agent profile declares the dev.ucp.common service and the dev.ucp.common.location.search and dev.ucp.common.location.lookup capabilities. The example location profile declares only these. To use the catalog tools in the same session, declare their capabilities too.
POST

https://{storedomain}/api/ucp/mcp

{
"jsonrpc": "2.0",
"method": "tools/list",
"id": 1,
"params": {
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://shopify.dev/ucp/agent-profiles/examples/2026-08-25/location.json"
}
}
}
}
}

Lists or searches the store's physical locations.

The response conforms to the UCP location search response, including a UCP metadata envelope, the matching locations, and cursor-based pagination. Each location includes an ID, name, and address, plus a phone number and coordinates when the merchant has set them. When you pass distance, locations are sorted nearest first. Otherwise, they're returned in a stable order.

When to use:

  • A customer asks "Where are your stores?"
  • A customer asks "Is there a store near me?" Geocode their address and pass the coordinates as distance.center.
  • A customer wants to know which stores have a specific product available.

All parameters are wrapped in a location object. An empty location object lists all of the store's locations. Refer to the UCP location search spec for the complete schema.


location.query•string

Free-text filter on the location's name and address. Every word must match. For example, "downtown", "Queen Street".


location.distance•object

Radius filter. Takes a center with latitude and longitude, and a max distance in meters. Matching locations are sorted nearest to the center first. Your agent must supply the center, because it isn't inferred from context or the caller's IP address.


location.filters.items•array

Product variant IDs that must all be available at a location (up to 10). For example, "gid://shopify/ProductVariant/456". Availability comes from the same store availability as the Storefront API's storeAvailability field, and doesn't guarantee stock. items is the only supported filter. Other filters keys and serves return an invalid_input error.


location.context•object

Buyer signals. address_country and language are used to resolve filters.items. Other fields are ignored.


location.pagination•object

Cursor-based pagination controls. Accepts cursor (string, opaque cursor from a previous response) and limit (integer, min 1, default 10, max 250).


Anchor to Call the tool directlyCall the tool directly

POST

https://{storedomain}/api/ucp/mcp

{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 1,
"params": {
"name": "search_locations",
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://shopify.dev/ucp/agent-profiles/examples/2026-08-25/location.json"
}
},
"location": {
"distance": {
"center": {"latitude": 43.6532, "longitude": -79.3832},
"max": 5000
},
"filters": {
"items": ["gid://shopify/ProductVariant/2001"]
},
"context": {
"address_country": "CA"
},
"pagination": {
"limit": 2
}
}
}
}
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"ucp": {
"version": "2026-08-25",
"status": "success",
"capabilities": {
"dev.ucp.common.location.search": [
{"version": "2026-08-25"}
],
"dev.ucp.common.location.lookup": [
{"version": "2026-08-25"}
]
}
},
"locations": [
{
"id": "gid://shopify/Location/1001",
"name": "Queen Street",
"address": {
"street_address": "100 Queen St W",
"address_locality": "Toronto",
"address_region": "ON",
"address_country": "CA",
"postal_code": "M5H 2N2",
"phone_number": "+14165550100"
},
"geo": {"latitude": 43.6525, "longitude": -79.3839}
},
{
"id": "gid://shopify/Location/1002",
"name": "Distillery District",
"address": {
"street_address": "55 Mill St",
"extended_address": "Building 2",
"address_locality": "Toronto",
"address_region": "ON",
"address_country": "CA",
"postal_code": "M5A 3C4"
},
"geo": {"latitude": 43.6503, "longitude": -79.3596}
}
],
"pagination": {
"has_next_page": true,
"cursor": "eyJhZnRlciI6MTAwMn0="
}
}
}
}

Retrieves locations by identifier.

The response conforms to the UCP location lookup response, including an inputs array on each location that lists the request IDs that resolved to it. Unknown IDs are left out of the result. In the example, gid://shopify/Location/9999 doesn't exist, so only one location is returned.

When to use:

  • You have location IDs from search results and need fresh details.
  • A customer picked a store earlier in the conversation and you want to show it again.
  • You want to check whether specific stores have certain items available.

All parameters are wrapped in a location object. Refer to the UCP location lookup spec for the complete schema.


location.ids•arrayRequired

Location IDs returned by search_locations (up to 10). For example, "gid://shopify/Location/1001".


location.distance•object

Radius filter applied to the resolved locations, with the same shape as the search_locations distance parameter. Unlike search, lookup keeps the order of ids instead of sorting by distance.


location.filters.items•array

Product variant IDs that must all be available at a location. Same as the search_locations filters.items parameter.


Anchor to Call the tool directlyCall the tool directly

POST

https://{storedomain}/api/ucp/mcp

{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 1,
"params": {
"name": "lookup_locations",
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://shopify.dev/ucp/agent-profiles/examples/2026-08-25/location.json"
}
},
"location": {
"ids": [
"gid://shopify/Location/1001",
"gid://shopify/Location/9999"
]
}
}
}
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"ucp": {
"version": "2026-08-25",
"status": "success",
"capabilities": {
"dev.ucp.common.location.search": [
{"version": "2026-08-25"}
],
"dev.ucp.common.location.lookup": [
{"version": "2026-08-25"}
]
}
},
"locations": [
{
"id": "gid://shopify/Location/1001",
"name": "Queen Street",
"address": {
"street_address": "100 Queen St W",
"address_locality": "Toronto",
"address_region": "ON",
"address_country": "CA",
"postal_code": "M5H 2N2",
"phone_number": "+14165550100"
},
"geo": {"latitude": 43.6525, "longitude": -79.3839},
"inputs": [
{"id": "gid://shopify/Location/1001"}
]
}
]
}
}
}

Was this page helpful?