|
|
""" |
|
|
MissionControlMCP - Enterprise Automation MCP Server |
|
|
Main server implementation using MCP SDK |
|
|
""" |
|
|
import logging |
|
|
from typing import Any |
|
|
import sys |
|
|
import os |
|
|
|
|
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) |
|
|
|
|
|
|
|
|
from mcp.server import Server |
|
|
from mcp.types import Tool, TextContent |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
app = Server("mission-control-mcp") |
|
|
|
|
|
|
|
|
|
|
|
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"] |
|
|
} |
|
|
) |
|
|
] |
|
|
|
|
|
|
|
|
@app.list_tools() |
|
|
async def list_tools() -> list[Tool]: |
|
|
"""List all available tools""" |
|
|
return TOOLS |
|
|
|
|
|
|
|
|
@app.call_tool() |
|
|
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}") |
|
|
|
|
|
|
|
|
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()) |
|
|
|