Storefront MCP search_catalog appears to ignore filters.categories and filters.price

Hi Shopify team,
I’m testing Storefront MCP on a single store endpoint and seeing that search_catalog appears to ignore category and price filters.

Context:

  • tools/list shows search_catalog is available.
  • This appears to replace/ supersede search_shop_catalog for this storefront MCP server.

What I tested:

  1. Baseline query:
  • query: “iphone”
  • Returns mixed categories, e.g.:
    • gid://shopify/TaxonomyCategory/el-4-8-5 (Mobile & Smart Phones)
    • gid://shopify/TaxonomyCategory/el-7-11-5 (Screen Protectors)
    • gid://shopify/TaxonomyCategory/na
  1. Category filter with query:
  • query: “iphone”
  • filters.categories: [“gid://shopify/TaxonomyCategory/el-4-8-5”]
  • Expected: only smartphone category results.
  • Actual: same mixed-category result profile as baseline.
  1. Different category filter with query:
  • query: “iphone”
  • filters.categories: [“gid://shopify/TaxonomyCategory/el-7-11-5”]
  • Expected: screen protectors only.
  • Actual: same mixed-category profile as baseline.
  1. Filter-only browse:
  • filters.categories: [“gid://shopify/TaxonomyCategory/el-4-8-5”]
  • Expected: smartphone browse set only.
  • Actual: mixed unrelated categories (phones/laptops/tablets/na).
  1. Price filter:
  • query: “iphone”
  • filters.price.max: 500 with context.currency: “AUD”
  • Expected: no iPhone products or only <= AUD 5.00 minor units if interpreted literally.
  • Actual: normal high-priced iPhones returned (e.g., 54,900+ minor units).
  1. Price filter (high minimum):
  • query: “iphone”
  • filters.price.min: 200000 with context.currency: “AUD”
  • Expected: no results or only >= AUD 2,000 products.
  • Actual: normal low/medium priced results still returned.
  1. Combined category + price:
  • query: “iphone”
  • filters.categories: [“gid://shopify/TaxonomyCategory/el-4-8-5”]
  • filters.price: { min: 70000, max: 95000 }
  • context.currency: “AUD”
  • Expected: constrained subset by both filters.
  • Actual: non-matching categories and prices still present.
  1. Invalid category:
  • filters.categories: [“gid://shopify/TaxonomyCategory/does-not-exist”]
  • Expected: zero results or warning/error message.
  • Actual: generic browse results returned; messages empty.

Summary:

  • search_catalog returns products successfully.
  • filters.categories and filters.price seem ignored in this storefront MCP implementation.
  • Responses do not include warning messages when filters are not applied.

Could you confirm whether this is a known issue, expected behavior for Storefront MCP currently, or a bug in this store/server implementation?
Thanks!

Could you also share best practices for using search_catalog in Storefront MCP for:

  • catalog exploration (broad discovery),
  • category exploration (browse within a taxonomy area),
  • query refinement (precision search)?

Specifically:

  • Should filters.categories use full taxonomy GIDs only (gid://shopify/TaxonomyCategory/…)?
  • For category filters, is matching exact-only or does it include descendants?
  • How should clients handle na/uncategorized products during exploration?
  • For filters.price, should clients always provide context.currency, and should ignored filters always return a messages warning?
  • Recommended strategy for UX flows: query-only vs filters-only vs query+filters, plus any fallback/post-filtering guidance

@abog

re: price - see my answer here
this new tool seems to only do price in base currency of store which is annoying
I haven’t tested the parameters fully yet but will do next week

There’s no defined best practices here since it’s all relatively new

what I’m doing is fetching everything and relying on post fetch filters which is llm driven (relevance filters)

e.g.
search for boots
MCP gives 10 boots, some boot polish and some boot cut jeans and a tv + a chicken suit (or whatever)
I render everything back to front end
and in parallel send a filtering request to llm
we do like a scoring so it ranks the products by relevance and removes junk
so non relevant results get taken out that way
we also do an enrichment pass (add what MCP doesn’t give pulling data from api)
and we structure removed results for follow up suggestions if partially relevant

it needs fine tuning but that’s the idea

you could do the filtering before showing anything but it adds like 1.5s or something for me

It would be nice to pass loads of parameters / context in and get perfect hits back but we don’t - so fetch → filter → enrich with api if needed

that’s the logic I’m working with rn