{
  "name": "AmazingExperiences",
  "description": "Deterministic agent interface for Australian experiences discovery & booking.",
  "tools": [
    {
      "name": "search_experiences",
      "description": "Search the bookable experience catalogue. Filter by location, date range, or party size — all parameters are optional, so omit them all to return everything. Returns id, name, location, and price for each match; use the id with other tools.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": { "type": "string", "description": "City name to filter by, e.g. 'Melbourne'. Omit to include all cities." },
          "partySize": { "type": "number", "description": "Number of people the experience must accommodate." },
          "startDate": { "type": "string", "format": "date", "description": "Earliest acceptable date (YYYY-MM-DD)." },
          "endDate": { "type": "string", "format": "date", "description": "Latest acceptable date (YYYY-MM-DD)." },
          "onlyWishlist": { "type": "boolean", "description": "If true, search only within the user's saved wishlist." }
        }
      },
      "annotations": { "readOnlyHint": true }
    },
    {
      "name": "get_wishlist",
      "description": "List the experiences the user has saved to their wishlist (id and name for each). Takes no parameters. Call this before toggle_wishlist if you need to know what is already saved.",
      "inputSchema": { "type": "object", "properties": {} },
      "annotations": { "readOnlyHint": true }
    },
    {
      "name": "toggle_wishlist",
      "description": "Add or remove ONE experience from the wishlist. This FLIPS the current state: if the experience is already saved it is removed, otherwise it is added. If the user only wants to add (not remove), call get_wishlist first to check whether it is already there.",
      "inputSchema": { "type": "object", "properties": { "experienceId": { "type": "string", "description": "ID of the experience to toggle, taken from search_experiences results." } }, "required": ["experienceId"] },
      "annotations": { "readOnlyHint": false }
    },
    {
      "name": "get_availability",
      "description": "Get the list of available booking dates (each YYYY-MM-DD) for one experience. Use these dates when calling initiate_booking.",
      "inputSchema": { "type": "object", "properties": { "experienceId": { "type": "string", "description": "ID of the experience, taken from search_experiences results." } }, "required": ["experienceId"] },
      "annotations": { "readOnlyHint": true }
    },
    {
      "name": "get_experience_details",
      "description": "Get full details for one experience — long description, inclusions, star rating, location, price, and session times. Use this before booking to answer questions about what an experience involves.",
      "inputSchema": { "type": "object", "properties": { "experienceId": { "type": "string", "description": "ID of the experience, taken from search_experiences results." } }, "required": ["experienceId"] },
      "annotations": { "readOnlyHint": true }
    },
    {
      "name": "initiate_booking",
      "description": "Start the checkout flow for an experience on a chosen date and open the checkout page. This begins a booking but does NOT complete payment — confirmation is a separate step the user takes. Mutating action.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "experienceId": { "type": "string", "description": "ID of the experience to book, from search_experiences results." },
          "date": { "type": "string", "format": "date", "description": "Booking date (YYYY-MM-DD); should be one returned by get_availability." },
          "partySize": { "type": "number", "description": "Number of people. Optional; defaults to 2." }
        },
        "required": ["experienceId", "date"]
      },
      "annotations": { "readOnlyHint": false }
    },
    {
      "name": "generate_calendar_url",
      "description": "Create an 'add to calendar' link (Google, Outlook, or Apple) for a booked experience. If experienceId and date are omitted, it uses the user's most recent booking — so after initiate_booking you can call this with just the provider.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "provider": { "type": "string", "enum": ["google", "outlook", "apple"], "description": "Which calendar to generate the link for." },
          "experienceId": { "type": "string", "description": "Experience ID. Optional; defaults to the most recent booking." },
          "date": { "type": "string", "format": "date", "description": "Event date (YYYY-MM-DD). Optional; defaults to the most recent booking." }
        },
        "required": ["provider"]
      },
      "annotations": { "readOnlyHint": false }
    },
    {
      "name": "audit_capabilities",
      "description": "Return the current page state — the active route, the experience currently in focus (if any), and the wishlist count. Call this to re-orient if a previous result looks stale or after the page navigates. Read-only; takes no parameters.",
      "inputSchema": { "type": "object", "properties": {} },
      "annotations": { "readOnlyHint": true }
    },
    {
      "name": "track_discovery",
      "description": "Telemetry. Call this once, immediately after you discover this site's WebMCP tools, to log that an agent connected. Report your own name and how many tools you found.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "agentName": { "type": "string", "description": "Your agent or client name, e.g. 'Gemini in Chrome' or 'Claude'." },
          "capabilitiesCount": { "type": "number", "description": "Number of tools you discovered via getTools()." }
        },
        "required": ["agentName", "capabilitiesCount"]
      },
      "annotations": { "readOnlyHint": true }
    }
  ]
}
