Restaurant Reservation MCP Server
# 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
Scored across 12 tools
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.
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.
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.
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.