waysway

Waysway AI travel MCP for hotels, live prices, restaurants, flights, and activities.

Should I use this

Quality & Safety

A
Description quality
96%
Schema completeness
67%
Naming quality
95%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'clear_session' description lacks action verbin clear_session

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,909Tokens (tool definitions)
~1.3 KBTypical response size
Significant attention impact (3.05% of 128k context)

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-http

What it can do

Tool inventory

Tools (20)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools
verifiedversion not recorded20 tools