Skip to main content
Glama

MCP Orchestration Server

calendar_agent.py•14.7 kB
#!/usr/bin/env python3 """ Calendar Agent - Google Calendar Integration and Reminder Management Handles calendar events, reminders, and scheduling """ import os import json from datetime import datetime, timedelta from typing import Dict, List, Any, Optional import logging # Add project root to path import sys sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) from agents.base_agent import BaseMCPAgent, AgentCapability, MCPMessage class CalendarAgent(BaseMCPAgent): """Calendar agent for managing events and reminders.""" def __init__(self): capabilities = [ AgentCapability( name="calendar_management", description="Manage calendar events and reminders", input_types=["dict", "text"], output_types=["dict"], methods=["create_reminder", "schedule_event", "check_events", "process", "info"] ) ] super().__init__("calendar_agent", "Calendar Agent", capabilities) """Initializing and storing the remainders and events in the database""" self.reminders = [] self.events = [] """Configuring the default the time zone for calendarAgent""" self.timezone = os.getenv('TIMEZONE', 'UTC') """Recognizing the calendar agent activation""" self.logger.info("Calendar Agent initialized") async def handle_process(self, message: MCPMessage) -> Dict[str, Any]: """Handle the main process method.""" try: params = message.params action = params.get("action", "") """Taking the actions according to the input by the user""" if action == "create_reminder": return await self.handle_create_reminder(message) elif action == "schedule_event": return await self.handle_schedule_event(message) elif action == "check_events": return await self.handle_check_events(message) else: # Parse natural language request query = params.get("query", "") or params.get("text", "") return await self.parse_calendar_request(query) except Exception as e: """Records any error/serious issue that might be present""" self.logger.error(f"Error in process: {e}") return { "status": "error", "message": str(e), "agent": self.agent_id } async def parse_calendar_request(self, query: str) -> Dict[str, Any]: """Parse natural language calendar requests.""" try: query_lower = query.lower() # Check for reminder keywords if any(word in query_lower for word in ["remind", "reminder", "alert", "notify"]): return await self.create_reminder_from_text(query) # Check for event keywords elif any(word in query_lower for word in ["schedule", "meeting", "appointment", "event"]): return await self.create_event_from_text(query) # Check for query keywords elif any(word in query_lower for word in ["check", "show", "list", "what", "when"]): return await self.list_events_and_reminders() else: return { "status": "error", "message": "Could not understand calendar request", "examples": [ "Remind me to call John at 3 PM", "Schedule meeting with team tomorrow at 10 AM", "Check my events for today" ], "agent": self.agent_id } except Exception as e: """""" self.logger.error(f"Error parsing calendar request: {e}") return { "status": "error", "message": f"Failed to parse request: {str(e)}", "agent": self.agent_id } async def create_reminder_from_text(self, text: str) -> Dict[str, Any]: """Create reminder from natural language text.""" try: # Extract time and message from text # This is a simplified parser - in production, use NLP libraries reminder_data = { "id": f"reminder_{len(self.reminders) + 1}", "text": text, "created_at": datetime.now().isoformat(), "status": "active", "type": "reminder" } # Try to extract time information if "at" in text.lower(): # Simple time extraction parts = text.lower().split("at") if len(parts) > 1: time_part = parts[1].strip() reminder_data["time"] = time_part # Try to extract date information if "today" in text.lower(): reminder_data["date"] = datetime.now().strftime("%Y-%m-%d") elif "tomorrow" in text.lower(): reminder_data["date"] = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%d") self.reminders.append(reminder_data) return { "status": "success", "message": "Reminder created successfully", "reminder": reminder_data, "agent": self.agent_id } except Exception as e: self.logger.error(f"Error creating reminder: {e}") return { "status": "error", "message": f"Failed to create reminder: {str(e)}", "agent": self.agent_id } async def create_event_from_text(self, text: str) -> Dict[str, Any]: """Create event from natural language text.""" try: event_data = { "id": f"event_{len(self.events) + 1}", "title": text, "created_at": datetime.now().isoformat(), "status": "scheduled", "type": "event" } # Simple parsing for demo if "meeting" in text.lower(): event_data["category"] = "meeting" elif "appointment" in text.lower(): event_data["category"] = "appointment" else: event_data["category"] = "general" self.events.append(event_data) return { "status": "success", "message": "Event scheduled successfully", "event": event_data, "agent": self.agent_id } except Exception as e: self.logger.error(f"Error creating event: {e}") return { "status": "error", "message": f"Failed to create event: {str(e)}", "agent": self.agent_id } async def list_events_and_reminders(self) -> Dict[str, Any]: """List all events and reminders.""" try: return { "status": "success", "reminders": self.reminders, "events": self.events, "total_reminders": len(self.reminders), "total_events": len(self.events), "agent": self.agent_id } except Exception as e: self.logger.error(f"Error listing events: {e}") return { "status": "error", "message": f"Failed to list events: {str(e)}", "agent": self.agent_id } async def handle_create_reminder(self, message: MCPMessage) -> Dict[str, Any]: """Handle create reminder request.""" try: params = message.params reminder_data = { "id": f"reminder_{len(self.reminders) + 1}", "title": params.get("title", ""), "description": params.get("description", ""), "datetime": params.get("datetime", ""), "email_notification": params.get("email_notification", False), "email_address": params.get("email_address", ""), "created_at": datetime.now().isoformat(), "status": "active", "type": "reminder" } self.reminders.append(reminder_data) return { "status": "success", "message": "Reminder created successfully", "reminder": reminder_data, "agent": self.agent_id } except Exception as e: self.logger.error(f"Error creating reminder: {e}") return { "status": "error", "message": f"Failed to create reminder: {str(e)}", "agent": self.agent_id } async def handle_schedule_event(self, message: MCPMessage) -> Dict[str, Any]: """Handle schedule event request.""" try: params = message.params event_data = { "id": f"event_{len(self.events) + 1}", "title": params.get("title", ""), "description": params.get("description", ""), "start_time": params.get("start_time", ""), "end_time": params.get("end_time", ""), "attendees": params.get("attendees", []), "created_at": datetime.now().isoformat(), "status": "scheduled", "type": "event" } self.events.append(event_data) return { "status": "success", "message": "Event scheduled successfully", "event": event_data, "agent": self.agent_id } except Exception as e: self.logger.error(f"Error scheduling event: {e}") return { "status": "error", "message": f"Failed to schedule event: {str(e)}", "agent": self.agent_id } async def handle_check_events(self, message: MCPMessage) -> Dict[str, Any]: """Handle check events request.""" try: params = message.params date = params.get("date", datetime.now().strftime("%Y-%m-%d")) # Filter events and reminders for the specified date filtered_events = [] filtered_reminders = [] for event in self.events: if date in event.get("start_time", "") or date in event.get("created_at", ""): filtered_events.append(event) for reminder in self.reminders: if date in reminder.get("datetime", "") or date in reminder.get("date", ""): filtered_reminders.append(reminder) return { "status": "success", "date": date, "events": filtered_events, "reminders": filtered_reminders, "total_events": len(filtered_events), "total_reminders": len(filtered_reminders), "agent": self.agent_id } except Exception as e: self.logger.error(f"Error checking events: {e}") return { "status": "error", "message": f"Failed to check events: {str(e)}", "agent": self.agent_id } async def handle_info(self, message: MCPMessage) -> Dict[str, Any]: """Handle info request.""" return { "status": "success", "info": self.get_info(), "total_reminders": len(self.reminders), "total_events": len(self.events), "timezone": self.timezone, "features": [ "Create reminders", "Schedule events", "Natural language parsing", "Email notifications", "Event management" ], "agent": self.agent_id } # Agent registration def get_agent_info(): """Get agent information for auto-discovery.""" return { "name": "Calendar Agent", "description": "Manages calendar events, reminders, and scheduling with natural language support", "version": "1.0.0", "author": "MCP System", "capabilities": ["calendar_management", "reminders", "events", "scheduling"], "category": "specialized" } def create_agent(): """Create and return the agent instance.""" return CalendarAgent() if __name__ == "__main__": # Test the agent import asyncio async def test_agent(): print("šŸ“… Testing Calendar Agent") print("=" * 40) agent = CalendarAgent() # Test reminder creation reminder_message = MCPMessage( id="test_reminder", method="process", params={ "query": "Remind me to call John at 3 PM today" }, timestamp=datetime.now() ) result = await agent.process_message(reminder_message) print(f"Reminder test: {result['status']}") # Test event scheduling event_message = MCPMessage( id="test_event", method="process", params={ "query": "Schedule meeting with team tomorrow at 10 AM" }, timestamp=datetime.now() ) result = await agent.process_message(event_message) print(f"Event test: {result['status']}") # Test listing list_message = MCPMessage( id="test_list", method="process", params={ "query": "Show my events and reminders" }, timestamp=datetime.now() ) result = await agent.process_message(list_message) print(f"List test: {result['status']}") print(f"Total items: {result.get('total_reminders', 0) + result.get('total_events', 0)}") print("\nāœ… Calendar Agent test completed!") asyncio.run(test_agent())

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Nisarg-123-web/MCP2'

If you have feedback or need assistance with the MCP directory API, please join our Discord server