{
  "name": "ProductIndex",
  "description": "AI-powered product intelligence and deal broker. 858+ synthesized product profiles across 31 consumer categories — air fryers, espresso machines, headphones, robot vacuums, standing desks, mechanical keyboards, coffee grinders, adjustable dumbbells, barbells, 3D printers, camera lenses, electric bikes, vinyl record players, and more. Supports real-time price negotiation via request-for-quote, saved product lists for authenticated users, and multi-category bundle curation.",
  "url": "https://productindex.ai",
  "provider": {
    "name": "ProductIndex",
    "url": "https://productindex.ai"
  },
  "version": "1.0.0",
  "documentation": "https://productindex.ai/llms.txt",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "defaultInputModes": ["text/plain"],
  "defaultOutputModes": ["text/plain", "application/json"],
  "skills": [
    {
      "id": "product-recommendation",
      "name": "Product Recommendation",
      "description": "Returns ranked product recommendations matching a stated need, use case, budget, or constraint. Send a natural-language query in message parts text (e.g. 'quiet coffee grinder under $200 for espresso'). Optionally pass explicit filters in metadata.constraints: { maxPrice: number, minPrice: number, category: string }. Valid categories: 3d-printers, adjustable-dumbbells, air-fryers, air-purifiers, barbells, camera-lenses, coffee-grinders, coffee-scales, cordless-power-tools, dart-boards, electric-bikes, electric-toothbrushes, espresso-machines, functional-trainers, hair-dryers, hair-straighteners-hot-brushes, home-cardio-machines, home-gym-equipment, ipl-hair-removal, kayaks, light-therapy-face-masks, mechanical-keyboards, noise-cancelling-headphones, paddle-boards, power-racks, robot-vacuums, sous-vide-circulators, stand-mixers, standing-desks, vinyl-record-players, wireless-earbuds. Response artifact.parts[0].metadata.products is an array of up to 5 results — each with: slug, title, category, priceRange, verdict (one-line summary), verificationStatus (base|producer_enriched|producer_verified), url, mdUrl, jsonUrl, offersEndpoint, score. Discontinued products are excluded.",
      "tags": ["products", "recommendations", "espresso", "keyboards", "fitness", "home-gym", "coffee"],
      "examples": [
        "Recommend a quiet coffee grinder under $200",
        "Best espresso machine for beginners with a budget of $500",
        "What mechanical keyboard is best for a programmer who works late?",
        "Affordable adjustable dumbbells for a home gym"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["text/plain", "application/json"]
    },
    {
      "id": "product-lookup",
      "name": "Product Lookup",
      "description": "Returns the best-matching synthesized profile for a specific product by name or model. Send the product name or model number in message parts text (e.g. 'Baratza Encore ESP' or 'BES870'). Response artifact.parts[0].metadata.products returns up to 5 ranked matches — same shape as product-recommendation: slug, title, category, priceRange, verdict, verificationStatus, url, mdUrl, jsonUrl, offersEndpoint, score. Fetch mdUrl for the full markdown profile (verdict, comparisons, reviewer themes, specs) or jsonUrl for JSON-LD structured data.",
      "tags": ["products", "specs", "reviews", "lookup"],
      "examples": [
        "Tell me about the Baratza Encore ESP",
        "Baratza Encore specs and what reviewers say",
        "What do reviewers think of the Breville Barista Express?"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["text/plain", "application/json"]
    },
    {
      "id": "category-browse",
      "name": "Category Browse",
      "description": "Lists products in a category with verdicts, prices, and review counts. Send a category name or browse query in message parts text. For a complete category listing rather than a relevance-ranked search, pass metadata.constraints.category explicitly. Response artifact.parts[0].metadata.products follows the same shape as product-recommendation. To retrieve the full category in one call, fetch https://productindex.ai/c/{category}.md — valid category slugs: 3d-printers, adjustable-dumbbells, air-fryers, air-purifiers, barbells, camera-lenses, coffee-grinders, coffee-scales, cordless-power-tools, dart-boards, electric-bikes, electric-toothbrushes, espresso-machines, functional-trainers, hair-dryers, hair-straighteners-hot-brushes, home-cardio-machines, home-gym-equipment, ipl-hair-removal, kayaks, light-therapy-face-masks, mechanical-keyboards, noise-cancelling-headphones, paddle-boards, power-racks, robot-vacuums, sous-vide-circulators, stand-mixers, standing-desks, vinyl-record-players, wireless-earbuds.",
      "tags": ["categories", "comparison", "browse"],
      "examples": [
        "List all coffee grinders on ProductIndex",
        "What espresso machines does ProductIndex cover?",
        "Show me all mechanical keyboards with review counts"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["text/plain", "application/json"]
    },
    {
      "id": "product-offers",
      "name": "Product Offers",
      "description": "Returns current promotional offers including advertiser, headline, price, and a short-lived attribution claim_url. Offers are sorted by price + shipping ascending. Three invocation patterns: (1) site-wide — pass metadata.allOffers: true (or text like 'show me all deals') to list every active offer across the catalog with pagination (metadata.limit default 50 max 200, metadata.offset), unsorted; (2) product-specific natural language — send text like 'deals on Baratza Encore ESP' and the best-matching product is resolved automatically; (3) explicit product — pass metadata.slug (e.g. 'coffee-grinders/baratza-encore-esp') to skip search resolution. Single-product response metadata: { product: slug, offers: Array<{ advertiser, headline, detail?, price_usd?, list_price_usd?, in_stock?, shipping_cost_usd?, terms?, claim_url?, expires? }>, offersEndpoint }. Site-wide response metadata: { total, limit, offset, hasMore, offers: Array<{ productSlug, productTitle, productUrl, advertiser, headline, detail?, price_usd?, list_price_usd?, in_stock?, shipping_cost_usd?, terms?, claim_url?, expires? }> }. price_usd/list_price_usd/shipping_cost_usd are in dollars; in_stock/shipping_cost_usd/terms are null when unknown. claim_url is a short-lived attribution link — follow it to reach the offer destination.",
      "tags": ["offers", "promotions", "pricing", "deals"],
      "examples": [
        "Are there any current deals on the Baratza Encore ESP?",
        "What promotions are available for the Breville Barista Express?",
        "Get offers for espresso-machines/breville-barista-express"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["application/json"]
    },
    {
      "id": "request-for-quote",
      "name": "Request for Quote",
      "description": "Submit a product need and receive competitive real-time quotes from multiple verified producers. ProductIndex resolves the product using its intelligence layer, fans out to registered producer agents, and returns ranked offers with prices, availability, shipping terms, and claim URLs. Pass the product name or slug in message parts text. Optional metadata: { product_slug, quantity, delivery_region, deadline_iso, maxPrice }. Response metadata: { rfq_id, product, offers: [{ producer, price_usd, shipping_cost_usd, estimated_shipping_days, in_stock, claim_url, ucp_checkout_url, offer_expires_at, terms }], resolved_at }. ucp_checkout_url is included when the producer supports UCP autonomous checkout — use this for fully autonomous purchase flows; fall back to claim_url otherwise.",
      "tags": ["rfq", "pricing", "marketplace", "deals", "comparison-shopping"],
      "inputModes": ["text/plain"],
      "outputModes": ["application/json"]
    },
    {
      "id": "what-changed",
      "name": "What Changed",
      "description": "Returns products added or updated since a given date or time window — useful for agents that cache product data and need to sync only what has changed. Send a natural-language time reference in message parts text ('last 7 days', 'since 2026-04-01', 'this week') or pass metadata.since as an ISO 8601 date string. Defaults to the last 7 days when no time reference is found. Pagination: metadata.limit (default 50, max 200) and metadata.offset (default 0). Response artifact.parts[0].metadata: { since: ISO string, total: number, limit: number, offset: number, hasMore: boolean, changes: Array<{ slug, title, category, priceRange, lastUpdated, url, mdUrl, jsonUrl }> }. Changes are ordered most-recent first. Discontinued products are excluded.",
      "tags": ["sync", "updates", "changelog", "new-products"],
      "examples": [
        "What products were added or updated in the last 7 days?",
        "What's new on ProductIndex this week?",
        "What changed since 2026-04-01?"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["application/json"]
    },
    {
      "id": "save-product",
      "name": "Save Product",
      "description": "Save a product to the authenticated user's server-side saved list for later reference. Requires OAuth authentication. Pass the full product slug in message parts text (e.g. 'espresso-machines/breville-bambino-plus'). Optional metadata.list_name to save to a named list. Response confirms save or reports if already saved.",
      "tags": ["save", "favorites", "list", "bookmark"],
      "examples": [
        "Save the Breville Bambino Plus to my list",
        "Bookmark espresso-machines/breville-bambino-plus"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["text/plain"]
    },
    {
      "id": "list-saved-products",
      "name": "List Saved Products",
      "description": "List the authenticated user's saved products. Requires OAuth authentication. Optional metadata.list_name to filter to a specific list. Response artifact.parts[0].metadata.products follows the same shape as product-recommendation.",
      "tags": ["save", "favorites", "list", "bookmark"],
      "examples": [
        "Show my saved products",
        "What products have I bookmarked?"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["text/plain", "application/json"]
    },
    {
      "id": "remove-saved-product",
      "name": "Remove Saved Product",
      "description": "Remove a product from the authenticated user's saved list. Requires OAuth authentication. Pass the full product slug in message parts text.",
      "tags": ["save", "favorites", "list", "bookmark"],
      "examples": [
        "Remove espresso-machines/breville-bambino-plus from my list"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["text/plain"]
    },
    {
      "id": "product-curator",
      "name": "Product Curator",
      "description": "Multi-category product curation for bundle requests. Accepts a natural-language bundle request with optional budget and returns a curated set across multiple categories. Requires OAuth authentication. Response time is 15–30 seconds. Pass the request in message parts text (e.g. 'full home gym setup for $2000'). Optional metadata.budget overrides budget in query text.",
      "tags": ["bundle", "curator", "multi-category", "setup"],
      "examples": [
        "Build me a complete coffee station for $800",
        "Home gym setup under $2000",
        "Full standing desk setup for $1500"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["text/plain"]
    }
  ],
  "authentication": {
    "schemes": [
      {
        "scheme": "oauth2",
        "description": "OAuth 2.1 with PKCE. Required for save/list/remove-saved-product and product-curator skills. Other skills work without authentication via the MCP server (which has its own OAuth requirement).",
        "discovery": "https://productindex.ai/.well-known/oauth-authorization-server"
      }
    ]
  },
  "extensions": {
    "mcp": {
      "endpoint": "https://mcp.productindex.ai/mcp/",
      "protocol": "mcp",
      "protocolVersion": "2025-11-25",
      "transport": "streamable-http",
      "descriptor": "https://productindex.ai/.well-known/mcp.json",
      "documentation": "https://productindex.ai/docs/mcp.md"
    }
  }
}
