#!/usr/bin/env python3
"""
MCP Stdio 服务器入口
用于 Claude Desktop 等 MCP 客户端通过 stdio 协议连接
"""
import asyncio
import sys
from loguru import logger
from mcp.server.stdio import stdio_server
from browser.browser import create_browser
from service import XiaohongshuService
from mcp_server import MCPServer
from configs.settings import settings
async def main():
"""主函数"""
# 配置日志 - 只输出到文件,避免干扰 stdio
logger.remove()
logger.add(
"logs/mcp_stdio_{time:YYYY-MM-DD}.log",
rotation="00:00",
retention="7 days",
level=settings.log_level,
encoding="utf-8",
)
logger.info("=" * 60)
logger.info("Xiaohongshu MCP Stdio Server")
logger.info("=" * 60)
try:
# 创建浏览器管理器
logger.info("Creating browser manager...")
browser_manager = await create_browser(
headless=settings.headless,
bin_path=settings.browser_bin_path
)
# 创建服务
logger.info("Creating xiaohongshu service...")
service = XiaohongshuService(browser_manager)
# 创建 MCP 服务器
logger.info("Creating MCP server...")
mcp_server = MCPServer(service)
# 启动 stdio 服务器
logger.info("Starting MCP stdio server...")
async with stdio_server() as (read_stream, write_stream):
await mcp_server.get_server().run(
read_stream,
write_stream,
mcp_server.get_server().create_initialization_options()
)
except KeyboardInterrupt:
logger.info("Received keyboard interrupt, shutting down...")
except Exception as e:
logger.error(f"Server error: {e}", exc_info=True)
sys.exit(1)
finally:
if 'browser_manager' in locals():
await browser_manager.close()
if __name__ == "__main__":
asyncio.run(main())