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.
Search this storefront
ucp catalog search --business https://{shop}.example.com \
--set /query='cold brew' \
--view :compact \
--format mdLookup by IDs
ucp catalog lookup --business https://{shop}.example.com \
--set '/ids/0=gid://shopify/ProductVariant/12345'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 Available toolsAvailable tools
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.
search_catalog: Search the store's product catalog.lookup_catalog: Batch lookup products or variants by identifier.get_product: Get full product details with variant selection.search_locations: List or search the store's physical locations.lookup_locations: Batch lookup locations by identifier.
The location tools are listed only for stores with a physical retail location. Refer to Location tools for the requirements.
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.
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.
https://{storedomain}/api/ucp/mcp
Anchor to [object Object]search_catalog
search_catalogSearches 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.
Anchor to ParametersParameters
All parameters are wrapped in a catalog object. Refer to the UCP catalog search spec for the complete schema.
Free-text search query. For example, "organic coffee beans", "winter jacket".
Buyer signals for relevance and localization (address_country, language, currency, intent).
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
Anchor to Call the tool directlyCall the tool directly
https://{storedomain}/api/ucp/mcp
cURL
{
"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"
}
}
}
}
}{} Response
{
"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
}
}
}
}Anchor to [object Object]lookup_catalog
lookup_catalogRetrieve 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.
Anchor to ParametersParameters
All parameters are wrapped in a catalog object. Refer to the UCP catalog lookup spec for the complete schema.
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
Anchor to Call the tool directlyCall the tool directly
https://{storedomain}/api/ucp/mcp
cURL
{
"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"
}
}
}
}
}{} Response
{
"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"
}
}
]
}
]
}
}
}Anchor to [object Object]get_product
get_productRetrieves 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.).
Anchor to ParametersParameters
All parameters are wrapped in a catalog object. Refer to the UCP catalog lookup spec for the complete schema.
Product or variant identifier. For example, "gid://shopify/Product/123".
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
Anchor to Call the tool directlyCall the tool directly
https://{storedomain}/api/ucp/mcp
cURL
{
"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"
}
}
}
}
}{} Response
{
"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
}
}
}
}
}Anchor to Location toolsLocation tools
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.commonservice and thedev.ucp.common.location.searchanddev.ucp.common.location.lookupcapabilities. The example location profile declares only these. To use the catalog tools in the same session, declare their capabilities too.
https://{storedomain}/api/ucp/mcp
Anchor to [object Object]search_locations
search_locationsLists 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.
Anchor to ParametersParameters
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.
Free-text filter on the location's name and address. Every word must match. For example, "downtown", "Queen Street".
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.
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.
Buyer signals. address_country and language are used to resolve filters.items. Other fields are ignored.
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
https://{storedomain}/api/ucp/mcp
cURL
{
"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
}
}
}
}
}{} Response
{
"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="
}
}
}
}Anchor to [object Object]lookup_locations
lookup_locationsRetrieves 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.
Anchor to ParametersParameters
All parameters are wrapped in a location object. Refer to the UCP location lookup spec for the complete schema.
Location IDs returned by search_locations (up to 10). For example, "gid://shopify/Location/1001".
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.
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
https://{storedomain}/api/ucp/mcp
cURL
{
"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"
]
}
}
}
}{} Response
{
"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"}
]
}
]
}
}
}