ecomcp / run_server.py
vinhnx90's picture
Enhance server and UI with logging, error handling, and new features
216bd52
#!/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())