waysway
Waysway AI travel MCP for hotels, live prices, restaurants, flights, and activities.
Should I use this
Quality & Safety
Findings (1)
- LOWin clear_session
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"waysway": {
"url": "https://api.waysway.com/mcp"
}
}
}Remote endpoints
https://api.waysway.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (20)
🟢get_user_profile_schema
Return the strict standard schema for user_profile. IMPORTANT: - Only these standard UserProfile fields are allowed. - No alias mapping is supported. - city is NOT a profile field. - checkin_date / checkout_date are NOT profile fields. - Numeric budget constraints usually belong to search_hotels price_min/price_max. Use this tool when the external model is unsure what fields are allowed.
Input Schema
{
"type": "object",
"properties": {},
"title": "get_user_profile_schemaArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "get_user_profile_schemaDictOutput"
}🟡start_session(session_id, user_id, preferred_language, user_profile, metadata)
Create or replace a session. PURPOSE: - Initialize conversation state - Optionally store stable user profile fields DO: - pass stable or semi-stable profile information in user_profile - pass preferred_language if known - call this before other hotel-related tools DO NOT: - do NOT put city inside user_profile - do NOT put checkin_date or checkout_date inside user_profile - do NOT put search filters inside user_profile CORRECT WORKFLOW: 1. start_session(...) 2. update_user_profile_from_model(...) # optional 3. update_stay_dates(...) # optional 4. search_hotels(city=..., ...) WRONG: user_profile = { "city": "New York", "checkin_date": "2023-04-01", "checkout_date": "2023-04-05" } RIGHT: start_session(user_profile={"preferred_language": "en"}) update_stay_dates(checkin_str="2023-04-01", checkout_str="2023-04-05") search_hotels(city="New York", ...)
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"user_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "User Id"
},
"preferred_language": {
"default": "en",
"title": "Preferred Language",
"type": "string"
},
"user_profile": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "User Profile"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Metadata"
}
},
"required": [
"session_id"
],
"title": "start_sessionArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "start_sessionDictOutput"
}🟢get_session_state(session_id)
Get a compact summary of the current session state.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "get_session_stateArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "get_session_stateDictOutput"
}🔴clear_session(session_id)
Clear the entire session.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "clear_sessionArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "clear_sessionDictOutput"
}🟢list_sessions
List all in-memory session summaries. Useful for debugging only.
Input Schema
{
"type": "object",
"properties": {},
"title": "list_sessionsArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "list_sessionsDictOutput"
}🟡update_user_profile(session_id, user_profile, merge)
Update session.user_profile using standard UserProfile fields only. USE THIS WHEN: - the caller already has structured profile fields DO NOT PUT HERE: - city - checkin_date - checkout_date - raw numeric search constraints that belong in search_hotels Preferred profile fields include: - price_range - budget_flexibility - relationships - travel_purpose - hotel_style - facilities_like - surroundings_like
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"user_profile": {
"additionalProperties": true,
"title": "User Profile",
"type": "object"
},
"merge": {
"default": true,
"title": "Merge",
"type": "boolean"
}
},
"required": [
"session_id",
"user_profile"
],
"title": "update_user_profileArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "update_user_profileDictOutput"
}🟡update_user_profile_from_model(session_id, extracted_user_profile, merge)
Preferred path for profile extraction. The external model should: - read the user's natural language message - decide which STANDARD UserProfile fields are supported by evidence - send ONLY those fields here HARD RULES: - only standard UserProfile fields are allowed - do NOT invent new fields - do NOT put city here - do NOT put checkin_date or checkout_date here - omit uncertain fields instead of guessing - numeric budget constraints usually belong to search_hotels price_min/price_max GOOD EXAMPLE: { "relationships": "solo", "travel_purpose": "leisure", "hotel_style": "luxury", "facilities_like": "breakfast, gym", "surroundings_like": "downtown" } BAD EXAMPLE: { "city": "New York", "checkin_date": "2023-04-01", "checkout_date": "2023-04-05", "budget": 100 }
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"extracted_user_profile": {
"additionalProperties": true,
"title": "Extracted User Profile",
"type": "object"
},
"merge": {
"default": true,
"title": "Merge",
"type": "boolean"
}
},
"required": [
"session_id",
"extracted_user_profile"
],
"title": "update_user_profile_from_modelArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "update_user_profile_from_modelDictOutput"
}🟡extract_user_profile_from_text(text)
Lightweight fallback extraction from raw text. This is mainly for debugging and fallback use. It is NOT the preferred production path. Preferred production path: - external model understands raw text - external model outputs standard UserProfile fields - call update_user_profile_from_model(...)
Input Schema
{
"type": "object",
"properties": {
"text": {
"title": "Text",
"type": "string"
}
},
"required": [
"text"
],
"title": "extract_user_profile_from_textArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "extract_user_profile_from_textDictOutput"
}🟡ingest_user_message(session_id, message, merge, use_fallback_extraction)
Store raw user message into session context. IMPORTANT: This tool is no longer the main profile extraction path. RECOMMENDED USE: - store raw user text for context - let the external model decide profile fields - then call update_user_profile_from_model(...) DEFAULT BEHAVIOR: - append raw text into user_info - do not aggressively infer profile fields OPTIONAL: - if use_fallback_extraction=True, run a lightweight fallback extractor
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"message": {
"title": "Message",
"type": "string"
},
"merge": {
"default": true,
"title": "Merge",
"type": "boolean"
},
"use_fallback_extraction": {
"default": false,
"title": "Use Fallback Extraction",
"type": "boolean"
}
},
"required": [
"session_id",
"message"
],
"title": "ingest_user_messageArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "ingest_user_messageDictOutput"
}🟢normalize_stay_dates(checkin_str, nights, checkout_str, user_profile)
Parse stay dates without using session state. user_profile here is optional and only accepts standard profile fields. city is not required here.
Input Schema
{
"type": "object",
"properties": {
"checkin_str": {
"title": "Checkin Str",
"type": "string"
},
"nights": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Nights"
},
"checkout_str": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Checkout Str"
},
"user_profile": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "User Profile"
}
},
"required": [
"checkin_str"
],
"title": "normalize_stay_datesArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "normalize_stay_datesDictOutput"
}🟡update_stay_dates(session_id, checkin_str, nights, checkout_str)
Update session stay dates. USE THIS TOOL FOR: - check-in date - check-out date - nights-based date calculation DO NOT: - do NOT put dates inside user_profile - do NOT try to pass dates through start_session user_profile
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"checkin_str": {
"title": "Checkin Str",
"type": "string"
},
"nights": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Nights"
},
"checkout_str": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Checkout Str"
}
},
"required": [
"session_id",
"checkin_str"
],
"title": "update_stay_datesArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "update_stay_datesDictOutput"
}🟡search_hotels(session_id, city, main_interest, user_specific, room_type, ...)
Search and recommend hotels. USE THIS TOOL FOR: - city-based hotel search - main search intent - direct numeric search constraints such as price_min / price_max - explicit room or amenity filters IMPORTANT: - city MUST be passed here, not inside user_profile - user_profile is for stable preferences, not for search location - if dates are known, call update_stay_dates first - if profile preferences are known, call update_user_profile_from_model first RECOMMENDED ORDER: 1. start_session 2. update_user_profile_from_model (optional) 3. update_stay_dates (optional) 4. search_hotels(city=..., ...)
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"city": {
"title": "City",
"type": "string"
},
"main_interest": {
"title": "Main Interest",
"type": "string"
},
"user_specific": {
"default": "",
"title": "User Specific",
"type": "string"
},
"room_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Room Type"
},
"amenities": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Amenities"
},
"suitable": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Suitable"
},
"surroundings": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Surroundings"
},
"price_min": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Price Min"
},
"price_max": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Price Max"
},
"rating_min": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Rating Min"
},
"hotel_class_stars": {
"anyOf": [
{
"enum": [
3,
4,
5
],
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Class Stars"
},
"non_refundable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Non Refundable"
},
"limit": {
"default": 3,
"title": "Limit",
"type": "integer"
},
"required_name_terms": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Required Name Terms"
},
"exclude_hotel_codes": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Exclude Hotel Codes"
}
},
"required": [
"session_id",
"city",
"main_interest"
],
"title": "search_hotelsArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "search_hotelsDictOutput"
}🟢get_hotel_details(session_id, hotel_code_or_name)
Get detailed information for a hotel. Use this after search_hotels when the user asks for more details about a recommended option.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"hotel_code_or_name": {
"title": "Hotel Code Or Name",
"type": "string"
}
},
"required": [
"session_id",
"hotel_code_or_name"
],
"title": "get_hotel_detailsArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "get_hotel_detailsDictOutput"
}🟡check_stay_price(session_id, hotel_index, hotel_code_or_name)
Check live stay price for a previously recommended hotel. REQUIREMENT: - update_stay_dates must already have been called
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"hotel_index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Index"
},
"hotel_code_or_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Code Or Name"
}
},
"required": [
"session_id"
],
"title": "check_stay_priceArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "check_stay_priceDictOutput"
}🟡get_booking_offers(session_id, hotel_index, hotel_code_or_name, preferred_room_name, limit)
Get available hotel offers for the current session dates. REQUIREMENT: - update_stay_dates should already be set - hotel should come from previous search results
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"hotel_index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Index"
},
"hotel_code_or_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Code Or Name"
},
"preferred_room_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Preferred Room Name"
},
"limit": {
"default": 3,
"title": "Limit",
"type": "integer"
}
},
"required": [
"session_id"
],
"title": "get_booking_offersArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "get_booking_offersDictOutput"
}🟢search_restaurants_near_hotel(session_id, hotel_lon, hotel_lat, hotel_index, hotel_code_or_name)
Search restaurants near a hotel.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"hotel_lon": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Lon"
},
"hotel_lat": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Lat"
},
"hotel_index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Index"
},
"hotel_code_or_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Hotel Code Or Name"
}
},
"required": [
"session_id"
],
"title": "search_restaurants_near_hotelArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "search_restaurants_near_hotelDictOutput"
}🟢search_activities_in_city(session_id, city, limit)
Search activities in a city. If city is omitted, use session.city from prior hotel search.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "City"
},
"limit": {
"default": 3,
"title": "Limit",
"type": "integer"
}
},
"required": [
"session_id"
],
"title": "search_activities_in_cityArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "search_activities_in_cityDictOutput"
}🟢search_flight_content(session_id, airline_tag, limit)
Search airline-related content.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"airline_tag": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Airline Tag"
},
"limit": {
"default": 3,
"title": "Limit",
"type": "integer"
}
},
"required": [
"session_id"
],
"title": "search_flight_contentArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "search_flight_contentDictOutput"
}🟢search_homestays_in_city(session_id, city, limit)
Search homestays in a city. If city is omitted, use session.city from prior hotel search.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "City"
},
"limit": {
"default": 3,
"title": "Limit",
"type": "integer"
}
},
"required": [
"session_id"
],
"title": "search_homestays_in_cityArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "search_homestays_in_cityDictOutput"
}🟢health_check
Health check for the MCP server.
Input Schema
{
"type": "object",
"properties": {},
"title": "health_checkArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "health_checkDictOutput"
}Community
Evidence