fleetmind-dispatch-ai / unified_app.py
mashrur950's picture
feat: Implement unified launcher and update unified app for Gradio UI and MCP SSE server integration
0c00a27
raw
history blame
7.93 kB
"""
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"
)