Skip to main content
Glama
README.md
# MCP VRBO

MCP server for searching VRBO vacation rental listings using browser automation.

## Overview

This server provides VRBO search capabilities by leveraging `mcp-browser` for browser automation. Unlike the Airbnb MCP which uses embedded JSON extraction, VRBO requires full browser rendering to access listing data.

**Port:** 3046
**URL:** https://mcp-vrbo.local.jbmurphy.com

## Architecture

```
mcp-vrbo (3042) --> mcp-browser (3020) --> browser-pool --> LXC browsers
```

The server:
1. Receives search/listing requests
2. Calls mcp-browser to navigate to VRBO pages
3. Executes JavaScript to extract listing data from the DOM
4. Returns structured property information

## Tools

| Tool | Description |
|------|-------------|
| `vrbo_search` | Search VRBO listings with filters (location, dates, guests, price range, bedrooms) |
| `vrbo_listing_details` | Get detailed information about a specific VRBO property |

## Usage

### Search for listings

```bash
curl -X POST https://mcp-vrbo.local.jbmurphy.com/mcp/call_tool \
  -H "Content-Type: application/json" \
  -d '{
    "name": "vrbo_search",
    "arguments": {
      "location": "New York",
      "checkin": "2025-03-01",
      "checkout": "2025-03-05",
      "adults": 2,
      "min_bedrooms": 2
    }
  }'
```

### Get listing details

```bash
curl -X POST https://mcp-vrbo.local.jbmurphy.com/mcp/call_tool \
  -H "Content-Type: application/json" \
  -d '{
    "name": "vrbo_listing_details",
    "arguments": {
      "id": "4515867"
    }
  }'
```

## Search Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `location` | string | Required. City, state, or region to search |
| `checkin` | string | Check-in date (YYYY-MM-DD) |
| `checkout` | string | Check-out date (YYYY-MM-DD) |
| `adults` | number | Number of adults (default: 2) |
| `children` | number | Number of children (default: 0) |
| `min_bedrooms` | number | Minimum number of bedrooms |
| `min_bathrooms` | number | Minimum number of bathrooms |
| `min_price` | number | Minimum price per night |
| `max_price` | number | Maximum price per night |

## Response Format

```json
{
  "searchUrl": "https://www.vrbo.com/search?destination=...",
  "location": "New York",
  "totalAvailable": "300+",
  "returnedCount": 17,
  "properties": [
    {
      "id": "4515867",
      "name": "Spacious apartment in Brooklyn",
      "url": "https://www.vrbo.com/4515867",
      "price": "$1,181",
      "priceNumeric": 1181,
      "rating": 9.4,
      "reviews": 10,
      "propertyType": "Apartment",
      "sleeps": 16,
      "bedrooms": 4,
      "bathrooms": "3+",
      "neighborhood": "Brooklyn"
    }
  ]
}
```

## Dependencies

- `mcp-browser` - Browser automation service (must be running)
- `browser-pool` - LXC browser container pool

## Build & Deploy

```bash
# Build locally
docker-compose up -d --build

# Or via main docker-compose
cd .. && docker-compose up -d --build mcp-vrbo
```

## Technical Notes

- VRBO uses React and loads data dynamically via GraphQL
- Data extraction is done by parsing the rendered DOM, not embedded JSON
- The browser pool handles anti-bot measures through real browser instances
- Slower than Airbnb scraping (~3-5 seconds per search) due to full page rendering

## Comparison: Airbnb vs VRBO

| Aspect | mcp-airbnb | mcp-vrbo |
|--------|------------|----------|
| Method | Embedded JSON extraction | DOM parsing via browser |
| Speed | Fast (~1 second) | Slower (~3-5 seconds) |
| Browser required | No | Yes (via mcp-browser) |
| Reliability | May break on JSON structure changes | May break on DOM changes |