addrbookFor publishers
← The evidence ledger

Evidence row 574050

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 6dd45f4f-f418-4258-8d15-4319987af50a
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
0dcca2568867c7a48cf5eef3966c7f3438407c3ce17ee0bec42a640a53cdd68d
Leaf
0x8e35ebe408bc1d6b871b2164886db814f1a4a53d23c0f276e1c9167d5a2e1f3a

What was observed

{
  "count": 7,
  "tools": [
    {
      "description": "Add an experience to the cart. Requires a connected GetExperience account: without user authorization the call is answered with an OAuth sign-in challenge (HTTP 401, or a tool error carrying the challenge on clients that link accounts per tool) — connect the account and retry. Call get_experience_schedule first and take configId, startAt from the chosen slot — pass them here EXACTLY as returned. Also pass durationMinutes when the slot provides it; if it is null, you may omit it and the server will substitute the experience's default duration.\n\nRETURNS: sessionId, checkoutId, total price.\n⚠️ SAVE sessionId — you will need it for get_checkout and create_order.\nTo add multiple experiences to the same cart: reuse the same sessionId in subsequent calls.\n\nNEXT STEP: After adding to cart, call get_checkout to see full cart details including payment options. If partial payment is available, the checkout will show deposit amount vs total — present both to the user.\n\nBOOKING FLOW: get_experience_schedule → add_to_checkout → get_checkout → create_order\n\nPRICE BREAKDOWN: catalog prices (search/details/schedule) are WITHOUT the service fee; the checkout total is WITH it. When the response includes the breakdown, it shows Subtotal (excl. service fee) + Service fee = Total — present all three lines to the user. If the response has only Total (older deployments / breakdown unavailable), show just the Total — NEVER invent or compute the split yourself.\n\n[GXP_STRUCTURED] block: data.sessionId, data.checkoutId, data.subTotalPrice(+Formatted), data.totalServiceFee(+Formatted), data.totalPrice(+Formatted).",
      "inputSchema": {
        "properties": {
          "adults": {
            "default": 1,
            "description": "Number of adults (default: 1).",
            "type": "number"
          },
          "babies": {
            "default": 0,
            "description": "Number of babies (default: 0).",
            "type": "number"
          },
          "children": {
            "default": 0,
            "description": "Number of children (default: 0).",
            "type": "number"
          },
          "currency": {
            "default": "USD",
            "description": "Pricing currency: EUR, USD, etc. (default: USD).",
            "type": "string"
          },
          "durationMinutes": {
            "description": "durationMinutes from the get_experience_schedule slot, if provided. Optional — omit if the slot's durationMinutes is null and the server will fall back to the experience's default duration.",
            "type": "number"
          },
          "experienceId": {
            "description": "Experience ID from search_experiences or get_experience_details.",
            "type": "number"
          },
          "includeStructuredData": {
            "default": true,
            "description": "Include [GXP_STRUCTURED] JSON block in markdown response (default: true).",
            "type": "boolean"
          },
          "isPrivate": {
            "default": false,
            "description": "Private group booking — higher price, exclusive slot (default: false).",
            "type": "boolean"
          },
          "responseFormat": {
            "default": "markdown",
            "description": "markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only.",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          },
          "scheduleConfigId": {
            "description": "configId from get_experience_schedule slot. Copy the exact value — do not modify.",
            "type": "number"
          },
          "sessionId": {
            "description": "Session ID. If omitted, a new session is created automatically — save the returned sessionId. Reuse to add more items to the same cart.",
            "type": "string"
          },
          "startAt": {
            "description": "startAt from get_experience_schedule slot (ISO datetime). Copy the exact value — do not modify.",
            "type": "string"
          }
        },
        "required": [
          "experienceId",
          "scheduleConfigId",
          "startAt"
        ],
        "type": "object"
      },
      "name": "add_to_checkout"
    },
    {
      "description": "Place the booking order for the cart — the last step of the booking flow. Requires a connected GetExperience account: without user authorization the call is answered with an OAuth sign-in challenge (HTTP 401, or a tool error carrying the challenge on clients that link accounts per tool) — connect the account and retry.\n\nBOOKING FLOW: search → get_details → get_schedule → add_to_checkout → get_checkout → create_order\n\nThe order is created UNPAID (status \"new\") and the response carries a secure payment link. Share the link with the user: payment is completed on the checkout page in their browser — never in the chat, and never ask the user for card details. The booking becomes active after payment. The link expires in 24 hours.\n\nDo NOT ask for guest details: the booking is attributed to the connected GetExperience account — name and e-mail come from the account, and GetExperience e-mails the confirmation and voucher to the account address (hosts never e-mail guests directly). The ONLY detail that can be missing is a phone number: if the server reports that the account has none on file, ask the user for their phone and retry with user: { tel: \"+34...\", countryCode: \"ES\" }. The number is saved to their account, so this happens at most once.\n\n⚠️ CANCELLATION POLICY REMINDER — MANDATORY BEFORE PAYMENT:\nBefore calling create_order, you MUST remind the user about the cancellation policy (from get_experience_details response). If the policy is strict (no refunds), explicitly warn: \"Once you pay, this booking cannot be canceled or refunded.\" If flexible, reassure them. If unknown, advise checking with the host. Do NOT proceed to payment without this disclosure.\n\n💰 PAYMENT TYPE CHOICE — ASK BEFORE ORDERING:\nCheck paymentOptions from get_checkout or get_experience_details. If \"part\" is available, you MUST ask the user before placing the order: \"Would you like to pay the full amount ($X) or just the deposit ($Y) and pay the rest on site?\" Then pass the chosen paymentType (\"full\" or \"part\") to create_order.\n\n[GXP_STRUCTURED] block: data.orderId, data.status, data.priceFormatted, data.paymentType, data.paidAmountFormatted, data.link, data.paymentPageUrl.",
      "inputSchema": {
        "properties": {
          "checkoutId": {
            "description": "Checkout ID from add_to_checkout or get_checkout.",
            "type": "number"
          },
          "includeStructuredData": {
            "default": true,
            "description": "Include [GXP_STRUCTURED] JSON block in markdown response (default: true).",
            "type": "boolean"
          },
          "paymentType": {
            "default": "full",
            "description": "Payment type. 'full' (default) = pay entire amount now. 'part' = pay deposit now, rest on site. Must be allowed by the experience: the API rejects a type missing from paymentOptions (422) — including 'full' on part-only tours, where you MUST pass 'part'. Check paymentOptions in get_checkout or get_experience_details.",
            "enum": [
              "full",
              "part"
            ],
            "type": "string"
          },
          "responseFormat": {
            "default": "markdown",
            "description": "markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only.",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          },
          "user": {
            "description": "OMIT by default — name and e-mail come from the connected account. Pass ONLY when the server reported that the account has no phone number on file: { tel, countryCode }.",
            "properties": {
              "countryCode": {
                "default": "US",
                "description": "Two-letter country code of the phone number (e.g. ES, US).",
                "type": "string"
              },
              "tel": {
                "description": "The user's phone number in international format (e.g. +34600000000).",
                "type": "string"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "checkoutId"
        ],
        "type": "object"
      },
      "name": "create_order"
    },
    {
      "description": "Get current cart contents by sessionId.\n\nUse when: you need to confirm what's in the cart before placing the order, or to retrieve checkoutId if it was not saved after add_to_checkout.\n\nsessionId is returned by add_to_checkout — always save it.\n\nRETURNS: checkoutId (required for create_order), list of items with titles and prices, total price, payment options.\n\n💰 PARTIAL PAYMENT INFO:\nIf paymentOptions includes \"part\", the response shows:\n- Total price (full amount)\n- Pay now (deposit amount)\n- Pay on site (remaining amount)\nPresent all three amounts to the user clearly. Before proceeding to create_order, ask: \"Would you like to pay the full amount or just the deposit?\"\n\nPRICE BREAKDOWN: catalog prices (search/details/schedule) are WITHOUT the service fee; the checkout total is WITH it. When the response includes the breakdown, it shows Subtotal (excl. service fee) + Service fee = Total — present all three lines to the user. If the response has only Total (older deployments / breakdown unavailable), show just the Total — NEVER invent or compute the split yourself.\n\n[GXP_STRUCTURED] block: data.checkoutId, data.items[], data.subTotalPrice(+Formatted), data.totalServiceFee(+Formatted), data.totalPrice(+Formatted), data.paymentOptions, data.totalPrepayPriceFormatted, data.payLaterPriceFormatted.",
      "inputSchema": {
        "properties": {
          "includeStructuredData": {
            "default": true,
            "description": "Include [GXP_STRUCTURED] JSON block in markdown response (default: true).",
            "type": "boolean"
          },
          "responseFormat": {
            "default": "markdown",
            "description": "markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only.",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          },
          "sessionId": {
            "description": "Session ID returned by add_to_checkout. Used to identify the cart.",
            "type": "string"
          }
        },
        "required": [
          "sessionId"
        ],
        "type": "object"
      },
      "name": "get_checkout"
    },
    {
      "description": "Get full details of a specific experience by ID.\n\nCall when: the user wants to learn more about a tour before booking, or to confirm full description, photos, pricing and availability options.\nCall after search_experiences — use id from search results.\n\nAll prices are in USD.\n\nRETURNS: full description, all photos, price breakdown, duration, guide languages, group size limits, categories, rating, cancellation policy, payment options, included features, booking link.\n\n⚠️ CANCELLATION POLICY — MANDATORY DISCLOSURE:\nThe response includes cancellationPolicy field. You MUST clearly communicate it to the user when presenting experience details. Examples:\n- Strict policy: \"Please note: this experience has a strict cancellation policy — no refunds after booking.\"\n- Flexible policy: \"Good news — free cancellation up to 24 hours before the experience.\"\n- If cancellationPolicy is null or empty: \"Cancellation policy is not specified — we recommend contacting the host before booking.\"\nAlways present this BEFORE the user proceeds to booking.\n\n━━━ HOW TO PRESENT THIS EXPERIENCE ━━━\nDEFAULT PRESENTATION — a rich card, not a wall of text. The response carries a\n[GXP_STRUCTURED] block: lead with the photos (photos[] is the gallery, mainPhoto the\nhero image), then title, price, duration, rating, what's included, the cancellation\nline above, and a link/button to the \"link\" field. Photo URLs are public CDN links usable\ndirectly in <img> tags. Fall back to the markdown text only on text-only surfaces or\nwhen the user asks for plain text. The card format never removes a required disclosure:\nthe cancellation policy and, when partial payment is available, the deposit option must\nstill be stated (see the sections above).\n\n💰 PARTIAL PAYMENT — PROACTIVE SUGGESTION:\nThe response includes paymentOptions ([\"full\"], [\"part\"] or [\"full\", \"part\"]). If \"part\" is present, you MUST proactively tell the user: \"This experience offers partial payment — you can pay a deposit now and the rest on site.\" The deposit is in prepayPrice (display string) / prepayPriceCents (number) in the structured item — show it next to the total price. If paymentOptions is [\"part\"] only, full online payment is NOT available: pass paymentType: \"part\" to create_order (the API rejects \"full\" for such tours). When both options exist, ask the user: \"Would you like to pay the full amount or just the deposit?\"\n\n[GXP_STRUCTURED] block: data.item — single experience object with all fields including cancellationPolicy, paymentOptions, prepayPrice(+Cents), features, onDemand.\nParse: const match = text.match(/\\[GXP_STRUCTURED\\]([\\s\\S]*?)\\[\\/GXP_STRUCTURED\\]/); const data = JSON.parse(match[1].trim());",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "Experience ID from search_experiences results.",
            "type": "number"
          },
          "includeStructuredData": {
            "default": true,
            "description": "Include [GXP_STRUCTURED] JSON block in markdown response (default: true).",
            "type": "boolean"
          },
          "lang": {
            "description": "Language of response content (title, description, highlights, itinerary, etc.). ALWAYS set this to the language the END USER wrote in — the same value you used in search_experiences. Supported: en, es, de, ru, cn, fr, ar, pl, it, pt, nl, tr, cs, th, gr. Falls back to 'en' if omitted or if the user's language is not in this list.",
            "type": "string"
          },
          "responseFormat": {
            "default": "markdown",
            "description": "markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only.",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_experience_details"
    },
    {
      "description": "Get available time slots for a specific experience on a specific date. Required step before booking.\n\nCRITICAL: Copy configId and startAt EXACTLY from the chosen slot — pass these unchanged to add_to_checkout. Do not modify or recalculate these values. Copy durationMinutes when the slot provides it; if the slot returns durationMinutes as null (common for on-demand or flexible schedules), you may omit it from add_to_checkout — the server will fill it in from the experience's default duration.\n\nAll prices are in USD.\n\nRETURNS: available slots with configId, startAt (ISO datetime), durationMinutes.\nEach slot exposes price per adult / child / private group in two formats:\n- numeric USD values: priceAdult, priceChild, pricePrivateGroup (for arithmetic — e.g. priceAdult * adults)\n- formatted display strings: priceAdultFormatted, priceChildFormatted, pricePrivateGroupFormatted (e.g. \"US$45.00\", for display)\n- partial payment: prepayPriceFrom (deposit, USD number) + prepayPricePublicFormatted / prepayPricePrivateGroupFormatted; null when the tour is full-payment only\n\nBOOKING FLOW: search_experiences → get_experience_schedule → add_to_checkout → create_order\n\n[GXP_STRUCTURED] block: data.slots[] — array of available slots with all pricing details.",
      "inputSchema": {
        "properties": {
          "date": {
            "description": "Date in YYYY/MM/DD or YYYY-MM-DD format (e.g. 2026/03/08). Must be a future date.",
            "type": "string"
          },
          "id": {
            "description": "Experience ID from search_experiences or get_experience_details.",
            "type": "number"
          },
          "includeStructuredData": {
            "default": true,
            "description": "Include [GXP_STRUCTURED] JSON block in markdown response (default: true).",
            "type": "boolean"
          },
          "responseFormat": {
            "default": "markdown",
            "description": "markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only.",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "date"
        ],
        "type": "object"
      },
      "name": "get_experience_schedule"
    },
    {
      "description": "Send an availability request to the host of an ON-DEMAND experience.\n\nCall when: an experience is \"available on request\" (onDemand: true in search/details, or get_experience_schedule says \"available on request\") and the user wants it for specific dates. On-demand experiences CANNOT be booked instantly — the host must confirm availability first. This tool sends the request; it does NOT create a booking or charge anyone.\n\nDo NOT call for instant-booking experiences (onDemand: false) — use get_experience_schedule → add_to_checkout → create_order instead. The tool rejects non-on-demand experiences with an error.\n\nBEFORE calling, collect from the user: preferred dates, number of guests, their NAME and EMAIL (required — the host's answer is delivered to this email and to the guest's account in the app where the request was made; without email the guest never learns the result).\n\nWHAT HAPPENS NEXT (tell the user):\n1. The host reviews the request, usually within 24–48 hours.\n2. The guest gets the answer by email and in their account.\n3. If confirmed — the answer contains a booking link valid for 12 hours.\n4. If declined — suggest other experiences nearby.\nThere is no status-polling endpoint; the answer is delivered to the guest directly, not to this chat.\n\n⚠️ Limit: up to 3 availability requests at a time per guest.\n\n[GXP_STRUCTURED] block: data.requestId, experienceId, dates, guests, hostResponseWindowHours, bookingWindowHoursAfterConfirm.",
      "inputSchema": {
        "properties": {
          "adults": {
            "description": "Number of adults. At least one guest (adult or child) is required in total.",
            "type": "number"
          },
          "babies": {
            "description": "Number of babies (default: 0).",
            "type": "number"
          },
          "children": {
            "description": "Number of children (default: 0).",
            "type": "number"
          },
          "comment": {
            "description": "Guest's wishes / notes for the host (optional). E.g. preferred time of day, special requests.",
            "type": "string"
          },
          "email": {
            "description": "Guest's email. REQUIRED — the host's answer (confirm/decline + booking link) is delivered here and to the guest's account. Ask the user.",
            "type": "string"
          },
          "experienceId": {
            "description": "Experience ID from search_experiences / get_experience_details. Must be an on-demand experience.",
            "type": "number"
          },
          "includeStructuredData": {
            "default": true,
            "description": "Include [GXP_STRUCTURED] JSON block in markdown response (default: true).",
            "type": "boolean"
          },
          "name": {
            "description": "Guest's name. REQUIRED — ask the user.",
            "type": "string"
          },
          "periodEnd": {
            "description": "Preferred end date, YYYY/MM/DD or YYYY-MM-DD. Defaults to periodStart for a single-day request.",
            "type": "string"
          },
          "periodStart": {
            "description": "Preferred start date, YYYY/MM/DD or YYYY-MM-DD (e.g. 2026/07/15). Must be in the future.",
            "type": "string"
          },
          "responseFormat": {
            "default": "markdown",
            "description": "markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only.",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          },
          "tel": {
            "description": "Guest's phone (optional).",
            "type": "string"
          }
        },
        "required": [
          "experienceId",
          "periodStart",
          "adults",
          "name",
          "email"
        ],
        "type": "object"
      },
      "name": "request_availability"
    },
    {
      "description": "Search for tours and experiences on GetExperience.com. Works without an account or authentication. Returns list of matching experiences with id, title, price, location, duration, rating, payment type, photos, booking link.\n\nBOOKING FLOW: search_experiences → get_experience_details → get_experience_schedule → add_to_checkout → create_order\n\nEXAMPLES:\n- \"walking tour in Istanbul\" → location: \"Istanbul\", categories: [\"walking-tour\"]\n- \"romantic dinner in Paris\" → location: \"Paris\", categories: [\"romantic\", \"food-and-drink\"]\n- \"things to do in Bali\" → location: \"Bali\"\n- \"водные виды спорта в Анталье\" → location: \"Antalya\", categories: [\"water-sports\"], lang: \"ru\"\n- \"short private tour with free cancellation\" → privateGroup: true, standardCancellation: true, durations: [\"10-60\"]\n- \"tours with partial payment in Turkey\" → countryCode: \"TR\", paymentOptions: \"part\"\n- \"yacht party\" → q: \"yacht party\"\n- \"tours for solo traveler\" → peopleMin: 1\n- \"tours with transport included\" → features: [\"transport\"]\n\nAll prices are in USD.\n\nSEARCH TIPS:\n- location: use English name for best results (e.g. \"Istanbul\" not \"Стамбул\"). Non-Latin input is supported but English is more reliable.\n- If location is not found, you'll get a clear error — not random results. Try a broader location (country instead of city).\n- \"languages\" filters tours by guide language ([\"es\"] = tours in Spanish)\n- \"lang\" sets the language of titles and descriptions in the response. ALWAYS pass it, matching the END USER's language (e.g. Russian query → lang: \"ru\"), even when location/other params are in English. Supported: en, es, de, ru, cn, fr, ar, pl, it, pt, nl, tr, cs, th, gr; falls back to \"en\" if unsupported.\n- All filters can be combined: location + categories + paymentOptions + durations + standardCancellation etc.\n- \"q\" is a free-text search across titles and descriptions — use it for specific queries that don't fit into categories.\n\n━━━ PAGINATION ━━━\nResults are paginated (default 25 per page). The response always shows the total count and which results you're viewing (e.g. \"showing 1–25 of 80\"). If there are more results, ALWAYS offer the user to see the next page. Use page parameter to fetch subsequent pages.\n\n━━━ HOW TO PRESENT THESE RESULTS ━━━\nDEFAULT PRESENTATION — a visual card gallery, not a plain text list. Every response\ncarries a [GXP_STRUCTURED] block; build the gallery from it whenever the surface can\nrender rich output, without waiting to be asked. Fall back to the markdown text above\nonly on text-only surfaces or when the user explicitly asks for a plain list.\n\nEach card shows, in this order:\n  1. the photo — mainPhoto (photos[] holds more; keep the aspect ratio, no cropping of faces)\n  2. title\n  3. price (the \"price\" field is already formatted; priceCents is the raw value)\n  4. duration, and rating with review count when present\n  5. a link/button to the item's \"link\" field, labelled like \"View\" / \"Подробнее\" (localise to the user's language)\nLay the cards out in a responsive grid (2–3 per row on desktop, 1 on mobile), keep the\nsource order — it is relevance-ranked — and render every returned item, not a subset.\nPhoto URLs are public CDN links and may be used directly in <img> tags.\nThe cards REPLACE the plain list, not the surrounding information: still convey the\nresult count / pagination line above and offer the next page when more results exist.\n\nParse the block with:\n  const match = text.match(/\\[GXP_STRUCTURED\\]([\\s\\S]*?)\\[\\/GXP_STRUCTURED\\]/);\n  const data = match ? JSON.parse(match[1].trim()) : null;\n  // → data.items[] — each item has: id, title, price, priceCents, location,\n  //   durationMinutes, rating, reviewsCount, mainPhoto, photos[], paymentOptions, link\n\nTo get pure JSON without markdown: set responseFormat: \"json\"",
      "inputSchema": {
        "properties": {
          "categories": {
            "description": "Filter by activity type using category slugs. Categories have two levels:\n\nTOP-LEVEL (use these for broad filtering — recommended for most queries):\nanimals, nature-and-outdoors, art-and-culture, food-and-drink, entertainment, sightseeing, shopping, sports, wellness, rides, transfers, cruises, stopover-tours, multicity-tours, romantic, children, winter-holiday, hotels, flights\n\nSUBCATEGORIES (optional — use only when looking for something specific/niche):\n- animals → beekeeping, birdwatching, horseback-riding-tour, whale-watching\n- nature-and-outdoors → wildlife, outdoor-hiking, water, night-sky\n- art-and-culture → art, society, science, literature, history\n- food-and-drink → cooking-and-food-making, food-and-market-tours, beer, wine, coffee\n- entertainment → gaming, music, dance, comedy, circus, theater, nightlife\n- sightseeing → walking-tour, museum-tour, photography-tour, extraordinary-tour\n- shopping → shopping-tour, factories-tour, outlet-tours, fashion-events-tour\n- sports → water-sports, mountain-sports, adrenaline-sports, outdoor-sports, snow-sports\n- wellness → yoga, spa, mindfulness, holistic-health, beauty, bodywork\n- rides → cycling-tour, boat-tour, helicopter-tour, hot-air-balloon-tour\n- transfers → rentacar",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "countryCode": {
            "description": "ISO 3166-1 alpha-2 country code (e.g. 'TR' for Turkey, 'ES' for Spain). Filters by country directly.",
            "type": "string"
          },
          "dateFrom": {
            "description": "Start date in YYYY/MM/DD format (e.g. 2026/03/08).",
            "type": "string"
          },
          "dateTo": {
            "description": "End date in YYYY/MM/DD format (e.g. 2026/03/15).",
            "type": "string"
          },
          "durations": {
            "description": "Filter by duration ranges in minutes. E.g. ['10-60'] for under 1 hour, ['60-180'] for 1-3 hours, ['180-480'] for half-day, ['480-1440'] for full day. Multiple ranges allowed.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "features": {
            "description": "Filter by what's included. Values: guide, transport, entranceFee, transfer, equipment, accommodation, meals, alcoholicDrinks, nonAlcoholicDrinks, insurance, gratuities, snacks.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "guestsCount": {
            "description": "Number of guests.",
            "type": "number"
          },
          "includeStructuredData": {
            "default": true,
            "description": "Include [GXP_STRUCTURED] JSON block in markdown response (default: true). Set false for plain text only.",
            "type": "boolean"
          },
          "lang": {
            "description": "Language of response content (titles, descriptions). ALWAYS set this to the language the END USER wrote their request in — e.g. Russian query → 'ru', Turkish → 'tr', Arabic → 'ar', Spanish → 'es'. Set it regardless of the language used for other parameters (location is often in English). Supported: en, es, de, ru, cn, fr, ar, pl, it, pt, nl, tr, cs, th, gr. Falls back to 'en' if omitted or if the user's language is not in this list. Do NOT confuse with 'languages' (that filters tours by guide language).",
            "type": "string"
          },
          "languages": {
            "description": "Filter by guide language — language the tour is conducted in (e.g. ['en'], ['en', 'es']). Supported: en, es, de, ru, fr, it, tr, ar, zh, ja, ko, pt.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "location": {
            "description": "City, country, or region name. Use English for best results (e.g. 'Istanbul', 'Bali', 'Spain'). Non-Latin input supported but less reliable.",
            "type": "string"
          },
          "maxPrice": {
            "description": "Maximum price in USD (not cents). E.g. 200 = $200.",
            "type": "number"
          },
          "minPrice": {
            "description": "Minimum price in USD (not cents). E.g. 50 = $50.",
            "type": "number"
          },
          "onDemand": {
            "description": "true = only on-demand experiences (book by request). false = only scheduled experiences (fixed timetable).",
            "type": "boolean"
          },
          "page": {
            "description": "Page number for pagination (default: 1).",
            "type": "number"
          },
          "paymentOptions": {
            "description": "Filter by payment type. 'full' = only full payment, 'part' = only experiences with partial payment (pay deposit now, rest later).",
            "enum": [
              "full",
              "part"
            ],
            "type": "string"
          },
          "peopleMin": {
            "description": "Your group size. Filters out experiences that require more people. E.g. peopleMin=1 for solo traveler — hides tours with minimum 4 guests.",
            "type": "number"
          },
          "perPage": {
            "description": "Results per page (default: 25, max: 100).",
            "type": "number"
          },
          "privateGroup": {
            "description": "true = only experiences available as private tours.",
            "type": "boolean"
          },
          "publicGroup": {
            "description": "true = only experiences available as group tours.",
            "type": "boolean"
          },
          "q": {
            "description": "Free-text search query (e.g. 'romantic sunset dinner', 'yacht party'). Searches in titles and descriptions. Can be combined with other filters.",
            "type": "string"
          },
          "responseFormat": {
            "default": "markdown",
            "description": "markdown (default): chat-friendly text + [GXP_STRUCTURED] block for card rendering. json: pure JSON only, no markdown — for programmatic parsing.",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          },
          "standardCancellation": {
            "description": "true = only experiences with standard cancellation policy (free cancellation 24h before start).",
            "type": "boolean"
          },
          "tags": {
            "description": "Filter by experience tags.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "name": "search_experiences"
    }
  ]
}

What the leaf hashes

{"body":"0dcca2568867c7a48cf5eef3966c7f3438407c3ce17ee0bec42a640a53cdd68d","id":574050,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793141380261517,"prev":null,"subject":"6dd45f4f-f418-4258-8d15-4319987af50a","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (273461 rows).

  1. 0x8e3660350e2859082f2ceb409bfb33f6b4e59e86c12ba780f18a0c4d510c35e1
  2. 0xe29d1a97545239a69a805a4ec45975e39d3466d44ef39f13f64bc5a25f5d2dcb
  3. 0x015b37c3892b0dea268ac8b358d7e57c9dd4fbf133336d36e33e31d646d0b782
  4. 0x462bbe92e682dfaac323e2b187dc337d3ca6d4838258fb013041b5654115f33a
  5. 0x3b65c9aa0e23efca1a002015a89a3b2ba45596658c451eb89e1c1b1d0466cb7a
  6. 0xddafea7bbe702cfb3edf20a7316a60f5c8f29dcd203dc431a48130d3921fec86
  7. 0xe8f1c51553f937fbc66dc9342ee9819a355f0dca6d1ec035e3cb55ef60f66948
  8. 0xf3d60c0b7568994f09107c32d29a8b743f063ee950aba0f91dd4910936536b43
  9. 0x1eec283aa30eadd37e7b1b959495132e54c44d4487a510070cb056fbdd92307b
  10. 0x82a1b5b7b16a6a11c53f4b84b2d8911e534634b6f4cb9715dbe70c4f33116a52
  11. 0x5d0dfc183bf4faa332fcfb11ba54acfc81c21a52f31b623cbcf436e9be1faf44
  12. 0xe0e69ccf3eae9f1603c5f7e4a938a5ebe41708a9b4f6cb15a530b2e2aa69d8a0
  13. 0xea3d566bf95ca7a3a7f6de9c4f77180bd8c5ffd160486a27d870e8a2fb6d0b9e
  14. 0x06e3b43165f5b3c31d850bc32f20b2e25b844564c4e042c141b9748c26a5a600
  15. 0xb4f7223140c8a36cb87a63d77cf617086d9968dc4658f03e102571ebe06e9ed6
  16. 0xfecf3d4646dd4984a13dd715499e842c3fde63692336d97394c2bfd8e877ca5d
  17. 0xf30fddbf4811226c58e8f0daf36fddd79fc5f1356b592bb1d99a8061ddbabe66
  18. 0x2bf8151e5f157dd183b9de6fa00469551932a7a6e3f33a694895000ac9061197
  19. 0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699
Day root
0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795
Chained
0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4
Published
On Arc Testnet, block 69414147: 0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4

How to check it · This row as JSON