# io.github.Waysway-app/waysway

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

- name: io.github.Waysway-app/waysway
- version: 1.0.0
- connection class: unknown (unknown)
- trust: 57/100 flags: unreachable
- quality: 79/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.Waysway-app%2Fwaysway
- tools: https://api.protogrid.dev/v1/servers/io.github.Waysway-app%2Fwaysway/tools

**Not classified yet.** The remote endpoints have not been probed successfully, or the listing has nothing to connect to.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "waysway": {
      "type": "http",
      "url": "https://api.waysway.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 0
- freshness: 65
- provenance: 80
- drivers: +repository +namespace-matches-repo -unreachable(6 failures) ~updated-176d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 79/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 71 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: clear_session (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); start_session (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); extract_user_profile_from_text (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 3,366 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 20, about 3,366 tokens to load them all
- tool set hash: 46bc20c94482a520e718f94b0df907cd
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.Waysway-app/waysway.svg)](https://protogrid.dev/servers/io.github.Waysway-app/waysway)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://api.waysway.com/mcp (streamable-http, auth none, reachable false, uptime30d 0.925)

## Packages

_none_

## Tools (20)

- `check_stay_price`: 
    Check live stay price for a previously recommended hotel.

    REQUIREMENT:
    - update_stay_dates must already have been called
    
- `clear_session`: 
    Clear the entire session.
    
- `extract_user_profile_from_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(...)
    
- `get_booking_offers`: 
    Get available hotel offers for the current session dates.

    REQUIREMENT:
    - update_stay_dates should already be set
    - hotel should come from previous search results
    
- `get_hotel_details`: 
    Get detailed information for a hotel.

    Use this after search_hotels when the user asks for more details
    about a recommended option.
    
- `get_session_state`: 
    Get a compact summary of the current session state.
    
- `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.
    
- `health_check`: 
    Health check for the MCP server.
    
- `ingest_user_message`: 
    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
    
- `list_sessions`: 
    List all in-memory session summaries.
    Useful for debugging only.
    
- `normalize_stay_dates`: 
    Parse stay dates without using session state.

    user_profile here is optional and only accepts standard profile fields.
    city is not required here.
    
- `search_activities_in_city`: 
    Search activities in a city.

    If city is omitted, use session.city from prior hotel search.
    
- `search_flight_content`: 
    Search airline-related content.
    
- `search_homestays_in_city`: 
    Search homestays in a city.

    If city is omitted, use session.city from prior hotel search.
    
- `search_hotels`: 
    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=..., ...)
    
- `search_restaurants_near_hotel`: 
    Search restaurants near a hotel.
    
- `start_session`: 
    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", ...)
    
- `update_stay_dates`: 
    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
    
- `update_user_profile`: 
    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
    
- `update_user_profile_from_model`: 
    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
    }
    
