Spaces:
Sleeping
Sleeping
| """ | |
| MissionControlMCP - Enterprise Automation MCP Server | |
| Main server implementation using MCP SDK | |
| """ | |
| import logging | |
| from typing import Any | |
| import sys | |
| import os | |
| # Setup paths | |
| sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) | |
| # Import MCP SDK | |
| from mcp.server import Server | |
| from mcp.types import Tool, TextContent | |
| # Import tool functions | |
| from tools.pdf_reader import read_pdf | |
| from tools.text_extractor import extract_text | |
| from tools.web_fetcher import fetch_web_content | |
| from tools.rag_search import search_documents | |
| from tools.data_visualizer import visualize_data | |
| from tools.file_converter import convert_file | |
| from tools.email_intent_classifier import classify_email_intent | |
| from tools.kpi_generator import generate_kpis | |
| # Setup logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| # Create MCP server instance | |
| app = Server("mission-control-mcp") | |
| # Tool definitions | |
| TOOLS = [ | |
| Tool( | |
| name="pdf_reader", | |
| description="Extract text and metadata from PDF files. Reads all pages and extracts document information.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "file_path": { | |
| "type": "string", | |
| "description": "Path to the PDF file to read" | |
| } | |
| }, | |
| "required": ["file_path"] | |
| } | |
| ), | |
| Tool( | |
| name="text_extractor", | |
| description="Process and extract information from text. Supports cleaning, summarization, chunking, and keyword extraction.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "text": { | |
| "type": "string", | |
| "description": "Raw text to process" | |
| }, | |
| "operation": { | |
| "type": "string", | |
| "description": "Operation: 'clean', 'summarize', 'chunk', or 'keywords'", | |
| "enum": ["clean", "summarize", "chunk", "keywords"], | |
| "default": "clean" | |
| }, | |
| "max_length": { | |
| "type": "integer", | |
| "description": "Maximum length for summary or chunk size", | |
| "default": 500 | |
| } | |
| }, | |
| "required": ["text"] | |
| } | |
| ), | |
| Tool( | |
| name="web_fetcher", | |
| description="Fetch and extract content from web URLs. Returns clean text or HTML content with metadata.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "url": { | |
| "type": "string", | |
| "description": "URL to fetch content from" | |
| }, | |
| "extract_text_only": { | |
| "type": "boolean", | |
| "description": "Extract only text content (removes HTML)", | |
| "default": True | |
| } | |
| }, | |
| "required": ["url"] | |
| } | |
| ), | |
| Tool( | |
| name="rag_search", | |
| description="Semantic search using RAG (Retrieval Augmented Generation). Finds relevant documents using vector embeddings.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "query": { | |
| "type": "string", | |
| "description": "Search query" | |
| }, | |
| "documents": { | |
| "type": "array", | |
| "items": {"type": "string"}, | |
| "description": "List of documents to search in" | |
| }, | |
| "top_k": { | |
| "type": "integer", | |
| "description": "Number of top results to return", | |
| "default": 3 | |
| } | |
| }, | |
| "required": ["query", "documents"] | |
| } | |
| ), | |
| Tool( | |
| name="data_visualizer", | |
| description="Create data visualizations and charts. Supports bar, line, pie, and scatter charts from JSON or CSV data.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "data": { | |
| "type": "string", | |
| "description": "JSON or CSV string data" | |
| }, | |
| "chart_type": { | |
| "type": "string", | |
| "description": "Chart type", | |
| "enum": ["bar", "line", "pie", "scatter"], | |
| "default": "bar" | |
| }, | |
| "x_column": { | |
| "type": "string", | |
| "description": "X-axis column name" | |
| }, | |
| "y_column": { | |
| "type": "string", | |
| "description": "Y-axis column name" | |
| }, | |
| "title": { | |
| "type": "string", | |
| "description": "Chart title", | |
| "default": "Data Visualization" | |
| } | |
| }, | |
| "required": ["data"] | |
| } | |
| ), | |
| Tool( | |
| name="file_converter", | |
| description="Convert files between formats. Supports PDF↔TXT, TXT↔CSV conversions.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "input_path": { | |
| "type": "string", | |
| "description": "Path to input file" | |
| }, | |
| "output_format": { | |
| "type": "string", | |
| "description": "Desired output format", | |
| "enum": ["txt", "csv", "pdf"] | |
| }, | |
| "output_path": { | |
| "type": "string", | |
| "description": "Optional output file path" | |
| } | |
| }, | |
| "required": ["input_path", "output_format"] | |
| } | |
| ), | |
| Tool( | |
| name="email_intent_classifier", | |
| description="Classify email intent using NLP. Identifies inquiry, complaint, request, feedback, meeting, order, urgent, follow-up, thank you, and application intents.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "email_text": { | |
| "type": "string", | |
| "description": "Email text to classify" | |
| } | |
| }, | |
| "required": ["email_text"] | |
| } | |
| ), | |
| Tool( | |
| name="kpi_generator", | |
| description="Generate business KPIs and insights from data. Calculates revenue, growth, efficiency, customer, and operational metrics.", | |
| inputSchema={ | |
| "type": "object", | |
| "properties": { | |
| "data": { | |
| "type": "string", | |
| "description": "JSON string with business data" | |
| }, | |
| "metrics": { | |
| "type": "array", | |
| "items": { | |
| "type": "string", | |
| "enum": ["revenue", "growth", "efficiency", "customer", "operational"] | |
| }, | |
| "description": "List of metrics to calculate", | |
| "default": ["revenue", "growth", "efficiency"] | |
| } | |
| }, | |
| "required": ["data"] | |
| } | |
| ) | |
| ] | |
| async def list_tools() -> list[Tool]: | |
| """List all available tools""" | |
| return TOOLS | |
| async def call_tool(name: str, arguments: Any) -> list[TextContent]: | |
| """ | |
| Handle tool execution requests | |
| Args: | |
| name: Tool name | |
| arguments: Tool arguments | |
| Returns: | |
| List of TextContent responses | |
| """ | |
| try: | |
| logger.info(f"Executing tool: {name}") | |
| result = None | |
| if name == "pdf_reader": | |
| result = read_pdf(arguments["file_path"]) | |
| elif name == "text_extractor": | |
| result = extract_text( | |
| text=arguments["text"], | |
| operation=arguments.get("operation", "clean"), | |
| max_length=arguments.get("max_length", 500) | |
| ) | |
| elif name == "web_fetcher": | |
| result = fetch_web_content( | |
| url=arguments["url"], | |
| extract_text_only=arguments.get("extract_text_only", True) | |
| ) | |
| elif name == "rag_search": | |
| result = search_documents( | |
| query=arguments["query"], | |
| documents=arguments["documents"], | |
| top_k=arguments.get("top_k", 3) | |
| ) | |
| elif name == "data_visualizer": | |
| result = visualize_data( | |
| data=arguments["data"], | |
| chart_type=arguments.get("chart_type", "bar"), | |
| x_column=arguments.get("x_column"), | |
| y_column=arguments.get("y_column"), | |
| title=arguments.get("title", "Data Visualization") | |
| ) | |
| elif name == "file_converter": | |
| result = convert_file( | |
| input_path=arguments["input_path"], | |
| output_format=arguments["output_format"], | |
| output_path=arguments.get("output_path") | |
| ) | |
| elif name == "email_intent_classifier": | |
| result = classify_email_intent(arguments["email_text"]) | |
| elif name == "kpi_generator": | |
| result = generate_kpis( | |
| data=arguments["data"], | |
| metrics=arguments.get("metrics", ["revenue", "growth", "efficiency"]) | |
| ) | |
| else: | |
| raise ValueError(f"Unknown tool: {name}") | |
| # Format result as JSON string | |
| import json | |
| result_text = json.dumps(result, indent=2, default=str) | |
| return [TextContent(type="text", text=result_text)] | |
| except Exception as e: | |
| logger.error(f"Error executing tool {name}: {e}", exc_info=True) | |
| error_msg = f"Error executing {name}: {str(e)}" | |
| return [TextContent(type="text", text=error_msg)] | |
| async def main(): | |
| """Main entry point for the MCP server""" | |
| from mcp.server.stdio import stdio_server | |
| async with stdio_server() as (read_stream, write_stream): | |
| logger.info("MissionControlMCP server starting...") | |
| await app.run( | |
| read_stream, | |
| write_stream, | |
| app.create_initialization_options() | |
| ) | |
| if __name__ == "__main__": | |
| import asyncio | |
| asyncio.run(main()) | |