diff --git a/mcp_center/config/private/mcp_server/config.toml b/mcp_center/config/private/mcp_server/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..ce81440556782e623c986731422fd681cd2cec9c --- /dev/null +++ b/mcp_center/config/private/mcp_server/config.toml @@ -0,0 +1,21 @@ +# 公共配置文件 +# 语言设置,支持zh(中文)和en(英文) +language = "zh" +# server信息配置 +host = "0.0.0.0" +port = 12555 +fastapi_port = 12556 +# 大模型配置 +llm_remote = "" +llm_model = "" +llm_api_key = "" +max_tokens = 8192 +temperature = 0.7 +# 远程主机列表配置 +[[remote_hosts]] +name = "本机" +os_type = "openEuler" +host = "" +port = 22 +username = "root" +password = "" \ No newline at end of file diff --git a/mcp_center/config/private/mcp_server/config_loader.py b/mcp_center/config/private/mcp_server/config_loader.py new file mode 100644 index 0000000000000000000000000000000000000000..17dd2a510622f2dcff0e4138ad2687436d30fc62 --- /dev/null +++ b/mcp_center/config/private/mcp_server/config_loader.py @@ -0,0 +1,27 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2023-2025. All rights reserved. +from config.public.base_config_loader import BaseConfig, project_root +import os +from pydantic import BaseModel, Field +import toml + + +class McpServerConfigModel(BaseModel): + """顶层配置模型""" + port: int = Field(default=12555, description="MCP服务端口") + fastapi_port : int = Field(default=12556, description="fastapi服务端口") + +class McpServerConfig(BaseConfig): + """顶层配置文件读取和使用Class""" + + def __init__(self) -> None: + """读取配置文件""" + super().__init__() + self.load_private_config() + + def load_private_config(self) -> None: + """加载私有配置文件""" + config_file = os.getenv("MCP_SERVER_CONFIG") + if config_file is None: + config_file = os.path.join(project_root,"config", "private", "mcp_server", "config.toml") + self._config.private_config = McpServerConfigModel.model_validate(toml.load(config_file)) + diff --git a/mcp_center/config/public/base_config_loader.py b/mcp_center/config/public/base_config_loader.py index a5db20768670d4e2fbf5ed89c0576bafe2d5a87e..54106237d97c6dbc4b2fdf13c17b4f16f183b00c 100644 --- a/mcp_center/config/public/base_config_loader.py +++ b/mcp_center/config/public/base_config_loader.py @@ -9,7 +9,9 @@ from copy import deepcopy import sys import os # 从当前文件位置向上两级到达项目根目录 -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))) +project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')) +# 2. 添加到模块搜索路径(用于 import 模块) +sys.path.append(project_root) can_import = True try: from apps.schemas.config import ConfigModel as FrameworkConfigModel @@ -57,13 +59,13 @@ class BaseConfig(): def __init__(self) -> None: """读取配置文件;当PROD环境变量设置时,配置文件将在读取后删除""" - config_file = os.path.join("config", "public", "public_config.toml") + config_file = os.path.join(project_root,"config", "public", "public_config.toml") self._config = ConfigModel() self._config.public_config = PublicConfigModel.model_validate(toml.load(config_file)) framework_config_file = os.getenv("CONFIG") if framework_config_file is None: if can_import: - framework_config_file = os.path.join("..", "config", "config.toml") + framework_config_file = os.path.join(project_root,"..", "config", "config.toml") if framework_config_file and os.path.exists(framework_config_file): framework_config = FrameworkConfigModel.model_validate(toml.load(framework_config_file)) self._config.public_config.llm_remote = framework_config.llm.endpoint @@ -78,3 +80,8 @@ class BaseConfig(): def get_config(self) -> ConfigModel: """获取配置文件内容""" return deepcopy(self._config) + + def update_config(self): + config_file = os.path.join(project_root,"config", "public", "public_config.toml") + self._config = ConfigModel() + self._config.public_config = PublicConfigModel.model_validate(toml.load(config_file)) \ No newline at end of file diff --git a/mcp_center/mcp_config/mcp_server_mcp/config.json b/mcp_center/mcp_config/mcp_server_mcp/config.json index 627e246ccf0dc556bd0b8e571dbe594c610dfc85..720f73a07bf7fe17ebe086e4e6584bc307afa31e 100644 --- a/mcp_center/mcp_config/mcp_server_mcp/config.json +++ b/mcp_center/mcp_config/mcp_server_mcp/config.json @@ -3,7 +3,7 @@ "mcp_server": { "headers": {}, "autoApprove": [], - "autoInstall": false, + "autoInstall": true, "timeout": 60, "url": "http://127.0.0.1:12555/sse" } diff --git a/mcp_center/mcp_config/remote_info_mcp/config.json b/mcp_center/mcp_config/remote_info_mcp/config.json index cf7eb8ce68cf411c945db585b3291be2fd73583e..a018fe4e434fe9612c4d2d0f57c96d08dcf932f6 100644 --- a/mcp_center/mcp_config/remote_info_mcp/config.json +++ b/mcp_center/mcp_config/remote_info_mcp/config.json @@ -1,6 +1,6 @@ { "mcpServers": { - "mcp_server": { + "remote_info_mcp": { "headers": {}, "autoApprove": [], "autoInstall": false, diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/server.py b/mcp_center/servers/oe-cli-mcp-server/mcp_server/server.py deleted file mode 100644 index 1e8e5a4af0e6f2005b88df222b16ec75401b5411..0000000000000000000000000000000000000000 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/server.py +++ /dev/null @@ -1,16 +0,0 @@ -# server.py -import os -import sys -PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -if PROJECT_ROOT not in sys.path: - sys.path.insert(0, PROJECT_ROOT) -from config.base_config_loader import BaseConfig -from mcp_server.mcp_manager import McpServer - -config = BaseConfig().get_config().public_config - - - -if __name__ == "__main__": - server = McpServer("mcp实例", host=config.host, port=config.port) - server.start() diff --git a/mcp_center/servers/oe-cli-mcp-server/run.sh b/mcp_center/servers/oe-cli-mcp-server/run.sh deleted file mode 100755 index 72603970a564c1cce2d01bd98c358e5fba81f5c9..0000000000000000000000000000000000000000 --- a/mcp_center/servers/oe-cli-mcp-server/run.sh +++ /dev/null @@ -1,15 +0,0 @@ -source /usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/venv/global/bin/activate - -cp /usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/mcp-server.service /etc/systemd/system/ - -pip install --upgrade pip -pip install -r /usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple - -systemctl daemon-reload -systemctl enable mcp-server.service -systemctl start mcp-server.service -systemctl status mcp-server - -chmod +x /usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli.py -rm -f /usr/local/bin/mcp-server -sudo ln -s /usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli.py /usr/local/bin/mcp-server \ No newline at end of file diff --git a/mcp_center/servers/oe-cli-mcp-server/.gitignore b/mcp_center/servers/oe_cli_mcp_server/.gitignore similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/.gitignore rename to mcp_center/servers/oe_cli_mcp_server/.gitignore diff --git a/mcp_center/servers/oe-cli-mcp-server/README.en.md b/mcp_center/servers/oe_cli_mcp_server/README.en.md similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/README.en.md rename to mcp_center/servers/oe_cli_mcp_server/README.en.md diff --git a/mcp_center/servers/oe-cli-mcp-server/README.md b/mcp_center/servers/oe_cli_mcp_server/README.md similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/README.md rename to mcp_center/servers/oe_cli_mcp_server/README.md diff --git a/mcp_center/servers/oe-cli-mcp-server/client/client.py b/mcp_center/servers/oe_cli_mcp_server/client/client.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/client/client.py rename to mcp_center/servers/oe_cli_mcp_server/client/client.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp-server.service b/mcp_center/servers/oe_cli_mcp_server/mcp-server.service similarity index 71% rename from mcp_center/servers/oe-cli-mcp-server/mcp-server.service rename to mcp_center/servers/oe_cli_mcp_server/mcp-server.service index 9e36464cb0a6e31e29f646babb948600819b0789..5608b9a54e6eddcb495583ec436a381666b8f886 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp-server.service +++ b/mcp_center/servers/oe_cli_mcp_server/mcp-server.service @@ -3,17 +3,17 @@ Description=MCP Tool Registration Service After=network.target After=multi-user.target # 新增:确保文件系统就绪(避免工作目录未挂载) -RequiresMountsFor=/home/tsn/oe-cli-mcp-server +RequiresMountsFor=/usr/lib/euler-copilot-framework/mcp_center/ [Service] User=root Group=root # 工作目录:必须是项目根目录(已正确配置,确保 server.py 中相对路径生效) -WorkingDirectory=/usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/ +WorkingDirectory=/usr/lib/euler-copilot-framework/mcp_center/ -Environment="PATH=/usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/venv/global/bin:$PATH" +Environment="PATH=/usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/venv/global/bin:$PATH" -ExecStart=/usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/venv/global/bin/python /usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/mcp_server/server.py +ExecStart=/usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/venv/global/bin/python /usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/server.py # 原有合理配置保留 Restart=always diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/MCP_TOOLS.json b/mcp_center/servers/oe_cli_mcp_server/mcp_server/MCP_TOOLS.json similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/MCP_TOOLS.json rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/MCP_TOOLS.json diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli.py similarity index 83% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/cli.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/cli.py index c35886c0d29e669dcdcfc3e1c1dfa953df6fb2de..7d319b5add139444eb948709f4e7b1daa81560b1 100755 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli.py @@ -1,6 +1,5 @@ -#!/usr/lib/euler-copilot-framework/mcp_center/servers/oe-cli-mcp-server/venv/global/bin/python3 +#!/usr/bin/env python3 import logging -import os import sys with open("/etc/systemd/system/mcp-server.service", "r") as f: for line in f: @@ -10,10 +9,10 @@ with open("/etc/systemd/system/mcp-server.service", "r") as f: # 加入 sys.path sys.path.insert(0, PROJECT_ROOT) -from mcp_server.cli.parse_args import parse_args -from mcp_server.cli.handle import ( +from servers.oe_cli_mcp_server.mcp_server.cli.parse_args import parse_args +from servers.oe_cli_mcp_server.mcp_server.cli.handle import ( handle_add, handle_remove, handle_tool, handle_init, - handle_start, handle_log, handle_llm, handle_config, handle_stop + handle_start, handle_log, handle_llm, handle_config, handle_stop,handle_restart ) # 日志极简配置 @@ -34,6 +33,8 @@ def main(): success = handle_init() elif args.start: success = handle_start() + elif args.restart: + success = handle_restart() elif args.log: success = handle_log() elif args.llm: diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli/__init__.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli/__init__.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/cli/__init__.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/cli/__init__.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli/handle.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli/handle.py similarity index 93% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/cli/handle.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/cli/handle.py index 8a00bb822ba12e610f4ecd0f7def8a243aaf9914..000299cb3924313916191a039a623f5775ba5ee2 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli/handle.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli/handle.py @@ -3,15 +3,19 @@ import os import subprocess import toml import requests # 新增:导入 requests 库(用于 HTTP 调用) -from mcp_tools.tool_type import ToolType -from util.get_project_root import get_project_root -from util.test_llm_valid import is_llm_config_valid + + +from config.private.mcp_server.config_loader import McpServerConfig +from servers.oe_cli_mcp_server.mcp_tools.tool_type import ToolType +from servers.oe_cli_mcp_server.server import config +from servers.oe_cli_mcp_server.util.test_llm_valid import is_llm_config_valid # 新增:FastAPI 服务地址(和 api_server.py 配置一致,端口 12556) -FASTAPI_BASE_URL = "http://127.0.0.1:12556" + +FASTAPI_BASE_URL = f"http://127.0.0.1:{config.fastapi_port}" # 路径配置(直接硬编码,简化) -PUBLIC_CONFIG_PATH = os.path.join(get_project_root(), "config/public_config.toml") +PUBLIC_CONFIG_PATH = "config/public/public_config.toml" logger = logging.getLogger(__name__) @@ -62,14 +66,15 @@ def handle_add(pkg_input): def handle_remove(pkg_input): """处理 -remove 命令""" type_map = {"智能运维": ToolType.BASE.value, "智算调优": ToolType.AI.value, - "通算调优": ToolType.CAL.value, "镜像运维": ToolType.MIRROR.value, - "个性化": ToolType.PERSONAL.value,"知识库": ToolType.RAG.value} + "通算调优": ToolType.CAL.value, "镜像运维": ToolType.MIRROR.value, "个性化": ToolType.PERSONAL.value} params = {"type": "system" if pkg_input in type_map else "custom", "value": type_map.get(pkg_input, pkg_input)} # 替换:send_socket_request → send_http_request result = send_http_request("remove", params) print(f"✅ {result['message']}" if result["success"] else f"❌ {result['message']}") + handle_restart() + return result["success"] def handle_tool(): @@ -91,6 +96,8 @@ def handle_init(): # 替换:send_socket_request → send_http_request result = send_http_request("init") print(f"✅ {result['message']}" if result["success"] else f"❌ {result['message']}") + handle_restart() + return result["success"] # -------------------------- 服务操作 -------------------------- diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/cli/parse_args.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli/parse_args.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/cli/parse_args.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/cli/parse_args.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/dependency.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/dependency.py similarity index 87% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/dependency.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/dependency.py index 0c06aea398bd9a22811c099f5ed10946f3109b92..d76f64af18f72fa92d07d8f691fc51e351be5edd 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/dependency.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_server/dependency.py @@ -5,7 +5,7 @@ import sys import logging from typing import Any, Optional, Dict from pkg_resources import get_distribution, DistributionNotFound -from util.get_project_root import get_project_root +from servers.oe_cli_mcp_server.util.get_project_root import get_project_root logger = logging.getLogger(__name__) class DepVenvManager: @@ -28,10 +28,45 @@ class DepVenvManager: self.venv_root = os.path.join(self.project_root, "venv") self.global_venv_path = os.path.join(self.venv_root, "global") self.isolated_venv_root = os.path.join(self.venv_root, "isolated") - + self._check_venv_integrity(self.global_venv_path, is_global=True) # 2. 初始化目录(确保根目录存在) os.makedirs(self.venv_root, exist_ok=True) os.makedirs(self.isolated_venv_root, exist_ok=True) + def _check_venv_integrity(self, venv_path: str, is_global: bool = False) -> bool: + """ + 检测虚拟环境是否完整(核心检测项) + 返回:True=完整,False=不完整(自动修复或报错) + """ + self.logger.debug(f"检测虚拟环境完整性:{venv_path}") + + # 检测项1:虚拟环境目录是否存在 + if not os.path.exists(venv_path): + self.logger.warning(f"虚拟环境目录不存在:{venv_path}") + if is_global: + self.logger.info("全局环境缺失,将自动创建") + return False + + # 检测项2:pip 可执行文件是否存在 + pip_path = os.path.join(venv_path, "bin", "pip") + if not os.path.exists(pip_path) or not os.access(pip_path, os.X_OK): + self.logger.error(f"虚拟环境不完整:缺少可执行的 pip → {pip_path}") + if is_global: + self.logger.info("尝试重新创建全局虚拟环境...") + import shutil + shutil.rmtree(venv_path) # 删除不完整环境 + self.create_global_venv() # 重新创建 + return self._check_venv_integrity(venv_path, is_global) # 重新检测 + return False + + # 检测项3:site-packages 目录是否存在(确保依赖能安装到正确位置) + site_packages = self._get_venv_site_packages(venv_path) + if not os.path.exists(site_packages): + self.logger.error(f"虚拟环境不完整:缺少 site-packages 目录 → {site_packages}") + return False + + # 所有检测项通过 + self.logger.debug(f"虚拟环境完整:{venv_path}") + return True def _get_installed_packages(self, venv_path: str) -> Dict[str, str]: """辅助方法:获取指定虚拟环境中已安装的Python包(包名→版本号)""" @@ -254,7 +289,7 @@ class DepVenvManager: # 有依赖 → 先检查全局兼容性 with open(deps_script_path, "r", encoding="utf-8") as f: - pip_deps = toml.load(f).get("pip_deps", {}) + pip_deps = toml.load(f).get("pip", {}) global_venv = self.create_global_venv() if self.check_pip_compatibility(pip_deps, global_venv): diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/manager.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/manager.py similarity index 97% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/manager.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/manager.py index ba710c2dbf774995eb67dba0b58782aad4a3a2e2..d7d713510d45068d1c5bea51ff4b7ad693f4d3af 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/manager.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/manager.py @@ -10,10 +10,11 @@ import json import logging import os from typing import Dict, List, Optional, Any -from config.base_config_loader import get_tool_state_path -from mcp_server.manager.tool_repository import ToolRepository, tool_repository as default_repo -from mcp_server.manager.package_loader import PackageLoader, package_loader as default_loader -from mcp_server.manager.package_unloader import PackageUnloader, package_unloader as default_unloader +from servers.oe_cli_mcp_server.mcp_server.manager.tool_repository import ToolRepository, tool_repository as default_repo +from servers.oe_cli_mcp_server.mcp_server.manager.package_loader import PackageLoader, package_loader as default_loader +from servers.oe_cli_mcp_server.mcp_server.manager.package_unloader import PackageUnloader, package_unloader as default_unloader + +from servers.oe_cli_mcp_server.util.get_tool_state_path import get_tool_state_path logger = logging.getLogger(__name__) diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/package_loader.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/package_loader.py similarity index 97% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/package_loader.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/package_loader.py index c79a471cb6dd47e9ced8f1067d3013c17f0051d7..1c6100fd4028a68113981b9eaf6f46627c91f982 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/package_loader.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/package_loader.py @@ -14,10 +14,10 @@ import logging from typing import Dict, List, Optional, Any from importlib.util import spec_from_file_location, module_from_spec -from mcp_server.dependency import DepVenvManager -from util.get_project_root import get_project_root -from util.tool_package_file_check import tool_package_file_check -from mcp_server.manager.tool_repository import ToolRepository, tool_repository as default_repo +from servers.oe_cli_mcp_server.mcp_server.dependency import DepVenvManager +from servers.oe_cli_mcp_server.util.get_project_root import get_project_root +from servers.oe_cli_mcp_server.util.tool_package_file_check import tool_package_file_check +from servers.oe_cli_mcp_server.mcp_server.manager.tool_repository import ToolRepository, tool_repository as default_repo logger = logging.getLogger(__name__) diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/package_unloader.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/package_unloader.py similarity index 96% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/package_unloader.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/package_unloader.py index 060e8a12664958e8d0949dbc7ec9b9d5b782ff38..81fd0b2ef6426aad86d2c4c0793934d47c66c882 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/package_unloader.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/package_unloader.py @@ -8,10 +8,10 @@ """ import logging -from typing import Dict, List, Optional, Any +from typing import Optional -from mcp_server.dependency import DepVenvManager -from mcp_server.manager.tool_repository import ToolRepository, tool_repository as default_repo +from servers.oe_cli_mcp_server.mcp_server.dependency import DepVenvManager +from servers.oe_cli_mcp_server.mcp_server.manager.tool_repository import ToolRepository, tool_repository as default_repo logger = logging.getLogger(__name__) diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/tool_repository.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/tool_repository.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/manager/tool_repository.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/manager/tool_repository.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_server/mcp_manager.py b/mcp_center/servers/oe_cli_mcp_server/mcp_server/mcp_manager.py similarity index 87% rename from mcp_center/servers/oe-cli-mcp-server/mcp_server/mcp_manager.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_server/mcp_manager.py index 62fd8b64a82ef07291081c2cf3017ff6a2b746eb..7269a006be10fa1b9f01f0244730faf56a1da577 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_server/mcp_manager.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_server/mcp_manager.py @@ -2,19 +2,17 @@ import os.path from functools import wraps from mcp.server import FastMCP -from config.base_config_loader import BaseConfig -from mcp_server.manager.manager import ToolManager, logger -from mcp_tools.tool_type import ToolType -from util.get_project_root import get_project_root -from util.zip_tool_util import unzip_tool +from config.private.mcp_server.config_loader import McpServerConfig +from servers.oe_cli_mcp_server.mcp_server.manager.manager import ToolManager, logger +from servers.oe_cli_mcp_server.mcp_tools.tool_type import ToolType +from servers.oe_cli_mcp_server.util.get_project_root import get_project_root +from servers.oe_cli_mcp_server.util.zip_tool_util import unzip_tool import threading import uvicorn from fastapi import FastAPI # -------------------------- 导入独立的 FastAPI 启动函数 -------------------------- - -PUBLIC_CONFIG_PATH = os.path.join(get_project_root(), "config/public_config.toml") PERSIST_FILE = os.path.join(get_project_root(), "data/tool_state.json") def singleton(cls): @@ -47,7 +45,7 @@ class McpServer(ToolManager): self.mcp = FastMCP(name, host=host, port=port) self.host = host self.port = port - self.language = BaseConfig().get_config().public_config.language + self.language = McpServerConfig().get_config().public_config.language self.PERSIST_FILE = PERSIST_FILE self.fastapi_app = None # 存储 FastAPI 实例 self.fastapi_thread = None # 存储 FastAPI 线程 @@ -72,6 +70,7 @@ class McpServer(ToolManager): self.restore_tool_state() self.reload_package_functions() for pkg in self.list_packages(): + logger.info(f"包名:{pkg}") self.load(pkg) def load(self, mcp_collection: ToolType | str): @@ -118,23 +117,14 @@ class McpServer(ToolManager): self._reset() def init(self): - del self.mcp + all_types = self.list_tool_types() for mcp_type in all_types: self.unload_tool_type(mcp_type) - BaseConfig().update_config(default=True) - self.reload_config() + del self.mcp self.mcp = FastMCP("mcp实例", host=self.host, port=self.port) self.load(ToolType.BASE) - logger.info(f"初始化完成:仅保留基础运维包") - - def reload_config(self): - import toml - BaseConfig().update_config() - with open(PUBLIC_CONFIG_PATH, "r", encoding="utf-8") as f: - config = toml.load(f) - self.port = config["port"] - self.host = config["host"] + logger.info(f"初始化完成:仅保留基础运维包,重启后生效") def restart(self): self._reset() @@ -143,14 +133,18 @@ class McpServer(ToolManager): def start(self): # 1. 先初始化 MCP 核心逻辑(确保 self.list_packages 等方法可用) - self._reset() + self.restore_tool_state() + self.reload_package_functions() + for pkg in self.list_packages(): + logger.info(f"包名:{pkg}") + self.load(pkg) logger.info(f"MCP 实例初始化完成,已加载 {len(self.list_packages())} 个工具包") # 2. 启动 FastAPI 服务(直接调用实例方法,绑定 self) - self._start_fastapi(host="0.0.0.0", port=12556) + self._start_fastapi(host="0.0.0.0", port=McpServerConfig().get_config().private_config.fastapi_port) # 3. 最后启动 FastMCP 主服务(阻塞主线程) - logger.info("启动 FastMCP 主服务...") + logger.info(f"启动 FastMCP 主服务...持久化于{PERSIST_FILE}") self.mcp.run(transport='sse') # -------------------------- 简化 start 方法:调用独立的 FastAPI 启动函数 -------------------------- @@ -195,7 +189,7 @@ class McpServer(ToolManager): @app.post("/tool/remove", summary="删除工具包") def remove_tool(type: str, value: str): - """删除工具包(与 Socket remove 逻辑完全一致,重启后生效)""" + """删除工具包""" try: # 完全对齐 _exec_socket_action 的 remove 逻辑 if type == "system": @@ -209,17 +203,17 @@ class McpServer(ToolManager): @app.post("/tool/init", summary="初始化工具包") def init_tool(): - """初始化工具包(与 Socket init 逻辑完全一致,仅保留基础运维包)""" + """初始化工具包""" try: self.init() # 直接调用实例的 init 方法(和 Socket 版本一致) - return {"success": True, "message": "初始化成功(仅保留基础运维包)"} + return {"success": True, "message": "初始化成功(仅保留基础运维包)重启后生效"} except Exception as e: logger.error(f"初始化工具包失败:{str(e)}", exc_info=True) return {"success": False, "message": f"初始化失败:{str(e)}"} return app - def _start_fastapi(self, host: str = "0.0.0.0", port: int = 12556): + def _start_fastapi(self, host: str = "0.0.0.0", port: int = McpServerConfig().get_config().private_config.fastapi_port): """启动 FastAPI 服务(实例方法,直接绑定 self)""" # 1. 创建 FastAPI 应用(绑定当前实例) self.fastapi_app = self._create_fastapi_app() @@ -243,9 +237,3 @@ class McpServer(ToolManager): self.fastapi_thread.start() logger.info(f"FastAPI 服务线程启动成功(线程ID:{self.fastapi_thread.ident})") - -# -------------------------- 启动服务(原有逻辑不变)-------------------------- -if __name__ == "__main__": - config = BaseConfig().get_config().public_config - mcp_server = McpServer("MCP_Tool_Service", config.host, config.port) - mcp_server.start() \ No newline at end of file diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/base.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/base.py similarity index 98% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/base.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/base.py index 136b114245fc9ffc9110460eb193ca459b64b823..d0ba531e5113e6bd6e1f72fc3b8977a4064ac451 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/base.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/base.py @@ -1,7 +1,8 @@ import subprocess from typing import Any, Dict, Optional import paramiko -from config.base_config_loader import LanguageEnum + +from servers.oe_cli_mcp_server.config.base_config_loader import LanguageEnum def _format_gpu_info(raw_info: Dict[str, Any], diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/config.json b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/config.json similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/config.json rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/config.json diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/deps.toml b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/deps.toml similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/deps.toml rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/deps.toml diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/tool.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/tool.py similarity index 94% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/tool.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/tool.py index f92dec77cb1aadade56a40eaef5de4d55961532b..c764228651f0288cda9c63df737f1898ccd7cd36 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/AI_tools/nvidia_tool/tool.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/AI_tools/nvidia_tool/tool.py @@ -1,8 +1,7 @@ from typing import Any, Dict, Optional, Union import paramiko -from config.base_config_loader import BaseConfig, LanguageEnum - -from mcp_tools.AI_tools.nvidia_tool.base import _format_gpu_info, _get_local_gpu_status, _get_remote_gpu_status_via_ssh +from servers.oe_cli_mcp_server.config.base_config_loader import LanguageEnum,BaseConfig +from servers.oe_cli_mcp_server.mcp_tools.AI_tools.nvidia_tool.base import _format_gpu_info, _get_local_gpu_status, _get_remote_gpu_status_via_ssh async def nvidia_smi_status( diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/base.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/base.py similarity index 98% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/base.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/base.py index e8c74dabba14c15aed05d650ac3848f357a3267d..1a018f99ae5e4dfa88d72400615fe9773527acb0 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/base.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/base.py @@ -3,8 +3,8 @@ import subprocess import paramiko from typing import Dict, Optional -from config.base_config_loader import BaseConfig -from config.base_config_loader import LanguageEnum +from servers.oe_cli_mcp_server.config.base_config_loader import BaseConfig, LanguageEnum + # 初始化日志(保持原逻辑) logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/config.json b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/config.json similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/config.json rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/config.json diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/deps.toml b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/deps.toml similarity index 88% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/deps.toml rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/deps.toml index f6d4265365bc6855e8541d9083bc6311931c3b28..dc15ebc850e9392a48a23cc4b7850f95b2587a6d 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/deps.toml +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/deps.toml @@ -7,6 +7,8 @@ #ssh_client = [ # "yum install -y openssh-clients" #] +[pip_config] +index_url = "https://pypi.tuna.tsinghua.edu.cn/simple" [pip] # Python依赖包 diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/tool.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/tool.py similarity index 98% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/tool.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/tool.py index 97fc334c4d77b7b5830f24292721bb83ef03e917..84a978a15338b9b41e48b72031ba62118e5ad59b 100644 --- a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/base_tools/file_tools/tool.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/file_tools/tool.py @@ -1,7 +1,6 @@ from typing import Dict, Optional -from config.base_config_loader import LanguageEnum -from mcp_tools. base_tools. file_tools. base import ( - get_language, +from servers.oe_cli_mcp_server.config.base_config_loader import LanguageEnum +from servers.oe_cli_mcp_server.mcp_tools. base_tools. file_tools. base import ( get_remote_auth, run_local_command, run_remote_command, diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/tool_type.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/tool_type.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/tool_type.py rename to mcp_center/servers/oe_cli_mcp_server/mcp_tools/tool_type.py diff --git a/mcp_center/servers/oe-cli-mcp-server/requirements.txt b/mcp_center/servers/oe_cli_mcp_server/requirements.txt similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/requirements.txt rename to mcp_center/servers/oe_cli_mcp_server/requirements.txt diff --git a/mcp_center/servers/oe_cli_mcp_server/run.sh b/mcp_center/servers/oe_cli_mcp_server/run.sh new file mode 100755 index 0000000000000000000000000000000000000000..bce85a1ab720348c65e6f8d12b25abc1a948ed31 --- /dev/null +++ b/mcp_center/servers/oe_cli_mcp_server/run.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# 关键路径(只改这里就行) +VENV_PATH="/usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/venv/global" +REQUIREMENTS="/usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/requirements.txt" + +# 1. 没有虚拟环境就创建 +if [ ! -d "$VENV_PATH" ]; then + python3 -m venv "$VENV_PATH" +fi + +# 2. 激活虚拟环境 + 升级pip + 装依赖 +source "$VENV_PATH/bin/activate" +pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple +pip install -r "$REQUIREMENTS" -i https://pypi.tuna.tsinghua.edu.cn/simple + +# 3. 部署systemd服务 +cp /home/tsn/framework-dev-with-mcp/mcp_center/servers/oe_cli_mcp_server/mcp-server.service /etc/systemd/system/ +systemctl daemon-reload +systemctl enable mcp-server --now +systemctl status mcp-server + +# 4. 全局命令链接 +chmod +x /usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli.py +rm -f /usr/local/bin/mcp-server +ln -s /usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/mcp_server/cli.py /usr/local/bin/mcp-server \ No newline at end of file diff --git a/mcp_center/servers/oe_cli_mcp_server/server.py b/mcp_center/servers/oe_cli_mcp_server/server.py new file mode 100644 index 0000000000000000000000000000000000000000..61c33a4546cd9f25a5c34956e43accd8c9181a4f --- /dev/null +++ b/mcp_center/servers/oe_cli_mcp_server/server.py @@ -0,0 +1,15 @@ +# server.py +import sys +from pathlib import Path +mcp_center_dir = Path(__file__).parent.parent.parent # 关键:根据目录层级调整 +sys.path.append(str(mcp_center_dir)) +from config.private.mcp_server.config_loader import McpServerConfig +from servers.oe_cli_mcp_server.mcp_server.mcp_manager import McpServer + +config = McpServerConfig().get_config().private_config + + + +if __name__ == "__main__": + server = McpServer("mcp实例", host="0.0.0.0", port=config.port) + server.start() diff --git a/mcp_center/servers/oe-cli-mcp-server/setup.py b/mcp_center/servers/oe_cli_mcp_server/setup.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/setup.py rename to mcp_center/servers/oe_cli_mcp_server/setup.py diff --git a/mcp_center/servers/oe-cli-mcp-server/util/get_project_root.py b/mcp_center/servers/oe_cli_mcp_server/util/get_project_root.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/util/get_project_root.py rename to mcp_center/servers/oe_cli_mcp_server/util/get_project_root.py diff --git a/mcp_center/servers/oe_cli_mcp_server/util/get_tool_state_path.py b/mcp_center/servers/oe_cli_mcp_server/util/get_tool_state_path.py new file mode 100644 index 0000000000000000000000000000000000000000..b8d782b7ad4bdec9893dc9eac42bbe73640e04b1 --- /dev/null +++ b/mcp_center/servers/oe_cli_mcp_server/util/get_tool_state_path.py @@ -0,0 +1,12 @@ +import os + +from servers.oe_cli_mcp_server.util.get_project_root import get_project_root + + +def get_tool_state_path() -> str: + """获取Tool状态持久化文件路径""" + root = get_project_root() + state_file = os.path.join(root, "data", "tool_state.json") + # 确保目录存在 + os.makedirs(os.path.dirname(state_file), exist_ok=True) + return state_file \ No newline at end of file diff --git a/mcp_center/servers/oe-cli-mcp-server/util/get_type.py b/mcp_center/servers/oe_cli_mcp_server/util/get_type.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/util/get_type.py rename to mcp_center/servers/oe_cli_mcp_server/util/get_type.py diff --git a/mcp_center/servers/oe-cli-mcp-server/util/test_llm_valid.py b/mcp_center/servers/oe_cli_mcp_server/util/test_llm_valid.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/util/test_llm_valid.py rename to mcp_center/servers/oe_cli_mcp_server/util/test_llm_valid.py diff --git a/mcp_center/servers/oe-cli-mcp-server/util/tool_package_file_check.py b/mcp_center/servers/oe_cli_mcp_server/util/tool_package_file_check.py similarity index 93% rename from mcp_center/servers/oe-cli-mcp-server/util/tool_package_file_check.py rename to mcp_center/servers/oe_cli_mcp_server/util/tool_package_file_check.py index fbe13b7f8b1d888761b799e33dbb85706eaded1d..526bb6f775f4093620bbf4ff1bbdaaf636a4e730 100644 --- a/mcp_center/servers/oe-cli-mcp-server/util/tool_package_file_check.py +++ b/mcp_center/servers/oe_cli_mcp_server/util/tool_package_file_check.py @@ -1,5 +1,4 @@ import os -from asyncio.log import logger def tool_package_file_check(path: str) -> bool: diff --git a/mcp_center/servers/oe-cli-mcp-server/util/venv_util.py b/mcp_center/servers/oe_cli_mcp_server/util/venv_util.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/util/venv_util.py rename to mcp_center/servers/oe_cli_mcp_server/util/venv_util.py diff --git a/mcp_center/servers/oe-cli-mcp-server/util/zip_tool_util.py b/mcp_center/servers/oe_cli_mcp_server/util/zip_tool_util.py similarity index 98% rename from mcp_center/servers/oe-cli-mcp-server/util/zip_tool_util.py rename to mcp_center/servers/oe_cli_mcp_server/util/zip_tool_util.py index d363288af7404e923eb1bddc4d056e5c1a7d50de..b00f9c3e871048bffecff0e9b30a8920f71a90db 100644 --- a/mcp_center/servers/oe-cli-mcp-server/util/zip_tool_util.py +++ b/mcp_center/servers/oe_cli_mcp_server/util/zip_tool_util.py @@ -4,7 +4,7 @@ import logging from typing import Optional import shutil -from util.get_project_root import get_project_root +from servers.oe_cli_mcp_server.util.get_project_root import get_project_root # 全局目标目录(转为绝对路径,避免相对路径混乱) target_dir = os.path.join(get_project_root(),"mcp_tools/personal_tools/") diff --git a/mcp_center/service/mcp-server.service b/mcp_center/service/mcp-server.service index 74a8514a0a848ff0de9dab8dd720679ef5ddcd9c..5608b9a54e6eddcb495583ec436a381666b8f886 100644 --- a/mcp_center/service/mcp-server.service +++ b/mcp_center/service/mcp-server.service @@ -3,17 +3,17 @@ Description=MCP Tool Registration Service After=network.target After=multi-user.target # 新增:确保文件系统就绪(避免工作目录未挂载) -RequiresMountsFor=/home/tsn/oe-cli-mcp-server +RequiresMountsFor=/usr/lib/euler-copilot-framework/mcp_center/ [Service] User=root Group=root # 工作目录:必须是项目根目录(已正确配置,确保 server.py 中相对路径生效) -WorkingDirectory=/home/tsn/oe-cli-mcp-server +WorkingDirectory=/usr/lib/euler-copilot-framework/mcp_center/ -Environment="PATH=/home/tsn/oe-cli-mcp-server/venv/global/bin:$PATH" +Environment="PATH=/usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/venv/global/bin:$PATH" -ExecStart=/home/tsn/oe-cli-mcp-server/venv/global/bin/python /home/tsn/oe-cli-mcp-server/mcp_server/server.py +ExecStart=/usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/venv/global/bin/python /usr/lib/euler-copilot-framework/mcp_center/servers/oe_cli_mcp_server/server.py # 原有合理配置保留 Restart=always