Quest Apartment Hotels MCP Server
by weinerac
README.md
# Quest Apartment Hotels — MCP Server (POC)
A Model Context Protocol (MCP) server for Quest Apartment Hotels, enabling AI assistants (ChatGPT, Claude, Gemini) to search properties, check availability, compare rates, and make bookings across Quest's Australian portfolio.
> **POC Note:** Availability and rates are simulated with deterministic fake data. Bookings are stored in-memory and reset on each cold start.
---
## Tools Exposed
| Tool | Description |
|------|-------------|
| `quest_search_properties` | Find properties by city, state, or amenity |
| `quest_get_property_details` | Full details for a specific property |
| `quest_check_availability` | Availability for a property and date range |
| `quest_get_rates` | Rate plans for a property and stay |
| `quest_search_availability` | Combined search + availability in one call |
| `quest_get_booking_quote` | Price estimate without creating a booking |
| `quest_create_booking` | Make a reservation |
| `quest_get_booking` | Look up an existing booking by confirmation number |
---
## Project Structure
```
Quest-MCP/
├── api/
│ └── mcp.ts # All server logic (single file)
├── package.json
├── tsconfig.json
├── vercel.json # Routes /mcp → /api/mcp
└── .gitignore
```
---
## Local Development
### Prerequisites
- Node.js 20+
- Vercel CLI (installed as a dev dependency)
### Setup
```bash
# Clone the repo
git clone https://github.com/YOUR_USERNAME/Quest-MCP.git
cd Quest-MCP
# Install dependencies
npm install
# Type-check (no output = success)
npm run build
# Start local dev server
npm run dev
```
The server will be available at `http://localhost:3000/mcp`.
### Testing locally with MCP Inspector
```bash
npx @modelcontextprotocol/inspector
```
Set the URL to `http://localhost:3000/mcp` and transport to **Streamable HTTP**.
---
## Deployment (Vercel via GitHub)
The project is configured to auto-deploy to Vercel on every push to `main`.
### First-time setup
1. Push this repo to GitHub
2. Go to [vercel.com](https://vercel.com) → **Add New Project** → Import your GitHub repo
3. Vercel will auto-detect the project — no extra config needed
4. Click **Deploy**
After the first deploy, every `git push` to `main` triggers a new deployment automatically.
Your MCP endpoint will be at:
```
https://YOUR-PROJECT.vercel.app/mcp
```
### Environment Variables
None required for this POC. All data is hardcoded.
---
## Testing in OpenAI ChatGPT
Per the [OpenAI MCP testing instructions](https://platform.openai.com/docs/guides/tools-mcp):
1. Open [chatgpt.com](https://chatgpt.com) and start a new conversation
2. Click the **Tools** (plug) icon → **Add a tool** → **MCP Server**
3. Enter your Vercel URL:
```
https://YOUR-PROJECT.vercel.app/mcp
```
4. Set approval to **No approval required** (for testing)
5. Click **Connect**
ChatGPT will discover all 8 tools automatically. Try prompts like:
- *"Find me a Quest hotel in Melbourne for 3 nights from next Friday"*
- *"What Quest properties in Sydney have a gym?"*
- *"Check availability at Quest Docklands for 15–18 March 2025 and give me the best rate"*
- *"Book a studio at Quest on William for 2 nights from March 20, name John Smith"*
---
## Sample Data
The server includes 27 real Quest Australia properties across:
| State | Count |
|-------|-------|
| VIC | 7 |
| NSW | 6 |
| QLD | 4 |
| ACT | 2 |
| WA | 3 |
| SA | 1 |
| NT | 1 |
| TAS | 1 |
| Regional | 2 |
### Simulated Rate Plans
| Code | Description | Adjustment |
|--------|------------------------|-----------|
| FLEX | Flexible rate | +10% |
| STD | Standard rate | base |
| ADVP | Advance purchase (7d+) | −10% |
| CORP | Corporate rate | −15% |
| LONG7 | Weekly rate (7+ nights)| −15% |
Weekend surcharge: +20% on Fri/Sat/Sun nights.
---
## Architecture Notes
- **Transport**: Streamable HTTP (stateless — required for Vercel serverless)
- **Sessions**: Disabled (`sessionIdGenerator: undefined`) — each request is independent
- **CORS**: Open (`*`) — required for browser-based AI clients
- **Availability**: Deterministic hash on `propertyId|date|roomType` → 75% available
- **Bookings**: In-memory `Record<string, Booking>` — resets on cold start
For a production implementation, replace the in-memory store with a database and connect to Quest's RMS API.