AI front desk for NuVista Haven vacation rentals: live availability, rates, booking links.
One address for any MCP client. No sign-in needed on this server.
5 read
Grouped by tool name. At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Model Context Protocol server that lets AI assistants answer, from live data:
search_propertiescheck_availability (Hospitable calendars)get_quote (nightly rates × nights + cleaning fee)get_booking_link (nuvistahaven.com)hospitable_client.py exposes exactly one
HTTP verb (GET) against an allow-list of read paths (/user,
/properties, /reservations). There are no POST/PUT/PATCH/DELETE
methods anywhere — even though the token may carry write scopes, this
code cannot mutate anything in Hospitable.HOSPITABLE_API_TOKEN environment variable. It is never
hardcoded, never logged, never written to disk.cd ~/workspace/nuvista-mcp
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
# local testing (stdio)
HOSPITABLE_API_TOKEN=<token> ./venv/bin/python server.py
# public hosting (Streamable HTTP)
HOSPITABLE_API_TOKEN=<token> ./venv/bin/python server.py --http --port 8000
./venv/bin/python test_server.py
properties.py holds the 12 canonical properties with best-effort
Hospitable name guesses (7 strong, 5 guesses — see guess_confidence).
With a live token, run the matcher and confirm each mapping by hand,
then fill in hospitable_id per property:
HOSPITABLE_API_TOKEN=<token> ./venv/bin/python - <<'EOF'
import sys; sys.path.insert(0, '.')
from hospitable_client import HospitableClient
from logic import build_id_mapping
import json
print(json.dumps(build_id_mapping(HospitableClient()), indent=2))
EOF
Entries with "needs_human_confirm": true must be verified before use —
check_availability/get_quote refuse to run for unmapped properties.
get_calendar sends start_date/end_date
(the Hospitable convention used by /reservations). If the endpoint
ignores them, availability windows may be wrong — verify on first live run.get_quote
probes the property record for common fee shapes; if absent, the total
is explicitly marked total_is_partial_estimate: true — never silently zero.get_booking_link returns the plain
property URL (no fabricated params).list_reservations is implemented but the
calendar is the source of truth; reservations are not currently consulted.server.py — FastMCP server, 4 tools, stdio + Streamable HTTPlogic.py — tool logic (testable without MCP)hospitable_client.py — GET-only Hospitable Public API v2 clientproperties.py — canonical 12-property registry + Hospitable mappingtest_server.py — mock-based tests