Skip to main content
Glama
jrklein343-svg

Restaurant Reservation MCP Server

README.md
# Restaurant Reservation MCP Server

A local MCP server for searching and booking restaurant reservations through Resy and OpenTable.

## Features

- **Unified Search**: Search both Resy and OpenTable with a single query
- **Real-time Availability**: Check available time slots for any date
- **Direct Booking**: Book Resy reservations directly; get booking links for OpenTable
- **Reservation Sniper**: Auto-book the instant slots become available
- **Secure Credentials**: All credentials stored in Windows Credential Manager (encrypted with DPAPI)

## Installation

```bash
cd C:\Users\jrkle\Desktop\restaurant-mcp
npm install
npm run build
```

## Configure Claude Code

Add to `~/.claude/settings.json`:

```json
{
  "mcpServers": {
    "restaurant-reservations": {
      "command": "node",
      "args": ["C:\\Users\\jrkle\\Desktop\\restaurant-mcp\\dist\\index.js"]
    }
  }
}
```

## Getting Started

### 1. Set Up Resy Credentials

First, you need your Resy API key and auth token. You can find these in your browser's developer tools while logged into resy.com:

```
# In Claude, use these tools:
set_credentials(platform: "resy", api_key: "YOUR_API_KEY", auth_token: "YOUR_TOKEN")

# Or for automatic token refresh, use:
set_login(platform: "resy", email: "your@email.com", password: "your-password")
```

### 2. Search for Restaurants

```
search_restaurants(query: "Carbone", location: "New York", party_size: 2)
```

**You don't need to know which platform a restaurant uses!** The search automatically checks both Resy and OpenTable in parallel. Each result includes a `platform` field (`resy` or `opentable`) and an ID like `resy-12345` or `opentable-67890` - just use these directly with `check_availability` and `make_reservation`.

### 3. Check Availability

```
check_availability(restaurant_id: "resy-12345", platform: "resy", date: "2025-02-15", party_size: 2)
```

### 4. Book a Reservation

```
make_reservation(
  restaurant_id: "resy-12345",
  platform: "resy",
  slot_id: "123456",
  party_size: 2,
  date: "2025-02-15"
)
```

## Reservation Sniper

For popular restaurants that release reservations at specific times:

```
snipe_reservation(
  restaurant_id: "resy-12345",
  platform: "resy",
  date: "2025-02-15",
  party_size: 2,
  preferred_times: ["7:00 PM", "7:30 PM", "8:00 PM"],
  release_time: "2025-02-01T09:00:00"
)
```

The sniper will:
1. Start polling 30 seconds before release time
2. Poll every 500ms once release time hits
3. Instantly book the first matching slot
4. Return confirmation or error

## Available Tools

| Tool | Description |
|------|-------------|
| `search_restaurants` | Search restaurants by name/location on Resy and/or OpenTable |
| `check_availability` | Get available time slots for a restaurant |
| `make_reservation` | Book a reservation |
| `list_reservations` | View your upcoming reservations |
| `cancel_reservation` | Cancel a booking |
| `set_credentials` | Store API key/token securely |
| `set_login` | Store email/password for auto-refresh |
| `check_auth_status` | Verify credentials are valid |
| `refresh_token` | Manually refresh auth token |
| `snipe_reservation` | Schedule auto-booking when slots open |
| `list_snipes` | View scheduled snipes |
| `cancel_snipe` | Cancel a scheduled snipe |

## Security

- **No credit card data**: This MCP never handles payment info. Bookings use payment methods saved in your Resy/OpenTable accounts.
- **Windows Credential Manager**: All credentials encrypted with DPAPI (same security as Chrome/Edge passwords)
- **No files**: Credentials never written to disk files
- **HTTPS only**: All API calls use TLS 1.3
- **Rate limited**: Max 10 requests/minute per platform

## Platform Notes

### Resy
- Full booking support via unofficial API
- Automatic token refresh when expired
- Can view and cancel reservations

### OpenTable
- Search and availability work without auth
- **Cannot complete booking via API** - returns a URL to finish on OpenTable's website
- Reservation listing not available

## Troubleshooting

### "Resy API key not configured"
Run `set_credentials` with your API key first.

### "Resy authentication failed"
Your token expired. Run `set_login` to enable auto-refresh, or manually get a new token.

### OpenTable booking returns URL
This is expected. OpenTable doesn't allow third-party booking - click the URL to complete on their site.

## Limitations

- Uses unofficial APIs that could change
- OpenTable requires manual booking completion
- For personal use only

TDQS

B3.4/5.0

Scored across 12 tools

Disambiguation3/5

Most tools have distinct purposes, but there is notable overlap between 'cancel_reservation' and 'cancel_snipe', and between 'set_credentials' and 'set_login', which could confuse an agent about which to use for authentication tasks. The descriptions clarify the differences, but the boundaries are not immediately obvious from the names alone.

Naming Consistency4/5

The tool names follow a consistent snake_case pattern throughout, which aids readability. However, there is some inconsistency in verb usage, such as 'make_reservation' versus 'snipe_reservation', and 'check_auth_status' versus 'refresh_token', which slightly detracts from predictability.

Tool Count5/5

With 12 tools, the count is well-scoped for a restaurant reservation server, covering authentication, search, booking, management, and automation features. Each tool appears to serve a specific and necessary function within the domain, without feeling excessive or insufficient.

Completeness4/5

The tool set provides comprehensive coverage for the restaurant reservation domain, including search, availability checks, booking, cancellation, and automation features like sniping. A minor gap is the lack of a tool to modify existing reservations, which could be a useful addition for full lifecycle management.

Maintenance

ActivityInactive
ResponsivenessUnresponsive