Data-driven stocking and aging analysis. Triggers: "what should I stock", "what's selling in my area", "market demand analysis", "aging inventory alert", "turn rate by segment", "slow movers on my lot", "inventory analysis", "demand vs supply ratio", "what to buy at auction", "floor plan optimization", "new vs used mix", "days on market by model", stocking decisions, inventory aging analysis, demand-to-supply intelligence.
From dealership-groupnpx claudepluginhub marketcheckhub/marketcheck-cowork-plugin --plugin dealership-groupThis skill uses the workspace's default tool permissions.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Calculates TAM/SAM/SOM using top-down, bottom-up, and value theory methodologies for market sizing, revenue estimation, and startup validation.
Date anchor: Today's date comes from the
# currentDatesystem context. Compute ALL relative dates from it. Example: if today = 2026-03-14, then "prior month" = 2026-02-01 to 2026-02-28, "current month" (most recent complete) = February 2026, "three months ago" = December 2025. Never use training-data dates.
Turn sold market data and live supply counts into actionable stocking recommendations. Replace gut-instinct buying with demand-to-supply ratios, aging alerts, turn-rate benchmarks, and optimal new-vs-used mix targets.
Load the marketcheck-profile.md project memory file. If missing, prompt /onboarding and ask minimum fields.
Extract ALL locations from dealer_group.locations[]. For each location: name, dealer_id, web_domain, dealer_type, franchise_brands, zip (US) or postcode (UK), state (US) or region (UK), country. Extract group preferences: dom_aging_threshold.
Location selection: This skill analyzes one location at a time. If the group has multiple locations, ask "Which location?" and use that location's dealer_id, web_domain, zip/postcode, state/region, and dealer_type for ALL API calls below. Never mix zip/state values across locations.
US: all tools. UK: search_uk_active_cars + search_uk_recent_cars only (skip Market Demand, Turn Rate, New vs Used Mix, D/S Ratio). Confirm: "Running inventory intelligence for: [selected location name] ([zip], [state])"
Inventory director or location GM making data-driven stocking decisions using demand-to-supply ratios, aging alerts, and turn-rate benchmarks.
Auto-loaded from selected location: state, dealer_id, web_domain, franchise_brands, dealer_type, zip. Auto-loaded from preferences: default_inventory_type ("used" | "new" | "both"; default "used" if not set) — apply as car_type/inventory_type in all calls unless user overrides in their request. Ask: timeframe (default: last full month). For lot-level workflows: use dealer_id first; if null, use web_domain; if both null, ask the user. Never mix new and used data in the same report section.
Understand what is actually selling in the location's market before making any stocking decisions.
Call mcp__marketcheck__get_sold_summary with:
date_from / date_to: target month first-to-last daystate: selected location's state codedealer_type: selected location's dealer type (Franchise or Independent)ranking_dimensions: make,modelranking_measure: sold_countranking_order: desctop_n: 20
→ Extract only: per make/model — sold_count, average_sale_price, average_days_on_market. Discard full response.Call mcp__marketcheck__get_sold_summary with the same date and location filters, but:
ranking_dimensions: body_typeranking_measure: sold_countranking_order: desctop_n: 10
→ Extract only: per body_type — sold_count, share %. Discard full response.Present results as two ranked tables:
Highlight any body type or model where the location's franchise brand appears in the top 5, and flag segments where it does not appear (potential conquest or gap opportunities).
Compare what the market is buying against what dealers currently have listed. Vehicles with high demand and low supply represent stocking opportunities.
Call mcp__marketcheck__get_sold_summary with:
date_from / date_to: most recent full monthstate: selected location's statedealer_type: selected location's dealer typeranking_dimensions: make,modelranking_measure: sold_countranking_order: desctop_n: 30
→ Extract only: per make/model — sold_count. Discard full response.Call mcp__marketcheck__search_active_cars with:
state: selected location's state (or zip + radius if provided)car_type: used (or new based on user focus)seller_type: dealerdealer_type: selected location's dealer typefacets: make|0|50|2,model|0|50|2rows: 0
→ Extract only: per make/model — active count from facets. Discard full response.For each of the top 30 sold make/model combinations, look up the active supply count from the facet results.
Calculate Demand-to-Supply Ratio = Sold Count (monthly) / Active Supply Count.
Present a single table sorted by demand-to-supply ratio descending:
Identify units on the selected location's lot that have exceeded healthy DOM thresholds and assess their current market value.
Multi-agent approach: Use the lot-scanner and lot-pricer agents for complete, paginated results.
Step 1 — Pull aged inventory (paginated):
Use the Agent tool to spawn the dealership-group:lot-scanner agent with this prompt:
Pull aging inventory for dealer_id=[dealer_id] (or source=[web_domain] if dealer_id unavailable), country=[country], car_type=used, sort_by=dom, sort_order=desc, dom_range=[dom_aging_threshold]-999. Paginate through all results.
This ensures ALL aged units are captured, not just the first 25.
Step 2 — Price aged units (US only):
After lot-scanner returns, use the Agent tool to spawn the dealership-group:lot-pricer agent with this prompt:
Price these aging vehicles: [pass vehicle list from lot-scanner]. zip=[zip], dealer_type=[dealer_type], floor_plan_per_day=[floor_plan_per_day], aging_threshold=[dom_aging_threshold].
UK dealers: Price inline using comp medians from search_uk_active_cars.
Step 3 — Build the report from lot-pricer output:
Build an Aging Inventory Report table:
Summarize total aged inventory exposure:
Benchmark how quickly different vehicle segments move in the local market to inform category-level stocking.
Call mcp__marketcheck__get_sold_summary with:
date_from / date_to: most recent full monthstate: selected location's statedealer_type: selected location's dealer typeranking_dimensions: body_typeranking_measure: average_days_on_marketranking_order: asctop_n: 10
→ Extract only: per body_type — average_days_on_market, sold_count. Discard full response.Call mcp__marketcheck__get_sold_summary with:
ranking_dimensions: make,modelranking_measure: average_days_on_marketranking_order: asctop_n: 10
→ Extract only: per make/model — average_days_on_market, sold_count. Discard full response.Also call with ranking_order: desc and top_n: 10 to get the slowest turning models.
→ Extract only: per make/model — average_days_on_market, sold_count. Discard full response.
Present three tables:
Provide a recommendation: "Focus acquisition on segments with Avg DOM < X days (market median). Avoid over-stocking in segments where Avg DOM exceeds Y days unless priced aggressively."
Determine the optimal new-to-used inventory ratio based on what the market is actually absorbing.
Call mcp__marketcheck__get_sold_summary with:
date_from / date_to: most recent full monthstate: selected location's stateinventory_type: Newranking_dimensions: makeranking_measure: sold_countranking_order: desctop_n: 10
→ Extract only: per make — sold_count. Discard full response.Call mcp__marketcheck__get_sold_summary with same filters but:
inventory_type: Used
→ Extract only: per make — sold_count. Discard full response.Call mcp__marketcheck__search_active_cars for current supply:
state: selected location's statecar_type: newseller_type: dealerfacets: make|0|30|2rows: 0
→ Extract only: per make — active count from facets. Discard full response.Repeat with car_type: used.
→ Extract only: per make — active count from facets. Discard full response.
Calculate:
Present as:
Present: headline number (e.g., D/S ratio or aged unit count with dollar impact), ranked data tables (models, body types, aging units), clear signal labels (UNDER-SUPPLIED / BALANCED / OVER-SUPPLIED), and 3 specific actionable items with dollar estimates. Cite data period.