forked from DevOps/deploy.stack
feat: 添加MCP服务器初始实现及文档
添加MCP服务器的完整实现,包括: - 主程序文件mcp_server.py - 配置文件config.toml - 依赖文件requirements.txt - 安装指南INSTALL.md - 使用说明README.md 服务器功能包括接收请求、调用OpenAI API进行分析、日志记录等
This commit is contained in:
186
mcp_server/INSTALL.md
Normal file
186
mcp_server/INSTALL.md
Normal 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
214
mcp_server/README.md
Normal file
@@ -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
|
||||
```
|
||||
27
mcp_server/config.toml
Normal file
27
mcp_server/config.toml
Normal 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
188
mcp_server/mcp_server.py
Normal 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()
|
||||
17
mcp_server/requirements.txt
Normal file
17
mcp_server/requirements.txt
Normal 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
|
||||
Reference in New Issue
Block a user