Skip to main content
Glama
AjaykumarBalakannan

TravelGenie

README.md
# TravelGenie

Trip planner that coordinates flights, hotels, events, weather, currency, and traffic data through one request instead of ten browser tabs.

![TravelGenie](assets/img/Gemini_Generated_Image_36apt236apt236ap.png)

![MCP](https://img.shields.io/badge/MCP-Compatible-blue)
![Python](https://img.shields.io/badge/Python-3.12+-green)
![License](https://img.shields.io/badge/License-MIT-yellow)

## What it does

Give it a prompt like:

> "Plan a trip to Banff, Alberta from Reston, Virginia, June 7-14, 2025. Budget $5000. We like hiking, museums, and dining."

Claude coordinates seven specialized servers to:
- Find flights and hotels within budget
- Pull weather forecasts for the trip dates
- Find local events matching the stated interests
- Convert currencies
- Check traffic and crowd patterns
- Build a day-by-day itinerary with a budget breakdown

## Architecture

Each server is a standalone [MCP](https://modelcontextprotocol.io/) server. Claude calls them in sequence, passing output from one into the next (geocode a location, then search flights/hotels near it, then check weather for those dates, etc.).

| Server | Job |
|--------|-----|
| Flight | Search and compare flights |
| Hotel | Search accommodations |
| Event | Find local events and activities |
| Geocoder | Address ↔ coordinates |
| Weather | Forecasts, current conditions |
| Finance | Currency conversion, market data |
| Traffic & Crowd | Real-time location analysis |

## Setup

```bash
git clone https://github.com/AjaykumarBalakannan/TravelGenie.git
cd TravelGenie
pip install -r requirements.txt
cp .env.example .env
# add your API keys to .env
```

You'll need:
- **SerpAPI** — flights, hotels, events. Free tier at [serpapi.com](https://serpapi.com/)
- **Anthropic** — Claude API key from [console.anthropic.com](https://console.anthropic.com/)
- **Slack** (optional) — only needed for the Slack bot
- Open-Meteo and OpenStreetMap require no key

## Running it

```bash
# Web UI
streamlit run streamlit_app.py

# Slack bot
python slack_bot.py
```

The web UI runs at `http://localhost:8501`.

### Calling it directly

```python
from claude_orchestrator import execute_tool

flights = execute_tool("search_flights",
    departure_id="IAD",
    arrival_id="YYC",
    outbound_date="2025-06-07",
    return_date="2025-06-14",
    adults=2
)

weather = execute_tool("get_weather_forecast",
    location="Banff, Alberta",
    forecast_days=7
)
```

### Claude Desktop (MCP mode)

Add to `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "flight-search": {
      "command": "uv",
      "args": ["--directory", "/path/to/TravelGenie/servers/flight_server",
               "run", "python", "flight_server.py"],
      "env": {"SERPAPI_KEY": "your_key"}
    }
  }
}
```

Config location — macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`, Windows: `%APPDATA%\Claude\claude_desktop_config.json`.

## Deployment

**Docker:**
```bash
docker build -t travelgenie .
docker run -d -p 8501:8501 --env-file .env travelgenie
```

**AWS (ECS Fargate + DynamoDB + Secrets Manager + CloudWatch):**
```bash
cd aws/cloudformation
aws cloudformation create-stack \
  --stack-name travelgenie \
  --template-body file://infrastructure.yaml \
  --parameters file://parameters.json \
  --capabilities CAPABILITY_NAMED_IAM
```

See `aws/Run.md` for the full setup. The `mock_application/` directory has load-test tooling comparing EC2 vs. ECS Fargate under concurrent load — see `documents/Travel_Genie_Report.pdf` for the writeup and results.

## Troubleshooting

- **Servers not responding** — check API keys in `.env`, confirm Python 3.12.1+
- **Import errors** — `pip install -r requirements.txt --upgrade`
- **Slack bot not connecting** — verify tokens, confirm Socket Mode is enabled, check bot has `chat:write` and `app_mentions:read` scopes
- **No search results** — try airport codes instead of city names; check SerpAPI quota; confirm dates are in the future

## Testing

```bash
python slack_bot.py --test
streamlit run streamlit_app.py
```

## License

MIT — see `LICENSE`.

## Author

Ajaykumar Balakannan — [github.com/AjaykumarBalakannan](https://github.com/AjaykumarBalakannan)