Skip to main content
Glama

Search Shopify stores

search_stores
Read-only

Search Undercart's Shopify store catalog with the store explorer's filters: keywords in the store's own description, category, country, annual revenue, traffic rank and trend, top market, catalog size and price, brands carried (distinct product vendors, own-brand share, a brand the store sells), reviews and review velocity, share on sale, theme, hiring, languages, email cadence, the ad platform a store advertises on (advertisingOn: meta / google / tiktok), and apps installed / added / removed. All filters AND together. The catalog, review, hiring and email filters are only known for the few thousand stores Undercart has researched in depth, so any of them limits the search to those; leave them out to search the whole catalog of ~700k. For multi-brand resellers (stores selling brands they don't own) filter on brandsMin (e.g. 20) and ownBrandMax (e.g. 20), not on description phrases like "top brands" or "authorized dealer", which most resellers' descriptions don't contain. Returns concise store profiles ranked by estimated revenue (annual before monthly): category, country, product count, traffic rank and trend, and top detected apps. Example: beauty stores doing over $10M/yr that use Klaviyo and added Gorgias in the last 90 days. On a capped plan (Free) each search uses 5 of the account's monthly search credits, and repeating an identical search that month is free, so prefer one well-filtered search over many narrow ones.

Input Schema

NameRequiredDescriptionDefault
techNoApps/technologies the store runs now, e.g. "Klaviyo" or "Klaviyo, Gorgias" (comma-separated: the store must run every one). Case-insensitive; a term that isn't an exact app name matches every app name containing it.
brandNoCarries brand. A brand the store sells (a product vendor name), e.g. Shimano. Whole name, case-insensitive.
limitNoMax stores to return (default 20). The Free plan returns at most 15 per search.
themeNoTheme. Case-insensitive; an unknown value returns the valid values. The base Theme Store theme, even where the store renamed its copy.
hiringNotrue: only stores matching "Hiring now". Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Has a careers page — the cheapest proxy for a team that is growing.
countryNoCountry the store is based in: an ISO code or a name, e.g. "US" or "United States".
rankMaxNoTraffic rank upper bound (1 = most popular), e.g. 10000 for stores in the top 10k. Stores with no rank are excluded when set.
rankMinNoTraffic rank lower bound (1 = most popular). Traffic rank blends Tranco with HTTP Archive/CrUX; lower is more popular.
categoryNoStore category. Forgiving match ("beauty" resolves to "Beauty & Cosmetics"); when nothing matches, the result lists the valid categories. Canonical values: Fashion & Apparel, Beauty & Cosmetics, Health & Wellness, Food & Beverage, Home & Garden, Electronics, Sports & Outdoors, Pets, Jewelry & Accessories, Toys & Games, Books & Media, Art & Crafts, Automotive, Baby & Kids, Office & School, Other.
currencyNoCurrency. Case-insensitive; an unknown value returns the valid values. The store's own checkout currency, from /meta.json.
enrichedNotrue: only stores Undercart has researched in depth, which carry a revenue estimate, ads, captured emails, social and catalog data. Omit to search the whole catalog; the rest carry public-web data only (apps, description, country, traffic rank) and a preliminary revenue range.
priceMaxNoMaximum avg product price (USD). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.
priceMinNoMinimum avg product price (USD). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.
techDaysNoLookback for techAdded / techRemoved in days (default 30). 0 = any time: every add/removal ever recorded.
brandsMaxNoMaximum brands carried. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Distinct brands (product vendors) in the catalog. 1 is a store selling only its own brand; a multi-brand reseller carries dozens to hundreds.
brandsMinNoMinimum brands carried. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Distinct brands (product vendors) in the catalog. 1 is a store selling only its own brand; a multi-brand reseller carries dozens to hundreds.
emailsMaxNoMaximum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured per week, averaged since we subscribed or over the last 30 days, whichever is shorter.
emailsMinNoMinimum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured per week, averaged since we subscribed or over the last 30 days, whichever is shorter.
onSaleMaxNoMaximum catalog on sale (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of the catalog currently discounted.
onSaleMinNoMinimum catalog on sale (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of the catalog currently discounted.
techAddedNoApps the store ADDED within the last techDays days (comma-separated, each must match). Only reflects Undercart's own re-crawls, so it covers stores crawled more than once.
topMarketNoA country among the store's top 3 markets for Chrome traffic (where its visitors are, not where it is based): an ISO code or a name, e.g. "DE" or "Germany".
localesMaxNoMaximum languages. Distinct languages the store publishes its pages in (hreflang) — international expansion.
localesMinNoMinimum languages. Distinct languages the store publishes its pages in (hreflang) — international expansion.
revenueMaxNoMaximum estimated ANNUAL revenue in USD (preliminary figure for unresearched stores).
revenueMinNoMinimum estimated ANNUAL revenue in USD, e.g. 10000000 for $10M/yr. A store Undercart hasn't researched yet is filtered on its preliminary, popularity-based figure.
reviewsMaxNoMaximum total reviews. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.
reviewsMinNoMinimum total reviews. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.
descriptionNoKeywords that must ALL appear in the store's own description (its site meta description), in any order — e.g. "yoga pants leggings" finds Alo Yoga. Case-insensitive substring match per keyword (a keyword of up to 4 letters must start a word, so "tabi" doesn't match "cantabil"); common stop words are ignored. Wrap a run in double quotes for an exact phrase, e.g. '"made in italy"'. It reaches products and positioning that no category value covers.
ownBrandMaxNoMaximum own-brand share (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of products sold under the store's own name. Near 0% is a reseller of other brands; near 100% is a DTC brand.
ownBrandMinNoMinimum own-brand share (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of products sold under the store's own name. Near 0% is a reseller of other brands; near 100% is a DTC brand.
productsMaxNoMaximum product count. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.
productsMinNoMinimum product count. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.
techRemovedNoApps the store REMOVED within the last techDays days (comma-separated, each must match). Only reflects Undercart's own re-crawls, so it covers stores crawled more than once.
trafficTrendNoTraffic trend. One of: Rising, Steady, Falling. Chrome UX Report: the last 3 months' worldwide rank against the same months a year earlier. Only a whole-bucket move (e.g. Top 50k → Top 10k) counts.
advertisingOnNoAd platform the store has ads on right now, per its public ad library: "meta" (Facebook/Instagram), "google" (Google Ads / Shopping) or "tiktok". A counted presence, not a pixel on the site. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.
reviewRateMaxNoMaximum review velocity. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Observed new reviews per day between the last two comparable crawls.
reviewRateMinNoMinimum review velocity. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Observed new reviews per day between the last two comparable crawls.
trackingEmailNotrue: only stores matching "We capture their email". Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Subscribed to their newsletter AND receiving mail — email intelligence is flowing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / techDays / description
      Previous value: -"Lookback for techAdded / techRemoved in days (default 30)."New value: +"Lookback for techAdded / techRemoved in days (default 30). 0 = any time: every add/removal ever recorded."
    • changedInput schema / properties / techDays / minimum
      Previous value: -1New value: +0
  2. Changed1 schema field changed
    • changedInput schema / properties / techRemoved / description
      Previous value: -"Apps the store REMOVED within the last techDays days (comma-separated, each must match)."New value: +"Apps the store REMOVED within the last techDays days (comma-separated, each must match). Only reflects Undercart's own re-crawls, so it covers stores crawled more than once."
  3. Changed1 schema field changed
    • changedInput schema / properties / limit / maximum
      Previous value: -100New value: +50
  4. Changed1 schema field changed
    • addedInput schema / properties / advertisingOn
      Added value: +{
      +  "description": "Ad platform the store has ads on right now, per its public ad library: \"meta\" (Facebook/Instagram), \"google\" (Google Ads / Shopping) or \"tiktok\". A counted presence, not a pixel on the site. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.",
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / description / description
      Previous value: -"Keywords that must ALL appear in the store's own description (its site meta description), in any order — e.g. \"yoga pants leggings\" finds Alo Yoga. Case-insensitive substring match per keyword; common stop words are ignored. Wrap a run in double quotes for an exact phrase, e.g. '\"made in italy\"'. It reaches products and positioning that no category value covers."New value: +"Keywords that must ALL appear in the store's own description (its site meta description), in any order — e.g. \"yoga pants leggings\" finds Alo Yoga. Case-insensitive substring match per keyword (a keyword of up to 4 letters must start a word, so \"tabi\" doesn't match \"cantabil\"); common stop words are ignored. Wrap a run in double quotes for an exact phrase, e.g. '\"made in italy\"'. It reaches products and positioning that no category value covers."
  6. Changed2 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Max stores to return (default 20, max 50)."New value: +"Max stores to return (default 20). The Free plan returns at most 15 per search."
    • changedInput schema / properties / limit / maximum
      Previous value: -50New value: +100
  7. Changed5 schema fields changed
    • addedInput schema / properties / brand
      Added value: +{
      +  "description": "Carries brand. A brand the store sells (a product vendor name), e.g. Shimano. Whole name, case-insensitive.",
      +  "type": "string"
      +}
    • addedInput schema / properties / brandsMax
      Added value: +{
      +  "description": "Maximum brands carried. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Distinct brands (product vendors) in the catalog. 1 is a store selling only its own brand; a multi-brand reseller carries dozens to hundreds.",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / brandsMin
      Added value: +{
      +  "description": "Minimum brands carried. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Distinct brands (product vendors) in the catalog. 1 is a store selling only its own brand; a multi-brand reseller carries dozens to hundreds.",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / ownBrandMax
      Added value: +{
      +  "description": "Maximum own-brand share (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of products sold under the store's own name. Near 0% is a reseller of other brands; near 100% is a DTC brand.",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / ownBrandMin
      Added value: +{
      +  "description": "Minimum own-brand share (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of products sold under the store's own name. Near 0% is a reseller of other brands; near 100% is a DTC brand.",
      +  "minimum": 0,
      +  "type": "number"
      +}
  8. Changed2 schema fields changed
    • changedInput schema / properties / emailsMax / description
      Previous value: -"Maximum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured in the last 28 days, per week."New value: +"Maximum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured per week, averaged since we subscribed or over the last 30 days, whichever is shorter."
    • changedInput schema / properties / emailsMin / description
      Previous value: -"Minimum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured in the last 28 days, per week."New value: +"Minimum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured per week, averaged since we subscribed or over the last 30 days, whichever is shorter."
  9. Changed3 schema fields changed
    • changedInput schema / properties / description / description
      Previous value: -"Keywords that must ALL appear in the store's own description (its site meta description), in any order — e.g. \"yoga pants leggings\" finds Alo Yoga. Case-insensitive substring match per keyword; common stop words are ignored. Wrap a run in double quotes for an exact phrase, e.g. '\"made in italy\"'. Use this for a product/positioning search that no category value covers."New value: +"Keywords that must ALL appear in the store's own description (its site meta description), in any order — e.g. \"yoga pants leggings\" finds Alo Yoga. Case-insensitive substring match per keyword; common stop words are ignored. Wrap a run in double quotes for an exact phrase, e.g. '\"made in italy\"'. It reaches products and positioning that no category value covers."
    • removedInput schema / properties / foundedMax
      Removed value: -{
      -  "description": "Maximum founded year (a year). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.",
      -  "minimum": 0,
      -  "type": "number"
      -}
    • removedInput schema / properties / foundedMin
      Removed value: -{
      -  "description": "Minimum founded year (a year). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog.",
      -  "minimum": 0,
      -  "type": "number"
      -}
  10. Changed19 schema fields changed
    • removedInput schema / properties / aovMax
      Removed value: -{
      -  "description": "Maximum average order value (USD).",
      -  "minimum": 0,
      -  "type": "number"
      -}
    • removedInput schema / properties / aovMin
      Removed value: -{
      -  "description": "Minimum average order value (USD).",
      -  "minimum": 0,
      -  "type": "number"
      -}
    • changedInput schema / properties / emailsMax / description
      Previous value: -"Maximum emails per week. Marketing emails we captured in the last 28 days, per week."New value: +"Maximum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured in the last 28 days, per week."
    • changedInput schema / properties / emailsMin / description
      Previous value: -"Minimum emails per week. Marketing emails we captured in the last 28 days, per week."New value: +"Minimum emails per week. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Marketing emails we captured in the last 28 days, per week."
    • changedInput schema / properties / foundedMax / description
      Previous value: -"Maximum founded year (a year)."New value: +"Maximum founded year (a year). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • changedInput schema / properties / foundedMin / description
      Previous value: -"Minimum founded year (a year)."New value: +"Minimum founded year (a year). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • changedInput schema / properties / hiring / description
      Previous value: -"true: only stores matching \"Hiring now\". Has a careers page — the cheapest proxy for a team that is growing."New value: +"true: only stores matching \"Hiring now\". Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Has a careers page — the cheapest proxy for a team that is growing."
    • changedInput schema / properties / onSaleMax / description
      Previous value: -"Maximum catalog on sale (percent, 0-100). Share of the catalog currently discounted."New value: +"Maximum catalog on sale (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of the catalog currently discounted."
    • changedInput schema / properties / onSaleMin / description
      Previous value: -"Minimum catalog on sale (percent, 0-100). Share of the catalog currently discounted."New value: +"Minimum catalog on sale (percent, 0-100). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Share of the catalog currently discounted."
    • changedInput schema / properties / priceMax / description
      Previous value: -"Maximum avg product price (USD)."New value: +"Maximum avg product price (USD). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • changedInput schema / properties / priceMin / description
      Previous value: -"Minimum avg product price (USD)."New value: +"Minimum avg product price (USD). Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • changedInput schema / properties / productsMax / description
      Previous value: -"Maximum product count."New value: +"Maximum product count. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • changedInput schema / properties / productsMin / description
      Previous value: -"Minimum product count."New value: +"Minimum product count. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • changedInput schema / properties / reviewRateMax / description
      Previous value: -"Maximum review velocity. Observed new reviews per day between the last two comparable crawls."New value: +"Maximum review velocity. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Observed new reviews per day between the last two comparable crawls."
    • changedInput schema / properties / reviewRateMin / description
      Previous value: -"Minimum review velocity. Observed new reviews per day between the last two comparable crawls."New value: +"Minimum review velocity. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Observed new reviews per day between the last two comparable crawls."
    • changedInput schema / properties / reviewsMax / description
      Previous value: -"Maximum total reviews."New value: +"Maximum total reviews. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • changedInput schema / properties / reviewsMin / description
      Previous value: -"Minimum total reviews."New value: +"Minimum total reviews. Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog."
    • removedInput schema / properties / shopifyPlan
      Removed value: -{
      -  "description": "Shopify plan. Case-insensitive; an unknown value returns the valid values. Only detectable when the storefront says so, or for Plus — most stores read as unknown.",
      -  "type": "string"
      -}
    • changedInput schema / properties / trackingEmail / description
      Previous value: -"true: only stores matching \"We capture their email\". Subscribed to their newsletter AND receiving mail — email intelligence is flowing."New value: +"true: only stores matching \"We capture their email\". Only known for stores Undercart has researched in depth — a few thousand of the ~700k in the catalog — so setting it limits results to those. Omit it to search the whole catalog. Subscribed to their newsletter AND receiving mail — email intelligence is flowing."
  11. First observed

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: discloses that all filters AND together, that the catalog/review/hiring/email filters restrict to the few thousand researched stores, the revenue-based ranking order, and that Free plans consume 5 credits per search with identical repeats free.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, cost, and return info are front-loaded, but the long mid-sentence enumeration of every filter largely duplicates the 100%-covered schema and bloats the description. The genuinely valuable parts (AND semantics, researched-store caveat, credit model) are buried in that list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 39-parameter tool with no output schema, the description supplies the missing return information (concise store profiles ranked by estimated revenue with named fields), the filtering semantics, cost model, and the critical coverage caveat. Nothing an agent needs to call it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, but the description adds real value beyond the schema: the AND-combination semantics across filters, the reseller strategy for brandsMin/ownBrandMax, and the advertisingOn values. It also restates much of the schema's filter list, which dilutes rather than adds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (search Undercart's Shopify store catalog) and enumerates the filter domains precisely. It is clearly the broad discovery tool versus the per-store siblings (get_store, get_store_ads, find_similar_stores).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to guidance: omit enriched-only filters to search the ~700k catalog, use brandsMin/ownBrandMax for resellers rather than description phrases, and prefer one well-filtered search over many narrow ones on Free plans. It never names the sibling tools, so routing vs get_store/find_similar_stores is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources