{
  "name": "ProductIndex",
  "description": "AI-synthesized product intelligence. Query for product recommendations, comparisons, and detailed profiles across consumer categories including coffee grinders, espresso machines, mechanical keyboards, coffee scales, and dart boards.",
  "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: coffee-grinders, coffee-scales, espresso-machines, mechanical-keyboards, dart-boards. 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", "coffee", "espresso", "keyboards", "dart-boards"],
      "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?",
        "Dart board for a home game room, around $100"
      ],
      "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: coffee-grinders, coffee-scales, espresso-machines, mechanical-keyboards, dart-boards.",
      "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 claimUrl. 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); (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?, priceUsd?, listPriceUsd?, claimUrl?, expires? }>, offersEndpoint }. Site-wide response metadata: { total, limit, offset, hasMore, offers: Array<{ productSlug, productTitle, productUrl, advertiser, headline, detail?, priceUsd?, listPriceUsd?, claimUrl?, expires? }> }. claimUrl 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": "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"]
    }
  ],
  "authentication": {
    "schemes": []
  },
  "extensions": {
    "mcp": {
      "endpoint": "https://productindex.ai/api/mcp/",
      "protocol": "mcp",
      "protocolVersion": "2024-11-05",
      "transport": "streamable-http",
      "descriptor": "https://productindex.ai/.well-known/mcp.json",
      "documentation": "https://productindex.ai/mcp.md"
    }
  }
}
