# Connect to Haven's MCP server

Connect yourself to Haven (Book With Haven), my direct booking platform for short-term rentals, over MCP, then verify the connection. Do not write anything to my account until I ask.

## The server

```
https://www.bookwithhaven.com/api/public/mcp
```

Remote, streamable HTTP, stateless (one JSON-RPC message per POST, no sessions, no SSE). OAuth 2.1 with PKCE; the server supports dynamic client registration, so there is no API key, client ID or client secret to configure. An unauthenticated request answers 401 with a `resource_metadata` URL, and a compliant client completes the whole sign-in from that. Haven then shows me a consent screen that names the account and lists what the connection can read and change.

## Set it up for the client you are

- **Claude Code:** `claude mcp add --transport http haven https://www.bookwithhaven.com/api/public/mcp` then `/mcp` to sign in.
- **Cursor:** add `{ "mcpServers": { "haven": { "url": "https://www.bookwithhaven.com/api/public/mcp" } } }` to `.cursor/mcp.json`, then Connect from Cursor Settings → MCP.
- **Codex CLI:** in `~/.codex/config.toml`, add `[mcp_servers.haven]` with `url = "https://www.bookwithhaven.com/api/public/mcp"`, then sign in when prompted.
- **Claude (claude.ai, desktop, mobile):** Customize → Connectors → **+** → Add custom connector → name Haven, paste the URL, leave client ID and secret empty → Add → Connect → sign in → Allow access. Switch Haven on in the chat's **+** menu.
- **ChatGPT:** Settings → Apps & Connectors → Advanced settings → Developer mode on → Create → name, description, the URL, Authentication OAuth → Create → sign in → Allow access. Start a new chat and enable Haven.
- **Grok:** grok.com/connectors → New Connector → Custom → paste the URL → sign in → Allow access.
- **Other clients:** any MCP client with remote HTTP transport and OAuth dynamic client registration. Point it at the URL.

If you cannot add MCP servers from this environment, say so and give me the steps above to run myself.

## Verify

1. Call `get_account`. Report which Haven account the connection acts inside, its role, and which scopes it holds.
2. Call `tools/list`. The list is already filtered to what my grant allows; tell me which write tools are present, if any.
3. Call `list_listings` (or `search` with my property's name) and show me the listing codes you found.

## How to behave on this connection

- **Read before you write.** Fetch a listing, reservation or site structure with the matching read tool before changing it. Call `get_listing_sync_policy` first: a domain my property management system owns (rates, calendar, content) is refused or overwritten by the next sync.
- **Ask before any write**, name what will change, and wait for my yes.
- **Idempotency.** Two calls with identical arguments count as one call; pass `idempotencyKey` only when you genuinely mean to write twice.
- **Money.** `issue_booking_refund` and `adjust_booking_price` are two-step: the first call returns a confirmation token, the second commits it. Show me the amount in between. In Claude, Grok and Cursor these tools, plus approve and cancel, are not offered at all; I do them in my dashboard.
- **Errors** arrive as tool results with `isError: true` and a `code` in `structuredContent`. Branch on the code, not the message.
- **Calendars** need both window bounds and cap at 400 days. **Reservations and conversations** need `property_code` or `updated_since`.
- Full reference: https://www.bookwithhaven.com/developers/04-api/04-mcp and, as one file, https://www.bookwithhaven.com/developers/llms.txt. Host-facing article: https://www.bookwithhaven.com/help/integrations/connect-chatgpt-or-claude