Initial commit: 炼妖壶 (Lianyaohu) - 稷下学宫AI辩论系统
- 🏛️ 稷下学宫八仙论道AI辩论系统 - 🌍 天下体系资本生态分析 - 🔒 安全配置管理 (Doppler集成) - 📊 RapidAPI永动机数据引擎 - 🎨 Streamlit现代化界面 - ✅ 清理所有敏感信息泄露
This commit is contained in:
498
internal/mcp/mcp_manager_complete_package.zip.md
Normal file
498
internal/mcp/mcp_manager_complete_package.zip.md
Normal file
@@ -0,0 +1,498 @@
|
||||
# MCP Manager - 完整独立包
|
||||
|
||||
## 📁 文件结构和内容
|
||||
|
||||
### 1. README.md
|
||||
```markdown
|
||||
# MCP Service Manager
|
||||
|
||||
> 🧙♂️ 统一管理stdio、SSE、HTTP类型的MCP服务,解决依赖管理和服务发现痛点
|
||||
|
||||
## 🎯 解决的问题
|
||||
|
||||
- **多协议混合管理**: stdio/SSE/HTTP服务统一管理
|
||||
- **依赖检查复杂**: 自动检查Python、Node.js、uv等依赖
|
||||
- **缺乏监控界面**: Web Dashboard实时监控服务状态
|
||||
- **配置分散**: 单一YAML文件集中配置
|
||||
- **批量操作困难**: 服务组批量启停
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 安装
|
||||
```bash
|
||||
pip install mcp-service-manager
|
||||
# 或
|
||||
git clone https://github.com/your-username/mcp-service-manager
|
||||
cd mcp-service-manager
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
### 使用
|
||||
```bash
|
||||
# 初始化配置
|
||||
mcp-manager init
|
||||
|
||||
# 启动管理器
|
||||
mcp-manager start
|
||||
|
||||
# 访问Web界面
|
||||
open http://localhost:8090
|
||||
```
|
||||
|
||||
## 📋 支持的MCP类型
|
||||
|
||||
### stdio类型
|
||||
```yaml
|
||||
- name: my-stdio-service
|
||||
type: stdio
|
||||
command: python
|
||||
args: ["-m", "my_mcp_server"]
|
||||
dependencies: ["python>=3.9"]
|
||||
```
|
||||
|
||||
### HTTP类型
|
||||
```yaml
|
||||
- name: my-http-service
|
||||
type: http
|
||||
url: "https://api.example.com/mcp"
|
||||
health_check: "https://api.example.com/health"
|
||||
```
|
||||
|
||||
### SSE类型
|
||||
```yaml
|
||||
- name: my-sse-service
|
||||
type: sse
|
||||
url: "https://sse.example.com/events"
|
||||
```
|
||||
|
||||
## 🎮 功能特性
|
||||
|
||||
- ✅ Web界面管理
|
||||
- ✅ 实时状态监控
|
||||
- ✅ 自动依赖检查
|
||||
- ✅ 批量服务操作
|
||||
- ✅ 健康状态检查
|
||||
- ✅ Docker部署支持
|
||||
- ✅ 服务组管理
|
||||
- ✅ API接口
|
||||
|
||||
## 📖 文档
|
||||
|
||||
- [安装指南](docs/installation.md)
|
||||
- [配置说明](docs/configuration.md)
|
||||
- [API文档](docs/api.md)
|
||||
- [Docker部署](docs/docker.md)
|
||||
|
||||
## 🤝 贡献
|
||||
|
||||
欢迎提交Issue和PR!
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
MIT License
|
||||
```
|
||||
|
||||
### 2. setup.py
|
||||
```python
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
with open("README.md", "r", encoding="utf-8") as fh:
|
||||
long_description = fh.read()
|
||||
|
||||
with open("requirements.txt", "r", encoding="utf-8") as fh:
|
||||
requirements = [line.strip() for line in fh if line.strip() and not line.startswith("#")]
|
||||
|
||||
setup(
|
||||
name="mcp-service-manager",
|
||||
version="1.0.0",
|
||||
author="MCP Manager Team",
|
||||
author_email="contact@mcpmanager.dev",
|
||||
description="Universal MCP service manager for stdio, SSE, and HTTP protocols",
|
||||
long_description=long_description,
|
||||
long_description_content_type="text/markdown",
|
||||
url="https://github.com/your-username/mcp-service-manager",
|
||||
packages=find_packages(),
|
||||
classifiers=[
|
||||
"Development Status :: 4 - Beta",
|
||||
"Intended Audience :: Developers",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Operating System :: OS Independent",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.9",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Topic :: Software Development :: Libraries :: Python Modules",
|
||||
"Topic :: System :: Systems Administration",
|
||||
],
|
||||
python_requires=">=3.9",
|
||||
install_requires=requirements,
|
||||
entry_points={
|
||||
"console_scripts": [
|
||||
"mcp-manager=mcp_manager.cli:main",
|
||||
],
|
||||
},
|
||||
include_package_data=True,
|
||||
package_data={
|
||||
"mcp_manager": [
|
||||
"templates/*.html",
|
||||
"static/*",
|
||||
"config/*.yml",
|
||||
],
|
||||
},
|
||||
)
|
||||
```
|
||||
|
||||
### 3. requirements.txt
|
||||
```
|
||||
fastapi>=0.104.0
|
||||
uvicorn[standard]>=0.24.0
|
||||
pyyaml>=6.0
|
||||
httpx>=0.25.0
|
||||
jinja2>=3.1.0
|
||||
python-multipart>=0.0.6
|
||||
aiofiles>=23.0.0
|
||||
psutil>=5.9.0
|
||||
```
|
||||
|
||||
### 4. mcp_manager/__init__.py
|
||||
```python
|
||||
"""
|
||||
MCP Service Manager
|
||||
|
||||
Universal manager for stdio, SSE, and HTTP MCP services.
|
||||
"""
|
||||
|
||||
__version__ = "1.0.0"
|
||||
__author__ = "MCP Manager Team"
|
||||
|
||||
from .manager import MCPManager
|
||||
from .config import MCPConfig, MCPService
|
||||
|
||||
__all__ = ["MCPManager", "MCPConfig", "MCPService"]
|
||||
```
|
||||
|
||||
### 5. mcp_manager/cli.py
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
MCP Manager CLI
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from .manager import MCPManager
|
||||
from .config import create_default_config
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="MCP Service Manager")
|
||||
subparsers = parser.add_subparsers(dest="command", help="Available commands")
|
||||
|
||||
# init command
|
||||
init_parser = subparsers.add_parser("init", help="Initialize configuration")
|
||||
init_parser.add_argument("--config", "-c", default="mcp_services.yml",
|
||||
help="Configuration file path")
|
||||
|
||||
# start command
|
||||
start_parser = subparsers.add_parser("start", help="Start MCP manager")
|
||||
start_parser.add_argument("--config", "-c", default="mcp_services.yml",
|
||||
help="Configuration file path")
|
||||
start_parser.add_argument("--port", "-p", type=int, default=8090,
|
||||
help="Manager port")
|
||||
start_parser.add_argument("--host", default="0.0.0.0",
|
||||
help="Bind address")
|
||||
start_parser.add_argument("--start-all", action="store_true",
|
||||
help="Start all services automatically")
|
||||
start_parser.add_argument("--group", "-g",
|
||||
help="Start specific service group")
|
||||
|
||||
# list command
|
||||
list_parser = subparsers.add_parser("list", help="List services")
|
||||
list_parser.add_argument("--config", "-c", default="mcp_services.yml",
|
||||
help="Configuration file path")
|
||||
|
||||
# status command
|
||||
status_parser = subparsers.add_parser("status", help="Show service status")
|
||||
status_parser.add_argument("--config", "-c", default="mcp_services.yml",
|
||||
help="Configuration file path")
|
||||
status_parser.add_argument("service", nargs="?", help="Service name")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.command:
|
||||
parser.print_help()
|
||||
return
|
||||
|
||||
if args.command == "init":
|
||||
init_config(args.config)
|
||||
elif args.command == "start":
|
||||
start_manager(args)
|
||||
elif args.command == "list":
|
||||
list_services(args.config)
|
||||
elif args.command == "status":
|
||||
show_status(args.config, args.service)
|
||||
|
||||
def init_config(config_path):
|
||||
"""Initialize configuration file"""
|
||||
if Path(config_path).exists():
|
||||
print(f"❌ Configuration file already exists: {config_path}")
|
||||
return
|
||||
|
||||
create_default_config(config_path)
|
||||
print(f"✅ Created configuration file: {config_path}")
|
||||
print(f"💡 Edit {config_path} to configure your MCP services")
|
||||
|
||||
def start_manager(args):
|
||||
"""Start MCP manager"""
|
||||
if not Path(args.config).exists():
|
||||
print(f"❌ Configuration file not found: {args.config}")
|
||||
print("💡 Run 'mcp-manager init' to create default configuration")
|
||||
sys.exit(1)
|
||||
|
||||
print("🚀 Starting MCP Manager...")
|
||||
print(f"📁 Config: {args.config}")
|
||||
print(f"🌐 Web UI: http://{args.host}:{args.port}")
|
||||
print(f"📊 API: http://{args.host}:{args.port}/docs")
|
||||
|
||||
manager = MCPManager(args.config)
|
||||
|
||||
if args.group:
|
||||
asyncio.run(start_service_group(manager, args.group))
|
||||
elif args.start_all:
|
||||
asyncio.run(start_all_services(manager))
|
||||
|
||||
try:
|
||||
manager.run(host=args.host, port=args.port)
|
||||
except KeyboardInterrupt:
|
||||
print("\n🛑 Stopping MCP Manager...")
|
||||
asyncio.run(stop_all_services(manager))
|
||||
|
||||
def list_services(config_path):
|
||||
"""List configured services"""
|
||||
if not Path(config_path).exists():
|
||||
print(f"❌ Configuration file not found: {config_path}")
|
||||
return
|
||||
|
||||
manager = MCPManager(config_path)
|
||||
print("📋 Configured MCP Services:")
|
||||
print("-" * 50)
|
||||
|
||||
for name, service in manager.services.items():
|
||||
print(f"🔧 {name}")
|
||||
print(f" Type: {service.type}")
|
||||
print(f" Status: {service.status}")
|
||||
if service.command:
|
||||
print(f" Command: {service.command}")
|
||||
if service.url:
|
||||
print(f" URL: {service.url}")
|
||||
print()
|
||||
|
||||
def show_status(config_path, service_name=None):
|
||||
"""Show service status"""
|
||||
if not Path(config_path).exists():
|
||||
print(f"❌ Configuration file not found: {config_path}")
|
||||
return
|
||||
|
||||
manager = MCPManager(config_path)
|
||||
|
||||
if service_name:
|
||||
if service_name not in manager.services:
|
||||
print(f"❌ Service not found: {service_name}")
|
||||
return
|
||||
|
||||
status = asyncio.run(manager.get_service_status(service_name))
|
||||
print(f"📊 Status for {service_name}:")
|
||||
print(f" Status: {status.get('status', 'unknown')}")
|
||||
print(f" Health: {status.get('health', 'unknown')}")
|
||||
else:
|
||||
print("📊 All Services Status:")
|
||||
print("-" * 30)
|
||||
for name in manager.services.keys():
|
||||
status = asyncio.run(manager.get_service_status(name))
|
||||
print(f"🔧 {name}: {status.get('status', 'unknown')}")
|
||||
|
||||
async def start_service_group(manager, group_name):
|
||||
"""Start service group"""
|
||||
# Service groups would be loaded from config
|
||||
service_groups = {
|
||||
'core': ['basic-service'],
|
||||
'all': list(manager.services.keys())
|
||||
}
|
||||
|
||||
services = service_groups.get(group_name, [])
|
||||
if not services:
|
||||
print(f"❌ Unknown service group: {group_name}")
|
||||
return
|
||||
|
||||
print(f"🔄 Starting service group: {group_name}")
|
||||
for service_name in services:
|
||||
if service_name in manager.services:
|
||||
await manager.start_service(service_name)
|
||||
|
||||
async def start_all_services(manager):
|
||||
"""Start all services"""
|
||||
print("🔄 Starting all services...")
|
||||
for service_name in manager.services.keys():
|
||||
await manager.start_service(service_name)
|
||||
|
||||
async def stop_all_services(manager):
|
||||
"""Stop all services"""
|
||||
for service_name in manager.services.keys():
|
||||
await manager.stop_service(service_name)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
### 6. mcp_manager/config.py
|
||||
```python
|
||||
"""
|
||||
Configuration management for MCP Manager
|
||||
"""
|
||||
|
||||
import os
|
||||
import yaml
|
||||
from dataclasses import dataclass, asdict
|
||||
from typing import Dict, List, Any, Optional
|
||||
from pathlib import Path
|
||||
|
||||
@dataclass
|
||||
class MCPService:
|
||||
"""MCP服务配置"""
|
||||
name: str
|
||||
type: str # stdio, sse, http
|
||||
command: Optional[str] = None
|
||||
args: Optional[List[str]] = None
|
||||
env: Optional[Dict[str, str]] = None
|
||||
url: Optional[str] = None
|
||||
port: Optional[int] = None
|
||||
health_check: Optional[str] = None
|
||||
dependencies: Optional[List[str]] = None
|
||||
auto_restart: bool = True
|
||||
description: Optional[str] = None
|
||||
status: str = "stopped"
|
||||
process: Optional[Any] = None
|
||||
|
||||
@dataclass
|
||||
class MCPConfig:
|
||||
"""MCP管理器配置"""
|
||||
services: List[MCPService]
|
||||
global_config: Dict[str, Any]
|
||||
service_groups: Dict[str, List[str]]
|
||||
|
||||
def create_default_config(config_path: str):
|
||||
"""创建默认配置文件"""
|
||||
default_config = {
|
||||
'services': [
|
||||
{
|
||||
'name': 'example-stdio',
|
||||
'type': 'stdio',
|
||||
'command': 'python',
|
||||
'args': ['-m', 'my_mcp_server'],
|
||||
'env': {'PYTHONPATH': '.'},
|
||||
'dependencies': ['python>=3.9'],
|
||||
'auto_restart': True,
|
||||
'description': 'Example stdio MCP service'
|
||||
},
|
||||
{
|
||||
'name': 'example-http',
|
||||
'type': 'http',
|
||||
'url': 'https://api.example.com/mcp',
|
||||
'health_check': 'https://api.example.com/health',
|
||||
'auto_restart': False,
|
||||
'description': 'Example HTTP MCP service'
|
||||
},
|
||||
{
|
||||
'name': 'example-sse',
|
||||
'type': 'sse',
|
||||
'url': 'https://sse.example.com/events',
|
||||
'auto_restart': False,
|
||||
'description': 'Example SSE MCP service'
|
||||
}
|
||||
],
|
||||
'global': {
|
||||
'manager_port': 8090,
|
||||
'log_level': 'INFO',
|
||||
'health_check_interval': 30,
|
||||
'restart_delay': 5,
|
||||
'max_restart_attempts': 3
|
||||
},
|
||||
'service_groups': {
|
||||
'core': ['example-stdio', 'example-http'],
|
||||
'all': ['example-stdio', 'example-http', 'example-sse']
|
||||
}
|
||||
}
|
||||
|
||||
with open(config_path, 'w', encoding='utf-8') as f:
|
||||
yaml.dump(default_config, f, default_flow_style=False, allow_unicode=True)
|
||||
|
||||
def load_config(config_path: str) -> MCPConfig:
|
||||
"""加载配置文件"""
|
||||
with open(config_path, 'r', encoding='utf-8') as f:
|
||||
config_data = yaml.safe_load(f)
|
||||
|
||||
services = []
|
||||
for service_config in config_data.get('services', []):
|
||||
service = MCPService(**service_config)
|
||||
services.append(service)
|
||||
|
||||
return MCPConfig(
|
||||
services=services,
|
||||
global_config=config_data.get('global', {}),
|
||||
service_groups=config_data.get('service_groups', {})
|
||||
)
|
||||
```
|
||||
|
||||
### 7. 复制现有文件
|
||||
- 将之前创建的 `mcp_manager.py` 重命名为 `mcp_manager/manager.py`
|
||||
- 将 `templates/mcp_dashboard.html` 复制到 `mcp_manager/templates/dashboard.html`
|
||||
- 将 `docker-compose.mcp.yml` 复制到 `docker/docker-compose.yml`
|
||||
|
||||
### 8. docs/installation.md
|
||||
```markdown
|
||||
# 安装指南
|
||||
|
||||
## 系统要求
|
||||
|
||||
- Python 3.9+
|
||||
- pip
|
||||
|
||||
## 安装方式
|
||||
|
||||
### 1. 从PyPI安装 (推荐)
|
||||
```bash
|
||||
pip install mcp-service-manager
|
||||
```
|
||||
|
||||
### 2. 从源码安装
|
||||
```bash
|
||||
git clone https://github.com/your-username/mcp-service-manager
|
||||
cd mcp-service-manager
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
### 3. Docker安装
|
||||
```bash
|
||||
docker pull mcpmanager/mcp-service-manager
|
||||
```
|
||||
|
||||
## 验证安装
|
||||
|
||||
```bash
|
||||
mcp-manager --help
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
```bash
|
||||
# 创建配置文件
|
||||
mcp-manager init
|
||||
|
||||
# 启动管理器
|
||||
mcp-manager start
|
||||
```
|
||||
```
|
||||
|
||||
这个完整的包可以直接作为独立项目发布,完全脱离太公心易项目。要我继续创建其他文件吗?
|
||||
Reference in New Issue
Block a user