Skip to main content
Glama

MCP Feedback Collector

by keizman
smart-start.py7.36 kB
#!/usr/bin/env python3 """ MCP FeedForward 智能启动器 自动检测环境并选择最佳启动方式 """ import os import sys import subprocess import platform import socket import argparse def check_port(port): """检查端口是否可用""" try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: return s.connect_ex(('localhost', port)) != 0 except: return False def find_available_port(start_port=8000): """查找可用端口""" for port in range(start_port, start_port + 100): if check_port(port): return port raise Exception("未找到可用端口") def detect_environment(): """检测运行环境""" is_docker = os.path.exists('/.dockerenv') is_ssh = 'SSH_CLIENT' in os.environ or 'SSH_TTY' in os.environ has_display = 'DISPLAY' in os.environ or platform.system() == 'Windows' is_windows = platform.system() == 'Windows' is_linux = platform.system() == 'Linux' is_mac = platform.system() == 'Darwin' # 检测是否在服务器环境 is_server = is_ssh or is_docker or (is_linux and not has_display) return { 'docker': is_docker, 'ssh': is_ssh, 'has_display': has_display, 'windows': is_windows, 'linux': is_linux, 'mac': is_mac, 'server': is_server, 'recommend_web': is_server } def check_dependencies(): """检查依赖是否安装""" deps = { 'fastmcp': False, 'pillow': False, 'flask': False, 'tkinter': False } try: import fastmcp deps['fastmcp'] = True except ImportError: pass try: import PIL deps['pillow'] = True except ImportError: pass try: import flask deps['flask'] = True except ImportError: pass try: import tkinter deps['tkinter'] = True except ImportError: pass return deps def install_dependencies(mode='auto'): """安装缺失的依赖""" deps = check_dependencies() missing = [] if not deps['fastmcp']: missing.append('fastmcp>=0.0.4') if not deps['pillow']: missing.append('pillow>=8.0.0') if mode == 'web' and not deps['flask']: missing.extend(['flask>=2.0.0', 'werkzeug>=2.0.0']) if missing: print(f"📦 安装缺失依赖: {', '.join(missing)}") try: subprocess.check_call([sys.executable, '-m', 'pip', 'install'] + missing) print("✅ 依赖安装完成") return True except subprocess.CalledProcessError: print("❌ 依赖安装失败") return False return True def main(): """智能启动主函数""" parser = argparse.ArgumentParser(description="MCP FeedForward 智能启动器") parser.add_argument('--mode', choices=['auto', 'gui', 'web'], default='auto', help='启动模式 (默认: auto)') parser.add_argument('--port', type=int, default=8000, help='Web模式端口 (默认: 8000)') parser.add_argument('--host', default='0.0.0.0', help='Web模式主机 (默认: 0.0.0.0)') parser.add_argument('--install-deps', action='store_true', help='自动安装缺失的依赖') args = parser.parse_args() print("🚀 MCP FeedForward 智能启动器") print("=" * 60) # 检测环境 env = detect_environment() print(f"🔍 环境检测:") print(f" 操作系统: {platform.system()} {platform.release()}") print(f" Python: {sys.version.split()[0]}") print(f" Docker: {'是' if env['docker'] else '否'}") print(f" SSH: {'是' if env['ssh'] else '否'}") print(f" 显示器: {'是' if env['has_display'] else '否'}") print(f" 服务器环境: {'是' if env['server'] else '否'}") # 检查依赖 deps = check_dependencies() print(f"\n📦 依赖检查:") print(f" FastMCP: {'✅' if deps['fastmcp'] else '❌'}") print(f" Pillow: {'✅' if deps['pillow'] else '❌'}") print(f" Flask: {'✅' if deps['flask'] else '❌'}") print(f" Tkinter: {'✅' if deps['tkinter'] else '❌'}") # 决定启动模式 if args.mode == 'auto': if env['recommend_web']: mode = 'web' reason = '检测到服务器环境' elif deps['tkinter'] and env['has_display']: mode = 'gui' reason = '检测到桌面环境' else: mode = 'web' reason = 'GUI不可用,回退到Web模式' else: mode = args.mode reason = '用户指定' print(f"\n🎯 启动模式: {mode.upper()} ({reason})") # 安装依赖 if args.install_deps or not deps['fastmcp'] or not deps['pillow']: if not install_dependencies(mode): return 1 # 检查模式特定依赖 if mode == 'web' and not deps['flask']: print("❌ Web模式需要Flask") print("💡 请运行: pip install flask werkzeug") print(" 或使用: --install-deps 参数") return 1 if mode == 'gui' and not deps['tkinter']: print("❌ GUI模式需要Tkinter") if env['linux']: print("💡 请安装: sudo apt-get install python3-tk") mode = 'web' # 回退到Web模式 print("🔄 回退到Web模式") # 准备启动参数 if mode == 'web': # 检查端口 if not check_port(args.port): print(f"⚠️ 端口 {args.port} 被占用") new_port = find_available_port(args.port + 1) print(f"🔄 使用端口 {new_port}") args.port = new_port print(f"\n🌐 启动Web服务器...") print(f"📱 本地访问: http://localhost:{args.port}") print(f"🔗 远程访问: http://服务器IP:{args.port}") if env['ssh']: print(f"💡 SSH端口转发: ssh -L {args.port}:localhost:{args.port} user@server") # 构建命令 cmd = [ sys.executable, '-m', 'mcp_feedforward.server', '--web', '--host', args.host, '--port', str(args.port) ] else: print(f"\n🖥️ 启动GUI模式...") cmd = [sys.executable, '-m', 'mcp_feedforward.server'] print("=" * 60) # 设置工作目录 if os.path.exists('src/mcp_feedforward'): # 开发模式 os.environ['PYTHONPATH'] = os.pathsep.join([ os.path.join(os.getcwd(), 'src'), os.environ.get('PYTHONPATH', '') ]) # 启动服务 try: print("⚡ 正在启动...") result = subprocess.run(cmd) return result.returncode except KeyboardInterrupt: print("\n🛑 用户停止服务") return 0 except FileNotFoundError: print("❌ 找不到 mcp_feedforward 模块") print("💡 请确保项目已正确安装:") print(" pip install -e .") print(" 或") print(" pip install mcp-feedforward") return 1 except Exception as e: print(f"❌ 启动失败: {e}") return 1 if __name__ == "__main__": sys.exit(main())

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/keizman/mcp-feedforward'

If you have feedback or need assistance with the MCP directory API, please join our Discord server