File size: 6,085 Bytes
38980bb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | """
Simplified MCP Server for EventHub RAG functionality
Uses basic JSON-RPC over stdio instead of complex MCP libraries
"""
import asyncio
import json
import sys
import os
from typing import Any, Dict
sys.path.append('.')
from components.search.search import perform_search, get_all_events, initialize_embeddings
class SimpleMCPServer:
def __init__(self):
self.tools = {
"search_events": {
"name": "search_events",
"description": "Search for events using natural language query with filters",
"inputSchema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Natural language query for events"},
"user_id": {"type": "string", "description": "User identifier", "default": "default"}
},
"required": ["query"]
}
},
"get_all_events": {
"name": "get_all_events",
"description": "Get all available events without filtering",
"inputSchema": {"type": "object", "properties": {}}
}
}
async def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:
"""Handle incoming JSON-RPC request"""
try:
method = request.get("method")
params = request.get("params", {})
request_id = request.get("id")
if method == "tools/list":
result = {"tools": list(self.tools.values())}
elif method == "tools/call":
tool_name = params.get("name")
tool_args = params.get("arguments", {})
if tool_name == "search_events":
result = await self.search_events(tool_args)
elif tool_name == "get_all_events":
result = await self.get_all_events(tool_args)
else:
raise ValueError(f"Unknown tool: {tool_name}")
else:
raise ValueError(f"Unknown method: {method}")
return {
"jsonrpc": "2.0",
"id": request_id,
"result": result
}
except Exception as e:
return {
"jsonrpc": "2.0",
"id": request.get("id"),
"error": {"code": -1, "message": str(e)}
}
async def search_events(self, args: Dict[str, Any]) -> Dict[str, Any]:
"""Handle search_events tool call"""
query = args.get("query", "")
user_id = args.get("user_id", "default")
try:
results = perform_search(query, user_id)
formatted_results = []
for event in results:
formatted_event = {
"title": event.get("title", ""),
"category": event.get("category", ""),
"location": event.get("location", ""),
"startDateTime": event.get("startDateTime", ""),
"endDateTime": event.get("endDateTime", ""),
"price": event.get("price", ""),
"isFree": event.get("isFree", False),
"organizer": event.get("organizer", ""),
"tags": event.get("tags", "")
}
formatted_results.append(formatted_event)
response_data = {
"query": query,
"results_count": len(formatted_results),
"events": formatted_results[:10]
}
return {
"content": [{
"type": "text",
"text": json.dumps(response_data, indent=2)
}]
}
except Exception as e:
return {
"content": [{
"type": "text",
"text": f"Error searching events: {str(e)}"
}]
}
async def get_all_events(self, args: Dict[str, Any]) -> Dict[str, Any]:
"""Handle get_all_events tool call"""
try:
events = get_all_events()
response_data = {
"total_events": len(events),
"events": events[:20]
}
return {
"content": [{
"type": "text",
"text": json.dumps(response_data, indent=2)
}]
}
except Exception as e:
return {
"content": [{
"type": "text",
"text": f"Error getting events: {str(e)}"
}]
}
async def run(self):
"""Main server loop"""
print("✓ Simple MCP Server started", file=sys.stderr)
while True:
try:
line = sys.stdin.readline()
if not line:
break
request = json.loads(line.strip())
response = await self.handle_request(request)
print(json.dumps(response))
sys.stdout.flush()
except json.JSONDecodeError:
continue
except Exception as e:
error_response = {
"jsonrpc": "2.0",
"id": None,
"error": {"code": -1, "message": str(e)}
}
print(json.dumps(error_response))
sys.stdout.flush()
async def main():
"""Run the simplified MCP server"""
try:
initialize_embeddings()
print("✓ Event embeddings initialized", file=sys.stderr)
except Exception as e:
print(f"✗ Failed to initialize embeddings: {e}", file=sys.stderr)
server = SimpleMCPServer()
await server.run() |