""" FleetMind Unified App Serves both Gradio UI and MCP SSE endpoint on the same port Simple UI showing MCP connection information and server status """ import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent)) from fastapi import FastAPI import uvicorn import gradio as gr import os import json print("=" * 70) print("FleetMind - Unified Server (Gradio UI + MCP SSE)") print("=" * 70) # Configuration MCP_SSE_ENDPOINT = "https://mcp-1st-birthday-fleetmind-dispatch-ai.hf.space/sse" # Import MCP server print("\n[1/2] Loading MCP server...") try: from server import mcp print("[OK] MCP server loaded (29 tools, 2 resources)") mcp_available = True except Exception as e: print(f"[WARNING] MCP server failed to load: {e}") mcp_available = False def get_claude_config(): """Generate Claude Desktop configuration""" config = { "mcpServers": { "fleetmind": { "command": "npx", "args": ["mcp-remote", MCP_SSE_ENDPOINT] } } } return json.dumps(config, indent=2) def get_tools_list(): """Get all 29 MCP tools""" return [ ["geocode_address", "Geocoding & Routing", "Convert address to GPS coordinates"], ["calculate_route", "Geocoding & Routing", "Calculate route with vehicle optimization"], ["calculate_intelligent_route", "Geocoding & Routing", "Weather + traffic aware routing"], ["create_order", "Order Management", "Create new delivery order"], ["count_orders", "Order Management", "Count orders by status"], ["fetch_orders", "Order Management", "Get list of orders with filters"], ["get_order_details", "Order Management", "Get full order details"], ["search_orders", "Order Management", "Search orders"], ["get_incomplete_orders", "Order Management", "Get pending/in-transit orders"], ["update_order", "Order Management", "Update order"], ["delete_order", "Order Management", "Delete order"], ["create_driver", "Driver Management", "Register new driver"], ["count_drivers", "Driver Management", "Count drivers by status"], ["fetch_drivers", "Driver Management", "Get list of drivers"], ["get_driver_details", "Driver Management", "Get full driver details"], ["search_drivers", "Driver Management", "Search drivers"], ["get_available_drivers", "Driver Management", "Get active drivers"], ["update_driver", "Driver Management", "Update driver"], ["delete_driver", "Driver Management", "Delete driver"], ["create_assignment", "Assignment Management", "Manual assignment"], ["auto_assign_order", "Assignment Management", "🤖 Auto-assign to nearest driver"], ["intelligent_assign_order", "Assignment Management", "🧠 Gemini 2.0 Flash AI assignment"], ["get_assignment_details", "Assignment Management", "Get assignment details"], ["update_assignment", "Assignment Management", "Update assignment"], ["unassign_order", "Assignment Management", "Remove assignment"], ["complete_delivery", "Assignment Management", "Mark delivery complete"], ["fail_delivery", "Assignment Management", "Mark delivery failed"], ["delete_all_orders", "Bulk Operations", "Bulk delete orders"], ["delete_all_drivers", "Bulk Operations", "Bulk delete drivers"], ] # Create Gradio interface print("\n[2/2] Creating Gradio UI...") with gr.Blocks(theme=gr.themes.Soft(), title="FleetMind MCP Server") as gradio_app: gr.Markdown("# 🚚 FleetMind MCP Server") gr.Markdown("**Enterprise Model Context Protocol Server for AI-Powered Delivery Dispatch**") gr.Markdown("*Track 1: Building MCP Servers - Enterprise Category*") gr.Markdown("---") gr.Markdown("## 🔌 MCP Server Connection") gr.Markdown("### 📡 SSE Endpoint URL") gr.Textbox(value=MCP_SSE_ENDPOINT, label="Copy this endpoint", interactive=False, max_lines=1) gr.Markdown("### ⚙️ Claude Desktop Configuration") gr.Markdown("Copy and paste this into your `claude_desktop_config.json` file:") gr.Code(value=get_claude_config(), language="json", label="claude_desktop_config.json") gr.Markdown("### 📋 How to Connect") gr.Markdown(""" **Step 1:** Install Claude Desktop from https://claude.ai/download **Step 2:** Open your `claude_desktop_config.json` file and add the configuration shown above **Step 3:** Restart Claude Desktop **Step 4:** Look for "FleetMind" in the 🔌 icon menu in Claude Desktop **Step 5:** Start using commands like: - "Create a delivery order for John at 123 Main St" - "Show me all pending orders" - "Auto-assign order ORD-... to the nearest driver" - "Use AI to intelligently assign order ORD-..." (Gemini 2.0 Flash!) """) gr.Markdown("---") gr.Markdown("## 🛠️ Available MCP Tools (29 Total)") gr.Dataframe( value=get_tools_list(), headers=["Tool Name", "Category", "Description"], label="All FleetMind MCP Tools", wrap=True ) gr.Markdown("---") gr.Markdown("## ⭐ Key Features") gr.Markdown(""" - **29 AI Tools** - Complete fleet management suite - **🧠 Gemini 2.0 Flash AI** - Intelligent assignment with detailed reasoning - **🌦️ Weather-Aware Routing** - Safety-first delivery planning - **🚦 Real-Time Traffic** - Google Routes API integration - **📊 SLA Tracking** - Automatic on-time performance monitoring - **🗄️ PostgreSQL Database** - Production-grade data storage (Neon) - **🚀 Multi-Client Support** - Works with Claude Desktop, Continue, Cline, any MCP client """) gr.Markdown("---") gr.Markdown("## 📚 Resources") gr.Markdown(""" - **GitHub:** https://github.com/mashrur-rahman-fahim/fleetmind-mcp - **HuggingFace Space:** https://huggingface.co/spaces/MCP-1st-Birthday/fleetmind-dispatch-ai - **MCP Protocol:** https://modelcontextprotocol.io """) gr.Markdown("---") gr.Markdown("*FleetMind v1.0 - Built for MCP 1st Birthday Hackathon*") print("[OK] Gradio UI created") # Create FastAPI app print("\nCreating unified FastAPI server...") app = FastAPI(title="FleetMind MCP Server + UI") # Mount Gradio at root app = gr.mount_gradio_app(app, gradio_app, path="/") print("[OK] Gradio UI mounted at /") # Add MCP SSE endpoint if mcp_available: # Mount the MCP server's SSE handler print("[OK] MCP SSE endpoint will be available at /sse") print("\n" + "=" * 70) print("[STARTING] Unified server...") print("=" * 70) print("[UI] Gradio UI: http://0.0.0.0:7860") if mcp_available: print("[MCP] MCP SSE: http://0.0.0.0:7860/sse") print("=" * 70) # Add MCP SSE endpoint to FastAPI app if mcp_available: from starlette.requests import Request from starlette.responses import StreamingResponse # Get the MCP server's SSE handler # We'll use the app.py server as a separate process # For now, just create a simple info endpoint @app.get("/sse") async def mcp_sse_info(): """ MCP SSE endpoint information. Note: For actual MCP SSE connection, deploy app.py separately or use the production endpoint shown in the UI. """ return { "message": "MCP SSE endpoint", "status": "Use the standalone app.py for full MCP SSE functionality", "tools_count": 29, "resources_count": 2, "production_endpoint": MCP_SSE_ENDPOINT } print("[INFO] MCP SSE info endpoint added at /sse") print("[NOTE] For full MCP functionality, the standalone MCP server (app.py) should be deployed") # Run unified server if __name__ == "__main__": # Run FastAPI with Gradio uvicorn.run( app, host="0.0.0.0", port=7860, log_level="info" )