# Esoru MCP by resortlife.travel

Connect an AI assistant to Resortlife's published Maldives resort catalogue.
The server exposes read-only research and media tools, with access approved per agency.

## Request access

Existing partner agencies can ask their Resortlife account manager for MCP access.
New agencies can apply at https://resortlife.travel/agents. Access is reviewed manually;
there is no automatic key issuance. Ask for the tools and resort coverage you need.
Keys expire after 30 days. Renew through your account manager before expiry; rotation
invalidates the previous key. Never publish a key or add it to a shared collection.
Directory maintainers can request a separate restricted evaluation profile.

## Connect

Endpoint: https://resortlife.travel/api/mcp
Transport: Streamable HTTP (stateless JSON responses).
Authentication: Authorization: Bearer <your agency key> on every POST, including initialize.
Use a native or server-side client that supports a custom Authorization header.
OAuth and third-party browser connections are not supported by this release.

Store the key in your client's secret settings. The listing's Authorization header
value must include the word Bearer followed by a space and the issued key.
GET /api/mcp returns 405 because the endpoint does not offer a server-initiated SSE stream.

## Quick start

Set RESORTLIFE_MCP_KEY locally, then initialize:

```sh
curl https://resortlife.travel/api/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H "Authorization: Bearer ${RESORTLIFE_MCP_KEY}" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"agency-client","version":"1.0"}}}'
```

After initialization send notifications/initialized without an id. Then call tools/list
and use tools/call with the names returned for your grant. Send MCP-Protocol-Version
with the negotiated version on subsequent requests. Example tools/call parameters:

```json
{"name":"search_resorts","arguments":{"atoll":"Baa","limit":2}}
```

Resolve a resort name with resolve_resort before calling get_resort with a slug.
Use the returned canonical resort URL as the source link in your answer.

## Tools

- **search_resorts** — Search resorts (Discovery).
- **resolve_resort** — Resolve a resort name (Discovery).
- **get_resort** — Resort profile (Discovery).
- **compare_resorts** — Compare resorts (Discovery).
- **similar_resorts** — Similar resorts (Discovery).
- **list_atolls** — Atoll catalogue (Discovery).
- **catalog_stats** — Catalogue coverage (Discovery).
- **list_villas** — Villas and rooms (Resort details).
- **list_dining** — Dining venues (Resort details).
- **list_spas** — Spas (Resort details).
- **list_dive_centres** — Dive centres (Resort details).
- **list_experiences** — Experiences (Resort details).
- **get_resort_gallery** — Resort photographs (Media).
- **list_vr_tours** — Published 360° tours (Media).
- **get_vr_tour** — Explore a 360° tour (Media).

Discovery and invocation are filtered to your permitted tools and published properties.
A directory evaluation profile has at most five selected resorts, four discovery tools,
10 requests per minute and 200 per UTC day. Agency limits depend on the approved grant;
the standard administrative defaults are 30 per minute and 1,000 per UTC day.
Handshakes and discovery calls count towards the request budget.

## Research boundaries

The catalogue includes resort facts, transfers, room/villa details, dining, spas,
diving, activities, photos and published 360-degree tours where recorded and permitted.
There is no chat/ask_esoru, live availability, pricing, quotation or booking tool.
Monetary fields and scraped ratings/reviews are excluded. A missing detail means unknown.
Only published eligible Maldives resorts and guesthouses in the access grant are returned.

## Responses and troubleshooting

Tool results contain text JSON and structuredContent. Respect truncation information.
401: missing, invalid, revoked or expired key — check the secret value or request renewal.
403: disabled agency/tool access or an unsupported browser origin — use an approved client.
429: request budget exhausted — honour Retry-After and retry after that interval.
503: temporary verification/database failure — retry shortly.
A tool result with isError:true describes an invocation error; check the arguments or slug.
Do not submit customer personal information to these catalogue tools.

## Downloads

Human documentation: https://resortlife.travel/docs
Markdown documentation: https://resortlife.travel/docs.md
Registry metadata: https://resortlife.travel/mcp/server.json
Postman collection: https://resortlife.travel/mcp/resortlife-mcp.postman_collection.json
