{"openapi":"3.1.0","info":{"title":"We Book Fernie booking demo API","version":"1.0.0","description":"FCR property discovery and sandbox booking. Read availability and rate provenance in every response. OwnerRez reads do not reserve inventory. Payments use Stripe test mode only. The explicitly enabled public sandbox may offer guest-approved new booking links. Private booking tools require a configured agent bearer; this server does not implement OAuth or ACP."},"servers":[{"url":"https://webookfernie.com"}],"paths":{"/api/agent/inventory":{"get":{"operationId":"listProperties","summary":"Browse FCR property information","parameters":[{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Property catalogue, with data provenance"}}}},"/api/agent/availability":{"get":{"operationId":"checkAvailability","summary":"Read availability and a server-calculated quote","parameters":[{"name":"property","in":"query","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"guests","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":24}},{"name":"children","in":"query","schema":{"type":"integer","minimum":0,"maximum":23,"default":0}}],"responses":{"200":{"description":"Availability and quote, including currency, source and check time"},"400":{"description":"Invalid dates or occupancy"},"503":{"description":"Availability could not be verified"}}}},"/api/booking/search":{"get":{"operationId":"searchAvailableStays","summary":"Search dated availability","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"guests","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":24}},{"name":"children","in":"query","schema":{"type":"integer","minimum":0,"maximum":23,"default":0}},{"name":"query","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Available matching FCR properties with source and check time"},"400":{"description":"Invalid search"},"503":{"description":"Availability could not be verified"}}}},"/api/booking/quote":{"post":{"operationId":"quoteStay","summary":"Read a server-calculated stay quote","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"property":{"type":"string","minLength":1,"maxLength":100},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":24},"children":{"type":"integer","minimum":0,"maximum":23}},"required":["property","from","to","guests"],"additionalProperties":false}}}},"responses":{"200":{"description":"Stay quote and policies"},"400":{"description":"Invalid stay"},"503":{"description":"Quote could not be verified"}}}},"/api/mcp":{"post":{"operationId":"mcpRpc","summary":"MCP Streamable HTTP JSON-RPC endpoint","description":"Initialize, notifications/initialized, ping, tools/list and tools/call. Public search_stays and check_availability; prepare_demo_booking_link is available without auth only when the public sandbox gate is enabled and guestAuthorized:true is supplied. prepare_booking and booking_status require bearer authorization. GET returns 405 because there is no standalone SSE stream.","parameters":[{"name":"MCP-Protocol-Version","in":"header","schema":{"type":"string","enum":["2025-11-25","2025-06-18","2025-03-26"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["integer","string"]},"method":{"type":"string","enum":["initialize","notifications/initialized","ping","tools/list","tools/call"]},"params":{"type":"object"}}}}}},"security":[{},{"agentBearer":[]}],"responses":{"200":{"description":"JSON-RPC result or error; tools return MCP content and structuredContent"},"202":{"description":"Notification accepted; no response body"},"400":{"description":"Invalid JSON-RPC or unsupported protocol version"},"401":{"description":"Private tool requires authorized agent bearer"},"403":{"description":"Origin is not allowed"},"503":{"description":"Private access is not configured"}},"x-mcp-tools":[{"name":"search_stays","description":"Find FCR properties for the guest's dates, party size and preferences. Returns availability and rate source; only describe verified results as available.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":24},"children":{"type":"integer","minimum":0,"maximum":23},"query":{"type":"string","maxLength":200}},"required":["from","to","guests"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"check_availability","description":"Check one property's selected dates and occupancy. Returns server-calculated quote and policies when available. Does not reserve inventory.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"property":{"type":"string","minLength":1,"maxLength":100},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":24},"children":{"type":"integer","minimum":0,"maximum":23}},"required":["property","from","to","guests"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"prepare_booking","description":"After the guest explicitly chooses the stay and consents to prepare checkout, create a private, prefilled booking review link. Requires private agent bearer. Guest completes Stripe sandbox payment; no OwnerRez reservation is created. Does not charge a card.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"property":{"type":"string","minLength":1,"maxLength":100},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":24},"children":{"type":"integer","minimum":0,"maximum":23},"guestName":{"type":"string","minLength":2,"maxLength":100},"guestEmail":{"type":"string","maxLength":254,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["property","from","to","guests","guestName","guestEmail"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"booking_status","description":"Read the status of an existing private sandbox booking using its opaque token. Requires private agent bearer. A sandbox payment is not a real reservation.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string","minLength":30,"maxLength":12000}},"required":["token"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"prepare_demo_booking_link","description":"After the guest selects the stay and explicitly approves a sandbox checkout link, create a prefilled review link from ONLY the guest details supplied in this call. Set guestAuthorized:true only with guest approval. Creates a Stripe TEST checkout session; no card is charged and no OwnerRez reservation is created. No staff account or existing guest records are accessed. Available only in an explicitly enabled public sandbox preview. The guest reviews and pays on the site; never collect card details in chat.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"property":{"type":"string","minLength":1,"maxLength":100},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":24},"children":{"type":"integer","minimum":0,"maximum":23},"guestName":{"type":"string","minLength":2,"maxLength":100},"guestEmail":{"type":"string","maxLength":254,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"guestAuthorized":{"type":"boolean","const":true}},"required":["property","from","to","guests","guestName","guestEmail","guestAuthorized"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}}]}}},"components":{"securitySchemes":{"agentBearer":{"type":"http","scheme":"bearer","description":"Privately provisioned demo agent token. Never published in site content. Required for prepare_booking and booking_status only."}}}}