Odoo MCP Server

by tuanle96
Verified
#!/usr/bin/env python """ Standalone script to run the Odoo MCP server Uses the same approach as in the official MCP SDK examples """ import sys import os import asyncio import anyio import logging import datetime from mcp.server.stdio import stdio_server from mcp.server.lowlevel import Server import mcp.types as types from odoo_mcp.server import mcp # FastMCP instance from our code def setup_logging(): """Set up logging to both console and file""" log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs") os.makedirs(log_dir, exist_ok=True) timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") log_file = os.path.join(log_dir, f"mcp_server_{timestamp}.log") # Configure logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) # Console handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # File handler file_handler = logging.FileHandler(log_file) file_handler.setLevel(logging.DEBUG) # Format for both handlers formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # Add handlers to logger logger.addHandler(console_handler) logger.addHandler(file_handler) return logger def main() -> int: """ Run the MCP server based on the official examples """ logger = setup_logging() try: logger.info("=== ODOO MCP SERVER STARTING ===") logger.info(f"Python version: {sys.version}") logger.info("Environment variables:") for key, value in os.environ.items(): if key.startswith("ODOO_"): if key == "ODOO_PASSWORD": logger.info(f" {key}: ***hidden***") else: logger.info(f" {key}: {value}") logger.info(f"MCP object type: {type(mcp)}") # Run server in stdio mode like the official examples async def arun(): logger.info("Starting Odoo MCP server with stdio transport...") async with stdio_server() as streams: logger.info("Stdio server initialized, running MCP server...") await mcp._mcp_server.run( streams[0], streams[1], mcp._mcp_server.create_initialization_options() ) # Run server anyio.run(arun) logger.info("MCP server stopped normally") return 0 except Exception as e: logger.error(f"Fatal error: {e}", exc_info=True) return 1 if __name__ == "__main__": sys.exit(main())