Update : Streamlit app created

This commit is contained in:
priyanshm07 2025-04-20 07:08:20 +05:30
parent d8f27f6d4b
commit cae82dc8b8
4 changed files with 398 additions and 117 deletions

View file

@ -1,83 +1,118 @@
# 🌍 AI Travel Planner — MCP Agent Team (Airbnb, Google Maps, Weather)
## 🌍 AI Travel Planner Agent
This project is a *multi-agent travel planning assistant* built using [Agno](https://github.com/agnodice/agno), powered by multiple [Model Context Protocol (MCP)](https://modelcontextprotocol.org/) tools. It integrates:
This is a Streamlit-based application that helps users plan their travel itineraries using AI. The app integrates with various mcp servers to provide a comprehensive travel planning experience, including weather forecasts, maps, and calendar integration.
•⁠ ⁠🏠 *Airbnb Listings*
•⁠ ⁠🗺️ *Google Maps for routing and places*
•⁠ ⁠🌦️ *Weather information via AccuWeather*
•⁠ ⁠📅 (Optional) *Google Calendar integration via Gumloop MCP*
## Features
## MCP Servers Integration
All handled through a simple terminal interface powered by Python + asyncio.
This project utilizes several MCP (Model Context Protocol) servers to provide a comprehensive travel planning experience:
---
### 1. Weather MCP Server
- **Functionality**: Provides real-time weather data and forecasts
## ⚙️ Requirements
### 2. Maps MCP Server
- **Functionality**: Handles location-based services and navigation
- **Features**:
- Search for places and points of interest
- Get detailed place information
- Retrieve driving/walking directions
•⁠ Python 3.10+
•⁠ Node.js + npx
•⁠ [uvx](https://github.com/uvx/cli) for running MCP servers from Git
•⁠ Internet access for MCP calls
### 3. Calendar MCP Server
- **Functionality**: Manages calendar events and scheduling
- **Features**:
- Create and manage calendar events
- Handle time zone conversions
- Schedule reminders and notifications
- **Integration**: Implemented in `calendar_mcp.py`
---
## 📦 Installation
1. *Clone the repo*
bash
git clone https://github.com/yourusername/ai-travel-planner.git
cd ai-travel-planner
2. *Create Virtual Env*
conda create -n env_name python=3.10 -y
conda activate env_name
pip install -r requirements.txt
### 4. Booking MCP Server
- **Functionality**: Airbnb MCP server used
3. *Create env file*
## Setup
GOOGLE_MAPS_API_KEY=your_google_maps_api_key
ACCUWEATHER_API_KEY=your_accuweather_api_key
OPENAI_API_KEY=your_openai_api_key
---
### Requirements
## 🧠 Built With
-- Agno
1. **API Keys and Credentials**:
- **Google Maps API Key**: Set up a Google Maps API Key from Google Cloud Console
- **Google Calendar API**: Enable and configure the Calendar API Key
- **Google OAuth Credentials**: Client ID and Client Secret and Refresh Token for authentication
- **AccuWeather API KEY**: Get AccuWeather API key https://developer.accuweather.com/
- **OpenAI API Key**: Sign up at OpenAI to obtain your API key.
-- FastMCP
2. **Python 3.8+**: Ensure you have Python 3.8 or higher installed.
-- OpenAI
### Installation
-- Google Maps Platform
1. Clone this repository:
```bash
git clone https://github.com/yourusername/ai_travel_planner_mcp_agent_team
cd ai_travel_planner_mcp_agent_team
```
-- Airbnb MCP
2. Install the required Python packages:
```bash
pip install -r requirements.txt
```
-- Accuweather
3. Set up environment variables:
Create a `.env` file in the project root with the following variables:
```
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REFRESH_TOKEN=
GOOGLE_MAPS_API_KEY=
OPENAI_API_KEY=
ACCUWEATHER_API_KEY=
```
---
### Running the App
## 📅 Calendar MCP Server (`calendar_mcp.py`)
1. Generate OAuth token for Google Calendar
This script is a dedicated MCP (Modular Cognitive Process) server that integrates with **Google Calendar** to create events via API calls. It works seamlessly with the rest of the multi-agent system built with Agno and FastMCP.
2. Start the Streamlit app:
```bash
streamlit run app.py
```
---
3. In the app interface:
- Use the sidebar to configure your preferences
- Enter your travel details
### 🛠 Features
## Project Structure
- Creates Google Calendar events using the `create_event` tool
- Accepts event title, description, date/time, location, attendees, and reminders
- Uses a refresh token for persistent access (no re-authentication needed)
- `app.py`: Main Streamlit application
- `calendar_mcp.py`: Calendar mcp integration functionality
- `requirements.txt`: Project dependencies
- `.env`: Environment variables
---
## Calendar MCP Integration
### 🌱 Setup
The `calendar_mcp.py` module provides seamless integration with Google Calendar through the MCP (Model Context Protocol) framework. This integration allows the travel planner to:
Add the following to your `.env` file in the root directory:
- **Create Events**: Automatically create calendar events for travel activities, flights, and accommodations
- **Schedule Management**: Handle time zone conversions and scheduling conflicts
- **Event Details**: Include comprehensive event information such as:
- Location details with Google Maps links
- Weather forecasts for the event time
- Travel duration and transportation details
- Notes and reminders
```env
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
GOOGLE_REFRESH_TOKEN=your_refresh_token
```
### Calendar Setup
1. **OAuth Authentication**:
- The application uses OAuth 2.0 for secure authentication with Google Calendar
- First-time setup requires generating refresh token
- Refresh tokens are stored securely in the `.env` file
2. **Event Creation**:
```python
# Example of creating a calendar event
event = {
'summary': 'Flight to Paris',
'location': 'Charles de Gaulle Airport',
'description': 'Flight details and weather forecast',
'start': {'dateTime': '2024-04-20T10:00:00', 'timeZone': 'Europe/Paris'},
'end': {'dateTime': '2024-04-20T12:00:00', 'timeZone': 'Europe/Paris'}
}
```

View file

@ -4,31 +4,49 @@ import os
from agno.agent import Agent
from agno.team.team import Team
from agno.tools.mcp import MultiMCPTools
from agno.models.openai import OpenAIChat
import streamlit as st
from datetime import date
from dotenv import load_dotenv
load_dotenv()
# Remove dotenv import and loading since we'll use sidebar
# from dotenv import load_dotenv
# load_dotenv()
async def run_agent(message: str) -> None:
async def run_agent(message: str):
"""Run the Airbnb, Google Maps, Weather and Calendar agent with the given message."""
google_maps_key = os.getenv("GOOGLE_MAPS_API_KEY")
accuweather_key = os.getenv("ACCUWEATHER_API_KEY")
openai_key = os.getenv("OPENAI_API_KEY")
google_maps_key = os.getenv("GOOGLE_CLIENT_ID")
# Get API keys from session state
google_maps_key = st.session_state.get('google_maps_key')
accuweather_key = st.session_state.get('accuweather_key')
openai_key = st.session_state.get('openai_key')
google_client_id = st.session_state.get('google_client_id')
google_client_secret = st.session_state.get('google_client_secret')
google_refresh_token = st.session_state.get('google_refresh_token')
if not google_maps_key:
raise ValueError("🚨 Missing GOOGLE_MAPS_API_KEY in environment variables.")
raise ValueError("🚨 Missing Google Maps API Key. Please enter it in the sidebar.")
elif not accuweather_key:
raise ValueError("🚨 Missing ACCUWEATHER_API_KEY in environment variables.")
raise ValueError("🚨 Missing AccuWeather API Key. Please enter it in the sidebar.")
elif not openai_key:
raise ValueError("🚨 Missing OPENAI_API_KEY in environment variables.")
elif not google_maps_key:
raise ValueError("🚨 Missing GOOGLE_CLIENT_ID in environment variables.")
raise ValueError("🚨 Missing OpenAI API Key. Please enter it in the sidebar.")
elif not google_client_id:
raise ValueError("🚨 Missing Google Client ID. Please enter it in the sidebar.")
elif not google_client_secret:
raise ValueError("🚨 Missing Google Client Secret. Please enter it in the sidebar.")
elif not google_refresh_token:
raise ValueError("🚨 Missing Google Refresh Token. Please enter it in the sidebar.")
# 👉 Set OPENAI_API_KEY globally
os.environ["OPENAI_API_KEY"] = openai_key
env = {
**os.environ,
"GOOGLE_MAPS_API_KEY": os.getenv("GOOGLE_MAPS_API_KEY"),
"ACCUWEATHER_API_KEY": os.getenv("ACCUWEATHER_API_KEY"),
"OPENAI_API_KEY": os.getenv("OPENAI_API_KEY")
"GOOGLE_MAPS_API_KEY": google_maps_key,
"ACCUWEATHER_API_KEY": accuweather_key,
"OPENAI_API_KEY": openai_key,
"GOOGLE_CLIENT_ID": google_client_id,
"GOOGLE_CLIENT_SECRET": google_client_secret,
"GOOGLE_REFRESH_TOKEN": google_refresh_token
}
async with MultiMCPTools(
@ -36,57 +54,303 @@ async def run_agent(message: str) -> None:
"npx -y @openbnb/mcp-server-airbnb --ignore-robots-txt", # ✅ Airbnb mcp added
"npx -y @modelcontextprotocol/server-google-maps", # ✅ Google Maps mcp added
"uvx --from git+https://github.com/adhikasp/mcp-weather.git mcp-weather", # ✅ Weather mcp added
"/Users/priyanshmaheshwari/Desktop/EchovibeLabs/awesome-llm-apps/mcp_ai_agents/ai_travel_planner_mcp_agent_team/calendar_mcp.py" # ✅ Calendar mcp added
"./calendar_mcp.py"
],
env=env,
) as mcp_tools:
#Define sepcialized agents
#Define specialized agents with enhanced instructions
maps_agent = Agent(
tools=[mcp_tools],
model=OpenAIChat(id="gpt-4o-mini", api_key=openai_key),
name="Maps Agent",
goal="Integrates with Google Maps server to provide routing information, travel time estimates, and points of interest proximity analysis"
goal="""As a Maps Agent, your responsibilities include:
1. Finding optimal routes between locations
2. Identifying points of interest near destinations
3. Calculating travel times and distances
4. Suggesting transportation options
5. Finding nearby amenities and services
6. Providing location-based recommendations
Always consider:
- Traffic conditions and peak hours
- Alternative routes and transportation modes
- Accessibility and convenience
- Safety and well-lit areas
- Proximity to other planned activities"""
)
weather_agent = Agent(
tools=[mcp_tools],
name="Weather Agent",
goal="Pulls data from OpenWeatherMap to provide weather forecasts for planned dates and locations, allowing for weather-appropriate activity planning."
model=OpenAIChat(id="gpt-4o-mini", api_key=openai_key),
goal="""As a Weather Agent, your responsibilities include:
1. Providing detailed weather forecasts for destinations
2. Alerting about severe weather conditions
3. Suggesting weather-appropriate activities
4. Recommending the best travel times based on the weather conditions.
5. Providing seasonal travel recommendations
Always consider:
- Temperature ranges and comfort levels
- Precipitation probability
- Wind conditions
- UV index and sun protection
- Seasonal variations
- Weather alerts and warnings"""
)
booking_agent = Agent(
tools=[mcp_tools],
name="Booking Agent",
goal="Connects to Booking.com and Airbnb APIs to search and filter accommodations based on user preferences (price range, amenities, location)"
model=OpenAIChat(id="gpt-4o-mini", api_key=openai_key),
goal="""As a Booking Agent, your responsibilities include:
1. Finding accommodations within budget on airbnb
2. Comparing prices across platforms
3. Checking availability for specific dates
4. Verifying amenities and policies
5. Finding last-minute deals when applicable
Always consider:
- Location convenience
- Price competitiveness
- Cancellation policies
- Guest reviews and ratings
- Amenities matching preferences
- Special requirements or accessibility needs"""
)
calendar_agent = Agent(
tools=[mcp_tools],
name="Calendar Agent",
goal="Creates calendar events for travel plans, including reminders and location details."
model=OpenAIChat(id="gpt-4o-mini", api_key=openai_key),
goal="""As a Calendar Agent, your responsibilities include:
1. Creating detailed travel itineraries
2. Setting reminders for bookings and check-ins
3. Scheduling activities and reservations
4. Adding reminders for booking deadlines, check-ins, and other important events.
5. Coordinating with other team members' schedules
Always consider:
- Time zone differences
- Travel duration between activities
- Buffer time for unexpected delays
- Important deadlines and check-in times
- Synchronization with other team members"""
)
team = Team(
members=[maps_agent, weather_agent, booking_agent, calendar_agent],
name="Travel Planning Team",
markdown=True,
show_tool_calls=True
show_tool_calls=True,
instructions="""As a Travel Planning Team, coordinate to create comprehensive travel plans:
1. Share information between agents to ensure consistency
2. Consider dependencies between different aspects of the trip
3. Prioritize user preferences and constraints
4. Provide backup options when primary choices are unavailable
5. Maintain a balance between planned activities and free time
6. Consider local events and seasonal factors
7. Ensure all recommendations align with the user's budget
8. Provide a detailed breakdown of the trip, including bookings, routes, weather, and planned activities.
9. Add the journey start date in the user calendar"""
)
await team.aprint_response(message, stream=True)
result = await team.arun(message)
output = result.messages[-1].content
return output
# -------------------- Streamlit App --------------------
# Configure the page
st.set_page_config(
page_title="AI Travel Planner",
page_icon="✈️",
layout="wide"
)
# -------------------- Terminal Interaction Loop --------------------
# Add sidebar for API keys
with st.sidebar:
st.header("🔑 API Keys Configuration")
st.markdown("Please enter your API keys to use the travel planner.")
# Initialize session state for API keys if not exists
if 'google_maps_key' not in st.session_state:
st.session_state.google_maps_key = ""
if 'accuweather_key' not in st.session_state:
st.session_state.accuweather_key = ""
if 'openai_key' not in st.session_state:
st.session_state.openai_key = ""
if 'google_client_id' not in st.session_state:
st.session_state.google_client_id = ""
if 'google_client_secret' not in st.session_state:
st.session_state.google_client_secret = ""
if 'google_refresh_token' not in st.session_state:
st.session_state.google_refresh_token = ""
if __name__ == "__main__": # ✅ correct
# API key input fields
st.session_state.google_maps_key = st.text_input(
"Google Maps API Key",
value=st.session_state.google_maps_key,
type="password"
)
st.session_state.accuweather_key = st.text_input(
"AccuWeather API Key",
value=st.session_state.accuweather_key,
type="password"
)
st.session_state.openai_key = st.text_input(
"OpenAI API Key",
value=st.session_state.openai_key,
type="password"
)
st.session_state.google_client_id = st.text_input(
"Google Client ID",
value=st.session_state.google_client_id,
type="password"
)
st.session_state.google_client_secret = st.text_input(
"Google Client Secret",
value=st.session_state.google_client_secret,
type="password"
)
st.session_state.google_refresh_token = st.text_input(
"Google Refresh Token",
value=st.session_state.google_refresh_token,
type="password"
)
print("🌍 Travel Planning Agent — Airbnb, Maps, Weather, Calendar (type 'exit' to quit)\n")
try:
while True:
user_input = input("You: ")
if user_input.lower() in ["exit", "quit"]:
print("👋 Bye!")
break
asyncio.run(run_agent(user_input))
except KeyboardInterrupt:
print("\n👋 Interrupted. Exiting...")
# Check if all API keys are filled
all_keys_filled = all([
st.session_state.google_maps_key,
st.session_state.accuweather_key,
st.session_state.openai_key,
st.session_state.google_client_id,
st.session_state.google_client_secret,
st.session_state.google_refresh_token
])
if not all_keys_filled:
st.warning("⚠️ Please fill in all API keys to use the travel planner.")
else:
st.success("✅ All API keys are configured!")
# Title and description
st.title("✈️ AI Travel Planner")
st.markdown("""
This AI-powered travel planner helps you create personalized travel itineraries using:
- 🗺 Maps and navigation
- 🌤 Weather forecasts
- 🏨 Accommodation booking
- 📅 Calendar management
""")
# Create two columns for input
col1, col2 = st.columns(2)
with col1:
# Source and Destination
source = st.text_input("Source", placeholder="Enter your departure city")
destination = st.text_input("Destination", placeholder= "Enter your destination city")
# Travel Dates
travel_dates = st.date_input(
"Travel Dates",
[date.today(), date.today()],
min_value=date.today(),
help="Select your travel dates"
)
with col2:
# Budget
budget = st.number_input(
"Budget (in USD)",
min_value=0,
max_value=10000,
step=100,
help="Enter your total budget for the trip"
)
# Travel Preferences
travel_preferences = st.multiselect(
"Travel Preferences",
["Adventure", "Relaxation", "Sightseeing", "Cultural Experiences",
"Beach", "Mountain", "Luxury", "Budget-Friendly", "Food & Dining",
"Shopping", "Nightlife", "Family-Friendly"],
help="Select your travel preferences"
)
# Additional preferences
st.subheader("Additional Preferences")
col3, col4 = st.columns(2)
with col3:
accommodation_type = st.selectbox(
"Preferred Accommodation",
["Any", "Hotel", "Hostel", "Apartment", "Resort"],
help="Select your preferred type of accommodation"
)
transportation_mode = st.multiselect(
"Preferred Transportation",
["Train", "Bus", "Flight", "Rental Car"],
help="Select your preferred modes of transportation"
)
with col4:
dietary_restrictions = st.multiselect(
"Dietary Restrictions",
["None", "Vegetarian", "Vegan", "Gluten-Free", "Halal", "Kosher"],
help="Select any dietary restrictions"
)
# Submit Button
if st.button("Plan My Trip", type="primary", disabled=not all_keys_filled):
if not source or not destination:
st.error("Please enter both source and destination cities.")
elif not travel_preferences:
st.warning("Consider selecting some travel preferences for better recommendations.")
else:
# Create a loading spinner
with st.spinner("🤖 AI Agents are planning your perfect trip..."):
try:
# Construct the message for the agents
message = f"""
Plan a trip with the following details:
- From: {source}
- To: {destination}
- Dates: {travel_dates[0]} to {travel_dates[1]}
- Budget in USD: ${budget}
- Preferences: {', '.join(travel_preferences)}
- Accommodation: {accommodation_type}
- Transportation: {', '.join(transportation_mode)}
- Dietary Restrictions: {', '.join(dietary_restrictions)}
Please provide a comprehensive travel plan including:
1. Recommended accommodations
2. Daily itinerary with activities
3. Transportation options
4. The Expected Day Weather
5. Estimated cost of the Trip
6. Add the Departure Date to the calendar
"""
# Run the agents
response = asyncio.run(run_agent(message))
# Display the response
st.success("✅ Your travel plan is ready!")
st.markdown(response)
except Exception as e:
st.error(f"An error occurred while planning your trip: {str(e)}")
st.info("Please try again or contact support if the issue persists.")
# Add a footer
st.markdown("---")
st.markdown("""
<div style='text-align: center'>
<p>Powered by AI Travel Planning Agents</p>
<p>Your personal travel assistant for creating memorable experiences</p>
</div>
""", unsafe_allow_html=True)

View file

@ -1,21 +0,0 @@
from google_auth_oauthlib.flow import InstalledAppFlow
from dotenv import load_dotenv
import os
load_dotenv() # Loads from .env
SCOPES = ['https://www.googleapis.com/auth/calendar']
flow = InstalledAppFlow.from_client_config({
"installed": {
"client_id": os.getenv("GOOGLE_CLIENT_ID"),
"client_secret": os.getenv("GOOGLE_CLIENT_SECRET"),
"redirect_uris": ["urn:ietf:wg:oauth:2.0:oob"],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token"
}
}, SCOPES)
creds = flow.run_local_server(port=0)
print("\n=== REFRESH TOKEN ===\n")
print(creds.refresh_token)

View file

@ -1,6 +1,9 @@
agno==1.2.13
mcp==1.6.0
streamlit==1.44.1
google-api-python-client
google-auth
google-auth-oauthlib
google-api-python-client==2.118.0
google-auth==2.28.1
google-auth-oauthlib==1.2.0
python-dotenv==1.0.1
requests==2.31.0
openai==1.12.0