feat: 添加MCP服务器初始实现及文档

添加MCP服务器的完整实现,包括:
- 主程序文件mcp_server.py
- 配置文件config.toml
- 依赖文件requirements.txt
- 安装指南INSTALL.md
- 使用说明README.md

服务器功能包括接收请求、调用OpenAI API进行分析、日志记录等
This commit is contained in:
cnphpbb
2025-09-10 20:49:25 +08:00
parent fb530c43ce
commit 107b20a410
5 changed files with 632 additions and 0 deletions

186
mcp_server/INSTALL.md Normal file
View File

@@ -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
```
注意:这将包含环境中所有已安装的包,建议在虚拟环境中执行此操作。

214
mcp_server/README.md Normal file
View File

@@ -0,0 +1,214 @@
# MCP服务器 - OpenAPI对接版
## 简介
这是一个对接OpenAPI的MCPModel 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
```

27
mcp_server/config.toml Normal file
View File

@@ -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" # 认证令牌

188
mcp_server/mcp_server.py Normal file
View File

@@ -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()

View File

@@ -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