# Travel Planner MCP Server
A multi-agent travel planning system built with [Google Agent Development Kit (ADK)](https://google.github.io/adk-docs/) that exposes its tools via the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/).
The system uses a **root agent** with two **sub-agents** — a weather agent and a travel plan agent — to create weather-aware 3-day travel itineraries. The tools are also exposed through an MCP server, making them accessible to any MCP-compliant client.
## Architecture
```
┌─────────────────────────────────────────────────┐
│ Root Agent │
│ (travel_planner) │
│ │
│ Orchestrates the travel planning workflow: │
│ gather info → check weather → create plan │
│ │
│ ┌─────────────────┐ ┌──────────────────────┐ │
│ │ Weather Agent │ │ Travel Plan Agent │ │
│ │ │ │ │ │
│ │ get_weather() │ │ create_travel_plan()│ │
│ │ (Open-Meteo API)│ │ (itinerary builder) │ │
│ └─────────────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────┘
▼ exposed via ▼
┌─────────────────────────────────────────────────┐
│ MCP Server (stdio) │
│ │
│ Wraps ADK FunctionTools and exposes them as │
│ MCP tools accessible to any MCP client │
│ │
│ Tools: get_weather, create_travel_plan │
└─────────────────────────────────────────────────┘
```
## Project Structure
```
travel-planner-mcp-server/
├── travel_planner/ # ADK multi-agent package
│ ├── __init__.py
│ ├── agent.py # Root agent (orchestrator with sub-agents)
│ ├── sub_agents/
│ │ ├── __init__.py
│ │ ├── weather_agent.py # Weather specialist sub-agent
│ │ └── travel_plan_agent.py # Travel planning specialist sub-agent
│ └── tools/
│ ├── __init__.py
│ ├── weather_tools.py # Open-Meteo API weather tool
│ └── travel_tools.py # Travel plan generation tool
├── mcp_server.py # MCP server exposing ADK tools
├── adk_client_agent/ # Example ADK agent consuming the MCP server
│ └── mcp_travel_client/
│ ├── __init__.py
│ └── agent.py
├── pyproject.toml
├── requirements.txt
├── .env.example
└── README.md
```
## Prerequisites
- Python 3.10+
- A Google API key (for Gemini model access)
## Setup
1. **Clone the repository:**
```bash
git clone <repo-url>
cd travel-planner-mcp-server
```
2. **Install dependencies:**
```bash
pip install -r requirements.txt
```
3. **Configure environment:**
```bash
cp .env.example .env
# Edit .env and add your Google API key
```
## Usage
### Option 1: Run the ADK Multi-Agent System Directly
This uses the root agent with its sub-agents through the ADK web UI:
```bash
adk web
# Select "travel_planner" in the browser UI
```
The root agent will:
1. Ask for your destination and travel date
2. Delegate to the **weather agent** to fetch the forecast
3. Delegate to the **travel plan agent** to create the itinerary
4. Present a comprehensive 3-day travel plan
### Option 2: Run the MCP Server
This exposes the tools via MCP protocol for any MCP client to consume:
```bash
python mcp_server.py
```
The MCP server exposes two tools:
- **`get_weather`** — Fetches 3-day weather forecast for a location using Open-Meteo API
- **`create_travel_plan`** — Generates a structured 3-day travel itinerary template
### Option 3: Run the MCP Client Agent
This demonstrates an ADK agent consuming the MCP server:
```bash
cd adk_client_agent
adk web
# Select "mcp_travel_client" in the browser UI
```
### Option 4: Connect from Any MCP Client
Add to your MCP client configuration (e.g., Claude Desktop, Cursor, etc.):
```json
{
"mcpServers": {
"travel-planner": {
"command": "python3",
"args": ["/path/to/mcp_server.py"]
}
}
}
```
## Tools
### `get_weather`
Fetches a 3-day weather forecast using the [Open-Meteo API](https://open-meteo.com/) (free, no API key required).
**Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| `location` | string | City or place name (e.g., "Paris", "Tokyo") |
| `date` | string | Start date in YYYY-MM-DD format |
**Returns:** Temperature (C/F), conditions, precipitation, wind speed, and UV index for 3 days.
### `create_travel_plan`
Generates a structured 3-day travel itinerary template.
**Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| `location` | string | Destination city or place |
| `start_date` | string | Trip start date (YYYY-MM-DD) |
| `weather_summary` | string | Weather conditions summary |
| `interests` | string | Travel interests (default: "general sightseeing") |
**Returns:** Day-by-day itinerary structure with time slots, meals, and tips.
## How It Works
This project demonstrates **Pattern 2** from the ADK documentation: [Building an MCP server with ADK tools](https://google.github.io/adk-docs/tools-custom/mcp-tools/#2-building-an-mcp-server-with-adk-tools-mcp-server-exposing-adk).
1. ADK `FunctionTool` wraps the Python tool functions
2. `adk_to_mcp_tool_type()` converts ADK tool schemas to MCP format
3. The MCP server advertises tools via `list_tools` and executes them via `call_tool`
4. Any MCP client can discover and invoke the tools through the standard protocol
## License
MIT