From 107b20a4106dd46fc129b15089468ed59ca38d7f Mon Sep 17 00:00:00 2001 From: cnphpbb Date: Wed, 10 Sep 2025 20:49:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0MCP=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E5=88=9D=E5=A7=8B=E5=AE=9E=E7=8E=B0=E5=8F=8A=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加MCP服务器的完整实现,包括: - 主程序文件mcp_server.py - 配置文件config.toml - 依赖文件requirements.txt - 安装指南INSTALL.md - 使用说明README.md 服务器功能包括接收请求、调用OpenAI API进行分析、日志记录等 --- mcp_server/INSTALL.md | 186 +++++++++++++++++++++++++++++++ mcp_server/README.md | 214 ++++++++++++++++++++++++++++++++++++ mcp_server/config.toml | 27 +++++ mcp_server/mcp_server.py | 188 +++++++++++++++++++++++++++++++ mcp_server/requirements.txt | 17 +++ 5 files changed, 632 insertions(+) create mode 100644 mcp_server/INSTALL.md create mode 100644 mcp_server/README.md create mode 100644 mcp_server/config.toml create mode 100644 mcp_server/mcp_server.py create mode 100644 mcp_server/requirements.txt diff --git a/mcp_server/INSTALL.md b/mcp_server/INSTALL.md new file mode 100644 index 0000000..0391be8 --- /dev/null +++ b/mcp_server/INSTALL.md @@ -0,0 +1,186 @@ +# MCP服务器 - pip安装指南 + +本文档提供了在不同环境下使用pip安装MCP服务器依赖包的详细步骤。 + +## 系统要求 + +- Python 3.8 或更高版本 +- pip 21.0 或更高版本 + +## 检查Python和pip版本 + +在开始安装之前,请先检查您的Python和pip版本: + +```bash +python --version # 或 python3 --version +pip --version # 或 pip3 --version +``` + +如果您的系统中没有安装Python或pip,请先安装它们。 + +## 安装依赖方法 + +### 方法1:使用requirements.txt直接安装 + +最简单的方法是直接使用我们提供的`requirements.txt`文件安装所有依赖: + +```bash +cd /home/geng/mydate/deploy.stack/mcp_server +pip install -r requirements.txt +``` + +如果您的系统中有多个Python版本,可能需要使用`pip3`: + +```bash +pip3 install -r requirements.txt +``` + +### 方法2:虚拟环境安装(推荐) + +为了避免依赖冲突,我们推荐在虚拟环境中安装MCP服务器: + +#### 创建虚拟环境 + +```bash +# 创建虚拟环境 +python -m venv venv + +# 激活虚拟环境 +# Linux/MacOS +source venv/bin/activate +# Windows +# venv\Scripts\activate +``` + +#### 在虚拟环境中安装依赖 + +```bash +pip install -r requirements.txt +``` + +### 方法3:手动安装各个包 + +如果您需要手动安装各个包,可以使用以下命令: + +```bash +# 安装Flask +pip install flask==3.0.3 + +# 安装OpenAI API客户端 +pip install openai==1.30.1 + +# 安装requests库 +pip install requests==2.31.0 + +# 安装dotenv(用于环境变量管理) +pip install python-dotenv==1.0.1 + +# 可选:安装JSON日志格式化库 +pip install python-json-logger==2.0.7 +``` + +## 使用国内镜像源加速安装 + +如果您在国内访问PyPI比较慢,可以使用国内镜像源加速安装: + +### 使用阿里云镜像源 + +```bash +pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ +``` + +### 使用清华大学镜像源 + +```bash +pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ +``` + +### 使用华为云镜像源 + +```bash +pip install -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple/ +``` + +## 验证安装 + +安装完成后,您可以使用以下命令验证所有依赖是否正确安装: + +```bash +pip list | grep -E "flask|openai|requests|python-dotenv" +``` + +您应该能看到已安装的包及其版本。 + +## 安装常见问题 + +### 1. 权限错误 + +如果您遇到权限错误,可以尝试使用`--user`选项以用户权限安装: + +```bash +pip install -r requirements.txt --user +``` + +或者使用sudo(不推荐): + +```bash +sudo pip install -r requirements.txt +``` + +### 2. 版本冲突 + +如果遇到版本冲突,可以尝试更新pip: + +```bash +pip install --upgrade pip +``` + +然后重新安装依赖。 + +### 3. Python.h: No such file or directory + +如果在安装过程中遇到缺少Python开发文件的错误,可以安装Python开发包: + +#### Ubuntu/Debian + +```bash +sudo apt-get install python3-dev +``` + +#### CentOS/RHEL + +```bash +sudo yum install python3-devel +``` + +#### Fedora + +```bash +sudo dnf install python3-devel +``` + +## 升级依赖 + +当需要升级依赖到新版本时,可以使用以下命令: + +```bash +pip install --upgrade -r requirements.txt +``` + +## 卸载依赖 + +如果需要卸载所有依赖,可以使用以下命令: + +```bash +pip uninstall -r requirements.txt -y +``` + +## 生成新的requirements.txt + +如果您对项目依赖做了修改,可以生成新的requirements.txt文件: + +```bash +pip freeze > requirements.txt +``` + +注意:这将包含环境中所有已安装的包,建议在虚拟环境中执行此操作。 \ No newline at end of file diff --git a/mcp_server/README.md b/mcp_server/README.md new file mode 100644 index 0000000..1adc788 --- /dev/null +++ b/mcp_server/README.md @@ -0,0 +1,214 @@ +# MCP服务器 - OpenAPI对接版 + +## 简介 + +这是一个对接OpenAPI的MCP(Model Context Protocol)服务器实现,用于接收来自客户端的请求并调用OpenAI API进行处理和分析。本服务器特别为与`disk_inspection.py`硬盘巡检脚本配合使用而设计,可以自动分析硬盘健康状态报告。 + +## 目录结构 + +``` +mcp_server/ +├── config.toml # 配置文件 +├── mcp_server.py # 主程序文件 +└── README.md # 说明文档 +``` + +## 安装依赖 + +在运行MCP服务器之前,需要安装必要的Python依赖包: + +```bash +pip install flask openai +``` + +## 配置说明 + +### 配置文件 `config.toml` + +配置文件使用TOML格式,包含以下几个主要部分: + +1. **服务器配置** + ```toml + [server] + host = "0.0.0.0" # 监听地址,0.0.0.0表示所有网卡 + port = 8080 # 监听端口 + debug = false # 是否开启调试模式 + ``` + +2. **OpenAI API配置** + ```toml + [openai] + api_key = "your-api-key-here" # 请替换为您的OpenAI API密钥 + model = "gpt-3.5-turbo" # 使用的模型 + base_url = "https://api.openai.com/v1" # API基础URL + max_tokens = 2048 # 最大token数 + temperature = 0.7 # 温度参数 + ``` + +3. **日志配置** + ```toml + [logging] + level = "info" # 日志级别:debug, info, warn, error + format = "text" # 日志格式:text, json + file_path = "/var/log/mcp_server.log" # 日志文件路径 + ``` + +4. **安全配置** + ```toml + [security] + enable_auth = false # 是否启用认证 + # 如果启用认证,需配置以下参数 + # auth_token = "your-auth-token" # 认证令牌 + ``` + +## 运行MCP服务器 + +### 1. 修改配置文件 + +首先,编辑`config.toml`文件,设置您的OpenAI API密钥: + +```bash +vim /home/geng/mydate/deploy.stack/mcp_server/config.toml +``` + +找到`[openai]`部分,将`api_key`替换为您的实际API密钥。 + +### 2. 启动服务器 + +使用Python直接运行服务器: + +```bash +cd /home/geng/mydate/deploy.stack/mcp_server +python mcp_server.py +``` + +或者,您可以将其作为后台服务运行: + +```bash +nohup python mcp_server.py > /dev/null 2>&1 & +``` + +## 与 `disk_inspection.py` 的对接 + +已修改的`disk_inspection.py`脚本可以直接向MCP服务器提交硬盘巡检报告: + +### 1. 为`disk_inspection.py`安装依赖 + +```bash +pip install requests +``` + +### 2. 运行硬盘巡检脚本 + +```bash +python /home/geng/mydate/deploy.stack/crontab/disk_inspection.py +``` + +脚本会自动执行以下操作: +- 检查各个控制器的硬盘状态 +- 生成Markdown格式的报告 +- 将报告通过HTTP请求发送到MCP服务器 +- 接收并保存AI分析结果 + +### 手动提交数据(可选) + +如果需要手动提交数据,可以使用curl命令: + +```bash +curl -X POST -H 'Content-Type: application/json' -d @/root/mcp_data_日期.json http://localhost:8080/mcp/v1/submit +``` + +## API接口说明 + +### MCP提交接口 + +``` +POST /mcp/v1/submit +``` + +**请求体(JSON格式)**: +```json +{ + "type": "disk_inspection_report", + "timestamp": "2023-08-15T12:34:56.789012", + "content": "# 硬盘巡检报告\n..." +} +``` + +**响应(JSON格式)**: +```json +{ + "status": "success", + "result": { + "analysis": "分析结果...", + "processed_at": "2023-08-15T12:35:00.123456", + "original_type": "disk_inspection_report" + } +} +``` + +### 健康检查接口 + +``` +GET /health +``` + +**响应(JSON格式)**: +```json +{ + "status": "healthy" +} +``` + +## 故障排除 + +1. **API密钥错误** + - 确保`config.toml`中的OpenAI API密钥正确 + - 检查API密钥是否有足够的余额和权限 + +2. **连接失败** + - 确保MCP服务器正在运行 + - 检查防火墙设置,确保8080端口已开放 + - 验证`disk_inspection.py`中的MCP服务器URL是否正确 + +3. **权限问题** + - 确保运行服务器的用户有权限写入日志文件 + - 确保`disk_inspection.py`以root权限运行 + +## 定期运行设置 + +您可以将MCP服务器添加到系统服务中,确保其持续运行: + +1. 创建系统服务文件: + ```bash + sudo vim /etc/systemd/system/mcp_server.service + ``` + +2. 添加以下内容(根据实际路径修改): + ``` + [Unit] + Description=MCP Server for OpenAPI Integration + After=network.target + + [Service] + Type=simple + User=root + WorkingDirectory=/home/geng/mydate/deploy.stack/mcp_server + ExecStart=/usr/bin/python /home/geng/mydate/deploy.stack/mcp_server/mcp_server.py + Restart=on-failure + + [Install] + WantedBy=multi-user.target + ``` + +3. 启用并启动服务: + ```bash + sudo systemctl daemon-reload + sudo systemctl enable mcp_server + sudo systemctl start mcp_server + ``` + +4. 检查服务状态: + ```bash + sudo systemctl status mcp_server + ``` \ No newline at end of file diff --git a/mcp_server/config.toml b/mcp_server/config.toml new file mode 100644 index 0000000..748394b --- /dev/null +++ b/mcp_server/config.toml @@ -0,0 +1,27 @@ +[server] +# MCP服务器配置 +host = "0.0.0.0" # 监听地址 +port = 8080 # 监听端口 +debug = false # 是否开启调试模式 + +[openai] +# OpenAI API配置 +api_key = "your-api-key-here" # OpenAI API密钥 +model = "gpt-3.5-turbo" # 使用的模型 +base_url = "https://api.openai.com/v1" # API基础URL +max_tokens = 2048 # 最大token数 +temperature = 0.7 # 温度参数 + +auto_approve = true # 是否自动批准工具调用请求 + +[logging] +# 日志配置 +level = "info" # 日志级别:debug, info, warn, error +format = "text" # 日志格式:text, json +file_path = "/var/log/mcp_server.log" # 日志文件路径 + +[security] +# 安全配置 +enable_auth = false # 是否启用认证 +# 如果启用认证,需配置以下参数 +# auth_token = "your-auth-token" # 认证令牌 \ No newline at end of file diff --git a/mcp_server/mcp_server.py b/mcp_server/mcp_server.py new file mode 100644 index 0000000..77ecb42 --- /dev/null +++ b/mcp_server/mcp_server.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- + +import os +import sys +import logging +import json +import toml +import traceback +from flask import Flask, request, jsonify +import openai + +class MCPServer: + def __init__(self): + # 初始化应用 + self.app = Flask(__name__) + # 加载配置 + self.config = self.load_config() + # 配置日志 + self.setup_logging() + # 配置OpenAI客户端 + self.setup_openai() + # 注册路由 + self.register_routes() + + def load_config(self): + """加载配置文件""" + config_path = os.path.join(os.path.dirname(__file__), "config.toml") + if not os.path.exists(config_path): + print(f"错误:配置文件不存在: {config_path}") + sys.exit(1) + + with open(config_path, "r", encoding="utf-8") as f: + return toml.load(f) + + def setup_logging(self): + """配置日志系统""" + log_config = self.config.get("logging", {}) + log_level = getattr(logging, log_config.get("level", "info").upper()) + log_format = log_config.get("format", "text") + log_file = log_config.get("file_path", "/var/log/mcp_server.log") + + # 确保日志目录存在 + log_dir = os.path.dirname(log_file) + if log_dir and not os.path.exists(log_dir): + os.makedirs(log_dir, exist_ok=True) + + # 配置日志格式 + if log_format == "json": + formatter = logging.Formatter( + '{"time":"%(asctime)s", "level":"%(levelname)s", "message":"%(message)s"}' + ) + else: + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + + # 配置文件日志 + file_handler = logging.FileHandler(log_file, encoding="utf-8") + file_handler.setFormatter(formatter) + + # 配置控制台日志 + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + + # 获取根logger并配置 + logger = logging.getLogger() + logger.setLevel(log_level) + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + self.logger = logging.getLogger("MCPServer") + + def setup_openai(self): + """配置OpenAI客户端""" + openai_config = self.config.get("openai", {}) + openai.api_key = openai_config.get("api_key") + + # 如果配置了自定义API基础URL + if "base_url" in openai_config: + openai.api_base = openai_config["base_url"] + + self.openai_config = openai_config + + def register_routes(self): + """注册API路由""" + @self.app.route("/mcp/v1/submit", methods=["POST"]) + def submit_data(): + """接收并处理MCP提交的数据""" + try: + # 获取请求数据 + data = request.get_json() + if not data: + self.logger.warning("接收到无效的JSON数据") + return jsonify({"error": "无效的JSON数据"}), 400 + + self.logger.info(f"接收到MCP提交请求,类型: {data.get('type')}") + + # 处理提交的数据 + result = self.process_submission(data) + + return jsonify({"status": "success", "result": result}) + except Exception as e: + self.logger.error(f"处理提交请求时出错: {str(e)}") + self.logger.debug(traceback.format_exc()) + return jsonify({"error": str(e)}), 500 + + @self.app.route("/health", methods=["GET"]) + def health_check(): + """健康检查接口""" + return jsonify({"status": "healthy"}), 200 + + def process_submission(self, data): + """处理提交的数据,调用OpenAI API进行分析""" + submission_type = data.get("type", "") + content = data.get("content", "") + timestamp = data.get("timestamp", "") + + # 根据数据类型生成不同的提示词 + if submission_type == "disk_inspection_report": + prompt = self.generate_disk_report_prompt(content) + else: + prompt = f"请分析以下数据(类型:{submission_type}):\n{content}" + + # 调用OpenAI API + response = self.call_openai_api(prompt) + + return { + "analysis": response, + "processed_at": self.get_current_timestamp(), + "original_type": submission_type + } + + def generate_disk_report_prompt(self, report_content): + """为硬盘巡检报告生成特定的提示词""" + return f"""你是一位专业的系统管理员,请分析以下硬盘巡检报告: + +{report_content} + +请提供详细的分析结果,包括: +1. 健康状态总结 +2. 异常项分析(如果有) +3. 潜在风险评估 +4. 维护建议 +5. 需要特别关注的问题(如果有)""" + + def call_openai_api(self, prompt): + """调用OpenAI API""" + try: + # 调用OpenAI ChatCompletion API + response = openai.ChatCompletion.create( + model=self.openai_config.get("model", "gpt-3.5-turbo"), + messages=[ + {"role": "system", "content": "你是一个专业的AI助手,帮助用户分析和处理各种数据。"}, + {"role": "user", "content": prompt} + ], + max_tokens=self.openai_config.get("max_tokens", 2048), + temperature=self.openai_config.get("temperature", 0.7) + ) + + # 提取回复内容 + return response["choices"][0]["message"]["content"].strip() + except Exception as e: + self.logger.error(f"调用OpenAI API时出错: {str(e)}") + raise + + def get_current_timestamp(self): + """获取当前时间戳""" + import datetime + return datetime.datetime.now().isoformat() + + def run(self): + """启动服务器""" + server_config = self.config.get("server", {}) + host = server_config.get("host", "0.0.0.0") + port = server_config.get("port", 8080) + debug = server_config.get("debug", False) + + self.logger.info(f"MCP服务器启动成功,监听地址: {host}:{port}") + self.logger.info(f"OpenAI API配置: 模型={self.openai_config.get('model')}") + + # 启动Flask服务器 + self.app.run(host=host, port=port, debug=debug) + +if __name__ == "__main__": + # 创建并运行MCP服务器 + server = MCPServer() + server.run() \ No newline at end of file diff --git a/mcp_server/requirements.txt b/mcp_server/requirements.txt new file mode 100644 index 0000000..76a198d --- /dev/null +++ b/mcp_server/requirements.txt @@ -0,0 +1,17 @@ +# MCP服务器依赖包 +# 生成时间: "+str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))+" + +# Web框架 +flask==3.0.3 + +# OpenAI API客户端 +openai==1.30.1 + +# HTTP请求库 +requests==2.31.0 + +# 配置文件解析 +python-dotenv==1.0.1 + +# 可选依赖 - 用于日志格式化 +python-json-logger==2.0.7 \ No newline at end of file