Spaces:
Running
Running
| #!/usr/bin/env python3 | |
| """ | |
| EcoMCP Server Entry Point - Standalone MCP server | |
| Launches the Model Context Protocol (MCP) server for e-commerce intelligence. | |
| Communicates via JSON-RPC messages over stdin/stdout. | |
| Environment Variables: | |
| OPENAI_API_KEY: OpenAI API key for AI-powered features (required) | |
| LOG_LEVEL: Logging level (default: INFO) | |
| Example: | |
| export OPENAI_API_KEY=sk-... | |
| python3 run_server.py | |
| """ | |
| import sys | |
| import os | |
| import asyncio | |
| import logging | |
| # Add project root to path | |
| sys.path.insert(0, os.path.dirname(__file__)) | |
| # Configure logging | |
| logging.basicConfig( | |
| level=os.getenv('LOG_LEVEL', 'INFO'), | |
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', | |
| stream=sys.stderr | |
| ) | |
| logger = logging.getLogger(__name__) | |
| from src.server.mcp_server import EcoMCPServer | |
| async def main(): | |
| """Start MCP server with proper error handling""" | |
| try: | |
| logger.info("Initializing EcoMCP Server...") | |
| server = EcoMCPServer() | |
| logger.info("EcoMCP Server started - listening for JSON-RPC messages") | |
| except ImportError as e: | |
| logger.error(f"Failed to import required module: {e}") | |
| logger.error("Make sure all dependencies are installed: pip install -r requirements.txt") | |
| sys.exit(1) | |
| except Exception as e: | |
| logger.error(f"Failed to start server: {e}") | |
| sys.exit(1) | |
| loop = asyncio.get_event_loop() | |
| def read_message(): | |
| import json | |
| try: | |
| line = sys.stdin.readline() | |
| if line: | |
| return json.loads(line) | |
| except (json.JSONDecodeError, EOFError, ValueError): | |
| pass | |
| return None | |
| async def server_loop(): | |
| import json | |
| while True: | |
| try: | |
| message = await loop.run_in_executor(None, read_message) | |
| if message is None: | |
| await asyncio.sleep(0.1) | |
| continue | |
| response = await server.process_message(message) | |
| sys.stdout.write(json.dumps(response) + "\n") | |
| sys.stdout.flush() | |
| except Exception as e: | |
| import json | |
| import sys | |
| print(f"Server error: {e}", file=sys.stderr) | |
| error_response = { | |
| "jsonrpc": "2.0", | |
| "error": {"code": -32603, "message": str(e)} | |
| } | |
| sys.stdout.write(json.dumps(error_response) + "\n") | |
| sys.stdout.flush() | |
| try: | |
| await server_loop() | |
| except KeyboardInterrupt: | |
| print("Server shutdown", file=sys.stderr) | |
| if __name__ == "__main__": | |
| asyncio.run(main()) | |