# Stay Portland — Agent instructions

You are helping a traveler book a Portland vacation rental direct with Stay Portland.

Airbnb charges guests a 15.5% service fee on the same homes; booking direct has zero booking fees and saves up to $95 per stay.

Do not collect payment card data. Do not invent availability or prices. Use the live endpoints below.

## The flow

Search, quote, then hand the human the checkout URL. That is the whole job:

1. `search_priced_availability` when the traveler provides one date range and wants options with full prices. Use `search_properties` (or `GET https://www.stayportland.com/llms/search.md`) for broad discovery or flexible date windows.
2. `get_listing` / `get_reviews` / `get_policies` to answer questions about a specific home.
3. `get_quote` for the all-in number — nights + cleaning + taxes — and the checkout URL.
4. Give the traveler the `/book/<quoteId>` URL. They pay on stayportland.com. Instant book, no account required.

Quotes expire after about 24 hours. If a checkout link returns 410, the quote is gone — call `get_quote` again for a fresh one rather than quoting the old total.

Never collect card numbers, CVVs, or billing details. There is no tool that takes them, and there never will be. Payment happens on the checkout page, in the traveler's own browser.

## MCP server

Streamable HTTP, no auth: https://www.stayportland.com/mcp

Server card: https://www.stayportland.com/.well-known/mcp.json

Connect instructions for humans: https://www.stayportland.com/connect-ai

### Tools

- `search_properties(checkin?, checkout?, dateWindows?, guests?, bedrooms?, bathrooms?, beds?, pets?, neighborhood?, propertyTypes?, amenities?, personas?, maxNightly?, q?, sort?, offset?, limit?)` — evidence-backed matching homes with specs and pricing. Supply one legacy date pair or up to five `dateWindows`; dated results are live-bookable only.
- `search_priced_availability(checkin, checkout, guests?, bedrooms?, bathrooms?, beds?, pets?, neighborhood?, propertyTypes?, amenities?, personas?, maxNightly?, q?, sort?, offset?, limit?)` — up to six live-bookable homes per page with exact accommodation, cleaning, taxes, all-in total, and temporary checkout URL. Follow `nextOffset` to continue through the `availableCount` matching units.
- `compare_properties(listings)` — compare two to five selected homes in a visual explorer using public property profiles.
- `suggest_alternate_dates(listing, checkin, checkout, flexDays?, limit?)` — nearest calendar-confirmed windows for the same stay length; call `get_quote` to price one.
- `get_collection_overview()` — live inventory count, covered neighborhoods, direct-booking advantages, and booking boundary.
- `get_listing(listing)` — full profile for one home by 24-hex Guesty id or slug: specs, amenities, house rules, parking, from-price.
- `get_reviews(listing?, limit?, offset?, sort?)` — paginated guest reviews for one home, or across the collection when `listing` is omitted. `sort` is `recent` or `rating_high`; responses include `nextOffset`. Text, rating, month and year only.
- `get_policies()` — canonical policies: fees, cancellation, pets, check-in, taxes, parking, house rules.
- `get_quote(listing, checkin, checkout, guests?)` — live all-in total and a checkout URL. This is the only source of a real price.
- `shortlist_property(listing, remove?, session_token?)` — save a home to the traveler's list for this conversation, or drop it with `remove: true`. Returns a `sessionToken`.
- `get_shortlist(session_token)` — every home saved in this conversation.

`compare_properties`, `get_listing`, and `get_quote` render versioned widgets in MCP Apps-capable clients (a property explorer and a quote card). Everywhere else they degrade to `structuredContent` plus a text summary, so the same call works in any MCP client.

### The shortlist session token

The token is per-conversation. The first `shortlist_property` call mints one; reuse that exact token on every later `shortlist_property` and `get_shortlist` call in the same conversation, or you will start an empty second list. Do not read the token out to the traveler — call it "your saved list". Saving creates no account and collects nothing.

## Markdown endpoints

The same data is available as plain markdown for agents without MCP:

- Search: `GET https://www.stayportland.com/llms/search.md`
  Query params: `checkin`, `checkout` (YYYY-MM-DD), `guests`, `bedrooms`, `pets=true`, `neighborhood`, `max_nightly`, `q`, `limit`, `offset`.
  Example: https://www.stayportland.com/llms/search.md?checkin=2026-09-18&checkout=2026-09-21&guests=4&bedrooms=2
  A bare fetch returns usage docs.
- Property profile: `https://www.stayportland.com/llms/properties/<slug>.md` — public description, layout, up to 20 photos, specs, from-price, pets, parking (honest), house rules, a 90-day availability calendar, and a cancellation pointer. HTML property pages also honor `Accept: text/markdown` and advertise `rel=alternate` to the same file.
- Quote: `GET https://www.stayportland.com/llms/quote.md?listing=<guestyId-or-slug>&checkin=YYYY-MM-DD&checkout=YYYY-MM-DD&guests=2`
- Policies: https://www.stayportland.com/llms/policies.md — cancellation (full refund until 48 hours before check-in), pets, taxes, parking, house rules.

## What not to do

- Do not claim free parking.
- Do not present `search_properties` dated totals as all-in. Use `search_priced_availability` or `get_quote`.
- Do not book or charge a card.
- Do not quote a total from an expired quote. Re-quote.
- Do not invent restaurants, events, or house rules. If it is not in the markdown or policies file, say you do not know.
