Phuket activity search with live weather, sea state, transfer times and party-fit filtering.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Get full details for a specific experience by ID — prefer this for follow-up questions about products returned by search_experiences (pass its experience_id). Returns all safety/suitability attributes, pricing in THB (check price_note for per-person vs per-booking), and a direct booking link (book_now_url) with live availability. Always include the booking link when presenting details.
Experience ID (e.g. exp_170728P24)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Get full details for a specific experience by ID — prefer this for follow-up questions about products returned by search_experiences (pass its experience_id). Returns all safety/suitability attributes, pricing in THB (check price_note for per-person vs per-booking), and a direct booking link (book_now_url) with live availability. Always include the booking link when presenting details.
| Argument | Type | Description |
|---|---|---|
| experience_id* | string | Experience ID (e.g. exp_170728P24) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"experience_id"
],
"properties": {
"experience_id": {
"type": "string",
"description": "Experience ID (e.g. exp_170728P24)"
}
},
"additionalProperties": false
}Search Phuket activities for a travel party. Returns a portfolio of ~4 diverse recommendations (max 8 via max_results) from ~1,900 real experiences. **Portfolio, not top-k.** Each response contains one best-overall pick, alternative categories, and a wildcard/value option — all from distinct venues. Same-venue variants (different packages) appear as alternatives[] on each row. **Follow-ups.** Each candidate has a stable experience_id. Use get_experience with that ID for follow-up questions about any returned product — prefer this over web search for catalog items. Use `seen` or `exclude` to get fresh results on follow-up turns — zero overlap guaranteed. **Enriched results** (~350 products) have safety/suitability attributes (age floors, mobility, seasickness, wheelchair, pregnancy) and are ranked by context fit. **Basic results** (~1,550) have title/category/price only — excluded when safety filters are active. **Weather-aware.** Rain forecasts are slot-aware (morning/midday/evening). Outdoor activities get dry_window_match or rain_risk based on the requested time slot. Sea state penalizes open-sea activities when swell is moderate/rough. **Structured constraints — always pass them.** Translate traveler health and comfort needs into the structured constraints object: `motion_comfort: "low"` (avoid rough seas/bumpy rides), `mobility: "limited"` (wheelchair/walking difficulty), `pregnant: true`, `non_swimmer: true`. Do NOT pass medical language or health details as free text in any field. Even when the user says "ignore restrictions," still pass known constraints — the server filters on safety, not preference. **Booking links.** Every candidate includes book_now_url with live availability. Always include this link when presenting options — it is the booking path. Do not omit it or substitute external links. Prices: check price_note — most are per person in THB, but charter/private products show per-booking pricing. **Walk-in / no-advance-booking requests.** This tool cannot filter by walk-in availability. The advance_booking field in results indicates when booking is required or recommended, but absence does not confirm walk-in availability. For walk-in-specific requests, inform the user that walk-in filtering is not supported. **Caveats in the response.** transfer_note, return_by_note, duration_note, and advance_booking contain important caveats. Present them to the user — do not simplify transfer estimates into unqualified drive times or treat suggested visit durations as confirmed activity lengths.
| Argument | Type | Description |
|---|---|---|
| date* | string | ISO date, e.g. 2026-09-10 |
| seen | array | IDs already shown — guarantees fresh results |
| party* | array | Travel party members — ages help filter bookability and suitability |
| energy | string | Party energy level |
| exclude | object | Exclusions for follow-up turns |
| staying | string | Zone slug where the party is staying. Omit if unknown — server defaults to patong (central). |
| return_by | string | Time deadline e.g. "13:00" — filters activities that cannot finish and return by this time |
| time_slot | string | Preferred time of day |
| budget_thb | number | Max price per person in THB |
| constraints | object | Structured safety/comfort constraints. Translate traveler health and comfort needs into these flags rather than free text. |
| destination | string | Destination slug |
| max_results | number | Portfolio size (default 4, max 8) |
| max_duration_minutes | number |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"date",
"party"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"description": "ISO date, e.g. 2026-09-10"
},
"seen": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs already shown — guarantees fresh results"
},
"party": {
"type": "array",
"items": {
"type": "object",
"required": [
"role"
],
"properties": {
"age": {
"type": "number"
},
"role": {
"enum": [
"adult",
"child",
"senior"
],
"type": "string",
"description": "Traveler role"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Travel party members — ages help filter bookability and suitability"
},
"energy": {
"enum": [
"low",
"moderate",
"high"
],
"type": "string",
"description": "Party energy level"
},
"exclude": {
"type": "object",
"properties": {
"exp_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
},
"activity_tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "e.g. [\"zipline\"] excludes combos too"
}
},
"description": "Exclusions for follow-up turns",
"additionalProperties": false
},
"staying": {
"enum": [
"kata",
"karon",
"patong",
"kamala",
"bang_tao",
"rawai",
"panwa",
"old_town",
"mai_khao",
"airport",
"natai",
"khao_lak",
"ko_yao"
],
"type": "string",
"description": "Zone slug where the party is staying. Omit if unknown — server defaults to patong (central)."
},
"return_by": {
"type": "string",
"description": "Time deadline e.g. \"13:00\" — filters activities that cannot finish and return by this time"
},
"time_slot": {
"enum": [
"morning",
"midday",
"evening"
],
"type": "string",
"description": "Preferred time of day"
},
"budget_thb": {
"type": "number",
"description": "Max price per person in THB"
},
"constraints": {
"type": "object",
"properties": {
"mobility": {
"enum": [
"limited",
"moderate",
"full"
],
"type": "string",
"description": "Optional. Used only to exclude unsuitable activities for this request. Not stored."
},
"pregnant": {
"type": "boolean",
"description": "Optional. Used only to exclude unsuitable activities for this request. Not stored."
},
"non_swimmer": {
"type": "boolean",
"description": "Optional. Used only to exclude unsuitable activities for this request. Not stored."
},
"motion_comfort": {
"enum": [
"low",
"normal"
],
"type": "string",
"description": "Optional. Low avoids rough seas and bumpy rides. Used only to filter this request. Not stored."
}
},
"description": "Structured safety/comfort constraints. Translate traveler health and comfort needs into these flags rather than free text.",
"additionalProperties": false
},
"destination": {
"type": "string",
"default": "phuket",
"description": "Destination slug"
},
"max_results": {
"type": "number",
"default": 4,
"maximum": 8,
"minimum": 1,
"description": "Portfolio size (default 4, max 8)"
},
"max_duration_minutes": {
"type": "number"
}
},
"additionalProperties": false
}