{
  "entries": [
    {
      "identifier": "urn:air:poketracker.dev.r01.no:docs:llms-txt",
      "displayName": "Poké-Tracker llms.txt",
      "type": "text/plain",
      "url": "https://poketracker.dev.r01.no/llms.txt",
      "description": "Agent-oriented overview in llms.txt format: what the product is, data model, authentication and the endpoint list. A fuller reference is at /llms-full.txt.",
      "representativeQueries": [
        "How do I authenticate to the Pokémon TCG stock tracker API?",
        "What endpoints list Norwegian Pokémon card price changes?"
      ],
      "tags": [
        "pokemon",
        "tcg",
        "norway",
        "price-tracker",
        "stock",
        "llms.txt",
        "docs"
      ],
      "version": "1.0.0",
      "metadata": {
        "format": "llms.txt (markdown)",
        "auth": "none",
        "fullReference": "https://poketracker.dev.r01.no/llms-full.txt"
      }
    },
    {
      "identifier": "urn:air:poketracker.dev.r01.no:api:rest",
      "displayName": "Poké-Tracker REST API",
      "type": "application/vnd.oai.openapi+json",
      "url": "https://poketracker.dev.r01.no/openapi.json",
      "description": "HTTP/JSON API for Pokémon TCG stock, price history, restocks, stores and watchlist across Norwegian retailers. Bearer-token authenticated; token from POST /api/login.",
      "representativeQueries": [
        "Which Norwegian store has the cheapest in-stock Pokémon booster box?",
        "What restocked or dropped in price recently?",
        "Get price history for a Pokémon TCG product"
      ],
      "capabilities": [
        "createStreamTicket",
        "listGroups",
        "listUnmappedProducts",
        "getGroupPriceHistory",
        "getProductPriceHistory",
        "getGroupStockHistory",
        "getProductStockHistory",
        "getPriceStats",
        "getRestockCounts",
        "listRecentChanges",
        "listStores",
        "listWatches",
        "getScraperStatus",
        "getMe",
        "getScraperLiveness",
        "getMarketDuels",
        "getMarketSources",
        "getMarketStrata",
        "getHuntState",
        "listDataQualityFindings",
        "listOperatorActions",
        "upsertWatch",
        "deleteWatch"
      ],
      "tags": [
        "pokemon",
        "tcg",
        "norway",
        "price-tracker",
        "stock",
        "rest",
        "openapi"
      ],
      "version": "1.0.0",
      "metadata": {
        "auth": "bearer",
        "authType": "http-bearer",
        "loginEndpoint": "https://poketracker.dev.r01.no/api/login",
        "credentials": "operator-provided, not published",
        "tokenLifetime": "until server restart",
        "loginRateLimit": "10 failed attempts per 5 minutes per IP"
      }
    },
    {
      "identifier": "urn:air:poketracker.dev.r01.no:webmcp:dashboard-tools",
      "displayName": "Poké-Tracker WebMCP tools",
      "type": "application/vnd.poketracker.webmcp-tools+json",
      "data": {
        "page": "https://poketracker.dev.r01.no/",
        "api": "document.modelContext.registerTool (navigator.modelContext fallback)",
        "availability": "registered by the dashboard only after the user logs in, in a browser with WebMCP enabled",
        "authentication": "the logged-in user session; no credentials are passed to tools",
        "tools": [
          {
            "name": "search_products",
            "title": "Search products",
            "description": "Search the Norwegian Pokémon TCG catalogue by name or set. Returns compact matches with cheapest in-stock price, store counts and an id for get_product. Optional store and in-stock filters.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string",
                  "description": "Words to match in the product name or set, e.g. 'surging sparks booster box'."
                },
                "store": {
                  "type": "string",
                  "description": "Only offers from this store, e.g. 'Outland' (case-insensitive)."
                },
                "inStock": {
                  "type": "boolean",
                  "description": "true = only products with an in-stock offer."
                },
                "limit": {
                  "type": "integer",
                  "description": "Max results, default 8, max 20."
                }
              },
              "required": [
                "query"
              ]
            },
            "annotations": {
              "readOnlyHint": true,
              "untrustedContentHint": true
            }
          },
          {
            "name": "get_product",
            "title": "Get product details",
            "description": "Details for one product: every store offer with price and stock, the cheapest in-stock offer, and a price history summary (all-time low/high, 30-day change). Use an id from search_products.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Product id such as 'item-12' or 'product-345' (a bare number means a group id)."
                }
              },
              "required": [
                "id"
              ]
            },
            "annotations": {
              "readOnlyHint": true,
              "untrustedContentHint": true
            }
          },
          {
            "name": "list_recent_changes",
            "title": "List recent changes",
            "description": "Newest stock and price changes across all stores: new products, restocks, sell-outs, price drops and increases. Optionally filter by kind.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "enum": [
                    "new",
                    "restock",
                    "sold_out",
                    "price_drop",
                    "price_increase"
                  ],
                  "description": "Only this kind of change."
                },
                "limit": {
                  "type": "integer",
                  "description": "Max changes, default 8, max 20."
                }
              }
            },
            "annotations": {
              "readOnlyHint": true,
              "untrustedContentHint": true
            }
          },
          {
            "name": "list_stores",
            "title": "List stores",
            "description": "All tracked retailers and whether scraping is enabled for each.",
            "inputSchema": {
              "type": "object",
              "properties": {}
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_scraper_status",
            "title": "Get scraper status",
            "description": "Compact scraper health: phase, last completed cycle, stores done/total, stores with errors, whether scraping is paused or degraded. Use it to judge how fresh the data is.",
            "inputSchema": {
              "type": "object",
              "properties": {}
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "list_watchlist",
            "title": "List watchlist",
            "description": "The user's watchlist: watched products with their price target (NOK) if any.",
            "inputSchema": {
              "type": "object",
              "properties": {}
            },
            "annotations": {
              "readOnlyHint": true,
              "untrustedContentHint": true
            }
          },
          {
            "name": "get_data_quality_findings",
            "title": "Get data-quality findings",
            "description": "Open data-quality findings, most severe first: wrongly grouped products, failing or flapping store feeds, stale stock, unparseable prices, missing images and AI audit suggestions. Each has the reason and the suggested fix. Read-only: fixes are made by the operator in the dashboard, never through a tool.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "severity": {
                  "type": "string",
                  "enum": [
                    "critical",
                    "warning",
                    "info"
                  ],
                  "description": "Only this severity."
                },
                "kind": {
                  "type": "string",
                  "description": "Only this finding kind, e.g. 'store.feed_failing' or 'group.overmerged'."
                },
                "source": {
                  "type": "string",
                  "enum": [
                    "rule",
                    "ai"
                  ],
                  "description": "rule = deterministic checks, ai = model audit suggestions."
                },
                "store": {
                  "type": "string",
                  "description": "Only findings about this store, e.g. 'Nille' (case-insensitive)."
                },
                "limit": {
                  "type": "integer",
                  "description": "Max findings, default 8, max 20."
                }
              }
            },
            "annotations": {
              "readOnlyHint": true,
              "untrustedContentHint": true
            }
          },
          {
            "name": "add_watch",
            "title": "Add to watchlist",
            "description": "Watch a product group for restocks and optional price drops. The user is asked to confirm in a dialog before anything is saved; refusal or timeout saves nothing. Use a groupId from search_products.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "groupId": {
                  "type": "integer",
                  "description": "Numeric group id (the number in 'item-12')."
                },
                "priceTarget": {
                  "type": "number",
                  "description": "Alert below this price in NOK. Omit for restock alerts only."
                }
              },
              "required": [
                "groupId"
              ]
            },
            "annotations": {
              "readOnlyHint": false,
              "consequentialHint": true
            }
          }
        ]
      },
      "description": "In-browser tools for agents using the logged-in dashboard: search products, read offers and price history, recent changes, stores, scraper status, watchlist, and one user-confirmed write (add_watch).",
      "representativeQueries": [
        "Find the cheapest in-stock Pokémon Surging Sparks booster box in Norway",
        "Watch this Pokémon product and alert me below 1200 kr"
      ],
      "capabilities": [
        "search_products",
        "get_product",
        "list_recent_changes",
        "list_stores",
        "get_scraper_status",
        "list_watchlist",
        "get_data_quality_findings",
        "add_watch"
      ],
      "tags": [
        "pokemon",
        "tcg",
        "norway",
        "price-tracker",
        "stock",
        "webmcp",
        "browser"
      ],
      "version": "1.0.0",
      "metadata": {
        "auth": "session",
        "writeTools": 1,
        "writeToolsRequireConfirmation": true
      }
    }
  ]
}